synapse-react-client 4.0.46 → 4.0.47
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/SWC.index.js +1 -1
- package/dist/aridhia-queries/useSubmitAridhiaDar.js +2 -2
- package/dist/aridhia-queries/useSubmitAridhiaDar.js.map +1 -1
- package/dist/components/AccessTokenPage/CreateAccessTokenModal.js +1 -1
- package/dist/components/AccessTokenPage/CreateAccessTokenModal.js.map +1 -1
- package/dist/components/AccountLevelBadges/AccountLevelBadges.js +1 -1
- package/dist/components/AccountLevelBadges/AccountLevelBadges.js.map +1 -1
- package/dist/components/AclEditor/AclEditor.test-utils.js +3 -5
- package/dist/components/AclEditor/AclEditor.test-utils.js.map +1 -1
- package/dist/components/Aridhia/AridhiaAccessStatus.d.ts.map +1 -1
- package/dist/components/Aridhia/AridhiaAccessStatus.js +43 -30
- package/dist/components/Aridhia/AridhiaAccessStatus.js.map +1 -1
- package/dist/components/Aridhia/AridhiaDarStatusPopover.d.ts +6 -2
- package/dist/components/Aridhia/AridhiaDarStatusPopover.d.ts.map +1 -1
- package/dist/components/Aridhia/AridhiaDarStatusPopover.js +101 -31
- package/dist/components/Aridhia/AridhiaDarStatusPopover.js.map +1 -1
- package/dist/components/Aridhia/aridhiaAccessStatusUtils.d.ts +11 -9
- package/dist/components/Aridhia/aridhiaAccessStatusUtils.d.ts.map +1 -1
- package/dist/components/Aridhia/aridhiaAccessStatusUtils.js +24 -13
- package/dist/components/Aridhia/aridhiaAccessStatusUtils.js.map +1 -1
- package/dist/components/Authentication/LastLoginInfo.js +2 -2
- package/dist/components/Authentication/LastLoginInfo.js.map +1 -1
- package/dist/components/Authentication/RecoveryCodeForm.js +1 -1
- package/dist/components/Authentication/RecoveryCodeForm.js.map +1 -1
- package/dist/components/Authentication/RecoveryCodeGrid.js.map +1 -1
- package/dist/components/Authentication/TOTPForm.d.ts.map +1 -1
- package/dist/components/Authentication/TOTPForm.js +3 -3
- package/dist/components/Authentication/TOTPForm.js.map +1 -1
- package/dist/components/Authentication/index.d.ts +6 -6
- package/dist/components/Authentication/index.d.ts.map +1 -1
- package/dist/components/CannedRejectionDialog/CannedRejectionDialog.js +1 -1
- package/dist/components/CannedRejectionDialog/CannedRejectionDialog.js.map +1 -1
- package/dist/components/CardContainer/CardContainer.js +7 -7
- package/dist/components/CardContainer/CardContainer.js.map +1 -1
- package/dist/components/ChallengeRequirementsModal/ChallengeRequirementsModal.js +1 -1
- package/dist/components/ChallengeRequirementsModal/ChallengeRequirementsModal.js.map +1 -1
- package/dist/components/ChallengeSubmission/ChallengeSubmission.d.ts.map +1 -1
- package/dist/components/ChallengeSubmission/ChallengeSubmission.js +1 -1
- package/dist/components/ChallengeSubmission/ChallengeSubmission.js.map +1 -1
- package/dist/components/ChallengeTeamWizard/SelectChallengeTeam.js +1 -1
- package/dist/components/ChallengeTeamWizard/SelectChallengeTeam.js.map +1 -1
- package/dist/components/CitationPopover/CitationPopoverUtils.js +2 -2
- package/dist/components/CitationPopover/CitationPopoverUtils.js.map +1 -1
- package/dist/components/CohortBuilder/CohortBuilder.css +1 -0
- package/dist/components/CohortBuilder/CohortBuilder.d.ts +35 -0
- package/dist/components/CohortBuilder/CohortBuilder.d.ts.map +1 -0
- package/dist/components/CohortBuilder/CohortBuilder.js +108 -0
- package/dist/components/CohortBuilder/CohortBuilder.js.map +1 -0
- package/dist/components/CohortBuilder/CohortBuilder.module.js +10 -0
- package/dist/components/CohortBuilder/CohortBuilder.module.js.map +1 -0
- package/dist/components/CohortBuilder/CohortBuilder.module.scss +20 -0
- package/dist/components/CohortBuilder/CohortFilesPanel.d.ts +16 -0
- package/dist/components/CohortBuilder/CohortFilesPanel.d.ts.map +1 -0
- package/dist/components/CohortBuilder/CohortFilesPanel.js +124 -0
- package/dist/components/CohortBuilder/CohortFilesPanel.js.map +1 -0
- package/dist/components/CohortBuilder/cohortHandOff.d.ts +25 -0
- package/dist/components/CohortBuilder/cohortHandOff.d.ts.map +1 -0
- package/dist/components/CohortBuilder/cohortHandOff.js +26 -0
- package/dist/components/CohortBuilder/cohortHandOff.js.map +1 -0
- package/dist/components/ColumnFilter/ColumnFilter.d.ts.map +1 -1
- package/dist/components/ColumnFilter/ColumnFilter.js +14 -13
- package/dist/components/ColumnFilter/ColumnFilter.js.map +1 -1
- package/dist/components/DataExplorer/DataExplorer.d.ts.map +1 -1
- package/dist/components/DataExplorer/DataExplorer.js.map +1 -1
- package/dist/components/DataGrid/columns/AutocompleteColumn.d.ts +11 -2
- package/dist/components/DataGrid/columns/AutocompleteColumn.d.ts.map +1 -1
- package/dist/components/DataGrid/columns/AutocompleteColumn.js +115 -109
- package/dist/components/DataGrid/columns/AutocompleteColumn.js.map +1 -1
- package/dist/components/DataGrid/columns/NumberColumn.js +1 -1
- package/dist/components/DataGrid/columns/NumberColumn.js.map +1 -1
- package/dist/components/DataGrid/columns/NumberOrEnumColumn.d.ts +20 -0
- package/dist/components/DataGrid/columns/NumberOrEnumColumn.d.ts.map +1 -0
- package/dist/components/DataGrid/columns/NumberOrEnumColumn.js +18 -0
- package/dist/components/DataGrid/columns/NumberOrEnumColumn.js.map +1 -0
- package/dist/components/DataGrid/components/contextMenu.js +3 -3
- package/dist/components/DataGrid/components/contextMenu.js.map +1 -1
- package/dist/components/DataGrid/hooks/useGridUndoRedo.d.ts.map +1 -1
- package/dist/components/DataGrid/hooks/useGridUndoRedo.js +9 -7
- package/dist/components/DataGrid/hooks/useGridUndoRedo.js.map +1 -1
- package/dist/components/DataGrid/hooks/useStack.d.ts +1 -1
- package/dist/components/DataGrid/hooks/useStack.js +2 -2
- package/dist/components/DataGrid/hooks/useStack.js.map +1 -1
- package/dist/components/DataGrid/utils/columnFactory.d.ts.map +1 -1
- package/dist/components/DataGrid/utils/columnFactory.js +47 -42
- package/dist/components/DataGrid/utils/columnFactory.js.map +1 -1
- package/dist/components/DataGrid/utils/extractColumnValidationMessages.js +7 -7
- package/dist/components/DataGrid/utils/extractColumnValidationMessages.js.map +1 -1
- package/dist/components/DataGrid/utils/json-rx/JsonRx.js +2 -2
- package/dist/components/DataGrid/utils/json-rx/JsonRx.js.map +1 -1
- package/dist/components/DownloadCart/DownloadIneligibleForPackagingFilesFromListButton.js +1 -1
- package/dist/components/DownloadCart/DownloadIneligibleForPackagingFilesFromListButton.js.map +1 -1
- package/dist/components/DownloadCart/MeetAccessRequirementCard.js +1 -1
- package/dist/components/DownloadCart/MeetAccessRequirementCard.js.map +1 -1
- package/dist/components/EntityDownloadConfirmation/EntityDownloadConfirmation.js +5 -5
- package/dist/components/EntityDownloadConfirmation/EntityDownloadConfirmation.js.map +1 -1
- package/dist/components/EntityFinder/details/view/DetailsView.d.ts.map +1 -1
- package/dist/components/EntityFinder/details/view/DetailsView.js +4 -4
- package/dist/components/EntityFinder/details/view/DetailsView.js.map +1 -1
- package/dist/components/EntityHeaderTable/EntityHeaderTable.js +4 -4
- package/dist/components/EntityHeaderTable/Filter.d.ts.map +1 -1
- package/dist/components/EntityHeaderTable/Filter.js +1 -1
- package/dist/components/EntityHeaderTable/Filter.js.map +1 -1
- package/dist/components/Evaluation/EvaluationRoundEditor.js.map +1 -1
- package/dist/components/FeaturedDataTabs/FacetPlotsCard.d.ts.map +1 -1
- package/dist/components/FeaturedDataTabs/FacetPlotsCard.js +80 -84
- package/dist/components/FeaturedDataTabs/FacetPlotsCard.js.map +1 -1
- package/dist/components/FormTemplateEditor/FormStructurePanel.js +7 -7
- package/dist/components/FormTemplateEditor/StepCard.js +9 -9
- package/dist/components/FormTemplateEditor/schemaFieldUtils.js +2 -2
- package/dist/components/FormTemplateEditor/schemaFieldUtils.js.map +1 -1
- package/dist/components/FullTextSearch/FullTextSearch.js +8 -8
- package/dist/components/GenericCard/CardUtils.js.map +1 -1
- package/dist/components/GenericCard/DuoTermTags/DuoTermTags.js +1 -1
- package/dist/components/GenericCard/DuoTermTags/DuoTermTags.js.map +1 -1
- package/dist/components/GenericCard/DuoTermTags/duoTerms.js +1 -1
- package/dist/components/GenericCard/DuoTermTags/duoTerms.js.map +1 -1
- package/dist/components/GenericCard/TableRowGenericCard.js +37 -37
- package/dist/components/GoalsV3/GoalsV3.js +1 -1
- package/dist/components/GoalsV3/GoalsV3.js.map +1 -1
- package/dist/components/HexGrid/HexGrid.d.ts +3 -1
- package/dist/components/HexGrid/HexGrid.d.ts.map +1 -1
- package/dist/components/HexGrid/HexGrid.js +14 -13
- package/dist/components/HexGrid/HexGrid.js.map +1 -1
- package/dist/components/IconSvg/index.d.ts +1 -1
- package/dist/components/IconSvg/index.d.ts.map +1 -1
- package/dist/components/IconSvg/index.js.map +1 -1
- package/dist/components/JsonSchemaForm/templates/BaseInputTemplate.d.ts.map +1 -1
- package/dist/components/JsonSchemaForm/templates/BaseInputTemplate.js +3 -3
- package/dist/components/JsonSchemaForm/templates/BaseInputTemplate.js.map +1 -1
- package/dist/components/Markdown/MarkdownEditor.js +1 -1
- package/dist/components/Markdown/MarkdownEditor.js.map +1 -1
- package/dist/components/Markdown/widget/index.d.ts +1 -1
- package/dist/components/Markdown/widget/index.d.ts.map +1 -1
- package/dist/components/ModalDownload/ModalDownload.d.ts.map +1 -1
- package/dist/components/ModalDownload/ModalDownload.js +2 -1
- package/dist/components/ModalDownload/ModalDownload.js.map +1 -1
- package/dist/components/Plot/BarPlot.js +1 -1
- package/dist/components/Plot/BarPlot.js.map +1 -1
- package/dist/components/Plot/PlotPanelHeader.d.ts +3 -2
- package/dist/components/Plot/PlotPanelHeader.d.ts.map +1 -1
- package/dist/components/Plot/PlotPanelHeader.js.map +1 -1
- package/dist/components/ProgrammaticTableDownload/ProgrammaticTableDownload.js +1 -1
- package/dist/components/ProgrammaticTableDownload/ProgrammaticTableDownload.js.map +1 -1
- package/dist/components/ProvenanceGraph/ProvenanceExternalIcon.js +1 -1
- package/dist/components/ProvenanceGraph/ProvenanceExternalIcon.js.map +1 -1
- package/dist/components/ProvenanceGraph/ProvenanceGraph.d.ts.map +1 -1
- package/dist/components/ProvenanceGraph/ProvenanceGraph.js +3 -3
- package/dist/components/ProvenanceGraph/ProvenanceGraph.js.map +1 -1
- package/dist/components/QueryBuilder/FilterConditionRow.d.ts.map +1 -1
- package/dist/components/QueryBuilder/FilterConditionRow.js +28 -27
- package/dist/components/QueryBuilder/FilterConditionRow.js.map +1 -1
- package/dist/components/QueryBuilder/FilterGroupNode.d.ts.map +1 -1
- package/dist/components/QueryBuilder/FilterGroupNode.js +91 -75
- package/dist/components/QueryBuilder/FilterGroupNode.js.map +1 -1
- package/dist/components/QueryBuilder/QueryBuilderControls.css +1 -1
- package/dist/components/QueryBuilder/QueryBuilderControls.d.ts.map +1 -1
- package/dist/components/QueryBuilder/QueryBuilderControls.js +91 -79
- package/dist/components/QueryBuilder/QueryBuilderControls.js.map +1 -1
- package/dist/components/QueryBuilder/QueryBuilderControls.module.js +11 -11
- package/dist/components/QueryBuilder/QueryBuilderControls.module.js.map +1 -1
- package/dist/components/QueryBuilder/QueryBuilderControls.module.scss +2 -0
- package/dist/components/QueryBuilder/QueryBuilderInternalContext.d.ts +2 -0
- package/dist/components/QueryBuilder/QueryBuilderInternalContext.d.ts.map +1 -1
- package/dist/components/QueryBuilder/QueryBuilderInternalContext.js.map +1 -1
- package/dist/components/QueryBuilder/queryBuilderLimits.d.ts +18 -0
- package/dist/components/QueryBuilder/queryBuilderLimits.d.ts.map +1 -0
- package/dist/components/QueryBuilder/queryBuilderLimits.js +38 -0
- package/dist/components/QueryBuilder/queryBuilderLimits.js.map +1 -0
- package/dist/components/QueryBuilder/queryBuilderMetadata.d.ts +0 -8
- package/dist/components/QueryBuilder/queryBuilderMetadata.d.ts.map +1 -1
- package/dist/components/QueryBuilder/queryBuilderMetadata.js +6 -9
- package/dist/components/QueryBuilder/queryBuilderMetadata.js.map +1 -1
- package/dist/components/QueryBuilder/queryBuilderTranslation.d.ts +5 -4
- package/dist/components/QueryBuilder/queryBuilderTranslation.d.ts.map +1 -1
- package/dist/components/QueryBuilder/queryBuilderTranslation.js +58 -33
- package/dist/components/QueryBuilder/queryBuilderTranslation.js.map +1 -1
- package/dist/components/QueryBuilder/useQBCombinedSql.d.ts.map +1 -1
- package/dist/components/QueryBuilder/useQBCombinedSql.js +4 -4
- package/dist/components/QueryBuilder/useQBCombinedSql.js.map +1 -1
- package/dist/components/QueryBuilder/useQBValueDisplayName.d.ts.map +1 -1
- package/dist/components/QueryBuilder/useQBValueDisplayName.js +5 -5
- package/dist/components/QueryBuilder/useQBValueDisplayName.js.map +1 -1
- package/dist/components/QuerySortSelector.js +5 -5
- package/dist/components/QueryVisualizationWrapper/QueryVisualizationWrapper.js +21 -21
- package/dist/components/QueryVisualizationWrapper/QueryVisualizationWrapper.js.map +1 -1
- package/dist/components/QueryWrapper/AggregateQueryErrorNotice.d.ts +20 -0
- package/dist/components/QueryWrapper/AggregateQueryErrorNotice.d.ts.map +1 -0
- package/dist/components/QueryWrapper/AggregateQueryErrorNotice.js +50 -0
- package/dist/components/QueryWrapper/AggregateQueryErrorNotice.js.map +1 -0
- package/dist/components/QueryWrapper/TableQueryUseQueryOptions.d.ts +5 -3
- package/dist/components/QueryWrapper/TableQueryUseQueryOptions.d.ts.map +1 -1
- package/dist/components/QueryWrapper/TableQueryUseQueryOptions.js +7 -3
- package/dist/components/QueryWrapper/TableQueryUseQueryOptions.js.map +1 -1
- package/dist/components/QueryWrapper/downloadListFiles.d.ts +25 -0
- package/dist/components/QueryWrapper/downloadListFiles.d.ts.map +1 -0
- package/dist/components/QueryWrapper/downloadListFiles.js +39 -0
- package/dist/components/QueryWrapper/downloadListFiles.js.map +1 -0
- package/dist/components/QueryWrapper/useAddSelectedRowsToDownloadList.d.ts +16 -0
- package/dist/components/QueryWrapper/useAddSelectedRowsToDownloadList.d.ts.map +1 -0
- package/dist/components/QueryWrapper/useAddSelectedRowsToDownloadList.js +50 -0
- package/dist/components/QueryWrapper/useAddSelectedRowsToDownloadList.js.map +1 -0
- package/dist/components/QueryWrapper/useGetAddToDownloadListRequestForCurrentQuery.d.ts +4 -1
- package/dist/components/QueryWrapper/useGetAddToDownloadListRequestForCurrentQuery.d.ts.map +1 -1
- package/dist/components/QueryWrapper/useGetAddToDownloadListRequestForCurrentQuery.js +15 -28
- package/dist/components/QueryWrapper/useGetAddToDownloadListRequestForCurrentQuery.js.map +1 -1
- package/dist/components/QueryWrapper/useOnQueryDataChange.d.ts.map +1 -1
- package/dist/components/QueryWrapper/useOnQueryDataChange.js +7 -6
- package/dist/components/QueryWrapper/useOnQueryDataChange.js.map +1 -1
- package/dist/components/QueryWrapperErrorBoundary.d.ts +3 -1
- package/dist/components/QueryWrapperErrorBoundary.d.ts.map +1 -1
- package/dist/components/QueryWrapperErrorBoundary.js +26 -21
- package/dist/components/QueryWrapperErrorBoundary.js.map +1 -1
- package/dist/components/QueryWrapperPlotNav/LastUpdatedOn.js +7 -7
- package/dist/components/QueryWrapperPlotNav/QueryWrapperPlotNav.d.ts +2 -2
- package/dist/components/QueryWrapperPlotNav/QueryWrapperPlotNav.d.ts.map +1 -1
- package/dist/components/QueryWrapperPlotNav/QueryWrapperPlotNav.js +34 -32
- package/dist/components/QueryWrapperPlotNav/QueryWrapperPlotNav.js.map +1 -1
- package/dist/components/QueryWrapperPlotNav/QueryWrapperSynapsePlot.js +7 -7
- package/dist/components/QueryWrapperPlotNav/UseRowSet.d.ts.map +1 -1
- package/dist/components/QueryWrapperPlotNav/UseRowSet.js +12 -12
- package/dist/components/QueryWrapperPlotNav/UseRowSet.js.map +1 -1
- package/dist/components/RowDataTable/CategorizedRowDataTable.css +1 -0
- package/dist/components/RowDataTable/CategorizedRowDataTable.d.ts +33 -0
- package/dist/components/RowDataTable/CategorizedRowDataTable.d.ts.map +1 -0
- package/dist/components/RowDataTable/CategorizedRowDataTable.js +64 -0
- package/dist/components/RowDataTable/CategorizedRowDataTable.js.map +1 -0
- package/dist/components/RowDataTable/CategorizedRowDataTable.module.js +8 -0
- package/dist/components/RowDataTable/CategorizedRowDataTable.module.js.map +1 -0
- package/dist/components/RowDataTable/CategorizedRowDataTable.module.scss +18 -0
- package/dist/components/RowDataTable/RowDataTable.d.ts +13 -0
- package/dist/components/RowDataTable/RowDataTable.d.ts.map +1 -1
- package/dist/components/RowDataTable/RowDataTable.js +25 -8
- package/dist/components/RowDataTable/RowDataTable.js.map +1 -1
- package/dist/components/RssFeedCards/RssFeedCards.js +1 -1
- package/dist/components/RssFeedCards/RssFeedCards.js.map +1 -1
- package/dist/components/SchemaDrivenAnnotationEditor/field/AdditionalPropertiesSchemaField.d.ts.map +1 -1
- package/dist/components/SchemaDrivenAnnotationEditor/field/AdditionalPropertiesSchemaField.js +2 -2
- package/dist/components/SchemaDrivenAnnotationEditor/field/AdditionalPropertiesSchemaField.js.map +1 -1
- package/dist/components/SchemaDrivenAnnotationEditor/template/ObjectFieldTemplate.js +1 -1
- package/dist/components/SchemaDrivenAnnotationEditor/template/ObjectFieldTemplate.js.map +1 -1
- package/dist/components/SearchQueryWrapper/SearchQueryUseQueryOptions.d.ts +17 -9
- package/dist/components/SearchQueryWrapper/SearchQueryUseQueryOptions.d.ts.map +1 -1
- package/dist/components/SearchQueryWrapper/SearchQueryUseQueryOptions.js +39 -30
- package/dist/components/SearchQueryWrapper/SearchQueryUseQueryOptions.js.map +1 -1
- package/dist/components/SetAccessRequirementCommonFields/SetAccessRequirementCommonFields.js +24 -24
- package/dist/components/SetAccessRequirementCommonFields/SetAccessRequirementCommonFields.js.map +1 -1
- package/dist/components/StandaloneQueryWrapper/StandaloneQueryWrapper.js +8 -8
- package/dist/components/SynapseChat/SynapseChatMessage.js +1 -1
- package/dist/components/SynapseChat/SynapseChatMessage.js.map +1 -1
- package/dist/components/SynapseForm/NavButtons.js.map +1 -1
- package/dist/components/SynapseForm/StepsSideNav.js.map +1 -1
- package/dist/components/SynapseSearchPageResults/HighlightedTypography.js +1 -1
- package/dist/components/SynapseSearchPageResults/HighlightedTypography.js.map +1 -1
- package/dist/components/SynapseSearchPageResults/SearchFacetPanel/SearchFacetPanelUtils.d.ts.map +1 -1
- package/dist/components/SynapseSearchPageResults/SearchFacetPanel/SearchFacetPanelUtils.js +3 -3
- package/dist/components/SynapseSearchPageResults/SearchFacetPanel/SearchFacetPanelUtils.js.map +1 -1
- package/dist/components/SynapseTable/RowSelection/RowSelectionControls.d.ts.map +1 -1
- package/dist/components/SynapseTable/RowSelection/RowSelectionControls.js +38 -44
- package/dist/components/SynapseTable/RowSelection/RowSelectionControls.js.map +1 -1
- package/dist/components/SynapseTable/RowSelection/RowSelectionUI.js +4 -4
- package/dist/components/SynapseTable/SqlEditor.js +7 -7
- package/dist/components/SynapseTable/SynapseTable.js +8 -8
- package/dist/components/SynapseTable/SynapseTable.js.map +1 -1
- package/dist/components/SynapseTable/SynapseTableRenderers.d.ts.map +1 -1
- package/dist/components/SynapseTable/SynapseTableRenderers.js +73 -72
- package/dist/components/SynapseTable/SynapseTableRenderers.js.map +1 -1
- package/dist/components/SynapseTable/SynapseTableUtils.js +1 -1
- package/dist/components/SynapseTable/SynapseTableUtils.js.map +1 -1
- package/dist/components/SynapseTable/TopLevelControls/TopLevelControls.d.ts.map +1 -1
- package/dist/components/SynapseTable/TopLevelControls/TopLevelControls.js +44 -45
- package/dist/components/SynapseTable/TopLevelControls/TopLevelControls.js.map +1 -1
- package/dist/components/SynapseTable/datasets/DatasetEditorVersionCell.js +1 -1
- package/dist/components/SynapseTable/datasets/DatasetEditorVersionCell.js.map +1 -1
- package/dist/components/SynapseTable/datasets/DatasetItemsEditor.d.ts.map +1 -1
- package/dist/components/SynapseTable/datasets/DatasetItemsEditor.js +142 -142
- package/dist/components/SynapseTable/datasets/DatasetItemsEditor.js.map +1 -1
- package/dist/components/SynapseTable/export/ExportToAnalysisPlatformDialog.js +4 -4
- package/dist/components/SynapseTable/export/ExternalPlatformActionsRequiredPrecheck.js +12 -12
- package/dist/components/SynapseTable/export/ExternalPlatformActionsRequiredPrecheck.js.map +1 -1
- package/dist/components/SynapseTable/table-top/ColumnSelection.js +6 -6
- package/dist/components/SynapseTable/table-top/DownloadOptions.d.ts +0 -1
- package/dist/components/SynapseTable/table-top/DownloadOptions.d.ts.map +1 -1
- package/dist/components/SynapseTable/table-top/DownloadOptions.js +64 -57
- package/dist/components/SynapseTable/table-top/DownloadOptions.js.map +1 -1
- package/dist/components/SynapseTable/usePrefetchTableData.d.ts.map +1 -1
- package/dist/components/SynapseTable/usePrefetchTableData.js +3 -3
- package/dist/components/SynapseTable/usePrefetchTableData.js.map +1 -1
- package/dist/components/TableColumnSchemaEditor/ColumnModelForm.js +1 -1
- package/dist/components/TableColumnSchemaEditor/ColumnModelForm.js.map +1 -1
- package/dist/components/TableColumnSchemaEditor/TableColumnSchemaEditorTestUtils.js +1 -1
- package/dist/components/TableColumnSchemaEditor/TableColumnSchemaEditorTestUtils.js.map +1 -1
- package/dist/components/TableColumnSchemaEditor/TableColumnSchemaEditorUtils.js +2 -2
- package/dist/components/TableColumnSchemaEditor/TableColumnSchemaEditorUtils.js.map +1 -1
- package/dist/components/TableColumnSchemaEditor/TableColumnSchemaForm.js +60 -60
- package/dist/components/TableColumnSchemaEditor/TableColumnSchemaForm.js.map +1 -1
- package/dist/components/TableColumnSchemaEditor/Validators/DatetimeSchema.js +1 -1
- package/dist/components/TableColumnSchemaEditor/Validators/DatetimeSchema.js.map +1 -1
- package/dist/components/TanStackTable/ColumnHeaderEnumFilter.js +1 -1
- package/dist/components/TanStackTable/ColumnHeaderEnumFilter.js.map +1 -1
- package/dist/components/TanStackTable/StyledTanStackTable.d.ts.map +1 -1
- package/dist/components/TanStackTable/StyledTanStackTable.js +1 -4
- package/dist/components/TanStackTable/StyledTanStackTable.js.map +1 -1
- package/dist/components/TermsAndConditions/TermsAndConditions.js.map +1 -1
- package/dist/components/TotalQueryResults.js +14 -14
- package/dist/components/Webhook/WebhookDashboard.d.ts.map +1 -1
- package/dist/components/Webhook/WebhookDashboard.js +2 -2
- package/dist/components/Webhook/WebhookDashboard.js.map +1 -1
- package/dist/components/download_list/DownloadConfirmationUtils.d.ts +5 -1
- package/dist/components/download_list/DownloadConfirmationUtils.d.ts.map +1 -1
- package/dist/components/download_list/DownloadConfirmationUtils.js +2 -2
- package/dist/components/download_list/DownloadConfirmationUtils.js.map +1 -1
- package/dist/components/error/ErrorBanner.d.ts.map +1 -1
- package/dist/components/error/ErrorBanner.js +49 -46
- package/dist/components/error/ErrorBanner.js.map +1 -1
- package/dist/components/file/upload/MultiFileUploadProgress.js +5 -5
- package/dist/components/row_renderers/Dataset.d.ts.map +1 -1
- package/dist/components/row_renderers/Dataset.js +6 -6
- package/dist/components/row_renderers/Dataset.js.map +1 -1
- package/dist/components/row_renderers/Funder.js +1 -1
- package/dist/components/row_renderers/Funder.js.map +1 -1
- package/dist/components/widgets/ElementWithTooltip.d.ts +6 -1
- package/dist/components/widgets/ElementWithTooltip.d.ts.map +1 -1
- package/dist/components/widgets/ElementWithTooltip.js +22 -14
- package/dist/components/widgets/ElementWithTooltip.js.map +1 -1
- package/dist/components/widgets/RangeSlider/RangeSlider.d.ts.map +1 -1
- package/dist/components/widgets/RangeSlider/RangeSlider.js +1 -1
- package/dist/components/widgets/RangeSlider/RangeSlider.js.map +1 -1
- package/dist/components/widgets/SynapseImage.js +1 -1
- package/dist/components/widgets/SynapseImage.js.map +1 -1
- package/dist/components/widgets/facet-nav/FacetNavPanel.d.ts +16 -5
- package/dist/components/widgets/facet-nav/FacetNavPanel.d.ts.map +1 -1
- package/dist/components/widgets/facet-nav/FacetNavPanel.js +115 -102
- package/dist/components/widgets/facet-nav/FacetNavPanel.js.map +1 -1
- package/dist/components/widgets/facet-nav/FacetPlotLegendList.d.ts.map +1 -1
- package/dist/components/widgets/facet-nav/FacetPlotLegendList.js +4 -2
- package/dist/components/widgets/facet-nav/FacetPlotLegendList.js.map +1 -1
- package/dist/components/widgets/facet-nav/FacetPlotLegendTable.js +1 -1
- package/dist/components/widgets/facet-nav/FacetPlotLegendTable.js.map +1 -1
- package/dist/components/widgets/facet-nav/FacetPlotLegendUtils.d.ts +2 -0
- package/dist/components/widgets/facet-nav/FacetPlotLegendUtils.d.ts.map +1 -1
- package/dist/components/widgets/facet-nav/FacetPlotLegendUtils.js.map +1 -1
- package/dist/components/widgets/facet-nav/PlotsContainer.d.ts +7 -0
- package/dist/components/widgets/facet-nav/PlotsContainer.d.ts.map +1 -1
- package/dist/components/widgets/facet-nav/PlotsContainer.js +47 -45
- package/dist/components/widgets/facet-nav/PlotsContainer.js.map +1 -1
- package/dist/components/widgets/facet-nav/SelectionCriteriaPills.js +4 -4
- package/dist/components/widgets/facet-nav/useFacetPlots.d.ts +3 -2
- package/dist/components/widgets/facet-nav/useFacetPlots.d.ts.map +1 -1
- package/dist/components/widgets/facet-nav/useFacetPlots.js +16 -15
- package/dist/components/widgets/facet-nav/useFacetPlots.js.map +1 -1
- package/dist/components/widgets/query-filter/CombinedRangeFacetFilter.js +4 -4
- package/dist/components/widgets/query-filter/EnumFacetFilter/EnumFacetFilter.d.ts +2 -2
- package/dist/components/widgets/query-filter/EnumFacetFilter/EnumFacetFilter.d.ts.map +1 -1
- package/dist/components/widgets/query-filter/EnumFacetFilter/EnumFacetFilter.js +62 -60
- package/dist/components/widgets/query-filter/EnumFacetFilter/EnumFacetFilter.js.map +1 -1
- package/dist/components/widgets/query-filter/EnumFacetFilter/EnumFacetFilterOption.d.ts +2 -0
- package/dist/components/widgets/query-filter/EnumFacetFilter/EnumFacetFilterOption.d.ts.map +1 -1
- package/dist/components/widgets/query-filter/EnumFacetFilter/EnumFacetFilterOption.js +10 -10
- package/dist/components/widgets/query-filter/EnumFacetFilter/EnumFacetFilterOption.js.map +1 -1
- package/dist/components/widgets/query-filter/EnumFacetFilter/EnumFacetFilterUI.d.ts +1 -0
- package/dist/components/widgets/query-filter/EnumFacetFilter/EnumFacetFilterUI.d.ts.map +1 -1
- package/dist/components/widgets/query-filter/EnumFacetFilter/EnumFacetFilterUI.js +2 -1
- package/dist/components/widgets/query-filter/EnumFacetFilter/EnumFacetFilterUI.js.map +1 -1
- package/dist/components/widgets/query-filter/EnumFacetFilter/EnumFacetFilterUtils.d.ts +3 -2
- package/dist/components/widgets/query-filter/EnumFacetFilter/EnumFacetFilterUtils.d.ts.map +1 -1
- package/dist/components/widgets/query-filter/EnumFacetFilter/EnumFacetFilterUtils.js.map +1 -1
- package/dist/components/widgets/query-filter/FacetFilterControls.d.ts +3 -2
- package/dist/components/widgets/query-filter/FacetFilterControls.d.ts.map +1 -1
- package/dist/components/widgets/query-filter/FacetFilterControls.js +63 -62
- package/dist/components/widgets/query-filter/FacetFilterControls.js.map +1 -1
- package/dist/components/widgets/query-filter/JsonColumnFacetFilters.d.ts.map +1 -1
- package/dist/components/widgets/query-filter/JsonColumnFacetFilters.js +30 -29
- package/dist/components/widgets/query-filter/JsonColumnFacetFilters.js.map +1 -1
- package/dist/components/widgets/query-filter/RangeFacetFilter.js +5 -5
- package/dist/mocks/cohortBuilder/cohortBuilderMockProfiles.d.ts +53 -0
- package/dist/mocks/cohortBuilder/cohortBuilderMockProfiles.d.ts.map +1 -0
- package/dist/mocks/cohortBuilder/cohortBuilderMockProfiles.js +391 -0
- package/dist/mocks/cohortBuilder/cohortBuilderMockProfiles.js.map +1 -0
- package/dist/mocks/cohortBuilder/cohortBuilderMockQueryEngine.d.ts +41 -0
- package/dist/mocks/cohortBuilder/cohortBuilderMockQueryEngine.d.ts.map +1 -0
- package/dist/mocks/cohortBuilder/cohortBuilderMockQueryEngine.js +379 -0
- package/dist/mocks/cohortBuilder/cohortBuilderMockQueryEngine.js.map +1 -0
- package/dist/mocks/cohortBuilder/cohortBuilderSyntheticData.d.ts +26 -0
- package/dist/mocks/cohortBuilder/cohortBuilderSyntheticData.d.ts.map +1 -0
- package/dist/mocks/cohortBuilder/cohortBuilderSyntheticData.js +112 -0
- package/dist/mocks/cohortBuilder/cohortBuilderSyntheticData.js.map +1 -0
- package/dist/mocks/mockAnnotationColumns.d.ts.map +1 -1
- package/dist/mocks/mockAnnotationColumns.js +1 -1
- package/dist/mocks/mockAnnotationColumns.js.map +1 -1
- package/dist/mocks/msw/handlers/aridhiaHandlers.d.ts +9 -0
- package/dist/mocks/msw/handlers/aridhiaHandlers.d.ts.map +1 -1
- package/dist/mocks/msw/handlers/aridhiaHandlers.js +24 -15
- package/dist/mocks/msw/handlers/aridhiaHandlers.js.map +1 -1
- package/dist/mocks/msw/handlers/asyncJobHandlers.d.ts +21 -2
- package/dist/mocks/msw/handlers/asyncJobHandlers.d.ts.map +1 -1
- package/dist/mocks/msw/handlers/asyncJobHandlers.js +30 -22
- package/dist/mocks/msw/handlers/asyncJobHandlers.js.map +1 -1
- package/dist/mocks/msw/handlers/cohortBuilderHandlers.d.ts +27 -0
- package/dist/mocks/msw/handlers/cohortBuilderHandlers.d.ts.map +1 -0
- package/dist/mocks/msw/handlers/cohortBuilderHandlers.js +158 -0
- package/dist/mocks/msw/handlers/cohortBuilderHandlers.js.map +1 -0
- package/dist/mocks/msw/handlers/subscriptionHandlers.js +1 -1
- package/dist/mocks/msw/handlers/subscriptionHandlers.js.map +1 -1
- package/dist/mocks/msw/handlers/userProfileHandlers.d.ts.map +1 -1
- package/dist/mocks/msw/handlers/userProfileHandlers.js +2 -2
- package/dist/mocks/msw/handlers/userProfileHandlers.js.map +1 -1
- package/dist/mocks/query/mockColumnCategoryTable.d.ts +19 -0
- package/dist/mocks/query/mockColumnCategoryTable.d.ts.map +1 -0
- package/dist/mocks/query/mockColumnCategoryTable.js +188 -0
- package/dist/mocks/query/mockColumnCategoryTable.js.map +1 -0
- package/dist/stories/ColorPaletteInspector.d.ts.map +1 -1
- package/dist/stories/ColorPaletteInspector.js +2 -2
- package/dist/stories/ColorPaletteInspector.js.map +1 -1
- package/dist/style/components/facet_nav/_facet-nav-panel.scss +8 -0
- package/dist/style/main.css +1 -1
- package/dist/synapse-queries/auth/useOIDC.js +2 -2
- package/dist/synapse-queries/auth/useOIDC.js.map +1 -1
- package/dist/synapse-queries/auth/useUnbindOAuthProviderIdentity.js +2 -2
- package/dist/synapse-queries/auth/useUnbindOAuthProviderIdentity.js.map +1 -1
- package/dist/synapse-queries/challenge/useChallenge.js +2 -2
- package/dist/synapse-queries/challenge/useChallenge.js.map +1 -1
- package/dist/synapse-queries/chat/useChat.js +8 -8
- package/dist/synapse-queries/chat/useChat.js.map +1 -1
- package/dist/synapse-queries/curation/task/useCurationTask.js +10 -10
- package/dist/synapse-queries/curation/task/useCurationTask.js.map +1 -1
- package/dist/synapse-queries/dataaccess/useAccessRequirements.js +24 -24
- package/dist/synapse-queries/dataaccess/useAccessRequirements.js.map +1 -1
- package/dist/synapse-queries/dataaccess/useDataAccessSubmission.js +4 -4
- package/dist/synapse-queries/dataaccess/useDataAccessSubmission.js.map +1 -1
- package/dist/synapse-queries/dataaccess/useEDuc.js +6 -6
- package/dist/synapse-queries/dataaccess/useEDuc.js.map +1 -1
- package/dist/synapse-queries/dataaccess/useFormTemplate.js +4 -4
- package/dist/synapse-queries/dataaccess/useFormTemplate.js.map +1 -1
- package/dist/synapse-queries/download/index.js +2 -2
- package/dist/synapse-queries/download/useDownloadList.d.ts +5 -0
- package/dist/synapse-queries/download/useDownloadList.d.ts.map +1 -1
- package/dist/synapse-queries/download/useDownloadList.js +14 -13
- package/dist/synapse-queries/download/useDownloadList.js.map +1 -1
- package/dist/synapse-queries/entity/useEntity.d.ts.map +1 -1
- package/dist/synapse-queries/entity/useEntity.js +20 -20
- package/dist/synapse-queries/entity/useEntity.js.map +1 -1
- package/dist/synapse-queries/entity/useExportToADWorkbench.d.ts.map +1 -1
- package/dist/synapse-queries/entity/useExportToADWorkbench.js +2 -1
- package/dist/synapse-queries/entity/useExportToADWorkbench.js.map +1 -1
- package/dist/synapse-queries/entity/useExportToCavatica.d.ts.map +1 -1
- package/dist/synapse-queries/entity/useExportToCavatica.js +3 -2
- package/dist/synapse-queries/entity/useExportToCavatica.js.map +1 -1
- package/dist/synapse-queries/entity/useExportToPluto.d.ts.map +1 -1
- package/dist/synapse-queries/entity/useExportToPluto.js +2 -1
- package/dist/synapse-queries/entity/useExportToPluto.js.map +1 -1
- package/dist/synapse-queries/entity/useGetQueryResultBundle.d.ts.map +1 -1
- package/dist/synapse-queries/entity/useGetQueryResultBundle.js +4 -7
- package/dist/synapse-queries/entity/useGetQueryResultBundle.js.map +1 -1
- package/dist/synapse-queries/forum/useReply.js +6 -6
- package/dist/synapse-queries/forum/useReply.js.map +1 -1
- package/dist/synapse-queries/forum/useThread.js +14 -14
- package/dist/synapse-queries/forum/useThread.js.map +1 -1
- package/dist/synapse-queries/grid/useEstablishWebsocketConnection.js +1 -1
- package/dist/synapse-queries/grid/useEstablishWebsocketConnection.js.map +1 -1
- package/dist/synapse-queries/grid/useGridSession.js +4 -4
- package/dist/synapse-queries/grid/useGridSession.js.map +1 -1
- package/dist/synapse-queries/index.js +177 -176
- package/dist/synapse-queries/oauth/useOAuthClient.js +9 -9
- package/dist/synapse-queries/oauth/useOAuthClient.js.map +1 -1
- package/dist/synapse-queries/portal/usePortal.js +7 -7
- package/dist/synapse-queries/portal/usePortal.js.map +1 -1
- package/dist/synapse-queries/subscription/useSubscription.js +4 -4
- package/dist/synapse-queries/subscription/useSubscription.js.map +1 -1
- package/dist/synapse-queries/table/useTableUpdateTransaction.js +2 -2
- package/dist/synapse-queries/table/useTableUpdateTransaction.js.map +1 -1
- package/dist/synapse-queries/team/useTeam.js +2 -2
- package/dist/synapse-queries/team/useTeam.js.map +1 -1
- package/dist/synapse-queries/team/useTeamList.d.ts.map +1 -1
- package/dist/synapse-queries/team/useTeamList.js +3 -3
- package/dist/synapse-queries/team/useTeamList.js.map +1 -1
- package/dist/synapse-queries/team/useTeamMembers.js +8 -8
- package/dist/synapse-queries/team/useTeamMembers.js.map +1 -1
- package/dist/synapse-queries/termsOfService/useTermsOfService.js +2 -2
- package/dist/synapse-queries/termsOfService/useTermsOfService.js.map +1 -1
- package/dist/synapse-queries/trash/useTrashCan.js +4 -4
- package/dist/synapse-queries/trash/useTrashCan.js.map +1 -1
- package/dist/synapse-queries/user/useCertificationQuiz.js +2 -2
- package/dist/synapse-queries/user/useCertificationQuiz.js.map +1 -1
- package/dist/synapse-queries/user/useFavorites.js +4 -4
- package/dist/synapse-queries/user/useFavorites.js.map +1 -1
- package/dist/synapse-queries/user/useRevokeCertification.js +2 -2
- package/dist/synapse-queries/user/useRevokeCertification.js.map +1 -1
- package/dist/synapse-queries/wiki/useWiki.js +10 -10
- package/dist/synapse-queries/wiki/useWiki.js.map +1 -1
- package/dist/tsconfig.build.tsbuildinfo +1 -1
- package/dist/utils/ContentTypeUtils.js +4 -4
- package/dist/utils/ContentTypeUtils.js.map +1 -1
- package/dist/utils/PermissionLevelToAccessType.js +1 -1
- package/dist/utils/PermissionLevelToAccessType.js.map +1 -1
- package/dist/utils/analytics/useGoogleAnalytics.js +1 -1
- package/dist/utils/analytics/useGoogleAnalytics.js.map +1 -1
- package/dist/utils/context/DocumentMetadataContext.js +1 -1
- package/dist/utils/context/DocumentMetadataContext.js.map +1 -1
- package/dist/utils/functions/AccessControlListUtils.d.ts.map +1 -1
- package/dist/utils/functions/AccessControlListUtils.js +3 -3
- package/dist/utils/functions/AccessControlListUtils.js.map +1 -1
- package/dist/utils/functions/ArrayUtils.js +2 -2
- package/dist/utils/functions/ArrayUtils.js.map +1 -1
- package/dist/utils/functions/FileHandleUtils.js +1 -1
- package/dist/utils/functions/FileHandleUtils.js.map +1 -1
- package/dist/utils/functions/RegularExpressions.js +1 -1
- package/dist/utils/functions/RegularExpressions.js.map +1 -1
- package/dist/utils/functions/StringUtils.d.ts.map +1 -1
- package/dist/utils/functions/StringUtils.js +1 -2
- package/dist/utils/functions/StringUtils.js.map +1 -1
- package/dist/utils/functions/deepLinkingUtils.js +2 -2
- package/dist/utils/functions/deepLinkingUtils.js.map +1 -1
- package/dist/utils/functions/enumerationFacet.d.ts +26 -0
- package/dist/utils/functions/enumerationFacet.d.ts.map +1 -0
- package/dist/utils/functions/enumerationFacet.js +27 -0
- package/dist/utils/functions/enumerationFacet.js.map +1 -0
- package/dist/utils/functions/facetCountUtils.d.ts +12 -0
- package/dist/utils/functions/facetCountUtils.d.ts.map +1 -0
- package/dist/utils/functions/facetCountUtils.js +9 -0
- package/dist/utils/functions/facetCountUtils.js.map +1 -0
- package/dist/utils/functions/getEndpoint.js.map +1 -1
- package/dist/utils/functions/getUserData.js +1 -1
- package/dist/utils/functions/getUserData.js.map +1 -1
- package/dist/utils/functions/queryUtils.d.ts +1 -1
- package/dist/utils/functions/queryUtils.d.ts.map +1 -1
- package/dist/utils/functions/queryUtils.js +26 -22
- package/dist/utils/functions/queryUtils.js.map +1 -1
- package/dist/utils/functions/testDownloadSpeed.d.ts.map +1 -1
- package/dist/utils/functions/testDownloadSpeed.js +17 -26
- package/dist/utils/functions/testDownloadSpeed.js.map +1 -1
- package/dist/utils/functions/unCamelCase.js +1 -1
- package/dist/utils/functions/unCamelCase.js.map +1 -1
- package/dist/utils/hooks/useGetInfoFromIds.js +5 -5
- package/dist/utils/hooks/useGetInfoFromIds.js.map +1 -1
- package/dist/utils/hooks/useImmutableTableQuery/TableQueryReducerActions.js +1 -1
- package/dist/utils/hooks/useImmutableTableQuery/TableQueryReducerActions.js.map +1 -1
- package/dist/utils/hooks/useLogin.d.ts.map +1 -1
- package/dist/utils/hooks/useLogin.js +5 -5
- package/dist/utils/hooks/useLogin.js.map +1 -1
- package/dist/utils/hooks/useUploadFileEntity/useCreateFolderPath.js.map +1 -1
- package/dist/utils/jsonschema/collectTopLevelProperties.d.ts +6 -0
- package/dist/utils/jsonschema/collectTopLevelProperties.d.ts.map +1 -1
- package/dist/utils/jsonschema/collectTopLevelProperties.js +1 -1
- package/dist/utils/jsonschema/collectTopLevelProperties.js.map +1 -1
- package/dist/utils/jsonschema/getNumberOrEnumInfo.d.ts +22 -0
- package/dist/utils/jsonschema/getNumberOrEnumInfo.d.ts.map +1 -0
- package/dist/utils/jsonschema/getNumberOrEnumInfo.js +39 -0
- package/dist/utils/jsonschema/getNumberOrEnumInfo.js.map +1 -0
- package/dist/utils/jsonschema/getOnlyNonNullOneOfOption.d.ts +1 -0
- package/dist/utils/jsonschema/getOnlyNonNullOneOfOption.d.ts.map +1 -1
- package/dist/utils/jsonschema/getOnlyNonNullOneOfOption.js +1 -1
- package/dist/utils/jsonschema/getOnlyNonNullOneOfOption.js.map +1 -1
- package/dist/utils/jsonschema/getSchemaPropertyInfo.d.ts +5 -0
- package/dist/utils/jsonschema/getSchemaPropertyInfo.d.ts.map +1 -1
- package/dist/utils/jsonschema/getSchemaPropertyInfo.js +30 -15
- package/dist/utils/jsonschema/getSchemaPropertyInfo.js.map +1 -1
- package/dist/utils/jsonschema/submissionContext.js +2 -2
- package/dist/utils/jsonschema/submissionContext.js.map +1 -1
- package/package.json +6 -6
|
@@ -56,7 +56,7 @@ export declare function removeEmptyQueryParams(q: Query): Query;
|
|
|
56
56
|
* @param facet
|
|
57
57
|
* @param columnModels
|
|
58
58
|
*/
|
|
59
|
-
export declare function getCorrespondingColumnForFacet(facet:
|
|
59
|
+
export declare function getCorrespondingColumnForFacet(facet: UniqueFacetIdentifier, columnModels: ColumnModel[]): ColumnModel | JsonSubColumnModel | undefined;
|
|
60
60
|
/**
|
|
61
61
|
* Given a set of FacetColumnRequests, return the FacetColumnRequest that matches the given UniqueFacetIdentifier.
|
|
62
62
|
* @param facetDefinition
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"queryUtils.d.ts","sourceRoot":"","sources":["../../../src/utils/functions/queryUtils.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,YAAY,EACZ,qBAAqB,EACtB,MAAM,eAAe,CAAA;AACtB,OAAO,EACL,WAAW,EACX,cAAc,EACd,kBAAkB,EAClB,iBAAiB,EACjB,kBAAkB,EAClB,KAAK,EACL,kBAAkB,EAClB,iBAAiB,EACjB,YAAY,EACZ,KAAK,EACN,MAAM,iCAAiC,CAAA;
|
|
1
|
+
{"version":3,"file":"queryUtils.d.ts","sourceRoot":"","sources":["../../../src/utils/functions/queryUtils.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,YAAY,EACZ,qBAAqB,EACtB,MAAM,eAAe,CAAA;AACtB,OAAO,EACL,WAAW,EACX,cAAc,EACd,kBAAkB,EAClB,iBAAiB,EACjB,kBAAkB,EAClB,KAAK,EACL,kBAAkB,EAClB,iBAAiB,EACjB,YAAY,EACZ,KAAK,EACN,MAAM,iCAAiC,CAAA;AAaxC;;;;;GAKG;AACH,eAAO,MAAM,aAAa,GAAI,OAAO,MAAM,EAAE,SAAS,iBAAiB,WAStE,CAAA;AAED;;;;;;GAMG;AACH,eAAO,MAAM,cAAc,GACzB,MAAM,MAAM,EACZ,QAAQ,iBAAiB,GAAG,SAAS,WAQtC,CAAA;AAED;;;;GAIG;AACH,wBAAgB,cAAc,CAC5B,UAAU,EAAE,cAAc,EAC1B,aAAa,GAAE,YAAY,EAAO,GACjC,MAAM,EAAE,CAOV;AAED,eAAO,MAAM,sBAAsB,GACjC,SAAS,iBAAiB,EAAE,EAC5B,gBAAgB,YAAY,EAAE,KAC7B,OAuBF,CAAA;AAED,eAAO,MAAM,mBAAmB,GAAI,OAAO,iBAAiB,KAAG,OAM9D,CAAA;AAGD,wBAAgB,+BAA+B,CAC7C,IAAI,CAAC,EAAE,iBAAiB,EACxB,YAAY,CAAC,EAAE,YAAY,GAC1B,iBAAiB,GAAG,SAAS,CAc/B;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAClC,KAAK,EAAE,KAAK,EACZ,YAAY,CAAC,EAAE,YAAY,GAC1B,OAAO,CAmBT;AAED;;;;GAIG;AACH,wBAAgB,kCAAkC,CAAC,CAAC,SAAS,KAAK,GAAG,KAAK,EACxE,MAAM,CAAC,EAAE,CAAC,EACV,cAAc,CAAC,EAAE,MAAM,WAiBxB;AAED;;;;;GAKG;AACH,wBAAgB,iCAAiC,CAC/C,QAAQ,EAAE,KAAK,EACf,QAAQ,EAAE,KAAK,WAiBhB;AAED;;;;;;GAMG;AACH,wBAAgB,sBAAsB,CAAC,CAAC,EAAE,KAAK,SAuB9C;AAED;;;;;GAKG;AACH,wBAAgB,8BAA8B,CAC5C,KAAK,EAAE,qBAAqB,EAC5B,YAAY,EAAE,WAAW,EAAE,GAC1B,WAAW,GAAG,kBAAkB,GAAG,SAAS,CAS9C;AAED;;;;GAIG;AACH,wBAAgB,6BAA6B,CAC3C,eAAe,EAAE,qBAAqB,EACtC,cAAc,CAAC,EAAE,kBAAkB,EAAE,GACpC,kBAAkB,GAAG,SAAS,CAIhC;AAED,wBAAgB,4BAA4B,CAC1C,eAAe,EACX,qBAAqB,GACrB,kBAAkB,GAClB,iBAAiB,EACrB,WAAW,EAAE,qBAAqB,GAAG,kBAAkB,GAAG,iBAAiB,WAS5E;AAED,wBAAgB,8CAA8C,CAC5D,kBAAkB,EAAE,kBAAkB,GACrC;IACD,cAAc,EAAE,kBAAkB,CAAA;IAClC,oBAAoB,EAAE,kBAAkB,CAAA;CACzC,CAwBA"}
|
|
@@ -2,49 +2,53 @@ import "../SynapseConstants.js";
|
|
|
2
2
|
import { isColumnMultiValueFunctionQueryFilter as e, isColumnSingleValueQueryFilter as t } from "../types/IsType.js";
|
|
3
3
|
import { hasFilesInView as n, isDataset as r, isDatasetCollection as i, isEntityView as a, isFileView as o } from "./EntityTypeUtils.js";
|
|
4
4
|
import "../types/index.js";
|
|
5
|
-
import {
|
|
5
|
+
import { getEnumerationFacet as s } from "./enumerationFacet.js";
|
|
6
|
+
import { cloneDeep as c, isEqual as l, isEqualWith as u, isMatch as d, isNil as f } from "lodash-es";
|
|
6
7
|
//#region src/utils/functions/queryUtils.ts
|
|
7
|
-
var
|
|
8
|
+
var p = (e, t) => e == null ? -1 : t?.selectColumns?.findIndex((t) => t.name === e) ?? -1, m = (e, t) => {
|
|
8
9
|
let n = e.toLowerCase();
|
|
9
10
|
return t?.queryResult?.queryResults.headers.findIndex((e) => e.name.toLowerCase() === n) ?? -1;
|
|
10
11
|
};
|
|
11
|
-
function
|
|
12
|
+
function h(e, t = []) {
|
|
12
13
|
return t.reduce((t, n, r) => n.columnType === e ? [...t, r] : t, []);
|
|
13
14
|
}
|
|
14
|
-
var
|
|
15
|
-
|
|
15
|
+
var g = (e, t) => e == null || t == null || e.length === 0 || t.length === 0 ? !1 : e.filter((e) => !_(e) && t.find((t) => t.name === e.columnName)).length > 0, _ = (e) => {
|
|
16
|
+
let t = s(e)?.facetValues;
|
|
17
|
+
return t?.length == 1 && t[0].value == "org.sagebionetworks.UNDEFINED_NULL_NOTSET";
|
|
18
|
+
};
|
|
19
|
+
function v(e, t) {
|
|
16
20
|
let n = t?.columnName;
|
|
17
21
|
if (n && e) {
|
|
18
|
-
let t =
|
|
22
|
+
let t = c(e);
|
|
19
23
|
return t.facets = t.facets?.filter((e) => e.columnName.toLowerCase() !== n.toLowerCase()), t;
|
|
20
24
|
} else return e;
|
|
21
25
|
}
|
|
22
|
-
function
|
|
23
|
-
let i = Array.isArray(n.selectedFacets) && n.selectedFacets.
|
|
26
|
+
function y(n, r) {
|
|
27
|
+
let i = Array.isArray(n.selectedFacets) && n.selectedFacets.some((e) => e.columnName.toLowerCase() !== r?.columnName?.toLowerCase()), a = Array.isArray(n.additionalFilters) && n.additionalFilters.some((n) => t(n) || e(n) ? n.columnName.toLowerCase() !== r?.columnName?.toLowerCase() : !0);
|
|
24
28
|
return i || a;
|
|
25
29
|
}
|
|
26
|
-
function
|
|
30
|
+
function b(e, t) {
|
|
27
31
|
return e && a(e) && !n(e) || e && i(e) ? !1 : !!(t || e && (a(e) && o(e) || r(e)));
|
|
28
32
|
}
|
|
29
|
-
function
|
|
30
|
-
let n =
|
|
33
|
+
function x(e, t) {
|
|
34
|
+
let n = c(e);
|
|
31
35
|
delete n.limit, delete n.offset, delete n.sort;
|
|
32
|
-
let r =
|
|
33
|
-
return delete r.limit, delete r.offset, delete r.sort,
|
|
36
|
+
let r = c(t);
|
|
37
|
+
return delete r.limit, delete r.offset, delete r.sort, u(n, r, (e, t) => f(e) && f(t) ? !0 : l(e, t));
|
|
34
38
|
}
|
|
35
|
-
function
|
|
36
|
-
let t =
|
|
39
|
+
function S(e) {
|
|
40
|
+
let t = c(e);
|
|
37
41
|
return t.limit ?? delete t.limit, (t.offset == null || t.offset == 0) && delete t.offset, (t.sort == null || t.sort.length == 0) && delete t.sort, (t.selectedFacets == null || t.selectedFacets.length == 0) && delete t.selectedFacets, (t.additionalFilters == null || t.additionalFilters.length == 0) && delete t.additionalFilters, t;
|
|
38
42
|
}
|
|
39
|
-
function
|
|
43
|
+
function C(e, t) {
|
|
40
44
|
let n = t.find((t) => t.name === e.columnName);
|
|
41
45
|
return e.jsonPath && n?.jsonSubColumns && (n = n.jsonSubColumns.find((t) => t.jsonPath === e.jsonPath)), n;
|
|
42
46
|
}
|
|
43
|
-
function C(e, t) {
|
|
44
|
-
return t?.find((t) => w(e, t));
|
|
45
|
-
}
|
|
46
47
|
function w(e, t) {
|
|
47
|
-
return
|
|
48
|
+
return t?.find((t) => T(e, t));
|
|
49
|
+
}
|
|
50
|
+
function T(e, t) {
|
|
51
|
+
return d({
|
|
48
52
|
columnName: e.columnName,
|
|
49
53
|
jsonPath: e.jsonPath
|
|
50
54
|
}, {
|
|
@@ -52,7 +56,7 @@ function w(e, t) {
|
|
|
52
56
|
jsonPath: t.jsonPath
|
|
53
57
|
});
|
|
54
58
|
}
|
|
55
|
-
function
|
|
59
|
+
function E(e) {
|
|
56
60
|
return {
|
|
57
61
|
rowDataRequest: {
|
|
58
62
|
...e,
|
|
@@ -71,6 +75,6 @@ function T(e) {
|
|
|
71
75
|
};
|
|
72
76
|
}
|
|
73
77
|
//#endregion
|
|
74
|
-
export {
|
|
78
|
+
export { b as canTableQueryBeAddedToDownloadList, T as facetObjectMatchesDefinition, C as getCorrespondingColumnForFacet, w as getCorrespondingSelectedFacet, p as getFieldIndex, m as getHeaderIndex, h as getTypeIndices, g as hasFacetedSelectColumn, y as hasResettableFilters, _ as isSingleNotSetValue, E as partitionQueryBundleRequestIntoRowsAndMetadata, x as queryRequestsHaveSameTotalResults, S as removeEmptyQueryParams, v as removeLockedColumnFromFacetData };
|
|
75
79
|
|
|
76
80
|
//# sourceMappingURL=queryUtils.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"queryUtils.js","names":[],"sources":["../../../src/utils/functions/queryUtils.ts"],"sourcesContent":["import {\n isColumnMultiValueFunctionQueryFilter,\n isColumnSingleValueQueryFilter,\n LockedColumn,\n UniqueFacetIdentifier,\n} from '@/utils/types'\nimport {\n ColumnModel,\n ColumnTypeEnum,\n FacetColumnRequest,\n FacetColumnResult,\n JsonSubColumnModel,\n Query,\n QueryBundleRequest,\n QueryResultBundle,\n SelectColumn,\n Table,\n} from '@sage-bionetworks/synapse-types'\nimport { cloneDeep, isEqual, isEqualWith, isMatch, isNil } from 'lodash-es'\nimport * as SynapseConstants from '../SynapseConstants'\nimport { BUNDLE_MASK_QUERY_RESULTS } from '../SynapseConstants'\nimport {\n hasFilesInView,\n isDataset,\n isDatasetCollection,\n isEntityView,\n isFileView,\n} from './EntityTypeUtils'\n\n/**\n * Retrieve the index of a column using the column name\n * @param name the column name\n * @param result the QueryResultBundle containing the columns\n * @returns The index of the column, or -1 if the column doesn't exist in the result\n */\nexport const getFieldIndex = (name?: string, result?: QueryResultBundle) => {\n if (name == undefined) {\n return -1\n }\n return (\n result?.selectColumns?.findIndex(el => {\n return el.name === name\n }) ?? -1\n )\n}\n\n/**\n * Retrieve the index of a column using the header column name found inthe query results.\n * Ignores case.\n * @param name the column name\n * @param result the QueryResultBundle containing the columns\n * @returns The index of the column, or -1 if the column doesn't exist in the result\n */\nexport const getHeaderIndex = (\n name: string,\n result: QueryResultBundle | undefined,\n) => {\n const nameLowercase = name.toLowerCase()\n return (\n result?.queryResult?.queryResults.headers.findIndex(el => {\n return el.name.toLowerCase() === nameLowercase\n }) ?? -1\n )\n}\n\n/**\n * Returns the indices of the selectColumns with the specified type\n * @param columnType\n * @param selectColumns\n */\nexport function getTypeIndices(\n columnType: ColumnTypeEnum,\n selectColumns: SelectColumn[] = [],\n): number[] {\n return selectColumns.reduce((prev: number[], curr, index) => {\n if (curr.columnType === columnType) {\n return [...prev, index]\n }\n return prev\n }, [])\n}\n\nexport const hasFacetedSelectColumn = (\n facets?: FacetColumnResult[],\n selectColumns?: SelectColumn[],\n): boolean => {\n /**\n * Facets are available iff\n * * there is at least one facet AND\n * * each facet has a corresponding columnModel in the selectColumns AND\n * * each facets has a valid value other than the null/not set value\n */\n if (facets == null || selectColumns == null) {\n return false\n }\n\n if (facets.length === 0 || selectColumns.length === 0) {\n return false\n }\n\n const facetsWithValuesAndColumnModels = facets.filter(facet => {\n return (\n !isSingleNotSetValue(facet) &&\n selectColumns.find(model => model.name === facet.columnName)\n )\n })\n\n return facetsWithValuesAndColumnModels.length > 0\n}\n\nexport const isSingleNotSetValue = (facet: FacetColumnResult): boolean => {\n return (\n facet.facetType === 'enumeration' &&\n facet.facetValues.length == 1 &&\n facet.facetValues[0].value == SynapseConstants.VALUE_NOT_SET\n )\n}\n\n// TODO Instead of removing the facet from the data, the facet renderers should just be aware of what to hide\nexport function removeLockedColumnFromFacetData(\n data?: QueryResultBundle,\n lockedColumn?: LockedColumn,\n): QueryResultBundle | undefined {\n const lockedColumnName = lockedColumn?.columnName\n if (lockedColumnName && data) {\n // for details page, return data without the \"locked\" facet\n const dataCopy: QueryResultBundle = cloneDeep(data)\n const facets = dataCopy.facets?.filter(\n item => item.columnName.toLowerCase() !== lockedColumnName.toLowerCase(),\n )\n dataCopy.facets = facets\n return dataCopy\n } else {\n // for other pages, just return the data\n return data\n }\n}\n\n/**\n * Returns true iff the query has filters applied that can be reset.\n * This includes facet filters and additional filters that are not applied to a locked column.\n */\nexport function hasResettableFilters(\n query: Query,\n lockedColumn?: LockedColumn,\n): boolean {\n const hasFacetFilters =\n Array.isArray(query.selectedFacets) &&\n query.selectedFacets.filter(\n facet =>\n facet.columnName.toLowerCase() !==\n lockedColumn?.columnName?.toLowerCase(),\n ).length > 0\n const hasAdditionalFilters =\n Array.isArray(query.additionalFilters) &&\n query.additionalFilters.filter(queryFilter =>\n isColumnSingleValueQueryFilter(queryFilter) ||\n isColumnMultiValueFunctionQueryFilter(queryFilter)\n ? queryFilter.columnName.toLowerCase() !==\n lockedColumn?.columnName?.toLowerCase()\n : true,\n ).length > 0\n\n return hasFacetFilters || hasAdditionalFilters\n}\n\n/**\n * Returns true iff a table query can be added to the download list.\n * @param entity\n * @param entityColumnId\n */\nexport function canTableQueryBeAddedToDownloadList<T extends Table = Table>(\n entity?: T,\n entityColumnId?: string,\n) {\n const viewCannotIncludeFiles =\n // EntityViews without the file bit mask cannot contain files\n (entity && isEntityView(entity) && !hasFilesInView(entity)) ||\n // DatasetCollections cannot contain files\n (entity && isDatasetCollection(entity))\n\n if (viewCannotIncludeFiles) {\n return false\n }\n\n return Boolean(\n entityColumnId ||\n (entity &&\n ((isEntityView(entity) && isFileView(entity)) || isDataset(entity))),\n )\n}\n\n/**\n * Returns true if the queries necessarily return the same result set, i.e. if they have identical parameters other than\n * limit, offset, sort.\n *\n * Note that this does not query the actual tables, so this only captures the semantic equivalence of the queries.\n */\nexport function queryRequestsHaveSameTotalResults(\n request1: Query,\n request2: Query,\n) {\n const clone1 = cloneDeep(request1)\n delete clone1.limit\n delete clone1.offset\n delete clone1.sort\n const clone2 = cloneDeep(request2)\n delete clone2.limit\n delete clone2.offset\n delete clone2.sort\n return isEqualWith(clone1, clone2, (value1, value2) => {\n if (isNil(value1) && isNil(value2)) {\n // Consider all nil (e.g. undefined/null) values equal\n return true\n }\n return isEqual(value1, value2)\n })\n}\n\n/**\n * Remove null/empty values from the query parameters where an undefined value is equivalent.\n *\n * This will ensure a query object is as simple as possible for URL search parameters and also increases the\n * likelihood of a cache hit.\n * @param q\n */\nexport function removeEmptyQueryParams(q: Query) {\n const query = cloneDeep(q)\n\n if (query.limit == null) {\n delete query.limit\n }\n if (query.offset == null || query.offset == 0) {\n delete query.offset\n }\n\n if (query.sort == null || query.sort.length == 0) {\n delete query.sort\n }\n\n if (query.selectedFacets == null || query.selectedFacets.length == 0) {\n delete query.selectedFacets\n }\n\n if (query.additionalFilters == null || query.additionalFilters.length == 0) {\n delete query.additionalFilters\n }\n\n return query\n}\n\n/**\n * Given a FacetColumnResult and a set of ColumnModels, return the ColumnModel that\n * matches the FacetColumnResult.\n * @param facet\n * @param columnModels\n */\nexport function getCorrespondingColumnForFacet(\n facet: FacetColumnResult,\n columnModels: ColumnModel[],\n): ColumnModel | JsonSubColumnModel | undefined {\n let columnModel: ColumnModel | JsonSubColumnModel | undefined =\n columnModels.find(model => model.name === facet.columnName)\n if (facet.jsonPath && columnModel?.jsonSubColumns) {\n columnModel = columnModel.jsonSubColumns.find(\n cm => cm.jsonPath === facet.jsonPath,\n )\n }\n return columnModel\n}\n\n/**\n * Given a set of FacetColumnRequests, return the FacetColumnRequest that matches the given UniqueFacetIdentifier.\n * @param facetDefinition\n * @param selectedFacets\n */\nexport function getCorrespondingSelectedFacet(\n facetDefinition: UniqueFacetIdentifier,\n selectedFacets?: FacetColumnRequest[],\n): FacetColumnRequest | undefined {\n return selectedFacets?.find(selectedFacet =>\n facetObjectMatchesDefinition(facetDefinition, selectedFacet),\n )\n}\n\nexport function facetObjectMatchesDefinition(\n facetDefinition:\n | UniqueFacetIdentifier\n | FacetColumnRequest\n | FacetColumnResult,\n facetObject: UniqueFacetIdentifier | FacetColumnRequest | FacetColumnResult,\n) {\n return isMatch(\n {\n columnName: facetDefinition.columnName,\n jsonPath: facetDefinition.jsonPath,\n },\n { columnName: facetObject.columnName, jsonPath: facetObject.jsonPath },\n )\n}\n\nexport function partitionQueryBundleRequestIntoRowsAndMetadata(\n queryBundleRequest: QueryBundleRequest,\n): {\n rowDataRequest: QueryBundleRequest\n queryMetadataRequest: QueryBundleRequest\n} {\n const rowDataRequest: QueryBundleRequest = {\n ...queryBundleRequest,\n // Get just the rows (if they were originally requested)\n partMask: queryBundleRequest.partMask & BUNDLE_MASK_QUERY_RESULTS,\n }\n\n const queryMetadataRequest: QueryBundleRequest = {\n ...queryBundleRequest,\n query: {\n ...queryBundleRequest.query,\n // Remove query fields that don't affect the results.\n offset: undefined,\n limit: undefined,\n sort: undefined,\n },\n // Bitwise remove the query result flag from the mask\n partMask: queryBundleRequest.partMask & ~BUNDLE_MASK_QUERY_RESULTS,\n }\n\n return {\n rowDataRequest,\n queryMetadataRequest,\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"queryUtils.js","names":[],"sources":["../../../src/utils/functions/queryUtils.ts"],"sourcesContent":["import {\n isColumnMultiValueFunctionQueryFilter,\n isColumnSingleValueQueryFilter,\n LockedColumn,\n UniqueFacetIdentifier,\n} from '@/utils/types'\nimport {\n ColumnModel,\n ColumnTypeEnum,\n FacetColumnRequest,\n FacetColumnResult,\n JsonSubColumnModel,\n Query,\n QueryBundleRequest,\n QueryResultBundle,\n SelectColumn,\n Table,\n} from '@sage-bionetworks/synapse-types'\nimport { cloneDeep, isEqual, isEqualWith, isMatch, isNil } from 'lodash-es'\nimport * as SynapseConstants from '../SynapseConstants'\nimport { BUNDLE_MASK_QUERY_RESULTS } from '../SynapseConstants'\nimport {\n hasFilesInView,\n isDataset,\n isDatasetCollection,\n isEntityView,\n isFileView,\n} from './EntityTypeUtils'\nimport { getEnumerationFacet } from './enumerationFacet'\n\n/**\n * Retrieve the index of a column using the column name\n * @param name the column name\n * @param result the QueryResultBundle containing the columns\n * @returns The index of the column, or -1 if the column doesn't exist in the result\n */\nexport const getFieldIndex = (name?: string, result?: QueryResultBundle) => {\n if (name == undefined) {\n return -1\n }\n return (\n result?.selectColumns?.findIndex(el => {\n return el.name === name\n }) ?? -1\n )\n}\n\n/**\n * Retrieve the index of a column using the header column name found inthe query results.\n * Ignores case.\n * @param name the column name\n * @param result the QueryResultBundle containing the columns\n * @returns The index of the column, or -1 if the column doesn't exist in the result\n */\nexport const getHeaderIndex = (\n name: string,\n result: QueryResultBundle | undefined,\n) => {\n const nameLowercase = name.toLowerCase()\n return (\n result?.queryResult?.queryResults.headers.findIndex(el => {\n return el.name.toLowerCase() === nameLowercase\n }) ?? -1\n )\n}\n\n/**\n * Returns the indices of the selectColumns with the specified type\n * @param columnType\n * @param selectColumns\n */\nexport function getTypeIndices(\n columnType: ColumnTypeEnum,\n selectColumns: SelectColumn[] = [],\n): number[] {\n return selectColumns.reduce((prev: number[], curr, index) => {\n if (curr.columnType === columnType) {\n return [...prev, index]\n }\n return prev\n }, [])\n}\n\nexport const hasFacetedSelectColumn = (\n facets?: FacetColumnResult[],\n selectColumns?: SelectColumn[],\n): boolean => {\n /**\n * Facets are available iff\n * * there is at least one facet AND\n * * each facet has a corresponding columnModel in the selectColumns AND\n * * each facets has a valid value other than the null/not set value\n */\n if (facets == null || selectColumns == null) {\n return false\n }\n\n if (facets.length === 0 || selectColumns.length === 0) {\n return false\n }\n\n const facetsWithValuesAndColumnModels = facets.filter(facet => {\n return (\n !isSingleNotSetValue(facet) &&\n selectColumns.find(model => model.name === facet.columnName)\n )\n })\n\n return facetsWithValuesAndColumnModels.length > 0\n}\n\nexport const isSingleNotSetValue = (facet: FacetColumnResult): boolean => {\n const facetValues = getEnumerationFacet(facet)?.facetValues\n return (\n facetValues?.length == 1 &&\n facetValues[0].value == SynapseConstants.VALUE_NOT_SET\n )\n}\n\n// TODO Instead of removing the facet from the data, the facet renderers should just be aware of what to hide\nexport function removeLockedColumnFromFacetData(\n data?: QueryResultBundle,\n lockedColumn?: LockedColumn,\n): QueryResultBundle | undefined {\n const lockedColumnName = lockedColumn?.columnName\n if (lockedColumnName && data) {\n // for details page, return data without the \"locked\" facet\n const dataCopy: QueryResultBundle = cloneDeep(data)\n const facets = dataCopy.facets?.filter(\n item => item.columnName.toLowerCase() !== lockedColumnName.toLowerCase(),\n )\n dataCopy.facets = facets\n return dataCopy\n } else {\n // for other pages, just return the data\n return data\n }\n}\n\n/**\n * Returns true iff the query has filters applied that can be reset.\n * This includes facet filters and additional filters that are not applied to a locked column.\n */\nexport function hasResettableFilters(\n query: Query,\n lockedColumn?: LockedColumn,\n): boolean {\n const hasFacetFilters =\n Array.isArray(query.selectedFacets) &&\n query.selectedFacets.some(\n facet =>\n facet.columnName.toLowerCase() !==\n lockedColumn?.columnName?.toLowerCase(),\n )\n const hasAdditionalFilters =\n Array.isArray(query.additionalFilters) &&\n query.additionalFilters.some(queryFilter =>\n isColumnSingleValueQueryFilter(queryFilter) ||\n isColumnMultiValueFunctionQueryFilter(queryFilter)\n ? queryFilter.columnName.toLowerCase() !==\n lockedColumn?.columnName?.toLowerCase()\n : true,\n )\n\n return hasFacetFilters || hasAdditionalFilters\n}\n\n/**\n * Returns true iff a table query can be added to the download list.\n * @param entity\n * @param entityColumnId\n */\nexport function canTableQueryBeAddedToDownloadList<T extends Table = Table>(\n entity?: T,\n entityColumnId?: string,\n) {\n const viewCannotIncludeFiles =\n // EntityViews without the file bit mask cannot contain files\n (entity && isEntityView(entity) && !hasFilesInView(entity)) ||\n // DatasetCollections cannot contain files\n (entity && isDatasetCollection(entity))\n\n if (viewCannotIncludeFiles) {\n return false\n }\n\n return Boolean(\n entityColumnId ||\n (entity &&\n ((isEntityView(entity) && isFileView(entity)) || isDataset(entity))),\n )\n}\n\n/**\n * Returns true if the queries necessarily return the same result set, i.e. if they have identical parameters other than\n * limit, offset, sort.\n *\n * Note that this does not query the actual tables, so this only captures the semantic equivalence of the queries.\n */\nexport function queryRequestsHaveSameTotalResults(\n request1: Query,\n request2: Query,\n) {\n const clone1 = cloneDeep(request1)\n delete clone1.limit\n delete clone1.offset\n delete clone1.sort\n const clone2 = cloneDeep(request2)\n delete clone2.limit\n delete clone2.offset\n delete clone2.sort\n return isEqualWith(clone1, clone2, (value1, value2) => {\n if (isNil(value1) && isNil(value2)) {\n // Consider all nil (e.g. undefined/null) values equal\n return true\n }\n return isEqual(value1, value2)\n })\n}\n\n/**\n * Remove null/empty values from the query parameters where an undefined value is equivalent.\n *\n * This will ensure a query object is as simple as possible for URL search parameters and also increases the\n * likelihood of a cache hit.\n * @param q\n */\nexport function removeEmptyQueryParams(q: Query) {\n const query = cloneDeep(q)\n\n if (query.limit == null) {\n delete query.limit\n }\n if (query.offset == null || query.offset == 0) {\n delete query.offset\n }\n\n if (query.sort == null || query.sort.length == 0) {\n delete query.sort\n }\n\n if (query.selectedFacets == null || query.selectedFacets.length == 0) {\n delete query.selectedFacets\n }\n\n if (query.additionalFilters == null || query.additionalFilters.length == 0) {\n delete query.additionalFilters\n }\n\n return query\n}\n\n/**\n * Given a FacetColumnResult and a set of ColumnModels, return the ColumnModel that\n * matches the FacetColumnResult.\n * @param facet\n * @param columnModels\n */\nexport function getCorrespondingColumnForFacet(\n facet: UniqueFacetIdentifier,\n columnModels: ColumnModel[],\n): ColumnModel | JsonSubColumnModel | undefined {\n let columnModel: ColumnModel | JsonSubColumnModel | undefined =\n columnModels.find(model => model.name === facet.columnName)\n if (facet.jsonPath && columnModel?.jsonSubColumns) {\n columnModel = columnModel.jsonSubColumns.find(\n cm => cm.jsonPath === facet.jsonPath,\n )\n }\n return columnModel\n}\n\n/**\n * Given a set of FacetColumnRequests, return the FacetColumnRequest that matches the given UniqueFacetIdentifier.\n * @param facetDefinition\n * @param selectedFacets\n */\nexport function getCorrespondingSelectedFacet(\n facetDefinition: UniqueFacetIdentifier,\n selectedFacets?: FacetColumnRequest[],\n): FacetColumnRequest | undefined {\n return selectedFacets?.find(selectedFacet =>\n facetObjectMatchesDefinition(facetDefinition, selectedFacet),\n )\n}\n\nexport function facetObjectMatchesDefinition(\n facetDefinition:\n | UniqueFacetIdentifier\n | FacetColumnRequest\n | FacetColumnResult,\n facetObject: UniqueFacetIdentifier | FacetColumnRequest | FacetColumnResult,\n) {\n return isMatch(\n {\n columnName: facetDefinition.columnName,\n jsonPath: facetDefinition.jsonPath,\n },\n { columnName: facetObject.columnName, jsonPath: facetObject.jsonPath },\n )\n}\n\nexport function partitionQueryBundleRequestIntoRowsAndMetadata(\n queryBundleRequest: QueryBundleRequest,\n): {\n rowDataRequest: QueryBundleRequest\n queryMetadataRequest: QueryBundleRequest\n} {\n const rowDataRequest: QueryBundleRequest = {\n ...queryBundleRequest,\n // Get just the rows (if they were originally requested)\n partMask: queryBundleRequest.partMask & BUNDLE_MASK_QUERY_RESULTS,\n }\n\n const queryMetadataRequest: QueryBundleRequest = {\n ...queryBundleRequest,\n query: {\n ...queryBundleRequest.query,\n // Remove query fields that don't affect the results.\n offset: undefined,\n limit: undefined,\n sort: undefined,\n },\n // Bitwise remove the query result flag from the mask\n partMask: queryBundleRequest.partMask & ~BUNDLE_MASK_QUERY_RESULTS,\n }\n\n return {\n rowDataRequest,\n queryMetadataRequest,\n }\n}\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"testDownloadSpeed.d.ts","sourceRoot":"","sources":["../../../src/utils/functions/testDownloadSpeed.ts"],"names":[],"mappings":"AAoBA;;;;;GAKG;AACH,eAAO,MAAM,iBAAiB,
|
|
1
|
+
{"version":3,"file":"testDownloadSpeed.d.ts","sourceRoot":"","sources":["../../../src/utils/functions/testDownloadSpeed.ts"],"names":[],"mappings":"AAoBA;;;;;GAKG;AACH,eAAO,MAAM,iBAAiB,GAC5B,aAAa,MAAM,KAClB,OAAO,CAAC,MAAM,CAqDhB,CAAA"}
|
|
@@ -1,32 +1,23 @@
|
|
|
1
1
|
import { getEntity as e, getFileHandleContent as t, getFiles as n } from "../../synapse-client/SynapseClient.js";
|
|
2
2
|
import { FileHandleAssociateType as r } from "@sage-bionetworks/synapse-types";
|
|
3
3
|
//#region src/utils/functions/testDownloadSpeed.ts
|
|
4
|
-
var i = 200, a = "ESTIMATED_DOWNLOAD_SPEED_EXPIRE_TIME", o = "ESTIMATED_DOWNLOAD_SPEED", s = "syn12600511", c = (c) =>
|
|
5
|
-
let
|
|
6
|
-
if (
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
}, c).then((e) => {
|
|
22
|
-
let n = e.requestedFiles[0].preSignedURL, r = e.requestedFiles[0].fileHandle, s = (/* @__PURE__ */ new Date()).getTime();
|
|
23
|
-
return t(r, n).then(() => {
|
|
24
|
-
let e = r.contentSize / (((/* @__PURE__ */ new Date()).getTime() - s - i) / 1e3), t = (/* @__PURE__ */ new Date()).getTime();
|
|
25
|
-
localStorage.setItem(a, (t + 1e3 * 60 * 5).toString()), localStorage.setItem(o, e.toString()), l(e);
|
|
26
|
-
});
|
|
27
|
-
});
|
|
28
|
-
}).catch((e) => u(e));
|
|
29
|
-
});
|
|
4
|
+
var i = 200, a = "ESTIMATED_DOWNLOAD_SPEED_EXPIRE_TIME", o = "ESTIMATED_DOWNLOAD_SPEED", s = "syn12600511", c = async (c) => {
|
|
5
|
+
let l = localStorage.getItem(a), u = localStorage.getItem(o);
|
|
6
|
+
if (l && u && Date.now() < Number(l)) return Number(u);
|
|
7
|
+
let d = await e(c, s), f = await n({
|
|
8
|
+
includeFileHandles: !0,
|
|
9
|
+
includePreSignedURLs: !0,
|
|
10
|
+
includePreviewPreSignedURLs: !1,
|
|
11
|
+
requestedFiles: [{
|
|
12
|
+
associateObjectId: d.id,
|
|
13
|
+
associateObjectType: r.FileEntity,
|
|
14
|
+
fileHandleId: d.dataFileHandleId
|
|
15
|
+
}]
|
|
16
|
+
}, c), p = f.requestedFiles[0].preSignedURL, m = f.requestedFiles[0].fileHandle, h = Date.now();
|
|
17
|
+
await t(m, p);
|
|
18
|
+
let g = m.contentSize / ((Date.now() - h - i) / 1e3), _ = Date.now();
|
|
19
|
+
return localStorage.setItem(a, (_ + 1e3 * 60 * 5).toString()), localStorage.setItem(o, g.toString()), g;
|
|
20
|
+
};
|
|
30
21
|
//#endregion
|
|
31
22
|
export { c as testDownloadSpeed };
|
|
32
23
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"testDownloadSpeed.js","names":[],"sources":["../../../src/utils/functions/testDownloadSpeed.ts"],"sourcesContent":["import {\n getEntity,\n getFileHandleContent,\n getFiles,\n} from '@/synapse-client/SynapseClient'\nimport {\n BatchFileRequest,\n BatchFileResult,\n Entity,\n FileEntity,\n FileHandle,\n FileHandleAssociateType,\n FileHandleAssociation,\n} from '@sage-bionetworks/synapse-types'\n\nconst ESTIMATED_CORS_TIME_MS: number = 200\nconst ESTIMATED_DOWNLOAD_SPEED_EXPIRE_TIME_KEY: string =\n 'ESTIMATED_DOWNLOAD_SPEED_EXPIRE_TIME'\nconst ESTIMATED_DOWNLOAD_SPEED_KEY: string = 'ESTIMATED_DOWNLOAD_SPEED'\nconst TEST_FILE_ENTITY_ID: string = 'syn12600511'\n/**\n * Return the estimated download speed (bytes/second). Result is cached.\n * Result is crude estimate since it's a single test file (small sample, only ~2MB), but is a valid test (since it's a Synapse file on s3).\n * The intent is to let the user know if the package download will take many hours to download.\n * @param accessToken\n */\nexport const testDownloadSpeed = (accessToken: string): Promise<number> => {\n
|
|
1
|
+
{"version":3,"file":"testDownloadSpeed.js","names":[],"sources":["../../../src/utils/functions/testDownloadSpeed.ts"],"sourcesContent":["import {\n getEntity,\n getFileHandleContent,\n getFiles,\n} from '@/synapse-client/SynapseClient'\nimport {\n BatchFileRequest,\n BatchFileResult,\n Entity,\n FileEntity,\n FileHandle,\n FileHandleAssociateType,\n FileHandleAssociation,\n} from '@sage-bionetworks/synapse-types'\n\nconst ESTIMATED_CORS_TIME_MS: number = 200\nconst ESTIMATED_DOWNLOAD_SPEED_EXPIRE_TIME_KEY: string =\n 'ESTIMATED_DOWNLOAD_SPEED_EXPIRE_TIME'\nconst ESTIMATED_DOWNLOAD_SPEED_KEY: string = 'ESTIMATED_DOWNLOAD_SPEED'\nconst TEST_FILE_ENTITY_ID: string = 'syn12600511'\n/**\n * Return the estimated download speed (bytes/second). Result is cached.\n * Result is crude estimate since it's a single test file (small sample, only ~2MB), but is a valid test (since it's a Synapse file on s3).\n * The intent is to let the user know if the package download will take many hours to download.\n * @param accessToken\n */\nexport const testDownloadSpeed = async (\n accessToken: string,\n): Promise<number> => {\n // check cache\n const cachedSpeedExpireTime = localStorage.getItem(\n ESTIMATED_DOWNLOAD_SPEED_EXPIRE_TIME_KEY,\n )\n const cachedSpeed = localStorage.getItem(ESTIMATED_DOWNLOAD_SPEED_KEY)\n if (cachedSpeedExpireTime && cachedSpeed) {\n // is this value expired?\n const now: number = Date.now()\n if (now < Number(cachedSpeedExpireTime)) {\n return Number(cachedSpeed)\n }\n }\n\n /**\n * 1. Get the test File Entity\n * 2. Get the file handle and presigned URL associated to the latest version of the test File Entity\n * 3. Start the timer and fetch the file content using that presigned URL\n */\n const entity: Entity = await getEntity(accessToken, TEST_FILE_ENTITY_ID)\n const fileEntity: FileEntity = entity as FileEntity\n const fileHandleAssociationList: FileHandleAssociation[] = [\n {\n associateObjectId: fileEntity.id!,\n associateObjectType: FileHandleAssociateType.FileEntity,\n fileHandleId: fileEntity.dataFileHandleId,\n },\n ]\n const request: BatchFileRequest = {\n includeFileHandles: true,\n includePreSignedURLs: true,\n includePreviewPreSignedURLs: false,\n requestedFiles: fileHandleAssociationList,\n }\n const data: BatchFileResult = await getFiles(request, accessToken)\n const presignedUrl: string = data.requestedFiles[0].preSignedURL!\n // we know this file exists\n const fileHandle: FileHandle = data.requestedFiles[0].fileHandle!\n // start test!\n const startMs = Date.now()\n await getFileHandleContent(fileHandle, presignedUrl)\n // bytes/second\n const result =\n fileHandle.contentSize /\n ((Date.now() - startMs - ESTIMATED_CORS_TIME_MS) / 1000)\n // save result in cache (for 5 minutes)\n const now: number = Date.now()\n localStorage.setItem(\n ESTIMATED_DOWNLOAD_SPEED_EXPIRE_TIME_KEY,\n (now + 1000 * 60 * 5).toString(),\n )\n localStorage.setItem(ESTIMATED_DOWNLOAD_SPEED_KEY, result.toString())\n return result\n}\n"],"mappings":";;;AAeA,IAAM,IAAiC,KACjC,IACJ,wCACI,IAAuC,4BACvC,IAA8B,eAOvB,IAAoB,OAC/B,MACoB;CAEpB,IAAM,IAAwB,aAAa,QACzC,CACF,GACM,IAAc,aAAa,QAAQ,CAA4B;CACrE,IAAI,KAAyB,KAEP,KAAK,IACrB,IAAM,OAAO,CAAqB,GACpC,OAAO,OAAO,CAAW;CAU7B,IAAM,IAAyB,MADF,EAAU,GAAa,CAAmB,GAejE,IAAwB,MAAM,EAAS;EAL3C,oBAAoB;EACpB,sBAAsB;EACtB,6BAA6B;EAC7B,gBAAgB,CAVhB;GACE,mBAAmB,EAAW;GAC9B,qBAAqB,EAAwB;GAC7C,cAAc,EAAW;EAC3B,CAMgB;CAE2B,GAAS,CAAW,GAC3D,IAAuB,EAAK,eAAe,GAAG,cAE9C,IAAyB,EAAK,eAAe,GAAG,YAEhD,IAAU,KAAK,IAAI;CACzB,MAAM,EAAqB,GAAY,CAAY;CAEnD,IAAM,IACJ,EAAW,gBACT,KAAK,IAAI,IAAI,IAAU,KAA0B,MAE/C,IAAc,KAAK,IAAI;CAM7B,OALA,aAAa,QACX,IACC,IAAM,MAAO,KAAK,GAAG,SAAS,CACjC,GACA,aAAa,QAAQ,GAA8B,EAAO,SAAS,CAAC,GAC7D;AACT"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
//#region src/utils/functions/unCamelCase.ts
|
|
2
|
-
var e = (e) => e.
|
|
2
|
+
var e = (e) => e.replaceAll(/([a-z])([A-Z])/g, "$1 $2").replace(/\b([A-Z]+)([A-Z])([a-z])/, "$1 $2$3").replace(/^./, (e) => e.toUpperCase());
|
|
3
3
|
//#endregion
|
|
4
4
|
export { e as unCamelCase };
|
|
5
5
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"unCamelCase.js","names":[],"sources":["../../../src/utils/functions/unCamelCase.ts"],"sourcesContent":["export const unCamelCase = (str: string): string => {\n // https://stackoverflow.com/questions/4149276/how-to-convert-camelcase-to-camel-case\n return (\n str\n // insert a space between lower & upper\n .
|
|
1
|
+
{"version":3,"file":"unCamelCase.js","names":[],"sources":["../../../src/utils/functions/unCamelCase.ts"],"sourcesContent":["export const unCamelCase = (str: string): string => {\n // https://stackoverflow.com/questions/4149276/how-to-convert-camelcase-to-camel-case\n return (\n str\n // insert a space between lower & upper\n .replaceAll(/([a-z])([A-Z])/g, '$1 $2')\n // space before last upper in a sequence followed by lower\n .replace(/\\b([A-Z]+)([A-Z])([a-z])/, '$1 $2$3')\n // uppercase the first character\n .replace(/^./, (str: string) => {\n return str.toUpperCase()\n })\n )\n}\n"],"mappings":";AAAA,IAAa,KAAe,MAGxB,EAEG,WAAW,mBAAmB,OAAO,EAErC,QAAQ,4BAA4B,SAAS,EAE7C,QAAQ,OAAO,MACP,EAAI,YAAY,CACxB"}
|
|
@@ -36,21 +36,21 @@ var m = {
|
|
|
36
36
|
submissionInstructionsMessage: "Unknown",
|
|
37
37
|
submissionReceiptMessage: "Unknown"
|
|
38
38
|
}, _ = async (e, t) => {
|
|
39
|
-
let n = await i(e, t), r = e.filter((e) => n.results.map((e) => e.id).
|
|
39
|
+
let n = await i(e, t), r = e.filter((e) => !n.results.map((e) => e.id).includes(e.targetId)).map((e) => ({
|
|
40
40
|
...h,
|
|
41
41
|
id: e.targetId,
|
|
42
42
|
name: `${e.targetId}`
|
|
43
43
|
}));
|
|
44
44
|
return [...n.results, ...r];
|
|
45
45
|
}, v = async (e, t) => {
|
|
46
|
-
let n = (await o(e, t)).children, r = e.filter((e) => n.map((e) => e.ownerId).
|
|
46
|
+
let n = (await o(e, t)).children, r = e.filter((e) => !n.map((e) => e.ownerId).includes(e)).map((e) => ({
|
|
47
47
|
...m,
|
|
48
48
|
ownerId: e,
|
|
49
49
|
name: `Unknown User (${e})`
|
|
50
50
|
}));
|
|
51
51
|
return [...n, ...r];
|
|
52
52
|
}, y = async (e, t) => {
|
|
53
|
-
let n = await a({ evaluationIds: e }, t), r = e.filter((e) => n.results.map((e) => e.id).
|
|
53
|
+
let n = await a({ evaluationIds: e }, t), r = e.filter((e) => !n.results.map((e) => e.id).includes(e)).map((e) => ({
|
|
54
54
|
...g,
|
|
55
55
|
id: e,
|
|
56
56
|
name: e
|
|
@@ -71,8 +71,8 @@ function b(i) {
|
|
|
71
71
|
if (!e.length) return;
|
|
72
72
|
let t = sessionStorage.getItem(x);
|
|
73
73
|
try {
|
|
74
|
-
let n = t ? JSON.parse(t) : [], r = n.map((e) => e[b]);
|
|
75
|
-
for (let t of e) r.
|
|
74
|
+
let n = t ? JSON.parse(t) : [], r = new Set(n.map((e) => e[b]));
|
|
75
|
+
for (let t of e) r.has(t[b]) || n.push(t);
|
|
76
76
|
sessionStorage.setItem(x, JSON.stringify(n));
|
|
77
77
|
} catch {
|
|
78
78
|
sessionStorage.setItem(x, JSON.stringify(e));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useGetInfoFromIds.js","names":[],"sources":["../../../src/utils/hooks/useGetInfoFromIds.ts"],"sourcesContent":["import {\n getEntityHeaders,\n getEvaluations,\n getGroupHeadersBatch,\n} from '@/synapse-client'\nimport {\n EntityHeader,\n Evaluation,\n Reference,\n ReferenceList,\n UserGroupHeader,\n} from '@sage-bionetworks/synapse-types'\nimport { chunk, uniq, without } from 'lodash-es'\nimport { useEffect, useState } from 'react'\nimport useDeepCompareEffect from 'use-deep-compare-effect'\nimport { useSynapseContext } from '../context/SynapseContext'\nimport { SynapseConstants } from '../index'\n\nexport type UseGetInfoFromIdsProps<\n T extends EntityHeader | UserGroupHeader | Evaluation,\n THookType = T extends EntityHeader\n ? 'ENTITY_HEADER'\n : T extends UserGroupHeader\n ? 'USER_PROFILE'\n : T extends Evaluation\n ? 'EVALUATION_QUEUE'\n : never,\n> = {\n ids: string[]\n type: THookType\n}\n\ntype LookupRequestType = string | Reference\n\nconst UserGroupHeaderTemplate: UserGroupHeader = {\n ownerId: '', // A foreign key to the ID of the 'principal' object for the user\n firstName: 'Unknown', // This person's given name (forename)\n lastName: 'Unknown', // This person's family name (surname)\n userName: 'Unknown', // A name chosen by the user that uniquely identifies them\n isIndividual: false,\n}\n\nconst entityHeaderTemplate: EntityHeader = {\n name: 'Unknown', //\tThe name of the entity\n id: 'unknown', //\tThe id of the entity\n type: 'org.sagebionetworks.repo.model.FileEntity', //\tThe type of the entity\n versionNumber: 0, //\tThe version number of the entity\n versionLabel: 'placeholder', //\tThe user defined version label of the entity\n benefactorId: 0, //\tThe ID of the entity that this Entity's ACL is inherited from.\n createdOn: 'null', //\tThe date this entity was created.\n modifiedOn: 'null', //\tThe date this entity was last modified.\n createdBy: 'null', //\tThe ID of the user that created this entity.\n modifiedBy: 'null', //\tThe ID of the user that last modified this entity.\n isLatestVersion: true, // If this version is the latest version of the entity\n}\n\nconst evaluationTemplate: Evaluation = {\n id: 'unknown', // The unique immutable ID for this Evaluation.\n etag: 'Unknown', // Synapse employs an Optimistic Concurrency Control (OCC) scheme to handle concurrent updates. The eTag changes every time an Evaluation is updated; it is used to detect when a client's copy of an Evaluation is out-of-date.\n name: 'Unknown', // The name of this Evaluation\n description: 'Unknown', // A text description of this Evaluation.\n ownerId: 'null', // The ID of the Synapse user who created this Evaluation.\n createdOn: 'null', //\tThe date on which Evaluation was created.\n contentSource: 'Unknown', // The Synapse ID of the Entity to which this Evaluation belongs, e.g. a reference to a Synapse project.\n submissionInstructionsMessage: 'Unknown', // Message to display to users detailing acceptable formatting for Submissions to this Evaluation.\n submissionReceiptMessage: 'Unknown', // Message to display to users upon successful submission to this Evaluation.\n}\n\nconst getEntityHeaderItems = async (\n lookupList: ReferenceList,\n accessToken: string | undefined,\n): Promise<EntityHeader[]> => {\n const newData = await getEntityHeaders(lookupList, accessToken)\n const notFound = lookupList.filter(\n item => newData.results.map(item => item.id).indexOf(item.targetId) === -1,\n )\n const notFoundPlaceholders = notFound.map(item => ({\n ...entityHeaderTemplate,\n id: item.targetId,\n name: `${item.targetId}`,\n }))\n\n return [...newData.results, ...notFoundPlaceholders]\n}\n\nconst getUserGroupHeaderItems = async (\n lookupList: string[],\n accessToken: string | undefined,\n): Promise<UserGroupHeader[]> => {\n const newData = (await getGroupHeadersBatch(lookupList, accessToken)).children\n const notFound = lookupList.filter(\n item => newData.map(item => item.ownerId).indexOf(item) === -1,\n )\n const notFoundPlaceholders = notFound.map(item => ({\n ...UserGroupHeaderTemplate,\n ownerId: item,\n name: `Unknown User (${item})`,\n }))\n\n return [...newData, ...notFoundPlaceholders]\n}\n\nconst getEvaluationItems = async (\n lookupList: string[],\n accessToken: string | undefined,\n): Promise<Evaluation[]> => {\n const newData = await getEvaluations(\n { evaluationIds: lookupList },\n accessToken,\n )\n const notFound = lookupList.filter(\n item => newData.results.map(item => item.id).indexOf(item) === -1,\n )\n const notFoundPlaceholders = notFound.map(item => ({\n ...evaluationTemplate,\n id: item,\n name: item,\n }))\n\n return [...newData.results, ...notFoundPlaceholders]\n}\n\n/**\n * React hook to get user profiles or entities or evaluation queues. Utilizes a custom cache in sessionStorage.\n *\n * For fetching just one entity or usergroup, see useGetEntity/useGetUserGroupHeader hooks powered by react-query\n * @returns\n */\nexport default function useGetInfoFromIds<\n T extends EntityHeader | UserGroupHeader | Evaluation,\n>(props: UseGetInfoFromIdsProps<T>): T[] {\n const { ids, type } = props\n const { accessToken } = useSynapseContext()\n\n const [data, setData] = useState<Array<T>>([])\n\n const idKey = (type === 'USER_PROFILE' ? 'ownerId' : 'id') as keyof T\n\n const getStorageKey = (type: UseGetInfoFromIdsProps<T>['type']) => {\n switch (type) {\n case 'USER_PROFILE':\n return SynapseConstants.USER_PROFILE_STORAGE_KEY\n case 'ENTITY_HEADER':\n return SynapseConstants.ENTITY_HEADER_STORAGE_KEY\n case 'EVALUATION_QUEUE':\n return SynapseConstants.EVALUATIONS_STORAGE_KEY\n default:\n return ''\n }\n }\n const storageKey: string = getStorageKey(type)\n\n // look at current list of data, see if incoming ids has new data,\n // if so grab those ids\n const curList = data.map(el => el[idKey]) as string[]\n const incomingList = ids.filter(el => el !== SynapseConstants.VALUE_NOT_SET)\n const newValues = uniq(without(incomingList, ...curList))\n\n useEffect(() => {\n const saveToSessionStorage = (data: T[]) => {\n if (!data.length) {\n return\n }\n //get what's there\n const dataInStorage = sessionStorage.getItem(storageKey)\n try {\n const dataInStorageAsObjectArr: T[] = dataInStorage\n ? JSON.parse(dataInStorage)\n : []\n //get an array of ids for items already in storage\n const ids = dataInStorageAsObjectArr.map(item => item[idKey])\n //push all the new data if ids are new\n for (const dataObject of data) {\n if (!ids.includes(dataObject[idKey])) {\n dataInStorageAsObjectArr.push(dataObject)\n }\n }\n sessionStorage.setItem(\n storageKey,\n JSON.stringify(dataInStorageAsObjectArr),\n )\n } catch (e) {\n sessionStorage.setItem(storageKey, JSON.stringify(data))\n }\n }\n saveToSessionStorage(data)\n }, [data, idKey, storageKey])\n\n // Alina TODO: check if the items are already in Local Storage before making server call.\n\n // Michael TODO: There's a bug where the data held in useGetInfoFromIds will be stale if the user token changes,\n // this can be solved by using the useCompare hook on the token to track when it changes\n useDeepCompareEffect(() => {\n let isCancelled = false\n const getData = async () => {\n if (newValues.length > 0) {\n try {\n const newIds = Array.from<string>(newValues)\n const newReferences: LookupRequestType[] =\n type === 'ENTITY_HEADER'\n ? newIds.map(el => ({ targetId: el }))\n : newIds\n const newReferencesChunks = chunk(newReferences, 45)\n const totalData: T[] = []\n for (const newReferences of newReferencesChunks) {\n let newData: T[] = []\n switch (type) {\n case 'USER_PROFILE':\n newData = (await getUserGroupHeaderItems(\n newReferences as string[],\n accessToken,\n )) as T[]\n break\n case 'ENTITY_HEADER':\n newData = (await getEntityHeaderItems(\n newReferences as ReferenceList,\n accessToken,\n )) as T[]\n break\n case 'EVALUATION_QUEUE':\n newData = (await getEvaluationItems(\n newReferences as string[],\n accessToken,\n )) as T[]\n break\n }\n totalData.push(...newData)\n }\n if (!isCancelled) {\n setData(oldData => oldData.concat(...totalData))\n }\n } catch (error) {\n console.error('Error on data retrieval', error)\n }\n }\n }\n getData()\n return () => {\n isCancelled = true\n }\n }, [accessToken, type, newValues])\n return data\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"useGetInfoFromIds.js","names":[],"sources":["../../../src/utils/hooks/useGetInfoFromIds.ts"],"sourcesContent":["import {\n getEntityHeaders,\n getEvaluations,\n getGroupHeadersBatch,\n} from '@/synapse-client'\nimport {\n EntityHeader,\n Evaluation,\n Reference,\n ReferenceList,\n UserGroupHeader,\n} from '@sage-bionetworks/synapse-types'\nimport { chunk, uniq, without } from 'lodash-es'\nimport { useEffect, useState } from 'react'\nimport useDeepCompareEffect from 'use-deep-compare-effect'\nimport { useSynapseContext } from '../context/SynapseContext'\nimport { SynapseConstants } from '../index'\n\nexport type UseGetInfoFromIdsProps<\n T extends EntityHeader | UserGroupHeader | Evaluation,\n THookType = T extends EntityHeader\n ? 'ENTITY_HEADER'\n : T extends UserGroupHeader\n ? 'USER_PROFILE'\n : T extends Evaluation\n ? 'EVALUATION_QUEUE'\n : never,\n> = {\n ids: string[]\n type: THookType\n}\n\ntype LookupRequestType = string | Reference\n\nconst UserGroupHeaderTemplate: UserGroupHeader = {\n ownerId: '', // A foreign key to the ID of the 'principal' object for the user\n firstName: 'Unknown', // This person's given name (forename)\n lastName: 'Unknown', // This person's family name (surname)\n userName: 'Unknown', // A name chosen by the user that uniquely identifies them\n isIndividual: false,\n}\n\nconst entityHeaderTemplate: EntityHeader = {\n name: 'Unknown', //\tThe name of the entity\n id: 'unknown', //\tThe id of the entity\n type: 'org.sagebionetworks.repo.model.FileEntity', //\tThe type of the entity\n versionNumber: 0, //\tThe version number of the entity\n versionLabel: 'placeholder', //\tThe user defined version label of the entity\n benefactorId: 0, //\tThe ID of the entity that this Entity's ACL is inherited from.\n createdOn: 'null', //\tThe date this entity was created.\n modifiedOn: 'null', //\tThe date this entity was last modified.\n createdBy: 'null', //\tThe ID of the user that created this entity.\n modifiedBy: 'null', //\tThe ID of the user that last modified this entity.\n isLatestVersion: true, // If this version is the latest version of the entity\n}\n\nconst evaluationTemplate: Evaluation = {\n id: 'unknown', // The unique immutable ID for this Evaluation.\n etag: 'Unknown', // Synapse employs an Optimistic Concurrency Control (OCC) scheme to handle concurrent updates. The eTag changes every time an Evaluation is updated; it is used to detect when a client's copy of an Evaluation is out-of-date.\n name: 'Unknown', // The name of this Evaluation\n description: 'Unknown', // A text description of this Evaluation.\n ownerId: 'null', // The ID of the Synapse user who created this Evaluation.\n createdOn: 'null', //\tThe date on which Evaluation was created.\n contentSource: 'Unknown', // The Synapse ID of the Entity to which this Evaluation belongs, e.g. a reference to a Synapse project.\n submissionInstructionsMessage: 'Unknown', // Message to display to users detailing acceptable formatting for Submissions to this Evaluation.\n submissionReceiptMessage: 'Unknown', // Message to display to users upon successful submission to this Evaluation.\n}\n\nconst getEntityHeaderItems = async (\n lookupList: ReferenceList,\n accessToken: string | undefined,\n): Promise<EntityHeader[]> => {\n const newData = await getEntityHeaders(lookupList, accessToken)\n const notFound = lookupList.filter(\n item => !newData.results.map(item => item.id).includes(item.targetId),\n )\n const notFoundPlaceholders = notFound.map(item => ({\n ...entityHeaderTemplate,\n id: item.targetId,\n name: `${item.targetId}`,\n }))\n\n return [...newData.results, ...notFoundPlaceholders]\n}\n\nconst getUserGroupHeaderItems = async (\n lookupList: string[],\n accessToken: string | undefined,\n): Promise<UserGroupHeader[]> => {\n const newData = (await getGroupHeadersBatch(lookupList, accessToken)).children\n const notFound = lookupList.filter(\n item => !newData.map(item => item.ownerId).includes(item),\n )\n const notFoundPlaceholders = notFound.map(item => ({\n ...UserGroupHeaderTemplate,\n ownerId: item,\n name: `Unknown User (${item})`,\n }))\n\n return [...newData, ...notFoundPlaceholders]\n}\n\nconst getEvaluationItems = async (\n lookupList: string[],\n accessToken: string | undefined,\n): Promise<Evaluation[]> => {\n const newData = await getEvaluations(\n { evaluationIds: lookupList },\n accessToken,\n )\n const notFound = lookupList.filter(\n item => !newData.results.map(item => item.id).includes(item),\n )\n const notFoundPlaceholders = notFound.map(item => ({\n ...evaluationTemplate,\n id: item,\n name: item,\n }))\n\n return [...newData.results, ...notFoundPlaceholders]\n}\n\n/**\n * React hook to get user profiles or entities or evaluation queues. Utilizes a custom cache in sessionStorage.\n *\n * For fetching just one entity or usergroup, see useGetEntity/useGetUserGroupHeader hooks powered by react-query\n * @returns\n */\nexport default function useGetInfoFromIds<\n T extends EntityHeader | UserGroupHeader | Evaluation,\n>(props: UseGetInfoFromIdsProps<T>): T[] {\n const { ids, type } = props\n const { accessToken } = useSynapseContext()\n\n const [data, setData] = useState<Array<T>>([])\n\n const idKey = (type === 'USER_PROFILE' ? 'ownerId' : 'id') as keyof T\n\n const getStorageKey = (type: UseGetInfoFromIdsProps<T>['type']) => {\n switch (type) {\n case 'USER_PROFILE':\n return SynapseConstants.USER_PROFILE_STORAGE_KEY\n case 'ENTITY_HEADER':\n return SynapseConstants.ENTITY_HEADER_STORAGE_KEY\n case 'EVALUATION_QUEUE':\n return SynapseConstants.EVALUATIONS_STORAGE_KEY\n default:\n return ''\n }\n }\n const storageKey: string = getStorageKey(type)\n\n // look at current list of data, see if incoming ids has new data,\n // if so grab those ids\n const curList = data.map(el => el[idKey]) as string[]\n const incomingList = ids.filter(el => el !== SynapseConstants.VALUE_NOT_SET)\n const newValues = uniq(without(incomingList, ...curList))\n\n useEffect(() => {\n const saveToSessionStorage = (data: T[]) => {\n if (!data.length) {\n return\n }\n //get what's there\n const dataInStorage = sessionStorage.getItem(storageKey)\n try {\n const dataInStorageAsObjectArr: T[] = dataInStorage\n ? JSON.parse(dataInStorage)\n : []\n //get an array of ids for items already in storage\n const ids = new Set(dataInStorageAsObjectArr.map(item => item[idKey]))\n //push all the new data if ids are new\n for (const dataObject of data) {\n if (!ids.has(dataObject[idKey])) {\n dataInStorageAsObjectArr.push(dataObject)\n }\n }\n sessionStorage.setItem(\n storageKey,\n JSON.stringify(dataInStorageAsObjectArr),\n )\n } catch (e) {\n sessionStorage.setItem(storageKey, JSON.stringify(data))\n }\n }\n saveToSessionStorage(data)\n }, [data, idKey, storageKey])\n\n // Alina TODO: check if the items are already in Local Storage before making server call.\n\n // Michael TODO: There's a bug where the data held in useGetInfoFromIds will be stale if the user token changes,\n // this can be solved by using the useCompare hook on the token to track when it changes\n useDeepCompareEffect(() => {\n let isCancelled = false\n const getData = async () => {\n if (newValues.length > 0) {\n try {\n const newIds = Array.from<string>(newValues)\n const newReferences: LookupRequestType[] =\n type === 'ENTITY_HEADER'\n ? newIds.map(el => ({ targetId: el }))\n : newIds\n const newReferencesChunks = chunk(newReferences, 45)\n const totalData: T[] = []\n for (const newReferences of newReferencesChunks) {\n let newData: T[] = []\n switch (type) {\n case 'USER_PROFILE':\n newData = (await getUserGroupHeaderItems(\n newReferences as string[],\n accessToken,\n )) as T[]\n break\n case 'ENTITY_HEADER':\n newData = (await getEntityHeaderItems(\n newReferences as ReferenceList,\n accessToken,\n )) as T[]\n break\n case 'EVALUATION_QUEUE':\n newData = (await getEvaluationItems(\n newReferences as string[],\n accessToken,\n )) as T[]\n break\n }\n totalData.push(...newData)\n }\n if (!isCancelled) {\n setData(oldData => oldData.concat(...totalData))\n }\n } catch (error) {\n console.error('Error on data retrieval', error)\n }\n }\n }\n getData()\n return () => {\n isCancelled = true\n }\n }, [accessToken, type, newValues])\n return data\n}\n"],"mappings":"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"}
|
|
@@ -18,7 +18,7 @@ function s(e, t) {
|
|
|
18
18
|
}
|
|
19
19
|
function c(e, t) {
|
|
20
20
|
let n = i(t), { facetsToRemove: o } = e, s = Array.isArray(o);
|
|
21
|
-
return n.query.selectedFacets = (n.query.selectedFacets ?? []).filter((e) => s ? !o.
|
|
21
|
+
return n.query.selectedFacets = (n.query.selectedFacets ?? []).filter((e) => s ? !o.some((t) => r(t, e)) : !r(o, e)), a(n, t) || (n.query.offset = 0), n;
|
|
22
22
|
}
|
|
23
23
|
function l(e, t) {
|
|
24
24
|
let n = i(t), { facet: o, min: s, max: c } = e, l = i(n.query.selectedFacets ?? []), u = l.find((e) => e.concreteType === "org.sagebionetworks.repo.model.table.FacetColumnRangeRequest" && r(o, e));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TableQueryReducerActions.js","names":[],"sources":["../../../../src/utils/hooks/useImmutableTableQuery/TableQueryReducerActions.ts"],"sourcesContent":["import {\n isColumnMultiValueFunctionQueryFilter,\n isColumnSingleValueQueryFilter,\n isFacetColumnValuesRequest,\n} from '@/utils/types/IsType'\nimport { UniqueFacetIdentifier } from '@/utils/types/UniqueFacetIdentifier'\nimport {\n FacetColumnRangeRequest,\n FacetColumnValuesRequest,\n QueryBundleRequest,\n QueryFilter,\n} from '@sage-bionetworks/synapse-types'\nimport { cloneDeep, isEqual } from 'lodash-es'\nimport * as React from 'react'\nimport { facetObjectMatchesDefinition } from '../../functions/queryUtils'\nimport { DEFAULT_PAGE_SIZE } from '../../SynapseConstants'\nimport { QueryChangeCommitOptions } from './useTableQueryReducer'\n\nexport function getQueryFromSetStateAction(\n action: { commitOptions?: QueryChangeCommitOptions } & {\n type: 'setQuery'\n queryOrUpdater: React.SetStateAction<QueryBundleRequest>\n },\n queryRequest: QueryBundleRequest,\n): QueryBundleRequest {\n const queryRequestClone = cloneDeep(queryRequest)\n const { queryOrUpdater } = action\n if (typeof queryOrUpdater === 'function') {\n return queryOrUpdater(queryRequestClone)\n } else {\n return queryOrUpdater\n }\n}\n\nexport function addValueToSelectedFacet(\n action: { commitOptions?: QueryChangeCommitOptions } & {\n type: 'addValueToSelectedFacet'\n facet: UniqueFacetIdentifier\n value: string\n },\n queryRequest: QueryBundleRequest,\n) {\n const queryRequestClone = cloneDeep(queryRequest)\n const { facet, value } = action\n const newFacets = queryRequestClone.query.selectedFacets ?? []\n\n const existingFacetSelection = newFacets.find(\n (existingFacet): existingFacet is FacetColumnValuesRequest => {\n return (\n existingFacet.concreteType ===\n 'org.sagebionetworks.repo.model.table.FacetColumnValuesRequest' &&\n facetObjectMatchesDefinition(facet, existingFacet)\n )\n },\n )\n\n if (existingFacetSelection) {\n if (!existingFacetSelection.facetValues.includes(value)) {\n existingFacetSelection.facetValues.push(value)\n }\n } else {\n newFacets.push({\n concreteType:\n 'org.sagebionetworks.repo.model.table.FacetColumnValuesRequest',\n columnName: facet.columnName,\n jsonPath: facet.jsonPath,\n facetValues: [value],\n })\n }\n queryRequestClone.query.selectedFacets = newFacets\n if (!isEqual(queryRequestClone, queryRequest)) {\n queryRequestClone.query.offset = 0\n }\n return queryRequestClone\n}\n\nexport function removeSelectedFacet(\n action: { commitOptions?: QueryChangeCommitOptions } & {\n type: 'removeSelectedFacet'\n facetsToRemove: UniqueFacetIdentifier | UniqueFacetIdentifier[]\n },\n queryRequest: QueryBundleRequest,\n): QueryBundleRequest {\n const queryRequestClone = cloneDeep(queryRequest)\n const { facetsToRemove } = action\n const isArray = Array.isArray(facetsToRemove)\n queryRequestClone.query.selectedFacets = (\n queryRequestClone.query.selectedFacets ?? []\n ).filter(facet => {\n // Use lodash for deep comparison\n if (isArray) {\n return !facetsToRemove.find(item => {\n return facetObjectMatchesDefinition(item, facet)\n })\n } else {\n return !facetObjectMatchesDefinition(facetsToRemove, facet)\n }\n })\n if (!isEqual(queryRequestClone, queryRequest)) {\n queryRequestClone.query.offset = 0\n }\n return queryRequestClone\n}\n\nexport function setRangeFacetValue(\n action: { commitOptions?: QueryChangeCommitOptions } & {\n type: 'setRangeFacetValue'\n facet: UniqueFacetIdentifier\n min?: string\n max?: string\n },\n queryRequest: QueryBundleRequest,\n) {\n const queryRequestClone = cloneDeep(queryRequest)\n const { facet, min, max } = action\n const newFacets = cloneDeep(queryRequestClone.query.selectedFacets ?? [])\n\n const existingFacetSelection = newFacets.find(\n (existingFacet): existingFacet is FacetColumnRangeRequest => {\n return (\n existingFacet.concreteType ===\n 'org.sagebionetworks.repo.model.table.FacetColumnRangeRequest' &&\n facetObjectMatchesDefinition(facet, existingFacet)\n )\n },\n )\n if (existingFacetSelection && min == null && max == null) {\n // remove the facet\n newFacets.splice(newFacets.indexOf(existingFacetSelection), 1)\n } else if (existingFacetSelection) {\n existingFacetSelection.min = min\n existingFacetSelection.max = max\n } else {\n newFacets.push({\n concreteType:\n 'org.sagebionetworks.repo.model.table.FacetColumnRangeRequest',\n columnName: facet.columnName,\n jsonPath: facet.jsonPath,\n min,\n max,\n })\n }\n queryRequestClone.query.selectedFacets = newFacets\n if (!isEqual(queryRequestClone, queryRequest)) {\n queryRequestClone.query.offset = 0\n }\n return queryRequestClone\n}\n\nexport function removeValueFromSelectedFacet(\n action: { commitOptions?: QueryChangeCommitOptions } & {\n type: 'removeValueFromSelectedFacet'\n facet: UniqueFacetIdentifier\n value: string\n },\n queryRequest: QueryBundleRequest,\n) {\n const queryRequestClone = cloneDeep(queryRequest)\n const { facet, value } = action\n queryRequestClone.query.selectedFacets = (\n queryRequestClone.query.selectedFacets ?? []\n )\n // Modify the requested filter\n .map(facetColumnRequest => {\n if (\n isFacetColumnValuesRequest(facetColumnRequest) &&\n facetObjectMatchesDefinition(facet, facetColumnRequest)\n ) {\n // Remove the value from the filter\n facetColumnRequest.facetValues = facetColumnRequest.facetValues.filter(\n v => v !== value,\n )\n }\n return facetColumnRequest\n })\n // Remove filters that have no values\n .filter(facetColumnRequest => {\n if (isFacetColumnValuesRequest(facetColumnRequest)) {\n // Remove the value from the filter\n return (\n Array.isArray(facetColumnRequest.facetValues) &&\n facetColumnRequest.facetValues.length > 0\n )\n }\n return true\n })\n if (!isEqual(queryRequestClone, queryRequest)) {\n queryRequestClone.query.offset = 0\n }\n return queryRequestClone\n}\n\nexport function removeQueryFilter(\n action: {\n type: 'removeQueryFilter'\n queryFilter: QueryFilter\n },\n queryRequest: QueryBundleRequest,\n) {\n const queryRequestClone = cloneDeep(queryRequest)\n const { queryFilter } = action\n queryRequestClone.query.additionalFilters = (\n queryRequestClone.query.additionalFilters ?? []\n ).filter(qf => {\n // Use lodash for deep comparison\n return !isEqual(qf, queryFilter)\n })\n if (!isEqual(queryRequestClone, queryRequest)) {\n queryRequestClone.query.offset = 0\n }\n return queryRequestClone\n}\n\nexport function removeValueFromQueryFilter(\n action: { commitOptions?: QueryChangeCommitOptions } & {\n type: 'removeValueFromQueryFilter'\n queryFilter: QueryFilter\n value: string\n },\n queryRequest: QueryBundleRequest,\n) {\n const queryRequestClone = cloneDeep(queryRequest)\n const { queryFilter, value } = action\n queryRequestClone.query.additionalFilters = (\n queryRequestClone.query.additionalFilters ?? []\n )\n // Modify the requested filter\n .map(qf => {\n if (\n (isColumnSingleValueQueryFilter(qf) ||\n isColumnMultiValueFunctionQueryFilter(qf)) &&\n isEqual(qf, queryFilter)\n ) {\n // Remove the value from the filter\n qf.values = qf.values.filter(v => v !== value)\n }\n return qf\n })\n // Remove filters that have no values\n .filter(qf => {\n if (\n isColumnSingleValueQueryFilter(qf) ||\n isColumnMultiValueFunctionQueryFilter(qf)\n ) {\n // Remove the value from the filter\n return Array.isArray(qf.values) && qf.values.length > 0\n }\n return true\n })\n if (!isEqual(queryRequestClone, queryRequest)) {\n queryRequestClone.query.offset = 0\n }\n return queryRequestClone\n}\n\nexport function setPageSize(\n action: { commitOptions?: QueryChangeCommitOptions } & {\n type: 'setPageSize'\n pageSize: number\n },\n queryRequest: QueryBundleRequest,\n) {\n const queryRequestClone = cloneDeep(queryRequest)\n const { pageSize } = action\n queryRequestClone.query.limit = pageSize\n return queryRequestClone\n}\n\nexport function goToPage(\n action: { commitOptions?: QueryChangeCommitOptions } & {\n type: 'goToPage'\n pageNumber: number\n },\n queryRequest: QueryBundleRequest,\n) {\n const queryRequestClone = cloneDeep(queryRequest)\n const { pageNumber } = action\n const pageSize = queryRequest.query.limit ?? DEFAULT_PAGE_SIZE\n queryRequestClone.query.offset = (pageNumber - 1) * pageSize\n return queryRequestClone\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"TableQueryReducerActions.js","names":[],"sources":["../../../../src/utils/hooks/useImmutableTableQuery/TableQueryReducerActions.ts"],"sourcesContent":["import {\n isColumnMultiValueFunctionQueryFilter,\n isColumnSingleValueQueryFilter,\n isFacetColumnValuesRequest,\n} from '@/utils/types/IsType'\nimport { UniqueFacetIdentifier } from '@/utils/types/UniqueFacetIdentifier'\nimport {\n FacetColumnRangeRequest,\n FacetColumnValuesRequest,\n QueryBundleRequest,\n QueryFilter,\n} from '@sage-bionetworks/synapse-types'\nimport { cloneDeep, isEqual } from 'lodash-es'\nimport * as React from 'react'\nimport { facetObjectMatchesDefinition } from '../../functions/queryUtils'\nimport { DEFAULT_PAGE_SIZE } from '../../SynapseConstants'\nimport { QueryChangeCommitOptions } from './useTableQueryReducer'\n\nexport function getQueryFromSetStateAction(\n action: { commitOptions?: QueryChangeCommitOptions } & {\n type: 'setQuery'\n queryOrUpdater: React.SetStateAction<QueryBundleRequest>\n },\n queryRequest: QueryBundleRequest,\n): QueryBundleRequest {\n const queryRequestClone = cloneDeep(queryRequest)\n const { queryOrUpdater } = action\n if (typeof queryOrUpdater === 'function') {\n return queryOrUpdater(queryRequestClone)\n } else {\n return queryOrUpdater\n }\n}\n\nexport function addValueToSelectedFacet(\n action: { commitOptions?: QueryChangeCommitOptions } & {\n type: 'addValueToSelectedFacet'\n facet: UniqueFacetIdentifier\n value: string\n },\n queryRequest: QueryBundleRequest,\n) {\n const queryRequestClone = cloneDeep(queryRequest)\n const { facet, value } = action\n const newFacets = queryRequestClone.query.selectedFacets ?? []\n\n const existingFacetSelection = newFacets.find(\n (existingFacet): existingFacet is FacetColumnValuesRequest => {\n return (\n existingFacet.concreteType ===\n 'org.sagebionetworks.repo.model.table.FacetColumnValuesRequest' &&\n facetObjectMatchesDefinition(facet, existingFacet)\n )\n },\n )\n\n if (existingFacetSelection) {\n if (!existingFacetSelection.facetValues.includes(value)) {\n existingFacetSelection.facetValues.push(value)\n }\n } else {\n newFacets.push({\n concreteType:\n 'org.sagebionetworks.repo.model.table.FacetColumnValuesRequest',\n columnName: facet.columnName,\n jsonPath: facet.jsonPath,\n facetValues: [value],\n })\n }\n queryRequestClone.query.selectedFacets = newFacets\n if (!isEqual(queryRequestClone, queryRequest)) {\n queryRequestClone.query.offset = 0\n }\n return queryRequestClone\n}\n\nexport function removeSelectedFacet(\n action: { commitOptions?: QueryChangeCommitOptions } & {\n type: 'removeSelectedFacet'\n facetsToRemove: UniqueFacetIdentifier | UniqueFacetIdentifier[]\n },\n queryRequest: QueryBundleRequest,\n): QueryBundleRequest {\n const queryRequestClone = cloneDeep(queryRequest)\n const { facetsToRemove } = action\n const isArray = Array.isArray(facetsToRemove)\n queryRequestClone.query.selectedFacets = (\n queryRequestClone.query.selectedFacets ?? []\n ).filter(facet => {\n // Use lodash for deep comparison\n if (isArray) {\n return !facetsToRemove.some(item => {\n return facetObjectMatchesDefinition(item, facet)\n })\n } else {\n return !facetObjectMatchesDefinition(facetsToRemove, facet)\n }\n })\n if (!isEqual(queryRequestClone, queryRequest)) {\n queryRequestClone.query.offset = 0\n }\n return queryRequestClone\n}\n\nexport function setRangeFacetValue(\n action: { commitOptions?: QueryChangeCommitOptions } & {\n type: 'setRangeFacetValue'\n facet: UniqueFacetIdentifier\n min?: string\n max?: string\n },\n queryRequest: QueryBundleRequest,\n) {\n const queryRequestClone = cloneDeep(queryRequest)\n const { facet, min, max } = action\n const newFacets = cloneDeep(queryRequestClone.query.selectedFacets ?? [])\n\n const existingFacetSelection = newFacets.find(\n (existingFacet): existingFacet is FacetColumnRangeRequest => {\n return (\n existingFacet.concreteType ===\n 'org.sagebionetworks.repo.model.table.FacetColumnRangeRequest' &&\n facetObjectMatchesDefinition(facet, existingFacet)\n )\n },\n )\n if (existingFacetSelection && min == null && max == null) {\n // remove the facet\n newFacets.splice(newFacets.indexOf(existingFacetSelection), 1)\n } else if (existingFacetSelection) {\n existingFacetSelection.min = min\n existingFacetSelection.max = max\n } else {\n newFacets.push({\n concreteType:\n 'org.sagebionetworks.repo.model.table.FacetColumnRangeRequest',\n columnName: facet.columnName,\n jsonPath: facet.jsonPath,\n min,\n max,\n })\n }\n queryRequestClone.query.selectedFacets = newFacets\n if (!isEqual(queryRequestClone, queryRequest)) {\n queryRequestClone.query.offset = 0\n }\n return queryRequestClone\n}\n\nexport function removeValueFromSelectedFacet(\n action: { commitOptions?: QueryChangeCommitOptions } & {\n type: 'removeValueFromSelectedFacet'\n facet: UniqueFacetIdentifier\n value: string\n },\n queryRequest: QueryBundleRequest,\n) {\n const queryRequestClone = cloneDeep(queryRequest)\n const { facet, value } = action\n queryRequestClone.query.selectedFacets = (\n queryRequestClone.query.selectedFacets ?? []\n )\n // Modify the requested filter\n .map(facetColumnRequest => {\n if (\n isFacetColumnValuesRequest(facetColumnRequest) &&\n facetObjectMatchesDefinition(facet, facetColumnRequest)\n ) {\n // Remove the value from the filter\n facetColumnRequest.facetValues = facetColumnRequest.facetValues.filter(\n v => v !== value,\n )\n }\n return facetColumnRequest\n })\n // Remove filters that have no values\n .filter(facetColumnRequest => {\n if (isFacetColumnValuesRequest(facetColumnRequest)) {\n // Remove the value from the filter\n return (\n Array.isArray(facetColumnRequest.facetValues) &&\n facetColumnRequest.facetValues.length > 0\n )\n }\n return true\n })\n if (!isEqual(queryRequestClone, queryRequest)) {\n queryRequestClone.query.offset = 0\n }\n return queryRequestClone\n}\n\nexport function removeQueryFilter(\n action: {\n type: 'removeQueryFilter'\n queryFilter: QueryFilter\n },\n queryRequest: QueryBundleRequest,\n) {\n const queryRequestClone = cloneDeep(queryRequest)\n const { queryFilter } = action\n queryRequestClone.query.additionalFilters = (\n queryRequestClone.query.additionalFilters ?? []\n ).filter(qf => {\n // Use lodash for deep comparison\n return !isEqual(qf, queryFilter)\n })\n if (!isEqual(queryRequestClone, queryRequest)) {\n queryRequestClone.query.offset = 0\n }\n return queryRequestClone\n}\n\nexport function removeValueFromQueryFilter(\n action: { commitOptions?: QueryChangeCommitOptions } & {\n type: 'removeValueFromQueryFilter'\n queryFilter: QueryFilter\n value: string\n },\n queryRequest: QueryBundleRequest,\n) {\n const queryRequestClone = cloneDeep(queryRequest)\n const { queryFilter, value } = action\n queryRequestClone.query.additionalFilters = (\n queryRequestClone.query.additionalFilters ?? []\n )\n // Modify the requested filter\n .map(qf => {\n if (\n (isColumnSingleValueQueryFilter(qf) ||\n isColumnMultiValueFunctionQueryFilter(qf)) &&\n isEqual(qf, queryFilter)\n ) {\n // Remove the value from the filter\n qf.values = qf.values.filter(v => v !== value)\n }\n return qf\n })\n // Remove filters that have no values\n .filter(qf => {\n if (\n isColumnSingleValueQueryFilter(qf) ||\n isColumnMultiValueFunctionQueryFilter(qf)\n ) {\n // Remove the value from the filter\n return Array.isArray(qf.values) && qf.values.length > 0\n }\n return true\n })\n if (!isEqual(queryRequestClone, queryRequest)) {\n queryRequestClone.query.offset = 0\n }\n return queryRequestClone\n}\n\nexport function setPageSize(\n action: { commitOptions?: QueryChangeCommitOptions } & {\n type: 'setPageSize'\n pageSize: number\n },\n queryRequest: QueryBundleRequest,\n) {\n const queryRequestClone = cloneDeep(queryRequest)\n const { pageSize } = action\n queryRequestClone.query.limit = pageSize\n return queryRequestClone\n}\n\nexport function goToPage(\n action: { commitOptions?: QueryChangeCommitOptions } & {\n type: 'goToPage'\n pageNumber: number\n },\n queryRequest: QueryBundleRequest,\n) {\n const queryRequestClone = cloneDeep(queryRequest)\n const { pageNumber } = action\n const pageSize = queryRequest.query.limit ?? DEFAULT_PAGE_SIZE\n queryRequestClone.query.offset = (pageNumber - 1) * pageSize\n return queryRequestClone\n}\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useLogin.d.ts","sourceRoot":"","sources":["../../../src/utils/hooks/useLogin.ts"],"names":[],"mappings":"AAEA,OAAO,EAEL,0BAA0B,EAC3B,MAAM,8EAA8E,CAAA;AAErF,OAAO,EAIL,oBAAoB,EAErB,MAAM,iCAAiC,CAAA;AAGxC,OAAO,EAAE,QAAQ,EAAE,cAAc,EAAuB,MAAM,OAAO,CAAA;AAGrE,OAAO,EAAE,sBAAsB,EAAE,MAAM,iDAAiD,CAAA;AAGxF,MAAM,MAAM,eAAe,GAAG;IAC5B,eAAe,CAAC,EAAE,MAAM,IAAI,CAAA;IAC5B,kBAAkB,CAAC,EAAE,0BAA0B,CAAA;IAE/C,uBAAuB,CAAC,EAAE,CACxB,UAAU,EAAE,IAAI,CAAC,0BAA0B,EAAE,YAAY,GAAG,QAAQ,CAAC,KAClE,IAAI,CAAA;CACV,CAAA;AAED,MAAM,MAAM,cAAc,GAAG;IAC3B,IAAI,EACA,oBAAoB,GACpB,mBAAmB,GACnB,sBAAsB,GACtB,WAAW,CAAA;IACf,YAAY,EAAE,QAAQ,CAAC,cAAc,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,CAAA;IAC9D,yBAAyB,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAA;IACvE,qBAAqB,EAAE,CACrB,IAAI,EAAE,MAAM,EAEZ,OAAO,CAAC,EAAE,oBAAoB,KAC3B,IAAI,CAAA;IAET,uBAAuB,EAAE,CAAC,kBAAkB,EAAE,MAAM,KAAK,IAAI,CAAA;IAC7D,2BAA2B,EAAE,OAAO,CAAA;IACpC,2BAA2B,EAAE,OAAO,CAAA;IACpC,YAAY,EAAE,MAAM,GAAG,SAAS,CAAA;IAChC,cAAc,EAAE,OAAO,CAAA;CACxB,CAAA;
|
|
1
|
+
{"version":3,"file":"useLogin.d.ts","sourceRoot":"","sources":["../../../src/utils/hooks/useLogin.ts"],"names":[],"mappings":"AAEA,OAAO,EAEL,0BAA0B,EAC3B,MAAM,8EAA8E,CAAA;AAErF,OAAO,EAIL,oBAAoB,EAErB,MAAM,iCAAiC,CAAA;AAGxC,OAAO,EAAE,QAAQ,EAAE,cAAc,EAAuB,MAAM,OAAO,CAAA;AAGrE,OAAO,EAAE,sBAAsB,EAAE,MAAM,iDAAiD,CAAA;AAGxF,MAAM,MAAM,eAAe,GAAG;IAC5B,eAAe,CAAC,EAAE,MAAM,IAAI,CAAA;IAC5B,kBAAkB,CAAC,EAAE,0BAA0B,CAAA;IAE/C,uBAAuB,CAAC,EAAE,CACxB,UAAU,EAAE,IAAI,CAAC,0BAA0B,EAAE,YAAY,GAAG,QAAQ,CAAC,KAClE,IAAI,CAAA;CACV,CAAA;AAED,MAAM,MAAM,cAAc,GAAG;IAC3B,IAAI,EACA,oBAAoB,GACpB,mBAAmB,GACnB,sBAAsB,GACtB,WAAW,CAAA;IACf,YAAY,EAAE,QAAQ,CAAC,cAAc,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,CAAA;IAC9D,yBAAyB,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAA;IACvE,qBAAqB,EAAE,CACrB,IAAI,EAAE,MAAM,EAEZ,OAAO,CAAC,EAAE,oBAAoB,KAC3B,IAAI,CAAA;IAET,uBAAuB,EAAE,CAAC,kBAAkB,EAAE,MAAM,KAAK,IAAI,CAAA;IAC7D,2BAA2B,EAAE,OAAO,CAAA;IACpC,2BAA2B,EAAE,OAAO,CAAA;IACpC,YAAY,EAAE,MAAM,GAAG,SAAS,CAAA;IAChC,cAAc,EAAE,OAAO,CAAA;CACxB,CAAA;AAWD;;GAEG;AACH,MAAM,CAAC,OAAO,UAAU,QAAQ,CAAC,IAAI,EAAE,eAAe,GAAG,cAAc,CA0PtE"}
|
|
@@ -10,12 +10,12 @@ import { ErrorResponseCode as c } from "@sage-bionetworks/synapse-types";
|
|
|
10
10
|
import { instanceOfTwoFactorAuthErrorResponse as l } from "@sage-bionetworks/synapse-client/generated/models/TwoFactorAuthErrorResponse";
|
|
11
11
|
import { useMutation as u } from "@tanstack/react-query";
|
|
12
12
|
//#region src/utils/hooks/useLogin.ts
|
|
13
|
-
var d = [
|
|
13
|
+
var d = new Set([
|
|
14
14
|
"VERIFICATION_CODE",
|
|
15
15
|
"RECOVERY_CODE",
|
|
16
16
|
"LOGGED_IN",
|
|
17
17
|
"DISABLE_2FA_PROMPT"
|
|
18
|
-
];
|
|
18
|
+
]);
|
|
19
19
|
function f(f) {
|
|
20
20
|
let { sessionCallback: p = s, twoFaErrorResponse: m, onTwoFactorAuthRequired: h = s } = f, [g, _] = o("CHOOSE_AUTH_METHOD"), [v, y] = o(), [b, x] = o(), S = n("/changePassword");
|
|
21
21
|
a(() => {
|
|
@@ -30,10 +30,10 @@ function f(f) {
|
|
|
30
30
|
userId: parseInt(t, 10),
|
|
31
31
|
twoFaToken: n,
|
|
32
32
|
concreteType: "org.sagebionetworks.repo.model.auth.TwoFactorAuthErrorResponse"
|
|
33
|
-
}), d.
|
|
33
|
+
}), d.has(g) || _("VERIFICATION_CODE"));
|
|
34
34
|
}
|
|
35
35
|
}, [g]), a(() => {
|
|
36
|
-
b && (x(b), d.
|
|
36
|
+
b && (x(b), d.has(g) || _("VERIFICATION_CODE"));
|
|
37
37
|
}, [b]), a(() => {
|
|
38
38
|
b && h(b);
|
|
39
39
|
}, [h, b]), a(() => {
|
|
@@ -53,7 +53,7 @@ function f(f) {
|
|
|
53
53
|
e && (l(e) ? (_("VERIFICATION_CODE"), x(e)) : await C(e));
|
|
54
54
|
}
|
|
55
55
|
}), { mutate: E, isPending: D } = u({
|
|
56
|
-
mutationFn: t.loginWith2fa,
|
|
56
|
+
mutationFn: (e) => t.loginWith2fa(e),
|
|
57
57
|
onError: (e) => {
|
|
58
58
|
y(e.reason), e.reason.includes("The provided code is invalid") ? y(`${e.reason} ${r}`) : (e.reason.includes("The provided twoFaToken is invalid") || e.reason.includes("Token has expired")) && (console.warn(e), y("Something went wrong. Refresh the page and try again."), window.location.href.includes("twoFaToken") && window.history.replaceState({}, document.title, window.location.href.replaceAll(/(twoFaToken|userId)=[^&]*&?/g, "")));
|
|
59
59
|
},
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useLogin.js","names":[],"sources":["../../../src/utils/hooks/useLogin.ts"],"sourcesContent":["import SynapseClient from '@/synapse-client'\nimport { useResetTwoFactorAuth } from '@/synapse-queries'\nimport {\n instanceOfTwoFactorAuthErrorResponse,\n TwoFactorAuthErrorResponse,\n} from '@sage-bionetworks/synapse-client/generated/models/TwoFactorAuthErrorResponse'\nimport { SynapseClientError } from '@sage-bionetworks/synapse-client/util/SynapseClientError'\nimport {\n ErrorResponseCode,\n LoginResponse,\n TwoFactorAuthLoginRequest,\n TwoFactorAuthOtpType,\n TwoFactorAuthResetRequest,\n} from '@sage-bionetworks/synapse-types'\nimport { useMutation } from '@tanstack/react-query'\nimport { noop } from 'lodash-es'\nimport { Dispatch, SetStateAction, useEffect, useState } from 'react'\nimport { AUTHENTICATION_RECEIPT_LOCALSTORAGE_KEY } from '../SynapseConstants'\nimport { useOneSageURL } from './useOneSageURL'\nimport { ONE_TIME_PASSWORD_STEP } from '@/components/Authentication/OneTimePasswordForm'\nimport { TOTP_CLOCK_SKEW_ERROR_APPENDAGE } from '@/components/Authentication/Constants'\n\nexport type UseLoginOptions = {\n sessionCallback?: () => void\n twoFaErrorResponse?: TwoFactorAuthErrorResponse\n /* If a twoFactorAuthError is encountered (including passed in the twoFactorAuthenticationRequired arg), this callback will be invoked */\n onTwoFactorAuthRequired?: (\n twoFaToken: Pick<TwoFactorAuthErrorResponse, 'twoFaToken' | 'userId'>,\n ) => void\n}\n\nexport type UseLoginReturn = {\n step:\n | 'CHOOSE_AUTH_METHOD'\n | 'USERNAME_PASSWORD'\n | ONE_TIME_PASSWORD_STEP\n | 'LOGGED_IN'\n onStepChange: Dispatch<SetStateAction<UseLoginReturn['step']>>\n submitUsernameAndPassword: (username: string, password: string) => void\n submitOneTimePassword: (\n code: string,\n /* The type of one time password code that can be used to authenticate through two-factor authentication. Default is based on current value of `step` */\n otpType?: TwoFactorAuthOtpType,\n ) => void\n /* Trigger sending an email which can be used to disable 2FA */\n beginTwoFactorAuthReset: (twoFaResetEndpoint: string) => void\n twoFactorAuthResetIsPending: boolean\n twoFactorAuthResetIsSuccess: boolean\n errorMessage: string | undefined\n loginIsPending: boolean\n}\n\n// When prompting the user for a 2FA code, allow the UI to show only these steps\nconst VALID_STEPS_DURING_2FA_PROMPT: Array<UseLoginReturn['step']> = [\n 'VERIFICATION_CODE',\n 'RECOVERY_CODE',\n 'LOGGED_IN',\n 'DISABLE_2FA_PROMPT',\n]\n\n/**\n * Stateful hook that manages logging into Synapse\n */\nexport default function useLogin(opts: UseLoginOptions): UseLoginReturn {\n const {\n sessionCallback = noop,\n twoFaErrorResponse: twoFaErrorResponseFromProps,\n onTwoFactorAuthRequired = noop,\n } = opts\n const [step, setStep] = useState<UseLoginReturn['step']>('CHOOSE_AUTH_METHOD')\n const [errorMessage, setErrorMessage] = useState<string | undefined>()\n const [twoFaErrorResponse, setTwoFaErrorResponse] = useState<\n TwoFactorAuthErrorResponse | undefined\n >()\n\n const changePasswordUrl = useOneSageURL('/changePassword')\n /**\n * Update state variable if optional prop changes\n */\n useEffect(() => {\n if (twoFaErrorResponseFromProps) {\n setTwoFaErrorResponse(twoFaErrorResponseFromProps)\n }\n }, [twoFaErrorResponseFromProps])\n\n /*\n * In SWC, if logging in with OAuth, the servlet will call POST /oauth2/session2 to get the access token.\n *\n * If the user has 2FA enabled, the servlet will receive a 401 with the userId and twoFaToken in the response.\n * The servlet will then redirect the user to the login page with the userId and twoFaToken in the searchParams.\n *\n * This effect will check if the search params are present, and change the step to 'VERIFICATION_CODE' if they are.\n */\n useEffect(() => {\n const fullUrl: URL = new URL(window.location.href)\n\n const { searchParams } = fullUrl\n if (searchParams) {\n const userId = searchParams.get('userId')\n const twoFaToken = searchParams.get('twoFaToken')\n if (userId && twoFaToken) {\n setTwoFaErrorResponse({\n errorCode: ErrorResponseCode.TWO_FA_REQUIRED,\n reason: '',\n userId: parseInt(userId, 10),\n twoFaToken,\n concreteType:\n 'org.sagebionetworks.repo.model.auth.TwoFactorAuthErrorResponse',\n })\n if (!VALID_STEPS_DURING_2FA_PROMPT.includes(step)) {\n setStep('VERIFICATION_CODE')\n }\n }\n }\n }, [step])\n\n /*\n * In client-only apps (like Portals), if logging in with OAuth, the client app will call POST /oauth2/session2 to get the access token.\n *\n * If the user has 2FA enabled, the client app will receive a 401 with the userId and twoFaToken in the response.\n *\n * The app can pass the error response as a prop/argument, and we'll use it here to jump straight to the VERIFICATION_CODE step.\n */\n useEffect(() => {\n if (twoFaErrorResponse) {\n setTwoFaErrorResponse(twoFaErrorResponse)\n if (!VALID_STEPS_DURING_2FA_PROMPT.includes(step)) {\n setStep('VERIFICATION_CODE')\n }\n }\n // We do NOT want to rerun this effect on step change. It should only run once, when we get the error.\n // oxlint-disable-next-line react-hooks/exhaustive-deps\n }, [twoFaErrorResponse])\n\n /**\n * Call the onTwoFactorAuthRequired callback when a twoFaToken is present\n */\n useEffect(() => {\n if (twoFaErrorResponse) {\n onTwoFactorAuthRequired(twoFaErrorResponse)\n }\n }, [onTwoFactorAuthRequired, twoFaErrorResponse])\n\n /* When the step changes, clear the old error message. */\n useEffect(() => {\n setErrorMessage(undefined)\n }, [step])\n\n async function finishLogin(loginResponse: LoginResponse) {\n await SynapseClient.setAccessTokenCookie(loginResponse.accessToken)\n localStorage.setItem(\n AUTHENTICATION_RECEIPT_LOCALSTORAGE_KEY,\n loginResponse.authenticationReceipt ?? '',\n )\n setStep('LOGGED_IN')\n\n if (sessionCallback) {\n sessionCallback()\n }\n }\n\n const {\n mutate: mutateLoginWithUsernameAndPassword,\n isPending: loginWithUsernameAndPasswordIsPending,\n } = useMutation<\n LoginResponse | TwoFactorAuthErrorResponse,\n SynapseClientError,\n { username: string; password: string; authenticationReceipt: string | null }\n >({\n mutationFn: ({ username, password, authenticationReceipt }) =>\n SynapseClient.login(username, password, authenticationReceipt),\n onError: error => {\n setErrorMessage(error.reason)\n const { errorResponse } = error\n if (\n errorResponse &&\n 'errorCode' in errorResponse &&\n errorResponse.errorCode ==\n ErrorResponseCode.PASSWORD_RESET_VIA_EMAIL_REQUIRED\n ) {\n window.location.assign(changePasswordUrl.toString())\n }\n },\n onSuccess: async loginResponse => {\n if (loginResponse) {\n if (instanceOfTwoFactorAuthErrorResponse(loginResponse)) {\n setStep('VERIFICATION_CODE')\n setTwoFaErrorResponse(loginResponse)\n } else {\n await finishLogin(loginResponse)\n }\n }\n },\n })\n\n const {\n mutate: mutateLoginWith2FACode,\n isPending: loginWith2FACodeIsPending,\n } = useMutation<LoginResponse, SynapseClientError, TwoFactorAuthLoginRequest>(\n {\n mutationFn: SynapseClient.loginWith2fa,\n onError: e => {\n setErrorMessage(e.reason)\n if (e.reason.includes('The provided code is invalid')) {\n // The most common cause of an invalid TOTP code is clock skew between the user's device and the server.\n setErrorMessage(`${e.reason} ${TOTP_CLOCK_SKEW_ERROR_APPENDAGE}`)\n } else if (\n // The twoFaToken wasn't transmitted correctly\n e.reason.includes('The provided twoFaToken is invalid') ||\n // The user waited too long to enter the code.\n e.reason.includes('Token has expired')\n ) {\n console.warn(e)\n // Instruct the user refresh to start over.\n setErrorMessage(\n 'Something went wrong. Refresh the page and try again.',\n )\n // If the 2FA token is in the search parameters, remove it so the user doesn't just get the same error again.\n if (window.location.href.includes('twoFaToken')) {\n window.history.replaceState(\n {},\n document.title,\n // using regex because SWC hashbang doesn't work with URLSearchParams\n window.location.href.replaceAll(\n /(twoFaToken|userId)=[^&]*&?/g,\n '',\n ),\n )\n }\n }\n },\n onSuccess: finishLogin,\n },\n )\n\n const {\n mutate: resetTwoFactorAuth,\n isSuccess: twoFactorAuthResetIsSuccess,\n isPending: twoFactorAuthResetIsPending,\n } = useResetTwoFactorAuth({\n onError: e => {\n setErrorMessage(e.reason)\n },\n })\n\n const submitUsernameAndPassword: UseLoginReturn['submitUsernameAndPassword'] =\n (username, password) => {\n setErrorMessage(undefined)\n const authenticationReceipt = localStorage.getItem(\n AUTHENTICATION_RECEIPT_LOCALSTORAGE_KEY,\n )\n mutateLoginWithUsernameAndPassword({\n username,\n password,\n authenticationReceipt,\n })\n }\n\n function verifyTwoFaErrorIsPresent(\n twoFaErrorResponse: TwoFactorAuthErrorResponse | null | undefined,\n ): twoFaErrorResponse is TwoFactorAuthErrorResponse {\n if (twoFaErrorResponse == null) {\n // This type of error could happen if the 2FA component exists on its own route, and the user directly navigates to it without first logging in with credentials/OAuth\n setErrorMessage(\n 'You did not first log in with your password or a third-party identity provider.',\n )\n return false\n }\n return true\n }\n\n const submitOneTimePassword: UseLoginReturn['submitOneTimePassword'] = (\n code,\n otpType = step === 'RECOVERY_CODE' ? 'RECOVERY_CODE' : 'TOTP',\n ) => {\n setErrorMessage(undefined)\n if (verifyTwoFaErrorIsPresent(twoFaErrorResponse)) {\n const request: TwoFactorAuthLoginRequest = {\n userId: twoFaErrorResponse.userId!,\n twoFaToken: twoFaErrorResponse.twoFaToken!,\n otpCode: code,\n otpType: otpType,\n }\n mutateLoginWith2FACode(request)\n }\n }\n\n const beginTwoFactorAuthReset: UseLoginReturn['beginTwoFactorAuthReset'] = (\n twoFaResetEndpoint: string,\n ) => {\n setErrorMessage(undefined)\n if (verifyTwoFaErrorIsPresent(twoFaErrorResponse)) {\n const request: TwoFactorAuthResetRequest = {\n userId: twoFaErrorResponse.userId!,\n twoFaToken: twoFaErrorResponse.twoFaToken,\n twoFaResetEndpoint: twoFaResetEndpoint,\n }\n resetTwoFactorAuth(request)\n }\n }\n\n return {\n step,\n onStepChange: setStep,\n submitUsernameAndPassword,\n submitOneTimePassword: submitOneTimePassword,\n errorMessage,\n loginIsPending:\n loginWithUsernameAndPasswordIsPending || loginWith2FACodeIsPending,\n beginTwoFactorAuthReset,\n twoFactorAuthResetIsPending,\n twoFactorAuthResetIsSuccess,\n }\n}\n"],"mappings":";;;;;;;;;;;;AAqDA,IAAM,IAA+D;CACnE;CACA;CACA;CACA;AACF;AAKA,SAAwB,EAAS,GAAuC;CACtE,IAAM,EACJ,qBAAkB,GAClB,oBAAoB,GACpB,6BAA0B,MACxB,GACE,CAAC,GAAM,KAAW,EAAiC,oBAAoB,GACvE,CAAC,GAAc,KAAmB,EAA6B,GAC/D,CAAC,GAAoB,KAAyB,EAElD,GAEI,IAAoB,EAAc,iBAAiB;CAqEzD,AAjEA,QAAgB;EACd,AAAI,KACF,EAAsB,CAA2B;CAErD,GAAG,CAAC,CAA2B,CAAC,GAUhC,QAAgB;EAGd,IAAM,EAAE,oBAAiB,IAFA,IAAI,OAAO,SAAS,IAEpB;EACzB,IAAI,GAAc;GAChB,IAAM,IAAS,EAAa,IAAI,QAAQ,GAClC,IAAa,EAAa,IAAI,YAAY;GAChD,AAAI,KAAU,MACZ,EAAsB;IACpB,WAAW,EAAkB;IAC7B,QAAQ;IACR,QAAQ,SAAS,GAAQ,EAAE;IAC3B;IACA,cACE;GACJ,CAAC,GACI,EAA8B,SAAS,CAAI,KAC9C,EAAQ,mBAAmB;EAGjC;CACF,GAAG,CAAC,CAAI,CAAC,GAST,QAAgB;EACd,AAAI,MACF,EAAsB,CAAkB,GACnC,EAA8B,SAAS,CAAI,KAC9C,EAAQ,mBAAmB;CAKjC,GAAG,CAAC,CAAkB,CAAC,GAKvB,QAAgB;EACd,AAAI,KACF,EAAwB,CAAkB;CAE9C,GAAG,CAAC,GAAyB,CAAkB,CAAC,GAGhD,QAAgB;EACd,EAAgB,KAAA,CAAS;CAC3B,GAAG,CAAC,CAAI,CAAC;CAET,eAAe,EAAY,GAA8B;EAQvD,AAPA,MAAM,EAAc,qBAAqB,EAAc,WAAW,GAClE,aAAa,QACX,GACA,EAAc,yBAAyB,EACzC,GACA,EAAQ,WAAW,GAEf,KACF,EAAgB;CAEpB;CAEA,IAAM,EACJ,QAAQ,GACR,WAAW,MACT,EAIF;EACA,aAAa,EAAE,aAAU,aAAU,+BACjC,EAAc,MAAM,GAAU,GAAU,CAAqB;EAC/D,UAAS,MAAS;GAChB,EAAgB,EAAM,MAAM;GAC5B,IAAM,EAAE,qBAAkB;GAC1B,AACE,KACA,eAAe,KACf,EAAc,aACZ,EAAkB,qCAEpB,OAAO,SAAS,OAAO,EAAkB,SAAS,CAAC;EAEvD;EACA,WAAW,OAAM,MAAiB;GAChC,AAAI,MACE,EAAqC,CAAa,KACpD,EAAQ,mBAAmB,GAC3B,EAAsB,CAAa,KAEnC,MAAM,EAAY,CAAa;EAGrC;CACF,CAAC,GAEK,EACJ,QAAQ,GACR,WAAW,MACT,EACF;EACE,YAAY,EAAc;EAC1B,UAAS,MAAK;GAEZ,AADA,EAAgB,EAAE,MAAM,GACpB,EAAE,OAAO,SAAS,8BAA8B,IAElD,EAAgB,GAAG,EAAE,OAAO,GAAG,GAAiC,KAGhE,EAAE,OAAO,SAAS,oCAAoC,KAEtD,EAAE,OAAO,SAAS,mBAAmB,OAErC,QAAQ,KAAK,CAAC,GAEd,EACE,uDACF,GAEI,OAAO,SAAS,KAAK,SAAS,YAAY,KAC5C,OAAO,QAAQ,aACb,CAAC,GACD,SAAS,OAET,OAAO,SAAS,KAAK,WACnB,gCACA,EACF,CACF;EAGN;EACA,WAAW;CACb,CACF,GAEM,EACJ,QAAQ,GACR,WAAW,GACX,WAAW,MACT,EAAsB,EACxB,UAAS,MAAK;EACZ,EAAgB,EAAE,MAAM;CAC1B,EACF,CAAC,GAEK,KACH,GAAU,MAAa;EAKtB,AAJA,EAAgB,KAAA,CAAS,GAIzB,EAAmC;GACjC;GACA;GACA,uBAN4B,aAAa,QACzC,CAKA;EACF,CAAC;CACH;CAEF,SAAS,EACP,GACkD;EAQlD,OAPI,KAAsB,QAExB,EACE,iFACF,GACO,MAEF;CACT;CAgCA,OAAO;EACL;EACA,cAAc;EACd;EACuB,wBAjCvB,GACA,IAAU,MAAS,kBAAkB,kBAAkB,WACpD;GAEH,AADA,EAAgB,KAAA,CAAS,GACrB,EAA0B,CAAkB,KAO9C,EAAuB;IALrB,QAAQ,EAAmB;IAC3B,YAAY,EAAmB;IAC/B,SAAS;IACA;GAEY,CAAO;EAElC;EAqBE;EACA,gBACE,KAAyC;EAC3C,0BArBA,MACG;GAEH,AADA,EAAgB,KAAA,CAAS,GACrB,EAA0B,CAAkB,KAM9C,EAAmB;IAJjB,QAAQ,EAAmB;IAC3B,YAAY,EAAmB;IACX;GAEH,CAAO;EAE9B;EAWE;EACA;CACF;AACF"}
|
|
1
|
+
{"version":3,"file":"useLogin.js","names":[],"sources":["../../../src/utils/hooks/useLogin.ts"],"sourcesContent":["import SynapseClient from '@/synapse-client'\nimport { useResetTwoFactorAuth } from '@/synapse-queries'\nimport {\n instanceOfTwoFactorAuthErrorResponse,\n TwoFactorAuthErrorResponse,\n} from '@sage-bionetworks/synapse-client/generated/models/TwoFactorAuthErrorResponse'\nimport { SynapseClientError } from '@sage-bionetworks/synapse-client/util/SynapseClientError'\nimport {\n ErrorResponseCode,\n LoginResponse,\n TwoFactorAuthLoginRequest,\n TwoFactorAuthOtpType,\n TwoFactorAuthResetRequest,\n} from '@sage-bionetworks/synapse-types'\nimport { useMutation } from '@tanstack/react-query'\nimport { noop } from 'lodash-es'\nimport { Dispatch, SetStateAction, useEffect, useState } from 'react'\nimport { AUTHENTICATION_RECEIPT_LOCALSTORAGE_KEY } from '../SynapseConstants'\nimport { useOneSageURL } from './useOneSageURL'\nimport { ONE_TIME_PASSWORD_STEP } from '@/components/Authentication/OneTimePasswordForm'\nimport { TOTP_CLOCK_SKEW_ERROR_APPENDAGE } from '@/components/Authentication/Constants'\n\nexport type UseLoginOptions = {\n sessionCallback?: () => void\n twoFaErrorResponse?: TwoFactorAuthErrorResponse\n /* If a twoFactorAuthError is encountered (including passed in the twoFactorAuthenticationRequired arg), this callback will be invoked */\n onTwoFactorAuthRequired?: (\n twoFaToken: Pick<TwoFactorAuthErrorResponse, 'twoFaToken' | 'userId'>,\n ) => void\n}\n\nexport type UseLoginReturn = {\n step:\n | 'CHOOSE_AUTH_METHOD'\n | 'USERNAME_PASSWORD'\n | ONE_TIME_PASSWORD_STEP\n | 'LOGGED_IN'\n onStepChange: Dispatch<SetStateAction<UseLoginReturn['step']>>\n submitUsernameAndPassword: (username: string, password: string) => void\n submitOneTimePassword: (\n code: string,\n /* The type of one time password code that can be used to authenticate through two-factor authentication. Default is based on current value of `step` */\n otpType?: TwoFactorAuthOtpType,\n ) => void\n /* Trigger sending an email which can be used to disable 2FA */\n beginTwoFactorAuthReset: (twoFaResetEndpoint: string) => void\n twoFactorAuthResetIsPending: boolean\n twoFactorAuthResetIsSuccess: boolean\n errorMessage: string | undefined\n loginIsPending: boolean\n}\n\n// When prompting the user for a 2FA code, allow the UI to show only these steps\nconst VALID_STEPS_DURING_2FA_PROMPT: ReadonlySet<UseLoginReturn['step']> =\n new Set([\n 'VERIFICATION_CODE',\n 'RECOVERY_CODE',\n 'LOGGED_IN',\n 'DISABLE_2FA_PROMPT',\n ])\n\n/**\n * Stateful hook that manages logging into Synapse\n */\nexport default function useLogin(opts: UseLoginOptions): UseLoginReturn {\n const {\n sessionCallback = noop,\n twoFaErrorResponse: twoFaErrorResponseFromProps,\n onTwoFactorAuthRequired = noop,\n } = opts\n const [step, setStep] = useState<UseLoginReturn['step']>('CHOOSE_AUTH_METHOD')\n const [errorMessage, setErrorMessage] = useState<string | undefined>()\n const [twoFaErrorResponse, setTwoFaErrorResponse] = useState<\n TwoFactorAuthErrorResponse | undefined\n >()\n\n const changePasswordUrl = useOneSageURL('/changePassword')\n /**\n * Update state variable if optional prop changes\n */\n useEffect(() => {\n if (twoFaErrorResponseFromProps) {\n setTwoFaErrorResponse(twoFaErrorResponseFromProps)\n }\n }, [twoFaErrorResponseFromProps])\n\n /*\n * In SWC, if logging in with OAuth, the servlet will call POST /oauth2/session2 to get the access token.\n *\n * If the user has 2FA enabled, the servlet will receive a 401 with the userId and twoFaToken in the response.\n * The servlet will then redirect the user to the login page with the userId and twoFaToken in the searchParams.\n *\n * This effect will check if the search params are present, and change the step to 'VERIFICATION_CODE' if they are.\n */\n useEffect(() => {\n const fullUrl: URL = new URL(window.location.href)\n\n const { searchParams } = fullUrl\n if (searchParams) {\n const userId = searchParams.get('userId')\n const twoFaToken = searchParams.get('twoFaToken')\n if (userId && twoFaToken) {\n setTwoFaErrorResponse({\n errorCode: ErrorResponseCode.TWO_FA_REQUIRED,\n reason: '',\n userId: parseInt(userId, 10),\n twoFaToken,\n concreteType:\n 'org.sagebionetworks.repo.model.auth.TwoFactorAuthErrorResponse',\n })\n if (!VALID_STEPS_DURING_2FA_PROMPT.has(step)) {\n setStep('VERIFICATION_CODE')\n }\n }\n }\n }, [step])\n\n /*\n * In client-only apps (like Portals), if logging in with OAuth, the client app will call POST /oauth2/session2 to get the access token.\n *\n * If the user has 2FA enabled, the client app will receive a 401 with the userId and twoFaToken in the response.\n *\n * The app can pass the error response as a prop/argument, and we'll use it here to jump straight to the VERIFICATION_CODE step.\n */\n useEffect(() => {\n if (twoFaErrorResponse) {\n setTwoFaErrorResponse(twoFaErrorResponse)\n if (!VALID_STEPS_DURING_2FA_PROMPT.has(step)) {\n setStep('VERIFICATION_CODE')\n }\n }\n // We do NOT want to rerun this effect on step change. It should only run once, when we get the error.\n // oxlint-disable-next-line react-hooks/exhaustive-deps\n }, [twoFaErrorResponse])\n\n /**\n * Call the onTwoFactorAuthRequired callback when a twoFaToken is present\n */\n useEffect(() => {\n if (twoFaErrorResponse) {\n onTwoFactorAuthRequired(twoFaErrorResponse)\n }\n }, [onTwoFactorAuthRequired, twoFaErrorResponse])\n\n /* When the step changes, clear the old error message. */\n useEffect(() => {\n setErrorMessage(undefined)\n }, [step])\n\n async function finishLogin(loginResponse: LoginResponse) {\n await SynapseClient.setAccessTokenCookie(loginResponse.accessToken)\n localStorage.setItem(\n AUTHENTICATION_RECEIPT_LOCALSTORAGE_KEY,\n loginResponse.authenticationReceipt ?? '',\n )\n setStep('LOGGED_IN')\n\n if (sessionCallback) {\n sessionCallback()\n }\n }\n\n const {\n mutate: mutateLoginWithUsernameAndPassword,\n isPending: loginWithUsernameAndPasswordIsPending,\n } = useMutation<\n LoginResponse | TwoFactorAuthErrorResponse,\n SynapseClientError,\n { username: string; password: string; authenticationReceipt: string | null }\n >({\n mutationFn: ({ username, password, authenticationReceipt }) =>\n SynapseClient.login(username, password, authenticationReceipt),\n onError: error => {\n setErrorMessage(error.reason)\n const { errorResponse } = error\n if (\n errorResponse &&\n 'errorCode' in errorResponse &&\n errorResponse.errorCode ==\n ErrorResponseCode.PASSWORD_RESET_VIA_EMAIL_REQUIRED\n ) {\n window.location.assign(changePasswordUrl.toString())\n }\n },\n onSuccess: async loginResponse => {\n if (loginResponse) {\n if (instanceOfTwoFactorAuthErrorResponse(loginResponse)) {\n setStep('VERIFICATION_CODE')\n setTwoFaErrorResponse(loginResponse)\n } else {\n await finishLogin(loginResponse)\n }\n }\n },\n })\n\n const {\n mutate: mutateLoginWith2FACode,\n isPending: loginWith2FACodeIsPending,\n } = useMutation<LoginResponse, SynapseClientError, TwoFactorAuthLoginRequest>(\n {\n mutationFn: request => SynapseClient.loginWith2fa(request),\n onError: e => {\n setErrorMessage(e.reason)\n if (e.reason.includes('The provided code is invalid')) {\n // The most common cause of an invalid TOTP code is clock skew between the user's device and the server.\n setErrorMessage(`${e.reason} ${TOTP_CLOCK_SKEW_ERROR_APPENDAGE}`)\n } else if (\n // The twoFaToken wasn't transmitted correctly\n e.reason.includes('The provided twoFaToken is invalid') ||\n // The user waited too long to enter the code.\n e.reason.includes('Token has expired')\n ) {\n console.warn(e)\n // Instruct the user refresh to start over.\n setErrorMessage(\n 'Something went wrong. Refresh the page and try again.',\n )\n // If the 2FA token is in the search parameters, remove it so the user doesn't just get the same error again.\n if (window.location.href.includes('twoFaToken')) {\n window.history.replaceState(\n {},\n document.title,\n // using regex because SWC hashbang doesn't work with URLSearchParams\n window.location.href.replaceAll(\n /(twoFaToken|userId)=[^&]*&?/g,\n '',\n ),\n )\n }\n }\n },\n onSuccess: finishLogin,\n },\n )\n\n const {\n mutate: resetTwoFactorAuth,\n isSuccess: twoFactorAuthResetIsSuccess,\n isPending: twoFactorAuthResetIsPending,\n } = useResetTwoFactorAuth({\n onError: e => {\n setErrorMessage(e.reason)\n },\n })\n\n const submitUsernameAndPassword: UseLoginReturn['submitUsernameAndPassword'] =\n (username, password) => {\n setErrorMessage(undefined)\n const authenticationReceipt = localStorage.getItem(\n AUTHENTICATION_RECEIPT_LOCALSTORAGE_KEY,\n )\n mutateLoginWithUsernameAndPassword({\n username,\n password,\n authenticationReceipt,\n })\n }\n\n function verifyTwoFaErrorIsPresent(\n twoFaErrorResponse: TwoFactorAuthErrorResponse | null | undefined,\n ): twoFaErrorResponse is TwoFactorAuthErrorResponse {\n if (twoFaErrorResponse == null) {\n // This type of error could happen if the 2FA component exists on its own route, and the user directly navigates to it without first logging in with credentials/OAuth\n setErrorMessage(\n 'You did not first log in with your password or a third-party identity provider.',\n )\n return false\n }\n return true\n }\n\n const submitOneTimePassword: UseLoginReturn['submitOneTimePassword'] = (\n code,\n otpType = step === 'RECOVERY_CODE' ? 'RECOVERY_CODE' : 'TOTP',\n ) => {\n setErrorMessage(undefined)\n if (verifyTwoFaErrorIsPresent(twoFaErrorResponse)) {\n const request: TwoFactorAuthLoginRequest = {\n userId: twoFaErrorResponse.userId!,\n twoFaToken: twoFaErrorResponse.twoFaToken!,\n otpCode: code,\n otpType: otpType,\n }\n mutateLoginWith2FACode(request)\n }\n }\n\n const beginTwoFactorAuthReset: UseLoginReturn['beginTwoFactorAuthReset'] = (\n twoFaResetEndpoint: string,\n ) => {\n setErrorMessage(undefined)\n if (verifyTwoFaErrorIsPresent(twoFaErrorResponse)) {\n const request: TwoFactorAuthResetRequest = {\n userId: twoFaErrorResponse.userId!,\n twoFaToken: twoFaErrorResponse.twoFaToken,\n twoFaResetEndpoint: twoFaResetEndpoint,\n }\n resetTwoFactorAuth(request)\n }\n }\n\n return {\n step,\n onStepChange: setStep,\n submitUsernameAndPassword,\n submitOneTimePassword: submitOneTimePassword,\n errorMessage,\n loginIsPending:\n loginWithUsernameAndPasswordIsPending || loginWith2FACodeIsPending,\n beginTwoFactorAuthReset,\n twoFactorAuthResetIsPending,\n twoFactorAuthResetIsSuccess,\n }\n}\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useCreateFolderPath.js","names":[],"sources":["../../../../src/utils/hooks/useUploadFileEntity/useCreateFolderPath.ts"],"sourcesContent":["import {\n useCreateEntity,\n useGetEntityLookupQueryOptions,\n useGetEntityQueryOptions,\n} from '@/synapse-queries/entity/useEntity'\nimport { useMutation, useQueryClient } from '@tanstack/react-query'\nimport {\n convertToEntityType,\n entityTypeToFriendlyName,\n} from '../../functions/EntityTypeUtils'\n\n/**\n * Given the ID of a container entity and a path string array, create the folder structure as necessary and return the ID of the final folder in the path.\n * @returns The ID of the final folder in the path.\n */\nexport function useCreateFolderPath() {\n const { mutateAsync: createEntity } = useCreateEntity()\n\n const queryClient = useQueryClient()\n const getEntityLookupQueryOptions = useGetEntityLookupQueryOptions()\n const getEntityQueryOptions = useGetEntityQueryOptions()\n\n return useMutation({\n mutationFn: async (args: { rootContainerId: string; path: string[] }) => {\n const { rootContainerId
|
|
1
|
+
{"version":3,"file":"useCreateFolderPath.js","names":[],"sources":["../../../../src/utils/hooks/useUploadFileEntity/useCreateFolderPath.ts"],"sourcesContent":["import {\n useCreateEntity,\n useGetEntityLookupQueryOptions,\n useGetEntityQueryOptions,\n} from '@/synapse-queries/entity/useEntity'\nimport { useMutation, useQueryClient } from '@tanstack/react-query'\nimport {\n convertToEntityType,\n entityTypeToFriendlyName,\n} from '../../functions/EntityTypeUtils'\n\n/**\n * Given the ID of a container entity and a path string array, create the folder structure as necessary and return the ID of the final folder in the path.\n * @returns The ID of the final folder in the path.\n */\nexport function useCreateFolderPath() {\n const { mutateAsync: createEntity } = useCreateEntity()\n\n const queryClient = useQueryClient()\n const getEntityLookupQueryOptions = useGetEntityLookupQueryOptions()\n const getEntityQueryOptions = useGetEntityQueryOptions()\n\n return useMutation({\n mutationFn: async (args: { rootContainerId: string; path: string[] }) => {\n const { rootContainerId, path } = args\n let parentId = rootContainerId\n for (const pathElement of path) {\n const foundEntityId = await queryClient.fetchQuery(\n getEntityLookupQueryOptions({\n parentId: parentId,\n entityName: pathElement,\n }),\n )\n\n if (foundEntityId) {\n // Verify that this entity is a folder\n const entity = await queryClient.fetchQuery(\n getEntityQueryOptions(foundEntityId),\n )\n\n if (entity.concreteType != 'org.sagebionetworks.repo.model.Folder') {\n const typeOfExistingEntity = convertToEntityType(\n entity.concreteType,\n )\n throw new Error(\n `A(n) ${entityTypeToFriendlyName(\n typeOfExistingEntity,\n )} named \"${pathElement}\" already exists in this location (${parentId}). A folder could not be created.`,\n )\n }\n\n parentId = foundEntityId\n } else {\n // Create a new folder\n const { id } = await createEntity({\n concreteType: 'org.sagebionetworks.repo.model.Folder',\n name: pathElement,\n parentId: parentId,\n })\n parentId = id!\n }\n }\n\n return parentId\n },\n })\n}\n"],"mappings":";;;;AAeA,SAAgB,IAAsB;CACpC,IAAM,EAAE,aAAa,MAAiB,EAAgB,GAEhD,IAAc,EAAe,GAC7B,IAA8B,EAA+B,GAC7D,IAAwB,EAAyB;CAEvD,OAAO,EAAY,EACjB,YAAY,OAAO,MAAsD;EACvE,IAAM,EAAE,oBAAiB,YAAS,GAC9B,IAAW;EACf,KAAK,IAAM,KAAe,GAAM;GAC9B,IAAM,IAAgB,MAAM,EAAY,WACtC,EAA4B;IAChB;IACV,YAAY;GACd,CAAC,CACH;GAEA,IAAI,GAAe;IAEjB,IAAM,IAAS,MAAM,EAAY,WAC/B,EAAsB,CAAa,CACrC;IAEA,IAAI,EAAO,gBAAgB,yCAAyC;KAClE,IAAM,IAAuB,EAC3B,EAAO,YACT;KACA,MAAU,MACR,QAAQ,EACN,CACF,EAAE,UAAU,EAAY,qCAAqC,EAAS,kCACxE;IACF;IAEA,IAAW;GACb,OAAO;IAEL,IAAM,EAAE,UAAO,MAAM,EAAa;KAChC,cAAc;KACd,MAAM;KACI;IACZ,CAAC;IACD,IAAW;GACb;EACF;EAEA,OAAO;CACT,EACF,CAAC;AACH"}
|
|
@@ -1,5 +1,11 @@
|
|
|
1
1
|
import { JSONSchema7, JSONSchema7Definition } from 'json-schema';
|
|
2
|
+
type Definitions = NonNullable<JSONSchema7['definitions']>;
|
|
2
3
|
type TopLevelProperties = Record<string, JSONSchema7Definition>;
|
|
4
|
+
/**
|
|
5
|
+
* Resolve a local `#/definitions/X` reference (or bare `X` key) against the root schema's `definitions`.
|
|
6
|
+
* Returns undefined for a dangling reference or a boolean schema.
|
|
7
|
+
*/
|
|
8
|
+
export declare function resolveRef(ref: string, definitions: Definitions | undefined): JSONSchema7 | undefined;
|
|
3
9
|
/**
|
|
4
10
|
* Collects the names that could appear as a top-level property of an instance validated by the given
|
|
5
11
|
* JSON Schema, keyed by property name. Each value is the `$ref`-resolved schema for that property.
|