From b4234a1f43596369a1baa9cda4b4f719bbd06287 Mon Sep 17 00:00:00 2001 From: Chaparala Sri Kiran Date: Thu, 10 Feb 2022 10:25:27 -0500 Subject: [PATCH] V3.6.0 merge to master (#519) * v3.6.0 Co-authored-by: Ajay Co-authored-by: Doddapaneni Co-authored-by: Fuyuan Wang Co-authored-by: Fuyuan Wang <60631776+wfy1997@users.noreply.github.com> Co-authored-by: Austin Mueller <64418315+AustinSMueller@users.noreply.github.com> Co-authored-by: Ming Ying Co-authored-by: Michael Fleming --- .eslintrc.js | 1 + graphql/bento-extended-doc.graphql | 484 +-- graphql/bento-extended-queries.graphql | 1571 ++------- graphql/bento-extended.graphql | 1571 ++------- package-lock.json | 2861 ++++++++++++++++- package.json | 5 +- src/bento/dashboardData.js | 108 +- src/bento/dashboardTabData.js | 1194 +++++-- src/bento/fileCentricCartWorkflowData.js | 7 +- src/bento/globalData.js | 4 + src/bento/globalFooterData.js | 2 +- src/bento/jbrowseDetailData.js | 48 + src/bento/localSearchData.js | 520 +++ src/bento/programData.js | 2 +- src/bento/search.js | 185 ++ .../ActiveFiltersQuery/ActiveFiltersQuery.js | 449 +++ .../DocumentDownload/DocumentDownloadView.js | 20 +- src/components/FileUploader/index.jsx | 73 + src/components/FileUploader/uploaderStyle.js | 36 + src/components/Footer/FooterView.js | 28 +- src/components/GridWithFooter/GridView.js | 2 +- src/components/Header/HeaderView.js | 22 +- src/components/JBrowse/JBrowseView.js | 34 +- src/components/Layout/LayoutView.js | 6 + .../Search/searchAutoFillComponent.js | 190 ++ .../CasesModal/SummaryTable.js | 142 + .../SideBarComponents/CasesModal/index.js | 336 ++ .../SideBar/SideBarComponents/CheckBoxView.js | 19 +- .../SideBar/SideBarComponents/FacetFilters.js | 680 ++-- .../SideBar/SideBarComponents/InputViewMax.js | 73 + .../SideBar/SideBarComponents/InputViewMin.js | 73 + .../SideBar/SideBarComponents/clearFilters.js | 71 + .../SideBarComponents/searchComponet.js | 193 ++ .../styles/FacetFiltersStyles.js | 271 ++ .../styles/searchComponentStyles.js | 100 + src/components/SideBar/SideBarView.js | 177 +- .../SideBar/styles/SideBarViewStyle.js | 110 + src/components/Snackbar/Snackbar.js | 2 +- .../serverPaginatedTable.js | 157 +- src/content/perf/aboutPagesContent.yaml | 17 + src/pages/armDetail/armDetailView.js | 3 +- src/pages/caseDetail/caseDetailView.js | 8 +- .../dashboardTab/components/tabController.js | 41 +- src/pages/dashboardTab/components/tabView.js | 20 +- src/pages/dashboardTab/dashboard.js | 129 +- src/pages/dashboardTab/dashboardStyles.js | 108 + .../dashboardTab/store/dashboardReducer.js | 729 ++++- src/pages/fileCentricCart/cartController.js | 37 +- src/pages/fileCentricCart/cartView.js | 125 +- .../components/body/cartBody.js | 15 +- .../components/footer/cartFooter.js | 32 +- src/pages/fileCentricCart/store/cart.js | 10 +- .../jbrowseDetail/jbrowseDetailController.js | 70 + src/pages/jbrowseDetail/jbrowseDetailView.js | 164 + src/pages/programDetail/programDetailView.js | 3 +- src/pages/programs/programsView.js | 3 +- .../search/components/cards/aboutCard.js | 92 + src/pages/search/components/cards/fileCard.js | 123 + src/pages/search/components/cards/nodeCard.js | 98 + .../search/components/cards/progamCard.js | 92 + .../search/components/cards/sampleCard.js | 126 + .../search/components/cards/studyCard.js | 96 + .../search/components/cards/subjectCard.js | 100 + .../search/components/cards/valueCard.js | 110 + src/pages/search/components/component.js | 41 + src/pages/search/components/propertyItem.js | 64 + .../search/components/searchResultSection.js | 334 ++ src/pages/search/searchView.js | 336 ++ src/pages/search/searchViewController.js | 6 + src/store/index.js | 3 +- src/themes/dark.js | 12 + src/themes/light.js | 12 + 72 files changed, 10734 insertions(+), 4252 deletions(-) create mode 100644 src/bento/globalData.js create mode 100644 src/bento/jbrowseDetailData.js create mode 100644 src/bento/localSearchData.js create mode 100644 src/bento/search.js create mode 100644 src/components/ActiveFiltersQuery/ActiveFiltersQuery.js create mode 100644 src/components/FileUploader/index.jsx create mode 100644 src/components/FileUploader/uploaderStyle.js create mode 100644 src/components/Search/searchAutoFillComponent.js create mode 100644 src/components/SideBar/SideBarComponents/CasesModal/SummaryTable.js create mode 100644 src/components/SideBar/SideBarComponents/CasesModal/index.js create mode 100644 src/components/SideBar/SideBarComponents/InputViewMax.js create mode 100644 src/components/SideBar/SideBarComponents/InputViewMin.js create mode 100644 src/components/SideBar/SideBarComponents/clearFilters.js create mode 100644 src/components/SideBar/SideBarComponents/searchComponet.js create mode 100644 src/components/SideBar/SideBarComponents/styles/FacetFiltersStyles.js create mode 100644 src/components/SideBar/SideBarComponents/styles/searchComponentStyles.js create mode 100644 src/components/SideBar/styles/SideBarViewStyle.js create mode 100644 src/content/perf/aboutPagesContent.yaml create mode 100644 src/pages/dashboardTab/dashboardStyles.js create mode 100644 src/pages/jbrowseDetail/jbrowseDetailController.js create mode 100644 src/pages/jbrowseDetail/jbrowseDetailView.js create mode 100644 src/pages/search/components/cards/aboutCard.js create mode 100644 src/pages/search/components/cards/fileCard.js create mode 100644 src/pages/search/components/cards/nodeCard.js create mode 100644 src/pages/search/components/cards/progamCard.js create mode 100644 src/pages/search/components/cards/sampleCard.js create mode 100644 src/pages/search/components/cards/studyCard.js create mode 100644 src/pages/search/components/cards/subjectCard.js create mode 100644 src/pages/search/components/cards/valueCard.js create mode 100644 src/pages/search/components/component.js create mode 100644 src/pages/search/components/propertyItem.js create mode 100644 src/pages/search/components/searchResultSection.js create mode 100644 src/pages/search/searchView.js create mode 100644 src/pages/search/searchViewController.js diff --git a/.eslintrc.js b/.eslintrc.js index 98da6ef97..548c4ba15 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -32,5 +32,6 @@ module.exports = { "jsx-a11y/click-events-have-key-events":"off", "react/jsx-props-no-spreading":"off", "linebreak-style":"off", + "react/jsx-no-bind":"off", }, }; diff --git a/graphql/bento-extended-doc.graphql b/graphql/bento-extended-doc.graphql index a11e1a270..123d82439 100644 --- a/graphql/bento-extended-doc.graphql +++ b/graphql/bento-extended-doc.graphql @@ -696,30 +696,6 @@ type GroupCount { subjects: Int } -type SubjectOverview { - subject_id: String - program: String - program_id: String - study_acronym: String - study_short_description: String - study_info: String - diagnosis: String - recurrence_score: String - tumor_size: String - tumor_grade: String - er_status: String - pr_status: String - chemotherapy: String - endocrine_therapy: String - menopause_status: String - age_at_index: Int - survival_time: Int - survival_time_unit: String - files: [file] - samples: [String] - lab_procedures: [String] -} - type SubjectInfo { subject_id: String program: String @@ -747,19 +723,6 @@ type FileInfo { md5sum: String } -type FileDetail { - study_code: String - subject_id: String - file_name: String - file_type: String - association: String - file_description: String - file_format: String - file_size: Float - file_id: String - md5sum: String -} - type ProgramInfo { program_acronym: String program_id: String @@ -872,21 +835,6 @@ type ArmDetail { files: [ArmFile] } -type SampleOverview { - sample_id: String - subject_id: String - program: String - arm: String - diagnosis: String - tissue_type: String - tissue_composition: String - sample_anatomic_site: String - sample_procurement_method: String - platform: String - files: [String] - program_id: String -} - type FileOverview { file_id: String file_name: String @@ -902,38 +850,25 @@ type FileOverview { program_id: String } -type SubjectOverview2 { - subject_id: String - program: String - program_id: String - study_acronym: String - diagnosis: String - recurrence_score: String - tumor_size: String - tumor_grade: String - er_status: String - pr_status: String - age_at_index: Int - survival_time: Int - survival_time_unit: String +type GroupList { + group: String + subjects: [String] +} + +type IdsLists { + subjectIds: [String] + sampleIds: [String] + fileIds: [String] + fileNames: [String] } -type SearchResult { +type NodeCounts { numberOfPrograms: Int numberOfStudies: Int numberOfSubjects: Int numberOfSamples: Int numberOfLabProcedures: Int numberOfFiles: Int - subjectIds: [String] - sampleIds: [String] - fileIds: [String] - firstPage: [SubjectOverview2] -} - -type GroupList { - group: String - subjects: [String] } schema { @@ -951,378 +886,59 @@ type QueryType { numberOfLabProcedures: Int numberOfFiles: Int - "Group counts" - subjectCountByProgram(subject_ids: [String] = []): [GroupCount] - subjectCountByStudy(subject_ids: [String] = []): [GroupCount] - - subjectCountByDiagnoses(subject_ids: [String] = []): [GroupCount] - - subjectCountByRecurrenceScore(subject_ids: [String] = []): [GroupCount] - - subjectCountByTumorSize(subject_ids: [String] = []): [GroupCount] - - subjectCountByTumorGrade(subject_ids: [String] = []): [GroupCount] - - subjectCountByErStatus(subject_ids: [String] = []): [GroupCount] - - subjectCountByPrStatus(subject_ids: [String] = []): [GroupCount] - - subjectCountByChemotherapyRegimen(subject_ids: [String] = []): [GroupCount] - - subjectCountByEndocrineTherapy(subject_ids: [String] = []): [GroupCount] - - subjectCountByMenopauseStatus(subject_ids: [String] = []): [GroupCount] - - subjectCountByTissueType(subject_ids: [String] = []): [GroupCount] - - subjectCountByTissueComposition(subject_ids: [String] = []): [GroupCount] - - subjectCountByFileAssociation(subject_ids: [String] = []): [GroupCount] - - subjectCountByFileType(subject_ids: [String] = []): [GroupCount] - - armsByPrograms(subject_ids: [String] = []): [ProgramArms] - - "Facet search counts" - filterSubjectCountByProgram( - programs: [String] = [], - studies: [String] = [], - diagnoses: [String] = [], - rc_scores: [String] = [], - tumor_sizes: [String] = [], - chemo_regimen: [String] = [], - tumor_grades: [String] = [], - er_status: [String] = [], - pr_status: [String] = [], - endo_therapies: [String] = [], - meno_status: [String] = [], - tissue_type: [String] = [], - composition: [String] = [], - association: [String] = [], - file_type: [String] = [] - ): [GroupCount] - - filterSubjectCountByStudy( - programs: [String] = [], - studies: [String] = [], - diagnoses: [String] = [], - rc_scores: [String] = [], - tumor_sizes: [String] = [], - chemo_regimen: [String] = [], - tumor_grades: [String] = [], - er_status: [String] = [], - pr_status: [String] = [], - endo_therapies: [String] = [], - meno_status: [String] = [], - tissue_type: [String] = [], - composition: [String] = [], - association: [String] = [], - file_type: [String] = [] - ): [GroupCount] - - filterSubjectCountByDiagnoses( - programs: [String] = [], - studies: [String] = [], - diagnoses: [String] = [], - rc_scores: [String] = [], - tumor_sizes: [String] = [], - chemo_regimen: [String] = [], - tumor_grades: [String] = [], - er_status: [String] = [], - pr_status: [String] = [], - endo_therapies: [String] = [], - meno_status: [String] = [], - tissue_type: [String] = [], - composition: [String] = [], - association: [String] = [], - file_type: [String] = [] - ): [GroupCount] - - filterSubjectCountByRecurrenceScore( - programs: [String] = [], - studies: [String] = [], - diagnoses: [String] = [], - rc_scores: [String] = [], - tumor_sizes: [String] = [], - chemo_regimen: [String] = [], - tumor_grades: [String] = [], - er_status: [String] = [], - pr_status: [String] = [], - endo_therapies: [String] = [], - meno_status: [String] = [], - tissue_type: [String] = [], - composition: [String] = [], - association: [String] = [], - file_type: [String] = [] - ): [GroupCount] - - filterSubjectCountByTumorSize( - programs: [String] = [], - studies: [String] = [], - diagnoses: [String] = [], - rc_scores: [String] = [], - tumor_sizes: [String] = [], - chemo_regimen: [String] = [], - tumor_grades: [String] = [], - er_status: [String] = [], - pr_status: [String] = [], - endo_therapies: [String] = [], - meno_status: [String] = [], - tissue_type: [String] = [], - composition: [String] = [], - association: [String] = [], - file_type: [String] = [] - ): [GroupCount] - - filterSubjectCountByTumorGrade( - programs: [String] = [], - studies: [String] = [], - diagnoses: [String] = [], - rc_scores: [String] = [], - tumor_sizes: [String] = [], - chemo_regimen: [String] = [], - tumor_grades: [String] = [], - er_status: [String] = [], - pr_status: [String] = [], - endo_therapies: [String] = [], - meno_status: [String] = [], - tissue_type: [String] = [], - composition: [String] = [], - association: [String] = [], - file_type: [String] = [] - ): [GroupCount] - - filterSubjectCountByErStatus( - programs: [String] = [], - studies: [String] = [], - diagnoses: [String] = [], - rc_scores: [String] = [], - tumor_sizes: [String] = [], - chemo_regimen: [String] = [], - tumor_grades: [String] = [], - er_status: [String] = [], - pr_status: [String] = [], - endo_therapies: [String] = [], - meno_status: [String] = [], - tissue_type: [String] = [], - composition: [String] = [], - association: [String] = [], - file_type: [String] = [] - ): [GroupCount] - - filterSubjectCountByPrStatus( - programs: [String] = [], - studies: [String] = [], - diagnoses: [String] = [], - rc_scores: [String] = [], - tumor_sizes: [String] = [], - chemo_regimen: [String] = [], - tumor_grades: [String] = [], - er_status: [String] = [], - pr_status: [String] = [], - endo_therapies: [String] = [], - meno_status: [String] = [], - tissue_type: [String] = [], - composition: [String] = [], - association: [String] = [], - file_type: [String] = [] - ): [GroupCount] - - filterSubjectCountByChemotherapyRegimen( - programs: [String] = [], - studies: [String] = [], - diagnoses: [String] = [], - rc_scores: [String] = [], - tumor_sizes: [String] = [], - chemo_regimen: [String] = [], - tumor_grades: [String] = [], - er_status: [String] = [], - pr_status: [String] = [], - endo_therapies: [String] = [], - meno_status: [String] = [], - tissue_type: [String] = [], - composition: [String] = [], - association: [String] = [], - file_type: [String] = [] - ): [GroupCount] - - filterSubjectCountByEndocrineTherapy( - programs: [String] = [], - studies: [String] = [], - diagnoses: [String] = [], - rc_scores: [String] = [], - tumor_sizes: [String] = [], - chemo_regimen: [String] = [], - tumor_grades: [String] = [], - er_status: [String] = [], - pr_status: [String] = [], - endo_therapies: [String] = [], - meno_status: [String] = [], - tissue_type: [String] = [], - composition: [String] = [], - association: [String] = [], - file_type: [String] = [] - ): [GroupCount] - - filterSubjectCountByMenopauseStatus( - programs: [String] = [], - studies: [String] = [], - diagnoses: [String] = [], - rc_scores: [String] = [], - tumor_sizes: [String] = [], - chemo_regimen: [String] = [], - tumor_grades: [String] = [], - er_status: [String] = [], - pr_status: [String] = [], - endo_therapies: [String] = [], - meno_status: [String] = [], - tissue_type: [String] = [], - composition: [String] = [], - association: [String] = [], - file_type: [String] = [] - ): [GroupCount] - - filterSubjectCountByTissueType( - programs: [String] = [], - studies: [String] = [], - diagnoses: [String] = [], - rc_scores: [String] = [], - tumor_sizes: [String] = [], - chemo_regimen: [String] = [], - tumor_grades: [String] = [], - er_status: [String] = [], - pr_status: [String] = [], - endo_therapies: [String] = [], - meno_status: [String] = [], - tissue_type: [String] = [], - composition: [String] = [], - association: [String] = [], - file_type: [String] = [] - ): [GroupCount] - - filterSubjectCountByTissueComposition( - programs: [String] = [], - studies: [String] = [], - diagnoses: [String] = [], - rc_scores: [String] = [], - tumor_sizes: [String] = [], - chemo_regimen: [String] = [], - tumor_grades: [String] = [], - er_status: [String] = [], - pr_status: [String] = [], - endo_therapies: [String] = [], - meno_status: [String] = [], - tissue_type: [String] = [], - composition: [String] = [], - association: [String] = [], - file_type: [String] = [] - ): [GroupCount] - - filterSubjectCountByFileAssociation( - programs: [String] = [], - studies: [String] = [], - diagnoses: [String] = [], - rc_scores: [String] = [], - tumor_sizes: [String] = [], - chemo_regimen: [String] = [], - tumor_grades: [String] = [], - er_status: [String] = [], - pr_status: [String] = [], - endo_therapies: [String] = [], - meno_status: [String] = [], - tissue_type: [String] = [], - composition: [String] = [], - association: [String] = [], - file_type: [String] = [] - ): [GroupCount] - - filterSubjectCountByFileType( - programs: [String] = [], - studies: [String] = [], - diagnoses: [String] = [], - rc_scores: [String] = [], - tumor_sizes: [String] = [], - chemo_regimen: [String] = [], - tumor_grades: [String] = [], - er_status: [String] = [], - pr_status: [String] = [], - endo_therapies: [String] = [], - meno_status: [String] = [], - tissue_type: [String] = [], - composition: [String] = [], - association: [String] = [], - file_type: [String] = [] - ): [GroupCount] - - subjectOverViewPaged(subject_ids: [String] = [""], order_by: String = ""): [SubjectOverview] - - subjectOverViewPagedDesc(subject_ids: [String] = [""], order_by: String = ""): [SubjectOverview] - - subjectOverView: [SubjectOverview] - - searchSubjects2 ( - programs: [String] = [], - studies: [String] = [], - diagnoses: [String] = [], - rc_scores: [String] = [], - tumor_sizes: [String] = [], - chemo_regimen: [String] = [], - tumor_grades: [String] = [], - er_status: [String] = [], - pr_status: [String] = [], - endo_therapies: [String] = [], - meno_status: [String] = [], - tissue_type: [String] = [], - composition: [String] = [], - association: [String] = [], - file_type: [String] = [] - ): [String] - - searchSubjects ( - programs: [String] = [], - studies: [String] = [], - diagnoses: [String] = [], - rc_scores: [String] = [], - tumor_sizes: [String] = [], - chemo_regimen: [String] = [], - tumor_grades: [String] = [], - er_status: [String] = [], - pr_status: [String] = [], - endo_therapies: [String] = [], - meno_status: [String] = [], - tissue_type: [String] = [], - composition: [String] = [], - association: [String] = [], - file_type: [String] = [], - first: Int = 100 - ): SearchResult + "Get lists of all subject ids, sample ids, and file ids" + idsLists: IdsLists + "Group counts from lists of subject ids, file ids, and sample ids" - subjectsInList(subject_ids: [String]=[]): [SubjectInfo] + subjectCountByProgramFromLists(subject_ids: [String] = [], sample_ids: [String] = [], file_ids: [String] = [], file_names: [String] = []): [GroupCount] - filesOfSubjects(subject_ids: [String]=[]): [FileInfo] + subjectCountByStudyFromLists(subject_ids: [String] = [], sample_ids: [String] = [], file_ids: [String] = [], file_names: [String] = []): [GroupCount] - programInfo: [ProgramInfo] - programDetail(program_id: String): ProgramDetail + subjectCountByDiagnosesFromLists(subject_ids: [String] = [], sample_ids: [String] = [], file_ids: [String] = [], file_names: [String] = []): [GroupCount] - subjectDetail(subject_id: String): SubjectDetail + subjectCountByRecurrenceScoreFromLists(subject_ids: [String] = [], sample_ids: [String] = [], file_ids: [String] = [], file_names: [String] = []): [GroupCount] - armDetail(study_acronym: String): ArmDetail + subjectCountByTumorSizeFromLists(subject_ids: [String] = [], sample_ids: [String] = [], file_ids: [String] = [], file_names: [String] = []): [GroupCount] - samplesForSubjectId(subject_id: String!): [sample] + subjectCountByTumorGradeFromLists(subject_ids: [String] = [], sample_ids: [String] = [], file_ids: [String] = [], file_names: [String] = []): [GroupCount] + + subjectCountByErStatusFromLists(subject_ids: [String] = [], sample_ids: [String] = [], file_ids: [String] = [], file_names: [String] = []): [GroupCount] + + subjectCountByPrStatusFromLists(subject_ids: [String] = [], sample_ids: [String] = [], file_ids: [String] = [], file_names: [String] = []): [GroupCount] + + subjectCountByChemotherapyRegimenFromLists(subject_ids: [String] = [], sample_ids: [String] = [], file_ids: [String] = [], file_names: [String] = []): [GroupCount] + + subjectCountByEndocrineTherapyFromLists(subject_ids: [String] = [], sample_ids: [String] = [], file_ids: [String] = [], file_names: [String] = []): [GroupCount] + + subjectCountByMenopauseStatusFromLists(subject_ids: [String] = [], sample_ids: [String] = [], file_ids: [String] = [], file_names: [String] = []): [GroupCount] + + subjectCountByTissueTypeFromLists(subject_ids: [String] = [], sample_ids: [String] = [], file_ids: [String] = [], file_names: [String] = []): [GroupCount] + + subjectCountByTissueCompositionFromLists(subject_ids: [String] = [], sample_ids: [String] = [], file_ids: [String] = [], file_names: [String] = []): [GroupCount] - filesInList(file_ids: [String], order_by: String = ""): [FileDetail] + subjectCountByFileAssociationFromLists(subject_ids: [String] = [], sample_ids: [String] = [], file_ids: [String] = [], file_names: [String] = []): [GroupCount] - filesInListDesc(file_ids: [String], order_by: String = ""): [FileDetail] + subjectCountByFileTypeFromLists(subject_ids: [String] = [], sample_ids: [String] = [], file_ids: [String] = [], file_names: [String] = []): [GroupCount] - sampleOverview(subject_ids: [String] = [""], sample_ids: [String] = [""], order_by: String = ""): [SampleOverview] + nodeCountsFromLists (subject_ids: [String] = [], sample_ids: [String] = [], file_ids: [String] = [], file_names: [String] = []): NodeCounts - sampleOverviewDesc(subject_ids: [String] = [""], sample_ids: [String] = [""], order_by: String = ""): [SampleOverview] + armsByProgramsFromLists(subject_ids: [String] = [], sample_ids: [String] = [], file_ids: [String] = [], file_names: [String] = []): [ProgramArms] + findIdsFromLists(subject_ids: [String] = [], sample_ids: [String] = [], file_ids: [String] = [], file_names: [String] = []): IdsLists - fileOverview(subject_ids: [String] = [""], file_ids: [String] = [""], order_by: String = ""): [FileOverview] + subjectsInList(subject_ids: [String]=[]): [SubjectInfo] + + filesOfSubjects(subject_ids: [String]=[]): [FileInfo] + + programInfo: [ProgramInfo] + programDetail(program_id: String): ProgramDetail - fileOverviewDesc(subject_ids: [String] = [""], file_ids: [String] = [""], order_by: String = ""): [FileOverview] + subjectDetail(subject_id: String): SubjectDetail + + armDetail(study_acronym: String): ArmDetail + + samplesForSubjectId(subject_id: String!): [sample] fileIdsFromFileName(file_name: [String], order_by: String ="file_name"): [FileOverview] diff --git a/graphql/bento-extended-queries.graphql b/graphql/bento-extended-queries.graphql index 0aa45b57d..cbeff0bc9 100644 --- a/graphql/bento-extended-queries.graphql +++ b/graphql/bento-extended-queries.graphql @@ -3,30 +3,6 @@ type GroupCount { subjects: Int } -type SubjectOverview { - subject_id: String - program: String - program_id: String - study_acronym: String - study_short_description: String - study_info: String - diagnosis: String - recurrence_score: String - tumor_size: String - tumor_grade: String - er_status: String - pr_status: String - chemotherapy: String - endocrine_therapy: String - menopause_status: String - age_at_index: Int - survival_time: Int - survival_time_unit: String - files: [file] - samples: [String] - lab_procedures: [String] -} - type SubjectInfo { subject_id: String program: String @@ -54,19 +30,6 @@ type FileInfo { md5sum: String } -type FileDetail { - study_code: String - subject_id: String - file_name: String - file_type: String - association: String - file_description: String - file_format: String - file_size: Float - file_id: String - md5sum: String -} - type ProgramInfo { program_acronym: String program_id: String @@ -179,21 +142,6 @@ type ArmDetail { files: [ArmFile] } -type SampleOverview { - sample_id: String - subject_id: String - program: String - arm: String - diagnosis: String - tissue_type: String - tissue_composition: String - sample_anatomic_site: String - sample_procurement_method: String - platform: String - files: [String] - program_id: String -} - type FileOverview { file_id: String file_name: String @@ -209,38 +157,25 @@ type FileOverview { program_id: String } -type SubjectOverview2 { - subject_id: String - program: String - program_id: String - study_acronym: String - diagnosis: String - recurrence_score: String - tumor_size: String - tumor_grade: String - er_status: String - pr_status: String - age_at_index: Int - survival_time: Int - survival_time_unit: String +type GroupList { + group: String + subjects: [String] } -type SearchResult { +type IdsLists { + subjectIds: [String] + sampleIds: [String] + fileIds: [String] + fileNames: [String] +} + +type NodeCounts { numberOfPrograms: Int numberOfStudies: Int numberOfSubjects: Int numberOfSamples: Int numberOfLabProcedures: Int numberOfFiles: Int - subjectIds: [String] - sampleIds: [String] - fileIds: [String] - firstPage: [SubjectOverview2] -} - -type GroupList { - group: String - subjects: [String] } schema { @@ -248,7 +183,7 @@ schema { } type QueryType { - schemaVersion: String @cypher(statement: "RETURN '1.1.0'") + schemaVersion: String @cypher(statement: "RETURN '1.4.5'") "Simple counts" numberOfPrograms: Int @cypher(statement: "MATCH (n:program) return count(n)") @@ -258,1057 +193,292 @@ type QueryType { numberOfLabProcedures: Int @cypher(statement: "MATCH (n:laboratory_procedure) return count(n)") numberOfFiles: Int @cypher(statement: "MATCH (n:file) return count(n)") - "Group counts" - subjectCountByProgram(subject_ids: [String] = []): [GroupCount] @cypher(statement: """ - MATCH (g:program) - OPTIONAL MATCH (g)<--(:study)<--(ss:study_subject) - WITH DISTINCT ss, g - WHERE (size($subject_ids) = 0 OR ss.study_subject_id IN $subject_ids) - RETURN { group: g.program_acronym, - subjects: count(ss) } - """, passThrough: true) - subjectCountByStudy(subject_ids: [String] = []): [GroupCount] @cypher(statement: """ - MATCH (g:study) - OPTIONAL MATCH (g)<--(ss:study_subject) - WITH DISTINCT ss, g - WHERE (size($subject_ids) = 0 OR ss.study_subject_id IN $subject_ids) - RETURN { group: g.study_acronym + ': ' + g.study_short_description, - subjects: count(ss)} - """, passThrough: true) - - subjectCountByDiagnoses(subject_ids: [String] = []): [GroupCount] @cypher(statement: """ - MATCH (g:diagnosis) - OPTIONAL MATCH (g)-->(ss:study_subject) - WITH DISTINCT ss, g - WHERE (size($subject_ids) = 0 OR ss.study_subject_id IN $subject_ids) - RETURN { group: ss.disease_subtype, subjects: count(ss) } - """, passThrough: true) - - subjectCountByRecurrenceScore(subject_ids: [String] = []): [GroupCount] @cypher(statement: """ - MATCH (g:stratification_factor) - OPTIONAL MATCH (g)-->(ss:study_subject) - WITH DISTINCT ss, g - WHERE (size($subject_ids) = 0 OR ss.study_subject_id IN $subject_ids) - RETURN {group: g.grouped_recurrence_score , subjects: count(ss) } - """, passThrough: true) - - subjectCountByTumorSize(subject_ids: [String] = []): [GroupCount] @cypher(statement: """ - MATCH (g:diagnosis) - OPTIONAL MATCH (g)-->(ss:study_subject) - WITH DISTINCT ss, g - WHERE (size($subject_ids) = 0 OR ss.study_subject_id IN $subject_ids) - RETURN {group: g.tumor_size_group, subjects: count(ss)} - """, passThrough: true) - - subjectCountByTumorGrade(subject_ids: [String] = []): [GroupCount] @cypher(statement: """ - MATCH (g:diagnosis) - OPTIONAL MATCH (g)-->(ss:study_subject) - WITH DISTINCT ss, g - WHERE (size($subject_ids) = 0 OR ss.study_subject_id IN $subject_ids) - RETURN {group: g.tumor_grade, subjects: count(ss)} - """, passThrough: true) - - subjectCountByErStatus(subject_ids: [String] = []): [GroupCount] @cypher(statement: """ - MATCH (g:diagnosis) - OPTIONAL MATCH (g)-->(ss:study_subject) - WITH DISTINCT ss, g - WHERE (size($subject_ids) = 0 OR ss.study_subject_id IN $subject_ids) - RETURN {group: g.er_status, subjects: count(ss)} - """, passThrough: true) - - subjectCountByPrStatus(subject_ids: [String] = []): [GroupCount] @cypher(statement: """ - MATCH (g:diagnosis) - OPTIONAL MATCH (g)-->(ss:study_subject) - WITH DISTINCT ss, g - WHERE (size($subject_ids) = 0 OR ss.study_subject_id IN $subject_ids) - RETURN {group: g.pr_status, subjects: count(ss)} - """, passThrough: true) - - subjectCountByChemotherapyRegimen(subject_ids: [String] = []): [GroupCount] @cypher(statement: """ - MATCH (g:therapeutic_procedure) - OPTIONAL MATCH (g)-->()-->(ss:study_subject) - WITH DISTINCT ss, g - WHERE (size($subject_ids) = 0 OR ss.study_subject_id IN $subject_ids) - RETURN {group: g.chemotherapy_regimen, subjects: count(ss)} - """, passThrough: true) - - subjectCountByEndocrineTherapy(subject_ids: [String] = []): [GroupCount] @cypher(statement: """ - MATCH (g:therapeutic_procedure) - OPTIONAL MATCH (g)-->()-->(ss:study_subject) - WITH DISTINCT ss, g - WHERE (size($subject_ids) = 0 OR ss.study_subject_id IN $subject_ids) - RETURN {group: g.endocrine_therapy_type, subjects: count(ss)} - """, passThrough: true) - - subjectCountByMenopauseStatus(subject_ids: [String] = []): [GroupCount] @cypher(statement: """ - MATCH (g:demographic_data) - OPTIONAL MATCH (g)-->(ss:study_subject) - WITH DISTINCT ss, g - WHERE (size($subject_ids) = 0 OR ss.study_subject_id IN $subject_ids) - RETURN {group: g.menopause_status, subjects: count(ss)} - """, passThrough: true) - - subjectCountByTissueType(subject_ids: [String] = []): [GroupCount] @cypher(statement: """ - MATCH (samp:sample) - OPTIONAL MATCH (samp)-[:sample_of_study_subject]->(ss) - WITH DISTINCT samp, ss - WHERE (size($subject_ids) = 0 OR ss.study_subject_id IN $subject_ids) - RETURN {group: samp.tissue_type, subjects: count(samp)} - """, passThrough: true) - - subjectCountByTissueComposition(subject_ids: [String] = []): [GroupCount] @cypher(statement: """ + "Get lists of all subject ids, sample ids, and file ids" + idsLists: IdsLists @cypher(statement: """ MATCH (samp:sample) - OPTIONAL MATCH (samp)-[:sample_of_study_subject]->(ss) - WITH DISTINCT samp, ss - WHERE (size($subject_ids) = 0 OR ss.study_subject_id IN $subject_ids) - RETURN {group: samp.composition, subjects: count(samp)} - """, passThrough: true) - - subjectCountByFileAssociation(subject_ids: [String] = []): [GroupCount] @cypher(statement: """ - MATCH (f:file)-[*..3]->(ss:study_subject) - MATCH (f)-->(parent) - WHERE NOT (parent:laboratory_procedure) - AND (size($subject_ids) = 0 OR ss.study_subject_id IN $subject_ids) - RETURN {group: head(labels(parent)), subjects: count(f)} + WITH COLLECT(DISTINCT samp.sample_id) as samples + MATCH (ss:study_subject) + WITH COLLECT(DISTINCT ss.study_subject_id) as study_subjects, samples + MATCH (f:file) + WITH COLLECT(DISTINCT f.file_id) as fileIds, COLLECT(DISTINCT f.file_name) as fileNames, samples, study_subjects + RETURN { + sampleIds: samples, + fileIds: fileIds, + fileNames: fileNames, + subjectIds: study_subjects + } """, passThrough: true) - subjectCountByFileType(subject_ids: [String] = []): [GroupCount] @cypher(statement: """ - MATCH (f:file)-[*..3]->(ss:study_subject) - WHERE (size($subject_ids) = 0 OR ss.study_subject_id IN $subject_ids) - RETURN {group: f.file_type, subjects: count(DISTINCT f)} - """, passThrough: true) + "Group counts from lists of subject ids, file ids, and sample ids" - armsByPrograms(subject_ids: [String] = []): [ProgramArms] @cypher(statement: """ + subjectCountByProgramFromLists(subject_ids: [String] = [], sample_ids: [String] = [], file_ids: [String] = [], file_names: [String] = []): [GroupCount] @cypher(statement: """ MATCH (p:program) - OPTIONAL MATCH (p)<-[:study_of_program]-()<-[:study_subject_of_study]-(ss) - WHERE (size($subject_ids) = 0 OR ss.study_subject_id IN $subject_ids) - WITH p, COUNT(DISTINCT ss) AS caseSize - OPTIONAL MATCH (p)<-[:study_of_program]-(s)<-[:study_subject_of_study]-(ss) - WHERE (size($subject_ids) = 0 OR ss.study_subject_id IN $subject_ids) - WITH - p, caseSize, - {arm: s.study_acronym, caseSize: COUNT(DISTINCT ss), size: COUNT(DISTINCT ss)} AS s - RETURN { program: p.program_acronym, - caseSize: caseSize, - children: collect(s) } - """, passThrough: true) - - "Facet search counts" - filterSubjectCountByProgram( - programs: [String] = [], - studies: [String] = [], - diagnoses: [String] = [], - rc_scores: [String] = [], - tumor_sizes: [String] = [], - chemo_regimen: [String] = [], - tumor_grades: [String] = [], - er_status: [String] = [], - pr_status: [String] = [], - endo_therapies: [String] = [], - meno_status: [String] = [], - tissue_type: [String] = [], - composition: [String] = [], - association: [String] = [], - file_type: [String] = [] - ): [GroupCount] @cypher(statement: """ - // Filtering subjects - MATCH (ss)<-[:sf_of_study_subject]-(sf) - WHERE (size($rc_scores) = 0 OR sf.grouped_recurrence_score IN $rc_scores) - MATCH (ss)<-[:diagnosis_of_study_subject]-(d)<-[:tp_of_diagnosis]-(tp) - WHERE (size($tumor_sizes) = 0 OR d.tumor_size_group IN $tumor_sizes) - AND (size($tumor_grades) = 0 OR d.tumor_grade IN $tumor_grades) - AND (size($er_status) = 0 OR d.er_status IN $er_status) - AND (size($pr_status) = 0 OR d.pr_status IN $pr_status) - AND (size($chemo_regimen) = 0 OR tp.chemotherapy_regimen IN $chemo_regimen) - AND (size($endo_therapies) = 0 OR tp.endocrine_therapy_type IN $endo_therapies) - MATCH (ss:study_subject)-[:study_subject_of_study]->(s)-[:study_of_program]->(p) - WHERE (size($studies) = 0 OR (s.study_acronym + ': ' + s.study_short_description) IN $studies) - AND (size($diagnoses) = 0 OR ss.disease_subtype IN $diagnoses) - MATCH (ss)<-[:demographic_of_study_subject]-(demo) - WHERE (size($meno_status) = 0 OR demo.menopause_status IN $meno_status) - MATCH (ss)<-[:sample_of_study_subject]-(samp) - WHERE (size($tissue_type) = 0 OR samp.tissue_type IN $tissue_type) - AND (size($composition) = 0 OR samp.composition IN $composition) - MATCH (ss)<-[*..2]-(parent)<--(f:file) - WHERE (size($file_type) = 0 OR f.file_type IN $file_type) - AND (size($association) = 0 OR head(labels(parent)) IN $association) - WITH DISTINCT ss, p - RETURN {group: p.program_acronym , subjects: count(ss)} - """, passThrough: true) - - filterSubjectCountByStudy( - programs: [String] = [], - studies: [String] = [], - diagnoses: [String] = [], - rc_scores: [String] = [], - tumor_sizes: [String] = [], - chemo_regimen: [String] = [], - tumor_grades: [String] = [], - er_status: [String] = [], - pr_status: [String] = [], - endo_therapies: [String] = [], - meno_status: [String] = [], - tissue_type: [String] = [], - composition: [String] = [], - association: [String] = [], - file_type: [String] = [] - ): [GroupCount] @cypher(statement: """ - // Filtering subjects - MATCH (ss)<-[:sf_of_study_subject]-(sf) - WHERE (size($rc_scores) = 0 OR sf.grouped_recurrence_score IN $rc_scores) - MATCH (ss)<-[:diagnosis_of_study_subject]-(d)<-[:tp_of_diagnosis]-(tp) - WHERE (size($tumor_sizes) = 0 OR d.tumor_size_group IN $tumor_sizes) - AND (size($tumor_grades) = 0 OR d.tumor_grade IN $tumor_grades) - AND (size($er_status) = 0 OR d.er_status IN $er_status) - AND (size($pr_status) = 0 OR d.pr_status IN $pr_status) - AND (size($chemo_regimen) = 0 OR tp.chemotherapy_regimen IN $chemo_regimen) - AND (size($endo_therapies) = 0 OR tp.endocrine_therapy_type IN $endo_therapies) - MATCH (ss:study_subject)-[:study_subject_of_study]->(s)-[:study_of_program]->(p) - WHERE (size($programs) = 0 OR p.program_acronym IN $programs) - //AND (size($studies) = 0 OR (s.study_acronym + ': ' + s.study_short_description) IN $studies) - AND (size($diagnoses) = 0 OR ss.disease_subtype IN $diagnoses) - MATCH (ss)<-[:demographic_of_study_subject]-(demo) - WHERE (size($meno_status) = 0 OR demo.menopause_status IN $meno_status) - MATCH (ss)<-[:sample_of_study_subject]-(samp) - WHERE (size($tissue_type) = 0 OR samp.tissue_type IN $tissue_type) - AND (size($composition) = 0 OR samp.composition IN $composition) - MATCH (ss)<-[*..2]-(parent)<--(f:file) - WHERE (size($file_type) = 0 OR f.file_type IN $file_type) - AND (size($association) = 0 OR head(labels(parent)) IN $association) - WITH DISTINCT ss, s - RETURN {group: s.study_acronym + ': ' + s.study_short_description, subjects: count(ss)} - """, passThrough: true) - - filterSubjectCountByDiagnoses( - programs: [String] = [], - studies: [String] = [], - diagnoses: [String] = [], - rc_scores: [String] = [], - tumor_sizes: [String] = [], - chemo_regimen: [String] = [], - tumor_grades: [String] = [], - er_status: [String] = [], - pr_status: [String] = [], - endo_therapies: [String] = [], - meno_status: [String] = [], - tissue_type: [String] = [], - composition: [String] = [], - association: [String] = [], - file_type: [String] = [] - ): [GroupCount] @cypher(statement: """ - // Filtering subjects - MATCH (ss)<-[:sf_of_study_subject]-(sf) - WHERE (size($rc_scores) = 0 OR sf.grouped_recurrence_score IN $rc_scores) - MATCH (ss)<-[:diagnosis_of_study_subject]-(d)<-[:tp_of_diagnosis]-(tp) - WHERE (size($tumor_sizes) = 0 OR d.tumor_size_group IN $tumor_sizes) - AND (size($tumor_grades) = 0 OR d.tumor_grade IN $tumor_grades) - AND (size($er_status) = 0 OR d.er_status IN $er_status) - AND (size($pr_status) = 0 OR d.pr_status IN $pr_status) - AND (size($chemo_regimen) = 0 OR tp.chemotherapy_regimen IN $chemo_regimen) - AND (size($endo_therapies) = 0 OR tp.endocrine_therapy_type IN $endo_therapies) - MATCH (ss:study_subject)-[:study_subject_of_study]->(s)-[:study_of_program]->(p) - WHERE (size($programs) = 0 OR p.program_acronym IN $programs) - AND (size($studies) = 0 OR (s.study_acronym + ': ' + s.study_short_description) IN $studies) - //AND (size($diagnoses) = 0 OR ss.disease_subtype IN $diagnoses) - MATCH (ss)<-[:demographic_of_study_subject]-(demo) - WHERE (size($meno_status) = 0 OR demo.menopause_status IN $meno_status) - MATCH (ss)<-[:sample_of_study_subject]-(samp) - WHERE (size($tissue_type) = 0 OR samp.tissue_type IN $tissue_type) - AND (size($composition) = 0 OR samp.composition IN $composition) - MATCH (ss)<-[*..2]-(parent)<--(f:file) - WHERE (size($file_type) = 0 OR f.file_type IN $file_type) - AND (size($association) = 0 OR head(labels(parent)) IN $association) - WITH DISTINCT ss - RETURN {group: ss.disease_subtype, subjects: count(ss)} - """, passThrough: true) - - filterSubjectCountByRecurrenceScore( - programs: [String] = [], - studies: [String] = [], - diagnoses: [String] = [], - rc_scores: [String] = [], - tumor_sizes: [String] = [], - chemo_regimen: [String] = [], - tumor_grades: [String] = [], - er_status: [String] = [], - pr_status: [String] = [], - endo_therapies: [String] = [], - meno_status: [String] = [], - tissue_type: [String] = [], - composition: [String] = [], - association: [String] = [], - file_type: [String] = [] - ): [GroupCount] @cypher(statement: """ - // Filtering subjects - MATCH (ss)<-[:sf_of_study_subject]-(sf) - //WHERE (size($rc_scores) = 0 OR sf.grouped_recurrence_score IN $rc_scores) - MATCH (ss)<-[:diagnosis_of_study_subject]-(d)<-[:tp_of_diagnosis]-(tp) - WHERE (size($tumor_sizes) = 0 OR d.tumor_size_group IN $tumor_sizes) - AND (size($tumor_grades) = 0 OR d.tumor_grade IN $tumor_grades) - AND (size($er_status) = 0 OR d.er_status IN $er_status) - AND (size($pr_status) = 0 OR d.pr_status IN $pr_status) - AND (size($chemo_regimen) = 0 OR tp.chemotherapy_regimen IN $chemo_regimen) - AND (size($endo_therapies) = 0 OR tp.endocrine_therapy_type IN $endo_therapies) - MATCH (ss:study_subject)-[:study_subject_of_study]->(s)-[:study_of_program]->(p) - WHERE (size($programs) = 0 OR p.program_acronym IN $programs) - AND (size($studies) = 0 OR (s.study_acronym + ': ' + s.study_short_description) IN $studies) - AND (size($diagnoses) = 0 OR ss.disease_subtype IN $diagnoses) - MATCH (ss)<-[:demographic_of_study_subject]-(demo) - WHERE (size($meno_status) = 0 OR demo.menopause_status IN $meno_status) - MATCH (ss)<-[:sample_of_study_subject]-(samp) - WHERE (size($tissue_type) = 0 OR samp.tissue_type IN $tissue_type) - AND (size($composition) = 0 OR samp.composition IN $composition) - MATCH (ss)<-[*..2]-(parent)<--(f:file) - WHERE (size($file_type) = 0 OR f.file_type IN $file_type) - AND (size($association) = 0 OR head(labels(parent)) IN $association) - WITH DISTINCT ss, sf - RETURN {group: sf.grouped_recurrence_score, subjects: count(ss)} + OPTIONAL MATCH (p)<--(s:study)<--(ss:study_subject)<--(samp:sample)<--(f:file) + WHERE (ss.study_subject_id IN $subject_ids) + OR (samp.sample_id IN $sample_ids) + OR (f.file_id IN $file_ids) + OR (f.file_name IN $file_names) + RETURN { + group: p.program_acronym, + subjects: COUNT(DISTINCT ss) + } """, passThrough: true) - filterSubjectCountByTumorSize( - programs: [String] = [], - studies: [String] = [], - diagnoses: [String] = [], - rc_scores: [String] = [], - tumor_sizes: [String] = [], - chemo_regimen: [String] = [], - tumor_grades: [String] = [], - er_status: [String] = [], - pr_status: [String] = [], - endo_therapies: [String] = [], - meno_status: [String] = [], - tissue_type: [String] = [], - composition: [String] = [], - association: [String] = [], - file_type: [String] = [] - ): [GroupCount] @cypher(statement: """ - // Filtering subjects - MATCH (ss)<-[:sf_of_study_subject]-(sf) - WHERE (size($rc_scores) = 0 OR sf.grouped_recurrence_score IN $rc_scores) - MATCH (ss)<-[:diagnosis_of_study_subject]-(d)<-[:tp_of_diagnosis]-(tp) - WHERE //(size($tumor_sizes) = 0 OR d.tumor_size_group IN $tumor_sizes) - (size($tumor_grades) = 0 OR d.tumor_grade IN $tumor_grades) - AND (size($er_status) = 0 OR d.er_status IN $er_status) - AND (size($pr_status) = 0 OR d.pr_status IN $pr_status) - AND (size($chemo_regimen) = 0 OR tp.chemotherapy_regimen IN $chemo_regimen) - AND (size($endo_therapies) = 0 OR tp.endocrine_therapy_type IN $endo_therapies) - MATCH (ss:study_subject)-[:study_subject_of_study]->(s)-[:study_of_program]->(p) - WHERE (size($programs) = 0 OR p.program_acronym IN $programs) - AND (size($studies) = 0 OR (s.study_acronym + ': ' + s.study_short_description) IN $studies) - AND (size($diagnoses) = 0 OR ss.disease_subtype IN $diagnoses) - MATCH (ss)<-[:demographic_of_study_subject]-(demo) - WHERE (size($meno_status) = 0 OR demo.menopause_status IN $meno_status) - MATCH (ss)<-[:sample_of_study_subject]-(samp) - WHERE (size($tissue_type) = 0 OR samp.tissue_type IN $tissue_type) - AND (size($composition) = 0 OR samp.composition IN $composition) - MATCH (ss)<-[*..2]-(parent)<--(f:file) - WHERE (size($file_type) = 0 OR f.file_type IN $file_type) - AND (size($association) = 0 OR head(labels(parent)) IN $association) - WITH DISTINCT ss, d - RETURN {group: d.tumor_size_group, subjects: count(ss)} + subjectCountByStudyFromLists(subject_ids: [String] = [], sample_ids: [String] = [], file_ids: [String] = [], file_names: [String] = []): [GroupCount] @cypher(statement: """ + MATCH (s:study) + OPTIONAL MATCH (s)<--(ss:study_subject)<--(samp:sample)<--(f:file) + WHERE (ss.study_subject_id IN $subject_ids) + OR (samp.sample_id IN $sample_ids) + OR (f.file_id IN $file_ids) + OR (f.file_name IN $file_names) + RETURN { + group: s.study_acronym + ': ' + s.study_short_description, + subjects: COUNT(DISTINCT ss) + } """, passThrough: true) - filterSubjectCountByTumorGrade( - programs: [String] = [], - studies: [String] = [], - diagnoses: [String] = [], - rc_scores: [String] = [], - tumor_sizes: [String] = [], - chemo_regimen: [String] = [], - tumor_grades: [String] = [], - er_status: [String] = [], - pr_status: [String] = [], - endo_therapies: [String] = [], - meno_status: [String] = [], - tissue_type: [String] = [], - composition: [String] = [], - association: [String] = [], - file_type: [String] = [] - ): [GroupCount] @cypher(statement: """ - // Filtering subjects - MATCH (ss)<-[:sf_of_study_subject]-(sf) - WHERE (size($rc_scores) = 0 OR sf.grouped_recurrence_score IN $rc_scores) - MATCH (ss)<-[:diagnosis_of_study_subject]-(d)<-[:tp_of_diagnosis]-(tp) - WHERE (size($tumor_sizes) = 0 OR d.tumor_size_group IN $tumor_sizes) - //AND (size($tumor_grades) = 0 OR d.tumor_grade IN $tumor_grades) - AND (size($er_status) = 0 OR d.er_status IN $er_status) - AND (size($pr_status) = 0 OR d.pr_status IN $pr_status) - AND (size($chemo_regimen) = 0 OR tp.chemotherapy_regimen IN $chemo_regimen) - AND (size($endo_therapies) = 0 OR tp.endocrine_therapy_type IN $endo_therapies) - MATCH (ss:study_subject)-[:study_subject_of_study]->(s)-[:study_of_program]->(p) - WHERE (size($programs) = 0 OR p.program_acronym IN $programs) - AND (size($studies) = 0 OR (s.study_acronym + ': ' + s.study_short_description) IN $studies) - AND (size($diagnoses) = 0 OR ss.disease_subtype IN $diagnoses) - MATCH (ss)<-[:demographic_of_study_subject]-(demo) - WHERE (size($meno_status) = 0 OR demo.menopause_status IN $meno_status) - MATCH (ss)<-[:sample_of_study_subject]-(samp) - WHERE (size($tissue_type) = 0 OR samp.tissue_type IN $tissue_type) - AND (size($composition) = 0 OR samp.composition IN $composition) - MATCH (ss)<-[*..2]-(parent)<--(f:file) - WHERE (size($file_type) = 0 OR f.file_type IN $file_type) - AND (size($association) = 0 OR head(labels(parent)) IN $association) - WITH DISTINCT ss, d - RETURN {group: d.tumor_grade, subjects: count(ss)} + subjectCountByDiagnosesFromLists(subject_ids: [String] = [], sample_ids: [String] = [], file_ids: [String] = [], file_names: [String] = []): [GroupCount] @cypher(statement: """ + MATCH (ss:study_subject) + WITH COLLECT(DISTINCT ss.disease_subtype) AS disease_subtype_list + UNWIND disease_subtype_list AS disease_subtypes + OPTIONAL MATCH (ss:study_subject)<--(samp:sample)<--(f:file) + WHERE (disease_subtypes = ss.disease_subtype) + AND ((ss.study_subject_id IN $subject_ids) + OR (samp.sample_id IN $sample_ids) + OR (f.file_id IN $file_ids)) + OR (f.file_name IN $file_names) + RETURN { + group: disease_subtypes, + subjects: COUNT(DISTINCT ss) + } """, passThrough: true) - filterSubjectCountByErStatus( - programs: [String] = [], - studies: [String] = [], - diagnoses: [String] = [], - rc_scores: [String] = [], - tumor_sizes: [String] = [], - chemo_regimen: [String] = [], - tumor_grades: [String] = [], - er_status: [String] = [], - pr_status: [String] = [], - endo_therapies: [String] = [], - meno_status: [String] = [], - tissue_type: [String] = [], - composition: [String] = [], - association: [String] = [], - file_type: [String] = [] - ): [GroupCount] @cypher(statement: """ - // Filtering subjects - MATCH (ss)<-[:sf_of_study_subject]-(sf) - WHERE (size($rc_scores) = 0 OR sf.grouped_recurrence_score IN $rc_scores) - MATCH (ss)<-[:diagnosis_of_study_subject]-(d)<-[:tp_of_diagnosis]-(tp) - WHERE (size($tumor_sizes) = 0 OR d.tumor_size_group IN $tumor_sizes) - AND (size($tumor_grades) = 0 OR d.tumor_grade IN $tumor_grades) - //AND (size($er_status) = 0 OR d.er_status IN $er_status) - AND (size($pr_status) = 0 OR d.pr_status IN $pr_status) - AND (size($chemo_regimen) = 0 OR tp.chemotherapy_regimen IN $chemo_regimen) - AND (size($endo_therapies) = 0 OR tp.endocrine_therapy_type IN $endo_therapies) - MATCH (ss:study_subject)-[:study_subject_of_study]->(s)-[:study_of_program]->(p) - WHERE (size($programs) = 0 OR p.program_acronym IN $programs) - AND (size($studies) = 0 OR (s.study_acronym + ': ' + s.study_short_description) IN $studies) - AND (size($diagnoses) = 0 OR ss.disease_subtype IN $diagnoses) - MATCH (ss)<-[:demographic_of_study_subject]-(demo) - WHERE (size($meno_status) = 0 OR demo.menopause_status IN $meno_status) - MATCH (ss)<-[:sample_of_study_subject]-(samp) - WHERE (size($tissue_type) = 0 OR samp.tissue_type IN $tissue_type) - AND (size($composition) = 0 OR samp.composition IN $composition) - MATCH (ss)<-[*..2]-(parent)<--(f:file) - WHERE (size($file_type) = 0 OR f.file_type IN $file_type) - AND (size($association) = 0 OR head(labels(parent)) IN $association) - WITH DISTINCT ss, d - RETURN {group: d.er_status, subjects: count(ss)} + subjectCountByRecurrenceScoreFromLists(subject_ids: [String] = [], sample_ids: [String] = [], file_ids: [String] = [], file_names: [String] = []): [GroupCount] @cypher(statement: """ + MATCH (sf:stratification_factor) + OPTIONAL MATCH (sf)-->(ss:study_subject)<--(samp:sample)<--(f:file) + WHERE (ss.study_subject_id IN $subject_ids) + OR (samp.sample_id IN $sample_ids) + OR (f.file_id IN $file_ids) + OR (f.file_name IN $file_names) + RETURN { + group: sf.grouped_recurrence_score, + subjects: COUNT(DISTINCT ss) + } """, passThrough: true) - filterSubjectCountByPrStatus( - programs: [String] = [], - studies: [String] = [], - diagnoses: [String] = [], - rc_scores: [String] = [], - tumor_sizes: [String] = [], - chemo_regimen: [String] = [], - tumor_grades: [String] = [], - er_status: [String] = [], - pr_status: [String] = [], - endo_therapies: [String] = [], - meno_status: [String] = [], - tissue_type: [String] = [], - composition: [String] = [], - association: [String] = [], - file_type: [String] = [] - ): [GroupCount] @cypher(statement: """ - // Filtering subjects - MATCH (ss)<-[:sf_of_study_subject]-(sf) - WHERE (size($rc_scores) = 0 OR sf.grouped_recurrence_score IN $rc_scores) - MATCH (ss)<-[:diagnosis_of_study_subject]-(d)<-[:tp_of_diagnosis]-(tp) - WHERE (size($tumor_sizes) = 0 OR d.tumor_size_group IN $tumor_sizes) - AND (size($tumor_grades) = 0 OR d.tumor_grade IN $tumor_grades) - AND (size($er_status) = 0 OR d.er_status IN $er_status) - //AND (size($pr_status) = 0 OR d.pr_status IN $pr_status) - AND (size($chemo_regimen) = 0 OR tp.chemotherapy_regimen IN $chemo_regimen) - AND (size($endo_therapies) = 0 OR tp.endocrine_therapy_type IN $endo_therapies) - MATCH (ss:study_subject)-[:study_subject_of_study]->(s)-[:study_of_program]->(p) - WHERE (size($programs) = 0 OR p.program_acronym IN $programs) - AND (size($studies) = 0 OR (s.study_acronym + ': ' + s.study_short_description) IN $studies) - AND (size($diagnoses) = 0 OR ss.disease_subtype IN $diagnoses) - MATCH (ss)<-[:demographic_of_study_subject]-(demo) - WHERE (size($meno_status) = 0 OR demo.menopause_status IN $meno_status) - MATCH (ss)<-[:sample_of_study_subject]-(samp) - WHERE (size($tissue_type) = 0 OR samp.tissue_type IN $tissue_type) - AND (size($composition) = 0 OR samp.composition IN $composition) - MATCH (ss)<-[*..2]-(parent)<--(f:file) - WHERE (size($file_type) = 0 OR f.file_type IN $file_type) - AND (size($association) = 0 OR head(labels(parent)) IN $association) - WITH DISTINCT ss, d - RETURN {group: d.pr_status, subjects: count(ss)} + subjectCountByTumorSizeFromLists(subject_ids: [String] = [], sample_ids: [String] = [], file_ids: [String] = [], file_names: [String] = []): [GroupCount] @cypher(statement: """ + MATCH (d:diagnosis) + OPTIONAL MATCH (d)-->(ss:study_subject)<--(samp:sample)<--(f:file) + WHERE (ss.study_subject_id IN $subject_ids) + OR (samp.sample_id IN $sample_ids) + OR (f.file_id IN $file_ids) + OR (f.file_name IN $file_names) + RETURN { + group: d.tumor_size_group, + subjects: COUNT(DISTINCT ss) + } """, passThrough: true) - filterSubjectCountByChemotherapyRegimen( - programs: [String] = [], - studies: [String] = [], - diagnoses: [String] = [], - rc_scores: [String] = [], - tumor_sizes: [String] = [], - chemo_regimen: [String] = [], - tumor_grades: [String] = [], - er_status: [String] = [], - pr_status: [String] = [], - endo_therapies: [String] = [], - meno_status: [String] = [], - tissue_type: [String] = [], - composition: [String] = [], - association: [String] = [], - file_type: [String] = [] - ): [GroupCount] @cypher(statement: """ - // Filtering subjects - MATCH (ss)<-[:sf_of_study_subject]-(sf) - WHERE (size($rc_scores) = 0 OR sf.grouped_recurrence_score IN $rc_scores) - MATCH (ss)<-[:diagnosis_of_study_subject]-(d)<-[:tp_of_diagnosis]-(tp) - WHERE (size($tumor_sizes) = 0 OR d.tumor_size_group IN $tumor_sizes) - AND (size($tumor_grades) = 0 OR d.tumor_grade IN $tumor_grades) - AND (size($er_status) = 0 OR d.er_status IN $er_status) - AND (size($pr_status) = 0 OR d.pr_status IN $pr_status) - //AND (size($chemo_regimen) = 0 OR tp.chemotherapy_regimen IN $chemo_regimen) - AND (size($endo_therapies) = 0 OR tp.endocrine_therapy_type IN $endo_therapies) - MATCH (ss:study_subject)-[:study_subject_of_study]->(s)-[:study_of_program]->(p) - WHERE (size($programs) = 0 OR p.program_acronym IN $programs) - AND (size($studies) = 0 OR (s.study_acronym + ': ' + s.study_short_description) IN $studies) - AND (size($diagnoses) = 0 OR ss.disease_subtype IN $diagnoses) - MATCH (ss)<-[:demographic_of_study_subject]-(demo) - WHERE (size($meno_status) = 0 OR demo.menopause_status IN $meno_status) - MATCH (ss)<-[:sample_of_study_subject]-(samp) - WHERE (size($tissue_type) = 0 OR samp.tissue_type IN $tissue_type) - AND (size($composition) = 0 OR samp.composition IN $composition) - MATCH (ss)<-[*..2]-(parent)<--(f:file) - WHERE (size($file_type) = 0 OR f.file_type IN $file_type) - AND (size($association) = 0 OR head(labels(parent)) IN $association) - WITH DISTINCT ss, tp - RETURN {group: tp.chemotherapy_regimen, subjects: count(ss)} + subjectCountByTumorGradeFromLists(subject_ids: [String] = [], sample_ids: [String] = [], file_ids: [String] = [], file_names: [String] = []): [GroupCount] @cypher(statement: """ + MATCH (d:diagnosis) + OPTIONAL MATCH (d)-->(ss:study_subject)<--(samp:sample)<--(f:file) + WHERE (ss.study_subject_id IN $subject_ids) + OR (samp.sample_id IN $sample_ids) + OR (f.file_id IN $file_ids) + OR (f.file_name IN $file_names) + RETURN { + group: d.tumor_grade, + subjects: COUNT(DISTINCT ss) + } """, passThrough: true) - filterSubjectCountByEndocrineTherapy( - programs: [String] = [], - studies: [String] = [], - diagnoses: [String] = [], - rc_scores: [String] = [], - tumor_sizes: [String] = [], - chemo_regimen: [String] = [], - tumor_grades: [String] = [], - er_status: [String] = [], - pr_status: [String] = [], - endo_therapies: [String] = [], - meno_status: [String] = [], - tissue_type: [String] = [], - composition: [String] = [], - association: [String] = [], - file_type: [String] = [] - ): [GroupCount] @cypher(statement: """ - // Filtering subjects - MATCH (ss)<-[:sf_of_study_subject]-(sf) - WHERE (size($rc_scores) = 0 OR sf.grouped_recurrence_score IN $rc_scores) - MATCH (ss)<-[:diagnosis_of_study_subject]-(d)<-[:tp_of_diagnosis]-(tp) - WHERE (size($tumor_sizes) = 0 OR d.tumor_size_group IN $tumor_sizes) - AND (size($tumor_grades) = 0 OR d.tumor_grade IN $tumor_grades) - AND (size($er_status) = 0 OR d.er_status IN $er_status) - AND (size($pr_status) = 0 OR d.pr_status IN $pr_status) - AND (size($chemo_regimen) = 0 OR tp.chemotherapy_regimen IN $chemo_regimen) - //AND (size($endo_therapies) = 0 OR tp.endocrine_therapy_type IN $endo_therapies) - MATCH (ss:study_subject)-[:study_subject_of_study]->(s)-[:study_of_program]->(p) - WHERE (size($programs) = 0 OR p.program_acronym IN $programs) - AND (size($studies) = 0 OR (s.study_acronym + ': ' + s.study_short_description) IN $studies) - AND (size($diagnoses) = 0 OR ss.disease_subtype IN $diagnoses) - MATCH (ss)<-[:demographic_of_study_subject]-(demo) - WHERE (size($meno_status) = 0 OR demo.menopause_status IN $meno_status) - MATCH (ss)<-[:sample_of_study_subject]-(samp) - WHERE (size($tissue_type) = 0 OR samp.tissue_type IN $tissue_type) - AND (size($composition) = 0 OR samp.composition IN $composition) - MATCH (ss)<-[*..2]-(parent)<--(f:file) - WHERE (size($file_type) = 0 OR f.file_type IN $file_type) - AND (size($association) = 0 OR head(labels(parent)) IN $association) - WITH DISTINCT ss, tp - RETURN {group: tp.endocrine_therapy_type, subjects: count(ss)} + subjectCountByErStatusFromLists(subject_ids: [String] = [], sample_ids: [String] = [], file_ids: [String] = [], file_names: [String] = []): [GroupCount] @cypher(statement: """ + MATCH (d:diagnosis) + OPTIONAL MATCH (d)-->(ss:study_subject)<--(samp:sample)<--(f:file) + WHERE (ss.study_subject_id IN $subject_ids) + OR (samp.sample_id IN $sample_ids) + OR (f.file_id IN $file_ids) + OR (f.file_name IN $file_names) + RETURN { + group: d.er_status, + subjects: COUNT(DISTINCT ss) + } """, passThrough: true) - filterSubjectCountByMenopauseStatus( - programs: [String] = [], - studies: [String] = [], - diagnoses: [String] = [], - rc_scores: [String] = [], - tumor_sizes: [String] = [], - chemo_regimen: [String] = [], - tumor_grades: [String] = [], - er_status: [String] = [], - pr_status: [String] = [], - endo_therapies: [String] = [], - meno_status: [String] = [], - tissue_type: [String] = [], - composition: [String] = [], - association: [String] = [], - file_type: [String] = [] - ): [GroupCount] @cypher(statement: """ - // Filtering subjects - MATCH (ss)<-[:sf_of_study_subject]-(sf) - WHERE (size($rc_scores) = 0 OR sf.grouped_recurrence_score IN $rc_scores) - MATCH (ss)<-[:diagnosis_of_study_subject]-(d)<-[:tp_of_diagnosis]-(tp) - WHERE (size($tumor_sizes) = 0 OR d.tumor_size_group IN $tumor_sizes) - AND (size($tumor_grades) = 0 OR d.tumor_grade IN $tumor_grades) - AND (size($er_status) = 0 OR d.er_status IN $er_status) - AND (size($pr_status) = 0 OR d.pr_status IN $pr_status) - AND (size($chemo_regimen) = 0 OR tp.chemotherapy_regimen IN $chemo_regimen) - AND (size($endo_therapies) = 0 OR tp.endocrine_therapy_type IN $endo_therapies) - MATCH (ss:study_subject)-[:study_subject_of_study]->(s)-[:study_of_program]->(p) - WHERE (size($programs) = 0 OR p.program_acronym IN $programs) - AND (size($studies) = 0 OR (s.study_acronym + ': ' + s.study_short_description) IN $studies) - AND (size($diagnoses) = 0 OR ss.disease_subtype IN $diagnoses) - MATCH (ss)<-[:demographic_of_study_subject]-(demo) - //WHERE (size($meno_status) = 0 OR demo.menopause_status IN $meno_status) - MATCH (ss)<-[:sample_of_study_subject]-(samp) - WHERE (size($tissue_type) = 0 OR samp.tissue_type IN $tissue_type) - AND (size($composition) = 0 OR samp.composition IN $composition) - MATCH (ss)<-[*..2]-(parent)<--(f:file) - WHERE (size($file_type) = 0 OR f.file_type IN $file_type) - AND (size($association) = 0 OR head(labels(parent)) IN $association) - WITH DISTINCT ss, demo - RETURN {group: demo.menopause_status, subjects: count(ss)} + subjectCountByPrStatusFromLists(subject_ids: [String] = [], sample_ids: [String] = [], file_ids: [String] = [], file_names: [String] = []): [GroupCount] @cypher(statement: """ + MATCH (d:diagnosis) + OPTIONAL MATCH (d)-->(ss:study_subject)<--(samp:sample)<--(f:file) + WHERE (ss.study_subject_id IN $subject_ids) + OR (samp.sample_id IN $sample_ids) + OR (f.file_id IN $file_ids) + OR (f.file_name IN $file_names) + RETURN { + group: d.pr_status, + subjects: COUNT(DISTINCT ss) + } """, passThrough: true) - filterSubjectCountByTissueType( - programs: [String] = [], - studies: [String] = [], - diagnoses: [String] = [], - rc_scores: [String] = [], - tumor_sizes: [String] = [], - chemo_regimen: [String] = [], - tumor_grades: [String] = [], - er_status: [String] = [], - pr_status: [String] = [], - endo_therapies: [String] = [], - meno_status: [String] = [], - tissue_type: [String] = [], - composition: [String] = [], - association: [String] = [], - file_type: [String] = [] - ): [GroupCount] @cypher(statement: """ - // Filtering subjects - MATCH (ss)<-[:sf_of_study_subject]-(sf) - WHERE (size($rc_scores) = 0 OR sf.grouped_recurrence_score IN $rc_scores) - MATCH (ss)<-[:diagnosis_of_study_subject]-(d)<-[:tp_of_diagnosis]-(tp) - WHERE (size($tumor_sizes) = 0 OR d.tumor_size_group IN $tumor_sizes) - AND (size($tumor_grades) = 0 OR d.tumor_grade IN $tumor_grades) - AND (size($er_status) = 0 OR d.er_status IN $er_status) - AND (size($pr_status) = 0 OR d.pr_status IN $pr_status) - AND (size($chemo_regimen) = 0 OR tp.chemotherapy_regimen IN $chemo_regimen) - AND (size($endo_therapies) = 0 OR tp.endocrine_therapy_type IN $endo_therapies) - MATCH (ss:study_subject)-[:study_subject_of_study]->(s)-[:study_of_program]->(p) - WHERE (size($programs) = 0 OR p.program_acronym IN $programs) - AND (size($studies) = 0 OR (s.study_acronym + ': ' + s.study_short_description) IN $studies) - AND (size($diagnoses) = 0 OR ss.disease_subtype IN $diagnoses) - MATCH (ss)<-[:demographic_of_study_subject]-(demo) - WHERE (size($meno_status) = 0 OR demo.menopause_status IN $meno_status) - MATCH (ss)<-[:sample_of_study_subject]-(samp) - WHERE //(size($tissue_type) = 0 OR samp.tissue_type IN $tissue_type) - (size($composition) = 0 OR samp.composition IN $composition) - MATCH (ss)<-[*..2]-(parent)<--(f:file) - WHERE (size($file_type) = 0 OR f.file_type IN $file_type) - AND (size($association) = 0 OR head(labels(parent)) IN $association) - WITH DISTINCT samp - RETURN {group: samp.tissue_type, subjects: count(samp)} + subjectCountByChemotherapyRegimenFromLists(subject_ids: [String] = [], sample_ids: [String] = [], file_ids: [String] = [], file_names: [String] = []): [GroupCount] @cypher(statement: """ + MATCH (tp:therapeutic_procedure) + OPTIONAL MATCH (tp)-->(d:diagnosis)-->(ss:study_subject)<--(samp:sample)<--(f:file) + WHERE (ss.study_subject_id IN $subject_ids) + OR (samp.sample_id IN $sample_ids) + OR (f.file_id IN $file_ids) + OR (f.file_name IN $file_names) + RETURN { + group: tp.chemotherapy_regimen, + subjects: COUNT(DISTINCT ss) + } """, passThrough: true) - filterSubjectCountByTissueComposition( - programs: [String] = [], - studies: [String] = [], - diagnoses: [String] = [], - rc_scores: [String] = [], - tumor_sizes: [String] = [], - chemo_regimen: [String] = [], - tumor_grades: [String] = [], - er_status: [String] = [], - pr_status: [String] = [], - endo_therapies: [String] = [], - meno_status: [String] = [], - tissue_type: [String] = [], - composition: [String] = [], - association: [String] = [], - file_type: [String] = [] - ): [GroupCount] @cypher(statement: """ - // Filtering subjects - MATCH (ss)<-[:sf_of_study_subject]-(sf) - WHERE (size($rc_scores) = 0 OR sf.grouped_recurrence_score IN $rc_scores) - MATCH (ss)<-[:diagnosis_of_study_subject]-(d)<-[:tp_of_diagnosis]-(tp) - WHERE (size($tumor_sizes) = 0 OR d.tumor_size_group IN $tumor_sizes) - AND (size($tumor_grades) = 0 OR d.tumor_grade IN $tumor_grades) - AND (size($er_status) = 0 OR d.er_status IN $er_status) - AND (size($pr_status) = 0 OR d.pr_status IN $pr_status) - AND (size($chemo_regimen) = 0 OR tp.chemotherapy_regimen IN $chemo_regimen) - AND (size($endo_therapies) = 0 OR tp.endocrine_therapy_type IN $endo_therapies) - MATCH (ss:study_subject)-[:study_subject_of_study]->(s)-[:study_of_program]->(p) - WHERE (size($programs) = 0 OR p.program_acronym IN $programs) - AND (size($studies) = 0 OR (s.study_acronym + ': ' + s.study_short_description) IN $studies) - AND (size($diagnoses) = 0 OR ss.disease_subtype IN $diagnoses) - MATCH (ss)<-[:demographic_of_study_subject]-(demo) - WHERE (size($meno_status) = 0 OR demo.menopause_status IN $meno_status) - MATCH (ss)<-[:sample_of_study_subject]-(samp) - WHERE (size($tissue_type) = 0 OR samp.tissue_type IN $tissue_type) - //AND (size($composition) = 0 OR samp.composition IN $composition) - MATCH (ss)<-[*..2]-(parent)<--(f:file) - WHERE (size($file_type) = 0 OR f.file_type IN $file_type) - AND (size($association) = 0 OR head(labels(parent)) IN $association) - WITH DISTINCT samp - RETURN {group: samp.composition, subjects: count(samp)} + subjectCountByEndocrineTherapyFromLists(subject_ids: [String] = [], sample_ids: [String] = [], file_ids: [String] = [], file_names: [String] = []): [GroupCount] @cypher(statement: """ + MATCH (tp:therapeutic_procedure) + OPTIONAL MATCH (tp)-->(d:diagnosis)-->(ss:study_subject)<--(samp:sample)<--(f:file) + WHERE (ss.study_subject_id IN $subject_ids) + OR (samp.sample_id IN $sample_ids) + OR (f.file_id IN $file_ids) + OR (f.file_name IN $file_names) + RETURN { + group: tp.endocrine_therapy_type, + subjects: COUNT(DISTINCT ss) + } """, passThrough: true) - filterSubjectCountByFileAssociation( - programs: [String] = [], - studies: [String] = [], - diagnoses: [String] = [], - rc_scores: [String] = [], - tumor_sizes: [String] = [], - chemo_regimen: [String] = [], - tumor_grades: [String] = [], - er_status: [String] = [], - pr_status: [String] = [], - endo_therapies: [String] = [], - meno_status: [String] = [], - tissue_type: [String] = [], - composition: [String] = [], - association: [String] = [], - file_type: [String] = [] - ): [GroupCount] @cypher(statement: """ - // Filtering subjects - MATCH (ss)<-[:sf_of_study_subject]-(sf) - WHERE (size($rc_scores) = 0 OR sf.grouped_recurrence_score IN $rc_scores) - MATCH (ss)<-[:diagnosis_of_study_subject]-(d)<-[:tp_of_diagnosis]-(tp) - WHERE (size($tumor_sizes) = 0 OR d.tumor_size_group IN $tumor_sizes) - AND (size($tumor_grades) = 0 OR d.tumor_grade IN $tumor_grades) - AND (size($er_status) = 0 OR d.er_status IN $er_status) - AND (size($pr_status) = 0 OR d.pr_status IN $pr_status) - AND (size($chemo_regimen) = 0 OR tp.chemotherapy_regimen IN $chemo_regimen) - AND (size($endo_therapies) = 0 OR tp.endocrine_therapy_type IN $endo_therapies) - MATCH (ss:study_subject)-[:study_subject_of_study]->(s)-[:study_of_program]->(p) - WHERE (size($programs) = 0 OR p.program_acronym IN $programs) - AND (size($studies) = 0 OR (s.study_acronym + ': ' + s.study_short_description) IN $studies) - AND (size($diagnoses) = 0 OR ss.disease_subtype IN $diagnoses) - MATCH (ss)<-[:demographic_of_study_subject]-(demo) - WHERE (size($meno_status) = 0 OR demo.menopause_status IN $meno_status) - MATCH (ss)<-[:sample_of_study_subject]-(samp) - WHERE (size($tissue_type) = 0 OR samp.tissue_type IN $tissue_type) - AND (size($composition) = 0 OR samp.composition IN $composition) - MATCH (ss)<-[*..2]-(parent)<--(f:file) - WHERE (size($file_type) = 0 OR f.file_type IN $file_type) - //AND (size($association) = 0 OR head(labels(parent)) IN $association) - WITH DISTINCT f, parent - RETURN {group: head(labels(parent)), subjects: count(f)} + subjectCountByMenopauseStatusFromLists(subject_ids: [String] = [], sample_ids: [String] = [], file_ids: [String] = [], file_names: [String] = []): [GroupCount] @cypher(statement: """ + MATCH (demo:demographic_data) + OPTIONAL MATCH (demo)-->(ss:study_subject)<--(samp:sample)<--(f:file) + WHERE (ss.study_subject_id IN $subject_ids) + OR (samp.sample_id IN $sample_ids) + OR (f.file_id IN $file_ids) + OR (f.file_name IN $file_names) + RETURN { + group: demo.menopause_status, + subjects: COUNT(DISTINCT ss) + } """, passThrough: true) - filterSubjectCountByFileType( - programs: [String] = [], - studies: [String] = [], - diagnoses: [String] = [], - rc_scores: [String] = [], - tumor_sizes: [String] = [], - chemo_regimen: [String] = [], - tumor_grades: [String] = [], - er_status: [String] = [], - pr_status: [String] = [], - endo_therapies: [String] = [], - meno_status: [String] = [], - tissue_type: [String] = [], - composition: [String] = [], - association: [String] = [], - file_type: [String] = [] - ): [GroupCount] @cypher(statement: """ - // Filtering subjects - MATCH (ss)<-[:sf_of_study_subject]-(sf) - WHERE (size($rc_scores) = 0 OR sf.grouped_recurrence_score IN $rc_scores) - MATCH (ss)<-[:diagnosis_of_study_subject]-(d)<-[:tp_of_diagnosis]-(tp) - WHERE (size($tumor_sizes) = 0 OR d.tumor_size_group IN $tumor_sizes) - AND (size($tumor_grades) = 0 OR d.tumor_grade IN $tumor_grades) - AND (size($er_status) = 0 OR d.er_status IN $er_status) - AND (size($pr_status) = 0 OR d.pr_status IN $pr_status) - AND (size($chemo_regimen) = 0 OR tp.chemotherapy_regimen IN $chemo_regimen) - AND (size($endo_therapies) = 0 OR tp.endocrine_therapy_type IN $endo_therapies) - MATCH (ss:study_subject)-[:study_subject_of_study]->(s)-[:study_of_program]->(p) - WHERE (size($programs) = 0 OR p.program_acronym IN $programs) - AND (size($studies) = 0 OR (s.study_acronym + ': ' + s.study_short_description) IN $studies) - AND (size($diagnoses) = 0 OR ss.disease_subtype IN $diagnoses) - MATCH (ss)<-[:demographic_of_study_subject]-(demo) - WHERE (size($meno_status) = 0 OR demo.menopause_status IN $meno_status) - MATCH (ss)<-[:sample_of_study_subject]-(samp) - WHERE (size($tissue_type) = 0 OR samp.tissue_type IN $tissue_type) - AND (size($composition) = 0 OR samp.composition IN $composition) - MATCH (ss)<-[*..2]-(parent)<--(f:file) - WHERE //(size($file_type) = 0 OR f.file_type IN $file_type) - (size($association) = 0 OR head(labels(parent)) IN $association) - WITH DISTINCT f - RETURN {group: f.file_type, subjects: count(f)} + subjectCountByTissueTypeFromLists(subject_ids: [String] = [], sample_ids: [String] = [], file_ids: [String] = [], file_names: [String] = []): [GroupCount] @cypher(statement: """ + MATCH (samp:sample) + WITH COLLECT(DISTINCT samp.tissue_type) AS tissue_type_list + UNWIND tissue_type_list AS tissue_types + OPTIONAL MATCH (f:file)-->(samp:sample)-->(ss:study_subject) + WHERE (tissue_types = samp.tissue_type) + AND ((ss.study_subject_id IN $subject_ids) + OR (samp.sample_id IN $sample_ids) + OR (f.file_id IN $file_ids) + OR (f.file_name IN $file_names)) + RETURN { + group: tissue_types, + subjects: COUNT(DISTINCT samp) + } """, passThrough: true) - subjectOverViewPaged(subject_ids: [String] = [""], order_by: String = ""): [SubjectOverview] @cypher(statement: """ - MATCH (ss:study_subject) - WHERE ($subject_ids IS NULL OR $subject_ids = [""] OR ss.study_subject_id IN $subject_ids) - OPTIONAL MATCH (ss)<-[:sample_of_study_subject]-(sp)<-[:file_of_sample]-(f)-[:file_of_laboratory_procedure]->(lp) - WITH - toInteger(split(ss.study_subject_id,'-')[2]) as subject_id_num, - collect(DISTINCT sp.sample_id) AS samples, - collect(DISTINCT lp.laboratory_procedure_id) AS lab_procedures, - collect(DISTINCT f {.*}) AS files, - ss - OPTIONAL MATCH (ss)-[:study_subject_of_study]->(s)-[:study_of_program]->(p) - OPTIONAL MATCH (ss)<-[:sf_of_study_subject]-(sf) - OPTIONAL MATCH (ss)<-[:diagnosis_of_study_subject]-(d) - OPTIONAL MATCH (d)<-[:tp_of_diagnosis]-(tp) - OPTIONAL MATCH (ss)<-[:demographic_of_study_subject]-(demo) + subjectCountByTissueCompositionFromLists(subject_ids: [String] = [], sample_ids: [String] = [], file_ids: [String] = [], file_names: [String] = []): [GroupCount] @cypher(statement: """ + MATCH (samp:sample) + WITH COLLECT(DISTINCT samp.composition) AS composition_list + UNWIND composition_list AS compositions + OPTIONAL MATCH (f:file)-->(samp:sample)-->(ss:study_subject) + WHERE (compositions = samp.composition) + AND ((ss.study_subject_id IN $subject_ids) + OR (samp.sample_id IN $sample_ids) + OR (f.file_id IN $file_ids) + OR (f.file_name IN $file_names)) RETURN { - program: p.program_acronym, - program_id: p.program_id, - study_acronym: s.study_acronym, - study_short_description: s.study_short_description, - study_info: s.study_acronym + ': ' + s.study_short_description, - subject_id: ss.study_subject_id, - diagnosis: ss.disease_subtype, - recurrence_score: sf.grouped_recurrence_score, - tumor_size: d.tumor_size_group, - tumor_grade: d.tumor_grade, - er_status: d.er_status, - pr_status: d.pr_status, - chemotherapy: tp.chemotherapy_regimen, - endocrine_therapy: tp.endocrine_therapy_type, - menopause_status: demo.menopause_status, - age_at_index: demo.age_at_index, - survival_time: demo.survival_time, - survival_time_unit: demo.survival_time_unit, - samples: samples, - files: files, - lab_procedures: lab_procedures + group: compositions, + subjects: COUNT(DISTINCT samp) } - ORDER BY CASE $order_by - WHEN 'subject_id' THEN subject_id_num - WHEN 'program' THEN p.program_acronym - WHEN 'program_id' THEN p.program_id - WHEN 'study_acronym' THEN s.study_acronym - WHEN 'study_short_description' THEN s.study_short_description - WHEN 'study_info' THEN s.study_acronym + ': ' + s.study_short_description - WHEN 'diagnosis' THEN ss.disease_subtype - WHEN 'recurrence_score' THEN sf.grouped_recurrence_score - WHEN 'tumor_size' THEN d.tumor_size_group - WHEN 'tumor_grade' THEN d.tumor_grade - WHEN 'er_status' THEN d.er_status - WHEN 'pr_status' THEN d.pr_status - WHEN 'chemotherapy' THEN tp.chemotherapy_regimen - WHEN 'endocrine_therapy' THEN tp.endocrine_therapy_type - WHEN 'menopause_status' THEN demo.menopause_status - WHEN 'age_at_index' THEN demo.age_at_index - WHEN 'survival_time' THEN demo.survival_time - ELSE subject_id_num END """, passThrough: true) - subjectOverViewPagedDesc(subject_ids: [String] = [""], order_by: String = ""): [SubjectOverview] @cypher(statement: """ - MATCH (ss:study_subject) - WHERE ($subject_ids IS NULL OR $subject_ids = [""] OR ss.study_subject_id IN $subject_ids) - OPTIONAL MATCH (ss)<-[:sample_of_study_subject]-(sp)<-[:file_of_sample]-(f)-[:file_of_laboratory_procedure]->(lp) - WITH - toInteger(split(ss.study_subject_id,'-')[2]) as subject_id_num, - collect(DISTINCT sp.sample_id) AS samples, - collect(DISTINCT lp.laboratory_procedure_id) AS lab_procedures, - collect(DISTINCT f {.*}) AS files, - ss - OPTIONAL MATCH (ss)-[:study_subject_of_study]->(s)-[:study_of_program]->(p) - OPTIONAL MATCH (ss)<-[:sf_of_study_subject]-(sf) - OPTIONAL MATCH (ss)<-[:diagnosis_of_study_subject]-(d) - OPTIONAL MATCH (d)<-[:tp_of_diagnosis]-(tp) - OPTIONAL MATCH (ss)<-[:demographic_of_study_subject]-(demo) + subjectCountByFileAssociationFromLists(subject_ids: [String] = [], sample_ids: [String] = [], file_ids: [String] = [], file_names: [String] = []): [GroupCount] @cypher(statement: """ + MATCH (f:file)-->(parent) + WHERE NOT (parent:laboratory_procedure) + WITH COLLECT(DISTINCT head(labels(parent))) AS parents_list + UNWIND parents_list AS parents + MATCH (f:file)-->(parent)-->(ss:study_subject) + WHERE (parents = head(labels(parent))) + AND ((ss.study_subject_id IN $subject_ids) + OR (parent.sample_id IN $sample_ids) + OR (f.file_id IN $file_ids) + OR (f.file_name IN $file_names)) RETURN { - program: p.program_acronym, - program_id: p.program_id, - study_acronym: s.study_acronym, - study_short_description: s.study_short_description, - study_info: s.study_acronym + ': ' + s.study_short_description, - subject_id: ss.study_subject_id, - diagnosis: ss.disease_subtype, - recurrence_score: sf.grouped_recurrence_score, - tumor_size: d.tumor_size_group, - tumor_grade: d.tumor_grade, - er_status: d.er_status, - pr_status: d.pr_status, - chemotherapy: tp.chemotherapy_regimen, - endocrine_therapy: tp.endocrine_therapy_type, - menopause_status: demo.menopause_status, - age_at_index: demo.age_at_index, - survival_time: demo.survival_time, - survival_time_unit: demo.survival_time_unit, - samples: samples, - files: files, - lab_procedures: lab_procedures + group: head(labels(parent)), + subjects: COUNT(DISTINCT f) } - ORDER BY CASE $order_by - WHEN 'subject_id' THEN subject_id_num - WHEN 'program' THEN p.program_acronym - WHEN 'program_id' THEN p.program_id - WHEN 'study_acronym' THEN s.study_acronym - WHEN 'study_short_description' THEN s.study_short_description - WHEN 'study_info' THEN s.study_acronym + ': ' + s.study_short_description - WHEN 'diagnosis' THEN ss.disease_subtype - WHEN 'recurrence_score' THEN sf.grouped_recurrence_score - WHEN 'tumor_size' THEN d.tumor_size_group - WHEN 'tumor_grade' THEN d.tumor_grade - WHEN 'er_status' THEN d.er_status - WHEN 'pr_status' THEN d.pr_status - WHEN 'chemotherapy' THEN tp.chemotherapy_regimen - WHEN 'endocrine_therapy' THEN tp.endocrine_therapy_type - WHEN 'menopause_status' THEN demo.menopause_status - WHEN 'age_at_index' THEN demo.age_at_index - WHEN 'survival_time' THEN demo.survival_time - ELSE subject_id_num END DESC """, passThrough: true) - subjectOverView: [SubjectOverview] @cypher(statement: """ - MATCH (ss:study_subject) - OPTIONAL MATCH (ss)<-[:sample_of_study_subject]-(sp)<-[:file_of_sample]-(f)-[:file_of_laboratory_procedure]->(lp) - WITH ss, collect(DISTINCT sp.sample_id) AS samples, collect(DISTINCT lp.laboratory_procedure_id) AS lab_procedures, collect(DISTINCT f {.*}) AS files - OPTIONAL MATCH (ss)-[:study_subject_of_study]->(s)-[:study_of_program]->(p) - OPTIONAL MATCH (ss)<-[:sf_of_study_subject]-(sf) - OPTIONAL MATCH (ss)<-[:diagnosis_of_study_subject]-(d) - OPTIONAL MATCH (d)<-[:tp_of_diagnosis]-(tp) - OPTIONAL MATCH (ss)<-[:demographic_of_study_subject]-(demo) + subjectCountByFileTypeFromLists(subject_ids: [String] = [], sample_ids: [String] = [], file_ids: [String] = [], file_names: [String] = []): [GroupCount] @cypher(statement: """ + MATCH (f:file)-->(parent) + WHERE NOT (parent:laboratory_procedure) + WITH COLLECT(DISTINCT f.file_type) AS file_type_list + UNWIND file_type_list AS file_types + OPTIONAL MATCH (f:file)-->(samp:sample)-->(ss:study_subject) + WHERE (file_types = f.file_type) + AND ((ss.study_subject_id IN $subject_ids) + OR (samp.sample_id IN $sample_ids) + OR (f.file_id IN $file_ids) + OR (f.file_name IN $file_names)) RETURN { - program: p.program_acronym, - program_id: p.program_id, - study_acronym: s.study_acronym, - study_short_description: s.study_short_description, - study_info: s.study_acronym + ': ' + s.study_short_description, - subject_id: ss.study_subject_id, - diagnosis: ss.disease_subtype, - recurrence_score: sf.grouped_recurrence_score, - tumor_size: d.tumor_size_group, - tumor_grade: d.tumor_grade, - er_status: d.er_status, - pr_status: d.pr_status, - chemotherapy: tp.chemotherapy_regimen, - endocrine_therapy: tp.endocrine_therapy_type, - menopause_status: demo.menopause_status, - age_at_index: demo.age_at_index, - survival_time: demo.survival_time, - survival_time_unit: demo.survival_time_unit, - samples: samples, - files: files, - lab_procedures: lab_procedures + group: file_types, + subjects: COUNT(DISTINCT f) } """, passThrough: true) - searchSubjects2 ( - programs: [String] = [], - studies: [String] = [], - diagnoses: [String] = [], - rc_scores: [String] = [], - tumor_sizes: [String] = [], - chemo_regimen: [String] = [], - tumor_grades: [String] = [], - er_status: [String] = [], - pr_status: [String] = [], - endo_therapies: [String] = [], - meno_status: [String] = [], - tissue_type: [String] = [], - composition: [String] = [], - association: [String] = [], - file_type: [String] = [] - ): [String] @cypher(statement: """ - // Filtering subjects - MATCH (ss)<-[:sf_of_study_subject]-(sf) - WHERE (size($rc_scores) = 0 OR sf.grouped_recurrence_score IN $rc_scores) - MATCH (ss)<-[:diagnosis_of_study_subject]-(d)<-[:tp_of_diagnosis]-(tp) - WHERE (size($tumor_sizes) = 0 OR d.tumor_size_group IN $tumor_sizes) - AND (size($tumor_grades) = 0 OR d.tumor_grade IN $tumor_grades) - AND (size($er_status) = 0 OR d.er_status IN $er_status) - AND (size($pr_status) = 0 OR d.pr_status IN $pr_status) - AND (size($chemo_regimen) = 0 OR tp.chemotherapy_regimen IN $chemo_regimen) - AND (size($endo_therapies) = 0 OR tp.endocrine_therapy_type IN $endo_therapies) - MATCH (ss:study_subject)-[:study_subject_of_study]->(s)-[:study_of_program]->(p) - WHERE (size($programs) = 0 OR p.program_acronym IN $programs) - AND (size($studies) = 0 OR (s.study_acronym + ': ' + s.study_short_description) IN $studies) - AND (size($diagnoses) = 0 OR ss.disease_subtype IN $diagnoses) - MATCH (ss)<-[:demographic_of_study_subject]-(demo) - WHERE (size($meno_status) = 0 OR demo.menopause_status IN $meno_status) - MATCH (ss)<-[:sample_of_study_subject]-(samp) - WHERE (size($tissue_type) = 0 OR samp.tissue_type IN $tissue_type) - AND (size($composition) = 0 OR samp.composition IN $composition) - MATCH (ss)<-[*..2]-(parent)<--(f:file) - WHERE (size($file_type) = 0 OR f.file_type IN $file_type) - AND (size($association) = 0 OR head(labels(parent)) IN $association) - RETURN DISTINCT ss.study_subject_id - """) - - searchSubjects ( - programs: [String] = [], - studies: [String] = [], - diagnoses: [String] = [], - rc_scores: [String] = [], - tumor_sizes: [String] = [], - chemo_regimen: [String] = [], - tumor_grades: [String] = [], - er_status: [String] = [], - pr_status: [String] = [], - endo_therapies: [String] = [], - meno_status: [String] = [], - tissue_type: [String] = [], - composition: [String] = [], - association: [String] = [], - file_type: [String] = [], - first: Int = 100 - ): SearchResult @cypher(statement: """ - // Filtering subjects - MATCH (ss)<-[:sf_of_study_subject]-(sf) - WHERE (size($rc_scores) = 0 OR sf.grouped_recurrence_score IN $rc_scores) - MATCH (ss)<-[:diagnosis_of_study_subject]-(d)<-[:tp_of_diagnosis]-(tp) - WHERE (size($tumor_sizes) = 0 OR d.tumor_size_group IN $tumor_sizes) - AND (size($tumor_grades) = 0 OR d.tumor_grade IN $tumor_grades) - AND (size($er_status) = 0 OR d.er_status IN $er_status) - AND (size($pr_status) = 0 OR d.pr_status IN $pr_status) - AND (size($chemo_regimen) = 0 OR tp.chemotherapy_regimen IN $chemo_regimen) - AND (size($endo_therapies) = 0 OR tp.endocrine_therapy_type IN $endo_therapies) - MATCH (ss:study_subject)-[:study_subject_of_study]->(s)-[:study_of_program]->(p) - WHERE (size($programs) = 0 OR p.program_acronym IN $programs) - AND (size($studies) = 0 OR (s.study_acronym + ': ' + s.study_short_description) IN $studies) - AND (size($diagnoses) = 0 OR ss.disease_subtype IN $diagnoses) - MATCH (ss)<-[:demographic_of_study_subject]-(demo) - WHERE (size($meno_status) = 0 OR demo.menopause_status IN $meno_status) - MATCH (ss)<-[:sample_of_study_subject]-(samp) - WHERE (size($tissue_type) = 0 OR samp.tissue_type IN $tissue_type) - AND (size($composition) = 0 OR samp.composition IN $composition) - MATCH (ss)<-[*..2]-(parent)<--(f:file) - WHERE (size($file_type) = 0 OR f.file_type IN $file_type) - AND (size($association) = 0 OR head(labels(parent)) IN $association) - - // Preparing return values - OPTIONAL MATCH (f)-[:file_of_laboratory_procedure]->(lp) - WITH DISTINCT ss AS ss, samp, lp, f, COLLECT(DISTINCT lp.laboratory_procedure_id) as lab_procedures - OPTIONAL MATCH (ss)-[:study_subject_of_study]->(s)-[:study_of_program]->(p) - OPTIONAL MATCH (ss)<-[:sf_of_study_subject]-(sf) - OPTIONAL MATCH (ss)<-[:diagnosis_of_study_subject]-(d) - OPTIONAL MATCH (d)<-[:tp_of_diagnosis]-(tp) - OPTIONAL MATCH (ss)<-[:demographic_of_study_subject]-(demo) + nodeCountsFromLists (subject_ids: [String] = [], sample_ids: [String] = [], file_ids: [String] = [], file_names: [String] = []): NodeCounts @cypher(statement: """ + OPTIONAL MATCH (p:program)<--(s:study)<--(ss:study_subject)<--(samp:sample)<--(f:file)-->(lp:laboratory_procedure) + WHERE (ss.study_subject_id IN $subject_ids) + OR (samp.sample_id IN $sample_ids) + OR (f.file_id IN $file_ids) + OR (f.file_name IN $file_names) RETURN { - subjectIds: COLLECT(DISTINCT ss.study_subject_id), - sampleIds: COLLECT(DISTINCT samp.sample_id), - fileIds: COLLECT(DISTINCT f.file_id), - numberOfPrograms: COUNT(DISTINCT p.program_acronym), - numberOfStudies: COUNT(DISTINCT s.study_acronym), - numberOfSubjects: COUNT(DISTINCT ss.study_subject_id), - numberOfLabProcedures: COUNT(DISTINCT lp.laboratory_procedure_id), - numberOfSamples: COUNT(DISTINCT samp.sample_id), - numberOfFiles: COUNT(DISTINCT f), - firstPage: COLLECT( DISTINCT({ - subject_id: ss.study_subject_id, - program: p.program_acronym, - program_id: p.program_id, - study_acronym: s.study_acronym, - diagnosis: ss.disease_subtype, - recurrence_score: sf.grouped_recurrence_score, - tumor_size: d.tumor_size_group, - tumor_grade: d.tumor_grade, - er_status: d.er_status, - pr_status: d.pr_status, - age_at_index: demo.age_at_index, - survival_time: demo.survival_time, - survival_time_unit: demo.survival_time_unit - }))[0..$first] + numberOfPrograms: COUNT(DISTINCT p), + numberOfStudies: COUNT(DISTINCT s), + numberOfSubjects: COUNT(DISTINCT ss), + numberOfLabProcedures: COUNT(DISTINCT lp), + numberOfSamples: COUNT(DISTINCT samp), + numberOfFiles: COUNT(DISTINCT f) } """, passThrough:true) + armsByProgramsFromLists(subject_ids: [String] = [], sample_ids: [String] = [], file_ids: [String] = [], file_names: [String] = []): [ProgramArms] @cypher(statement: """ + MATCH (p:program) + OPTIONAL MATCH (p)<--(s:study)<--(ss:study_subject)<--(samp:sample)<--(f:file) + WHERE (ss.study_subject_id IN $subject_ids) + OR (samp.sample_id IN $sample_ids) + OR (f.file_id IN $file_ids) + OR (f.file_name IN $file_names) + WITH COUNT(DISTINCT ss) as caseSize + MATCH (p:program)<--(s:study) + OPTIONAL MATCH (s)<--(ss:study_subject)<--(samp:sample)<--(f:file) + WHERE (ss.study_subject_id IN $subject_ids) + OR (samp.sample_id IN $sample_ids) + OR (f.file_id IN $file_ids) + OR (f.file_name IN $file_names) + WITH p, caseSize, {arm: s.study_acronym, caseSize: COUNT(DISTINCT ss), size: COUNT(DISTINCT ss)} AS studies + RETURN { + program: p.program_acronym, + caseSize: caseSize, + children: COLLECT(studies) + } + """, passThrough: true) + + findIdsFromLists(subject_ids: [String] = [], sample_ids: [String] = [], file_ids: [String] = [], file_names: [String] = []): IdsLists @cypher(statement: """ + OPTIONAL MATCH (ss:study_subject)<--(samp:sample)<--(f:file) + WHERE (ss.study_subject_id IN $subject_ids) + OR (samp.sample_id IN $sample_ids) + OR (f.file_id IN $file_ids) + OR (f.file_name IN $file_names) + WITH + COLLECT(DISTINCT ss.study_subject_id) AS subject_ids, + COLLECT(DISTINCT samp.sample_id) AS sample_ids, + COLLECT(DISTINCT f.file_id) AS file_ids, + COLLECT(DISTINCT f.file_name) AS file_names + RETURN{ + subjectIds: subject_ids, + sampleIds: sample_ids, + fileIds: file_ids, + fileNames: file_names + } + """, passThrough: true) subjectsInList(subject_ids: [String]=[]): [SubjectInfo] @cypher(statement: """ MATCH (ss:study_subject) @@ -1488,241 +658,6 @@ type QueryType { samplesForSubjectId(subject_id: String!): [sample] @cypher(statement: "MATCH (ss:study_subject {study_subject_id: $subject_id})<-[*]-(s:sample) RETURN s") - filesInList(file_ids: [String], order_by: String = ""): [FileDetail] @cypher(statement: """ - MATCH (f:file) - WHERE f.file_id in $file_ids - OPTIONAL MATCH (f)-->(parent) - WHERE NOT (parent:laboratory_procedure) - OPTIONAL MATCH (f)-[*]->(ss:study_subject)-->(s:study) - WITH - toInteger(split(f.file_id,'-')[2]) AS file_id_num, - toInteger(split(ss.study_subject_id,'-')[2]) AS subject_id_num, - head(labels(parent)) AS association, - f, parent, ss, s - RETURN { - file_name: f.file_name, - file_id: f.file_id, - file_type: f.file_type, - association: association, - file_description: f.file_description, - file_format: f.file_format, - file_size: f.file_size, - md5sum: f.md5sum, - subject_id: ss.study_subject_id, - study_code: s.study_acronym - } - ORDER BY CASE $order_by - WHEN 'file_id' THEN f.file_id - WHEN 'file_name' THEN f.file_name - WHEN 'file_type' THEN f.file_type - WHEN 'association' THEN association - WHEN 'file_description' THEN f.file_description - WHEN 'file_format' THEN f.file_format - WHEN 'file_size' THEN f.file_size - WHEN 'md5sum' THEN f.md5sum - WHEN 'subject_id' THEN subject_id_num - WHEN 'study_code' THEN s.study_acronym - ELSE file_id_num END - """, passThrough: true) - - filesInListDesc(file_ids: [String], order_by: String = ""): [FileDetail] @cypher(statement: """ - MATCH (f:file) - WHERE f.file_id in $file_ids - OPTIONAL MATCH (f)-->(parent) - WHERE NOT (parent:laboratory_procedure) - OPTIONAL MATCH (f)-[*]->(ss:study_subject)-->(s:study) - WITH - toInteger(split(f.file_id,'-')[2]) AS file_id_num, - toInteger(split(ss.study_subject_id,'-')[2]) AS subject_id_num, - head(labels(parent)) AS association, - f, parent, ss, s - RETURN { - file_name: f.file_name, - file_id: f.file_id, - file_type: f.file_type, - association: association, - file_description: f.file_description, - file_format: f.file_format, - file_size: f.file_size, - md5sum: f.md5sum, - subject_id: ss.study_subject_id, - study_code: s.study_acronym - } - ORDER BY CASE $order_by - WHEN 'file_id' THEN f.file_id - WHEN 'file_name' THEN f.file_name - WHEN 'file_type' THEN f.file_type - WHEN 'association' THEN association - WHEN 'file_description' THEN f.file_description - WHEN 'file_format' THEN f.file_format - WHEN 'file_size' THEN f.file_size - WHEN 'md5sum' THEN f.md5sum - WHEN 'subject_id' THEN subject_id_num - WHEN 'study_code' THEN s.study_acronym - ELSE file_id_num END DESC - """, passThrough: true) - - sampleOverview(subject_ids: [String] = [""], sample_ids: [String] = [""], order_by: String = ""): [SampleOverview] @cypher(statement: """ - MATCH (samp:sample) - WHERE ($sample_ids IS NULL OR $sample_ids = [""] OR samp.sample_id IN $sample_ids) - OPTIONAL MATCH (samp)-[:sample_of_study_subject]->(ss)-[:study_subject_of_study]->(s)-[:study_of_program]->(p) - OPTIONAL MATCH (samp)<-[:file_of_sample]-(f)-[:file_of_laboratory_procedure]->(lp) - WITH - distinct lp, - toInteger(split(ss.study_subject_id,'-')[2]) AS subject_id_num, - collect(distinct f.file_id) AS files, - samp, ss, s, p - WHERE ($subject_ids IS NULL OR $subject_ids = [""] OR ss.study_subject_id IN $subject_ids) - RETURN { - sample_id: samp.sample_id, - subject_id: ss.study_subject_id, - program: p.program_acronym, - arm: s.study_acronym, - diagnosis: ss.disease_subtype, - tissue_type: samp.tissue_type, - tissue_composition: samp.composition, - sample_anatomic_site: samp.sample_anatomic_site, - sample_procurement_method: samp.method_of_sample_procurement, - platform: lp.test_name, - files: files, - program_id: p.program_id - } - ORDER BY CASE $order_by - WHEN 'subject_id' THEN subject_id_num - WHEN 'sample_id' THEN samp.sample_id - WHEN 'program' THEN p.program_acronym - WHEN 'arm' THEN s.study_acronym - WHEN 'diagnosis' THEN ss.disease_subtype - WHEN 'tissue_type' THEN samp.tissue_type - WHEN 'tissue_composition' THEN samp.composition - WHEN 'sample_anatomic_site' THEN samp.sample_anatomic_site - WHEN 'sample_procurement_method' THEN samp.method_of_sample_procurement - WHEN 'platform' THEN lp.test_name - ELSE subject_id_num END - """, passThrough: true) - - sampleOverviewDesc(subject_ids: [String] = [""], sample_ids: [String] = [""], order_by: String = ""): [SampleOverview] @cypher(statement: """ - MATCH (samp:sample) - WHERE ($sample_ids IS NULL OR $sample_ids = [""] OR samp.sample_id IN $sample_ids) - OPTIONAL MATCH (samp)-[:sample_of_study_subject]->(ss)-[:study_subject_of_study]->(s)-[:study_of_program]->(p) - OPTIONAL MATCH (samp)<-[:file_of_sample]-(f)-[:file_of_laboratory_procedure]->(lp) - WITH - distinct lp, - toInteger(split(ss.study_subject_id,'-')[2]) AS subject_id_num, - collect(distinct f.file_id) AS files, - samp, ss, s, p - WHERE ($subject_ids IS NULL OR $subject_ids = [""] OR ss.study_subject_id IN $subject_ids) - RETURN { - sample_id: samp.sample_id, - subject_id: ss.study_subject_id, - program: p.program_acronym, - arm: s.study_acronym, - diagnosis: ss.disease_subtype, - tissue_type: samp.tissue_type, - tissue_composition: samp.composition, - sample_anatomic_site: samp.sample_anatomic_site, - sample_procurement_method: samp.method_of_sample_procurement, - platform: lp.test_name, - files: files, - program_id: p.program_id - } - ORDER BY CASE $order_by - WHEN 'subject_id' THEN subject_id_num - WHEN 'sample_id' THEN samp.sample_id - WHEN 'program' THEN p.program_acronym - WHEN 'arm' THEN s.study_acronym - WHEN 'diagnosis' THEN ss.disease_subtype - WHEN 'tissue_type' THEN samp.tissue_type - WHEN 'tissue_composition' THEN samp.composition - WHEN 'sample_anatomic_site' THEN samp.sample_anatomic_site - WHEN 'sample_procurement_method' THEN samp.method_of_sample_procurement - WHEN 'platform' THEN lp.test_name - ELSE subject_id_num END DESC - """, passThrough: true) - - - fileOverview(subject_ids: [String] = [""], file_ids: [String] = [""], order_by: String = ""): [FileOverview] @cypher(statement: """ - MATCH (f:file) - WHERE ($file_ids IS NULL OR $file_ids = [""] OR f.file_id IN $file_ids) - MATCH (f)-->(parent) - WHERE NOT (parent:laboratory_procedure) - OPTIONAL MATCH (f)-[:file_of_sample]->(samp)-[:sample_of_study_subject]->(ss)-[:study_subject_of_study]->(s)-[:study_of_program]->(p) - OPTIONAL MATCH (f)-[:file_of_study]->(s1)-[:study_of_program]-(p1) - WITH - ss.study_subject_id AS subject_id, toInteger(split(ss.study_subject_id,'-')[2]) as subject_id_num, - f, ss, p, CASE p WHEN null THEN p1.program_acronym ELSE p.program_acronym END AS program, parent, - CASE s WHEN null THEN s1.study_acronym ELSE s.study_acronym END AS arm, head(labels(parent)) AS association, samp, s1, p1 - WHERE ($subject_ids IS NULL OR $subject_ids = [""] OR subject_id IN $subject_ids) - RETURN { - file_id: f.file_id, - file_name: f.file_name, - association: association, - file_description: f.file_description, - file_format: f.file_format, - file_size: f.file_size, - program: program, - arm: arm, - subject_id: ss.study_subject_id, - sample_id: samp.sample_id, - diagnosis: ss.disease_subtype, - program_id: p.program_id - } - ORDER BY CASE $order_by - WHEN 'subject_id' THEN subject_id_num - WHEN 'file_id' THEN f.file_id - WHEN 'file_name' THEN f.file_name - WHEN 'association' THEN association - WHEN 'file_description' THEN f.file_description - WHEN 'file_format' THEN f.file_format - WHEN 'file_size' THEN f.file_size - WHEN 'program' THEN program - WHEN 'arm' THEN arm - WHEN 'sample_id' THEN samp.sample_id - WHEN 'diagnosis' THEN ss.disease_subtype - ELSE f.file_name END - """, passThrough: true) - - fileOverviewDesc(subject_ids: [String] = [""], file_ids: [String] = [""], order_by: String = ""): [FileOverview] @cypher(statement: """ - MATCH (f:file) - WHERE ($file_ids IS NULL OR $file_ids = [""] OR f.file_id IN $file_ids) - MATCH (f)-->(parent) - WHERE NOT (parent:laboratory_procedure) - OPTIONAL MATCH (f)-[:file_of_sample]->(samp)-[:sample_of_study_subject]->(ss)-[:study_subject_of_study]->(s)-[:study_of_program]->(p) - OPTIONAL MATCH (f)-[:file_of_study]->(s1)-[:study_of_program]-(p1) - WITH - ss.study_subject_id AS subject_id, toInteger(split(ss.study_subject_id,'-')[2]) as subject_id_num, - f, ss, p, CASE p WHEN null THEN p1.program_acronym ELSE p.program_acronym END AS program, parent, - CASE s WHEN null THEN s1.study_acronym ELSE s.study_acronym END AS arm, head(labels(parent)) AS association, samp, s1, p1 - WHERE ($subject_ids IS NULL OR $subject_ids = [""] OR subject_id IN $subject_ids) - RETURN { - file_id: f.file_id, - file_name: f.file_name, - association: association, - file_description: f.file_description, - file_format: f.file_format, - file_size: f.file_size, - program: program, - arm: arm, - subject_id: ss.study_subject_id, - sample_id: samp.sample_id, - diagnosis: ss.disease_subtype, - program_id: p.program_id - } - ORDER BY CASE $order_by - WHEN 'subject_id' THEN subject_id_num - WHEN 'file_id' THEN f.file_id - WHEN 'file_name' THEN f.file_name - WHEN 'association' THEN association - WHEN 'file_description' THEN f.file_description - WHEN 'file_format' THEN f.file_format - WHEN 'file_size' THEN f.file_size - WHEN 'program' THEN program - WHEN 'arm' THEN arm - WHEN 'sample_id' THEN samp.sample_id - WHEN 'diagnosis' THEN ss.disease_subtype - ELSE f.file_name END DESC - """, passThrough: true) - fileIdsFromFileName(file_name: [String], order_by: String ="file_name"): [FileOverview] @cypher(statement: """ MATCH (f:file) WHERE ($file_name IS NULL OR f.file_name IN $file_name) diff --git a/graphql/bento-extended.graphql b/graphql/bento-extended.graphql index c9296eac2..2e1700441 100644 --- a/graphql/bento-extended.graphql +++ b/graphql/bento-extended.graphql @@ -696,30 +696,6 @@ type GroupCount { subjects: Int } -type SubjectOverview { - subject_id: String - program: String - program_id: String - study_acronym: String - study_short_description: String - study_info: String - diagnosis: String - recurrence_score: String - tumor_size: String - tumor_grade: String - er_status: String - pr_status: String - chemotherapy: String - endocrine_therapy: String - menopause_status: String - age_at_index: Int - survival_time: Int - survival_time_unit: String - files: [file] - samples: [String] - lab_procedures: [String] -} - type SubjectInfo { subject_id: String program: String @@ -747,19 +723,6 @@ type FileInfo { md5sum: String } -type FileDetail { - study_code: String - subject_id: String - file_name: String - file_type: String - association: String - file_description: String - file_format: String - file_size: Float - file_id: String - md5sum: String -} - type ProgramInfo { program_acronym: String program_id: String @@ -872,21 +835,6 @@ type ArmDetail { files: [ArmFile] } -type SampleOverview { - sample_id: String - subject_id: String - program: String - arm: String - diagnosis: String - tissue_type: String - tissue_composition: String - sample_anatomic_site: String - sample_procurement_method: String - platform: String - files: [String] - program_id: String -} - type FileOverview { file_id: String file_name: String @@ -902,38 +850,25 @@ type FileOverview { program_id: String } -type SubjectOverview2 { - subject_id: String - program: String - program_id: String - study_acronym: String - diagnosis: String - recurrence_score: String - tumor_size: String - tumor_grade: String - er_status: String - pr_status: String - age_at_index: Int - survival_time: Int - survival_time_unit: String +type GroupList { + group: String + subjects: [String] +} + +type IdsLists { + subjectIds: [String] + sampleIds: [String] + fileIds: [String] + fileNames: [String] } -type SearchResult { +type NodeCounts { numberOfPrograms: Int numberOfStudies: Int numberOfSubjects: Int numberOfSamples: Int numberOfLabProcedures: Int numberOfFiles: Int - subjectIds: [String] - sampleIds: [String] - fileIds: [String] - firstPage: [SubjectOverview2] -} - -type GroupList { - group: String - subjects: [String] } schema { @@ -941,7 +876,7 @@ schema { } type QueryType { - schemaVersion: String @cypher(statement: "RETURN '1.1.0'") + schemaVersion: String @cypher(statement: "RETURN '1.4.5'") "Simple counts" numberOfPrograms: Int @cypher(statement: "MATCH (n:program) return count(n)") @@ -951,1057 +886,292 @@ type QueryType { numberOfLabProcedures: Int @cypher(statement: "MATCH (n:laboratory_procedure) return count(n)") numberOfFiles: Int @cypher(statement: "MATCH (n:file) return count(n)") - "Group counts" - subjectCountByProgram(subject_ids: [String] = []): [GroupCount] @cypher(statement: """ - MATCH (g:program) - OPTIONAL MATCH (g)<--(:study)<--(ss:study_subject) - WITH DISTINCT ss, g - WHERE (size($subject_ids) = 0 OR ss.study_subject_id IN $subject_ids) - RETURN { group: g.program_acronym, - subjects: count(ss) } - """, passThrough: true) - subjectCountByStudy(subject_ids: [String] = []): [GroupCount] @cypher(statement: """ - MATCH (g:study) - OPTIONAL MATCH (g)<--(ss:study_subject) - WITH DISTINCT ss, g - WHERE (size($subject_ids) = 0 OR ss.study_subject_id IN $subject_ids) - RETURN { group: g.study_acronym + ': ' + g.study_short_description, - subjects: count(ss)} - """, passThrough: true) - - subjectCountByDiagnoses(subject_ids: [String] = []): [GroupCount] @cypher(statement: """ - MATCH (g:diagnosis) - OPTIONAL MATCH (g)-->(ss:study_subject) - WITH DISTINCT ss, g - WHERE (size($subject_ids) = 0 OR ss.study_subject_id IN $subject_ids) - RETURN { group: ss.disease_subtype, subjects: count(ss) } - """, passThrough: true) - - subjectCountByRecurrenceScore(subject_ids: [String] = []): [GroupCount] @cypher(statement: """ - MATCH (g:stratification_factor) - OPTIONAL MATCH (g)-->(ss:study_subject) - WITH DISTINCT ss, g - WHERE (size($subject_ids) = 0 OR ss.study_subject_id IN $subject_ids) - RETURN {group: g.grouped_recurrence_score , subjects: count(ss) } - """, passThrough: true) - - subjectCountByTumorSize(subject_ids: [String] = []): [GroupCount] @cypher(statement: """ - MATCH (g:diagnosis) - OPTIONAL MATCH (g)-->(ss:study_subject) - WITH DISTINCT ss, g - WHERE (size($subject_ids) = 0 OR ss.study_subject_id IN $subject_ids) - RETURN {group: g.tumor_size_group, subjects: count(ss)} - """, passThrough: true) - - subjectCountByTumorGrade(subject_ids: [String] = []): [GroupCount] @cypher(statement: """ - MATCH (g:diagnosis) - OPTIONAL MATCH (g)-->(ss:study_subject) - WITH DISTINCT ss, g - WHERE (size($subject_ids) = 0 OR ss.study_subject_id IN $subject_ids) - RETURN {group: g.tumor_grade, subjects: count(ss)} - """, passThrough: true) - - subjectCountByErStatus(subject_ids: [String] = []): [GroupCount] @cypher(statement: """ - MATCH (g:diagnosis) - OPTIONAL MATCH (g)-->(ss:study_subject) - WITH DISTINCT ss, g - WHERE (size($subject_ids) = 0 OR ss.study_subject_id IN $subject_ids) - RETURN {group: g.er_status, subjects: count(ss)} - """, passThrough: true) - - subjectCountByPrStatus(subject_ids: [String] = []): [GroupCount] @cypher(statement: """ - MATCH (g:diagnosis) - OPTIONAL MATCH (g)-->(ss:study_subject) - WITH DISTINCT ss, g - WHERE (size($subject_ids) = 0 OR ss.study_subject_id IN $subject_ids) - RETURN {group: g.pr_status, subjects: count(ss)} - """, passThrough: true) - - subjectCountByChemotherapyRegimen(subject_ids: [String] = []): [GroupCount] @cypher(statement: """ - MATCH (g:therapeutic_procedure) - OPTIONAL MATCH (g)-->()-->(ss:study_subject) - WITH DISTINCT ss, g - WHERE (size($subject_ids) = 0 OR ss.study_subject_id IN $subject_ids) - RETURN {group: g.chemotherapy_regimen, subjects: count(ss)} - """, passThrough: true) - - subjectCountByEndocrineTherapy(subject_ids: [String] = []): [GroupCount] @cypher(statement: """ - MATCH (g:therapeutic_procedure) - OPTIONAL MATCH (g)-->()-->(ss:study_subject) - WITH DISTINCT ss, g - WHERE (size($subject_ids) = 0 OR ss.study_subject_id IN $subject_ids) - RETURN {group: g.endocrine_therapy_type, subjects: count(ss)} - """, passThrough: true) - - subjectCountByMenopauseStatus(subject_ids: [String] = []): [GroupCount] @cypher(statement: """ - MATCH (g:demographic_data) - OPTIONAL MATCH (g)-->(ss:study_subject) - WITH DISTINCT ss, g - WHERE (size($subject_ids) = 0 OR ss.study_subject_id IN $subject_ids) - RETURN {group: g.menopause_status, subjects: count(ss)} - """, passThrough: true) - - subjectCountByTissueType(subject_ids: [String] = []): [GroupCount] @cypher(statement: """ + "Get lists of all subject ids, sample ids, and file ids" + idsLists: IdsLists @cypher(statement: """ MATCH (samp:sample) - OPTIONAL MATCH (samp)-[:sample_of_study_subject]->(ss) - WITH DISTINCT samp, ss - WHERE (size($subject_ids) = 0 OR ss.study_subject_id IN $subject_ids) - RETURN {group: samp.tissue_type, subjects: count(samp)} - """, passThrough: true) - - subjectCountByTissueComposition(subject_ids: [String] = []): [GroupCount] @cypher(statement: """ - MATCH (samp:sample) - OPTIONAL MATCH (samp)-[:sample_of_study_subject]->(ss) - WITH DISTINCT samp, ss - WHERE (size($subject_ids) = 0 OR ss.study_subject_id IN $subject_ids) - RETURN {group: samp.composition, subjects: count(samp)} - """, passThrough: true) - - subjectCountByFileAssociation(subject_ids: [String] = []): [GroupCount] @cypher(statement: """ - MATCH (f:file)-[*..3]->(ss:study_subject) - MATCH (f)-->(parent) - WHERE NOT (parent:laboratory_procedure) - AND (size($subject_ids) = 0 OR ss.study_subject_id IN $subject_ids) - RETURN {group: head(labels(parent)), subjects: count(f)} + WITH COLLECT(DISTINCT samp.sample_id) as samples + MATCH (ss:study_subject) + WITH COLLECT(DISTINCT ss.study_subject_id) as study_subjects, samples + MATCH (f:file) + WITH COLLECT(DISTINCT f.file_id) as fileIds, COLLECT(DISTINCT f.file_name) as fileNames, samples, study_subjects + RETURN { + sampleIds: samples, + fileIds: fileIds, + fileNames: fileNames, + subjectIds: study_subjects + } """, passThrough: true) - subjectCountByFileType(subject_ids: [String] = []): [GroupCount] @cypher(statement: """ - MATCH (f:file)-[*..3]->(ss:study_subject) - WHERE (size($subject_ids) = 0 OR ss.study_subject_id IN $subject_ids) - RETURN {group: f.file_type, subjects: count(DISTINCT f)} - """, passThrough: true) + "Group counts from lists of subject ids, file ids, and sample ids" - armsByPrograms(subject_ids: [String] = []): [ProgramArms] @cypher(statement: """ + subjectCountByProgramFromLists(subject_ids: [String] = [], sample_ids: [String] = [], file_ids: [String] = [], file_names: [String] = []): [GroupCount] @cypher(statement: """ MATCH (p:program) - OPTIONAL MATCH (p)<-[:study_of_program]-()<-[:study_subject_of_study]-(ss) - WHERE (size($subject_ids) = 0 OR ss.study_subject_id IN $subject_ids) - WITH p, COUNT(DISTINCT ss) AS caseSize - OPTIONAL MATCH (p)<-[:study_of_program]-(s)<-[:study_subject_of_study]-(ss) - WHERE (size($subject_ids) = 0 OR ss.study_subject_id IN $subject_ids) - WITH - p, caseSize, - {arm: s.study_acronym, caseSize: COUNT(DISTINCT ss), size: COUNT(DISTINCT ss)} AS s - RETURN { program: p.program_acronym, - caseSize: caseSize, - children: collect(s) } - """, passThrough: true) - - "Facet search counts" - filterSubjectCountByProgram( - programs: [String] = [], - studies: [String] = [], - diagnoses: [String] = [], - rc_scores: [String] = [], - tumor_sizes: [String] = [], - chemo_regimen: [String] = [], - tumor_grades: [String] = [], - er_status: [String] = [], - pr_status: [String] = [], - endo_therapies: [String] = [], - meno_status: [String] = [], - tissue_type: [String] = [], - composition: [String] = [], - association: [String] = [], - file_type: [String] = [] - ): [GroupCount] @cypher(statement: """ - // Filtering subjects - MATCH (ss)<-[:sf_of_study_subject]-(sf) - WHERE (size($rc_scores) = 0 OR sf.grouped_recurrence_score IN $rc_scores) - MATCH (ss)<-[:diagnosis_of_study_subject]-(d)<-[:tp_of_diagnosis]-(tp) - WHERE (size($tumor_sizes) = 0 OR d.tumor_size_group IN $tumor_sizes) - AND (size($tumor_grades) = 0 OR d.tumor_grade IN $tumor_grades) - AND (size($er_status) = 0 OR d.er_status IN $er_status) - AND (size($pr_status) = 0 OR d.pr_status IN $pr_status) - AND (size($chemo_regimen) = 0 OR tp.chemotherapy_regimen IN $chemo_regimen) - AND (size($endo_therapies) = 0 OR tp.endocrine_therapy_type IN $endo_therapies) - MATCH (ss:study_subject)-[:study_subject_of_study]->(s)-[:study_of_program]->(p) - WHERE (size($studies) = 0 OR (s.study_acronym + ': ' + s.study_short_description) IN $studies) - AND (size($diagnoses) = 0 OR ss.disease_subtype IN $diagnoses) - MATCH (ss)<-[:demographic_of_study_subject]-(demo) - WHERE (size($meno_status) = 0 OR demo.menopause_status IN $meno_status) - MATCH (ss)<-[:sample_of_study_subject]-(samp) - WHERE (size($tissue_type) = 0 OR samp.tissue_type IN $tissue_type) - AND (size($composition) = 0 OR samp.composition IN $composition) - MATCH (ss)<-[*..2]-(parent)<--(f:file) - WHERE (size($file_type) = 0 OR f.file_type IN $file_type) - AND (size($association) = 0 OR head(labels(parent)) IN $association) - WITH DISTINCT ss, p - RETURN {group: p.program_acronym , subjects: count(ss)} - """, passThrough: true) - - filterSubjectCountByStudy( - programs: [String] = [], - studies: [String] = [], - diagnoses: [String] = [], - rc_scores: [String] = [], - tumor_sizes: [String] = [], - chemo_regimen: [String] = [], - tumor_grades: [String] = [], - er_status: [String] = [], - pr_status: [String] = [], - endo_therapies: [String] = [], - meno_status: [String] = [], - tissue_type: [String] = [], - composition: [String] = [], - association: [String] = [], - file_type: [String] = [] - ): [GroupCount] @cypher(statement: """ - // Filtering subjects - MATCH (ss)<-[:sf_of_study_subject]-(sf) - WHERE (size($rc_scores) = 0 OR sf.grouped_recurrence_score IN $rc_scores) - MATCH (ss)<-[:diagnosis_of_study_subject]-(d)<-[:tp_of_diagnosis]-(tp) - WHERE (size($tumor_sizes) = 0 OR d.tumor_size_group IN $tumor_sizes) - AND (size($tumor_grades) = 0 OR d.tumor_grade IN $tumor_grades) - AND (size($er_status) = 0 OR d.er_status IN $er_status) - AND (size($pr_status) = 0 OR d.pr_status IN $pr_status) - AND (size($chemo_regimen) = 0 OR tp.chemotherapy_regimen IN $chemo_regimen) - AND (size($endo_therapies) = 0 OR tp.endocrine_therapy_type IN $endo_therapies) - MATCH (ss:study_subject)-[:study_subject_of_study]->(s)-[:study_of_program]->(p) - WHERE (size($programs) = 0 OR p.program_acronym IN $programs) - //AND (size($studies) = 0 OR (s.study_acronym + ': ' + s.study_short_description) IN $studies) - AND (size($diagnoses) = 0 OR ss.disease_subtype IN $diagnoses) - MATCH (ss)<-[:demographic_of_study_subject]-(demo) - WHERE (size($meno_status) = 0 OR demo.menopause_status IN $meno_status) - MATCH (ss)<-[:sample_of_study_subject]-(samp) - WHERE (size($tissue_type) = 0 OR samp.tissue_type IN $tissue_type) - AND (size($composition) = 0 OR samp.composition IN $composition) - MATCH (ss)<-[*..2]-(parent)<--(f:file) - WHERE (size($file_type) = 0 OR f.file_type IN $file_type) - AND (size($association) = 0 OR head(labels(parent)) IN $association) - WITH DISTINCT ss, s - RETURN {group: s.study_acronym + ': ' + s.study_short_description, subjects: count(ss)} - """, passThrough: true) - - filterSubjectCountByDiagnoses( - programs: [String] = [], - studies: [String] = [], - diagnoses: [String] = [], - rc_scores: [String] = [], - tumor_sizes: [String] = [], - chemo_regimen: [String] = [], - tumor_grades: [String] = [], - er_status: [String] = [], - pr_status: [String] = [], - endo_therapies: [String] = [], - meno_status: [String] = [], - tissue_type: [String] = [], - composition: [String] = [], - association: [String] = [], - file_type: [String] = [] - ): [GroupCount] @cypher(statement: """ - // Filtering subjects - MATCH (ss)<-[:sf_of_study_subject]-(sf) - WHERE (size($rc_scores) = 0 OR sf.grouped_recurrence_score IN $rc_scores) - MATCH (ss)<-[:diagnosis_of_study_subject]-(d)<-[:tp_of_diagnosis]-(tp) - WHERE (size($tumor_sizes) = 0 OR d.tumor_size_group IN $tumor_sizes) - AND (size($tumor_grades) = 0 OR d.tumor_grade IN $tumor_grades) - AND (size($er_status) = 0 OR d.er_status IN $er_status) - AND (size($pr_status) = 0 OR d.pr_status IN $pr_status) - AND (size($chemo_regimen) = 0 OR tp.chemotherapy_regimen IN $chemo_regimen) - AND (size($endo_therapies) = 0 OR tp.endocrine_therapy_type IN $endo_therapies) - MATCH (ss:study_subject)-[:study_subject_of_study]->(s)-[:study_of_program]->(p) - WHERE (size($programs) = 0 OR p.program_acronym IN $programs) - AND (size($studies) = 0 OR (s.study_acronym + ': ' + s.study_short_description) IN $studies) - //AND (size($diagnoses) = 0 OR ss.disease_subtype IN $diagnoses) - MATCH (ss)<-[:demographic_of_study_subject]-(demo) - WHERE (size($meno_status) = 0 OR demo.menopause_status IN $meno_status) - MATCH (ss)<-[:sample_of_study_subject]-(samp) - WHERE (size($tissue_type) = 0 OR samp.tissue_type IN $tissue_type) - AND (size($composition) = 0 OR samp.composition IN $composition) - MATCH (ss)<-[*..2]-(parent)<--(f:file) - WHERE (size($file_type) = 0 OR f.file_type IN $file_type) - AND (size($association) = 0 OR head(labels(parent)) IN $association) - WITH DISTINCT ss - RETURN {group: ss.disease_subtype, subjects: count(ss)} - """, passThrough: true) - - filterSubjectCountByRecurrenceScore( - programs: [String] = [], - studies: [String] = [], - diagnoses: [String] = [], - rc_scores: [String] = [], - tumor_sizes: [String] = [], - chemo_regimen: [String] = [], - tumor_grades: [String] = [], - er_status: [String] = [], - pr_status: [String] = [], - endo_therapies: [String] = [], - meno_status: [String] = [], - tissue_type: [String] = [], - composition: [String] = [], - association: [String] = [], - file_type: [String] = [] - ): [GroupCount] @cypher(statement: """ - // Filtering subjects - MATCH (ss)<-[:sf_of_study_subject]-(sf) - //WHERE (size($rc_scores) = 0 OR sf.grouped_recurrence_score IN $rc_scores) - MATCH (ss)<-[:diagnosis_of_study_subject]-(d)<-[:tp_of_diagnosis]-(tp) - WHERE (size($tumor_sizes) = 0 OR d.tumor_size_group IN $tumor_sizes) - AND (size($tumor_grades) = 0 OR d.tumor_grade IN $tumor_grades) - AND (size($er_status) = 0 OR d.er_status IN $er_status) - AND (size($pr_status) = 0 OR d.pr_status IN $pr_status) - AND (size($chemo_regimen) = 0 OR tp.chemotherapy_regimen IN $chemo_regimen) - AND (size($endo_therapies) = 0 OR tp.endocrine_therapy_type IN $endo_therapies) - MATCH (ss:study_subject)-[:study_subject_of_study]->(s)-[:study_of_program]->(p) - WHERE (size($programs) = 0 OR p.program_acronym IN $programs) - AND (size($studies) = 0 OR (s.study_acronym + ': ' + s.study_short_description) IN $studies) - AND (size($diagnoses) = 0 OR ss.disease_subtype IN $diagnoses) - MATCH (ss)<-[:demographic_of_study_subject]-(demo) - WHERE (size($meno_status) = 0 OR demo.menopause_status IN $meno_status) - MATCH (ss)<-[:sample_of_study_subject]-(samp) - WHERE (size($tissue_type) = 0 OR samp.tissue_type IN $tissue_type) - AND (size($composition) = 0 OR samp.composition IN $composition) - MATCH (ss)<-[*..2]-(parent)<--(f:file) - WHERE (size($file_type) = 0 OR f.file_type IN $file_type) - AND (size($association) = 0 OR head(labels(parent)) IN $association) - WITH DISTINCT ss, sf - RETURN {group: sf.grouped_recurrence_score, subjects: count(ss)} + OPTIONAL MATCH (p)<--(s:study)<--(ss:study_subject)<--(samp:sample)<--(f:file) + WHERE (ss.study_subject_id IN $subject_ids) + OR (samp.sample_id IN $sample_ids) + OR (f.file_id IN $file_ids) + OR (f.file_name IN $file_names) + RETURN { + group: p.program_acronym, + subjects: COUNT(DISTINCT ss) + } """, passThrough: true) - filterSubjectCountByTumorSize( - programs: [String] = [], - studies: [String] = [], - diagnoses: [String] = [], - rc_scores: [String] = [], - tumor_sizes: [String] = [], - chemo_regimen: [String] = [], - tumor_grades: [String] = [], - er_status: [String] = [], - pr_status: [String] = [], - endo_therapies: [String] = [], - meno_status: [String] = [], - tissue_type: [String] = [], - composition: [String] = [], - association: [String] = [], - file_type: [String] = [] - ): [GroupCount] @cypher(statement: """ - // Filtering subjects - MATCH (ss)<-[:sf_of_study_subject]-(sf) - WHERE (size($rc_scores) = 0 OR sf.grouped_recurrence_score IN $rc_scores) - MATCH (ss)<-[:diagnosis_of_study_subject]-(d)<-[:tp_of_diagnosis]-(tp) - WHERE //(size($tumor_sizes) = 0 OR d.tumor_size_group IN $tumor_sizes) - (size($tumor_grades) = 0 OR d.tumor_grade IN $tumor_grades) - AND (size($er_status) = 0 OR d.er_status IN $er_status) - AND (size($pr_status) = 0 OR d.pr_status IN $pr_status) - AND (size($chemo_regimen) = 0 OR tp.chemotherapy_regimen IN $chemo_regimen) - AND (size($endo_therapies) = 0 OR tp.endocrine_therapy_type IN $endo_therapies) - MATCH (ss:study_subject)-[:study_subject_of_study]->(s)-[:study_of_program]->(p) - WHERE (size($programs) = 0 OR p.program_acronym IN $programs) - AND (size($studies) = 0 OR (s.study_acronym + ': ' + s.study_short_description) IN $studies) - AND (size($diagnoses) = 0 OR ss.disease_subtype IN $diagnoses) - MATCH (ss)<-[:demographic_of_study_subject]-(demo) - WHERE (size($meno_status) = 0 OR demo.menopause_status IN $meno_status) - MATCH (ss)<-[:sample_of_study_subject]-(samp) - WHERE (size($tissue_type) = 0 OR samp.tissue_type IN $tissue_type) - AND (size($composition) = 0 OR samp.composition IN $composition) - MATCH (ss)<-[*..2]-(parent)<--(f:file) - WHERE (size($file_type) = 0 OR f.file_type IN $file_type) - AND (size($association) = 0 OR head(labels(parent)) IN $association) - WITH DISTINCT ss, d - RETURN {group: d.tumor_size_group, subjects: count(ss)} + subjectCountByStudyFromLists(subject_ids: [String] = [], sample_ids: [String] = [], file_ids: [String] = [], file_names: [String] = []): [GroupCount] @cypher(statement: """ + MATCH (s:study) + OPTIONAL MATCH (s)<--(ss:study_subject)<--(samp:sample)<--(f:file) + WHERE (ss.study_subject_id IN $subject_ids) + OR (samp.sample_id IN $sample_ids) + OR (f.file_id IN $file_ids) + OR (f.file_name IN $file_names) + RETURN { + group: s.study_acronym + ': ' + s.study_short_description, + subjects: COUNT(DISTINCT ss) + } """, passThrough: true) - filterSubjectCountByTumorGrade( - programs: [String] = [], - studies: [String] = [], - diagnoses: [String] = [], - rc_scores: [String] = [], - tumor_sizes: [String] = [], - chemo_regimen: [String] = [], - tumor_grades: [String] = [], - er_status: [String] = [], - pr_status: [String] = [], - endo_therapies: [String] = [], - meno_status: [String] = [], - tissue_type: [String] = [], - composition: [String] = [], - association: [String] = [], - file_type: [String] = [] - ): [GroupCount] @cypher(statement: """ - // Filtering subjects - MATCH (ss)<-[:sf_of_study_subject]-(sf) - WHERE (size($rc_scores) = 0 OR sf.grouped_recurrence_score IN $rc_scores) - MATCH (ss)<-[:diagnosis_of_study_subject]-(d)<-[:tp_of_diagnosis]-(tp) - WHERE (size($tumor_sizes) = 0 OR d.tumor_size_group IN $tumor_sizes) - //AND (size($tumor_grades) = 0 OR d.tumor_grade IN $tumor_grades) - AND (size($er_status) = 0 OR d.er_status IN $er_status) - AND (size($pr_status) = 0 OR d.pr_status IN $pr_status) - AND (size($chemo_regimen) = 0 OR tp.chemotherapy_regimen IN $chemo_regimen) - AND (size($endo_therapies) = 0 OR tp.endocrine_therapy_type IN $endo_therapies) - MATCH (ss:study_subject)-[:study_subject_of_study]->(s)-[:study_of_program]->(p) - WHERE (size($programs) = 0 OR p.program_acronym IN $programs) - AND (size($studies) = 0 OR (s.study_acronym + ': ' + s.study_short_description) IN $studies) - AND (size($diagnoses) = 0 OR ss.disease_subtype IN $diagnoses) - MATCH (ss)<-[:demographic_of_study_subject]-(demo) - WHERE (size($meno_status) = 0 OR demo.menopause_status IN $meno_status) - MATCH (ss)<-[:sample_of_study_subject]-(samp) - WHERE (size($tissue_type) = 0 OR samp.tissue_type IN $tissue_type) - AND (size($composition) = 0 OR samp.composition IN $composition) - MATCH (ss)<-[*..2]-(parent)<--(f:file) - WHERE (size($file_type) = 0 OR f.file_type IN $file_type) - AND (size($association) = 0 OR head(labels(parent)) IN $association) - WITH DISTINCT ss, d - RETURN {group: d.tumor_grade, subjects: count(ss)} + subjectCountByDiagnosesFromLists(subject_ids: [String] = [], sample_ids: [String] = [], file_ids: [String] = [], file_names: [String] = []): [GroupCount] @cypher(statement: """ + MATCH (ss:study_subject) + WITH COLLECT(DISTINCT ss.disease_subtype) AS disease_subtype_list + UNWIND disease_subtype_list AS disease_subtypes + OPTIONAL MATCH (ss:study_subject)<--(samp:sample)<--(f:file) + WHERE (disease_subtypes = ss.disease_subtype) + AND ((ss.study_subject_id IN $subject_ids) + OR (samp.sample_id IN $sample_ids) + OR (f.file_id IN $file_ids)) + OR (f.file_name IN $file_names) + RETURN { + group: disease_subtypes, + subjects: COUNT(DISTINCT ss) + } """, passThrough: true) - filterSubjectCountByErStatus( - programs: [String] = [], - studies: [String] = [], - diagnoses: [String] = [], - rc_scores: [String] = [], - tumor_sizes: [String] = [], - chemo_regimen: [String] = [], - tumor_grades: [String] = [], - er_status: [String] = [], - pr_status: [String] = [], - endo_therapies: [String] = [], - meno_status: [String] = [], - tissue_type: [String] = [], - composition: [String] = [], - association: [String] = [], - file_type: [String] = [] - ): [GroupCount] @cypher(statement: """ - // Filtering subjects - MATCH (ss)<-[:sf_of_study_subject]-(sf) - WHERE (size($rc_scores) = 0 OR sf.grouped_recurrence_score IN $rc_scores) - MATCH (ss)<-[:diagnosis_of_study_subject]-(d)<-[:tp_of_diagnosis]-(tp) - WHERE (size($tumor_sizes) = 0 OR d.tumor_size_group IN $tumor_sizes) - AND (size($tumor_grades) = 0 OR d.tumor_grade IN $tumor_grades) - //AND (size($er_status) = 0 OR d.er_status IN $er_status) - AND (size($pr_status) = 0 OR d.pr_status IN $pr_status) - AND (size($chemo_regimen) = 0 OR tp.chemotherapy_regimen IN $chemo_regimen) - AND (size($endo_therapies) = 0 OR tp.endocrine_therapy_type IN $endo_therapies) - MATCH (ss:study_subject)-[:study_subject_of_study]->(s)-[:study_of_program]->(p) - WHERE (size($programs) = 0 OR p.program_acronym IN $programs) - AND (size($studies) = 0 OR (s.study_acronym + ': ' + s.study_short_description) IN $studies) - AND (size($diagnoses) = 0 OR ss.disease_subtype IN $diagnoses) - MATCH (ss)<-[:demographic_of_study_subject]-(demo) - WHERE (size($meno_status) = 0 OR demo.menopause_status IN $meno_status) - MATCH (ss)<-[:sample_of_study_subject]-(samp) - WHERE (size($tissue_type) = 0 OR samp.tissue_type IN $tissue_type) - AND (size($composition) = 0 OR samp.composition IN $composition) - MATCH (ss)<-[*..2]-(parent)<--(f:file) - WHERE (size($file_type) = 0 OR f.file_type IN $file_type) - AND (size($association) = 0 OR head(labels(parent)) IN $association) - WITH DISTINCT ss, d - RETURN {group: d.er_status, subjects: count(ss)} + subjectCountByRecurrenceScoreFromLists(subject_ids: [String] = [], sample_ids: [String] = [], file_ids: [String] = [], file_names: [String] = []): [GroupCount] @cypher(statement: """ + MATCH (sf:stratification_factor) + OPTIONAL MATCH (sf)-->(ss:study_subject)<--(samp:sample)<--(f:file) + WHERE (ss.study_subject_id IN $subject_ids) + OR (samp.sample_id IN $sample_ids) + OR (f.file_id IN $file_ids) + OR (f.file_name IN $file_names) + RETURN { + group: sf.grouped_recurrence_score, + subjects: COUNT(DISTINCT ss) + } """, passThrough: true) - filterSubjectCountByPrStatus( - programs: [String] = [], - studies: [String] = [], - diagnoses: [String] = [], - rc_scores: [String] = [], - tumor_sizes: [String] = [], - chemo_regimen: [String] = [], - tumor_grades: [String] = [], - er_status: [String] = [], - pr_status: [String] = [], - endo_therapies: [String] = [], - meno_status: [String] = [], - tissue_type: [String] = [], - composition: [String] = [], - association: [String] = [], - file_type: [String] = [] - ): [GroupCount] @cypher(statement: """ - // Filtering subjects - MATCH (ss)<-[:sf_of_study_subject]-(sf) - WHERE (size($rc_scores) = 0 OR sf.grouped_recurrence_score IN $rc_scores) - MATCH (ss)<-[:diagnosis_of_study_subject]-(d)<-[:tp_of_diagnosis]-(tp) - WHERE (size($tumor_sizes) = 0 OR d.tumor_size_group IN $tumor_sizes) - AND (size($tumor_grades) = 0 OR d.tumor_grade IN $tumor_grades) - AND (size($er_status) = 0 OR d.er_status IN $er_status) - //AND (size($pr_status) = 0 OR d.pr_status IN $pr_status) - AND (size($chemo_regimen) = 0 OR tp.chemotherapy_regimen IN $chemo_regimen) - AND (size($endo_therapies) = 0 OR tp.endocrine_therapy_type IN $endo_therapies) - MATCH (ss:study_subject)-[:study_subject_of_study]->(s)-[:study_of_program]->(p) - WHERE (size($programs) = 0 OR p.program_acronym IN $programs) - AND (size($studies) = 0 OR (s.study_acronym + ': ' + s.study_short_description) IN $studies) - AND (size($diagnoses) = 0 OR ss.disease_subtype IN $diagnoses) - MATCH (ss)<-[:demographic_of_study_subject]-(demo) - WHERE (size($meno_status) = 0 OR demo.menopause_status IN $meno_status) - MATCH (ss)<-[:sample_of_study_subject]-(samp) - WHERE (size($tissue_type) = 0 OR samp.tissue_type IN $tissue_type) - AND (size($composition) = 0 OR samp.composition IN $composition) - MATCH (ss)<-[*..2]-(parent)<--(f:file) - WHERE (size($file_type) = 0 OR f.file_type IN $file_type) - AND (size($association) = 0 OR head(labels(parent)) IN $association) - WITH DISTINCT ss, d - RETURN {group: d.pr_status, subjects: count(ss)} + subjectCountByTumorSizeFromLists(subject_ids: [String] = [], sample_ids: [String] = [], file_ids: [String] = [], file_names: [String] = []): [GroupCount] @cypher(statement: """ + MATCH (d:diagnosis) + OPTIONAL MATCH (d)-->(ss:study_subject)<--(samp:sample)<--(f:file) + WHERE (ss.study_subject_id IN $subject_ids) + OR (samp.sample_id IN $sample_ids) + OR (f.file_id IN $file_ids) + OR (f.file_name IN $file_names) + RETURN { + group: d.tumor_size_group, + subjects: COUNT(DISTINCT ss) + } """, passThrough: true) - filterSubjectCountByChemotherapyRegimen( - programs: [String] = [], - studies: [String] = [], - diagnoses: [String] = [], - rc_scores: [String] = [], - tumor_sizes: [String] = [], - chemo_regimen: [String] = [], - tumor_grades: [String] = [], - er_status: [String] = [], - pr_status: [String] = [], - endo_therapies: [String] = [], - meno_status: [String] = [], - tissue_type: [String] = [], - composition: [String] = [], - association: [String] = [], - file_type: [String] = [] - ): [GroupCount] @cypher(statement: """ - // Filtering subjects - MATCH (ss)<-[:sf_of_study_subject]-(sf) - WHERE (size($rc_scores) = 0 OR sf.grouped_recurrence_score IN $rc_scores) - MATCH (ss)<-[:diagnosis_of_study_subject]-(d)<-[:tp_of_diagnosis]-(tp) - WHERE (size($tumor_sizes) = 0 OR d.tumor_size_group IN $tumor_sizes) - AND (size($tumor_grades) = 0 OR d.tumor_grade IN $tumor_grades) - AND (size($er_status) = 0 OR d.er_status IN $er_status) - AND (size($pr_status) = 0 OR d.pr_status IN $pr_status) - //AND (size($chemo_regimen) = 0 OR tp.chemotherapy_regimen IN $chemo_regimen) - AND (size($endo_therapies) = 0 OR tp.endocrine_therapy_type IN $endo_therapies) - MATCH (ss:study_subject)-[:study_subject_of_study]->(s)-[:study_of_program]->(p) - WHERE (size($programs) = 0 OR p.program_acronym IN $programs) - AND (size($studies) = 0 OR (s.study_acronym + ': ' + s.study_short_description) IN $studies) - AND (size($diagnoses) = 0 OR ss.disease_subtype IN $diagnoses) - MATCH (ss)<-[:demographic_of_study_subject]-(demo) - WHERE (size($meno_status) = 0 OR demo.menopause_status IN $meno_status) - MATCH (ss)<-[:sample_of_study_subject]-(samp) - WHERE (size($tissue_type) = 0 OR samp.tissue_type IN $tissue_type) - AND (size($composition) = 0 OR samp.composition IN $composition) - MATCH (ss)<-[*..2]-(parent)<--(f:file) - WHERE (size($file_type) = 0 OR f.file_type IN $file_type) - AND (size($association) = 0 OR head(labels(parent)) IN $association) - WITH DISTINCT ss, tp - RETURN {group: tp.chemotherapy_regimen, subjects: count(ss)} + subjectCountByTumorGradeFromLists(subject_ids: [String] = [], sample_ids: [String] = [], file_ids: [String] = [], file_names: [String] = []): [GroupCount] @cypher(statement: """ + MATCH (d:diagnosis) + OPTIONAL MATCH (d)-->(ss:study_subject)<--(samp:sample)<--(f:file) + WHERE (ss.study_subject_id IN $subject_ids) + OR (samp.sample_id IN $sample_ids) + OR (f.file_id IN $file_ids) + OR (f.file_name IN $file_names) + RETURN { + group: d.tumor_grade, + subjects: COUNT(DISTINCT ss) + } """, passThrough: true) - filterSubjectCountByEndocrineTherapy( - programs: [String] = [], - studies: [String] = [], - diagnoses: [String] = [], - rc_scores: [String] = [], - tumor_sizes: [String] = [], - chemo_regimen: [String] = [], - tumor_grades: [String] = [], - er_status: [String] = [], - pr_status: [String] = [], - endo_therapies: [String] = [], - meno_status: [String] = [], - tissue_type: [String] = [], - composition: [String] = [], - association: [String] = [], - file_type: [String] = [] - ): [GroupCount] @cypher(statement: """ - // Filtering subjects - MATCH (ss)<-[:sf_of_study_subject]-(sf) - WHERE (size($rc_scores) = 0 OR sf.grouped_recurrence_score IN $rc_scores) - MATCH (ss)<-[:diagnosis_of_study_subject]-(d)<-[:tp_of_diagnosis]-(tp) - WHERE (size($tumor_sizes) = 0 OR d.tumor_size_group IN $tumor_sizes) - AND (size($tumor_grades) = 0 OR d.tumor_grade IN $tumor_grades) - AND (size($er_status) = 0 OR d.er_status IN $er_status) - AND (size($pr_status) = 0 OR d.pr_status IN $pr_status) - AND (size($chemo_regimen) = 0 OR tp.chemotherapy_regimen IN $chemo_regimen) - //AND (size($endo_therapies) = 0 OR tp.endocrine_therapy_type IN $endo_therapies) - MATCH (ss:study_subject)-[:study_subject_of_study]->(s)-[:study_of_program]->(p) - WHERE (size($programs) = 0 OR p.program_acronym IN $programs) - AND (size($studies) = 0 OR (s.study_acronym + ': ' + s.study_short_description) IN $studies) - AND (size($diagnoses) = 0 OR ss.disease_subtype IN $diagnoses) - MATCH (ss)<-[:demographic_of_study_subject]-(demo) - WHERE (size($meno_status) = 0 OR demo.menopause_status IN $meno_status) - MATCH (ss)<-[:sample_of_study_subject]-(samp) - WHERE (size($tissue_type) = 0 OR samp.tissue_type IN $tissue_type) - AND (size($composition) = 0 OR samp.composition IN $composition) - MATCH (ss)<-[*..2]-(parent)<--(f:file) - WHERE (size($file_type) = 0 OR f.file_type IN $file_type) - AND (size($association) = 0 OR head(labels(parent)) IN $association) - WITH DISTINCT ss, tp - RETURN {group: tp.endocrine_therapy_type, subjects: count(ss)} + subjectCountByErStatusFromLists(subject_ids: [String] = [], sample_ids: [String] = [], file_ids: [String] = [], file_names: [String] = []): [GroupCount] @cypher(statement: """ + MATCH (d:diagnosis) + OPTIONAL MATCH (d)-->(ss:study_subject)<--(samp:sample)<--(f:file) + WHERE (ss.study_subject_id IN $subject_ids) + OR (samp.sample_id IN $sample_ids) + OR (f.file_id IN $file_ids) + OR (f.file_name IN $file_names) + RETURN { + group: d.er_status, + subjects: COUNT(DISTINCT ss) + } """, passThrough: true) - filterSubjectCountByMenopauseStatus( - programs: [String] = [], - studies: [String] = [], - diagnoses: [String] = [], - rc_scores: [String] = [], - tumor_sizes: [String] = [], - chemo_regimen: [String] = [], - tumor_grades: [String] = [], - er_status: [String] = [], - pr_status: [String] = [], - endo_therapies: [String] = [], - meno_status: [String] = [], - tissue_type: [String] = [], - composition: [String] = [], - association: [String] = [], - file_type: [String] = [] - ): [GroupCount] @cypher(statement: """ - // Filtering subjects - MATCH (ss)<-[:sf_of_study_subject]-(sf) - WHERE (size($rc_scores) = 0 OR sf.grouped_recurrence_score IN $rc_scores) - MATCH (ss)<-[:diagnosis_of_study_subject]-(d)<-[:tp_of_diagnosis]-(tp) - WHERE (size($tumor_sizes) = 0 OR d.tumor_size_group IN $tumor_sizes) - AND (size($tumor_grades) = 0 OR d.tumor_grade IN $tumor_grades) - AND (size($er_status) = 0 OR d.er_status IN $er_status) - AND (size($pr_status) = 0 OR d.pr_status IN $pr_status) - AND (size($chemo_regimen) = 0 OR tp.chemotherapy_regimen IN $chemo_regimen) - AND (size($endo_therapies) = 0 OR tp.endocrine_therapy_type IN $endo_therapies) - MATCH (ss:study_subject)-[:study_subject_of_study]->(s)-[:study_of_program]->(p) - WHERE (size($programs) = 0 OR p.program_acronym IN $programs) - AND (size($studies) = 0 OR (s.study_acronym + ': ' + s.study_short_description) IN $studies) - AND (size($diagnoses) = 0 OR ss.disease_subtype IN $diagnoses) - MATCH (ss)<-[:demographic_of_study_subject]-(demo) - //WHERE (size($meno_status) = 0 OR demo.menopause_status IN $meno_status) - MATCH (ss)<-[:sample_of_study_subject]-(samp) - WHERE (size($tissue_type) = 0 OR samp.tissue_type IN $tissue_type) - AND (size($composition) = 0 OR samp.composition IN $composition) - MATCH (ss)<-[*..2]-(parent)<--(f:file) - WHERE (size($file_type) = 0 OR f.file_type IN $file_type) - AND (size($association) = 0 OR head(labels(parent)) IN $association) - WITH DISTINCT ss, demo - RETURN {group: demo.menopause_status, subjects: count(ss)} + subjectCountByPrStatusFromLists(subject_ids: [String] = [], sample_ids: [String] = [], file_ids: [String] = [], file_names: [String] = []): [GroupCount] @cypher(statement: """ + MATCH (d:diagnosis) + OPTIONAL MATCH (d)-->(ss:study_subject)<--(samp:sample)<--(f:file) + WHERE (ss.study_subject_id IN $subject_ids) + OR (samp.sample_id IN $sample_ids) + OR (f.file_id IN $file_ids) + OR (f.file_name IN $file_names) + RETURN { + group: d.pr_status, + subjects: COUNT(DISTINCT ss) + } """, passThrough: true) - filterSubjectCountByTissueType( - programs: [String] = [], - studies: [String] = [], - diagnoses: [String] = [], - rc_scores: [String] = [], - tumor_sizes: [String] = [], - chemo_regimen: [String] = [], - tumor_grades: [String] = [], - er_status: [String] = [], - pr_status: [String] = [], - endo_therapies: [String] = [], - meno_status: [String] = [], - tissue_type: [String] = [], - composition: [String] = [], - association: [String] = [], - file_type: [String] = [] - ): [GroupCount] @cypher(statement: """ - // Filtering subjects - MATCH (ss)<-[:sf_of_study_subject]-(sf) - WHERE (size($rc_scores) = 0 OR sf.grouped_recurrence_score IN $rc_scores) - MATCH (ss)<-[:diagnosis_of_study_subject]-(d)<-[:tp_of_diagnosis]-(tp) - WHERE (size($tumor_sizes) = 0 OR d.tumor_size_group IN $tumor_sizes) - AND (size($tumor_grades) = 0 OR d.tumor_grade IN $tumor_grades) - AND (size($er_status) = 0 OR d.er_status IN $er_status) - AND (size($pr_status) = 0 OR d.pr_status IN $pr_status) - AND (size($chemo_regimen) = 0 OR tp.chemotherapy_regimen IN $chemo_regimen) - AND (size($endo_therapies) = 0 OR tp.endocrine_therapy_type IN $endo_therapies) - MATCH (ss:study_subject)-[:study_subject_of_study]->(s)-[:study_of_program]->(p) - WHERE (size($programs) = 0 OR p.program_acronym IN $programs) - AND (size($studies) = 0 OR (s.study_acronym + ': ' + s.study_short_description) IN $studies) - AND (size($diagnoses) = 0 OR ss.disease_subtype IN $diagnoses) - MATCH (ss)<-[:demographic_of_study_subject]-(demo) - WHERE (size($meno_status) = 0 OR demo.menopause_status IN $meno_status) - MATCH (ss)<-[:sample_of_study_subject]-(samp) - WHERE //(size($tissue_type) = 0 OR samp.tissue_type IN $tissue_type) - (size($composition) = 0 OR samp.composition IN $composition) - MATCH (ss)<-[*..2]-(parent)<--(f:file) - WHERE (size($file_type) = 0 OR f.file_type IN $file_type) - AND (size($association) = 0 OR head(labels(parent)) IN $association) - WITH DISTINCT samp - RETURN {group: samp.tissue_type, subjects: count(samp)} + subjectCountByChemotherapyRegimenFromLists(subject_ids: [String] = [], sample_ids: [String] = [], file_ids: [String] = [], file_names: [String] = []): [GroupCount] @cypher(statement: """ + MATCH (tp:therapeutic_procedure) + OPTIONAL MATCH (tp)-->(d:diagnosis)-->(ss:study_subject)<--(samp:sample)<--(f:file) + WHERE (ss.study_subject_id IN $subject_ids) + OR (samp.sample_id IN $sample_ids) + OR (f.file_id IN $file_ids) + OR (f.file_name IN $file_names) + RETURN { + group: tp.chemotherapy_regimen, + subjects: COUNT(DISTINCT ss) + } """, passThrough: true) - filterSubjectCountByTissueComposition( - programs: [String] = [], - studies: [String] = [], - diagnoses: [String] = [], - rc_scores: [String] = [], - tumor_sizes: [String] = [], - chemo_regimen: [String] = [], - tumor_grades: [String] = [], - er_status: [String] = [], - pr_status: [String] = [], - endo_therapies: [String] = [], - meno_status: [String] = [], - tissue_type: [String] = [], - composition: [String] = [], - association: [String] = [], - file_type: [String] = [] - ): [GroupCount] @cypher(statement: """ - // Filtering subjects - MATCH (ss)<-[:sf_of_study_subject]-(sf) - WHERE (size($rc_scores) = 0 OR sf.grouped_recurrence_score IN $rc_scores) - MATCH (ss)<-[:diagnosis_of_study_subject]-(d)<-[:tp_of_diagnosis]-(tp) - WHERE (size($tumor_sizes) = 0 OR d.tumor_size_group IN $tumor_sizes) - AND (size($tumor_grades) = 0 OR d.tumor_grade IN $tumor_grades) - AND (size($er_status) = 0 OR d.er_status IN $er_status) - AND (size($pr_status) = 0 OR d.pr_status IN $pr_status) - AND (size($chemo_regimen) = 0 OR tp.chemotherapy_regimen IN $chemo_regimen) - AND (size($endo_therapies) = 0 OR tp.endocrine_therapy_type IN $endo_therapies) - MATCH (ss:study_subject)-[:study_subject_of_study]->(s)-[:study_of_program]->(p) - WHERE (size($programs) = 0 OR p.program_acronym IN $programs) - AND (size($studies) = 0 OR (s.study_acronym + ': ' + s.study_short_description) IN $studies) - AND (size($diagnoses) = 0 OR ss.disease_subtype IN $diagnoses) - MATCH (ss)<-[:demographic_of_study_subject]-(demo) - WHERE (size($meno_status) = 0 OR demo.menopause_status IN $meno_status) - MATCH (ss)<-[:sample_of_study_subject]-(samp) - WHERE (size($tissue_type) = 0 OR samp.tissue_type IN $tissue_type) - //AND (size($composition) = 0 OR samp.composition IN $composition) - MATCH (ss)<-[*..2]-(parent)<--(f:file) - WHERE (size($file_type) = 0 OR f.file_type IN $file_type) - AND (size($association) = 0 OR head(labels(parent)) IN $association) - WITH DISTINCT samp - RETURN {group: samp.composition, subjects: count(samp)} + subjectCountByEndocrineTherapyFromLists(subject_ids: [String] = [], sample_ids: [String] = [], file_ids: [String] = [], file_names: [String] = []): [GroupCount] @cypher(statement: """ + MATCH (tp:therapeutic_procedure) + OPTIONAL MATCH (tp)-->(d:diagnosis)-->(ss:study_subject)<--(samp:sample)<--(f:file) + WHERE (ss.study_subject_id IN $subject_ids) + OR (samp.sample_id IN $sample_ids) + OR (f.file_id IN $file_ids) + OR (f.file_name IN $file_names) + RETURN { + group: tp.endocrine_therapy_type, + subjects: COUNT(DISTINCT ss) + } """, passThrough: true) - filterSubjectCountByFileAssociation( - programs: [String] = [], - studies: [String] = [], - diagnoses: [String] = [], - rc_scores: [String] = [], - tumor_sizes: [String] = [], - chemo_regimen: [String] = [], - tumor_grades: [String] = [], - er_status: [String] = [], - pr_status: [String] = [], - endo_therapies: [String] = [], - meno_status: [String] = [], - tissue_type: [String] = [], - composition: [String] = [], - association: [String] = [], - file_type: [String] = [] - ): [GroupCount] @cypher(statement: """ - // Filtering subjects - MATCH (ss)<-[:sf_of_study_subject]-(sf) - WHERE (size($rc_scores) = 0 OR sf.grouped_recurrence_score IN $rc_scores) - MATCH (ss)<-[:diagnosis_of_study_subject]-(d)<-[:tp_of_diagnosis]-(tp) - WHERE (size($tumor_sizes) = 0 OR d.tumor_size_group IN $tumor_sizes) - AND (size($tumor_grades) = 0 OR d.tumor_grade IN $tumor_grades) - AND (size($er_status) = 0 OR d.er_status IN $er_status) - AND (size($pr_status) = 0 OR d.pr_status IN $pr_status) - AND (size($chemo_regimen) = 0 OR tp.chemotherapy_regimen IN $chemo_regimen) - AND (size($endo_therapies) = 0 OR tp.endocrine_therapy_type IN $endo_therapies) - MATCH (ss:study_subject)-[:study_subject_of_study]->(s)-[:study_of_program]->(p) - WHERE (size($programs) = 0 OR p.program_acronym IN $programs) - AND (size($studies) = 0 OR (s.study_acronym + ': ' + s.study_short_description) IN $studies) - AND (size($diagnoses) = 0 OR ss.disease_subtype IN $diagnoses) - MATCH (ss)<-[:demographic_of_study_subject]-(demo) - WHERE (size($meno_status) = 0 OR demo.menopause_status IN $meno_status) - MATCH (ss)<-[:sample_of_study_subject]-(samp) - WHERE (size($tissue_type) = 0 OR samp.tissue_type IN $tissue_type) - AND (size($composition) = 0 OR samp.composition IN $composition) - MATCH (ss)<-[*..2]-(parent)<--(f:file) - WHERE (size($file_type) = 0 OR f.file_type IN $file_type) - //AND (size($association) = 0 OR head(labels(parent)) IN $association) - WITH DISTINCT f, parent - RETURN {group: head(labels(parent)), subjects: count(f)} + subjectCountByMenopauseStatusFromLists(subject_ids: [String] = [], sample_ids: [String] = [], file_ids: [String] = [], file_names: [String] = []): [GroupCount] @cypher(statement: """ + MATCH (demo:demographic_data) + OPTIONAL MATCH (demo)-->(ss:study_subject)<--(samp:sample)<--(f:file) + WHERE (ss.study_subject_id IN $subject_ids) + OR (samp.sample_id IN $sample_ids) + OR (f.file_id IN $file_ids) + OR (f.file_name IN $file_names) + RETURN { + group: demo.menopause_status, + subjects: COUNT(DISTINCT ss) + } """, passThrough: true) - filterSubjectCountByFileType( - programs: [String] = [], - studies: [String] = [], - diagnoses: [String] = [], - rc_scores: [String] = [], - tumor_sizes: [String] = [], - chemo_regimen: [String] = [], - tumor_grades: [String] = [], - er_status: [String] = [], - pr_status: [String] = [], - endo_therapies: [String] = [], - meno_status: [String] = [], - tissue_type: [String] = [], - composition: [String] = [], - association: [String] = [], - file_type: [String] = [] - ): [GroupCount] @cypher(statement: """ - // Filtering subjects - MATCH (ss)<-[:sf_of_study_subject]-(sf) - WHERE (size($rc_scores) = 0 OR sf.grouped_recurrence_score IN $rc_scores) - MATCH (ss)<-[:diagnosis_of_study_subject]-(d)<-[:tp_of_diagnosis]-(tp) - WHERE (size($tumor_sizes) = 0 OR d.tumor_size_group IN $tumor_sizes) - AND (size($tumor_grades) = 0 OR d.tumor_grade IN $tumor_grades) - AND (size($er_status) = 0 OR d.er_status IN $er_status) - AND (size($pr_status) = 0 OR d.pr_status IN $pr_status) - AND (size($chemo_regimen) = 0 OR tp.chemotherapy_regimen IN $chemo_regimen) - AND (size($endo_therapies) = 0 OR tp.endocrine_therapy_type IN $endo_therapies) - MATCH (ss:study_subject)-[:study_subject_of_study]->(s)-[:study_of_program]->(p) - WHERE (size($programs) = 0 OR p.program_acronym IN $programs) - AND (size($studies) = 0 OR (s.study_acronym + ': ' + s.study_short_description) IN $studies) - AND (size($diagnoses) = 0 OR ss.disease_subtype IN $diagnoses) - MATCH (ss)<-[:demographic_of_study_subject]-(demo) - WHERE (size($meno_status) = 0 OR demo.menopause_status IN $meno_status) - MATCH (ss)<-[:sample_of_study_subject]-(samp) - WHERE (size($tissue_type) = 0 OR samp.tissue_type IN $tissue_type) - AND (size($composition) = 0 OR samp.composition IN $composition) - MATCH (ss)<-[*..2]-(parent)<--(f:file) - WHERE //(size($file_type) = 0 OR f.file_type IN $file_type) - (size($association) = 0 OR head(labels(parent)) IN $association) - WITH DISTINCT f - RETURN {group: f.file_type, subjects: count(f)} + subjectCountByTissueTypeFromLists(subject_ids: [String] = [], sample_ids: [String] = [], file_ids: [String] = [], file_names: [String] = []): [GroupCount] @cypher(statement: """ + MATCH (samp:sample) + WITH COLLECT(DISTINCT samp.tissue_type) AS tissue_type_list + UNWIND tissue_type_list AS tissue_types + OPTIONAL MATCH (f:file)-->(samp:sample)-->(ss:study_subject) + WHERE (tissue_types = samp.tissue_type) + AND ((ss.study_subject_id IN $subject_ids) + OR (samp.sample_id IN $sample_ids) + OR (f.file_id IN $file_ids) + OR (f.file_name IN $file_names)) + RETURN { + group: tissue_types, + subjects: COUNT(DISTINCT samp) + } """, passThrough: true) - subjectOverViewPaged(subject_ids: [String] = [""], order_by: String = ""): [SubjectOverview] @cypher(statement: """ - MATCH (ss:study_subject) - WHERE ($subject_ids IS NULL OR $subject_ids = [""] OR ss.study_subject_id IN $subject_ids) - OPTIONAL MATCH (ss)<-[:sample_of_study_subject]-(sp)<-[:file_of_sample]-(f)-[:file_of_laboratory_procedure]->(lp) - WITH - toInteger(split(ss.study_subject_id,'-')[2]) as subject_id_num, - collect(DISTINCT sp.sample_id) AS samples, - collect(DISTINCT lp.laboratory_procedure_id) AS lab_procedures, - collect(DISTINCT f {.*}) AS files, - ss - OPTIONAL MATCH (ss)-[:study_subject_of_study]->(s)-[:study_of_program]->(p) - OPTIONAL MATCH (ss)<-[:sf_of_study_subject]-(sf) - OPTIONAL MATCH (ss)<-[:diagnosis_of_study_subject]-(d) - OPTIONAL MATCH (d)<-[:tp_of_diagnosis]-(tp) - OPTIONAL MATCH (ss)<-[:demographic_of_study_subject]-(demo) + subjectCountByTissueCompositionFromLists(subject_ids: [String] = [], sample_ids: [String] = [], file_ids: [String] = [], file_names: [String] = []): [GroupCount] @cypher(statement: """ + MATCH (samp:sample) + WITH COLLECT(DISTINCT samp.composition) AS composition_list + UNWIND composition_list AS compositions + OPTIONAL MATCH (f:file)-->(samp:sample)-->(ss:study_subject) + WHERE (compositions = samp.composition) + AND ((ss.study_subject_id IN $subject_ids) + OR (samp.sample_id IN $sample_ids) + OR (f.file_id IN $file_ids) + OR (f.file_name IN $file_names)) RETURN { - program: p.program_acronym, - program_id: p.program_id, - study_acronym: s.study_acronym, - study_short_description: s.study_short_description, - study_info: s.study_acronym + ': ' + s.study_short_description, - subject_id: ss.study_subject_id, - diagnosis: ss.disease_subtype, - recurrence_score: sf.grouped_recurrence_score, - tumor_size: d.tumor_size_group, - tumor_grade: d.tumor_grade, - er_status: d.er_status, - pr_status: d.pr_status, - chemotherapy: tp.chemotherapy_regimen, - endocrine_therapy: tp.endocrine_therapy_type, - menopause_status: demo.menopause_status, - age_at_index: demo.age_at_index, - survival_time: demo.survival_time, - survival_time_unit: demo.survival_time_unit, - samples: samples, - files: files, - lab_procedures: lab_procedures + group: compositions, + subjects: COUNT(DISTINCT samp) } - ORDER BY CASE $order_by - WHEN 'subject_id' THEN subject_id_num - WHEN 'program' THEN p.program_acronym - WHEN 'program_id' THEN p.program_id - WHEN 'study_acronym' THEN s.study_acronym - WHEN 'study_short_description' THEN s.study_short_description - WHEN 'study_info' THEN s.study_acronym + ': ' + s.study_short_description - WHEN 'diagnosis' THEN ss.disease_subtype - WHEN 'recurrence_score' THEN sf.grouped_recurrence_score - WHEN 'tumor_size' THEN d.tumor_size_group - WHEN 'tumor_grade' THEN d.tumor_grade - WHEN 'er_status' THEN d.er_status - WHEN 'pr_status' THEN d.pr_status - WHEN 'chemotherapy' THEN tp.chemotherapy_regimen - WHEN 'endocrine_therapy' THEN tp.endocrine_therapy_type - WHEN 'menopause_status' THEN demo.menopause_status - WHEN 'age_at_index' THEN demo.age_at_index - WHEN 'survival_time' THEN demo.survival_time - ELSE subject_id_num END """, passThrough: true) - subjectOverViewPagedDesc(subject_ids: [String] = [""], order_by: String = ""): [SubjectOverview] @cypher(statement: """ - MATCH (ss:study_subject) - WHERE ($subject_ids IS NULL OR $subject_ids = [""] OR ss.study_subject_id IN $subject_ids) - OPTIONAL MATCH (ss)<-[:sample_of_study_subject]-(sp)<-[:file_of_sample]-(f)-[:file_of_laboratory_procedure]->(lp) - WITH - toInteger(split(ss.study_subject_id,'-')[2]) as subject_id_num, - collect(DISTINCT sp.sample_id) AS samples, - collect(DISTINCT lp.laboratory_procedure_id) AS lab_procedures, - collect(DISTINCT f {.*}) AS files, - ss - OPTIONAL MATCH (ss)-[:study_subject_of_study]->(s)-[:study_of_program]->(p) - OPTIONAL MATCH (ss)<-[:sf_of_study_subject]-(sf) - OPTIONAL MATCH (ss)<-[:diagnosis_of_study_subject]-(d) - OPTIONAL MATCH (d)<-[:tp_of_diagnosis]-(tp) - OPTIONAL MATCH (ss)<-[:demographic_of_study_subject]-(demo) + subjectCountByFileAssociationFromLists(subject_ids: [String] = [], sample_ids: [String] = [], file_ids: [String] = [], file_names: [String] = []): [GroupCount] @cypher(statement: """ + MATCH (f:file)-->(parent) + WHERE NOT (parent:laboratory_procedure) + WITH COLLECT(DISTINCT head(labels(parent))) AS parents_list + UNWIND parents_list AS parents + MATCH (f:file)-->(parent)-->(ss:study_subject) + WHERE (parents = head(labels(parent))) + AND ((ss.study_subject_id IN $subject_ids) + OR (parent.sample_id IN $sample_ids) + OR (f.file_id IN $file_ids) + OR (f.file_name IN $file_names)) RETURN { - program: p.program_acronym, - program_id: p.program_id, - study_acronym: s.study_acronym, - study_short_description: s.study_short_description, - study_info: s.study_acronym + ': ' + s.study_short_description, - subject_id: ss.study_subject_id, - diagnosis: ss.disease_subtype, - recurrence_score: sf.grouped_recurrence_score, - tumor_size: d.tumor_size_group, - tumor_grade: d.tumor_grade, - er_status: d.er_status, - pr_status: d.pr_status, - chemotherapy: tp.chemotherapy_regimen, - endocrine_therapy: tp.endocrine_therapy_type, - menopause_status: demo.menopause_status, - age_at_index: demo.age_at_index, - survival_time: demo.survival_time, - survival_time_unit: demo.survival_time_unit, - samples: samples, - files: files, - lab_procedures: lab_procedures + group: head(labels(parent)), + subjects: COUNT(DISTINCT f) } - ORDER BY CASE $order_by - WHEN 'subject_id' THEN subject_id_num - WHEN 'program' THEN p.program_acronym - WHEN 'program_id' THEN p.program_id - WHEN 'study_acronym' THEN s.study_acronym - WHEN 'study_short_description' THEN s.study_short_description - WHEN 'study_info' THEN s.study_acronym + ': ' + s.study_short_description - WHEN 'diagnosis' THEN ss.disease_subtype - WHEN 'recurrence_score' THEN sf.grouped_recurrence_score - WHEN 'tumor_size' THEN d.tumor_size_group - WHEN 'tumor_grade' THEN d.tumor_grade - WHEN 'er_status' THEN d.er_status - WHEN 'pr_status' THEN d.pr_status - WHEN 'chemotherapy' THEN tp.chemotherapy_regimen - WHEN 'endocrine_therapy' THEN tp.endocrine_therapy_type - WHEN 'menopause_status' THEN demo.menopause_status - WHEN 'age_at_index' THEN demo.age_at_index - WHEN 'survival_time' THEN demo.survival_time - ELSE subject_id_num END DESC """, passThrough: true) - subjectOverView: [SubjectOverview] @cypher(statement: """ - MATCH (ss:study_subject) - OPTIONAL MATCH (ss)<-[:sample_of_study_subject]-(sp)<-[:file_of_sample]-(f)-[:file_of_laboratory_procedure]->(lp) - WITH ss, collect(DISTINCT sp.sample_id) AS samples, collect(DISTINCT lp.laboratory_procedure_id) AS lab_procedures, collect(DISTINCT f {.*}) AS files - OPTIONAL MATCH (ss)-[:study_subject_of_study]->(s)-[:study_of_program]->(p) - OPTIONAL MATCH (ss)<-[:sf_of_study_subject]-(sf) - OPTIONAL MATCH (ss)<-[:diagnosis_of_study_subject]-(d) - OPTIONAL MATCH (d)<-[:tp_of_diagnosis]-(tp) - OPTIONAL MATCH (ss)<-[:demographic_of_study_subject]-(demo) + subjectCountByFileTypeFromLists(subject_ids: [String] = [], sample_ids: [String] = [], file_ids: [String] = [], file_names: [String] = []): [GroupCount] @cypher(statement: """ + MATCH (f:file)-->(parent) + WHERE NOT (parent:laboratory_procedure) + WITH COLLECT(DISTINCT f.file_type) AS file_type_list + UNWIND file_type_list AS file_types + OPTIONAL MATCH (f:file)-->(samp:sample)-->(ss:study_subject) + WHERE (file_types = f.file_type) + AND ((ss.study_subject_id IN $subject_ids) + OR (samp.sample_id IN $sample_ids) + OR (f.file_id IN $file_ids) + OR (f.file_name IN $file_names)) RETURN { - program: p.program_acronym, - program_id: p.program_id, - study_acronym: s.study_acronym, - study_short_description: s.study_short_description, - study_info: s.study_acronym + ': ' + s.study_short_description, - subject_id: ss.study_subject_id, - diagnosis: ss.disease_subtype, - recurrence_score: sf.grouped_recurrence_score, - tumor_size: d.tumor_size_group, - tumor_grade: d.tumor_grade, - er_status: d.er_status, - pr_status: d.pr_status, - chemotherapy: tp.chemotherapy_regimen, - endocrine_therapy: tp.endocrine_therapy_type, - menopause_status: demo.menopause_status, - age_at_index: demo.age_at_index, - survival_time: demo.survival_time, - survival_time_unit: demo.survival_time_unit, - samples: samples, - files: files, - lab_procedures: lab_procedures + group: file_types, + subjects: COUNT(DISTINCT f) } """, passThrough: true) - searchSubjects2 ( - programs: [String] = [], - studies: [String] = [], - diagnoses: [String] = [], - rc_scores: [String] = [], - tumor_sizes: [String] = [], - chemo_regimen: [String] = [], - tumor_grades: [String] = [], - er_status: [String] = [], - pr_status: [String] = [], - endo_therapies: [String] = [], - meno_status: [String] = [], - tissue_type: [String] = [], - composition: [String] = [], - association: [String] = [], - file_type: [String] = [] - ): [String] @cypher(statement: """ - // Filtering subjects - MATCH (ss)<-[:sf_of_study_subject]-(sf) - WHERE (size($rc_scores) = 0 OR sf.grouped_recurrence_score IN $rc_scores) - MATCH (ss)<-[:diagnosis_of_study_subject]-(d)<-[:tp_of_diagnosis]-(tp) - WHERE (size($tumor_sizes) = 0 OR d.tumor_size_group IN $tumor_sizes) - AND (size($tumor_grades) = 0 OR d.tumor_grade IN $tumor_grades) - AND (size($er_status) = 0 OR d.er_status IN $er_status) - AND (size($pr_status) = 0 OR d.pr_status IN $pr_status) - AND (size($chemo_regimen) = 0 OR tp.chemotherapy_regimen IN $chemo_regimen) - AND (size($endo_therapies) = 0 OR tp.endocrine_therapy_type IN $endo_therapies) - MATCH (ss:study_subject)-[:study_subject_of_study]->(s)-[:study_of_program]->(p) - WHERE (size($programs) = 0 OR p.program_acronym IN $programs) - AND (size($studies) = 0 OR (s.study_acronym + ': ' + s.study_short_description) IN $studies) - AND (size($diagnoses) = 0 OR ss.disease_subtype IN $diagnoses) - MATCH (ss)<-[:demographic_of_study_subject]-(demo) - WHERE (size($meno_status) = 0 OR demo.menopause_status IN $meno_status) - MATCH (ss)<-[:sample_of_study_subject]-(samp) - WHERE (size($tissue_type) = 0 OR samp.tissue_type IN $tissue_type) - AND (size($composition) = 0 OR samp.composition IN $composition) - MATCH (ss)<-[*..2]-(parent)<--(f:file) - WHERE (size($file_type) = 0 OR f.file_type IN $file_type) - AND (size($association) = 0 OR head(labels(parent)) IN $association) - RETURN DISTINCT ss.study_subject_id - """) - - searchSubjects ( - programs: [String] = [], - studies: [String] = [], - diagnoses: [String] = [], - rc_scores: [String] = [], - tumor_sizes: [String] = [], - chemo_regimen: [String] = [], - tumor_grades: [String] = [], - er_status: [String] = [], - pr_status: [String] = [], - endo_therapies: [String] = [], - meno_status: [String] = [], - tissue_type: [String] = [], - composition: [String] = [], - association: [String] = [], - file_type: [String] = [], - first: Int = 100 - ): SearchResult @cypher(statement: """ - // Filtering subjects - MATCH (ss)<-[:sf_of_study_subject]-(sf) - WHERE (size($rc_scores) = 0 OR sf.grouped_recurrence_score IN $rc_scores) - MATCH (ss)<-[:diagnosis_of_study_subject]-(d)<-[:tp_of_diagnosis]-(tp) - WHERE (size($tumor_sizes) = 0 OR d.tumor_size_group IN $tumor_sizes) - AND (size($tumor_grades) = 0 OR d.tumor_grade IN $tumor_grades) - AND (size($er_status) = 0 OR d.er_status IN $er_status) - AND (size($pr_status) = 0 OR d.pr_status IN $pr_status) - AND (size($chemo_regimen) = 0 OR tp.chemotherapy_regimen IN $chemo_regimen) - AND (size($endo_therapies) = 0 OR tp.endocrine_therapy_type IN $endo_therapies) - MATCH (ss:study_subject)-[:study_subject_of_study]->(s)-[:study_of_program]->(p) - WHERE (size($programs) = 0 OR p.program_acronym IN $programs) - AND (size($studies) = 0 OR (s.study_acronym + ': ' + s.study_short_description) IN $studies) - AND (size($diagnoses) = 0 OR ss.disease_subtype IN $diagnoses) - MATCH (ss)<-[:demographic_of_study_subject]-(demo) - WHERE (size($meno_status) = 0 OR demo.menopause_status IN $meno_status) - MATCH (ss)<-[:sample_of_study_subject]-(samp) - WHERE (size($tissue_type) = 0 OR samp.tissue_type IN $tissue_type) - AND (size($composition) = 0 OR samp.composition IN $composition) - MATCH (ss)<-[*..2]-(parent)<--(f:file) - WHERE (size($file_type) = 0 OR f.file_type IN $file_type) - AND (size($association) = 0 OR head(labels(parent)) IN $association) - - // Preparing return values - OPTIONAL MATCH (f)-[:file_of_laboratory_procedure]->(lp) - WITH DISTINCT ss AS ss, samp, lp, f, COLLECT(DISTINCT lp.laboratory_procedure_id) as lab_procedures - OPTIONAL MATCH (ss)-[:study_subject_of_study]->(s)-[:study_of_program]->(p) - OPTIONAL MATCH (ss)<-[:sf_of_study_subject]-(sf) - OPTIONAL MATCH (ss)<-[:diagnosis_of_study_subject]-(d) - OPTIONAL MATCH (d)<-[:tp_of_diagnosis]-(tp) - OPTIONAL MATCH (ss)<-[:demographic_of_study_subject]-(demo) + nodeCountsFromLists (subject_ids: [String] = [], sample_ids: [String] = [], file_ids: [String] = [], file_names: [String] = []): NodeCounts @cypher(statement: """ + OPTIONAL MATCH (p:program)<--(s:study)<--(ss:study_subject)<--(samp:sample)<--(f:file)-->(lp:laboratory_procedure) + WHERE (ss.study_subject_id IN $subject_ids) + OR (samp.sample_id IN $sample_ids) + OR (f.file_id IN $file_ids) + OR (f.file_name IN $file_names) RETURN { - subjectIds: COLLECT(DISTINCT ss.study_subject_id), - sampleIds: COLLECT(DISTINCT samp.sample_id), - fileIds: COLLECT(DISTINCT f.file_id), - numberOfPrograms: COUNT(DISTINCT p.program_acronym), - numberOfStudies: COUNT(DISTINCT s.study_acronym), - numberOfSubjects: COUNT(DISTINCT ss.study_subject_id), - numberOfLabProcedures: COUNT(DISTINCT lp.laboratory_procedure_id), - numberOfSamples: COUNT(DISTINCT samp.sample_id), - numberOfFiles: COUNT(DISTINCT f), - firstPage: COLLECT( DISTINCT({ - subject_id: ss.study_subject_id, - program: p.program_acronym, - program_id: p.program_id, - study_acronym: s.study_acronym, - diagnosis: ss.disease_subtype, - recurrence_score: sf.grouped_recurrence_score, - tumor_size: d.tumor_size_group, - tumor_grade: d.tumor_grade, - er_status: d.er_status, - pr_status: d.pr_status, - age_at_index: demo.age_at_index, - survival_time: demo.survival_time, - survival_time_unit: demo.survival_time_unit - }))[0..$first] + numberOfPrograms: COUNT(DISTINCT p), + numberOfStudies: COUNT(DISTINCT s), + numberOfSubjects: COUNT(DISTINCT ss), + numberOfLabProcedures: COUNT(DISTINCT lp), + numberOfSamples: COUNT(DISTINCT samp), + numberOfFiles: COUNT(DISTINCT f) } """, passThrough:true) + armsByProgramsFromLists(subject_ids: [String] = [], sample_ids: [String] = [], file_ids: [String] = [], file_names: [String] = []): [ProgramArms] @cypher(statement: """ + MATCH (p:program) + OPTIONAL MATCH (p)<--(s:study)<--(ss:study_subject)<--(samp:sample)<--(f:file) + WHERE (ss.study_subject_id IN $subject_ids) + OR (samp.sample_id IN $sample_ids) + OR (f.file_id IN $file_ids) + OR (f.file_name IN $file_names) + WITH COUNT(DISTINCT ss) as caseSize + MATCH (p:program)<--(s:study) + OPTIONAL MATCH (s)<--(ss:study_subject)<--(samp:sample)<--(f:file) + WHERE (ss.study_subject_id IN $subject_ids) + OR (samp.sample_id IN $sample_ids) + OR (f.file_id IN $file_ids) + OR (f.file_name IN $file_names) + WITH p, caseSize, {arm: s.study_acronym, caseSize: COUNT(DISTINCT ss), size: COUNT(DISTINCT ss)} AS studies + RETURN { + program: p.program_acronym, + caseSize: caseSize, + children: COLLECT(studies) + } + """, passThrough: true) + + findIdsFromLists(subject_ids: [String] = [], sample_ids: [String] = [], file_ids: [String] = [], file_names: [String] = []): IdsLists @cypher(statement: """ + OPTIONAL MATCH (ss:study_subject)<--(samp:sample)<--(f:file) + WHERE (ss.study_subject_id IN $subject_ids) + OR (samp.sample_id IN $sample_ids) + OR (f.file_id IN $file_ids) + OR (f.file_name IN $file_names) + WITH + COLLECT(DISTINCT ss.study_subject_id) AS subject_ids, + COLLECT(DISTINCT samp.sample_id) AS sample_ids, + COLLECT(DISTINCT f.file_id) AS file_ids, + COLLECT(DISTINCT f.file_name) AS file_names + RETURN{ + subjectIds: subject_ids, + sampleIds: sample_ids, + fileIds: file_ids, + fileNames: file_names + } + """, passThrough: true) subjectsInList(subject_ids: [String]=[]): [SubjectInfo] @cypher(statement: """ MATCH (ss:study_subject) @@ -2181,241 +1351,6 @@ type QueryType { samplesForSubjectId(subject_id: String!): [sample] @cypher(statement: "MATCH (ss:study_subject {study_subject_id: $subject_id})<-[*]-(s:sample) RETURN s") - filesInList(file_ids: [String], order_by: String = ""): [FileDetail] @cypher(statement: """ - MATCH (f:file) - WHERE f.file_id in $file_ids - OPTIONAL MATCH (f)-->(parent) - WHERE NOT (parent:laboratory_procedure) - OPTIONAL MATCH (f)-[*]->(ss:study_subject)-->(s:study) - WITH - toInteger(split(f.file_id,'-')[2]) AS file_id_num, - toInteger(split(ss.study_subject_id,'-')[2]) AS subject_id_num, - head(labels(parent)) AS association, - f, parent, ss, s - RETURN { - file_name: f.file_name, - file_id: f.file_id, - file_type: f.file_type, - association: association, - file_description: f.file_description, - file_format: f.file_format, - file_size: f.file_size, - md5sum: f.md5sum, - subject_id: ss.study_subject_id, - study_code: s.study_acronym - } - ORDER BY CASE $order_by - WHEN 'file_id' THEN f.file_id - WHEN 'file_name' THEN f.file_name - WHEN 'file_type' THEN f.file_type - WHEN 'association' THEN association - WHEN 'file_description' THEN f.file_description - WHEN 'file_format' THEN f.file_format - WHEN 'file_size' THEN f.file_size - WHEN 'md5sum' THEN f.md5sum - WHEN 'subject_id' THEN subject_id_num - WHEN 'study_code' THEN s.study_acronym - ELSE file_id_num END - """, passThrough: true) - - filesInListDesc(file_ids: [String], order_by: String = ""): [FileDetail] @cypher(statement: """ - MATCH (f:file) - WHERE f.file_id in $file_ids - OPTIONAL MATCH (f)-->(parent) - WHERE NOT (parent:laboratory_procedure) - OPTIONAL MATCH (f)-[*]->(ss:study_subject)-->(s:study) - WITH - toInteger(split(f.file_id,'-')[2]) AS file_id_num, - toInteger(split(ss.study_subject_id,'-')[2]) AS subject_id_num, - head(labels(parent)) AS association, - f, parent, ss, s - RETURN { - file_name: f.file_name, - file_id: f.file_id, - file_type: f.file_type, - association: association, - file_description: f.file_description, - file_format: f.file_format, - file_size: f.file_size, - md5sum: f.md5sum, - subject_id: ss.study_subject_id, - study_code: s.study_acronym - } - ORDER BY CASE $order_by - WHEN 'file_id' THEN f.file_id - WHEN 'file_name' THEN f.file_name - WHEN 'file_type' THEN f.file_type - WHEN 'association' THEN association - WHEN 'file_description' THEN f.file_description - WHEN 'file_format' THEN f.file_format - WHEN 'file_size' THEN f.file_size - WHEN 'md5sum' THEN f.md5sum - WHEN 'subject_id' THEN subject_id_num - WHEN 'study_code' THEN s.study_acronym - ELSE file_id_num END DESC - """, passThrough: true) - - sampleOverview(subject_ids: [String] = [""], sample_ids: [String] = [""], order_by: String = ""): [SampleOverview] @cypher(statement: """ - MATCH (samp:sample) - WHERE ($sample_ids IS NULL OR $sample_ids = [""] OR samp.sample_id IN $sample_ids) - OPTIONAL MATCH (samp)-[:sample_of_study_subject]->(ss)-[:study_subject_of_study]->(s)-[:study_of_program]->(p) - OPTIONAL MATCH (samp)<-[:file_of_sample]-(f)-[:file_of_laboratory_procedure]->(lp) - WITH - distinct lp, - toInteger(split(ss.study_subject_id,'-')[2]) AS subject_id_num, - collect(distinct f.file_id) AS files, - samp, ss, s, p - WHERE ($subject_ids IS NULL OR $subject_ids = [""] OR ss.study_subject_id IN $subject_ids) - RETURN { - sample_id: samp.sample_id, - subject_id: ss.study_subject_id, - program: p.program_acronym, - arm: s.study_acronym, - diagnosis: ss.disease_subtype, - tissue_type: samp.tissue_type, - tissue_composition: samp.composition, - sample_anatomic_site: samp.sample_anatomic_site, - sample_procurement_method: samp.method_of_sample_procurement, - platform: lp.test_name, - files: files, - program_id: p.program_id - } - ORDER BY CASE $order_by - WHEN 'subject_id' THEN subject_id_num - WHEN 'sample_id' THEN samp.sample_id - WHEN 'program' THEN p.program_acronym - WHEN 'arm' THEN s.study_acronym - WHEN 'diagnosis' THEN ss.disease_subtype - WHEN 'tissue_type' THEN samp.tissue_type - WHEN 'tissue_composition' THEN samp.composition - WHEN 'sample_anatomic_site' THEN samp.sample_anatomic_site - WHEN 'sample_procurement_method' THEN samp.method_of_sample_procurement - WHEN 'platform' THEN lp.test_name - ELSE subject_id_num END - """, passThrough: true) - - sampleOverviewDesc(subject_ids: [String] = [""], sample_ids: [String] = [""], order_by: String = ""): [SampleOverview] @cypher(statement: """ - MATCH (samp:sample) - WHERE ($sample_ids IS NULL OR $sample_ids = [""] OR samp.sample_id IN $sample_ids) - OPTIONAL MATCH (samp)-[:sample_of_study_subject]->(ss)-[:study_subject_of_study]->(s)-[:study_of_program]->(p) - OPTIONAL MATCH (samp)<-[:file_of_sample]-(f)-[:file_of_laboratory_procedure]->(lp) - WITH - distinct lp, - toInteger(split(ss.study_subject_id,'-')[2]) AS subject_id_num, - collect(distinct f.file_id) AS files, - samp, ss, s, p - WHERE ($subject_ids IS NULL OR $subject_ids = [""] OR ss.study_subject_id IN $subject_ids) - RETURN { - sample_id: samp.sample_id, - subject_id: ss.study_subject_id, - program: p.program_acronym, - arm: s.study_acronym, - diagnosis: ss.disease_subtype, - tissue_type: samp.tissue_type, - tissue_composition: samp.composition, - sample_anatomic_site: samp.sample_anatomic_site, - sample_procurement_method: samp.method_of_sample_procurement, - platform: lp.test_name, - files: files, - program_id: p.program_id - } - ORDER BY CASE $order_by - WHEN 'subject_id' THEN subject_id_num - WHEN 'sample_id' THEN samp.sample_id - WHEN 'program' THEN p.program_acronym - WHEN 'arm' THEN s.study_acronym - WHEN 'diagnosis' THEN ss.disease_subtype - WHEN 'tissue_type' THEN samp.tissue_type - WHEN 'tissue_composition' THEN samp.composition - WHEN 'sample_anatomic_site' THEN samp.sample_anatomic_site - WHEN 'sample_procurement_method' THEN samp.method_of_sample_procurement - WHEN 'platform' THEN lp.test_name - ELSE subject_id_num END DESC - """, passThrough: true) - - - fileOverview(subject_ids: [String] = [""], file_ids: [String] = [""], order_by: String = ""): [FileOverview] @cypher(statement: """ - MATCH (f:file) - WHERE ($file_ids IS NULL OR $file_ids = [""] OR f.file_id IN $file_ids) - MATCH (f)-->(parent) - WHERE NOT (parent:laboratory_procedure) - OPTIONAL MATCH (f)-[:file_of_sample]->(samp)-[:sample_of_study_subject]->(ss)-[:study_subject_of_study]->(s)-[:study_of_program]->(p) - OPTIONAL MATCH (f)-[:file_of_study]->(s1)-[:study_of_program]-(p1) - WITH - ss.study_subject_id AS subject_id, toInteger(split(ss.study_subject_id,'-')[2]) as subject_id_num, - f, ss, p, CASE p WHEN null THEN p1.program_acronym ELSE p.program_acronym END AS program, parent, - CASE s WHEN null THEN s1.study_acronym ELSE s.study_acronym END AS arm, head(labels(parent)) AS association, samp, s1, p1 - WHERE ($subject_ids IS NULL OR $subject_ids = [""] OR subject_id IN $subject_ids) - RETURN { - file_id: f.file_id, - file_name: f.file_name, - association: association, - file_description: f.file_description, - file_format: f.file_format, - file_size: f.file_size, - program: program, - arm: arm, - subject_id: ss.study_subject_id, - sample_id: samp.sample_id, - diagnosis: ss.disease_subtype, - program_id: p.program_id - } - ORDER BY CASE $order_by - WHEN 'subject_id' THEN subject_id_num - WHEN 'file_id' THEN f.file_id - WHEN 'file_name' THEN f.file_name - WHEN 'association' THEN association - WHEN 'file_description' THEN f.file_description - WHEN 'file_format' THEN f.file_format - WHEN 'file_size' THEN f.file_size - WHEN 'program' THEN program - WHEN 'arm' THEN arm - WHEN 'sample_id' THEN samp.sample_id - WHEN 'diagnosis' THEN ss.disease_subtype - ELSE f.file_name END - """, passThrough: true) - - fileOverviewDesc(subject_ids: [String] = [""], file_ids: [String] = [""], order_by: String = ""): [FileOverview] @cypher(statement: """ - MATCH (f:file) - WHERE ($file_ids IS NULL OR $file_ids = [""] OR f.file_id IN $file_ids) - MATCH (f)-->(parent) - WHERE NOT (parent:laboratory_procedure) - OPTIONAL MATCH (f)-[:file_of_sample]->(samp)-[:sample_of_study_subject]->(ss)-[:study_subject_of_study]->(s)-[:study_of_program]->(p) - OPTIONAL MATCH (f)-[:file_of_study]->(s1)-[:study_of_program]-(p1) - WITH - ss.study_subject_id AS subject_id, toInteger(split(ss.study_subject_id,'-')[2]) as subject_id_num, - f, ss, p, CASE p WHEN null THEN p1.program_acronym ELSE p.program_acronym END AS program, parent, - CASE s WHEN null THEN s1.study_acronym ELSE s.study_acronym END AS arm, head(labels(parent)) AS association, samp, s1, p1 - WHERE ($subject_ids IS NULL OR $subject_ids = [""] OR subject_id IN $subject_ids) - RETURN { - file_id: f.file_id, - file_name: f.file_name, - association: association, - file_description: f.file_description, - file_format: f.file_format, - file_size: f.file_size, - program: program, - arm: arm, - subject_id: ss.study_subject_id, - sample_id: samp.sample_id, - diagnosis: ss.disease_subtype, - program_id: p.program_id - } - ORDER BY CASE $order_by - WHEN 'subject_id' THEN subject_id_num - WHEN 'file_id' THEN f.file_id - WHEN 'file_name' THEN f.file_name - WHEN 'association' THEN association - WHEN 'file_description' THEN f.file_description - WHEN 'file_format' THEN f.file_format - WHEN 'file_size' THEN f.file_size - WHEN 'program' THEN program - WHEN 'arm' THEN arm - WHEN 'sample_id' THEN samp.sample_id - WHEN 'diagnosis' THEN ss.disease_subtype - ELSE f.file_name END DESC - """, passThrough: true) - fileIdsFromFileName(file_name: [String], order_by: String ="file_name"): [FileOverview] @cypher(statement: """ MATCH (f:file) WHERE ($file_name IS NULL OR f.file_name IN $file_name) diff --git a/package-lock.json b/package-lock.json index 1413cb14d..d1c7bc149 100644 --- a/package-lock.json +++ b/package-lock.json @@ -5,7 +5,6 @@ "requires": true, "packages": { "": { - "name": "bento-frontend", "version": "0.1.0", "dependencies": { "@apollo/client": "^3.3.4", @@ -14,6 +13,7 @@ "@jbrowse/react-linear-genome-view": "^1.3.0", "@material-ui/core": "^4.10.0", "@material-ui/icons": "^4.9.1", + "@material-ui/lab": "*", "@svgr/webpack": "4.1.0", "axios": "^0.21.1", "babel-core": "7.0.0-bridge.0", @@ -22,7 +22,7 @@ "babel-loader": "8.0.5", "babel-plugin-named-asset-import": "^0.3.4", "babel-preset-react-app": "^7.0.1", - "bento-components": "^0.1.77", + "bento-components": "^0.1.96", "bfj": "6.1.1", "case-sensitive-paths-webpack-plugin": "2.2.0", "classnames": "^2.2.6", @@ -56,6 +56,7 @@ "postcss-loader": "3.0.0", "postcss-preset-env": "6.5.0", "postcss-safe-parser": "4.0.1", + "prop-types": "^15.7.2", "query-string": "^6.8.3", "react": "^16.8.2", "react-apollo": "^3.1.5", @@ -76,6 +77,7 @@ "recharts": "^1.7.1", "recompose": "^0.30.0", "redux": "^4.0.4", + "redux-devtools-extension": "^2.13.9", "redux-logger": "^3.0.6", "redux-thunk": "^2.3.0", "resolve": "1.10.0", @@ -104,6 +106,25 @@ "npm": "~7.7.6" } }, + "node_modules/@angular/core": { + "version": "11.2.14", + "resolved": "https://registry.npmjs.org/@angular/core/-/core-11.2.14.tgz", + "integrity": "sha512-vpR4XqBGitk1Faph37CSpemwIYTmJ3pdIVNoHKP6jLonpWu+0azkchf0f7oD8/2ivj2F81opcIw0tcsy/D/5Vg==", + "peer": true, + "dependencies": { + "tslib": "^2.0.0" + }, + "peerDependencies": { + "rxjs": "^6.5.3", + "zone.js": "^0.10.2 || ^0.11.3" + } + }, + "node_modules/@angular/core/node_modules/tslib": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz", + "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==", + "peer": true + }, "node_modules/@apollo/client": { "version": "3.3.13", "resolved": "https://registry.npmjs.org/@apollo/client/-/client-3.3.13.tgz", @@ -1321,11 +1342,14 @@ } }, "node_modules/@babel/runtime": { - "version": "7.13.10", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.13.10.tgz", - "integrity": "sha512-4QPkjJq6Ns3V/RgpEahRk+AGfL0eO6RHHtTWoNNr5mO49G6B5+X6d6THgWEAvTrznU5xYpbAlVKRYcsCgh/Akw==", + "version": "7.16.3", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.16.3.tgz", + "integrity": "sha512-WBwekcqacdY2e9AF/Q7WLFUWmdJGJTkbjqTjoMDgXkVZ3ZRUvOPsLb5KdwISoQVsbP+DQzVZW4Zhci0DvpbNTQ==", "dependencies": { "regenerator-runtime": "^0.13.4" + }, + "engines": { + "node": ">=6.9.0" } }, "node_modules/@babel/runtime-corejs2": { @@ -1417,6 +1441,34 @@ "resolved": "https://registry.npmjs.org/@csstools/normalize.css/-/normalize.css-10.1.0.tgz", "integrity": "sha512-ij4wRiunFfaJxjB0BdrYHIH8FxBJpOwNPhhAcunlmPdXudL1WQV1qoP9un6JsEBAgQH+7UXyyjh0g7jTxXK6tg==" }, + "node_modules/@devexpress/utils": { + "version": "1.3.13", + "resolved": "https://registry.npmjs.org/@devexpress/utils/-/utils-1.3.13.tgz", + "integrity": "sha512-DaTNDLcyepRegwKCWrikP+6WH0cY6/gVSLC/wd6o6AhuTpn6jrXEYcJm50+DwUSwAPVyoQcp6iYRTD1BdITrBQ==", + "dependencies": { + "tslib": "2.0.1" + } + }, + "node_modules/@devexpress/utils/node_modules/tslib": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.0.1.tgz", + "integrity": "sha512-SgIkNheinmEBgx1IUNirK0TUD4X9yjjBRTqqjggWCU3pUEqIk3/Uwl3yRixYKT6WjQuGiwDv4NomL3wqRCj+CQ==" + }, + "node_modules/@devextreme/runtime": { + "version": "2.3.13", + "resolved": "https://registry.npmjs.org/@devextreme/runtime/-/runtime-2.3.13.tgz", + "integrity": "sha512-J6c4ZbbIP8YSXC5UHaKQKNVNAmswS4cdagr4aOhh1qQMgYDv1mSq3SU6Djo6QiDnHXM86zfaOXaVjX6tWDl6Ig==", + "dependencies": { + "inferno": "^7.4.6", + "inferno-compat": "^7.4.6", + "inferno-create-element": "^7.4.6", + "inferno-hydrate": "^7.4.6" + }, + "peerDependencies": { + "@angular/core": "^11.0.4", + "vue": "^2.6.14" + } + }, "node_modules/@emotion/cache": { "version": "10.0.29", "resolved": "https://registry.npmjs.org/@emotion/cache/-/cache-10.0.29.tgz", @@ -1491,6 +1543,51 @@ "resolved": "https://registry.npmjs.org/@emotion/sheet/-/sheet-0.9.4.tgz", "integrity": "sha512-zM9PFmgVSqBw4zL101Q0HrBVTGmpAxFZH/pYx/cjJT5advXguvcgjHFTCaIO3enL/xr89vK2bh0Mfyj9aa0ANA==" }, + "node_modules/@emotion/styled": { + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/@emotion/styled/-/styled-10.3.0.tgz", + "integrity": "sha512-GgcUpXBBEU5ido+/p/mCT2/Xx+Oqmp9JzQRuC+a4lYM4i4LBBn/dWvc0rQ19N9ObA8/T4NWMrPNe79kMBDJqoQ==", + "peer": true, + "dependencies": { + "@emotion/styled-base": "^10.3.0", + "babel-plugin-emotion": "^10.0.27" + }, + "peerDependencies": { + "@emotion/core": "^10.0.27", + "react": ">=16.3.0" + } + }, + "node_modules/@emotion/styled-base": { + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/@emotion/styled-base/-/styled-base-10.3.0.tgz", + "integrity": "sha512-PBRqsVKR7QRNkmfH78hTSSwHWcwDpecH9W6heujWAcyp2wdz/64PP73s7fWS1dIPm8/Exc8JAzYS8dEWXjv60w==", + "peer": true, + "dependencies": { + "@babel/runtime": "^7.5.5", + "@emotion/is-prop-valid": "0.8.8", + "@emotion/serialize": "^0.11.15", + "@emotion/utils": "0.11.3" + }, + "peerDependencies": { + "@emotion/core": "^10.0.28", + "react": ">=16.3.0" + } + }, + "node_modules/@emotion/styled-base/node_modules/@emotion/is-prop-valid": { + "version": "0.8.8", + "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-0.8.8.tgz", + "integrity": "sha512-u5WtneEAr5IDG2Wv65yhunPSMLIpuKsbuOktRojfrEiEvRyC85LgPMZI63cr7NUqT8ZIGdSVg8ZKGxIug4lXcA==", + "peer": true, + "dependencies": { + "@emotion/memoize": "0.7.4" + } + }, + "node_modules/@emotion/styled-base/node_modules/@emotion/memoize": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.7.4.tgz", + "integrity": "sha512-Ja/Vfqe3HpuzRsG1oBtWTHk2PGZ7GR+2Vz5iYGelAw8dx32K0y7PjVuxK6z1nMpZOqAFsRUPCkK1YjJ56qJlgw==", + "peer": true + }, "node_modules/@emotion/stylis": { "version": "0.8.5", "resolved": "https://registry.npmjs.org/@emotion/stylis/-/stylis-0.8.5.tgz", @@ -5335,14 +5432,14 @@ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" }, "node_modules/@material-ui/core": { - "version": "4.11.3", - "resolved": "https://registry.npmjs.org/@material-ui/core/-/core-4.11.3.tgz", - "integrity": "sha512-Adt40rGW6Uds+cAyk3pVgcErpzU/qxc7KBR94jFHBYretU4AtWZltYcNsbeMn9tXL86jjVL1kuGcIHsgLgFGRw==", + "version": "4.12.2", + "resolved": "https://registry.npmjs.org/@material-ui/core/-/core-4.12.2.tgz", + "integrity": "sha512-Q1npB8V73IC+eV2X6as+g71MpEGQwqKHUI2iujY62npk35V8nMx/bUXAHjv5kKG1BZ8s8XUWoG6s/VkjYPjjQA==", "dependencies": { "@babel/runtime": "^7.4.4", - "@material-ui/styles": "^4.11.3", - "@material-ui/system": "^4.11.3", - "@material-ui/types": "^5.1.0", + "@material-ui/styles": "^4.11.4", + "@material-ui/system": "^4.12.1", + "@material-ui/types": "5.1.0", "@material-ui/utils": "^4.11.2", "@types/react-transition-group": "^4.2.0", "clsx": "^1.0.4", @@ -5354,6 +5451,20 @@ }, "engines": { "node": ">=8.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/material-ui" + }, + "peerDependencies": { + "@types/react": "^16.8.6 || ^17.0.0", + "react": "^16.8.0 || ^17.0.0", + "react-dom": "^16.8.0 || ^17.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } } }, "node_modules/@material-ui/data-grid": { @@ -5404,9 +5515,9 @@ } }, "node_modules/@material-ui/lab": { - "version": "4.0.0-alpha.58", - "resolved": "https://registry.npmjs.org/@material-ui/lab/-/lab-4.0.0-alpha.58.tgz", - "integrity": "sha512-GKHlJqLxUeHH3L3dGQ48ZavYrqGOTXkFkiEiuYMAnAvXAZP4rhMIqeHOPXSUQan4Bd8QnafDcpovOSLnadDmKw==", + "version": "4.0.0-alpha.60", + "resolved": "https://registry.npmjs.org/@material-ui/lab/-/lab-4.0.0-alpha.60.tgz", + "integrity": "sha512-fadlYsPJF+0fx2lRuyqAuJj7hAS1tLDdIEEdov5jlrpb5pp4b+mRDUqQTUxi4inRZHS1bEXpU8QWUhO6xX88aA==", "dependencies": { "@babel/runtime": "^7.4.4", "@material-ui/utils": "^4.11.2", @@ -5418,7 +5529,7 @@ "node": ">=8.0.0" }, "peerDependencies": { - "@material-ui/core": "^4.9.10", + "@material-ui/core": "^4.12.1", "@types/react": "^16.8.6 || ^17.0.0", "react": "^16.8.0 || ^17.0.0", "react-dom": "^16.8.0 || ^17.0.0" @@ -5430,13 +5541,13 @@ } }, "node_modules/@material-ui/styles": { - "version": "4.11.3", - "resolved": "https://registry.npmjs.org/@material-ui/styles/-/styles-4.11.3.tgz", - "integrity": "sha512-HzVzCG+PpgUGMUYEJ2rTEmQYeonGh41BYfILNFb/1ueqma+p1meSdu4RX6NjxYBMhf7k+jgfHFTTz+L1SXL/Zg==", + "version": "4.11.4", + "resolved": "https://registry.npmjs.org/@material-ui/styles/-/styles-4.11.4.tgz", + "integrity": "sha512-KNTIZcnj/zprG5LW0Sao7zw+yG3O35pviHzejMdcSGCdWbiO8qzRgOYL8JAxAsWBKOKYwVZxXtHWaB5T2Kvxew==", "dependencies": { "@babel/runtime": "^7.4.4", "@emotion/hash": "^0.8.0", - "@material-ui/types": "^5.1.0", + "@material-ui/types": "5.1.0", "@material-ui/utils": "^4.11.2", "clsx": "^1.0.4", "csstype": "^2.5.2", @@ -5453,12 +5564,26 @@ }, "engines": { "node": ">=8.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/material-ui" + }, + "peerDependencies": { + "@types/react": "^16.8.6 || ^17.0.0", + "react": "^16.8.0 || ^17.0.0", + "react-dom": "^16.8.0 || ^17.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } } }, "node_modules/@material-ui/system": { - "version": "4.11.3", - "resolved": "https://registry.npmjs.org/@material-ui/system/-/system-4.11.3.tgz", - "integrity": "sha512-SY7otguNGol41Mu2Sg6KbBP1ZRFIbFLHGK81y4KYbsV2yIcaEPOmsCK6zwWlp+2yTV3J/VwT6oSBARtGIVdXPw==", + "version": "4.12.1", + "resolved": "https://registry.npmjs.org/@material-ui/system/-/system-4.12.1.tgz", + "integrity": "sha512-lUdzs4q9kEXZGhbN7BptyiS1rLNHe6kG9o8Y307HCvF4sQxbCgpL2qi+gUk+yI8a2DNk48gISEQxoxpgph0xIw==", "dependencies": { "@babel/runtime": "^7.4.4", "@material-ui/utils": "^4.11.2", @@ -5467,12 +5592,34 @@ }, "engines": { "node": ">=8.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/material-ui" + }, + "peerDependencies": { + "@types/react": "^16.8.6 || ^17.0.0", + "react": "^16.8.0 || ^17.0.0", + "react-dom": "^16.8.0 || ^17.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } } }, "node_modules/@material-ui/types": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/@material-ui/types/-/types-5.1.0.tgz", - "integrity": "sha512-7cqRjrY50b8QzRSYyhSpx4WRw2YuO0KKIGQEVk5J8uoz2BanawykgZGoWEqKm7pVIbzFDN0SpPcVV4IhOFkl8A==" + "integrity": "sha512-7cqRjrY50b8QzRSYyhSpx4WRw2YuO0KKIGQEVk5J8uoz2BanawykgZGoWEqKm7pVIbzFDN0SpPcVV4IhOFkl8A==", + "peerDependencies": { + "@types/react": "*" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } }, "node_modules/@material-ui/utils": { "version": "4.11.2", @@ -5534,11 +5681,677 @@ "node": ">= 6" } }, + "node_modules/@popperjs/core": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.0.tgz", + "integrity": "sha512-zrsUxjLOKAzdewIDRWy9nsV1GQsKBCWaGwsZQlCgr6/q+vjyZhFgqedLfFBuI9anTPEUT4APq9Mu0SZBTzIcGQ==", + "peer": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/popperjs" + } + }, "node_modules/@sheerun/mutationobserver-shim": { "version": "0.3.3", "resolved": "https://registry.npmjs.org/@sheerun/mutationobserver-shim/-/mutationobserver-shim-0.3.3.tgz", "integrity": "sha512-DetpxZw1fzPD5xUBrIAoplLChO2VB8DlL5Gg+I1IR9b2wPqYIca2WSUxL5g1vLeR4MsQq1NeWriXAVffV+U1Fw==" }, + "node_modules/@storybook/addon-knobs": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/@storybook/addon-knobs/-/addon-knobs-6.4.0.tgz", + "integrity": "sha512-DiH1/5e2AFHoHrncl1qLu18ZHPHzRMMPvOLFz8AWvvmc+VCqTdIaE+tdxKr3e8rYylKllibgvDOzrLjfTNjF+Q==", + "deprecated": "deprecating @storybook/addon-knobs in favor of @storybook/addon-controls", + "dependencies": { + "copy-to-clipboard": "^3.3.1", + "core-js": "^3.8.2", + "escape-html": "^1.0.3", + "fast-deep-equal": "^3.1.3", + "global": "^4.4.0", + "lodash": "^4.17.20", + "prop-types": "^15.7.2", + "qs": "^6.10.0", + "react-colorful": "^5.1.2", + "react-lifecycles-compat": "^3.0.4", + "react-select": "^3.2.0" + }, + "peerDependencies": { + "@storybook/addons": "^6.4.0", + "@storybook/api": "^6.4.0", + "@storybook/components": "^6.4.0", + "@storybook/core-events": "^6.4.0", + "@storybook/theming": "^6.4.0", + "react": "^16.8.0 || ^17.0.0", + "react-dom": "^16.8.0 || ^17.0.0" + }, + "peerDependenciesMeta": { + "react": { + "optional": true + }, + "react-dom": { + "optional": true + } + } + }, + "node_modules/@storybook/addon-knobs/node_modules/core-js": { + "version": "3.19.3", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.19.3.tgz", + "integrity": "sha512-LeLBMgEGSsG7giquSzvgBrTS7V5UL6ks3eQlUSbN8dJStlLFiRzUm5iqsRyzUB8carhfKjkJ2vzKqE6z1Vga9g==", + "hasInstallScript": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/@storybook/addon-knobs/node_modules/qs": { + "version": "6.10.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.2.tgz", + "integrity": "sha512-mSIdjzqznWgfd4pMii7sHtaYF8rx8861hBO80SraY5GT0XQibWZWJSid0avzHGkDIZLImux2S5mXO0Hfct2QCw==", + "dependencies": { + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/@storybook/addons": { + "version": "6.4.9", + "resolved": "https://registry.npmjs.org/@storybook/addons/-/addons-6.4.9.tgz", + "integrity": "sha512-y+oiN2zd+pbRWwkf6aQj4tPDFn+rQkrv7fiVoMxsYub+kKyZ3CNOuTSJH+A1A+eBL6DmzocChUyO6jvZFuh6Dg==", + "peer": true, + "dependencies": { + "@storybook/api": "6.4.9", + "@storybook/channels": "6.4.9", + "@storybook/client-logger": "6.4.9", + "@storybook/core-events": "6.4.9", + "@storybook/csf": "0.0.2--canary.87bc651.0", + "@storybook/router": "6.4.9", + "@storybook/theming": "6.4.9", + "@types/webpack-env": "^1.16.0", + "core-js": "^3.8.2", + "global": "^4.4.0", + "regenerator-runtime": "^0.13.7" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0", + "react-dom": "^16.8.0 || ^17.0.0" + } + }, + "node_modules/@storybook/addons/node_modules/core-js": { + "version": "3.19.3", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.19.3.tgz", + "integrity": "sha512-LeLBMgEGSsG7giquSzvgBrTS7V5UL6ks3eQlUSbN8dJStlLFiRzUm5iqsRyzUB8carhfKjkJ2vzKqE6z1Vga9g==", + "hasInstallScript": true, + "peer": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/@storybook/api": { + "version": "6.4.9", + "resolved": "https://registry.npmjs.org/@storybook/api/-/api-6.4.9.tgz", + "integrity": "sha512-U+YKcDQg8xal9sE5eSMXB9vcqk8fD1pSyewyAjjbsW5hV0B3L3i4u7z/EAD9Ujbnor+Cvxq+XGvp+Qnc5Gd40A==", + "peer": true, + "dependencies": { + "@storybook/channels": "6.4.9", + "@storybook/client-logger": "6.4.9", + "@storybook/core-events": "6.4.9", + "@storybook/csf": "0.0.2--canary.87bc651.0", + "@storybook/router": "6.4.9", + "@storybook/semver": "^7.3.2", + "@storybook/theming": "6.4.9", + "core-js": "^3.8.2", + "fast-deep-equal": "^3.1.3", + "global": "^4.4.0", + "lodash": "^4.17.21", + "memoizerific": "^1.11.3", + "regenerator-runtime": "^0.13.7", + "store2": "^2.12.0", + "telejson": "^5.3.2", + "ts-dedent": "^2.0.0", + "util-deprecate": "^1.0.2" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0", + "react-dom": "^16.8.0 || ^17.0.0" + } + }, + "node_modules/@storybook/api/node_modules/core-js": { + "version": "3.19.3", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.19.3.tgz", + "integrity": "sha512-LeLBMgEGSsG7giquSzvgBrTS7V5UL6ks3eQlUSbN8dJStlLFiRzUm5iqsRyzUB8carhfKjkJ2vzKqE6z1Vga9g==", + "hasInstallScript": true, + "peer": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/@storybook/channels": { + "version": "6.4.9", + "resolved": "https://registry.npmjs.org/@storybook/channels/-/channels-6.4.9.tgz", + "integrity": "sha512-DNW1qDg+1WFS2aMdGh658WJXh8xBXliO5KAn0786DKcWCsKjfsPPQg/QCHczHK0+s5SZyzQT5aOBb4kTRHELQA==", + "peer": true, + "dependencies": { + "core-js": "^3.8.2", + "ts-dedent": "^2.0.0", + "util-deprecate": "^1.0.2" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + } + }, + "node_modules/@storybook/channels/node_modules/core-js": { + "version": "3.19.3", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.19.3.tgz", + "integrity": "sha512-LeLBMgEGSsG7giquSzvgBrTS7V5UL6ks3eQlUSbN8dJStlLFiRzUm5iqsRyzUB8carhfKjkJ2vzKqE6z1Vga9g==", + "hasInstallScript": true, + "peer": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/@storybook/client-logger": { + "version": "6.4.9", + "resolved": "https://registry.npmjs.org/@storybook/client-logger/-/client-logger-6.4.9.tgz", + "integrity": "sha512-BVagmmHcuKDZ/XROADfN3tiolaDW2qG0iLmDhyV1gONnbGE6X5Qm19Jt2VYu3LvjKF1zMPSWm4mz7HtgdwKbuQ==", + "peer": true, + "dependencies": { + "core-js": "^3.8.2", + "global": "^4.4.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + } + }, + "node_modules/@storybook/client-logger/node_modules/core-js": { + "version": "3.19.3", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.19.3.tgz", + "integrity": "sha512-LeLBMgEGSsG7giquSzvgBrTS7V5UL6ks3eQlUSbN8dJStlLFiRzUm5iqsRyzUB8carhfKjkJ2vzKqE6z1Vga9g==", + "hasInstallScript": true, + "peer": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/@storybook/components": { + "version": "6.4.9", + "resolved": "https://registry.npmjs.org/@storybook/components/-/components-6.4.9.tgz", + "integrity": "sha512-uOUR97S6kjptkMCh15pYNM1vAqFXtpyneuonmBco5vADJb3ds0n2a8NeVd+myIbhIXn55x0OHKiSwBH/u7swCQ==", + "peer": true, + "dependencies": { + "@popperjs/core": "^2.6.0", + "@storybook/client-logger": "6.4.9", + "@storybook/csf": "0.0.2--canary.87bc651.0", + "@storybook/theming": "6.4.9", + "@types/color-convert": "^2.0.0", + "@types/overlayscrollbars": "^1.12.0", + "@types/react-syntax-highlighter": "11.0.5", + "color-convert": "^2.0.1", + "core-js": "^3.8.2", + "fast-deep-equal": "^3.1.3", + "global": "^4.4.0", + "lodash": "^4.17.21", + "markdown-to-jsx": "^7.1.3", + "memoizerific": "^1.11.3", + "overlayscrollbars": "^1.13.1", + "polished": "^4.0.5", + "prop-types": "^15.7.2", + "react-colorful": "^5.1.2", + "react-popper-tooltip": "^3.1.1", + "react-syntax-highlighter": "^13.5.3", + "react-textarea-autosize": "^8.3.0", + "regenerator-runtime": "^0.13.7", + "ts-dedent": "^2.0.0", + "util-deprecate": "^1.0.2" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0", + "react-dom": "^16.8.0 || ^17.0.0" + } + }, + "node_modules/@storybook/components/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "peer": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/@storybook/components/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "peer": true + }, + "node_modules/@storybook/components/node_modules/core-js": { + "version": "3.19.3", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.19.3.tgz", + "integrity": "sha512-LeLBMgEGSsG7giquSzvgBrTS7V5UL6ks3eQlUSbN8dJStlLFiRzUm5iqsRyzUB8carhfKjkJ2vzKqE6z1Vga9g==", + "hasInstallScript": true, + "peer": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/@storybook/components/node_modules/hastscript": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/hastscript/-/hastscript-6.0.0.tgz", + "integrity": "sha512-nDM6bvd7lIqDUiYEiu5Sl/+6ReP0BMk/2f4U/Rooccxkj0P5nm+acM5PrGJ/t5I8qPGiqZSE6hVAwZEdZIvP4w==", + "peer": true, + "dependencies": { + "@types/hast": "^2.0.0", + "comma-separated-tokens": "^1.0.0", + "hast-util-parse-selector": "^2.0.0", + "property-information": "^5.0.0", + "space-separated-tokens": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/@storybook/components/node_modules/highlight.js": { + "version": "10.7.3", + "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-10.7.3.tgz", + "integrity": "sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A==", + "peer": true, + "engines": { + "node": "*" + } + }, + "node_modules/@storybook/components/node_modules/lowlight": { + "version": "1.20.0", + "resolved": "https://registry.npmjs.org/lowlight/-/lowlight-1.20.0.tgz", + "integrity": "sha512-8Ktj+prEb1RoCPkEOrPMYUN/nCggB7qAWe3a7OpMjWQkh3l2RD5wKRQ+o8Q8YuI9RG/xs95waaI/E6ym/7NsTw==", + "peer": true, + "dependencies": { + "fault": "^1.0.0", + "highlight.js": "~10.7.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/@storybook/components/node_modules/parse-entities": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-2.0.0.tgz", + "integrity": "sha512-kkywGpCcRYhqQIchaWqZ875wzpS/bMKhz5HnN3p7wveJTkTtyAB/AlnS0f8DFSqYW1T82t6yEAkEcB+A1I3MbQ==", + "peer": true, + "dependencies": { + "character-entities": "^1.0.0", + "character-entities-legacy": "^1.0.0", + "character-reference-invalid": "^1.0.0", + "is-alphanumerical": "^1.0.0", + "is-decimal": "^1.0.0", + "is-hexadecimal": "^1.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/@storybook/components/node_modules/prismjs": { + "version": "1.25.0", + "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.25.0.tgz", + "integrity": "sha512-WCjJHl1KEWbnkQom1+SzftbtXMKQoezOCYs5rECqMN+jP+apI7ftoflyqigqzopSO3hMhTEb0mFClA8lkolgEg==", + "peer": true + }, + "node_modules/@storybook/components/node_modules/react-syntax-highlighter": { + "version": "13.5.3", + "resolved": "https://registry.npmjs.org/react-syntax-highlighter/-/react-syntax-highlighter-13.5.3.tgz", + "integrity": "sha512-crPaF+QGPeHNIblxxCdf2Lg936NAHKhNhuMzRL3F9ct6aYXL3NcZtCL0Rms9+qVo6Y1EQLdXGypBNSbPL/r+qg==", + "peer": true, + "dependencies": { + "@babel/runtime": "^7.3.1", + "highlight.js": "^10.1.1", + "lowlight": "^1.14.0", + "prismjs": "^1.21.0", + "refractor": "^3.1.0" + }, + "peerDependencies": { + "react": ">= 0.14.0" + } + }, + "node_modules/@storybook/components/node_modules/refractor": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/refractor/-/refractor-3.5.0.tgz", + "integrity": "sha512-QwPJd3ferTZ4cSPPjdP5bsYHMytwWYnAN5EEnLtGvkqp/FCCnGsBgxrm9EuIDnjUC3Uc/kETtvVi7fSIVC74Dg==", + "peer": true, + "dependencies": { + "hastscript": "^6.0.0", + "parse-entities": "^2.0.0", + "prismjs": "~1.25.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/@storybook/core-events": { + "version": "6.4.9", + "resolved": "https://registry.npmjs.org/@storybook/core-events/-/core-events-6.4.9.tgz", + "integrity": "sha512-YhU2zJr6wzvh5naYYuy/0UKNJ/SaXu73sIr0Tx60ur3bL08XkRg7eZ9vBhNBTlAa35oZqI0iiGCh0ljiX7yEVQ==", + "peer": true, + "dependencies": { + "core-js": "^3.8.2" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + } + }, + "node_modules/@storybook/core-events/node_modules/core-js": { + "version": "3.19.3", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.19.3.tgz", + "integrity": "sha512-LeLBMgEGSsG7giquSzvgBrTS7V5UL6ks3eQlUSbN8dJStlLFiRzUm5iqsRyzUB8carhfKjkJ2vzKqE6z1Vga9g==", + "hasInstallScript": true, + "peer": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/@storybook/csf": { + "version": "0.0.2--canary.87bc651.0", + "resolved": "https://registry.npmjs.org/@storybook/csf/-/csf-0.0.2--canary.87bc651.0.tgz", + "integrity": "sha512-ajk1Uxa+rBpFQHKrCcTmJyQBXZ5slfwHVEaKlkuFaW77it8RgbPJp/ccna3sgoi8oZ7FkkOyvv1Ve4SmwFqRqw==", + "peer": true, + "dependencies": { + "lodash": "^4.17.15" + } + }, + "node_modules/@storybook/router": { + "version": "6.4.9", + "resolved": "https://registry.npmjs.org/@storybook/router/-/router-6.4.9.tgz", + "integrity": "sha512-GT2KtVHo/mBjxDBFB5ZtVJVf8vC+3p5kRlQC4jao68caVp7H24ikPOkcY54VnQwwe4A1aXpGbJXUyTisEPFlhQ==", + "peer": true, + "dependencies": { + "@storybook/client-logger": "6.4.9", + "core-js": "^3.8.2", + "fast-deep-equal": "^3.1.3", + "global": "^4.4.0", + "history": "5.0.0", + "lodash": "^4.17.21", + "memoizerific": "^1.11.3", + "qs": "^6.10.0", + "react-router": "^6.0.0", + "react-router-dom": "^6.0.0", + "ts-dedent": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0", + "react-dom": "^16.8.0 || ^17.0.0" + } + }, + "node_modules/@storybook/router/node_modules/core-js": { + "version": "3.19.3", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.19.3.tgz", + "integrity": "sha512-LeLBMgEGSsG7giquSzvgBrTS7V5UL6ks3eQlUSbN8dJStlLFiRzUm5iqsRyzUB8carhfKjkJ2vzKqE6z1Vga9g==", + "hasInstallScript": true, + "peer": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/@storybook/router/node_modules/history": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/history/-/history-5.0.0.tgz", + "integrity": "sha512-3NyRMKIiFSJmIPdq7FxkNMJkQ7ZEtVblOQ38VtKaA0zZMW1Eo6Q6W8oDKEflr1kNNTItSnk4JMCO1deeSgbLLg==", + "peer": true, + "dependencies": { + "@babel/runtime": "^7.7.6" + } + }, + "node_modules/@storybook/router/node_modules/qs": { + "version": "6.10.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.2.tgz", + "integrity": "sha512-mSIdjzqznWgfd4pMii7sHtaYF8rx8861hBO80SraY5GT0XQibWZWJSid0avzHGkDIZLImux2S5mXO0Hfct2QCw==", + "peer": true, + "dependencies": { + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/@storybook/router/node_modules/react-router": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.0.2.tgz", + "integrity": "sha512-8/Wm3Ed8t7TuedXjAvV39+c8j0vwrI5qVsYqjFr5WkJjsJpEvNSoLRUbtqSEYzqaTUj1IV+sbPJxvO+accvU0Q==", + "peer": true, + "dependencies": { + "history": "^5.1.0" + }, + "peerDependencies": { + "react": ">=16.8" + } + }, + "node_modules/@storybook/router/node_modules/react-router-dom": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.0.2.tgz", + "integrity": "sha512-cOpJ4B6raFutr0EG8O/M2fEoyQmwvZWomf1c6W2YXBZuFBx8oTk/zqjXghwScyhfrtnt0lANXV2182NQblRxFA==", + "peer": true, + "dependencies": { + "history": "^5.1.0", + "react-router": "6.0.2" + }, + "peerDependencies": { + "react": ">=16.8", + "react-dom": ">=16.8" + } + }, + "node_modules/@storybook/router/node_modules/react-router-dom/node_modules/history": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/history/-/history-5.1.0.tgz", + "integrity": "sha512-zPuQgPacm2vH2xdORvGGz1wQMuHSIB56yNAy5FnLuwOwgSYyPKptJtcMm6Ev+hRGeS+GzhbmRacHzvlESbFwDg==", + "peer": true, + "dependencies": { + "@babel/runtime": "^7.7.6" + } + }, + "node_modules/@storybook/router/node_modules/react-router/node_modules/history": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/history/-/history-5.1.0.tgz", + "integrity": "sha512-zPuQgPacm2vH2xdORvGGz1wQMuHSIB56yNAy5FnLuwOwgSYyPKptJtcMm6Ev+hRGeS+GzhbmRacHzvlESbFwDg==", + "peer": true, + "dependencies": { + "@babel/runtime": "^7.7.6" + } + }, + "node_modules/@storybook/semver": { + "version": "7.3.2", + "resolved": "https://registry.npmjs.org/@storybook/semver/-/semver-7.3.2.tgz", + "integrity": "sha512-SWeszlsiPsMI0Ps0jVNtH64cI5c0UF3f7KgjVKJoNP30crQ6wUSddY2hsdeczZXEKVJGEn50Q60flcGsQGIcrg==", + "peer": true, + "dependencies": { + "core-js": "^3.6.5", + "find-up": "^4.1.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@storybook/semver/node_modules/core-js": { + "version": "3.19.3", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.19.3.tgz", + "integrity": "sha512-LeLBMgEGSsG7giquSzvgBrTS7V5UL6ks3eQlUSbN8dJStlLFiRzUm5iqsRyzUB8carhfKjkJ2vzKqE6z1Vga9g==", + "hasInstallScript": true, + "peer": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/@storybook/semver/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "peer": true, + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@storybook/semver/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "peer": true, + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@storybook/semver/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "peer": true, + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@storybook/semver/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "peer": true, + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@storybook/semver/node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "peer": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/@storybook/semver/node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "peer": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@storybook/theming": { + "version": "6.4.9", + "resolved": "https://registry.npmjs.org/@storybook/theming/-/theming-6.4.9.tgz", + "integrity": "sha512-Do6GH6nKjxfnBg6djcIYAjss5FW9SRKASKxLYxX2RyWJBpz0m/8GfcGcRyORy0yFTk6jByA3Hs+WFH3GnEbWkw==", + "peer": true, + "dependencies": { + "@emotion/core": "^10.1.1", + "@emotion/is-prop-valid": "^0.8.6", + "@emotion/styled": "^10.0.27", + "@storybook/client-logger": "6.4.9", + "core-js": "^3.8.2", + "deep-object-diff": "^1.1.0", + "emotion-theming": "^10.0.27", + "global": "^4.4.0", + "memoizerific": "^1.11.3", + "polished": "^4.0.5", + "resolve-from": "^5.0.0", + "ts-dedent": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0", + "react-dom": "^16.8.0 || ^17.0.0" + } + }, + "node_modules/@storybook/theming/node_modules/@emotion/is-prop-valid": { + "version": "0.8.8", + "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-0.8.8.tgz", + "integrity": "sha512-u5WtneEAr5IDG2Wv65yhunPSMLIpuKsbuOktRojfrEiEvRyC85LgPMZI63cr7NUqT8ZIGdSVg8ZKGxIug4lXcA==", + "peer": true, + "dependencies": { + "@emotion/memoize": "0.7.4" + } + }, + "node_modules/@storybook/theming/node_modules/@emotion/memoize": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.7.4.tgz", + "integrity": "sha512-Ja/Vfqe3HpuzRsG1oBtWTHk2PGZ7GR+2Vz5iYGelAw8dx32K0y7PjVuxK6z1nMpZOqAFsRUPCkK1YjJ56qJlgw==", + "peer": true + }, + "node_modules/@storybook/theming/node_modules/core-js": { + "version": "3.19.3", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.19.3.tgz", + "integrity": "sha512-LeLBMgEGSsG7giquSzvgBrTS7V5UL6ks3eQlUSbN8dJStlLFiRzUm5iqsRyzUB8carhfKjkJ2vzKqE6z1Vga9g==", + "hasInstallScript": true, + "peer": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/@storybook/theming/node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "peer": true, + "engines": { + "node": ">=8" + } + }, "node_modules/@svgr/babel-plugin-add-jsx-attribute": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-4.2.0.tgz", @@ -5914,6 +6727,21 @@ "@babel/types": "^7.3.0" } }, + "node_modules/@types/color-convert": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@types/color-convert/-/color-convert-2.0.0.tgz", + "integrity": "sha512-m7GG7IKKGuJUXvkZ1qqG3ChccdIM/qBBo913z+Xft0nKCX4hAU/IxKwZBU4cpRZ7GS5kV4vOblUkILtSShCPXQ==", + "peer": true, + "dependencies": { + "@types/color-name": "*" + } + }, + "node_modules/@types/color-name": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.1.tgz", + "integrity": "sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==", + "peer": true + }, "node_modules/@types/eslint-visitor-keys": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/@types/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz", @@ -5945,6 +6773,12 @@ "hoist-non-react-statics": "^3.3.0" } }, + "node_modules/@types/is-function": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@types/is-function/-/is-function-1.0.1.tgz", + "integrity": "sha512-A79HEEiwXTFtfY+Bcbo58M2GRYzCr9itHWzbzHVFNEYCcoU/MMGwYYf721gBrnhpj1s6RGVVha/IgNFnR0Iw/Q==", + "peer": true + }, "node_modules/@types/istanbul-lib-coverage": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.3.tgz", @@ -5988,6 +6822,12 @@ "resolved": "https://registry.npmjs.org/@types/node/-/node-14.14.37.tgz", "integrity": "sha512-XYmBiy+ohOR4Lh5jE379fV2IU+6Jn4g5qASinhitfyO71b/sCo6MKsMLF5tc7Zf2CE8hViVQyYSobJNke8OvUw==" }, + "node_modules/@types/overlayscrollbars": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@types/overlayscrollbars/-/overlayscrollbars-1.12.1.tgz", + "integrity": "sha512-V25YHbSoKQN35UasHf0EKD9U2vcmexRSp78qa8UglxFH8H3D+adEa9zGZwrqpH4TdvqeMrgMqVqsLB4woAryrQ==", + "peer": true + }, "node_modules/@types/parse-json": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", @@ -6040,6 +6880,15 @@ "redux": "^4.0.0" } }, + "node_modules/@types/react-syntax-highlighter": { + "version": "11.0.5", + "resolved": "https://registry.npmjs.org/@types/react-syntax-highlighter/-/react-syntax-highlighter-11.0.5.tgz", + "integrity": "sha512-VIOi9i2Oj5XsmWWoB72p3KlZoEbdRAcechJa8Ztebw7bDl2YmR+odxIqhtJGp1q2EozHs02US+gzxJ9nuf56qg==", + "peer": true, + "dependencies": { + "@types/react": "*" + } + }, "node_modules/@types/react-transition-group": { "version": "4.4.1", "resolved": "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.1.tgz", @@ -6190,6 +7039,12 @@ "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.3.tgz", "integrity": "sha512-FvUupuM3rlRsRtCN+fDudtmytGO6iHJuuRKS1Ss0pG5z8oX0diNEw94UEL7hgDbpN94rgaK5R7sWm6RrSkZuAQ==" }, + "node_modules/@types/webpack-env": { + "version": "1.16.3", + "resolved": "https://registry.npmjs.org/@types/webpack-env/-/webpack-env-1.16.3.tgz", + "integrity": "sha512-9gtOPPkfyNoEqCQgx4qJKkuNm/x0R2hKR7fdl7zvTJyHnIisuE/LfvXOsYWL0o3qq6uiBnKZNNNzi3l0y/X+xw==", + "peer": true + }, "node_modules/@types/yargs": { "version": "13.0.11", "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-13.0.11.tgz", @@ -6782,9 +7637,9 @@ } }, "node_modules/ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "engines": { "node": ">=8" } @@ -7977,9 +8832,9 @@ } }, "node_modules/bento-components": { - "version": "0.1.78", - "resolved": "https://registry.npmjs.org/bento-components/-/bento-components-0.1.78.tgz", - "integrity": "sha512-n+XDVcJhvoae/dbew2obJG+zQoSf09o8v894v+6DjBtu2gcyRWivxweIt4rLP6LA+uCd4j5/4ZIYfe6IkA+R+A==", + "version": "0.1.96", + "resolved": "https://registry.npmjs.org/bento-components/-/bento-components-0.1.96.tgz", + "integrity": "sha512-43ljFfJ/PA0XJCuTnq/RK+DMNJxrt9LUkQV3kPwS0mPV/oKC6ogVoTg9HIdJqeU/cqpOKLR7dY5wi5GJXwD+8w==", "dependencies": { "@babel/cli": "^7.10.5", "@babel/plugin-proposal-class-properties": "^7.10.4", @@ -7987,11 +8842,15 @@ "@babel/preset-react": "^7.10.4", "@material-ui/core": ">=4.0.0", "@material-ui/icons": ">=4.0.0", + "@material-ui/lab": "*", + "@storybook/addon-knobs": "^6.3.1", "@testing-library/jest-dom": "^4.2.4", "@testing-library/react": "^9.3.2", "@testing-library/user-event": "^7.1.2", "classnames": "^2.2.6", "cross-env": "^7.0.2", + "devextreme": "^21.1.6", + "devextreme-react": "^21.1.6", "eslint-plugin-babel": "^5.3.1", "link-react": "^3.0.0", "lodash": "^4.17.20", @@ -8014,6 +8873,7 @@ "react-vis": "^1.11.7", "react-zoom-pan-pinch": "^1.6.1", "recharts": "^1.8.5", + "rimraf": "^2.6.3", "svg-url-loader": "^5.0.0", "uuid": "^8.3.1" }, @@ -10227,6 +11087,12 @@ "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=" }, + "node_modules/deep-object-diff": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/deep-object-diff/-/deep-object-diff-1.1.0.tgz", + "integrity": "sha512-b+QLs5vHgS+IoSNcUE4n9HP2NwcHj7aqnJWsjPtuG75Rh5TOaGt0OjAYInh77d5T16V5cRDC+Pw/6ZZZiETBGw==", + "peer": true + }, "node_modules/deepmerge": { "version": "4.2.2", "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz", @@ -10426,6 +11292,227 @@ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" }, + "node_modules/devexpress-diagram": { + "version": "2.1.40", + "resolved": "https://registry.npmjs.org/devexpress-diagram/-/devexpress-diagram-2.1.40.tgz", + "integrity": "sha512-7SPHxVz06+zWtpMUeffK82qqE1uRgFhWeceLLQZ/3yA/wDYvr5NU6wA2UI1wZjTI/mGI+K3MhOlZV9wqPTjKVQ==", + "dependencies": { + "@devexpress/utils": "1.3.13", + "es6-object-assign": "^1.1.0" + } + }, + "node_modules/devexpress-gantt": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/devexpress-gantt/-/devexpress-gantt-4.0.0.tgz", + "integrity": "sha512-mL1Qa+XSt5GEdKlJQZg5VfvdVgH0IMRaS73HDIXJCZrDNzk3RL1LEhauyqiCSA8K+znqBqCyAJf6EaaXGpOPgA==", + "dependencies": { + "@devexpress/utils": "1.3.2", + "tslib": "2.3.1" + } + }, + "node_modules/devexpress-gantt/node_modules/@devexpress/utils": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@devexpress/utils/-/utils-1.3.2.tgz", + "integrity": "sha512-Ii7hpz6ItNMLKz23qQOlHom/k0e1TSnIQKCwZlKuYBwpIEBX5I/PQxvAwbdBnu5EZZSkdjnhzxl6luhl/k4LdA==", + "dependencies": { + "tslib": "2.0.1" + } + }, + "node_modules/devexpress-gantt/node_modules/@devexpress/utils/node_modules/tslib": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.0.1.tgz", + "integrity": "sha512-SgIkNheinmEBgx1IUNirK0TUD4X9yjjBRTqqjggWCU3pUEqIk3/Uwl3yRixYKT6WjQuGiwDv4NomL3wqRCj+CQ==" + }, + "node_modules/devexpress-gantt/node_modules/tslib": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz", + "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==" + }, + "node_modules/devextreme": { + "version": "21.2.4", + "resolved": "https://registry.npmjs.org/devextreme/-/devextreme-21.2.4.tgz", + "integrity": "sha512-edu19T80Wr6+cIz9Vk8rlCKzWiOZSHtak/a0paGmXuUaViIcBJA18wHw+9XpcEDlUj6T2yivTdeYx0tZ8O6IxA==", + "dependencies": { + "@babel/runtime": "^7.12.1", + "@devextreme/runtime": "2.3.13", + "devexpress-diagram": "2.1.40", + "devexpress-gantt": "4.0.0", + "devextreme-quill": "~1.5.7", + "devextreme-showdown": "^1.0.1", + "inferno": "^7.4.9", + "inferno-compat": "^7.4.9", + "inferno-create-element": "^7.4.9", + "inferno-hydrate": "^7.4.9", + "jszip": "^3.7.1", + "rrule": "2.6.6", + "turndown": "~7.0.0" + }, + "bin": { + "devextreme-bundler": "bin/bundler.js", + "devextreme-bundler-init": "bin/bundler-init.js" + } + }, + "node_modules/devextreme-quill": { + "version": "1.5.7", + "resolved": "https://registry.npmjs.org/devextreme-quill/-/devextreme-quill-1.5.7.tgz", + "integrity": "sha512-QY1sERl1avqqS3pjH4GRMevrL7LMDZiV6+rv7wXU+9n0f1ZqN/LUXME3r9rRxB4osUTDjVeh9GPodiAIEgmA/g==", + "dependencies": { + "core-js": "^3.19.1", + "eventemitter3": "^4.0.0", + "lodash.clonedeep": "^4.5.0", + "lodash.isequal": "^4.5.0", + "lodash.merge": "^4.5.0", + "parchment": "2.0.0-dev.2", + "quill-delta": "4.2.2" + } + }, + "node_modules/devextreme-quill/node_modules/core-js": { + "version": "3.19.3", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.19.3.tgz", + "integrity": "sha512-LeLBMgEGSsG7giquSzvgBrTS7V5UL6ks3eQlUSbN8dJStlLFiRzUm5iqsRyzUB8carhfKjkJ2vzKqE6z1Vga9g==", + "hasInstallScript": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/devextreme-quill/node_modules/eventemitter3": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==" + }, + "node_modules/devextreme-react": { + "version": "21.2.4", + "resolved": "https://registry.npmjs.org/devextreme-react/-/devextreme-react-21.2.4.tgz", + "integrity": "sha512-9Vpt2iaTLWPZOun+8gq3yD2QKYy5XdzKoOduiwMR0PoHC5uvKyU17CDwzHeETk1CZ7Qx/YX0ZVG76x4eySjoIg==", + "dependencies": { + "prop-types": "^15.6.1" + }, + "peerDependencies": { + "devextreme": "~21.2.4", + "react": "^16.2.0 || ^17.0.0", + "react-dom": "^16.2.0 || ^17.0.0" + } + }, + "node_modules/devextreme-showdown": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/devextreme-showdown/-/devextreme-showdown-1.0.1.tgz", + "integrity": "sha512-63zsdU3iGDp0E9TibxGwZPlS+l07/VvD/mlgZY30fEqz6J2kCsYCqyNKbhlgIvuz+yMtWcUXVYVOMpA2YBTgEg==", + "dependencies": { + "yargs": "^17.2.1" + }, + "bin": { + "showdown": "bin/showdown.js" + } + }, + "node_modules/devextreme-showdown/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/devextreme-showdown/node_modules/cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "node_modules/devextreme-showdown/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/devextreme-showdown/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/devextreme-showdown/node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/devextreme-showdown/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/devextreme-showdown/node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/devextreme-showdown/node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "engines": { + "node": ">=10" + } + }, + "node_modules/devextreme-showdown/node_modules/yargs": { + "version": "17.3.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.3.0.tgz", + "integrity": "sha512-GQl1pWyDoGptFPJx9b9L6kmR33TGusZvXIZUT+BOz9f7X2L94oeAskFYLEg/FkhV06zZPBYLvLZRWeYId29lew==", + "dependencies": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/devextreme-showdown/node_modules/yargs-parser": { + "version": "21.0.0", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.0.0.tgz", + "integrity": "sha512-z9kApYUOCwoeZ78rfRYYWdiU/iNL6mwwYlkkZfJoyMR1xps+NEBX5X7XmRpxkZHhXJ6+Ey00IwKxBBSW9FIjyA==", + "engines": { + "node": ">=12" + } + }, "node_modules/diff": { "version": "3.5.0", "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", @@ -10578,6 +11665,11 @@ "domelementtype": "1" } }, + "node_modules/domino": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/domino/-/domino-2.1.6.tgz", + "integrity": "sha512-3VdM/SXBZX2omc9JF9nOPCtDaYQ67BGp5CoLpIQlO2KCAPETs8TcDHacF26jXadGbvUteZzRTeos2fhID5+ucQ==" + }, "node_modules/dompurify": { "version": "2.2.9", "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-2.2.9.tgz", @@ -10739,6 +11831,21 @@ "node": ">= 4" } }, + "node_modules/emotion-theming": { + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/emotion-theming/-/emotion-theming-10.3.0.tgz", + "integrity": "sha512-mXiD2Oj7N9b6+h/dC6oLf9hwxbtKHQjoIqtodEyL8CpkN4F3V4IK/BT4D0C7zSs4BBFOu4UlPJbvvBLa88SGEA==", + "peer": true, + "dependencies": { + "@babel/runtime": "^7.5.5", + "@emotion/weak-memoize": "0.2.5", + "hoist-non-react-statics": "^3.3.0" + }, + "peerDependencies": { + "@emotion/core": "^10.0.27", + "react": ">=16.3.0" + } + }, "node_modules/encodeurl": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", @@ -10882,6 +11989,11 @@ "es6-symbol": "^3.1.1" } }, + "node_modules/es6-object-assign": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/es6-object-assign/-/es6-object-assign-1.1.0.tgz", + "integrity": "sha1-wsNYJlYkfDnqEHyx5mUrb58kUjw=" + }, "node_modules/es6-promisify": { "version": "6.1.1", "resolved": "https://registry.npmjs.org/es6-promisify/-/es6-promisify-6.1.1.tgz", @@ -11985,6 +13097,11 @@ "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" }, + "node_modules/fast-diff": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.2.0.tgz", + "integrity": "sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==" + }, "node_modules/fast-glob": { "version": "2.2.7", "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-2.2.7.tgz", @@ -13724,6 +14841,11 @@ "node": ">= 4" } }, + "node_modules/immediate": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", + "integrity": "sha1-nbHb0Pr43m++D13V5Wu2BigN5ps=" + }, "node_modules/immer": { "version": "1.10.0", "resolved": "https://registry.npmjs.org/immer/-/immer-1.10.0.tgz", @@ -13820,6 +14942,79 @@ "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==" }, + "node_modules/inferno": { + "version": "7.4.11", + "resolved": "https://registry.npmjs.org/inferno/-/inferno-7.4.11.tgz", + "integrity": "sha512-N+cs33ESWI8fdToCd98yMRYl7jkLnCkJskxov3FKKlaKOvk3PRlAttbhmUaYdWXlRvt2WeXi+J4MbzNj3V6G0w==", + "hasInstallScript": true, + "dependencies": { + "inferno-shared": "7.4.11", + "inferno-vnode-flags": "7.4.11", + "opencollective-postinstall": "^2.0.3" + } + }, + "node_modules/inferno-clone-vnode": { + "version": "7.4.11", + "resolved": "https://registry.npmjs.org/inferno-clone-vnode/-/inferno-clone-vnode-7.4.11.tgz", + "integrity": "sha512-6/newyzWO/lrwcA9q5DBAfslccPWqhpgrDQg/wWiHKZwRBe1kJjtiALsR+/1wLq1Z+YO3L1MPnlEnFu+nltUbA==", + "dependencies": { + "inferno": "7.4.11" + } + }, + "node_modules/inferno-compat": { + "version": "7.4.11", + "resolved": "https://registry.npmjs.org/inferno-compat/-/inferno-compat-7.4.11.tgz", + "integrity": "sha512-gaF5yL6CpN1DckVzMN/eiPZqlkWIMjWtr6BCBJbpUF+hXE5bJ60xNrtTFNsu2ChbYtO96UPqUNfC2VBRMz+k9Q==", + "dependencies": { + "inferno": "7.4.11", + "inferno-clone-vnode": "7.4.11", + "inferno-create-class": "7.4.11", + "inferno-create-element": "7.4.11", + "inferno-extras": "7.4.11" + } + }, + "node_modules/inferno-create-class": { + "version": "7.4.11", + "resolved": "https://registry.npmjs.org/inferno-create-class/-/inferno-create-class-7.4.11.tgz", + "integrity": "sha512-03Z3Az7xOnMHq39QxMqns0NwOt8b7gW+fu50iKK4bRkgEy8Zaa5TH8hYDJ7dAwzDR6BbQ6kCyTXfVPPeQShdvA==", + "dependencies": { + "inferno": "7.4.11" + } + }, + "node_modules/inferno-create-element": { + "version": "7.4.11", + "resolved": "https://registry.npmjs.org/inferno-create-element/-/inferno-create-element-7.4.11.tgz", + "integrity": "sha512-kE6XIx2hPAd5qpDli2iGjNXgubvuyxdLvoiW71WnSzIIxA+Uxa/s8lY8m03VyHHVypFV3n329ZY5dFvKc7UQMg==", + "dependencies": { + "inferno": "7.4.11" + } + }, + "node_modules/inferno-extras": { + "version": "7.4.11", + "resolved": "https://registry.npmjs.org/inferno-extras/-/inferno-extras-7.4.11.tgz", + "integrity": "sha512-JS/irXQozH98zVDx7TEdhzPoRxVBrNFrDjZwQeZMV4wKEh1fqwSh4OBjlhBX6J4u+7UhZoGxx0KqlH1nky+fNQ==", + "dependencies": { + "inferno": "7.4.11" + } + }, + "node_modules/inferno-hydrate": { + "version": "7.4.11", + "resolved": "https://registry.npmjs.org/inferno-hydrate/-/inferno-hydrate-7.4.11.tgz", + "integrity": "sha512-hF9Ke4GHAkj8GQrMXBZPfsUqhq6WjkoDCAfXhPBuF1Wiceqyy8KerOOXEnuocHky77fuEXq0AzVnQcC064Bkfw==", + "dependencies": { + "inferno": "7.4.11" + } + }, + "node_modules/inferno-shared": { + "version": "7.4.11", + "resolved": "https://registry.npmjs.org/inferno-shared/-/inferno-shared-7.4.11.tgz", + "integrity": "sha512-pN725bDSTxkQmRS3e/3H02/xAqgHl+xgddCMjPm8M0etRdRcVCisi3NGPhzSbDDmiftrxhY31exs7+dwsngcDA==" + }, + "node_modules/inferno-vnode-flags": { + "version": "7.4.11", + "resolved": "https://registry.npmjs.org/inferno-vnode-flags/-/inferno-vnode-flags-7.4.11.tgz", + "integrity": "sha512-L7lslEQCq3IfwgT/b9zhuMf8fv6KXCNXXHZevk/WYxnqJsOWGDcKpJn0zkzXfvmj0otbB149iLUQVBq3oe2sfA==" + }, "node_modules/inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", @@ -14250,6 +15445,12 @@ "node": ">=8" } }, + "node_modules/is-function": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-function/-/is-function-1.0.2.tgz", + "integrity": "sha512-lw7DUp0aWXYg+CBCN+JKkcE0Q2RayZnSvnZBlwgxHBQhqt5pZNVy4Ri7H9GmmXkdu7LUthszM+Tor1u/2iBcpQ==", + "peer": true + }, "node_modules/is-generator-fn": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-1.0.0.tgz", @@ -16435,6 +17636,17 @@ "node": ">=4.0" } }, + "node_modules/jszip": { + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.7.1.tgz", + "integrity": "sha512-ghL0tz1XG9ZEmRMcEN2vt7xabrDdqHHeykgARpmZ0BiIctWxM47Vt63ZO2dnp4QYt/xJVLLy5Zv1l/xRdh2byg==", + "dependencies": { + "lie": "~3.3.0", + "pako": "~1.0.2", + "readable-stream": "~2.3.6", + "set-immediate-shim": "~1.0.1" + } + }, "node_modules/keycode": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/keycode/-/keycode-2.2.0.tgz", @@ -16551,6 +17763,14 @@ "node": ">= 0.8.0" } }, + "node_modules/lie": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/lie/-/lie-3.3.0.tgz", + "integrity": "sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==", + "dependencies": { + "immediate": "~3.0.5" + } + }, "node_modules/line-awesome": { "resolved": "git+ssh://git@github.com/icons8/line-awesome.git#a60f11367584e7df157277b5ab9d1654ec91ae24" }, @@ -16884,6 +18104,15 @@ "yallist": "^3.0.2" } }, + "node_modules/luxon": { + "version": "1.28.0", + "resolved": "https://registry.npmjs.org/luxon/-/luxon-1.28.0.tgz", + "integrity": "sha512-TfTiyvZhwBYM/7QdAVDh+7dBTBA29v4ik0Ce9zda3Mnf8on1S5KJI8P2jKFZ8+5C0jhmr0KwJEO/Wdpm0VeWJQ==", + "optional": true, + "engines": { + "node": "*" + } + }, "node_modules/make-dir": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", @@ -16928,6 +18157,12 @@ "node": ">=0.10.0" } }, + "node_modules/map-or-similar": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/map-or-similar/-/map-or-similar-1.5.0.tgz", + "integrity": "sha1-beJlMXSt+12e3DPGnT6Sobdvrwg=", + "peer": true + }, "node_modules/map-visit": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", @@ -16959,6 +18194,18 @@ "resolved": "https://registry.npmjs.org/entities/-/entities-2.0.3.tgz", "integrity": "sha512-MyoZ0jgnLvB2X3Lg5HqpFmn1kybDiIfEQmKzTb5apr51Rb+T3KdmMiqa70T+bhGnyv7bQ6WMj2QMHpGMmlrUYQ==" }, + "node_modules/markdown-to-jsx": { + "version": "7.1.5", + "resolved": "https://registry.npmjs.org/markdown-to-jsx/-/markdown-to-jsx-7.1.5.tgz", + "integrity": "sha512-YQEMMMCX3PYOWtUAQu8Fmz5/sH09s17eyQnDubwaAo8sWmnRTT1og96EFv1vL59l4nWfmtF3L91pqkuheVqRlA==", + "peer": true, + "engines": { + "node": ">= 10" + }, + "peerDependencies": { + "react": ">= 0.14.0" + } + }, "node_modules/material-colors": { "version": "1.2.6", "resolved": "https://registry.npmjs.org/material-colors/-/material-colors-1.2.6.tgz", @@ -17030,6 +18277,15 @@ "resolved": "https://registry.npmjs.org/memoize-one/-/memoize-one-5.1.1.tgz", "integrity": "sha512-HKeeBpWvqiVJD57ZUAsJNm71eHTykffzcLZVYWiVfQeI1rJtuEaS7hQiEpWfVVk18donPwJEcFKIkCmPJNOhHA==" }, + "node_modules/memoizerific": { + "version": "1.11.3", + "resolved": "https://registry.npmjs.org/memoizerific/-/memoizerific-1.11.3.tgz", + "integrity": "sha1-fIekZGREwy11Q4VwkF8tvRsagFo=", + "peer": true, + "dependencies": { + "map-or-similar": "^1.5.0" + } + }, "node_modules/memory-fs": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz", @@ -18134,6 +19390,14 @@ "node": ">=8" } }, + "node_modules/opencollective-postinstall": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/opencollective-postinstall/-/opencollective-postinstall-2.0.3.tgz", + "integrity": "sha512-8AV/sCtuzUeTo8gQK5qDZzARrulB3egtLzFgteqB2tcT4Mw7B8Kt7JcDHmltjz6FOAHsvTevk70gZEbhM4ZS9Q==", + "bin": { + "opencollective-postinstall": "index.js" + } + }, "node_modules/opn": { "version": "5.4.0", "resolved": "https://registry.npmjs.org/opn/-/opn-5.4.0.tgz", @@ -18221,6 +19485,12 @@ "node": ">=0.10.0" } }, + "node_modules/overlayscrollbars": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/overlayscrollbars/-/overlayscrollbars-1.13.1.tgz", + "integrity": "sha512-gIQfzgGgu1wy80EB4/6DaJGHMEGmizq27xHIESrzXq0Y/J0Ay1P3DWk6tuVmEPIZH15zaBlxeEJOqdJKmowHCQ==", + "peer": true + }, "node_modules/p-defer": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz", @@ -18336,6 +19606,11 @@ "no-case": "^2.2.0" } }, + "node_modules/parchment": { + "version": "2.0.0-dev.2", + "resolved": "https://registry.npmjs.org/parchment/-/parchment-2.0.0-dev.2.tgz", + "integrity": "sha512-4fgRny4pPISoML08Zp7poi52Dff3E2G1ORTi2D/acJ/RiROdDAMDB6VcQNfBcmehrX5Wixp6dxh6JjLyE5yUNQ==" + }, "node_modules/parent-module": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", @@ -18660,6 +19935,18 @@ "node": ">=6" } }, + "node_modules/polished": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/polished/-/polished-4.1.3.tgz", + "integrity": "sha512-ocPAcVBUOryJEKe0z2KLd1l9EBa1r5mSwlKpExmrLzsnIzJo4axsoU9O2BjOTkDGDT4mZ0WFE5XKTlR3nLnZOA==", + "peer": true, + "dependencies": { + "@babel/runtime": "^7.14.0" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/popper.js": { "version": "1.16.1-lts", "resolved": "https://registry.npmjs.org/popper.js/-/popper.js-1.16.1-lts.tgz", @@ -21952,6 +23239,16 @@ "resolved": "https://registry.npmjs.org/quickselect/-/quickselect-2.0.0.tgz", "integrity": "sha512-RKJ22hX8mHe3Y6wH/N3wCM6BWtjaxIyyUIkpHOvfFnxdI4yD4tBXEBKSbriGujF6jnSVkJrffuo6vxACiSSxIw==" }, + "node_modules/quill-delta": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/quill-delta/-/quill-delta-4.2.2.tgz", + "integrity": "sha512-qjbn82b/yJzOjstBgkhtBjN2TNK+ZHP/BgUQO+j6bRhWQQdmj2lH6hXG7+nwwLF41Xgn//7/83lxs9n2BkTtTg==", + "dependencies": { + "fast-diff": "1.2.0", + "lodash.clonedeep": "^4.5.0", + "lodash.isequal": "^4.5.0" + } + }, "node_modules/raf": { "version": "3.4.1", "resolved": "https://registry.npmjs.org/raf/-/raf-3.4.1.tgz", @@ -22131,6 +23428,15 @@ "react": "*" } }, + "node_modules/react-colorful": { + "version": "5.5.1", + "resolved": "https://registry.npmjs.org/react-colorful/-/react-colorful-5.5.1.tgz", + "integrity": "sha512-M1TJH2X3RXEt12sWkpa6hLc/bbYS0H6F4rIqjQZ+RxNBstpY67d9TrFXtqdZwhpmBXcCwEi7stKqFue3ZRkiOg==", + "peerDependencies": { + "react": ">=16.8.0", + "react-dom": ">=16.8.0" + } + }, "node_modules/react-d3-axis": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/react-d3-axis/-/react-d3-axis-0.1.2.tgz", @@ -22530,6 +23836,23 @@ "warning": "^4.0.1" } }, + "node_modules/react-fast-compare": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/react-fast-compare/-/react-fast-compare-3.2.0.tgz", + "integrity": "sha512-rtGImPZ0YyLrscKI9xTpV8psd6I8VAtjKCzQDlzyDvqJA8XOW78TXYQwNRNd8g8JZnDu8q9Fu/1v4HPAVwVdHA==", + "peer": true + }, + "node_modules/react-input-autosize": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/react-input-autosize/-/react-input-autosize-3.0.0.tgz", + "integrity": "sha512-nL9uS7jEs/zu8sqwFE5MAPx6pPkNAriACQ2rGLlqmKr2sPGtN7TXTyDdQt4lbNXVx7Uzadb40x8qotIuru6Rhg==", + "dependencies": { + "prop-types": "^15.5.8" + }, + "peerDependencies": { + "react": "^16.3.0 || ^17.0.0" + } + }, "node_modules/react-intersection-observer": { "version": "8.32.0", "resolved": "https://registry.npmjs.org/react-intersection-observer/-/react-intersection-observer-8.32.0.tgz", @@ -22613,6 +23936,35 @@ "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-0.2.0.tgz", "integrity": "sha1-M+8wxcd9TqIcWlOGnZG1bY8lVeU=" }, + "node_modules/react-popper": { + "version": "2.2.5", + "resolved": "https://registry.npmjs.org/react-popper/-/react-popper-2.2.5.tgz", + "integrity": "sha512-kxGkS80eQGtLl18+uig1UIf9MKixFSyPxglsgLBxlYnyDf65BiY9B3nZSc6C9XUNDgStROB0fMQlTEz1KxGddw==", + "peer": true, + "dependencies": { + "react-fast-compare": "^3.0.1", + "warning": "^4.0.2" + }, + "peerDependencies": { + "@popperjs/core": "^2.0.0", + "react": "^16.8.0 || ^17" + } + }, + "node_modules/react-popper-tooltip": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/react-popper-tooltip/-/react-popper-tooltip-3.1.1.tgz", + "integrity": "sha512-EnERAnnKRptQBJyaee5GJScWNUKQPDD2ywvzZyUjst/wj5U64C8/CnSYLNEmP2hG0IJ3ZhtDxE8oDN+KOyavXQ==", + "peer": true, + "dependencies": { + "@babel/runtime": "^7.12.5", + "@popperjs/core": "^2.5.4", + "react-popper": "^2.2.4" + }, + "peerDependencies": { + "react": "^16.6.0 || ^17.0.0", + "react-dom": "^16.6.0 || ^17.0.0" + } + }, "node_modules/react-redux": { "version": "7.2.3", "resolved": "https://registry.npmjs.org/react-redux/-/react-redux-7.2.3.tgz", @@ -26122,6 +27474,25 @@ "prop-types": "^15.7.2" } }, + "node_modules/react-select": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/react-select/-/react-select-3.2.0.tgz", + "integrity": "sha512-B/q3TnCZXEKItO0fFN/I0tWOX3WJvi/X2wtdffmwSQVRwg5BpValScTO1vdic9AxlUgmeSzib2hAZAwIUQUZGQ==", + "dependencies": { + "@babel/runtime": "^7.4.4", + "@emotion/cache": "^10.0.9", + "@emotion/core": "^10.0.9", + "@emotion/css": "^10.0.9", + "memoize-one": "^5.0.0", + "prop-types": "^15.6.0", + "react-input-autosize": "^3.0.0", + "react-transition-group": "^4.3.0" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0", + "react-dom": "^16.8.0 || ^17.0.0" + } + }, "node_modules/react-simple-code-editor": { "version": "0.9.3", "resolved": "https://registry.npmjs.org/react-simple-code-editor/-/react-simple-code-editor-0.9.3.tgz", @@ -26270,6 +27641,23 @@ "refractor": "^2.4.1" } }, + "node_modules/react-textarea-autosize": { + "version": "8.3.3", + "resolved": "https://registry.npmjs.org/react-textarea-autosize/-/react-textarea-autosize-8.3.3.tgz", + "integrity": "sha512-2XlHXK2TDxS6vbQaoPbMOfQ8GK7+irc2fVK6QFIcC8GOnH3zI/v481n+j1L0WaPVvKxwesnY93fEfH++sus2rQ==", + "peer": true, + "dependencies": { + "@babel/runtime": "^7.10.2", + "use-composed-ref": "^1.0.0", + "use-latest": "^1.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0" + } + }, "node_modules/react-to-print": { "version": "2.12.6", "resolved": "https://registry.npmjs.org/react-to-print/-/react-to-print-2.12.6.tgz", @@ -26633,6 +28021,14 @@ "symbol-observable": "^1.2.0" } }, + "node_modules/redux-devtools-extension": { + "version": "2.13.9", + "resolved": "https://registry.npmjs.org/redux-devtools-extension/-/redux-devtools-extension-2.13.9.tgz", + "integrity": "sha512-cNJ8Q/EtjhQaZ71c8I9+BPySIBVEKssbPpskBfsXqb8HJ002A3KRVHfeRzwRo6mGPqsm7XuHTqNSNeS1Khig0A==", + "peerDependencies": { + "redux": "^3.1.0 || ^4.0.0" + } + }, "node_modules/redux-logger": { "version": "3.0.6", "resolved": "https://registry.npmjs.org/redux-logger/-/redux-logger-3.0.6.tgz", @@ -27163,6 +28559,17 @@ "inherits": "^2.0.1" } }, + "node_modules/rrule": { + "version": "2.6.6", + "resolved": "https://registry.npmjs.org/rrule/-/rrule-2.6.6.tgz", + "integrity": "sha512-h6tb/hRo9SNv8xKjcvsEfdmhXvElMXsU3Yz0KmqMehUqxP6a4Qjmth2EuL1FsjdawADjajLS0eBbWfsZzn3SIw==", + "dependencies": { + "tslib": "^1.10.0" + }, + "optionalDependencies": { + "luxon": "^1.21.3" + } + }, "node_modules/rsvp": { "version": "3.6.2", "resolved": "https://registry.npmjs.org/rsvp/-/rsvp-3.6.2.tgz", @@ -27535,6 +28942,14 @@ "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" }, + "node_modules/set-immediate-shim": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz", + "integrity": "sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E=", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/set-value": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", @@ -28216,6 +29631,12 @@ "node": ">=0.10.0" } }, + "node_modules/store2": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/store2/-/store2-2.12.0.tgz", + "integrity": "sha512-7t+/wpKLanLzSnQPX8WAcuLCCeuSHoWdQuh9SB3xD0kNOM38DNf+0Oa+wmvxmYueRzkmh6IcdKFtvTa+ecgPDw==", + "peer": true + }, "node_modules/stream-browserify": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.2.tgz", @@ -28299,13 +29720,13 @@ } }, "node_modules/string-width": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", - "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.0" + "strip-ansi": "^6.0.1" }, "engines": { "node": ">=8" @@ -28317,11 +29738,11 @@ "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" }, "node_modules/string-width/node_modules/strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dependencies": { - "ansi-regex": "^5.0.0" + "ansi-regex": "^5.0.1" }, "engines": { "node": ">=8" @@ -28785,6 +30206,31 @@ "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" }, + "node_modules/telejson": { + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/telejson/-/telejson-5.3.3.tgz", + "integrity": "sha512-PjqkJZpzEggA9TBpVtJi1LVptP7tYtXB6rEubwlHap76AMjzvOdKX41CxyaW7ahhzDU1aftXnMCx5kAPDZTQBA==", + "peer": true, + "dependencies": { + "@types/is-function": "^1.0.0", + "global": "^4.4.0", + "is-function": "^1.0.2", + "is-regex": "^1.1.2", + "is-symbol": "^1.0.3", + "isobject": "^4.0.0", + "lodash": "^4.17.21", + "memoizerific": "^1.11.3" + } + }, + "node_modules/telejson/node_modules/isobject": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-4.0.0.tgz", + "integrity": "sha512-S/2fF5wH8SJA/kmwr6HYhK/RI/OkhD84k8ntalo0iJjZikgq1XFvR5M8NPT1x5F7fBwCG3qHfnzeP/Vh/ZxCUA==", + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/tenacious-fetch": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/tenacious-fetch/-/tenacious-fetch-2.3.0.tgz", @@ -29320,6 +30766,21 @@ "resolved": "https://registry.npmjs.org/tryer/-/tryer-1.0.1.tgz", "integrity": "sha512-c3zayb8/kWWpycWYg87P71E1S1ZL6b6IJxfb5fvsUgsf0S2MVGaDhDXXjDMpdCpfWXqptc+4mXwmiy1ypXqRAA==" }, + "node_modules/ts-dedent": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/ts-dedent/-/ts-dedent-2.2.0.tgz", + "integrity": "sha512-q5W7tVM71e2xjHZTlgfTDoPF/SmqKG5hddq9SzR49CH2hayqRKJtQ4mtRlSxKaJlR/+9rEM+mnBHf7I2/BQcpQ==", + "peer": true, + "engines": { + "node": ">=6.10" + } + }, + "node_modules/ts-essentials": { + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/ts-essentials/-/ts-essentials-2.0.12.tgz", + "integrity": "sha512-3IVX4nI6B5cc31/GFFE+i8ey/N2eA0CZDbo6n0yrz0zDX8ZJ8djmU1p+XRz7G3is0F3bB3pu2pAroFdAWQKU3w==", + "peer": true + }, "node_modules/ts-invariant": { "version": "0.7.3", "resolved": "https://registry.npmjs.org/ts-invariant/-/ts-invariant-0.7.3.tgz", @@ -29409,6 +30870,14 @@ "node": "*" } }, + "node_modules/turndown": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/turndown/-/turndown-7.0.0.tgz", + "integrity": "sha512-G1FfxfR0mUNMeGjszLYl3kxtopC4O9DRRiMlMDDVHvU1jaBkGFg4qxIyjIk2aiKLHyDyZvZyu4qBO2guuYBy3Q==", + "dependencies": { + "domino": "^2.1.6" + } + }, "node_modules/tweetnacl": { "version": "0.14.5", "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", @@ -29729,6 +31198,49 @@ "node": ">=0.10.0" } }, + "node_modules/use-composed-ref": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/use-composed-ref/-/use-composed-ref-1.1.0.tgz", + "integrity": "sha512-my1lNHGWsSDAhhVAT4MKs6IjBUtG6ZG11uUqexPH9PptiIZDQOzaF4f5tEbJ2+7qvNbtXNBbU3SfmN+fXlWDhg==", + "peer": true, + "dependencies": { + "ts-essentials": "^2.0.3" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0" + } + }, + "node_modules/use-isomorphic-layout-effect": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/use-isomorphic-layout-effect/-/use-isomorphic-layout-effect-1.1.1.tgz", + "integrity": "sha512-L7Evj8FGcwo/wpbv/qvSfrkHFtOpCzvM5yl2KVyDJoylVuSvzphiiasmjgQPttIGBAy2WKiBNR98q8w7PiNgKQ==", + "peer": true, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/use-latest": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/use-latest/-/use-latest-1.2.0.tgz", + "integrity": "sha512-d2TEuG6nSLKQLAfW3By8mKr8HurOlTkul0sOpxbClIv4SQ4iOd7BYr7VIzdbktUCnv7dua/60xzd8igMU6jmyw==", + "peer": true, + "dependencies": { + "use-isomorphic-layout-effect": "^1.0.0" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, "node_modules/util": { "version": "0.10.3", "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", @@ -29835,6 +31347,12 @@ "resolved": "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.16.0.tgz", "integrity": "sha512-k8luDIWJWyenLc5ToFQQMaSrqCHiLwyKPHKPQZ5zz21vM+vIVUSvsRpcbiECH4WR88K2XZqc4ScRcZ7nk/jbeA==" }, + "node_modules/vue": { + "version": "2.6.14", + "resolved": "https://registry.npmjs.org/vue/-/vue-2.6.14.tgz", + "integrity": "sha512-x2284lgYvjOMj3Za7kqzRcUSxBboHqtgRE2zlos1qWaOye5yUmHn42LB1250NJBLRwEcdrB0JRwyPTEPhfQjiQ==", + "peer": true + }, "node_modules/w3c-hr-time": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz", @@ -31051,9 +32569,41 @@ "version": "0.8.15", "resolved": "https://registry.npmjs.org/zen-observable/-/zen-observable-0.8.15.tgz", "integrity": "sha512-PQ2PC7R9rslx84ndNBZB/Dkv8V8fZEpk83RLgXtYd0fwUgEjseMn1Dgajh2x6S8QbZAFa9p2qVCEuYZNgve0dQ==" + }, + "node_modules/zone.js": { + "version": "0.11.4", + "resolved": "https://registry.npmjs.org/zone.js/-/zone.js-0.11.4.tgz", + "integrity": "sha512-DDh2Ab+A/B+9mJyajPjHFPWfYU1H+pdun4wnnk0OcQTNjem1XQSZ2CDW+rfZEUDjv5M19SBqAkjZi0x5wuB5Qw==", + "peer": true, + "dependencies": { + "tslib": "^2.0.0" + } + }, + "node_modules/zone.js/node_modules/tslib": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz", + "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==", + "peer": true } }, "dependencies": { + "@angular/core": { + "version": "11.2.14", + "resolved": "https://registry.npmjs.org/@angular/core/-/core-11.2.14.tgz", + "integrity": "sha512-vpR4XqBGitk1Faph37CSpemwIYTmJ3pdIVNoHKP6jLonpWu+0azkchf0f7oD8/2ivj2F81opcIw0tcsy/D/5Vg==", + "peer": true, + "requires": { + "tslib": "^2.0.0" + }, + "dependencies": { + "tslib": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz", + "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==", + "peer": true + } + } + }, "@apollo/client": { "version": "3.3.13", "resolved": "https://registry.npmjs.org/@apollo/client/-/client-3.3.13.tgz", @@ -32259,9 +33809,9 @@ } }, "@babel/runtime": { - "version": "7.13.10", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.13.10.tgz", - "integrity": "sha512-4QPkjJq6Ns3V/RgpEahRk+AGfL0eO6RHHtTWoNNr5mO49G6B5+X6d6THgWEAvTrznU5xYpbAlVKRYcsCgh/Akw==", + "version": "7.16.3", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.16.3.tgz", + "integrity": "sha512-WBwekcqacdY2e9AF/Q7WLFUWmdJGJTkbjqTjoMDgXkVZ3ZRUvOPsLb5KdwISoQVsbP+DQzVZW4Zhci0DvpbNTQ==", "requires": { "regenerator-runtime": "^0.13.4" } @@ -32345,6 +33895,32 @@ "resolved": "https://registry.npmjs.org/@csstools/normalize.css/-/normalize.css-10.1.0.tgz", "integrity": "sha512-ij4wRiunFfaJxjB0BdrYHIH8FxBJpOwNPhhAcunlmPdXudL1WQV1qoP9un6JsEBAgQH+7UXyyjh0g7jTxXK6tg==" }, + "@devexpress/utils": { + "version": "1.3.13", + "resolved": "https://registry.npmjs.org/@devexpress/utils/-/utils-1.3.13.tgz", + "integrity": "sha512-DaTNDLcyepRegwKCWrikP+6WH0cY6/gVSLC/wd6o6AhuTpn6jrXEYcJm50+DwUSwAPVyoQcp6iYRTD1BdITrBQ==", + "requires": { + "tslib": "2.0.1" + }, + "dependencies": { + "tslib": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.0.1.tgz", + "integrity": "sha512-SgIkNheinmEBgx1IUNirK0TUD4X9yjjBRTqqjggWCU3pUEqIk3/Uwl3yRixYKT6WjQuGiwDv4NomL3wqRCj+CQ==" + } + } + }, + "@devextreme/runtime": { + "version": "2.3.13", + "resolved": "https://registry.npmjs.org/@devextreme/runtime/-/runtime-2.3.13.tgz", + "integrity": "sha512-J6c4ZbbIP8YSXC5UHaKQKNVNAmswS4cdagr4aOhh1qQMgYDv1mSq3SU6Djo6QiDnHXM86zfaOXaVjX6tWDl6Ig==", + "requires": { + "inferno": "^7.4.6", + "inferno-compat": "^7.4.6", + "inferno-create-element": "^7.4.6", + "inferno-hydrate": "^7.4.6" + } + }, "@emotion/cache": { "version": "10.0.29", "resolved": "https://registry.npmjs.org/@emotion/cache/-/cache-10.0.29.tgz", @@ -32421,6 +33997,45 @@ "resolved": "https://registry.npmjs.org/@emotion/sheet/-/sheet-0.9.4.tgz", "integrity": "sha512-zM9PFmgVSqBw4zL101Q0HrBVTGmpAxFZH/pYx/cjJT5advXguvcgjHFTCaIO3enL/xr89vK2bh0Mfyj9aa0ANA==" }, + "@emotion/styled": { + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/@emotion/styled/-/styled-10.3.0.tgz", + "integrity": "sha512-GgcUpXBBEU5ido+/p/mCT2/Xx+Oqmp9JzQRuC+a4lYM4i4LBBn/dWvc0rQ19N9ObA8/T4NWMrPNe79kMBDJqoQ==", + "peer": true, + "requires": { + "@emotion/styled-base": "^10.3.0", + "babel-plugin-emotion": "^10.0.27" + } + }, + "@emotion/styled-base": { + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/@emotion/styled-base/-/styled-base-10.3.0.tgz", + "integrity": "sha512-PBRqsVKR7QRNkmfH78hTSSwHWcwDpecH9W6heujWAcyp2wdz/64PP73s7fWS1dIPm8/Exc8JAzYS8dEWXjv60w==", + "peer": true, + "requires": { + "@babel/runtime": "^7.5.5", + "@emotion/is-prop-valid": "0.8.8", + "@emotion/serialize": "^0.11.15", + "@emotion/utils": "0.11.3" + }, + "dependencies": { + "@emotion/is-prop-valid": { + "version": "0.8.8", + "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-0.8.8.tgz", + "integrity": "sha512-u5WtneEAr5IDG2Wv65yhunPSMLIpuKsbuOktRojfrEiEvRyC85LgPMZI63cr7NUqT8ZIGdSVg8ZKGxIug4lXcA==", + "peer": true, + "requires": { + "@emotion/memoize": "0.7.4" + } + }, + "@emotion/memoize": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.7.4.tgz", + "integrity": "sha512-Ja/Vfqe3HpuzRsG1oBtWTHk2PGZ7GR+2Vz5iYGelAw8dx32K0y7PjVuxK6z1nMpZOqAFsRUPCkK1YjJ56qJlgw==", + "peer": true + } + } + }, "@emotion/stylis": { "version": "0.8.5", "resolved": "https://registry.npmjs.org/@emotion/stylis/-/stylis-0.8.5.tgz", @@ -35400,14 +37015,14 @@ } }, "@material-ui/core": { - "version": "4.11.3", - "resolved": "https://registry.npmjs.org/@material-ui/core/-/core-4.11.3.tgz", - "integrity": "sha512-Adt40rGW6Uds+cAyk3pVgcErpzU/qxc7KBR94jFHBYretU4AtWZltYcNsbeMn9tXL86jjVL1kuGcIHsgLgFGRw==", + "version": "4.12.2", + "resolved": "https://registry.npmjs.org/@material-ui/core/-/core-4.12.2.tgz", + "integrity": "sha512-Q1npB8V73IC+eV2X6as+g71MpEGQwqKHUI2iujY62npk35V8nMx/bUXAHjv5kKG1BZ8s8XUWoG6s/VkjYPjjQA==", "requires": { "@babel/runtime": "^7.4.4", - "@material-ui/styles": "^4.11.3", - "@material-ui/system": "^4.11.3", - "@material-ui/types": "^5.1.0", + "@material-ui/styles": "^4.11.4", + "@material-ui/system": "^4.12.1", + "@material-ui/types": "5.1.0", "@material-ui/utils": "^4.11.2", "@types/react-transition-group": "^4.2.0", "clsx": "^1.0.4", @@ -35452,9 +37067,9 @@ } }, "@material-ui/lab": { - "version": "4.0.0-alpha.58", - "resolved": "https://registry.npmjs.org/@material-ui/lab/-/lab-4.0.0-alpha.58.tgz", - "integrity": "sha512-GKHlJqLxUeHH3L3dGQ48ZavYrqGOTXkFkiEiuYMAnAvXAZP4rhMIqeHOPXSUQan4Bd8QnafDcpovOSLnadDmKw==", + "version": "4.0.0-alpha.60", + "resolved": "https://registry.npmjs.org/@material-ui/lab/-/lab-4.0.0-alpha.60.tgz", + "integrity": "sha512-fadlYsPJF+0fx2lRuyqAuJj7hAS1tLDdIEEdov5jlrpb5pp4b+mRDUqQTUxi4inRZHS1bEXpU8QWUhO6xX88aA==", "requires": { "@babel/runtime": "^7.4.4", "@material-ui/utils": "^4.11.2", @@ -35464,13 +37079,13 @@ } }, "@material-ui/styles": { - "version": "4.11.3", - "resolved": "https://registry.npmjs.org/@material-ui/styles/-/styles-4.11.3.tgz", - "integrity": "sha512-HzVzCG+PpgUGMUYEJ2rTEmQYeonGh41BYfILNFb/1ueqma+p1meSdu4RX6NjxYBMhf7k+jgfHFTTz+L1SXL/Zg==", + "version": "4.11.4", + "resolved": "https://registry.npmjs.org/@material-ui/styles/-/styles-4.11.4.tgz", + "integrity": "sha512-KNTIZcnj/zprG5LW0Sao7zw+yG3O35pviHzejMdcSGCdWbiO8qzRgOYL8JAxAsWBKOKYwVZxXtHWaB5T2Kvxew==", "requires": { "@babel/runtime": "^7.4.4", "@emotion/hash": "^0.8.0", - "@material-ui/types": "^5.1.0", + "@material-ui/types": "5.1.0", "@material-ui/utils": "^4.11.2", "clsx": "^1.0.4", "csstype": "^2.5.2", @@ -35487,9 +37102,9 @@ } }, "@material-ui/system": { - "version": "4.11.3", - "resolved": "https://registry.npmjs.org/@material-ui/system/-/system-4.11.3.tgz", - "integrity": "sha512-SY7otguNGol41Mu2Sg6KbBP1ZRFIbFLHGK81y4KYbsV2yIcaEPOmsCK6zwWlp+2yTV3J/VwT6oSBARtGIVdXPw==", + "version": "4.12.1", + "resolved": "https://registry.npmjs.org/@material-ui/system/-/system-4.12.1.tgz", + "integrity": "sha512-lUdzs4q9kEXZGhbN7BptyiS1rLNHe6kG9o8Y307HCvF4sQxbCgpL2qi+gUk+yI8a2DNk48gISEQxoxpgph0xIw==", "requires": { "@babel/runtime": "^7.4.4", "@material-ui/utils": "^4.11.2", @@ -35500,7 +37115,8 @@ "@material-ui/types": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/@material-ui/types/-/types-5.1.0.tgz", - "integrity": "sha512-7cqRjrY50b8QzRSYyhSpx4WRw2YuO0KKIGQEVk5J8uoz2BanawykgZGoWEqKm7pVIbzFDN0SpPcVV4IhOFkl8A==" + "integrity": "sha512-7cqRjrY50b8QzRSYyhSpx4WRw2YuO0KKIGQEVk5J8uoz2BanawykgZGoWEqKm7pVIbzFDN0SpPcVV4IhOFkl8A==", + "requires": {} }, "@material-ui/utils": { "version": "4.11.2", @@ -35550,11 +37166,503 @@ "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-1.1.3.tgz", "integrity": "sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw==" }, + "@popperjs/core": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.0.tgz", + "integrity": "sha512-zrsUxjLOKAzdewIDRWy9nsV1GQsKBCWaGwsZQlCgr6/q+vjyZhFgqedLfFBuI9anTPEUT4APq9Mu0SZBTzIcGQ==", + "peer": true + }, "@sheerun/mutationobserver-shim": { "version": "0.3.3", "resolved": "https://registry.npmjs.org/@sheerun/mutationobserver-shim/-/mutationobserver-shim-0.3.3.tgz", "integrity": "sha512-DetpxZw1fzPD5xUBrIAoplLChO2VB8DlL5Gg+I1IR9b2wPqYIca2WSUxL5g1vLeR4MsQq1NeWriXAVffV+U1Fw==" }, + "@storybook/addon-knobs": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/@storybook/addon-knobs/-/addon-knobs-6.4.0.tgz", + "integrity": "sha512-DiH1/5e2AFHoHrncl1qLu18ZHPHzRMMPvOLFz8AWvvmc+VCqTdIaE+tdxKr3e8rYylKllibgvDOzrLjfTNjF+Q==", + "requires": { + "copy-to-clipboard": "^3.3.1", + "core-js": "^3.8.2", + "escape-html": "^1.0.3", + "fast-deep-equal": "^3.1.3", + "global": "^4.4.0", + "lodash": "^4.17.20", + "prop-types": "^15.7.2", + "qs": "^6.10.0", + "react-colorful": "^5.1.2", + "react-lifecycles-compat": "^3.0.4", + "react-select": "^3.2.0" + }, + "dependencies": { + "core-js": { + "version": "3.19.3", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.19.3.tgz", + "integrity": "sha512-LeLBMgEGSsG7giquSzvgBrTS7V5UL6ks3eQlUSbN8dJStlLFiRzUm5iqsRyzUB8carhfKjkJ2vzKqE6z1Vga9g==" + }, + "qs": { + "version": "6.10.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.2.tgz", + "integrity": "sha512-mSIdjzqznWgfd4pMii7sHtaYF8rx8861hBO80SraY5GT0XQibWZWJSid0avzHGkDIZLImux2S5mXO0Hfct2QCw==", + "requires": { + "side-channel": "^1.0.4" + } + } + } + }, + "@storybook/addons": { + "version": "6.4.9", + "resolved": "https://registry.npmjs.org/@storybook/addons/-/addons-6.4.9.tgz", + "integrity": "sha512-y+oiN2zd+pbRWwkf6aQj4tPDFn+rQkrv7fiVoMxsYub+kKyZ3CNOuTSJH+A1A+eBL6DmzocChUyO6jvZFuh6Dg==", + "peer": true, + "requires": { + "@storybook/api": "6.4.9", + "@storybook/channels": "6.4.9", + "@storybook/client-logger": "6.4.9", + "@storybook/core-events": "6.4.9", + "@storybook/csf": "0.0.2--canary.87bc651.0", + "@storybook/router": "6.4.9", + "@storybook/theming": "6.4.9", + "@types/webpack-env": "^1.16.0", + "core-js": "^3.8.2", + "global": "^4.4.0", + "regenerator-runtime": "^0.13.7" + }, + "dependencies": { + "core-js": { + "version": "3.19.3", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.19.3.tgz", + "integrity": "sha512-LeLBMgEGSsG7giquSzvgBrTS7V5UL6ks3eQlUSbN8dJStlLFiRzUm5iqsRyzUB8carhfKjkJ2vzKqE6z1Vga9g==", + "peer": true + } + } + }, + "@storybook/api": { + "version": "6.4.9", + "resolved": "https://registry.npmjs.org/@storybook/api/-/api-6.4.9.tgz", + "integrity": "sha512-U+YKcDQg8xal9sE5eSMXB9vcqk8fD1pSyewyAjjbsW5hV0B3L3i4u7z/EAD9Ujbnor+Cvxq+XGvp+Qnc5Gd40A==", + "peer": true, + "requires": { + "@storybook/channels": "6.4.9", + "@storybook/client-logger": "6.4.9", + "@storybook/core-events": "6.4.9", + "@storybook/csf": "0.0.2--canary.87bc651.0", + "@storybook/router": "6.4.9", + "@storybook/semver": "^7.3.2", + "@storybook/theming": "6.4.9", + "core-js": "^3.8.2", + "fast-deep-equal": "^3.1.3", + "global": "^4.4.0", + "lodash": "^4.17.21", + "memoizerific": "^1.11.3", + "regenerator-runtime": "^0.13.7", + "store2": "^2.12.0", + "telejson": "^5.3.2", + "ts-dedent": "^2.0.0", + "util-deprecate": "^1.0.2" + }, + "dependencies": { + "core-js": { + "version": "3.19.3", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.19.3.tgz", + "integrity": "sha512-LeLBMgEGSsG7giquSzvgBrTS7V5UL6ks3eQlUSbN8dJStlLFiRzUm5iqsRyzUB8carhfKjkJ2vzKqE6z1Vga9g==", + "peer": true + } + } + }, + "@storybook/channels": { + "version": "6.4.9", + "resolved": "https://registry.npmjs.org/@storybook/channels/-/channels-6.4.9.tgz", + "integrity": "sha512-DNW1qDg+1WFS2aMdGh658WJXh8xBXliO5KAn0786DKcWCsKjfsPPQg/QCHczHK0+s5SZyzQT5aOBb4kTRHELQA==", + "peer": true, + "requires": { + "core-js": "^3.8.2", + "ts-dedent": "^2.0.0", + "util-deprecate": "^1.0.2" + }, + "dependencies": { + "core-js": { + "version": "3.19.3", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.19.3.tgz", + "integrity": "sha512-LeLBMgEGSsG7giquSzvgBrTS7V5UL6ks3eQlUSbN8dJStlLFiRzUm5iqsRyzUB8carhfKjkJ2vzKqE6z1Vga9g==", + "peer": true + } + } + }, + "@storybook/client-logger": { + "version": "6.4.9", + "resolved": "https://registry.npmjs.org/@storybook/client-logger/-/client-logger-6.4.9.tgz", + "integrity": "sha512-BVagmmHcuKDZ/XROADfN3tiolaDW2qG0iLmDhyV1gONnbGE6X5Qm19Jt2VYu3LvjKF1zMPSWm4mz7HtgdwKbuQ==", + "peer": true, + "requires": { + "core-js": "^3.8.2", + "global": "^4.4.0" + }, + "dependencies": { + "core-js": { + "version": "3.19.3", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.19.3.tgz", + "integrity": "sha512-LeLBMgEGSsG7giquSzvgBrTS7V5UL6ks3eQlUSbN8dJStlLFiRzUm5iqsRyzUB8carhfKjkJ2vzKqE6z1Vga9g==", + "peer": true + } + } + }, + "@storybook/components": { + "version": "6.4.9", + "resolved": "https://registry.npmjs.org/@storybook/components/-/components-6.4.9.tgz", + "integrity": "sha512-uOUR97S6kjptkMCh15pYNM1vAqFXtpyneuonmBco5vADJb3ds0n2a8NeVd+myIbhIXn55x0OHKiSwBH/u7swCQ==", + "peer": true, + "requires": { + "@popperjs/core": "^2.6.0", + "@storybook/client-logger": "6.4.9", + "@storybook/csf": "0.0.2--canary.87bc651.0", + "@storybook/theming": "6.4.9", + "@types/color-convert": "^2.0.0", + "@types/overlayscrollbars": "^1.12.0", + "@types/react-syntax-highlighter": "11.0.5", + "color-convert": "^2.0.1", + "core-js": "^3.8.2", + "fast-deep-equal": "^3.1.3", + "global": "^4.4.0", + "lodash": "^4.17.21", + "markdown-to-jsx": "^7.1.3", + "memoizerific": "^1.11.3", + "overlayscrollbars": "^1.13.1", + "polished": "^4.0.5", + "prop-types": "^15.7.2", + "react-colorful": "^5.1.2", + "react-popper-tooltip": "^3.1.1", + "react-syntax-highlighter": "^13.5.3", + "react-textarea-autosize": "^8.3.0", + "regenerator-runtime": "^0.13.7", + "ts-dedent": "^2.0.0", + "util-deprecate": "^1.0.2" + }, + "dependencies": { + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "peer": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "peer": true + }, + "core-js": { + "version": "3.19.3", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.19.3.tgz", + "integrity": "sha512-LeLBMgEGSsG7giquSzvgBrTS7V5UL6ks3eQlUSbN8dJStlLFiRzUm5iqsRyzUB8carhfKjkJ2vzKqE6z1Vga9g==", + "peer": true + }, + "hastscript": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/hastscript/-/hastscript-6.0.0.tgz", + "integrity": "sha512-nDM6bvd7lIqDUiYEiu5Sl/+6ReP0BMk/2f4U/Rooccxkj0P5nm+acM5PrGJ/t5I8qPGiqZSE6hVAwZEdZIvP4w==", + "peer": true, + "requires": { + "@types/hast": "^2.0.0", + "comma-separated-tokens": "^1.0.0", + "hast-util-parse-selector": "^2.0.0", + "property-information": "^5.0.0", + "space-separated-tokens": "^1.0.0" + } + }, + "highlight.js": { + "version": "10.7.3", + "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-10.7.3.tgz", + "integrity": "sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A==", + "peer": true + }, + "lowlight": { + "version": "1.20.0", + "resolved": "https://registry.npmjs.org/lowlight/-/lowlight-1.20.0.tgz", + "integrity": "sha512-8Ktj+prEb1RoCPkEOrPMYUN/nCggB7qAWe3a7OpMjWQkh3l2RD5wKRQ+o8Q8YuI9RG/xs95waaI/E6ym/7NsTw==", + "peer": true, + "requires": { + "fault": "^1.0.0", + "highlight.js": "~10.7.0" + } + }, + "parse-entities": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-2.0.0.tgz", + "integrity": "sha512-kkywGpCcRYhqQIchaWqZ875wzpS/bMKhz5HnN3p7wveJTkTtyAB/AlnS0f8DFSqYW1T82t6yEAkEcB+A1I3MbQ==", + "peer": true, + "requires": { + "character-entities": "^1.0.0", + "character-entities-legacy": "^1.0.0", + "character-reference-invalid": "^1.0.0", + "is-alphanumerical": "^1.0.0", + "is-decimal": "^1.0.0", + "is-hexadecimal": "^1.0.0" + } + }, + "prismjs": { + "version": "1.25.0", + "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.25.0.tgz", + "integrity": "sha512-WCjJHl1KEWbnkQom1+SzftbtXMKQoezOCYs5rECqMN+jP+apI7ftoflyqigqzopSO3hMhTEb0mFClA8lkolgEg==", + "peer": true + }, + "react-syntax-highlighter": { + "version": "13.5.3", + "resolved": "https://registry.npmjs.org/react-syntax-highlighter/-/react-syntax-highlighter-13.5.3.tgz", + "integrity": "sha512-crPaF+QGPeHNIblxxCdf2Lg936NAHKhNhuMzRL3F9ct6aYXL3NcZtCL0Rms9+qVo6Y1EQLdXGypBNSbPL/r+qg==", + "peer": true, + "requires": { + "@babel/runtime": "^7.3.1", + "highlight.js": "^10.1.1", + "lowlight": "^1.14.0", + "prismjs": "^1.21.0", + "refractor": "^3.1.0" + } + }, + "refractor": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/refractor/-/refractor-3.5.0.tgz", + "integrity": "sha512-QwPJd3ferTZ4cSPPjdP5bsYHMytwWYnAN5EEnLtGvkqp/FCCnGsBgxrm9EuIDnjUC3Uc/kETtvVi7fSIVC74Dg==", + "peer": true, + "requires": { + "hastscript": "^6.0.0", + "parse-entities": "^2.0.0", + "prismjs": "~1.25.0" + } + } + } + }, + "@storybook/core-events": { + "version": "6.4.9", + "resolved": "https://registry.npmjs.org/@storybook/core-events/-/core-events-6.4.9.tgz", + "integrity": "sha512-YhU2zJr6wzvh5naYYuy/0UKNJ/SaXu73sIr0Tx60ur3bL08XkRg7eZ9vBhNBTlAa35oZqI0iiGCh0ljiX7yEVQ==", + "peer": true, + "requires": { + "core-js": "^3.8.2" + }, + "dependencies": { + "core-js": { + "version": "3.19.3", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.19.3.tgz", + "integrity": "sha512-LeLBMgEGSsG7giquSzvgBrTS7V5UL6ks3eQlUSbN8dJStlLFiRzUm5iqsRyzUB8carhfKjkJ2vzKqE6z1Vga9g==", + "peer": true + } + } + }, + "@storybook/csf": { + "version": "0.0.2--canary.87bc651.0", + "resolved": "https://registry.npmjs.org/@storybook/csf/-/csf-0.0.2--canary.87bc651.0.tgz", + "integrity": "sha512-ajk1Uxa+rBpFQHKrCcTmJyQBXZ5slfwHVEaKlkuFaW77it8RgbPJp/ccna3sgoi8oZ7FkkOyvv1Ve4SmwFqRqw==", + "peer": true, + "requires": { + "lodash": "^4.17.15" + } + }, + "@storybook/router": { + "version": "6.4.9", + "resolved": "https://registry.npmjs.org/@storybook/router/-/router-6.4.9.tgz", + "integrity": "sha512-GT2KtVHo/mBjxDBFB5ZtVJVf8vC+3p5kRlQC4jao68caVp7H24ikPOkcY54VnQwwe4A1aXpGbJXUyTisEPFlhQ==", + "peer": true, + "requires": { + "@storybook/client-logger": "6.4.9", + "core-js": "^3.8.2", + "fast-deep-equal": "^3.1.3", + "global": "^4.4.0", + "history": "5.0.0", + "lodash": "^4.17.21", + "memoizerific": "^1.11.3", + "qs": "^6.10.0", + "react-router": "^6.0.0", + "react-router-dom": "^6.0.0", + "ts-dedent": "^2.0.0" + }, + "dependencies": { + "core-js": { + "version": "3.19.3", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.19.3.tgz", + "integrity": "sha512-LeLBMgEGSsG7giquSzvgBrTS7V5UL6ks3eQlUSbN8dJStlLFiRzUm5iqsRyzUB8carhfKjkJ2vzKqE6z1Vga9g==", + "peer": true + }, + "history": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/history/-/history-5.0.0.tgz", + "integrity": "sha512-3NyRMKIiFSJmIPdq7FxkNMJkQ7ZEtVblOQ38VtKaA0zZMW1Eo6Q6W8oDKEflr1kNNTItSnk4JMCO1deeSgbLLg==", + "peer": true, + "requires": { + "@babel/runtime": "^7.7.6" + } + }, + "qs": { + "version": "6.10.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.2.tgz", + "integrity": "sha512-mSIdjzqznWgfd4pMii7sHtaYF8rx8861hBO80SraY5GT0XQibWZWJSid0avzHGkDIZLImux2S5mXO0Hfct2QCw==", + "peer": true, + "requires": { + "side-channel": "^1.0.4" + } + }, + "react-router": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.0.2.tgz", + "integrity": "sha512-8/Wm3Ed8t7TuedXjAvV39+c8j0vwrI5qVsYqjFr5WkJjsJpEvNSoLRUbtqSEYzqaTUj1IV+sbPJxvO+accvU0Q==", + "peer": true, + "requires": { + "history": "^5.1.0" + }, + "dependencies": { + "history": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/history/-/history-5.1.0.tgz", + "integrity": "sha512-zPuQgPacm2vH2xdORvGGz1wQMuHSIB56yNAy5FnLuwOwgSYyPKptJtcMm6Ev+hRGeS+GzhbmRacHzvlESbFwDg==", + "peer": true, + "requires": { + "@babel/runtime": "^7.7.6" + } + } + } + }, + "react-router-dom": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.0.2.tgz", + "integrity": "sha512-cOpJ4B6raFutr0EG8O/M2fEoyQmwvZWomf1c6W2YXBZuFBx8oTk/zqjXghwScyhfrtnt0lANXV2182NQblRxFA==", + "peer": true, + "requires": { + "history": "^5.1.0", + "react-router": "6.0.2" + }, + "dependencies": { + "history": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/history/-/history-5.1.0.tgz", + "integrity": "sha512-zPuQgPacm2vH2xdORvGGz1wQMuHSIB56yNAy5FnLuwOwgSYyPKptJtcMm6Ev+hRGeS+GzhbmRacHzvlESbFwDg==", + "peer": true, + "requires": { + "@babel/runtime": "^7.7.6" + } + } + } + } + } + }, + "@storybook/semver": { + "version": "7.3.2", + "resolved": "https://registry.npmjs.org/@storybook/semver/-/semver-7.3.2.tgz", + "integrity": "sha512-SWeszlsiPsMI0Ps0jVNtH64cI5c0UF3f7KgjVKJoNP30crQ6wUSddY2hsdeczZXEKVJGEn50Q60flcGsQGIcrg==", + "peer": true, + "requires": { + "core-js": "^3.6.5", + "find-up": "^4.1.0" + }, + "dependencies": { + "core-js": { + "version": "3.19.3", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.19.3.tgz", + "integrity": "sha512-LeLBMgEGSsG7giquSzvgBrTS7V5UL6ks3eQlUSbN8dJStlLFiRzUm5iqsRyzUB8carhfKjkJ2vzKqE6z1Vga9g==", + "peer": true + }, + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "peer": true, + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "peer": true, + "requires": { + "p-locate": "^4.1.0" + } + }, + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "peer": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "peer": true, + "requires": { + "p-limit": "^2.2.0" + } + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "peer": true + }, + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "peer": true + } + } + }, + "@storybook/theming": { + "version": "6.4.9", + "resolved": "https://registry.npmjs.org/@storybook/theming/-/theming-6.4.9.tgz", + "integrity": "sha512-Do6GH6nKjxfnBg6djcIYAjss5FW9SRKASKxLYxX2RyWJBpz0m/8GfcGcRyORy0yFTk6jByA3Hs+WFH3GnEbWkw==", + "peer": true, + "requires": { + "@emotion/core": "^10.1.1", + "@emotion/is-prop-valid": "^0.8.6", + "@emotion/styled": "^10.0.27", + "@storybook/client-logger": "6.4.9", + "core-js": "^3.8.2", + "deep-object-diff": "^1.1.0", + "emotion-theming": "^10.0.27", + "global": "^4.4.0", + "memoizerific": "^1.11.3", + "polished": "^4.0.5", + "resolve-from": "^5.0.0", + "ts-dedent": "^2.0.0" + }, + "dependencies": { + "@emotion/is-prop-valid": { + "version": "0.8.8", + "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-0.8.8.tgz", + "integrity": "sha512-u5WtneEAr5IDG2Wv65yhunPSMLIpuKsbuOktRojfrEiEvRyC85LgPMZI63cr7NUqT8ZIGdSVg8ZKGxIug4lXcA==", + "peer": true, + "requires": { + "@emotion/memoize": "0.7.4" + } + }, + "@emotion/memoize": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.7.4.tgz", + "integrity": "sha512-Ja/Vfqe3HpuzRsG1oBtWTHk2PGZ7GR+2Vz5iYGelAw8dx32K0y7PjVuxK6z1nMpZOqAFsRUPCkK1YjJ56qJlgw==", + "peer": true + }, + "core-js": { + "version": "3.19.3", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.19.3.tgz", + "integrity": "sha512-LeLBMgEGSsG7giquSzvgBrTS7V5UL6ks3eQlUSbN8dJStlLFiRzUm5iqsRyzUB8carhfKjkJ2vzKqE6z1Vga9g==", + "peer": true + }, + "resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "peer": true + } + } + }, "@svgr/babel-plugin-add-jsx-attribute": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-4.2.0.tgz", @@ -35855,6 +37963,21 @@ "@babel/types": "^7.3.0" } }, + "@types/color-convert": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@types/color-convert/-/color-convert-2.0.0.tgz", + "integrity": "sha512-m7GG7IKKGuJUXvkZ1qqG3ChccdIM/qBBo913z+Xft0nKCX4hAU/IxKwZBU4cpRZ7GS5kV4vOblUkILtSShCPXQ==", + "peer": true, + "requires": { + "@types/color-name": "*" + } + }, + "@types/color-name": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.1.tgz", + "integrity": "sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==", + "peer": true + }, "@types/eslint-visitor-keys": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/@types/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz", @@ -35886,6 +38009,12 @@ "hoist-non-react-statics": "^3.3.0" } }, + "@types/is-function": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@types/is-function/-/is-function-1.0.1.tgz", + "integrity": "sha512-A79HEEiwXTFtfY+Bcbo58M2GRYzCr9itHWzbzHVFNEYCcoU/MMGwYYf721gBrnhpj1s6RGVVha/IgNFnR0Iw/Q==", + "peer": true + }, "@types/istanbul-lib-coverage": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.3.tgz", @@ -35929,6 +38058,12 @@ "resolved": "https://registry.npmjs.org/@types/node/-/node-14.14.37.tgz", "integrity": "sha512-XYmBiy+ohOR4Lh5jE379fV2IU+6Jn4g5qASinhitfyO71b/sCo6MKsMLF5tc7Zf2CE8hViVQyYSobJNke8OvUw==" }, + "@types/overlayscrollbars": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@types/overlayscrollbars/-/overlayscrollbars-1.12.1.tgz", + "integrity": "sha512-V25YHbSoKQN35UasHf0EKD9U2vcmexRSp78qa8UglxFH8H3D+adEa9zGZwrqpH4TdvqeMrgMqVqsLB4woAryrQ==", + "peer": true + }, "@types/parse-json": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", @@ -35988,6 +38123,15 @@ "redux": "^4.0.0" } }, + "@types/react-syntax-highlighter": { + "version": "11.0.5", + "resolved": "https://registry.npmjs.org/@types/react-syntax-highlighter/-/react-syntax-highlighter-11.0.5.tgz", + "integrity": "sha512-VIOi9i2Oj5XsmWWoB72p3KlZoEbdRAcechJa8Ztebw7bDl2YmR+odxIqhtJGp1q2EozHs02US+gzxJ9nuf56qg==", + "peer": true, + "requires": { + "@types/react": "*" + } + }, "@types/react-transition-group": { "version": "4.4.1", "resolved": "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.1.tgz", @@ -36114,6 +38258,12 @@ "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.3.tgz", "integrity": "sha512-FvUupuM3rlRsRtCN+fDudtmytGO6iHJuuRKS1Ss0pG5z8oX0diNEw94UEL7hgDbpN94rgaK5R7sWm6RrSkZuAQ==" }, + "@types/webpack-env": { + "version": "1.16.3", + "resolved": "https://registry.npmjs.org/@types/webpack-env/-/webpack-env-1.16.3.tgz", + "integrity": "sha512-9gtOPPkfyNoEqCQgx4qJKkuNm/x0R2hKR7fdl7zvTJyHnIisuE/LfvXOsYWL0o3qq6uiBnKZNNNzi3l0y/X+xw==", + "peer": true + }, "@types/yargs": { "version": "13.0.11", "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-13.0.11.tgz", @@ -36625,9 +38775,9 @@ "integrity": "sha1-gTWEAhliqenm/QOflA0S9WynhZ4=" }, "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" }, "ansi-styles": { "version": "3.2.1", @@ -37715,19 +39865,23 @@ } }, "bento-components": { - "version": "0.1.78", - "resolved": "https://registry.npmjs.org/bento-components/-/bento-components-0.1.78.tgz", - "integrity": "sha512-n+XDVcJhvoae/dbew2obJG+zQoSf09o8v894v+6DjBtu2gcyRWivxweIt4rLP6LA+uCd4j5/4ZIYfe6IkA+R+A==", + "version": "0.1.96", + "resolved": "https://registry.npmjs.org/bento-components/-/bento-components-0.1.96.tgz", + "integrity": "sha512-43ljFfJ/PA0XJCuTnq/RK+DMNJxrt9LUkQV3kPwS0mPV/oKC6ogVoTg9HIdJqeU/cqpOKLR7dY5wi5GJXwD+8w==", "requires": { "@babel/cli": "^7.10.5", "@babel/plugin-proposal-class-properties": "^7.10.4", "@babel/preset-env": "^7.11.0", "@babel/preset-react": "^7.10.4", + "@material-ui/lab": "*", + "@storybook/addon-knobs": "^6.3.1", "@testing-library/jest-dom": "^4.2.4", "@testing-library/react": "^9.3.2", "@testing-library/user-event": "^7.1.2", "classnames": "^2.2.6", "cross-env": "^7.0.2", + "devextreme": "^21.1.6", + "devextreme-react": "^21.1.6", "eslint-plugin-babel": "^5.3.1", "link-react": "^3.0.0", "lodash": "^4.17.20", @@ -37748,6 +39902,7 @@ "react-vis": "^1.11.7", "react-zoom-pan-pinch": "^1.6.1", "recharts": "^1.8.5", + "rimraf": "^2.6.3", "svg-url-loader": "^5.0.0", "uuid": "^8.3.1" }, @@ -39611,6 +41766,12 @@ "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=" }, + "deep-object-diff": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/deep-object-diff/-/deep-object-diff-1.1.0.tgz", + "integrity": "sha512-b+QLs5vHgS+IoSNcUE4n9HP2NwcHj7aqnJWsjPtuG75Rh5TOaGt0OjAYInh77d5T16V5cRDC+Pw/6ZZZiETBGw==", + "peer": true + }, "deepmerge": { "version": "4.2.2", "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz", @@ -39767,6 +41928,188 @@ } } }, + "devexpress-diagram": { + "version": "2.1.40", + "resolved": "https://registry.npmjs.org/devexpress-diagram/-/devexpress-diagram-2.1.40.tgz", + "integrity": "sha512-7SPHxVz06+zWtpMUeffK82qqE1uRgFhWeceLLQZ/3yA/wDYvr5NU6wA2UI1wZjTI/mGI+K3MhOlZV9wqPTjKVQ==", + "requires": { + "@devexpress/utils": "1.3.13", + "es6-object-assign": "^1.1.0" + } + }, + "devexpress-gantt": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/devexpress-gantt/-/devexpress-gantt-4.0.0.tgz", + "integrity": "sha512-mL1Qa+XSt5GEdKlJQZg5VfvdVgH0IMRaS73HDIXJCZrDNzk3RL1LEhauyqiCSA8K+znqBqCyAJf6EaaXGpOPgA==", + "requires": { + "@devexpress/utils": "1.3.2", + "tslib": "2.3.1" + }, + "dependencies": { + "@devexpress/utils": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@devexpress/utils/-/utils-1.3.2.tgz", + "integrity": "sha512-Ii7hpz6ItNMLKz23qQOlHom/k0e1TSnIQKCwZlKuYBwpIEBX5I/PQxvAwbdBnu5EZZSkdjnhzxl6luhl/k4LdA==", + "requires": { + "tslib": "2.0.1" + }, + "dependencies": { + "tslib": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.0.1.tgz", + "integrity": "sha512-SgIkNheinmEBgx1IUNirK0TUD4X9yjjBRTqqjggWCU3pUEqIk3/Uwl3yRixYKT6WjQuGiwDv4NomL3wqRCj+CQ==" + } + } + }, + "tslib": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz", + "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==" + } + } + }, + "devextreme": { + "version": "21.2.4", + "resolved": "https://registry.npmjs.org/devextreme/-/devextreme-21.2.4.tgz", + "integrity": "sha512-edu19T80Wr6+cIz9Vk8rlCKzWiOZSHtak/a0paGmXuUaViIcBJA18wHw+9XpcEDlUj6T2yivTdeYx0tZ8O6IxA==", + "requires": { + "@babel/runtime": "^7.12.1", + "@devextreme/runtime": "2.3.13", + "devexpress-diagram": "2.1.40", + "devexpress-gantt": "4.0.0", + "devextreme-quill": "~1.5.7", + "devextreme-showdown": "^1.0.1", + "inferno": "^7.4.9", + "inferno-compat": "^7.4.9", + "inferno-create-element": "^7.4.9", + "inferno-hydrate": "^7.4.9", + "jszip": "^3.7.1", + "rrule": "2.6.6", + "turndown": "~7.0.0" + } + }, + "devextreme-quill": { + "version": "1.5.7", + "resolved": "https://registry.npmjs.org/devextreme-quill/-/devextreme-quill-1.5.7.tgz", + "integrity": "sha512-QY1sERl1avqqS3pjH4GRMevrL7LMDZiV6+rv7wXU+9n0f1ZqN/LUXME3r9rRxB4osUTDjVeh9GPodiAIEgmA/g==", + "requires": { + "core-js": "^3.19.1", + "eventemitter3": "^4.0.0", + "lodash.clonedeep": "^4.5.0", + "lodash.isequal": "^4.5.0", + "lodash.merge": "^4.5.0", + "parchment": "2.0.0-dev.2", + "quill-delta": "4.2.2" + }, + "dependencies": { + "core-js": { + "version": "3.19.3", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.19.3.tgz", + "integrity": "sha512-LeLBMgEGSsG7giquSzvgBrTS7V5UL6ks3eQlUSbN8dJStlLFiRzUm5iqsRyzUB8carhfKjkJ2vzKqE6z1Vga9g==" + }, + "eventemitter3": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==" + } + } + }, + "devextreme-react": { + "version": "21.2.4", + "resolved": "https://registry.npmjs.org/devextreme-react/-/devextreme-react-21.2.4.tgz", + "integrity": "sha512-9Vpt2iaTLWPZOun+8gq3yD2QKYy5XdzKoOduiwMR0PoHC5uvKyU17CDwzHeETk1CZ7Qx/YX0ZVG76x4eySjoIg==", + "requires": { + "prop-types": "^15.6.1" + } + }, + "devextreme-showdown": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/devextreme-showdown/-/devextreme-showdown-1.0.1.tgz", + "integrity": "sha512-63zsdU3iGDp0E9TibxGwZPlS+l07/VvD/mlgZY30fEqz6J2kCsYCqyNKbhlgIvuz+yMtWcUXVYVOMpA2YBTgEg==", + "requires": { + "yargs": "^17.2.1" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "requires": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==" + }, + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "requires": { + "ansi-regex": "^5.0.1" + } + }, + "wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + } + }, + "y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==" + }, + "yargs": { + "version": "17.3.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.3.0.tgz", + "integrity": "sha512-GQl1pWyDoGptFPJx9b9L6kmR33TGusZvXIZUT+BOz9f7X2L94oeAskFYLEg/FkhV06zZPBYLvLZRWeYId29lew==", + "requires": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.0.0" + } + }, + "yargs-parser": { + "version": "21.0.0", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.0.0.tgz", + "integrity": "sha512-z9kApYUOCwoeZ78rfRYYWdiU/iNL6mwwYlkkZfJoyMR1xps+NEBX5X7XmRpxkZHhXJ6+Ey00IwKxBBSW9FIjyA==" + } + } + }, "diff": { "version": "3.5.0", "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", @@ -39909,6 +42252,11 @@ "domelementtype": "1" } }, + "domino": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/domino/-/domino-2.1.6.tgz", + "integrity": "sha512-3VdM/SXBZX2omc9JF9nOPCtDaYQ67BGp5CoLpIQlO2KCAPETs8TcDHacF26jXadGbvUteZzRTeos2fhID5+ucQ==" + }, "dompurify": { "version": "2.2.9", "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-2.2.9.tgz", @@ -40061,6 +42409,17 @@ "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==" }, + "emotion-theming": { + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/emotion-theming/-/emotion-theming-10.3.0.tgz", + "integrity": "sha512-mXiD2Oj7N9b6+h/dC6oLf9hwxbtKHQjoIqtodEyL8CpkN4F3V4IK/BT4D0C7zSs4BBFOu4UlPJbvvBLa88SGEA==", + "peer": true, + "requires": { + "@babel/runtime": "^7.5.5", + "@emotion/weak-memoize": "0.2.5", + "hoist-non-react-statics": "^3.3.0" + } + }, "encodeurl": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", @@ -40187,6 +42546,11 @@ "es6-symbol": "^3.1.1" } }, + "es6-object-assign": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/es6-object-assign/-/es6-object-assign-1.1.0.tgz", + "integrity": "sha1-wsNYJlYkfDnqEHyx5mUrb58kUjw=" + }, "es6-promisify": { "version": "6.1.1", "resolved": "https://registry.npmjs.org/es6-promisify/-/es6-promisify-6.1.1.tgz", @@ -41104,6 +43468,11 @@ "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" }, + "fast-diff": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.2.0.tgz", + "integrity": "sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==" + }, "fast-glob": { "version": "2.2.7", "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-2.2.7.tgz", @@ -42564,6 +44933,11 @@ "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==" }, + "immediate": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", + "integrity": "sha1-nbHb0Pr43m++D13V5Wu2BigN5ps=" + }, "immer": { "version": "1.10.0", "resolved": "https://registry.npmjs.org/immer/-/immer-1.10.0.tgz", @@ -42638,6 +45012,78 @@ "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==" }, + "inferno": { + "version": "7.4.11", + "resolved": "https://registry.npmjs.org/inferno/-/inferno-7.4.11.tgz", + "integrity": "sha512-N+cs33ESWI8fdToCd98yMRYl7jkLnCkJskxov3FKKlaKOvk3PRlAttbhmUaYdWXlRvt2WeXi+J4MbzNj3V6G0w==", + "requires": { + "inferno-shared": "7.4.11", + "inferno-vnode-flags": "7.4.11", + "opencollective-postinstall": "^2.0.3" + } + }, + "inferno-clone-vnode": { + "version": "7.4.11", + "resolved": "https://registry.npmjs.org/inferno-clone-vnode/-/inferno-clone-vnode-7.4.11.tgz", + "integrity": "sha512-6/newyzWO/lrwcA9q5DBAfslccPWqhpgrDQg/wWiHKZwRBe1kJjtiALsR+/1wLq1Z+YO3L1MPnlEnFu+nltUbA==", + "requires": { + "inferno": "7.4.11" + } + }, + "inferno-compat": { + "version": "7.4.11", + "resolved": "https://registry.npmjs.org/inferno-compat/-/inferno-compat-7.4.11.tgz", + "integrity": "sha512-gaF5yL6CpN1DckVzMN/eiPZqlkWIMjWtr6BCBJbpUF+hXE5bJ60xNrtTFNsu2ChbYtO96UPqUNfC2VBRMz+k9Q==", + "requires": { + "inferno": "7.4.11", + "inferno-clone-vnode": "7.4.11", + "inferno-create-class": "7.4.11", + "inferno-create-element": "7.4.11", + "inferno-extras": "7.4.11" + } + }, + "inferno-create-class": { + "version": "7.4.11", + "resolved": "https://registry.npmjs.org/inferno-create-class/-/inferno-create-class-7.4.11.tgz", + "integrity": "sha512-03Z3Az7xOnMHq39QxMqns0NwOt8b7gW+fu50iKK4bRkgEy8Zaa5TH8hYDJ7dAwzDR6BbQ6kCyTXfVPPeQShdvA==", + "requires": { + "inferno": "7.4.11" + } + }, + "inferno-create-element": { + "version": "7.4.11", + "resolved": "https://registry.npmjs.org/inferno-create-element/-/inferno-create-element-7.4.11.tgz", + "integrity": "sha512-kE6XIx2hPAd5qpDli2iGjNXgubvuyxdLvoiW71WnSzIIxA+Uxa/s8lY8m03VyHHVypFV3n329ZY5dFvKc7UQMg==", + "requires": { + "inferno": "7.4.11" + } + }, + "inferno-extras": { + "version": "7.4.11", + "resolved": "https://registry.npmjs.org/inferno-extras/-/inferno-extras-7.4.11.tgz", + "integrity": "sha512-JS/irXQozH98zVDx7TEdhzPoRxVBrNFrDjZwQeZMV4wKEh1fqwSh4OBjlhBX6J4u+7UhZoGxx0KqlH1nky+fNQ==", + "requires": { + "inferno": "7.4.11" + } + }, + "inferno-hydrate": { + "version": "7.4.11", + "resolved": "https://registry.npmjs.org/inferno-hydrate/-/inferno-hydrate-7.4.11.tgz", + "integrity": "sha512-hF9Ke4GHAkj8GQrMXBZPfsUqhq6WjkoDCAfXhPBuF1Wiceqyy8KerOOXEnuocHky77fuEXq0AzVnQcC064Bkfw==", + "requires": { + "inferno": "7.4.11" + } + }, + "inferno-shared": { + "version": "7.4.11", + "resolved": "https://registry.npmjs.org/inferno-shared/-/inferno-shared-7.4.11.tgz", + "integrity": "sha512-pN725bDSTxkQmRS3e/3H02/xAqgHl+xgddCMjPm8M0etRdRcVCisi3NGPhzSbDDmiftrxhY31exs7+dwsngcDA==" + }, + "inferno-vnode-flags": { + "version": "7.4.11", + "resolved": "https://registry.npmjs.org/inferno-vnode-flags/-/inferno-vnode-flags-7.4.11.tgz", + "integrity": "sha512-L7lslEQCq3IfwgT/b9zhuMf8fv6KXCNXXHZevk/WYxnqJsOWGDcKpJn0zkzXfvmj0otbB149iLUQVBq3oe2sfA==" + }, "inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", @@ -42974,6 +45420,12 @@ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" }, + "is-function": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-function/-/is-function-1.0.2.tgz", + "integrity": "sha512-lw7DUp0aWXYg+CBCN+JKkcE0Q2RayZnSvnZBlwgxHBQhqt5pZNVy4Ri7H9GmmXkdu7LUthszM+Tor1u/2iBcpQ==", + "peer": true + }, "is-generator-fn": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-1.0.0.tgz", @@ -44832,6 +47284,17 @@ "object.assign": "^4.1.2" } }, + "jszip": { + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.7.1.tgz", + "integrity": "sha512-ghL0tz1XG9ZEmRMcEN2vt7xabrDdqHHeykgARpmZ0BiIctWxM47Vt63ZO2dnp4QYt/xJVLLy5Zv1l/xRdh2byg==", + "requires": { + "lie": "~3.3.0", + "pako": "~1.0.2", + "readable-stream": "~2.3.6", + "set-immediate-shim": "~1.0.1" + } + }, "keycode": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/keycode/-/keycode-2.2.0.tgz", @@ -44926,6 +47389,14 @@ "type-check": "~0.3.2" } }, + "lie": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/lie/-/lie-3.3.0.tgz", + "integrity": "sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==", + "requires": { + "immediate": "~3.0.5" + } + }, "line-awesome": { "version": "git+ssh://git@github.com/icons8/line-awesome.git#a60f11367584e7df157277b5ab9d1654ec91ae24", "from": "line-awesome@github:icons8/line-awesome" @@ -45210,6 +47681,12 @@ "yallist": "^3.0.2" } }, + "luxon": { + "version": "1.28.0", + "resolved": "https://registry.npmjs.org/luxon/-/luxon-1.28.0.tgz", + "integrity": "sha512-TfTiyvZhwBYM/7QdAVDh+7dBTBA29v4ik0Ce9zda3Mnf8on1S5KJI8P2jKFZ8+5C0jhmr0KwJEO/Wdpm0VeWJQ==", + "optional": true + }, "make-dir": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", @@ -45245,6 +47722,12 @@ "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=" }, + "map-or-similar": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/map-or-similar/-/map-or-similar-1.5.0.tgz", + "integrity": "sha1-beJlMXSt+12e3DPGnT6Sobdvrwg=", + "peer": true + }, "map-visit": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", @@ -45272,6 +47755,13 @@ } } }, + "markdown-to-jsx": { + "version": "7.1.5", + "resolved": "https://registry.npmjs.org/markdown-to-jsx/-/markdown-to-jsx-7.1.5.tgz", + "integrity": "sha512-YQEMMMCX3PYOWtUAQu8Fmz5/sH09s17eyQnDubwaAo8sWmnRTT1og96EFv1vL59l4nWfmtF3L91pqkuheVqRlA==", + "peer": true, + "requires": {} + }, "material-colors": { "version": "1.2.6", "resolved": "https://registry.npmjs.org/material-colors/-/material-colors-1.2.6.tgz", @@ -45337,6 +47827,15 @@ "resolved": "https://registry.npmjs.org/memoize-one/-/memoize-one-5.1.1.tgz", "integrity": "sha512-HKeeBpWvqiVJD57ZUAsJNm71eHTykffzcLZVYWiVfQeI1rJtuEaS7hQiEpWfVVk18donPwJEcFKIkCmPJNOhHA==" }, + "memoizerific": { + "version": "1.11.3", + "resolved": "https://registry.npmjs.org/memoizerific/-/memoizerific-1.11.3.tgz", + "integrity": "sha1-fIekZGREwy11Q4VwkF8tvRsagFo=", + "peer": true, + "requires": { + "map-or-similar": "^1.5.0" + } + }, "memory-fs": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz", @@ -46230,6 +48729,11 @@ } } }, + "opencollective-postinstall": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/opencollective-postinstall/-/opencollective-postinstall-2.0.3.tgz", + "integrity": "sha512-8AV/sCtuzUeTo8gQK5qDZzARrulB3egtLzFgteqB2tcT4Mw7B8Kt7JcDHmltjz6FOAHsvTevk70gZEbhM4ZS9Q==" + }, "opn": { "version": "5.4.0", "resolved": "https://registry.npmjs.org/opn/-/opn-5.4.0.tgz", @@ -46302,6 +48806,12 @@ "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=" }, + "overlayscrollbars": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/overlayscrollbars/-/overlayscrollbars-1.13.1.tgz", + "integrity": "sha512-gIQfzgGgu1wy80EB4/6DaJGHMEGmizq27xHIESrzXq0Y/J0Ay1P3DWk6tuVmEPIZH15zaBlxeEJOqdJKmowHCQ==", + "peer": true + }, "p-defer": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz", @@ -46387,6 +48897,11 @@ "no-case": "^2.2.0" } }, + "parchment": { + "version": "2.0.0-dev.2", + "resolved": "https://registry.npmjs.org/parchment/-/parchment-2.0.0-dev.2.tgz", + "integrity": "sha512-4fgRny4pPISoML08Zp7poi52Dff3E2G1ORTi2D/acJ/RiROdDAMDB6VcQNfBcmehrX5Wixp6dxh6JjLyE5yUNQ==" + }, "parent-module": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", @@ -46650,6 +49165,15 @@ "ts-pnp": "^1.0.0" } }, + "polished": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/polished/-/polished-4.1.3.tgz", + "integrity": "sha512-ocPAcVBUOryJEKe0z2KLd1l9EBa1r5mSwlKpExmrLzsnIzJo4axsoU9O2BjOTkDGDT4mZ0WFE5XKTlR3nLnZOA==", + "peer": true, + "requires": { + "@babel/runtime": "^7.14.0" + } + }, "popper.js": { "version": "1.16.1-lts", "resolved": "https://registry.npmjs.org/popper.js/-/popper.js-1.16.1-lts.tgz", @@ -49252,6 +51776,16 @@ "resolved": "https://registry.npmjs.org/quickselect/-/quickselect-2.0.0.tgz", "integrity": "sha512-RKJ22hX8mHe3Y6wH/N3wCM6BWtjaxIyyUIkpHOvfFnxdI4yD4tBXEBKSbriGujF6jnSVkJrffuo6vxACiSSxIw==" }, + "quill-delta": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/quill-delta/-/quill-delta-4.2.2.tgz", + "integrity": "sha512-qjbn82b/yJzOjstBgkhtBjN2TNK+ZHP/BgUQO+j6bRhWQQdmj2lH6hXG7+nwwLF41Xgn//7/83lxs9n2BkTtTg==", + "requires": { + "fast-diff": "1.2.0", + "lodash.clonedeep": "^4.5.0", + "lodash.isequal": "^4.5.0" + } + }, "raf": { "version": "3.4.1", "resolved": "https://registry.npmjs.org/raf/-/raf-3.4.1.tgz", @@ -49412,6 +51946,12 @@ "tinycolor2": "^1.4.1" } }, + "react-colorful": { + "version": "5.5.1", + "resolved": "https://registry.npmjs.org/react-colorful/-/react-colorful-5.5.1.tgz", + "integrity": "sha512-M1TJH2X3RXEt12sWkpa6hLc/bbYS0H6F4rIqjQZ+RxNBstpY67d9TrFXtqdZwhpmBXcCwEi7stKqFue3ZRkiOg==", + "requires": {} + }, "react-d3-axis": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/react-d3-axis/-/react-d3-axis-0.1.2.tgz", @@ -49722,6 +52262,20 @@ "warning": "^4.0.1" } }, + "react-fast-compare": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/react-fast-compare/-/react-fast-compare-3.2.0.tgz", + "integrity": "sha512-rtGImPZ0YyLrscKI9xTpV8psd6I8VAtjKCzQDlzyDvqJA8XOW78TXYQwNRNd8g8JZnDu8q9Fu/1v4HPAVwVdHA==", + "peer": true + }, + "react-input-autosize": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/react-input-autosize/-/react-input-autosize-3.0.0.tgz", + "integrity": "sha512-nL9uS7jEs/zu8sqwFE5MAPx6pPkNAriACQ2rGLlqmKr2sPGtN7TXTyDdQt4lbNXVx7Uzadb40x8qotIuru6Rhg==", + "requires": { + "prop-types": "^15.5.8" + } + }, "react-intersection-observer": { "version": "8.32.0", "resolved": "https://registry.npmjs.org/react-intersection-observer/-/react-intersection-observer-8.32.0.tgz", @@ -49797,6 +52351,27 @@ } } }, + "react-popper": { + "version": "2.2.5", + "resolved": "https://registry.npmjs.org/react-popper/-/react-popper-2.2.5.tgz", + "integrity": "sha512-kxGkS80eQGtLl18+uig1UIf9MKixFSyPxglsgLBxlYnyDf65BiY9B3nZSc6C9XUNDgStROB0fMQlTEz1KxGddw==", + "peer": true, + "requires": { + "react-fast-compare": "^3.0.1", + "warning": "^4.0.2" + } + }, + "react-popper-tooltip": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/react-popper-tooltip/-/react-popper-tooltip-3.1.1.tgz", + "integrity": "sha512-EnERAnnKRptQBJyaee5GJScWNUKQPDD2ywvzZyUjst/wj5U64C8/CnSYLNEmP2hG0IJ3ZhtDxE8oDN+KOyavXQ==", + "peer": true, + "requires": { + "@babel/runtime": "^7.12.5", + "@popperjs/core": "^2.5.4", + "react-popper": "^2.2.4" + } + }, "react-redux": { "version": "7.2.3", "resolved": "https://registry.npmjs.org/react-redux/-/react-redux-7.2.3.tgz", @@ -52738,6 +55313,21 @@ "prop-types": "^15.7.2" } }, + "react-select": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/react-select/-/react-select-3.2.0.tgz", + "integrity": "sha512-B/q3TnCZXEKItO0fFN/I0tWOX3WJvi/X2wtdffmwSQVRwg5BpValScTO1vdic9AxlUgmeSzib2hAZAwIUQUZGQ==", + "requires": { + "@babel/runtime": "^7.4.4", + "@emotion/cache": "^10.0.9", + "@emotion/core": "^10.0.9", + "@emotion/css": "^10.0.9", + "memoize-one": "^5.0.0", + "prop-types": "^15.6.0", + "react-input-autosize": "^3.0.0", + "react-transition-group": "^4.3.0" + } + }, "react-simple-code-editor": { "version": "0.9.3", "resolved": "https://registry.npmjs.org/react-simple-code-editor/-/react-simple-code-editor-0.9.3.tgz", @@ -52878,6 +55468,17 @@ "refractor": "^2.4.1" } }, + "react-textarea-autosize": { + "version": "8.3.3", + "resolved": "https://registry.npmjs.org/react-textarea-autosize/-/react-textarea-autosize-8.3.3.tgz", + "integrity": "sha512-2XlHXK2TDxS6vbQaoPbMOfQ8GK7+irc2fVK6QFIcC8GOnH3zI/v481n+j1L0WaPVvKxwesnY93fEfH++sus2rQ==", + "peer": true, + "requires": { + "@babel/runtime": "^7.10.2", + "use-composed-ref": "^1.0.0", + "use-latest": "^1.0.0" + } + }, "react-to-print": { "version": "2.12.6", "resolved": "https://registry.npmjs.org/react-to-print/-/react-to-print-2.12.6.tgz", @@ -53202,6 +55803,12 @@ } } }, + "redux-devtools-extension": { + "version": "2.13.9", + "resolved": "https://registry.npmjs.org/redux-devtools-extension/-/redux-devtools-extension-2.13.9.tgz", + "integrity": "sha512-cNJ8Q/EtjhQaZ71c8I9+BPySIBVEKssbPpskBfsXqb8HJ002A3KRVHfeRzwRo6mGPqsm7XuHTqNSNeS1Khig0A==", + "requires": {} + }, "redux-logger": { "version": "3.0.6", "resolved": "https://registry.npmjs.org/redux-logger/-/redux-logger-3.0.6.tgz", @@ -53637,6 +56244,15 @@ "inherits": "^2.0.1" } }, + "rrule": { + "version": "2.6.6", + "resolved": "https://registry.npmjs.org/rrule/-/rrule-2.6.6.tgz", + "integrity": "sha512-h6tb/hRo9SNv8xKjcvsEfdmhXvElMXsU3Yz0KmqMehUqxP6a4Qjmth2EuL1FsjdawADjajLS0eBbWfsZzn3SIw==", + "requires": { + "luxon": "^1.21.3", + "tslib": "^1.10.0" + } + }, "rsvp": { "version": "3.6.2", "resolved": "https://registry.npmjs.org/rsvp/-/rsvp-3.6.2.tgz", @@ -53949,6 +56565,11 @@ "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" }, + "set-immediate-shim": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz", + "integrity": "sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E=" + }, "set-value": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", @@ -54520,6 +57141,12 @@ "resolved": "https://registry.npmjs.org/stealthy-require/-/stealthy-require-1.1.1.tgz", "integrity": "sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks=" }, + "store2": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/store2/-/store2-2.12.0.tgz", + "integrity": "sha512-7t+/wpKLanLzSnQPX8WAcuLCCeuSHoWdQuh9SB3xD0kNOM38DNf+0Oa+wmvxmYueRzkmh6IcdKFtvTa+ecgPDw==", + "peer": true + }, "stream-browserify": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.2.tgz", @@ -54593,13 +57220,13 @@ } }, "string-width": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", - "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "requires": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.0" + "strip-ansi": "^6.0.1" }, "dependencies": { "emoji-regex": { @@ -54608,11 +57235,11 @@ "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" }, "strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "requires": { - "ansi-regex": "^5.0.0" + "ansi-regex": "^5.0.1" } } } @@ -55001,6 +57628,30 @@ } } }, + "telejson": { + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/telejson/-/telejson-5.3.3.tgz", + "integrity": "sha512-PjqkJZpzEggA9TBpVtJi1LVptP7tYtXB6rEubwlHap76AMjzvOdKX41CxyaW7ahhzDU1aftXnMCx5kAPDZTQBA==", + "peer": true, + "requires": { + "@types/is-function": "^1.0.0", + "global": "^4.4.0", + "is-function": "^1.0.2", + "is-regex": "^1.1.2", + "is-symbol": "^1.0.3", + "isobject": "^4.0.0", + "lodash": "^4.17.21", + "memoizerific": "^1.11.3" + }, + "dependencies": { + "isobject": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-4.0.0.tgz", + "integrity": "sha512-S/2fF5wH8SJA/kmwr6HYhK/RI/OkhD84k8ntalo0iJjZikgq1XFvR5M8NPT1x5F7fBwCG3qHfnzeP/Vh/ZxCUA==", + "peer": true + } + } + }, "tenacious-fetch": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/tenacious-fetch/-/tenacious-fetch-2.3.0.tgz", @@ -55432,6 +58083,18 @@ "resolved": "https://registry.npmjs.org/tryer/-/tryer-1.0.1.tgz", "integrity": "sha512-c3zayb8/kWWpycWYg87P71E1S1ZL6b6IJxfb5fvsUgsf0S2MVGaDhDXXjDMpdCpfWXqptc+4mXwmiy1ypXqRAA==" }, + "ts-dedent": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/ts-dedent/-/ts-dedent-2.2.0.tgz", + "integrity": "sha512-q5W7tVM71e2xjHZTlgfTDoPF/SmqKG5hddq9SzR49CH2hayqRKJtQ4mtRlSxKaJlR/+9rEM+mnBHf7I2/BQcpQ==", + "peer": true + }, + "ts-essentials": { + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/ts-essentials/-/ts-essentials-2.0.12.tgz", + "integrity": "sha512-3IVX4nI6B5cc31/GFFE+i8ey/N2eA0CZDbo6n0yrz0zDX8ZJ8djmU1p+XRz7G3is0F3bB3pu2pAroFdAWQKU3w==", + "peer": true + }, "ts-invariant": { "version": "0.7.3", "resolved": "https://registry.npmjs.org/ts-invariant/-/ts-invariant-0.7.3.tgz", @@ -55507,6 +58170,14 @@ "safe-buffer": "^5.0.1" } }, + "turndown": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/turndown/-/turndown-7.0.0.tgz", + "integrity": "sha512-G1FfxfR0mUNMeGjszLYl3kxtopC4O9DRRiMlMDDVHvU1jaBkGFg4qxIyjIk2aiKLHyDyZvZyu4qBO2guuYBy3Q==", + "requires": { + "domino": "^2.1.6" + } + }, "tweetnacl": { "version": "0.14.5", "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", @@ -55771,6 +58442,31 @@ "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==" }, + "use-composed-ref": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/use-composed-ref/-/use-composed-ref-1.1.0.tgz", + "integrity": "sha512-my1lNHGWsSDAhhVAT4MKs6IjBUtG6ZG11uUqexPH9PptiIZDQOzaF4f5tEbJ2+7qvNbtXNBbU3SfmN+fXlWDhg==", + "peer": true, + "requires": { + "ts-essentials": "^2.0.3" + } + }, + "use-isomorphic-layout-effect": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/use-isomorphic-layout-effect/-/use-isomorphic-layout-effect-1.1.1.tgz", + "integrity": "sha512-L7Evj8FGcwo/wpbv/qvSfrkHFtOpCzvM5yl2KVyDJoylVuSvzphiiasmjgQPttIGBAy2WKiBNR98q8w7PiNgKQ==", + "peer": true, + "requires": {} + }, + "use-latest": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/use-latest/-/use-latest-1.2.0.tgz", + "integrity": "sha512-d2TEuG6nSLKQLAfW3By8mKr8HurOlTkul0sOpxbClIv4SQ4iOd7BYr7VIzdbktUCnv7dua/60xzd8igMU6jmyw==", + "peer": true, + "requires": { + "use-isomorphic-layout-effect": "^1.0.0" + } + }, "util": { "version": "0.10.3", "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", @@ -55867,6 +58563,12 @@ "resolved": "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.16.0.tgz", "integrity": "sha512-k8luDIWJWyenLc5ToFQQMaSrqCHiLwyKPHKPQZ5zz21vM+vIVUSvsRpcbiECH4WR88K2XZqc4ScRcZ7nk/jbeA==" }, + "vue": { + "version": "2.6.14", + "resolved": "https://registry.npmjs.org/vue/-/vue-2.6.14.tgz", + "integrity": "sha512-x2284lgYvjOMj3Za7kqzRcUSxBboHqtgRE2zlos1qWaOye5yUmHn42LB1250NJBLRwEcdrB0JRwyPTEPhfQjiQ==", + "peer": true + }, "w3c-hr-time": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz", @@ -56911,6 +59613,23 @@ "version": "0.8.15", "resolved": "https://registry.npmjs.org/zen-observable/-/zen-observable-0.8.15.tgz", "integrity": "sha512-PQ2PC7R9rslx84ndNBZB/Dkv8V8fZEpk83RLgXtYd0fwUgEjseMn1Dgajh2x6S8QbZAFa9p2qVCEuYZNgve0dQ==" + }, + "zone.js": { + "version": "0.11.4", + "resolved": "https://registry.npmjs.org/zone.js/-/zone.js-0.11.4.tgz", + "integrity": "sha512-DDh2Ab+A/B+9mJyajPjHFPWfYU1H+pdun4wnnk0OcQTNjem1XQSZ2CDW+rfZEUDjv5M19SBqAkjZi0x5wuB5Qw==", + "peer": true, + "requires": { + "tslib": "^2.0.0" + }, + "dependencies": { + "tslib": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz", + "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==", + "peer": true + } + } } } } diff --git a/package.json b/package.json index 4207839c9..8504eeb30 100644 --- a/package.json +++ b/package.json @@ -9,6 +9,7 @@ "@jbrowse/react-linear-genome-view": "^1.3.0", "@material-ui/core": "^4.10.0", "@material-ui/icons": "^4.9.1", + "@material-ui/lab": "*", "@svgr/webpack": "4.1.0", "axios": "^0.21.1", "babel-core": "7.0.0-bridge.0", @@ -17,7 +18,7 @@ "babel-loader": "8.0.5", "babel-plugin-named-asset-import": "^0.3.4", "babel-preset-react-app": "^7.0.1", - "bento-components": "^0.1.77", + "bento-components": "^0.1.96", "bfj": "6.1.1", "case-sensitive-paths-webpack-plugin": "2.2.0", "classnames": "^2.2.6", @@ -51,6 +52,7 @@ "postcss-loader": "3.0.0", "postcss-preset-env": "6.5.0", "postcss-safe-parser": "4.0.1", + "prop-types": "^15.7.2", "query-string": "^6.8.3", "react": "^16.8.2", "react-apollo": "^3.1.5", @@ -71,6 +73,7 @@ "recharts": "^1.7.1", "recompose": "^0.30.0", "redux": "^4.0.4", + "redux-devtools-extension": "^2.13.9", "redux-logger": "^3.0.6", "redux-thunk": "^2.3.0", "resolve": "1.10.0", diff --git a/src/bento/dashboardData.js b/src/bento/dashboardData.js index dd67e0c01..601021346 100644 --- a/src/bento/dashboardData.js +++ b/src/bento/dashboardData.js @@ -1,72 +1,128 @@ import gql from 'graphql-tag'; +export const searchEnabled = true; + +export const filterTabTitleText = 'Filter'; +export const searchTabTitleText = 'Search'; + // --------------- Dashboard Sidebar Filters configuration -------------- // A maximum of 12 facetSearchData are allowed export const facetSearchData = [ { - label: 'Program', field: 'group', api: 'subjectCountByProgram', apiForFiltering: 'filterSubjectCountByProgram', datafield: 'programs', section: 'Filter By Cases', show: true, + label: 'Program', field: 'group', api: 'subjectCountByProgram', apiForFiltering: 'filterSubjectCountByProgram', datafield: 'programs', section: 'Cases', show: true, + }, + { + label: 'Arm', field: 'group', api: 'subjectCountByStudy', apiForFiltering: 'filterSubjectCountByStudy', datafield: 'studies', section: 'Cases', show: true, }, { - label: 'Arm', field: 'group', api: 'subjectCountByStudy', apiForFiltering: 'filterSubjectCountByStudy', datafield: 'studies', section: 'Filter By Cases', show: true, + label: 'Diagnosis', field: 'group', api: 'subjectCountByDiagnoses', apiForFiltering: 'filterSubjectCountByDiagnoses', datafield: 'diagnoses', section: 'Cases', show: true, }, { - label: 'Diagnosis', field: 'group', api: 'subjectCountByDiagnoses', apiForFiltering: 'filterSubjectCountByDiagnoses', datafield: 'diagnoses', section: 'Filter By Cases', show: true, + label: 'Recurrence Score', field: 'group', api: 'subjectCountByRecurrenceScore', apiForFiltering: 'filterSubjectCountByRecurrenceScore', datafield: 'rc_scores', section: 'Cases', show: true, customNumberSort: true, }, { - label: 'Recurrence Score', field: 'group', api: 'subjectCountByRecurrenceScore', apiForFiltering: 'filterSubjectCountByRecurrenceScore', datafield: 'rc_scores', section: 'Filter By Cases', show: true, customNumberSort: true, + label: 'Tumor Size', field: 'group', api: 'subjectCountByTumorSize', apiForFiltering: 'filterSubjectCountByTumorSize', datafield: 'tumor_sizes', section: 'Cases', show: true, customNumberSort: true, }, { - label: 'Tumor Size', field: 'group', api: 'subjectCountByTumorSize', apiForFiltering: 'filterSubjectCountByTumorSize', datafield: 'tumor_sizes', section: 'Filter By Cases', show: true, customNumberSort: true, + label: 'Chemotherapy', field: 'group', api: 'subjectCountByChemotherapyRegimen', apiForFiltering: 'filterSubjectCountByChemotherapyRegimen', datafield: 'chemo_regimen', section: 'Cases', show: true, }, { - label: 'Chemotherapy', field: 'group', api: 'subjectCountByChemotherapyRegimen', apiForFiltering: 'filterSubjectCountByChemotherapyRegimen', datafield: 'chemo_regimen', section: 'Filter By Cases', show: true, + label: 'Tumor Grade', field: 'group', api: 'subjectCountByTumorGrade', apiForFiltering: 'filterSubjectCountByTumorGrade', datafield: 'tumor_grades', section: 'Cases', show: true, }, { - label: 'Tumor Grade', field: 'group', api: 'subjectCountByTumorGrade', apiForFiltering: 'filterSubjectCountByTumorGrade', datafield: 'tumor_grades', section: 'Filter By Cases', show: true, + label: 'ER Status', field: 'group', api: 'subjectCountByErStatus', apiForFiltering: 'filterSubjectCountByErStatus', datafield: 'er_status', section: 'Cases', show: true, }, { - label: 'ER Status', field: 'group', api: 'subjectCountByErStatus', apiForFiltering: 'filterSubjectCountByErStatus', datafield: 'er_status', section: 'Filter By Cases', show: true, + label: 'PR Status', field: 'group', api: 'subjectCountByPrStatus', apiForFiltering: 'filterSubjectCountByPrStatus', datafield: 'pr_status', section: 'Cases', show: true, }, { - label: 'PR Status', field: 'group', api: 'subjectCountByPrStatus', apiForFiltering: 'filterSubjectCountByPrStatus', datafield: 'pr_status', section: 'Filter By Cases', show: true, + label: 'Endocrine Therapy', field: 'group', api: 'subjectCountByEndocrineTherapy', apiForFiltering: 'filterSubjectCountByEndocrineTherapy', datafield: 'endo_therapies', section: 'Cases', show: true, }, { - label: 'Endocrine Therapy', field: 'group', api: 'subjectCountByEndocrineTherapy', apiForFiltering: 'filterSubjectCountByEndocrineTherapy', datafield: 'endo_therapies', section: 'Filter By Cases', show: true, + label: 'Menopause Status', field: 'group', api: 'subjectCountByMenopauseStatus', apiForFiltering: 'filterSubjectCountByMenopauseStatus', datafield: 'meno_status', section: 'Cases', show: true, }, { - label: 'Menopause Status', field: 'group', api: 'subjectCountByMenopauseStatus', apiForFiltering: 'filterSubjectCountByMenopauseStatus', datafield: 'meno_status', section: 'Filter By Cases', show: true, + label: 'Tissue Type', field: 'group', api: 'subjectCountByTissueType', apiForFiltering: 'filterSubjectCountByTissueType', datafield: 'tissue_type', section: 'Samples', show: true, }, { - label: 'Tissue Type', field: 'group', api: 'subjectCountByTissueType', apiForFiltering: 'filterSubjectCountByTissueType', datafield: 'tissue_type', section: 'Filter By Samples', show: true, + label: 'Tissue Composition', field: 'group', api: 'subjectCountByTissueComposition', apiForFiltering: 'filterSubjectCountByTissueComposition', datafield: 'composition', section: 'Samples', show: true, }, { - label: 'Tissue Composition', field: 'group', api: 'subjectCountByTissueComposition', apiForFiltering: 'filterSubjectCountByTissueComposition', datafield: 'composition', section: 'Filter By Samples', show: true, + label: 'File Association', field: 'group', api: 'subjectCountByFileAssociation', apiForFiltering: 'filterSubjectCountByFileAssociation', datafield: 'association', section: 'Files', show: true, }, { - label: 'File Association', field: 'group', api: 'subjectCountByFileAssociation', apiForFiltering: 'filterSubjectCountByFileAssociation', datafield: 'association', section: 'Filter By Files', show: true, + label: 'File Type', field: 'group', api: 'subjectCountByFileType', apiForFiltering: 'filterSubjectCountByFileType', datafield: 'file_type', section: 'Files', show: true, }, { - label: 'File Type', field: 'group', api: 'subjectCountByFileType', apiForFiltering: 'filterSubjectCountByFileType', datafield: 'file_type', section: 'Filter By Files', show: true, + label: 'Age', api: 'filterSubjectCountByAge', apiForFiltering: 'filterSubjectCountByFileType', datafield: 'age_at_index', section: 'Cases', show: true, slider: true, quantifier: 'Years', }, ]; // --------------- Dashboard Sidebar Sections styling -------------- export const facetSectionVariables = { - 'Filter By Cases': { + Cases: { color: '#10A075', + backgroundColor: '#C0E9D7', checkBoxColorsOne: '#E8F7DC', checkBoxColorsTwo: '#F5FDEE', height: '5px', isExpanded: false, }, - 'Filter By Samples': { + Samples: { color: '#10BEFF', + backgroundColor: '#C3EAF5', checkBoxColorsOne: '#C9EBF7', checkBoxColorsTwo: '#E8F8FE', height: '5px', isExpanded: false, }, - 'Filter By Files': { + Files: { + color: '#E636E4', + backgroundColor: '#F5C3F1', + checkBoxColorsOne: '#FBE3FB', + checkBoxColorsTwo: '#FFF2FF', + height: '5px', + isExpanded: false, + }, +}; + +// --------------- Dashboard Facet Local Find Configuration -------------- + +export const facetSectionFindApi = { + Cases: { + api: 'subjectIds', + }, + Samples: { + api: 'sampleIds', + }, + Files: { + api: 'fileIds', + }, +}; + +export const search = { + fileIds: { + color: '#E636E4', + checkBoxColorsOne: '#FBE3FB', + checkBoxColorsTwo: '#FFF2FF', + height: '5px', + isExpanded: false, + }, + subjectIds: { + color: '#10A075', + checkBoxColorsOne: '#E8F7DC', + checkBoxColorsTwo: '#F5FDEE', + height: '5px', + isExpanded: false, + }, + sampleIds: { + color: '#10BEFF', + checkBoxColorsOne: '#C9EBF7', + checkBoxColorsTwo: '#E8F8FE', + height: '5px', + isExpanded: false, + }, + fileNames: { color: '#E636E4', checkBoxColorsOne: '#FBE3FB', checkBoxColorsTwo: '#FFF2FF', @@ -84,6 +140,17 @@ export const defaultFacetSectionVariables = { isExpanded: false, }; +export const defaultSearch = { + color: '#000000', + checkBoxColorsOne: '#E8F7DC', + checkBoxColorsTwo: '#F5FDEE', + height: '5px', + isExpanded: false, +}; + +// --------------- Dashboard ActiveFiltersQuery configuration -------------- +export const displayActiveFiltersQuery = true; + // --------------- Dashboard Widgets configuration -------------- // A maximum of 6 widgets are allowed export const widgetsData = [ @@ -313,6 +380,11 @@ subjectCountByTissueComposition{ group subjects } +filterSubjectCountByAge{ + lowerBound + upperBound + subjects +} subjectCountByTissueType{ group subjects diff --git a/src/bento/dashboardTabData.js b/src/bento/dashboardTabData.js index b97364fc6..142a4897e 100644 --- a/src/bento/dashboardTabData.js +++ b/src/bento/dashboardTabData.js @@ -1,3 +1,4 @@ +/* eslint-disable */ import gql from 'graphql-tag'; import { customCasesTabDownloadCSV, customFilesTabDownloadCSV, customSamplesTabDownloadCSV } from './tableDownloadCSV'; @@ -24,8 +25,7 @@ export const tabContainers = [ name: 'Cases', dataField: 'dataCase', api: 'GET_CASES_OVERVIEW_QUERY', - paginationAPIField: 'subjectOverViewPaged', - paginationAPIFieldDesc: 'subjectOverViewPagedDesc', + paginationAPIField: 'subjectOverview', count: 'numberOfSubjects', dataKey: 'subject_id', defaultSortField: 'subject_id', @@ -136,8 +136,9 @@ export const tabContainers = [ api: 'GET_SAMPLES_OVERVIEW_QUERY', count: 'numberOfSamples', paginationAPIField: 'sampleOverview', - paginationAPIFieldDesc: 'sampleOverviewDesc', dataKey: 'sample_id', + defaultSortField: 'sample_id', + defaultSortDirection: 'asc', saveButtonDefaultStyle: { color: '#fff', backgroundColor: '#00AEEF', @@ -244,7 +245,6 @@ export const tabContainers = [ dataField: 'dataFile', api: 'GET_FILES_OVERVIEW_QUERY', paginationAPIField: 'fileOverview', - paginationAPIFieldDesc: 'fileOverviewDesc', defaultSortField: 'file_name', defaultSortDirection: 'asc', count: 'numberOfFiles', @@ -322,10 +322,16 @@ export const tabContainers = [ fileSizeColumn: 'file_size', // datafield where file file id exists in the table which is used to get file location fileLocationColumn: 'file_id', + // datafield where file format exists in the table + fileFormatColumn: 'file_format', + // datafield where file case id exists in the table which is used to get file information + caseIdColumn: 'subject_id', // file download icon iconFileDownload: 'https://raw.githubusercontent.com/CBIIT/datacommons-assets/main/bento/images/icons/svgs/DocumentDownloadPDF.svg', - // file preview ico + // file preview icon iconFilePreview: 'https://raw.githubusercontent.com/CBIIT/datacommons-assets/main/bento/images/icons/svgs/DocumentDownloadCloud.svg', + // file viewer icon JBrowse + iconFileViewer: 'https://raw.githubusercontent.com/CBIIT/datacommons-assets/main/bento/images/icons/svgs/DocumentDownloadBAM.svg', }, }, { @@ -425,110 +431,374 @@ export const tabIndex = [ }, ]; -export const DASHBOARD_QUERY = gql`{ - numberOfPrograms - numberOfStudies - numberOfSubjects - numberOfSamples - numberOfLabProcedures - numberOfFiles - subjectCountByProgram{ - group - subjects - } - subjectCountByStudy{ - group - subjects - } - subjectCountByDiagnoses{ - group - subjects - } - subjectCountByRecurrenceScore{ - group - subjects - } - subjectCountByTumorSize{ - group - subjects - } - subjectCountByChemotherapyRegimen{ - group - subjects - } - subjectCountByTumorGrade{ - group - subjects - } - subjectCountByErStatus{ - group - subjects - } - subjectCountByPrStatus{ - group - subjects - } - subjectCountByMenopauseStatus{ - group - subjects - } - subjectCountByChemotherapyRegimen{ - group - subjects - } - subjectCountByEndocrineTherapy{ - group - subjects - } - subjectCountByFileType{ - group - subjects - } - subjectCountByFileAssociation { - group - subjects - } - subjectCountByTissueComposition{ - group - subjects - } - subjectCountByTissueType{ - group - subjects - } - armsByPrograms { - program - caseSize - children { - arm +export const DASHBOARD_QUERY_NEW = gql` +query search ( + $subject_ids: [String], + $programs: [String] , + $studies: [String] , + $diagnoses: [String] , + $rc_scores: [String] , + $tumor_sizes: [String] , + $chemo_regimen: [String] , + $tumor_grades: [String] , + $er_status: [String] , + $pr_status: [String] , + $endo_therapies: [String] , + $meno_status: [String] , + $tissue_type: [String], + $composition: [String], + $association: [String], + $file_type: [String], + $age_at_index: [Float] +){ + searchSubjects ( + subject_ids: $subject_ids, + programs: $programs, + studies: $studies, + diagnoses: $diagnoses, + rc_scores: $rc_scores, + tumor_sizes: $tumor_sizes, + chemo_regimen: $chemo_regimen, + tumor_grades: $tumor_grades, + er_status: $er_status, + pr_status: $pr_status, + endo_therapies: $endo_therapies, + meno_status: $meno_status, + tissue_type: $tissue_type, + composition: $composition, + association: $association, + file_type: $file_type, + age_at_index: $age_at_index + ) { + numberOfPrograms + numberOfStudies + numberOfSubjects + numberOfSamples + numberOfLabProcedures + numberOfFiles + armsByPrograms { + program caseSize - size + children { + arm + caseSize + size + } + } + subjectCountByProgram { + group + subjects + } + subjectCountByStudy { + group + subjects + } + subjectCountByDiagnoses { + group + subjects + } + subjectCountByRecurrenceScore { + group + subjects + } + subjectCountByTumorSize { + group + subjects + } + subjectCountByChemotherapyRegimen { + group + subjects + } + subjectCountByEndocrineTherapy { + group + subjects + } + subjectCountByTumorGrade{ + group + subjects + } + subjectCountByErStatus{ + group + subjects + } + subjectCountByPrStatus{ + group + subjects + } + subjectCountByMenopauseStatus{ + group + subjects + } + subjectCountByFileType { + group + subjects + } + subjectCountByFileAssociation { + group + subjects + } + subjectCountByTissueComposition { + group + subjects + } + subjectCountByTissueType { + group + subjects + } + filterSubjectCountByProgram { + group + subjects + } + filterSubjectCountByStudy{ + group + subjects + } + filterSubjectCountByDiagnoses{ + group + subjects + } + filterSubjectCountByRecurrenceScore{ + group + subjects + } + filterSubjectCountByTumorSize{ + group + subjects + } + filterSubjectCountByTumorGrade{ + group + subjects + } + filterSubjectCountByErStatus{ + group + subjects + } + filterSubjectCountByPrStatus{ + group + subjects + } + filterSubjectCountByChemotherapyRegimen{ + group + subjects + } + filterSubjectCountByEndocrineTherapy{ + group + subjects + } + filterSubjectCountByMenopauseStatus{ + group + subjects + } + filterSubjectCountByTissueType{ + group + subjects + } + filterSubjectCountByTissueComposition{ + group + subjects + } + filterSubjectCountByFileAssociation{ + group + subjects + } + filterSubjectCountByFileType{ + group + subjects + } + filterSubjectCountByAge{ + lowerBound + upperBound + subjects } } - subjectOverViewPaged(first: 10) { - subject_id - program_id - study_info - samples - program - study_acronym - diagnosis - recurrence_score - tumor_size - tumor_grade - er_status - pr_status - chemotherapy - endocrine_therapy - menopause_status - age_at_index - survival_time - lab_procedures - files{ - file_id +} +`; + +export const DASHBOARD_QUERY = gql` + query search ( + $programs: [String] , + $studies: [String] , + $diagnoses: [String] , + $rc_scores: [String] , + $tumor_sizes: [String] , + $chemo_regimen: [String] , + $tumor_grades: [String] , + $er_status: [String] , + $pr_status: [String] , + $endo_therapies: [String] , + $meno_status: [String] , + $tissue_type: [String], + $composition: [String], + $association: [String], + $file_type: [String], + $age_at_index: [Float] + ){ + searchSubjects ( + programs: $programs, + studies: $studies, + diagnoses: $diagnoses, + rc_scores: $rc_scores, + tumor_sizes: $tumor_sizes, + chemo_regimen: $chemo_regimen, + tumor_grades: $tumor_grades, + er_status: $er_status, + pr_status: $pr_status, + endo_therapies: $endo_therapies, + meno_status: $meno_status, + tissue_type: $tissue_type, + composition: $composition, + association: $association, + file_type: $file_type, + age_at_index: $age_at_index + ) { + numberOfPrograms + numberOfStudies + numberOfSubjects + numberOfSamples + numberOfLabProcedures + numberOfFiles + armsByPrograms { + program + caseSize + children { + arm + caseSize + size + } + + } + + subjectCountByProgram { + group + subjects + } + subjectCountByStudy { + group + subjects + } + subjectCountByDiagnoses { + group + subjects + } + subjectCountByRecurrenceScore { + group + subjects + } + subjectCountByTumorSize { + group + subjects + } + subjectCountByChemotherapyRegimen { + group + subjects + } + subjectCountByEndocrineTherapy { + group + subjects + } + subjectCountByTumorGrade{ + group + subjects + } + subjectCountByErStatus{ + group + subjects + } + subjectCountByPrStatus{ + group + subjects + } + subjectCountByMenopauseStatus{ + group + subjects + } + subjectCountByFileType { + group + subjects + } + subjectCountByFileAssociation { + group + subjects + } + subjectCountByTissueComposition { + group + subjects + } + subjectCountByTissueType { + group + subjects + } + + filterSubjectCountByProgram { + group + subjects + } + filterSubjectCountByStudy{ + group + subjects + } + filterSubjectCountByDiagnoses{ + group + subjects + } + filterSubjectCountByRecurrenceScore{ + group + subjects + } + filterSubjectCountByTumorSize{ + group + subjects + } + filterSubjectCountByTumorGrade{ + group + subjects + } + filterSubjectCountByErStatus{ + group + subjects + } + filterSubjectCountByPrStatus{ + group + subjects + } + filterSubjectCountByChemotherapyRegimen{ + group + subjects + } + filterSubjectCountByEndocrineTherapy{ + group + subjects + } + filterSubjectCountByMenopauseStatus{ + group + subjects + } + filterSubjectCountByTissueType{ + group + subjects + } + filterSubjectCountByTissueComposition{ + group + subjects + } + filterSubjectCountByFileAssociation{ + group + subjects + } + filterSubjectCountByFileType{ + group + subjects + } + filterSubjectCountByAge{ + lowerBound + upperBound + subjects + } + } } - }`; + + `; export const FILTER_GROUP_QUERY = gql` query groupCounts($subject_ids: [String]){ @@ -566,7 +836,8 @@ subjectCountByEndocrineTherapy (subject_ids: $subject_ids){ `; export const FILTER_QUERY = gql` -query search($programs: [String] , +query search ( + $programs: [String] , $studies: [String] , $diagnoses: [String] , $rc_scores: [String] , @@ -580,9 +851,11 @@ query search($programs: [String] , $tissue_type: [String], $composition: [String], $association: [String], - $file_type: [String] - $first: Int ) { -searchSubjects( programs: $programs, + $file_type: [String], + $age_at_index: [Float] +){ + searchSubjects ( + programs: $programs, studies: $studies, diagnoses: $diagnoses, rc_scores: $rc_scores, @@ -596,215 +869,332 @@ searchSubjects( programs: $programs, tissue_type: $tissue_type, composition: $composition, association: $association, - file_type: $file_type - first: $first) { - numberOfPrograms - numberOfStudies - numberOfSubjects - numberOfSamples - numberOfLabProcedures - numberOfFiles - sampleIds - fileIds - subjectIds - firstPage { - subject_id + file_type: $file_type, + age_at_index: $age_at_index + ) { + numberOfPrograms + numberOfStudies + numberOfSubjects + numberOfSamples + numberOfLabProcedures + numberOfFiles + armsByPrograms { program - program_id - study_acronym - diagnosis - recurrence_score - tumor_size - tumor_grade - er_status - pr_status - age_at_index - survival_time - survival_time_unit + caseSize + children { + arm + caseSize + size + } + } - -} -filterSubjectCountByProgram(programs: $programs, studies: $studies, diagnoses: $diagnoses, rc_scores: $rc_scores, tumor_sizes: $tumor_sizes, chemo_regimen: $chemo_regimen, tumor_grades: $tumor_grades, er_status: $er_status, pr_status: $pr_status, endo_therapies: $endo_therapies, meno_status: $meno_status, tissue_type: $tissue_type, composition: $composition, association: $association, file_type: $file_type) { - group - subjects -} -filterSubjectCountByStudy(programs: $programs, studies: $studies, diagnoses: $diagnoses, rc_scores: $rc_scores, tumor_sizes: $tumor_sizes, chemo_regimen: $chemo_regimen, tumor_grades: $tumor_grades, er_status: $er_status, pr_status: $pr_status, endo_therapies: $endo_therapies, meno_status: $meno_status, tissue_type: $tissue_type, composition: $composition, association: $association, file_type: $file_type) { - group - subjects -} -filterSubjectCountByDiagnoses(programs: $programs, studies: $studies, diagnoses: $diagnoses, rc_scores: $rc_scores, tumor_sizes: $tumor_sizes, chemo_regimen: $chemo_regimen, tumor_grades: $tumor_grades, er_status: $er_status, pr_status: $pr_status, endo_therapies: $endo_therapies, meno_status: $meno_status, tissue_type: $tissue_type, composition: $composition, association: $association, file_type: $file_type) { - group - subjects -} -filterSubjectCountByRecurrenceScore(programs: $programs, studies: $studies, diagnoses: $diagnoses, rc_scores: $rc_scores, tumor_sizes: $tumor_sizes, chemo_regimen: $chemo_regimen, tumor_grades: $tumor_grades, er_status: $er_status, pr_status: $pr_status, endo_therapies: $endo_therapies, meno_status: $meno_status, tissue_type: $tissue_type, composition: $composition, association: $association, file_type: $file_type) { - group - subjects -} -filterSubjectCountByTumorSize(programs: $programs, studies: $studies, diagnoses: $diagnoses, rc_scores: $rc_scores, tumor_sizes: $tumor_sizes, chemo_regimen: $chemo_regimen, tumor_grades: $tumor_grades, er_status: $er_status, pr_status: $pr_status, endo_therapies: $endo_therapies, meno_status: $meno_status, tissue_type: $tissue_type, composition: $composition, association: $association, file_type: $file_type) { - group - subjects -} -filterSubjectCountByTumorGrade(programs: $programs, studies: $studies, diagnoses: $diagnoses, rc_scores: $rc_scores, tumor_sizes: $tumor_sizes, chemo_regimen: $chemo_regimen, tumor_grades: $tumor_grades, er_status: $er_status, pr_status: $pr_status, endo_therapies: $endo_therapies, meno_status: $meno_status, tissue_type: $tissue_type, composition: $composition, association: $association, file_type: $file_type) { - group - subjects -} -filterSubjectCountByErStatus(programs: $programs, studies: $studies, diagnoses: $diagnoses, rc_scores: $rc_scores, tumor_sizes: $tumor_sizes, chemo_regimen: $chemo_regimen, tumor_grades: $tumor_grades, er_status: $er_status, pr_status: $pr_status, endo_therapies: $endo_therapies, meno_status: $meno_status, tissue_type: $tissue_type, composition: $composition, association: $association, file_type: $file_type) { - group - subjects -} -filterSubjectCountByPrStatus(programs: $programs, studies: $studies, diagnoses: $diagnoses, rc_scores: $rc_scores, tumor_sizes: $tumor_sizes, chemo_regimen: $chemo_regimen, tumor_grades: $tumor_grades, er_status: $er_status, pr_status: $pr_status, endo_therapies: $endo_therapies, meno_status: $meno_status, tissue_type: $tissue_type, composition: $composition, association: $association, file_type: $file_type) { - group - subjects -} -filterSubjectCountByChemotherapyRegimen(programs: $programs, studies: $studies, diagnoses: $diagnoses, rc_scores: $rc_scores, tumor_sizes: $tumor_sizes, chemo_regimen: $chemo_regimen, tumor_grades: $tumor_grades, er_status: $er_status, pr_status: $pr_status, endo_therapies: $endo_therapies, meno_status: $meno_status, tissue_type: $tissue_type, composition: $composition, association: $association, file_type: $file_type) { - group - subjects -} -filterSubjectCountByEndocrineTherapy(programs: $programs, studies: $studies, diagnoses: $diagnoses, rc_scores: $rc_scores, tumor_sizes: $tumor_sizes, chemo_regimen: $chemo_regimen, tumor_grades: $tumor_grades, er_status: $er_status, pr_status: $pr_status, endo_therapies: $endo_therapies, meno_status: $meno_status, tissue_type: $tissue_type, composition: $composition, association: $association, file_type: $file_type) { - group - subjects -} -filterSubjectCountByMenopauseStatus(programs: $programs, studies: $studies, diagnoses: $diagnoses, rc_scores: $rc_scores, tumor_sizes: $tumor_sizes, chemo_regimen: $chemo_regimen, tumor_grades: $tumor_grades, er_status: $er_status, pr_status: $pr_status, endo_therapies: $endo_therapies, meno_status: $meno_status, tissue_type: $tissue_type, composition: $composition, association: $association, file_type: $file_type) { - group - subjects -} -filterSubjectCountByTissueType(programs: $programs, studies: $studies, diagnoses: $diagnoses, rc_scores: $rc_scores, tumor_sizes: $tumor_sizes, chemo_regimen: $chemo_regimen, tumor_grades: $tumor_grades, er_status: $er_status, pr_status: $pr_status, endo_therapies: $endo_therapies, meno_status: $meno_status, tissue_type: $tissue_type, composition: $composition, association: $association, file_type: $file_type) { - group - subjects -} -filterSubjectCountByTissueComposition(programs: $programs, studies: $studies, diagnoses: $diagnoses, rc_scores: $rc_scores, tumor_sizes: $tumor_sizes, chemo_regimen: $chemo_regimen, tumor_grades: $tumor_grades, er_status: $er_status, pr_status: $pr_status, endo_therapies: $endo_therapies, meno_status: $meno_status, tissue_type: $tissue_type, composition: $composition, association: $association, file_type: $file_type) { - group - subjects -} -filterSubjectCountByFileAssociation(programs: $programs, studies: $studies, diagnoses: $diagnoses, rc_scores: $rc_scores, tumor_sizes: $tumor_sizes, chemo_regimen: $chemo_regimen, tumor_grades: $tumor_grades, er_status: $er_status, pr_status: $pr_status, endo_therapies: $endo_therapies, meno_status: $meno_status, tissue_type: $tissue_type, composition: $composition, association: $association, file_type: $file_type) { - group - subjects -} -filterSubjectCountByFileType(programs: $programs, studies: $studies, diagnoses: $diagnoses, rc_scores: $rc_scores, tumor_sizes: $tumor_sizes, chemo_regimen: $chemo_regimen, tumor_grades: $tumor_grades, er_status: $er_status, pr_status: $pr_status, endo_therapies: $endo_therapies, meno_status: $meno_status, tissue_type: $tissue_type, composition: $composition, association: $association, file_type: $file_type) { - group - subjects -} -} + subjectCountByProgram { + group + subjects + } + subjectCountByStudy { + group + subjects + } + subjectCountByDiagnoses { + group + subjects + } + subjectCountByRecurrenceScore { + group + subjects + } + subjectCountByTumorSize { + group + subjects + } + subjectCountByChemotherapyRegimen { + group + subjects + } + subjectCountByEndocrineTherapy { + group + subjects + } + subjectCountByTumorGrade{ + group + subjects + } + subjectCountByErStatus{ + group + subjects + } + subjectCountByPrStatus{ + group + subjects + } + subjectCountByMenopauseStatus{ + group + subjects + } + subjectCountByFileType { + group + subjects + } + subjectCountByFileAssociation { + group + subjects + } + subjectCountByTissueComposition { + group + subjects + } + subjectCountByTissueType { + group + subjects + } -`; + filterSubjectCountByProgram { + group + subjects + } + filterSubjectCountByStudy{ + group + subjects + } + filterSubjectCountByDiagnoses{ + group + subjects + } + filterSubjectCountByRecurrenceScore{ + group + subjects + } + filterSubjectCountByTumorSize{ + group + subjects + } + filterSubjectCountByTumorGrade{ + group + subjects + } + filterSubjectCountByErStatus{ + group + subjects + } + filterSubjectCountByPrStatus{ + group + subjects + } + filterSubjectCountByChemotherapyRegimen{ + group + subjects + } + filterSubjectCountByEndocrineTherapy{ + group + subjects + } + filterSubjectCountByMenopauseStatus{ + group + subjects + } + filterSubjectCountByTissueType{ + group + subjects + } + filterSubjectCountByTissueComposition{ + group + subjects + } + filterSubjectCountByFileAssociation{ + group + subjects + } + filterSubjectCountByFileType{ + group + subjects + } + filterSubjectCountByAge{ + lowerBound + upperBound + subjects + } -// --------------- GraphQL query - Retrieve files tab details -------------- -export const GET_FILES_OVERVIEW_QUERY = gql` -query fileOverview($file_ids: [String], $offset: Int = 0, $first: Int = 10, $order_by:String ="file_name"){ - fileOverview(file_ids: $file_ids, offset: $offset,first: $first, order_by: $order_by) { - file_id - file_name - association - file_description - file_format - file_size - program - program_id - arm - subject_id - sample_id - diagnosis } } - `; +`; -export const GET_FILES_OVERVIEW_DESC_QUERY = gql` - query fileOverviewDesc($file_ids: [String], $offset: Int = 0, $first: Int = 10, $order_by:String ="file_name"){ - fileOverviewDesc(file_ids: $file_ids, offset: $offset,first: $first, order_by: $order_by) { - file_id - file_name - association - file_description - file_format - file_size - program - program_id - arm - subject_id - sample_id - diagnosis +export const GET_FILES_OVERVIEW_QUERY = gql` +query fileOverview( + $subject_ids: [String], + $file_ids: [String], + $programs: [String] , + $studies: [String] , + $diagnoses: [String] , + $rc_scores: [String] , + $tumor_sizes: [String] , + $chemo_regimen: [String] , + $tumor_grades: [String] , + $er_status: [String] , + $pr_status: [String] , + $endo_therapies: [String] , + $meno_status: [String] , + $tissue_type: [String], + $composition: [String], + $association: [String], + $file_type: [String], + $age_at_index: [Float], + $first: Int, + $offset: Int, + $order_by: String + $sort_direction: String ){ + fileOverview( + subject_ids: $subject_ids, + file_ids: $file_ids, + programs: $programs, + studies: $studies, + diagnoses: $diagnoses, + rc_scores: $rc_scores, + tumor_sizes: $tumor_sizes, + chemo_regimen: $chemo_regimen, + tumor_grades: $tumor_grades, + er_status: $er_status, + pr_status: $pr_status, + endo_therapies: $endo_therapies, + meno_status: $meno_status, + tissue_type: $tissue_type, + composition: $composition, + association: $association, + file_type: $file_type, + age_at_index: $age_at_index, + first: $first, + offset: $offset, + order_by: $order_by, + sort_direction: $sort_direction + ){ + file_id, + program_id, + file_name, + association, + file_description, + file_format, + file_size, + program, + arm, + subject_id, + sample_id, + diagnosis, } - } - `; - -// --------------- GraphQL query - Retrieve sample tab details -------------- - -export const GET_SAMPLES_OVERVIEW_QUERY = gql` - query sampleOverview($sample_ids: [String], $offset: Int = 0, $first: Int = 10, $order_by:String =""){ - sampleOverview(sample_ids: $sample_ids, offset: $offset,first: $first, order_by: $order_by) { - sample_id - subject_id - program - program_id - arm - diagnosis - tissue_type - tissue_composition - sample_anatomic_site - sample_procurement_method - platform - files -} } - `; - -// --------------- GraphQL query - Retrieve sample tab details -------------- +`; -export const GET_SAMPLES_OVERVIEW_DESC_QUERY = gql` - query sampleOverview($sample_ids: [String], $offset: Int = 0, $first: Int = 10, $order_by:String =""){ - sampleOverviewDesc(sample_ids: $sample_ids, offset: $offset,first: $first, order_by: $order_by) { - sample_id - subject_id - program - program_id - arm - diagnosis - tissue_type - tissue_composition - sample_anatomic_site - sample_procurement_method - platform - files -} +export const GET_SAMPLES_OVERVIEW_QUERY = gql` +query sampleOverview( + $subject_ids: [String], + $sample_ids: [String], + $programs: [String] , + $studies: [String] , + $diagnoses: [String] , + $rc_scores: [String] , + $tumor_sizes: [String] , + $chemo_regimen: [String] , + $tumor_grades: [String] , + $er_status: [String] , + $pr_status: [String] , + $endo_therapies: [String] , + $meno_status: [String] , + $tissue_type: [String], + $composition: [String], + $association: [String], + $file_type: [String], + $age_at_index: [Float], + $first: Int, + $offset: Int, + $order_by: String + $sort_direction: String ){ + sampleOverview( + subject_ids: $subject_ids, + sample_ids: $sample_ids, + programs: $programs, + studies: $studies, + diagnoses: $diagnoses, + rc_scores: $rc_scores, + tumor_sizes: $tumor_sizes, + chemo_regimen: $chemo_regimen, + tumor_grades: $tumor_grades, + er_status: $er_status, + pr_status: $pr_status, + endo_therapies: $endo_therapies, + meno_status: $meno_status, + tissue_type: $tissue_type, + composition: $composition, + association: $association, + file_type: $file_type, + age_at_index: $age_at_index, + first: $first, + offset: $offset, + order_by: $order_by, + sort_direction: $sort_direction + ){ + sample_id, + subject_id, + program, + program_id, + arm, + diagnosis, + tissue_type, + tissue_composition, + sample_anatomic_site, + sample_procurement_method, + platform, + files + } } - `; - -// --------------- GraphQL query - Retrieve sample tab details -------------- +`; export const GET_CASES_OVERVIEW_QUERY = gql` -query subjectOverViewPaged($subject_ids: [String], $offset: Int = 0, $first: Int = 10, $order_by:String =""){ - subjectOverViewPaged(subject_ids: $subject_ids, first: $first, offset: $offset, order_by: $order_by) { - subject_id - program - program_id - study_acronym - study_short_description - study_info - diagnosis - recurrence_score - tumor_size - tumor_grade - er_status - pr_status - chemotherapy - endocrine_therapy - menopause_status - age_at_index - survival_time - files { - file_id - } - lab_procedures - } -} - `; - -// --------------- GraphQL query - Retrieve sample tab details -------------- - -export const GET_CASES_OVERVIEW_DESC_QUERY = gql` - query subjectOverViewPaged($subject_ids: [String], $offset: Int = 0, $first: Int = 10, $order_by:String =""){ - subjectOverViewPagedDesc(subject_ids: $subject_ids, first: $first, offset: $offset, order_by: $order_by) { +query subjectOverview( + $subject_ids: [String], + $programs: [String] , + $studies: [String] , + $diagnoses: [String] , + $rc_scores: [String] , + $tumor_sizes: [String] , + $chemo_regimen: [String] , + $tumor_grades: [String] , + $er_status: [String] , + $pr_status: [String] , + $endo_therapies: [String] , + $meno_status: [String] , + $tissue_type: [String], + $composition: [String], + $association: [String], + $file_type: [String], + $age_at_index: [Float], + $first: Int, + $offset: Int, + $order_by: String + $sort_direction: String ){ + subjectOverview( + subject_ids: $subject_ids, + programs: $programs, + studies: $studies, + diagnoses: $diagnoses, + rc_scores: $rc_scores, + tumor_sizes: $tumor_sizes, + chemo_regimen: $chemo_regimen, + tumor_grades: $tumor_grades, + er_status: $er_status, + pr_status: $pr_status, + endo_therapies: $endo_therapies, + meno_status: $meno_status, + tissue_type: $tissue_type, + composition: $composition, + association: $association, + file_type: $file_type, + age_at_index: $age_at_index, + first: $first, + offset: $offset, + order_by: $order_by, + sort_direction: $sort_direction + + ) { subject_id program program_id @@ -822,40 +1212,201 @@ export const GET_CASES_OVERVIEW_DESC_QUERY = gql` menopause_status age_at_index survival_time - files { - file_id - } + survival_time_unit + files lab_procedures + samples } } - `; +`; export const GET_ALL_FILEIDS_CASESTAB_FOR_SELECT_ALL = gql` - query subjectOverViewPaged($subject_ids: [String], $first: Int = 10000000){ - subjectOverViewPaged(subject_ids: $subject_ids, first: $first) { - files { - file_id - } - } +query search ( + $subject_ids: [String], +){ + fileIDsFromList ( + subject_ids: $subject_ids, + ) } `; export const GET_ALL_FILEIDS_SAMPLESTAB_FOR_SELECT_ALL = gql` -query sampleOverview($sample_ids: [String], $offset: Int = 0, $first: Int = 10, $order_by:String =""){ - sampleOverview(sample_ids: $sample_ids, offset: $offset,first: $first, order_by: $order_by) { - files -} +query search ( + $sample_ids: [String], +){ + fileIDsFromList ( + sample_ids: $sample_ids, + ) } `; export const GET_ALL_FILEIDS_FILESTAB_FOR_SELECT_ALL = gql` -query fileOverview($file_ids: [String], $offset: Int = 0, $first: Int = 10, $order_by: String = "file_name") { - fileOverview(file_ids: $file_ids, offset: $offset, first: $first, order_by: $order_by) { - file_id - } +query search ( + $file_names: [String] +){ + fileIDsFromList ( + file_names: $file_names + ) } `; +export const GET_ALL_FILEIDS_FROM_CASESTAB_FOR_ADD_ALL_CART = gql` +query subjectsAddAllToCart( + $subject_ids: [String], + $programs: [String] , + $studies: [String] , + $diagnoses: [String] , + $rc_scores: [String] , + $tumor_sizes: [String] , + $chemo_regimen: [String] , + $tumor_grades: [String] , + $er_status: [String] , + $pr_status: [String] , + $endo_therapies: [String] , + $meno_status: [String] , + $tissue_type: [String], + $composition: [String], + $association: [String], + $file_type: [String], + $age_at_index: [Float], + $first: Int, + $offset: Int= 0, + $order_by: String = "file_id", + $sort_direction: String = "asc" + ){ + subjectOverview( + subject_ids: $subject_ids, + programs: $programs, + studies: $studies, + diagnoses: $diagnoses, + rc_scores: $rc_scores, + tumor_sizes: $tumor_sizes, + chemo_regimen: $chemo_regimen, + tumor_grades: $tumor_grades, + er_status: $er_status, + pr_status: $pr_status, + endo_therapies: $endo_therapies, + meno_status: $meno_status, + tissue_type: $tissue_type, + composition: $composition, + association: $association, + file_type: $file_type, + age_at_index: $age_at_index, + first: $first, + offset: $offset, + order_by: $order_by, + sort_direction: $sort_direction + ) { + files + } +} + `; + +export const GET_ALL_FILEIDS_FROM_SAMPLETAB_FOR_ADD_ALL_CART = gql` + query samplesAddAllToCart( + $subject_ids: [String], + $sample_ids: [String], + $programs: [String] , + $studies: [String] , + $diagnoses: [String] , + $rc_scores: [String] , + $tumor_sizes: [String] , + $chemo_regimen: [String] , + $tumor_grades: [String] , + $er_status: [String] , + $pr_status: [String] , + $endo_therapies: [String] , + $meno_status: [String] , + $tissue_type: [String], + $composition: [String], + $association: [String], + $file_type: [String], + $age_at_index: [Float], + $first: Int, + $offset: Int= 0, + $order_by: String = "file_id", + $sort_direction: String = "asc" ){ + sampleOverview( + subject_ids: $subject_ids, + sample_ids: $sample_ids, + programs: $programs, + studies: $studies, + diagnoses: $diagnoses, + rc_scores: $rc_scores, + tumor_sizes: $tumor_sizes, + chemo_regimen: $chemo_regimen, + tumor_grades: $tumor_grades, + er_status: $er_status, + pr_status: $pr_status, + endo_therapies: $endo_therapies, + meno_status: $meno_status, + tissue_type: $tissue_type, + composition: $composition, + association: $association, + file_type: $file_type, + age_at_index: $age_at_index, + first: $first, + offset: $offset, + order_by: $order_by, + sort_direction: $sort_direction + ) { + files + } + } + `; + +export const GET_ALL_FILEIDS_FROM_FILESTAB_FOR_ADD_ALL_CART = gql` +query fileAddAllToCart( + $subject_ids: [String], + $programs: [String] , + $studies: [String] , + $diagnoses: [String] , + $rc_scores: [String] , + $tumor_sizes: [String] , + $chemo_regimen: [String] , + $tumor_grades: [String] , + $er_status: [String] , + $pr_status: [String] , + $endo_therapies: [String] , + $meno_status: [String] , + $tissue_type: [String], + $composition: [String], + $association: [String], + $file_type: [String], + $age_at_index: [Float], + $first: Int, + $offset: Int= 0, + $order_by: String = "file_id", + $sort_direction: String = "asc" + ){ + fileOverview( + subject_ids:$subject_ids, + programs: $programs, + studies: $studies, + diagnoses: $diagnoses, + rc_scores: $rc_scores, + tumor_sizes: $tumor_sizes, + chemo_regimen: $chemo_regimen, + tumor_grades: $tumor_grades, + er_status: $er_status, + pr_status: $pr_status, + endo_therapies: $endo_therapies, + meno_status: $meno_status, + tissue_type: $tissue_type, + composition: $composition, + association: $association, + file_type: $file_type, + age_at_index: $age_at_index, + first: $first, + offset: $offset, + order_by: $order_by, + sort_direction: $sort_direction + ){ + file_id, + } +} + `; + // --------------- GraphQL query - Retrieve files tab details -------------- export const GET_FILES_NAME_QUERY = gql` query fileOverview($file_ids: [String], $offset: Int = 0, $first: Int = 100000, $order_by:String ="file_name"){ @@ -883,3 +1434,4 @@ export const GET_FILE_IDS_FROM_FILE_NAME = gql` file_id } }`; + \ No newline at end of file diff --git a/src/bento/fileCentricCartWorkflowData.js b/src/bento/fileCentricCartWorkflowData.js index 8f570e32f..3335841dd 100644 --- a/src/bento/fileCentricCartWorkflowData.js +++ b/src/bento/fileCentricCartWorkflowData.js @@ -22,7 +22,7 @@ export const myFilesPageData = { tooltipIcon: 'https://raw.githubusercontent.com/google/material-design-icons/master/src/action/help/materialicons/24px.svg', tooltipAlt: 'tooltip icon', tooltipMessage: 'To access and analyze files: select and remove unwanted files, click the “Download Manifest” button, and upload the resulting Manifest file to your Seven Bridges Genomics account.', - textareaPlaceholder: 'Please add a description for the XML file you are about to download.', + textareaPlaceholder: 'Please add a description for the CSV file you are about to download.', errorMessage: 'An error has occurred in loading CART', popUpWindow: { showNumberOfFileBeRemoved: true, @@ -48,6 +48,7 @@ export const table = { defaultSortField: 'file_name', // 'asc' or 'desc' defaultSortDirection: 'asc', + paginationAPIField: 'filesInList', tableDownloadCSV: customMyFilesTabDownloadCSV, columns: [ @@ -100,8 +101,8 @@ export const table = { // --------------- GraphQL query - Retrieve selected cases info -------------- export const GET_MY_CART_DATA_QUERY = gql` -query filesInList($file_ids: [String], $offset: Int = 0, $first: Int = 10, $order_by:String ="") { - filesInList(file_ids: $file_ids, offset: $offset,first: $first, order_by: $order_by) { +query filesInList($file_ids: [String], $offset: Int = 0, $first: Int = 10, $order_by:String ="file_name", $sort_direction:String="asc") { + filesInList(file_ids: $file_ids, offset: $offset,first: $first, order_by: $order_by, sort_direction: $sort_direction) { study_code subject_id file_name diff --git a/src/bento/globalData.js b/src/bento/globalData.js new file mode 100644 index 000000000..85e4c3983 --- /dev/null +++ b/src/bento/globalData.js @@ -0,0 +1,4 @@ +export default { + // Suggested for replaceEmptyValueWith: 'N/A' or '-' or '' + replaceEmptyValueWith: '', +}; diff --git a/src/bento/globalFooterData.js b/src/bento/globalFooterData.js index 8ab74a224..d8908e908 100644 --- a/src/bento/globalFooterData.js +++ b/src/bento/globalFooterData.js @@ -2,7 +2,7 @@ import env from '../utils/env'; // footerLogoImage ideal image size 310x80 px export default { - footerLogoImage: 'https://raw.githubusercontent.com/CBIIT/datacommons-assets/main/bento/images/icons/png/footer_FNL_logo.png', + footerLogoImage: 'https://raw.githubusercontent.com/cbiit/datacommons-assets/main/bento/images/icons/png/footerlogo.png', footerLogoAltText: 'Footer Logo', footerLogoHyperlink: 'https://frederick.cancer.gov/', footerStaticText: 'NIH … Turning Discovery Into Health®', diff --git a/src/bento/jbrowseDetailData.js b/src/bento/jbrowseDetailData.js new file mode 100644 index 000000000..29235aaac --- /dev/null +++ b/src/bento/jbrowseDetailData.js @@ -0,0 +1,48 @@ +import gql from 'graphql-tag'; + +// --------------- GraphQL query configuration -------------- +// Primary ID field used to query a case +const caseIDField = 'subject_id'; + +const jBrowseOptions = { + jBrowse: true, + variants: true, + alignments: true, + referenceSequenceUris: { + fastaLocation: { + uri: 'https://jbrowse.org/genomes/hg19/fasta/hg19.fa.gz', + locationType: 'UriLocation', + }, + faiLocation: { + uri: 'https://jbrowse.org/genomes/hg19/fasta/hg19.fa.gz.fai', + locationType: 'UriLocation', + }, + gziLocation: { + uri: 'https://jbrowse.org/genomes/hg19/fasta/hg19.fa.gz.gzi', + locationType: 'UriLocation', + }, + }, + variantsUris: { + vcfGzLocationUri: 'https://bento-bam-vcf-files.s3.amazonaws.com/NA20811.10.sorted.vcf.gz', + indexUri: 'https://bento-bam-vcf-files.s3.amazonaws.com/NA20811.10.sorted.vcf.gz.tbi', + }, +}; + +// GraphQL query to retrieve detailed info for a case +const GET_JBROWSE_DETAIL_DATA_QUERY = gql` + query subjectDetail($subject_id: String!) { + subjectDetail(subject_id: $subject_id) { + subject_id + files { + file_type + file_id + } + } + } +`; + +export { + caseIDField, + jBrowseOptions, + GET_JBROWSE_DETAIL_DATA_QUERY, +}; diff --git a/src/bento/localSearchData.js b/src/bento/localSearchData.js new file mode 100644 index 000000000..25e19bd94 --- /dev/null +++ b/src/bento/localSearchData.js @@ -0,0 +1,520 @@ +import gql from 'graphql-tag'; + +// --------------- GraphQL query - Retrieve stats details -------------- +export const GET_ALL_IDS = gql`{ + idsLists{ + subjectIds + sampleIds + fileIds + fileNames +} + } + `; + +export const GET_SUBJECT_IDS = gql` + query search ($subject_ids: [String]){ + findSubjectIdsInList (subject_ids: $subject_ids) { + subject_id + program_id + } +} +`; + +export const GET_IDS_BY_TYPE = (type) => gql`{ + idsLists { + ${type} + } +} +`; + +export const GET_SEARCH_NODES_BY_FACET = gql` +query search ( + $subject_ids: [String], + $programs: [String] , + $studies: [String] , + $diagnoses: [String] , + $rc_scores: [String] , + $tumor_sizes: [String] , + $chemo_regimen: [String] , + $tumor_grades: [String] , + $er_status: [String] , + $pr_status: [String] , + $endo_therapies: [String] , + $meno_status: [String] , + $tissue_type: [String], + $composition: [String], + $association: [String], + $file_type: [String], + $age_at_index: [Float] +){ + searchSubjects ( + subject_ids: $subject_ids, + programs: $programs, + studies: $studies, + diagnoses: $diagnoses, + rc_scores: $rc_scores, + tumor_sizes: $tumor_sizes, + chemo_regimen: $chemo_regimen, + tumor_grades: $tumor_grades, + er_status: $er_status, + pr_status: $pr_status, + endo_therapies: $endo_therapies, + meno_status: $meno_status, + tissue_type: $tissue_type, + composition: $composition, + association: $association, + file_type: $file_type, + age_at_index: $age_at_index + ) { + numberOfPrograms + numberOfStudies + numberOfSubjects + numberOfSamples + numberOfLabProcedures + numberOfFiles + armsByPrograms { + program + caseSize + children { + arm + caseSize + size + } + } + subjectCountByProgram { + group + subjects + } + subjectCountByStudy { + group + subjects + } + subjectCountByDiagnoses { + group + subjects + } + subjectCountByRecurrenceScore { + group + subjects + } + subjectCountByTumorSize { + group + subjects + } + subjectCountByChemotherapyRegimen { + group + subjects + } + subjectCountByEndocrineTherapy { + group + subjects + } + subjectCountByTumorGrade{ + group + subjects + } + subjectCountByErStatus{ + group + subjects + } + subjectCountByPrStatus{ + group + subjects + } + subjectCountByMenopauseStatus{ + group + subjects + } + subjectCountByFileType { + group + subjects + } + subjectCountByFileAssociation { + group + subjects + } + subjectCountByTissueComposition { + group + subjects + } + subjectCountByTissueType { + group + subjects + } + filterSubjectCountByProgram { + group + subjects + } + filterSubjectCountByStudy{ + group + subjects + } + filterSubjectCountByDiagnoses{ + group + subjects + } + filterSubjectCountByRecurrenceScore{ + group + subjects + } + filterSubjectCountByTumorSize{ + group + subjects + } + filterSubjectCountByTumorGrade{ + group + subjects + } + filterSubjectCountByErStatus{ + group + subjects + } + filterSubjectCountByPrStatus{ + group + subjects + } + filterSubjectCountByChemotherapyRegimen{ + group + subjects + } + filterSubjectCountByEndocrineTherapy{ + group + subjects + } + filterSubjectCountByMenopauseStatus{ + group + subjects + } + filterSubjectCountByTissueType{ + group + subjects + } + filterSubjectCountByTissueComposition{ + group + subjects + } + filterSubjectCountByFileAssociation{ + group + subjects + } + filterSubjectCountByFileType{ + group + subjects + } + filterSubjectCountByAge{ + lowerBound + upperBound + subjects + } + } +} +`; + +export const GET_SEARCH_NODECOUNTS = gql` + query nodeCounts($subject_ids: [String]=[], $sample_ids: [String] = [], $file_ids: [String]=[], $file_names: [String]=[]){ + nodeCountsFromLists(subject_ids: $subject_ids, sample_ids: $sample_ids, file_ids: $file_ids, file_names: $file_names) { + numberOfPrograms + numberOfStudies + numberOfSubjects + numberOfLabProcedures + numberOfSamples + numberOfFiles + } + + + +subjectCountByDiagnosesFromLists(subject_ids: $subject_ids, sample_ids: $sample_ids, file_ids: $file_ids, file_names: $file_names){ + group + subjects +} +subjectCountByRecurrenceScoreFromLists(subject_ids: $subject_ids, sample_ids: $sample_ids, file_ids: $file_ids, file_names: $file_names){ + group + subjects +} +subjectCountByTumorSizeFromLists(subject_ids: $subject_ids, sample_ids: $sample_ids, file_ids: $file_ids, file_names: $file_names) { + group + subjects +} +subjectCountByChemotherapyRegimenFromLists(subject_ids: $subject_ids, sample_ids: $sample_ids, file_ids: $file_ids, file_names: $file_names) { + group + subjects +} +subjectCountByEndocrineTherapyFromLists(subject_ids: $subject_ids, sample_ids: $sample_ids, file_ids: $file_ids, file_names: $file_names){ + group + subjects +} + +subjectCountByFileTypeFromLists(subject_ids: $subject_ids, sample_ids: $sample_ids, file_ids: $file_ids, file_names: $file_names) { + group + subjects +} + +armsByProgramsFromLists(subject_ids: $subject_ids, sample_ids: $sample_ids, file_ids: $file_ids, file_names: $file_names){ + program + caseSize + children{ + arm + caseSize + size + } +} + +findIdsFromLists(subject_ids: $subject_ids, sample_ids: $sample_ids, file_ids: $file_ids, file_names: $file_names){ + subjectIds + sampleIds + fileIds + fileNames +} +} + `; + +export const CASES_FILE_QUERY = gql` +query fileOverview( + $subject_ids: [String], + $file_ids: [String], + $programs: [String], + $studies: [String], + $diagnoses: [String], + $rc_scores: [String], + $tumor_sizes: [String], + $chemo_regimen: [String], + $tumor_grades: [String], + $er_status: [String], + $pr_status: [String], + $endo_therapies: [String], + $meno_status: [String], + $tissue_type: [String], + $composition: [String], + $association: [String], + $file_type: [String], + $age_at_index: [Float], + $first: Int, + $offset: Int, + $order_by: String + $sort_direction: String ){ + fileOverview( + subject_ids: $subject_ids, + file_ids: $file_ids, + programs: $programs, + studies: $studies, + diagnoses: $diagnoses, + rc_scores: $rc_scores, + tumor_sizes: $tumor_sizes, + chemo_regimen: $chemo_regimen, + tumor_grades: $tumor_grades, + er_status: $er_status, + pr_status: $pr_status, + endo_therapies: $endo_therapies, + meno_status: $meno_status, + tissue_type: $tissue_type, + composition: $composition, + association: $association, + file_type: $file_type, + age_at_index: $age_at_index, + first: $first, + offset: $offset, + order_by: $order_by, + sort_direction: $sort_direction + ){ + file_id, + file_name, + association, + file_description, + file_format, + file_size, + program, + arm, + subject_id, + sample_id, + diagnosis, + } +} +`; + +export const CASES_SAMPLE_QUERY = gql` +query sampleOverview( + $subject_ids: [String], + $sample_ids: [String], + $programs: [String] , + $studies: [String] , + $diagnoses: [String] , + $rc_scores: [String] , + $tumor_sizes: [String] , + $chemo_regimen: [String] , + $tumor_grades: [String] , + $er_status: [String] , + $pr_status: [String] , + $endo_therapies: [String] , + $meno_status: [String] , + $tissue_type: [String], + $composition: [String], + $association: [String], + $file_type: [String], + $age_at_index: [Float], + $first: Int, + $offset: Int, + $order_by: String + $sort_direction: String ){ + sampleOverview( + subject_ids: $subject_ids, + sample_ids: $sample_ids, + programs: $programs, + studies: $studies, + diagnoses: $diagnoses, + rc_scores: $rc_scores, + tumor_sizes: $tumor_sizes, + chemo_regimen: $chemo_regimen, + tumor_grades: $tumor_grades, + er_status: $er_status, + pr_status: $pr_status, + endo_therapies: $endo_therapies, + meno_status: $meno_status, + tissue_type: $tissue_type, + composition: $composition, + association: $association, + file_type: $file_type, + age_at_index: $age_at_index, + first: $first, + offset: $offset, + order_by: $order_by, + sort_direction: $sort_direction + ){ + sample_id, + subject_id, + program, + arm, + diagnosis, + tissue_type, + tissue_composition, + sample_anatomic_site, + sample_procurement_method, + platform, + files + } +}`; + +export const SUBJECT_OVERVIEW_QUERY = gql` +query subjectOverview( + $subject_ids: [String], + $programs: [String], + $studies: [String], + $diagnoses: [String], + $rc_scores: [String], + $tumor_sizes: [String], + $chemo_regimen: [String], + $tumor_grades: [String], + $er_status: [String], + $pr_status: [String], + $endo_therapies: [String], + $meno_status: [String], + $tissue_type: [String], + $composition: [String], + $association: [String], + $file_type: [String], + $age_at_index: [Float], + $first: Int, + $offset: Int, + $order_by: String, + $sort_direction: String ){ + subjectOverview( + subject_ids: $subject_ids, + programs: $programs, + studies: $studies, + diagnoses: $diagnoses, + rc_scores: $rc_scores, + tumor_sizes: $tumor_sizes, + chemo_regimen: $chemo_regimen, + tumor_grades: $tumor_grades, + er_status: $er_status, + pr_status: $pr_status, + endo_therapies: $endo_therapies, + meno_status: $meno_status, + tissue_type: $tissue_type, + composition: $composition, + association: $association, + file_type: $file_type, + age_at_index: $age_at_index, + first: $first, + offset: $offset, + order_by: $order_by, + sort_direction: $sort_direction + ) { + subject_id + program + program_id + study_acronym + study_short_description + study_info + diagnosis + recurrence_score + tumor_size + tumor_grade + er_status + pr_status + chemotherapy + endocrine_therapy + menopause_status + age_at_index + survival_time + survival_time_unit + files + lab_procedures + samples + } +} +`; + +export const widgetsSearchData = [ + { + type: 'sunburst', + label: 'Programs and Arms', + dataName: 'armsByProgramsFromLists', + mapWithDashboardWidget: 'armsByPrograms', + datatable_level1_field: 'program', + datatable_level2_field: 'study_acronym', + titleText: 'Cases', + show: true, + }, + { + type: 'donut', + label: 'Diagnosis', + dataName: 'subjectCountByDiagnosesFromLists', + mapWithDashboardWidget: 'subjectCountByDiagnoses', + titleText: 'Cases', + show: true, + }, + { + type: 'donut', + label: 'Recurrence Score', + dataName: 'subjectCountByRecurrenceScoreFromLists', + mapWithDashboardWidget: 'subjectCountByRecurrenceScore', + titleText: 'Cases', + show: true, + }, + { + type: 'donut', + label: 'Tumor Size', + dataName: 'subjectCountByTumorSizeFromLists', + mapWithDashboardWidget: 'subjectCountByTumorSize', + titleText: 'Cases', + show: true, + }, + { + type: 'donut', + label: 'Chemotherapy', + dataName: 'subjectCountByChemotherapyRegimenFromLists', + mapWithDashboardWidget: 'subjectCountByChemotherapyRegimen', + titleText: 'Cases', + show: true, + }, + { + type: 'donut', + label: 'Endocrine Therapy', + dataName: 'subjectCountByEndocrineTherapyFromLists', + mapWithDashboardWidget: 'subjectCountByEndocrineTherapy', + titleText: 'Cases', + show: true, + }, +]; + +export const ageAtIndex = 10; diff --git a/src/bento/programData.js b/src/bento/programData.js index b1ee00411..6d8567616 100644 --- a/src/bento/programData.js +++ b/src/bento/programData.js @@ -58,7 +58,7 @@ const table = { }, { dataField: 'num_studies', - header: 'Number of ARMs', + header: 'Number of Arms', }, { dataField: 'num_subjects', diff --git a/src/bento/search.js b/src/bento/search.js new file mode 100644 index 000000000..c21e7b4d7 --- /dev/null +++ b/src/bento/search.js @@ -0,0 +1,185 @@ +import gql from 'graphql-tag'; + +// --------------- Icons configuration -------------- +// Ideal size for programListingIcon is 100x100 px +// Ideal size for externalLinkIcon is 16x16 px +export const programListingIcon = { + src: 'https://raw.githubusercontent.com/CBIIT/datacommons-assets/main/bento/images/icons/svgs/programIcon.svg', + alt: 'Bento program logo', +}; + +export const SEARCH = gql` +query globalSearch($input: String){ + globalSearch(input: $input) { + programs { + program_id + } + studies { + study_id + } + subjects { + subject_id + } + samples { + sample_id + } + files { + file_id + } + model { + node_name + } + } +} +`; + +export const SEARCH_PAGE_RESULT_PROGRAM = gql` +query globalSearch($input: String, $first: Int, $offset: Int){ + globalSearch( + input: $input + first: $first + offset: $offset + ) { + programs { + type + program_id + program_name + program_code + } +} +} +`; + +export const SEARCH_PAGE_RESULT_STUDIES = gql` +query globalSearch($input: String, $first: Int, $offset: Int){ + globalSearch( + input: $input + first: $first + offset: $offset + ) { + studies { + type + study_id + program_id + study_name + study_type + study_code + } +} +} +`; + +export const SEARCH_PAGE_RESULT_SUBJECTS = gql` +query globalSearch($input: String, $first: Int, $offset: Int){ + globalSearch( + input: $input + first: $first + offset: $offset + ) { + subjects { + type + subject_id + program_id + diagnosis + age + } +} +} +`; + +export const SEARCH_PAGE_RESULT_SAMPLES = gql` +query globalSearch($input: String, $first: Int, $offset: Int){ + globalSearch( + input: $input + first: $first + offset: $offset + ) { + samples { + type + sample_id + program_id + subject_id + diagnosis + sample_anatomic_site + tissue_type + } +} +} +`; + +export const SEARCH_PAGE_RESULT_FILES = gql` +query globalSearch($input: String, $first: Int, $offset: Int){ + globalSearch( + input: $input + first: $first + offset: $offset + ) { + files { + type + file_id + file_name + file_format + program_id + subject_id + sample_id + } +} +} +`; + +export const SEARCH_PAGE_RESULT_MODEL = gql` +query globalSearch($input: String, $first: Int, $offset: Int){ + globalSearch( + input: $input + first: $first + offset: $offset + ) { + model { + type + node_name + property_name + property_description + property_required + property_type + value + highlight + } +} +} +`; + +export const SEARCH_PAGE_RESULT_ABOUT = gql` +query globalSearch($input: String, $first: Int, $offset: Int){ + globalSearch( + input: $input + first: $first + offset: $offset + ) { + + about_page { + type + text + page + title + } +} +} +`; + +export const SEARCH_PAGE_RESULTS = gql` +query globalSearch($input: String, $first: Int, $offset: Int){ + globalSearch( + input: $input + first: $first + offset: $offset + ) { + program_count + study_count + subject_count + sample_count + file_count + model_count + about_count +} +} +`; diff --git a/src/components/ActiveFiltersQuery/ActiveFiltersQuery.js b/src/components/ActiveFiltersQuery/ActiveFiltersQuery.js new file mode 100644 index 000000000..a1e853598 --- /dev/null +++ b/src/components/ActiveFiltersQuery/ActiveFiltersQuery.js @@ -0,0 +1,449 @@ +import React from 'react'; +import { withStyles } from '@material-ui/core'; +import { useSelector, useDispatch } from 'react-redux'; +import Button from '@material-ui/core/Button'; +import { + facetSectionVariables, +} from '../../bento/dashboardData'; +import { + clearAllFilters, localSearch, + addAutoComplete, + setSideBarToLoading, + uploadBulkModalSearch, + toggleCheckBox, + resetGroupSelections, +} from '../../pages/dashboardTab/store/dashboardReducer'; + +let updatedFilters = []; + +const ActiveFiltersQuery = ({ classes }) => { + // get all filters information from state + const allFiltersinfo = useSelector((state) => ( + state.dashboardTab + && state.dashboardTab.checkbox + ? state.dashboardTab.checkbox : {})); + const autoCompleteSelection = useSelector((state) => (state.dashboardTab + && state.dashboardTab.autoCompleteSelection + ? state.dashboardTab.autoCompleteSelection.subject_ids : {})); + const bulkUpload = useSelector((state) => (state.dashboardTab + && state.dashboardTab.bulkUpload ? state.dashboardTab.bulkUpload.subject_ids : {})); + // activeFilters helps filtering only active Filters + const activeFilters = []; + // Loop all filters except range filter to find active ones only + const rangeData = allFiltersinfo.data.filter((sideBar) => sideBar.slider === true); + allFiltersinfo.data = allFiltersinfo.data.filter((sideBar) => sideBar.slider !== true); + allFiltersinfo.data.map((currentFilter) => { + // currentFilterCheckboxItems contains checkbox items for currentFilter + const currentFilterCheckboxItems = currentFilter.checkboxItems; + + // loop currentFilterCheckboxItems + currentFilterCheckboxItems.forEach((checkBox) => { + // check if this checkBox is selected + if (checkBox.isChecked === true) { + // findIndex if the filter is already tracked by activeFilters + const findIndex = activeFilters.findIndex( + (x) => x.filterName === currentFilter.groupName, + ); + if ((activeFilters.findIndex((x) => x.filterName === currentFilter.groupName) !== -1)) { + activeFilters[findIndex].checkbox.push(checkBox.name); + } else { + activeFilters.push({ + filterName: currentFilter.groupName, + checkbox: [checkBox.name], + section: currentFilter.section, + datafield: currentFilter.datafield, + }); + } + } + }); + return ''; + }); + allFiltersinfo.data = allFiltersinfo.data.concat(rangeData); + if (allFiltersinfo.variables) { + allFiltersinfo.data.map((data) => { + if (allFiltersinfo.variables[data.datafield] + && allFiltersinfo.variables[data.datafield].length + && data.checkboxItems.length <= allFiltersinfo.variables[data.datafield].length) { + const index = activeFilters.findIndex((val) => val.filterName === data.groupName); + const filterObj = { + filterName: data.groupName, + checkbox: [...new Set(allFiltersinfo.variables[data.datafield])], + section: data.section, + datafield: data.datafield, + }; + if (index >= 0) { + activeFilters[index] = filterObj; + } else { + activeFilters.push(filterObj); + } + } + return activeFilters; + }); + updatedFilters = [...activeFilters]; + } + const dispatch = useDispatch(); + const onDeleteInputSet = () => { + uploadBulkModalSearch([], 'subject'); + }; + const getInputSet = () => { + if (bulkUpload.length && autoCompleteSelection.length) { + return ( + <> + {' '} + + INPUT CASE SET + + {' '} + + ); + } + return null; + }; + + const onDeleteCaseIds = (title) => { + const index = autoCompleteSelection.findIndex((v) => v === title); + if (index >= 0) { + const newValue = [...autoCompleteSelection]; + newValue.splice(index, 1); + addAutoComplete({ + type: 'subject', + newValue, + isFilteredData: true, + }); + setSideBarToLoading(); + localSearch(newValue, true); + } + }; + + const onDeleteFilterCheckbox = (filterData, checkboxName) => { + const payload = [{ + datafield: filterData.datafield, + groupName: filterData.filterName, + isChecked: false, + name: checkboxName, + section: filterData.section, + }]; + dispatch(toggleCheckBox(payload, true)); + }; + + const getFilterJoin = (data, idx, isLastIndex, isFilter, filterData = []) => ( + <> + (isFilter + ? onDeleteFilterCheckbox(filterData, data) + : onDeleteCaseIds(data))} + > + {data} + + {isLastIndex ? null : ' '} + + ); + + const removeCaseIds = () => { + const newValue = []; + addAutoComplete({ + type: 'subject', + newValue, + }); + setSideBarToLoading(); + localSearch(newValue, true); + }; + + const clearQuery = () => { + updatedFilters = []; + clearAllFilters(); + }; + return ( +
+ {(updatedFilters.length || autoCompleteSelection.length || bulkUpload.length) > 0 ? ( +
+ + + + {(autoCompleteSelection.length || bulkUpload.length) ? ( + + {(bulkUpload.length && !autoCompleteSelection.length) + ? ( + + INPUT CASE SET + + ) : null} + {autoCompleteSelection.length + ? ( + + {' '} + + Case IDs + + {' '} + {' '} + + {(autoCompleteSelection.length === 1 && !bulkUpload.length) ? 'IS ' : 'IN '} + + + ) : null} + + {autoCompleteSelection.length === 1 + ? ( + <> + {bulkUpload.length ? ( : null} + {getInputSet()} + onDeleteCaseIds(autoCompleteSelection[0])} + > + {autoCompleteSelection[0]} + + {bulkUpload.length + ? ) + : null} + + ) : autoCompleteSelection.length >= 3 ? ( + <> + ( + {getInputSet()} + onDeleteCaseIds(autoCompleteSelection[0])} + > + {autoCompleteSelection[0]} + + {' '} + onDeleteCaseIds(autoCompleteSelection[1])} + > + {autoCompleteSelection[1]} + + ... + ) + + ) : ( + autoCompleteSelection.length + ? ( + <> + ( + {getInputSet()} + {autoCompleteSelection.map((data, idx) => ( + getFilterJoin( + data, + idx, + autoCompleteSelection.length - 1 === idx, + false, + ) + ))} + ) + + ) + : null + )} + + + ) : null} + { + ((autoCompleteSelection.length || bulkUpload.length) && updatedFilters.length) + ? AND + : null + } + {updatedFilters.map((filter, index) => ( + + + {' '} + {index !== 0 ? AND : ''} + dispatch(resetGroupSelections({ + dataField: filter.datafield, + groupName: filter.filterName, + }))} + > + {filter.filterName} + + {' '} + + + {' '} + + {filter.checkbox.length === 1 ? 'IS ' : 'IN '} + + {filter.checkbox.length === 1 + ? ( + onDeleteFilterCheckbox(filter, filter.checkbox[0])} + > + {filter.checkbox[0]} + + ) : filter.checkbox.length >= 3 ? ( + <> + ( + onDeleteFilterCheckbox(filter, filter.checkbox[0])} + > + {filter.checkbox[0]} + + {' '} + onDeleteFilterCheckbox(filter, filter.checkbox[1])} + > + {filter.checkbox[1]} + + ... + ) + + ) : ( + <> + ( + {filter.checkbox.map((data, idx) => ( + getFilterJoin(data, idx, filter.checkbox.length - 1 === idx, true, filter) + ))} + ) + + )} + + + ))} + +
+ ) : ''} +
+ ); +}; + +const styles = () => ({ + queryWrapper: { + height: '120px', + backgroundColor: '#f1f1f1', + padding: '14px 14px 0px 21px', + overflowY: 'auto', + }, + queryContainer: { + marginLeft: 7, + position: 'relative', + lineHeight: '2.2em', + letterSpacing: '0.5px', + fontFamily: 'Nunito', + fontSize: '14px', + color: '#0e3151', + }, + filterName: { + textTransform: 'uppercase', + padding: '5px 6px 5px 7px', + borderRadius: 4, + fontSize: 12, + fontWeight: 600, + cursor: 'pointer', + }, + filterCheckboxes: { + padding: '4px 7px 3px 6px', + borderRadius: 4, + fontSize: 12, + fontWeight: 600, + border: '0.75px solid #898989', + width: 'fit-content', + backgroundColor: '#fff', + cursor: 'pointer', + // borderBottom: '2px solid #10A075', + }, + bracketsOpen: { + fontSize: 18, + fontFamily: 'Nunito Sans Semibold', + color: '#787878', + marginRight: 3, + fontWeight: 600, + }, + bracketsClose: { + fontSize: 18, + fontFamily: 'Nunito Sans Semibold', + color: '#787878', + marginLeft: 3, + fontWeight: 600, + }, + operators: { + color: '#646464', + marginLeft: '3px', + marginRight: '3px', + borderBottom: 'none', + textDecoration: 'none', + fontSize: 10, + fontWeight: 'bold', + }, + clearQueryButton: { + margin: '1px', + fontWeight: 600, + fontSize: '13px', + color: '#fff', + borderRadius: '15px', + fontFamily: 'Nunito', + boxSizing: 'border-box', + backgroundColor: '#969696', + textTransform: 'capitalize', + border: '1px solid #B4B4B4', + padding: '1px 5px 0px 6px', + '&:hover': { + backgroundColor: '#969696', + }, + }, + divider: { + borderRight: '2px solid #969696', + marginLeft: 7, + }, +}); + +export default withStyles(styles, { withTheme: true })(ActiveFiltersQuery); diff --git a/src/components/DocumentDownload/DocumentDownloadView.js b/src/components/DocumentDownload/DocumentDownloadView.js index 07c831446..135f6b134 100644 --- a/src/components/DocumentDownload/DocumentDownloadView.js +++ b/src/components/DocumentDownload/DocumentDownloadView.js @@ -3,9 +3,10 @@ import { withStyles, } from '@material-ui/core'; import { ToolTip } from 'bento-components'; - +import { Link } from 'react-router-dom'; import env from '../../utils/env'; import CustomIcon from '../CustomIcon/CustomIconView'; +import { jBrowseOptions } from '../../bento/jbrowseDetailData'; const FILE_SERVICE_API = env.REACT_APP_FILE_SERVICE_API; @@ -36,18 +37,29 @@ const fetchFileToDownload = (fileURL = '') => { const DocumentDownload = ({ classes, fileSize = 0, - maxFileSize = 2000, + fileFormat = '', + maxFileSize = 200000, toolTipTextFileDownload = 'Download a copy of this file', toolTipTextFilePreview = 'Because of its size and/or format, this file is unavailable for download and must be accessed via the My Files workflow', + toolTipTextFileViewer = 'Jbrowse file viewer', iconFileDownload = '', iconFilePreview = '', + iconFileViewer = '', fileLocation = '', + caseId = '', }) => ( <> - { fileSize < maxFileSize ? ( + { (fileFormat === 'bam' || fileFormat === 'bai') && jBrowseOptions.jBrowse ? ( + + + + + + ) : fileSize < maxFileSize ? (
fetchFileToDownload(fileLocation)}> -
diff --git a/src/components/FileUploader/index.jsx b/src/components/FileUploader/index.jsx new file mode 100644 index 000000000..847276486 --- /dev/null +++ b/src/components/FileUploader/index.jsx @@ -0,0 +1,73 @@ +import React, { useEffect, useState } from 'react'; +import { + withStyles, + Button, + Typography, + Divider, +} from '@material-ui/core'; +import RefreshIcon from '@material-ui/icons/Refresh'; +import styles from './uploaderStyle'; + +const Uploader = ({ + classes, + onFileUpload, + isClear, + clearData, + uploadedFileName, +}) => { + const [fileName, setFileName] = useState(''); + + useEffect(() => { + setFileName(uploadedFileName); + if (isClear) { + setFileName(''); + } + }, [isClear]); + const handleChange = async (e) => { + const file = e.target.files[0]; + const fileReaderObj = new FileReader(); + fileReaderObj.onload = () => { + onFileUpload(fileReaderObj.result, file.name); + }; + + setFileName(file.name); + if (file.type === 'text/csv') { + fileReaderObj.readAsBinaryString(file); + } else { + fileReaderObj.readAsText(file); + } + }; + + return ( +
+
+ + +
+
+ { + fileName + ? ( +
+ {fileName} + +
+ ) + : null + } + +
+
+ ); +}; + +export default withStyles(styles)(Uploader); diff --git a/src/components/FileUploader/uploaderStyle.js b/src/components/FileUploader/uploaderStyle.js new file mode 100644 index 000000000..65468e961 --- /dev/null +++ b/src/components/FileUploader/uploaderStyle.js @@ -0,0 +1,36 @@ +const styles = () => ({ + fileUploader: { + width: '100%', + height: '35px', + display: 'flex', + position: 'relative', + marginBottom: '10px', + alignItems: 'center', + }, + uploaderComponent: { + height: '35px', + alignSelf: 'center', + marginRight: '10px', + marginBottom: '10px', + }, + fileName: { + marginLeft: '101px', + alignSelf: 'center', + }, + uploadInput: { + opacity: 0, + zIndex: 4, + width: '96px', + height: '35px', + position: 'absolute', + }, + uploadButton: { + zIndex: 1, + color: 'white', + position: 'absolute', + backgroundColor: 'blue', + marginBottom: '12px', + }, +}); + +export default styles; diff --git a/src/components/Footer/FooterView.js b/src/components/Footer/FooterView.js index eaa46238f..120eedcc2 100644 --- a/src/components/Footer/FooterView.js +++ b/src/components/Footer/FooterView.js @@ -1,10 +1,26 @@ -/* eslint-disable */ - -import React from 'react'; +import React, { useEffect, useState } from 'react'; import { Footer } from 'bento-components'; -import FooterData from '../../bento/globalFooterData.js'; +import FooterData from '../../bento/globalFooterData'; +import env from '../../utils/env'; + +const FILE_SERVICE_API = env.REACT_APP_FILE_SERVICE_API; + +const ICDCFooter = () => { + const [footerUpdatedData, setFooterUpdatedData] = useState(FooterData); + + useEffect(() => { + const getSystems = async () => { + const response = await fetch( + `${FILE_SERVICE_API}version`, + ).then((resp) => (resp)) + .catch(() => ({ version: '' })); + const data = response.json(); + setFooterUpdatedData({ ...FooterData, ...{ FileServiceVersion: data.version || '' } }); + }; + getSystems(); + }, [FooterData]); -// import nihLogo from '../../assets/header/icdc_nih_logo.svg'; + return <>