diff --git a/src/main/webapp/app/components/SimpleTable.tsx b/src/main/webapp/app/components/SimpleTable.tsx index a419cbe56..dd5afd49f 100644 --- a/src/main/webapp/app/components/SimpleTable.tsx +++ b/src/main/webapp/app/components/SimpleTable.tsx @@ -2,7 +2,10 @@ import * as React from 'react'; import { Table } from 'react-bootstrap'; export type ElementType = JSX.Element | string; -export type SimpleTableCell = { key: string; content: ElementType }; +export type SimpleTableCell = { + key: string; + content: ElementType | ElementType[]; +}; export type SimpleTableRow = { key: string; content: SimpleTableCell[] }; export type SimpleTableRows = SimpleTableRow[]; export type SimpleTableColumn = { @@ -21,8 +24,8 @@ export type SimpleTableProps = { export const SimpleTable = (props: SimpleTableProps) => { const getRow = (row: SimpleTableRow) => { return row.content - ? row.content.map(cell => { - return {cell.content}; + ? row.content.map(({ key, content }) => { + return {content}; }) : null; }; @@ -44,9 +47,41 @@ export const SimpleTable = (props: SimpleTableProps) => { )} - {props.rows.map(row => ( - {getRow(row)} - ))} + {props.rows.flatMap(({ key, content }) => { + let maxContentSize = 1; + for (const cur of content) { + maxContentSize = Array.isArray(cur.content) + ? Math.max(cur.content.length, maxContentSize) + : maxContentSize; + } + const elements: JSX.Element[] = []; + for (let i = 0; i < maxContentSize; i++) { + const element = ( + + {content.map(({ content: innerContent, key: innerKey }) => { + if (Array.isArray(innerContent)) { + return {innerContent[i]}; + } else if (i === 0) { + return ( + 1 ? maxContentSize : undefined + } + > + {innerContent} + + ); + } else { + return <>; + } + })} + + ); + elements.push(element); + } + return elements; + })} diff --git a/src/main/webapp/app/config/constants.tsx b/src/main/webapp/app/config/constants.tsx index 9bf39edae..cc4c89eb8 100644 --- a/src/main/webapp/app/config/constants.tsx +++ b/src/main/webapp/app/config/constants.tsx @@ -821,6 +821,7 @@ export type DataRelease = { }; export const DATA_RELEASES: DataRelease[] = [ + { date: '10232024', version: 'v4.22' }, { date: '09252024', version: 'v4.21' }, { date: '08152024', version: 'v4.20' }, { date: '07042024', version: 'v4.19' }, diff --git a/src/main/webapp/app/pages/newsPage/NewsPage.tsx b/src/main/webapp/app/pages/newsPage/NewsPage.tsx index c172f5ba5..560f57819 100644 --- a/src/main/webapp/app/pages/newsPage/NewsPage.tsx +++ b/src/main/webapp/app/pages/newsPage/NewsPage.tsx @@ -87,6 +87,7 @@ export default class NewsPage extends React.Component<{
+ diff --git a/src/main/webapp/app/pages/newsPage/NewsPageContent.tsx b/src/main/webapp/app/pages/newsPage/NewsPageContent.tsx index 4465b1546..956a7383e 100644 --- a/src/main/webapp/app/pages/newsPage/NewsPageContent.tsx +++ b/src/main/webapp/app/pages/newsPage/NewsPageContent.tsx @@ -46,7 +46,7 @@ import { AnnotationColumnHeaderType } from './ChangedAnnotationListItem'; import { linkableMutationName, convertGeneInputToLinks } from './Util'; export type ChangedAnnotation = { - content: ElementType[][]; + content: (ElementType | ElementType[])[][]; title?: string; columnHeaderType?: AnnotationColumnHeaderType; headers?: { name: string }[]; @@ -300,6 +300,250 @@ const EVIDENCE_COLUMN_SEPARATOR = '; '; // https://stackoverflow.com/questions/41947168/is-it-possible-to-use-keyof-operator-on-literals-instead-of-interfaces export const NEWS_BY_DATE: { [date: string]: NewsData } = { + '10232024': { + priorityNews: [ + + Update to our{' '} + + "FDA Cleared or Approved Companion Diagnostic Devices" + {' '} + (CDx) page + , + + Update to our{' '} + + "FDA-Approved Oncology Therapies" + {' '} + page + , + ], + changedAnnotations: [ + { + columnHeaderType: AnnotationColumnHeaderType.NEW_ALTERATION_WITH_LEVEL, + content: [ + [ + ['3A', 'R2'], + 'ROS1', + + {getAlternativeAllelesPageLinks('ROS1', 'G2032R')} + , + 'Non-Small Cell Lung Cancer', + + ['Taletrectinib', 'Crizotinib, Lorlatinib'], + [ + + + , + + + , + ], + ], + [ + ['3A', 'R2'], + 'ROS1', + + {getAlternativeAllelesPageLinks('ROS1', 'L2086F')} + , + 'Non-Small Cell Lung Cancer', + ['Cabozantinib', 'Lorlatinib, Repotrectinib'], + [ + + + , + + + , + ], + ], + [ + '3A', + 'SMARCA4', + 'Oncogenic Mutations', + 'Non-Small Cell Lung Cancer, Esophageal Adenocarcinoma', + 'PRT3789', + + + + , + ], + ], + }, + { + useOneLineRowClass: false, + title: + 'Updated therapeutic implications - Promotion of tumor type-specific level of evidence for an alteration(s)', + headers: CHANGED_ANNOTATION_LEVEL_WITH_EVIDENCE_COLUMNS, + content: [ + [ + 'PIK3CA', + <> + {' '} + + (excluding R88Q, N345K, C420R, E542K, E545A/D/G/K/Q, + Q546E/K/R/P, M1043V/I, H1047Y/R/L, G1049R which are already + Level 1) + + , + 'Breast Cancer', +
+
+ {DRUGS_CURRENTLY_IN_ONCOKB}: +
+
+ Alpelisib + Fulvestrant, Capivasertib + Fulvestrant (Level 2); + Inavolisib + Palbociclib + Fulvestrant +
+

+
(Level 3A)
+
+ {DRUGS_PROMOTED_IN_ONCOKB}: +
+
Inavolisib + Palbociclib + Fulvestrant (Level 1)
+
, + '2', + '1', + + + + , + ], + ], + }, + { + columnHeaderType: AnnotationColumnHeaderType.UPDATED_SAME_LEVEL_DRUG, + content: [ + [ + '1', + 'EGFR', + <> + + , + , + 'Non-Small Cell Lung Cancer', + 'Afatinib, Dacomitinib, Erlotinib, Erlotinib + Ramucirumab, Gefitinib, Osimertinib, Osimertinib + Chemotherapy, Amivantamab + Lazertinib (Level 1); Amivantamab + Chemotherapy (Level 2); Patritumab Deruxtecan (Level 3A)', + 'Amivantamab + Chemotherapy (Level 1)', + + + + , + ], + [ + '1', + 'PIK3CA', + + {getAlternativeAllelesPageLinks('PIK3CA', 'R88Q')} + {getAlternativeAllelesPageLinks('PIK3CA', 'N345K')} + {getAlternativeAllelesPageLinks('PIK3CA', 'C420R')} + {getAlternativeAllelesPageLinks('PIK3CA', 'E542K')} + {getAlternativeAllelesPageLinks('PIK3CA', 'E545A/D/G/K/Q')} + {getAlternativeAllelesPageLinks('PIK3CA', 'Q546E/K/R/P')} + {getAlternativeAllelesPageLinks('PIK3CA', 'M1043V/I')} + {getAlternativeAllelesPageLinks('PIK3CA', 'H1047Y/R/L')} + {getAlternativeAllelesPageLinks('PIK3CA', 'G1049R')} + , + 'Breast Cancer', + 'Capivasertib + Fulvestrant (Level 1); Alpelisib + Fulvestrant (Level 1 for PIK3CA C420R, E542K, E545A/D/G/K, H1047Y/R/L, Q546E/R only)', + 'Inavolisib + Palbociclib + Fulvestrant (Level 1; Promoted from Level 3A)', + + + + , + ], + [ + '1', + 'ALK', + 'Fusions', + 'Non-Small Cell Lung Cancer', + 'Alectinib, Brigatinib, Certinib, Crizotinib, Lorlatinib (Level 1) ', + 'NVL-655 (Level 3A)', + + + + , + ], + [ + '1', + 'ROS1', + 'Fusions', + 'Non-Small Cell Lung Cancer', + 'Crizotinib, Entrectinib, Repotrectinib (Level 1); Ceritinib, Lorlatinib (Level 2)', + 'Taletrectinib (Level 3A)', + + + , + ], + [ + '2', + 'ALK', + 'G1202R', + 'Non-Small Cell Lung Cancer', + 'Lorlatinib (Level 2)', + 'NVL-655 (Level 3A)', + + + + , + ], + [ + '3A', + 'KRAS', + 'G12D', + 'Non-Small Cell Lung Cancer, Pancreatic Adenocarcinoma', + 'RMC-6236 (Level 3A)', + 'ASP3082 (Level 3A; Promoted from Level 4)', + + + + , + ], + ], + }, + ], + newlyAddedGenes: ['ADARB2', 'BUB1B', 'CCN6', 'CDKN1C', 'EGR2'], + }, '09252024': { changedAnnotations: [ { diff --git a/src/main/webapp/app/pages/oncologyTherapiesPage/oncologyTherapiesPage.tsx b/src/main/webapp/app/pages/oncologyTherapiesPage/oncologyTherapiesPage.tsx index 26572e33e..af1bfbffd 100644 --- a/src/main/webapp/app/pages/oncologyTherapiesPage/oncologyTherapiesPage.tsx +++ b/src/main/webapp/app/pages/oncologyTherapiesPage/oncologyTherapiesPage.tsx @@ -486,7 +486,7 @@ const OncologyTherapiesPage: React.FunctionComponent<{}> = props => { 'https://www.fda.gov/drugs/resources-information-approved-drugs/oncology-cancer-hematologic-malignancies-approval-notifications' } > - Content current as of 8/5/2024 + Content current as of 10/21/2024
diff --git a/src/main/webapp/content/files/oncologyTherapies/fda_approved_oncology_therapies.json b/src/main/webapp/content/files/oncologyTherapies/fda_approved_oncology_therapies.json index 4bac79214..1e1f288d0 100644 --- a/src/main/webapp/content/files/oncologyTherapies/fda_approved_oncology_therapies.json +++ b/src/main/webapp/content/files/oncologyTherapies/fda_approved_oncology_therapies.json @@ -2238,5 +2238,45 @@ "targetedTx": "Y", "pxTx": "Y", "ngsTest": "Y" + }, + { + "year": "2024", + "tx": "Lazertinib + Amivantamab", + "biomarker": "EGFR L858R, Exon 19 Deletions", + "agentClass": "Small molecule kinase inhibitor and monoclonal antibody combination", + "drugTarget": "EGFR tyrosine kinase inhibitor + EGFR-MET bispecific antibody ", + "targetedTx": "Y", + "pxTx": "Y", + "ngsTest": "Y" + }, + { + "year": "2024", + "tx": "Inavolisib + Fulvestrant + Palbociclib", + "biomarker": "PIK3CA Oncogenic Mutations, HR+/HER2-", + "agentClass": "Small molecule inhibitor and hormone therapy combination", + "drugTarget": "α-specific PI3K inhibitor + selective estrogen receptor degrader + CDK4/6 inhibitor ", + "targetedTx": "Y", + "pxTx": "Y ", + "ngsTest": "Y " + }, + { + "year": "2024", + "tx": "Adagrasib + Cetuximab", + "biomarker": "KRAS G12C", + "agentClass": "Small molecule inhibitor and monoclonal antibody combination", + "drugTarget": "KRAS G12C inhibitor + Anti-EGFR antibody", + "targetedTx": "Y", + "pxTx": "Y", + "ngsTest": "Y" + }, + { + "year": "2024", + "tx": "Zolbetuximab", + "biomarker": "HER2- and CLDN18.2+", + "agentClass": "Monoclonal antibody", + "drugTarget": "CDLN18.2-directed cytolytic antibody", + "targetedTx": "Y", + "pxTx": "Y", + "ngsTest": "N" } ] diff --git a/src/main/webapp/content/files/oncologyTherapies/fda_approved_oncology_therapies.xlsx b/src/main/webapp/content/files/oncologyTherapies/fda_approved_oncology_therapies.xlsx index ef19144ab..4818d6f69 100644 Binary files a/src/main/webapp/content/files/oncologyTherapies/fda_approved_oncology_therapies.xlsx and b/src/main/webapp/content/files/oncologyTherapies/fda_approved_oncology_therapies.xlsx differ