synapse-react-client 4.0.3 → 4.0.5-b
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/assets/DefaultColorfulPortalCardBackground.svg +14 -0
- package/dist/assets/DefaultColorfulPortalCardBackground.svg.js +7 -0
- package/dist/assets/DefaultColorfulPortalCardBackground.svg.js.map +1 -0
- package/dist/assets/homepage/nih-aging.svg +27 -27
- package/dist/assets/homepage/nih-aging.svg.js +1 -1
- package/dist/assets/homepage/nih-aging.svg.js.map +1 -1
- package/dist/assets/homepage/nih-heart.svg +39 -46
- package/dist/assets/homepage/nih-heart.svg.js +3 -3
- package/dist/assets/homepage/nih-heart.svg.js.map +1 -1
- package/dist/assets/homepage/nih-nci.svg +6 -0
- package/dist/assets/homepage/nih-nci.svg.js +7 -0
- package/dist/assets/homepage/nih-nci.svg.js.map +1 -0
- package/dist/assets/homepage/nih-nimh.svg +14 -0
- package/dist/assets/homepage/nih-nimh.svg.js +7 -0
- package/dist/assets/homepage/nih-nimh.svg.js.map +1 -0
- package/dist/components/AccessRequirement/AddConditionsForUseButton/AddConditionsForUseButton.js +1 -1
- package/dist/components/AccessRequirementList/AccessRequirementList.js +4 -4
- package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/DataAccessRequestAccessorsEditor.d.ts.map +1 -1
- package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/DataAccessRequestAccessorsEditor.js +8 -7
- package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/DataAccessRequestAccessorsEditor.js.map +1 -1
- package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/ManagedACTAccessRequirementFormWikiWrapper.js +4 -4
- package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/ManagedACTAccessRequirementItem.js +11 -11
- package/dist/components/AccessRequirementList/RequirementItem/RequirementItem.js +1 -1
- package/dist/components/AccessRequirementList/RequirementItem/SelfSignAccessRequirementItem.js +9 -9
- package/dist/components/AccessRequirementList/RequirementItem/UnmanagedACTAccessRequirementItem.js +5 -5
- package/dist/components/AcknowledgementsPage/AcknowledgementsPage.d.ts.map +1 -1
- package/dist/components/AcknowledgementsPage/AcknowledgementsPage.js +33 -32
- package/dist/components/AcknowledgementsPage/AcknowledgementsPage.js.map +1 -1
- package/dist/components/AclEditor/AclEditor.js +8 -8
- package/dist/components/AclEditor/AclEditor.js.map +1 -1
- package/dist/components/AclEditor/AclEditor.test-utils.js +34 -34
- package/dist/components/AclEditor/AclEditor.test-utils.js.map +1 -1
- package/dist/components/Authentication/AuthenticationMethodSelection.js +1 -1
- package/dist/components/Authentication/TwoFactorEnrollmentForm.d.ts.map +1 -1
- package/dist/components/Authentication/TwoFactorEnrollmentForm.js +6 -5
- package/dist/components/Authentication/TwoFactorEnrollmentForm.js.map +1 -1
- package/dist/components/BasePortalCard/BasePortalCard.css +1 -1
- package/dist/components/BasePortalCard/BasePortalCard.d.ts +1 -1
- package/dist/components/BasePortalCard/BasePortalCard.d.ts.map +1 -1
- package/dist/components/BasePortalCard/BasePortalCard.js +12 -12
- package/dist/components/BasePortalCard/BasePortalCard.js.map +1 -1
- package/dist/components/BasePortalCard/BasePortalCard.module.scss +6 -0
- package/dist/components/BasePortalCard/BasePortalCard.module.scss.js +1 -1
- package/dist/components/BasePortalCard/ColorfulPortalCardWithChips/ColorfulPortalCardWithChips.css +1 -1
- package/dist/components/BasePortalCard/ColorfulPortalCardWithChips/ColorfulPortalCardWithChips.d.ts.map +1 -1
- package/dist/components/BasePortalCard/ColorfulPortalCardWithChips/ColorfulPortalCardWithChips.js +24 -23
- package/dist/components/BasePortalCard/ColorfulPortalCardWithChips/ColorfulPortalCardWithChips.js.map +1 -1
- package/dist/components/BasePortalCard/ColorfulPortalCardWithChips/ColorfulPortalCardWithChips.module.scss +15 -5
- package/dist/components/BasePortalCard/ColorfulPortalCardWithChips/ColorfulPortalCardWithChips.module.scss.js +1 -1
- package/dist/components/CardContainer/CardLink.d.ts +12 -0
- package/dist/components/CardContainer/CardLink.d.ts.map +1 -1
- package/dist/components/ChallengeSubmission/AvailableEvaluationQueueList.js +12 -12
- package/dist/components/ChallengeTeamWizard/CreateChallengeTeam.d.ts.map +1 -1
- package/dist/components/ChallengeTeamWizard/CreateChallengeTeam.js +7 -7
- package/dist/components/ChallengeTeamWizard/CreateChallengeTeam.js.map +1 -1
- package/dist/components/CitationPopover/CitationPopoverContent.d.ts.map +1 -1
- package/dist/components/CitationPopover/CitationPopoverContent.js +13 -12
- package/dist/components/CitationPopover/CitationPopoverContent.js.map +1 -1
- package/dist/components/CookiesNotification/CookiesNotification.js +1 -1
- package/dist/components/CreateOrUpdateAccessRequirementWizard/CreateOrUpdateAccessRequirementWizard.js +3 -4
- package/dist/components/CreateOrUpdateAccessRequirementWizard/CreateOrUpdateAccessRequirementWizard.js.map +1 -1
- package/dist/components/DataGrid/MergeGridWithSourceTableButton.js +2 -2
- package/dist/components/DataGrid/SynapseGrid.d.ts.map +1 -1
- package/dist/components/DataGrid/SynapseGrid.js +35 -35
- package/dist/components/DataGrid/SynapseGrid.js.map +1 -1
- package/dist/components/DataGrid/components/UploadCsvToGridDialog.js +2 -2
- package/dist/components/DataGrid/hooks/useExportDataGridToCsv.d.ts.map +1 -1
- package/dist/components/DataGrid/hooks/useExportDataGridToCsv.js +9 -7
- package/dist/components/DataGrid/hooks/useExportDataGridToCsv.js.map +1 -1
- package/dist/components/DownloadCart/ActionRequiredCard/ActionRequiredCard.js +1 -1
- package/dist/components/DownloadCart/RequestDownloadCard.js +1 -1
- package/dist/components/Ecosystem/EcosystemSkeleton.js +2 -2
- package/dist/components/Ecosystem/TableQueryEcosystem.js +1 -1
- package/dist/components/EntityAclEditor/EntityAclEditorModal.js +1 -1
- package/dist/components/EntityAclEditor/OpenData.js +1 -1
- package/dist/components/EntityBadgeIcons/EntityBadgeIcons.d.ts.map +1 -1
- package/dist/components/EntityBadgeIcons/EntityBadgeIcons.js +113 -127
- package/dist/components/EntityBadgeIcons/EntityBadgeIcons.js.map +1 -1
- package/dist/components/EntityCitation/EntityCitation.js +1 -1
- package/dist/components/EntityFinder/details/view/table/AddToDownloadListCell.js +1 -1
- package/dist/components/EntityFinder/details/view/table/CreatedOnCell.js +1 -1
- package/dist/components/EntityFinder/details/view/table/EntityNameCell.js +1 -1
- package/dist/components/EntityFinder/details/view/table/FileEntityMD5Cell.js +1 -1
- package/dist/components/EntityFinder/details/view/table/FileEntitySizeCell.js +1 -1
- package/dist/components/EntityFinder/details/view/table/ModifiedByCell.js +1 -1
- package/dist/components/EntityFinder/details/view/table/ModifiedOnCell.js +1 -1
- package/dist/components/EntityFinder/details/view/table/ParentProjectCell.js +1 -1
- package/dist/components/EntityFinder/tree/EntityTree.js +1 -1
- package/dist/components/EntityHeaderTable/EntityHeaderTable.d.ts.map +1 -1
- package/dist/components/EntityHeaderTable/EntityHeaderTable.js +39 -39
- package/dist/components/EntityHeaderTable/EntityHeaderTable.js.map +1 -1
- package/dist/components/Evaluation/DeleteEvaluationQueueConfirmationDialog.d.ts +8 -0
- package/dist/components/Evaluation/DeleteEvaluationQueueConfirmationDialog.d.ts.map +1 -0
- package/dist/components/Evaluation/DeleteEvaluationQueueConfirmationDialog.js +46 -0
- package/dist/components/Evaluation/DeleteEvaluationQueueConfirmationDialog.js.map +1 -0
- package/dist/components/Evaluation/EvaluationCard.d.ts.map +1 -1
- package/dist/components/Evaluation/EvaluationCard.js +35 -41
- package/dist/components/Evaluation/EvaluationCard.js.map +1 -1
- package/dist/components/Evaluation/EvaluationEditor.d.ts.map +1 -1
- package/dist/components/Evaluation/EvaluationEditor.js +95 -90
- package/dist/components/Evaluation/EvaluationEditor.js.map +1 -1
- package/dist/components/Evaluation/EvaluationRoundEditor.d.ts.map +1 -1
- package/dist/components/Evaluation/EvaluationRoundEditor.js +133 -124
- package/dist/components/Evaluation/EvaluationRoundEditor.js.map +1 -1
- package/dist/components/FilePreview/EntityPreview.js +1 -1
- package/dist/components/Forum/DiscussionReply.js +10 -10
- package/dist/components/Forum/DiscussionThread.js +21 -21
- package/dist/components/GenericCard/CardUtils.d.ts.map +1 -1
- package/dist/components/GenericCard/CardUtils.js +36 -36
- package/dist/components/GenericCard/CardUtils.js.map +1 -1
- package/dist/components/GenericCard/CollapsibleDescription.js +25 -25
- package/dist/components/GenericCard/SynapseCardLabel.d.ts.map +1 -1
- package/dist/components/GenericCard/SynapseCardLabel.js +72 -67
- package/dist/components/GenericCard/SynapseCardLabel.js.map +1 -1
- package/dist/components/GenericCard/TableRowGenericCard.d.ts +4 -1
- package/dist/components/GenericCard/TableRowGenericCard.d.ts.map +1 -1
- package/dist/components/GenericCard/TableRowGenericCard.js +98 -96
- package/dist/components/GenericCard/TableRowGenericCard.js.map +1 -1
- package/dist/components/GoalsV2/GoalsV2.Desktop.d.ts.map +1 -1
- package/dist/components/GoalsV2/GoalsV2.Desktop.js +14 -15
- package/dist/components/GoalsV2/GoalsV2.Desktop.js.map +1 -1
- package/dist/components/GoogleAnalytics/GoogleAnalytics.js +1 -1
- package/dist/components/HasAccess/HasAccessV2.js +1 -1
- package/dist/components/HasAccess/useHasAccess.js +1 -1
- package/dist/components/IDUReport/IDUReportSubmissionInfo.js +23 -23
- package/dist/components/IDUReport/IDUReportSubmissionInfo.js.map +1 -1
- package/dist/components/JSONArrayEditor/useParseCsv.d.ts +1 -1
- package/dist/components/JSONArrayEditor/useParseCsv.d.ts.map +1 -1
- package/dist/components/JSONArrayEditor/useParseCsv.js +9 -9
- package/dist/components/JSONArrayEditor/useParseCsv.js.map +1 -1
- package/dist/components/Markdown/MarkdownCollapse.js +7 -7
- package/dist/components/Markdown/MarkdownEditor.js +11 -11
- package/dist/components/Markdown/MarkdownGithub.js +1 -1
- package/dist/components/Markdown/MarkdownPopover.js +6 -6
- package/dist/components/Markdown/MarkdownPopover.js.map +1 -1
- package/dist/components/Markdown/MarkdownSynapse.d.ts.map +1 -1
- package/dist/components/Markdown/MarkdownSynapse.js +139 -135
- package/dist/components/Markdown/MarkdownSynapse.js.map +1 -1
- package/dist/components/Markdown/MarkdownUtils.d.ts +8 -0
- package/dist/components/Markdown/MarkdownUtils.d.ts.map +1 -1
- package/dist/components/Markdown/MarkdownUtils.js +139 -65
- package/dist/components/Markdown/MarkdownUtils.js.map +1 -1
- package/dist/components/Markdown/UserMentionModal.js +18 -18
- package/dist/components/Markdown/UserMentionModal.js.map +1 -1
- package/dist/components/Markdown/widget/MarkdownButton.js +3 -3
- package/dist/components/Markdown/widget/MarkdownButton.js.map +1 -1
- package/dist/components/MissingQueryResultsWarning/MissingQueryResultsWarning.d.ts.map +1 -1
- package/dist/components/MissingQueryResultsWarning/MissingQueryResultsWarning.js +9 -8
- package/dist/components/MissingQueryResultsWarning/MissingQueryResultsWarning.js.map +1 -1
- package/dist/components/Plot/SynapsePlot.css +1 -0
- package/dist/components/Plot/SynapsePlot.d.ts +2 -0
- package/dist/components/Plot/SynapsePlot.d.ts.map +1 -1
- package/dist/components/Plot/SynapsePlot.js +43 -39
- package/dist/components/Plot/SynapsePlot.js.map +1 -1
- package/dist/components/Plot/SynapsePlot.scss +8 -0
- package/dist/components/QueryVisualizationWrapper/QueryVisualizationWrapper.js +1 -1
- package/dist/components/QueryWrapperPlotNav/QueryWrapperPlotNav.d.ts.map +1 -1
- package/dist/components/QueryWrapperPlotNav/QueryWrapperPlotNav.js +114 -113
- package/dist/components/QueryWrapperPlotNav/QueryWrapperPlotNav.js.map +1 -1
- package/dist/components/QueryWrapperPlotNav/QueryWrapperSynapsePlot.d.ts +1 -1
- package/dist/components/QueryWrapperPlotNav/QueryWrapperSynapsePlot.d.ts.map +1 -1
- package/dist/components/QueryWrapperPlotNav/QueryWrapperSynapsePlot.js.map +1 -1
- package/dist/components/Resources/Resources.Desktop.js +7 -7
- package/dist/components/Resources/Resources.Mobile.js +6 -6
- package/dist/components/SubsectionRowRenderer/SubsectionRowRenderer.js +3 -3
- package/dist/components/SustainabilityScorecard/SustainabilityScorecardSummary.js +10 -10
- package/dist/components/SynapseChat/SynapseChatInteraction.js +5 -5
- package/dist/components/SynapseForm/WarningDialog.d.ts +1 -0
- package/dist/components/SynapseForm/WarningDialog.d.ts.map +1 -1
- package/dist/components/SynapseForm/WarningDialog.js +18 -16
- package/dist/components/SynapseForm/WarningDialog.js.map +1 -1
- package/dist/components/SynapseHomepageV2/SynapseHomepageNavBar.js +1 -1
- package/dist/components/SynapseHomepageV2/SynapsePartners.d.ts.map +1 -1
- package/dist/components/SynapseHomepageV2/SynapsePartners.js +17 -12
- package/dist/components/SynapseHomepageV2/SynapsePartners.js.map +1 -1
- package/dist/components/SynapsePortalBanners/SynapsePortalBanners.d.ts.map +1 -1
- package/dist/components/SynapsePortalBanners/SynapsePortalBanners.js +39 -39
- package/dist/components/SynapsePortalBanners/SynapsePortalBanners.js.map +1 -1
- package/dist/components/SynapseSearchPageResults/HasAccessChip.js +1 -1
- package/dist/components/SynapseSearchPageResults/SearchPagePortalBanners.d.ts.map +1 -1
- package/dist/components/SynapseSearchPageResults/SearchPagePortalBanners.js +21 -22
- package/dist/components/SynapseSearchPageResults/SearchPagePortalBanners.js.map +1 -1
- package/dist/components/SynapseSearchPageResults/SynapseSearchResultsCard.js +5 -5
- package/dist/components/SynapseTable/ExpandableTableDataCell.d.ts.map +1 -1
- package/dist/components/SynapseTable/ExpandableTableDataCell.js +3 -1
- package/dist/components/SynapseTable/ExpandableTableDataCell.js.map +1 -1
- package/dist/components/SynapseTable/SynapseTable.js +4 -4
- package/dist/components/SynapseTable/SynapseTableCell/SynapseTableCell.d.ts.map +1 -1
- package/dist/components/SynapseTable/SynapseTableCell/SynapseTableCell.js +122 -122
- package/dist/components/SynapseTable/SynapseTableCell/SynapseTableCell.js.map +1 -1
- package/dist/components/SynapseTable/datasets/DatasetItemsEditor.js +5 -5
- package/dist/components/TableColumnSchemaEditor/ColumnModelForm.js +1 -1
- package/dist/components/TableColumnSchemaEditor/TableColumnSchemaEditor.js +1 -1
- package/dist/components/TableColumnSchemaEditor/TableColumnSchemaForm.js +1 -1
- package/dist/components/TableFeedCards/TableFeedCards.js +9 -9
- package/dist/components/TermsAndConditions/TermsAndConditionsItem.js +10 -10
- package/dist/components/TimelinePlot/TimelinePlotSpeciesSelector.js +9 -9
- package/dist/components/UserSearchBox/UserSearchBox.d.ts +23 -0
- package/dist/components/UserSearchBox/UserSearchBox.d.ts.map +1 -0
- package/dist/components/UserSearchBox/UserSearchBox.js +146 -0
- package/dist/components/UserSearchBox/UserSearchBox.js.map +1 -0
- package/dist/components/WikiMarkdownEditorButton/WikiMarkdownEditorButton.js +13 -13
- package/dist/components/WizardChoiceButton/WizardChoiceButton.js +3 -3
- package/dist/components/dataaccess/AccessHistoryDashboard.js +5 -5
- package/dist/components/dataaccess/AccessHistoryDashboard.js.map +1 -1
- package/dist/components/dataaccess/AccessRequirementDashboard.js +4 -4
- package/dist/components/dataaccess/AccessRequirementDashboard.js.map +1 -1
- package/dist/components/dataaccess/AccessSubmissionDashboard.js +1 -1
- package/dist/components/dataaccess/AccessSubmissionDashboard.js.map +1 -1
- package/dist/components/dataaccess/SubmissionPage/SubmissionPage.js +5 -5
- package/dist/components/dataaccess/UseAccessRequirementTable.js +3 -3
- package/dist/components/dataaccess/UseAccessRequirementTable.js.map +1 -1
- package/dist/components/doi/CreateOrUpdateDoiModal.js +1 -1
- package/dist/components/download_list/AddToDownloadListConfirmationAlert/AddToDownloadListConfirmationAlert.js +2 -2
- package/dist/components/entity/metadata/EntityModal.js +1 -1
- package/dist/components/entity/metadata/MetadataTable.js +1 -1
- package/dist/components/entity/page/title_bar/EntityPageTitleBar.js +1 -1
- package/dist/components/entity/page/title_bar/EntityTitleBarVersionInfo.js +1 -1
- package/dist/components/entity/page/title_bar/TitleBarProperties.js +1 -1
- package/dist/components/entity/page/title_bar/useGetEntityTitleBarProperties.d.ts.map +1 -1
- package/dist/components/entity/page/title_bar/useGetEntityTitleBarProperties.js +27 -26
- package/dist/components/entity/page/title_bar/useGetEntityTitleBarProperties.js.map +1 -1
- package/dist/components/index.js +109 -107
- package/dist/components/index.js.map +1 -1
- package/dist/components/layout/InfiniteTableLayout.js +1 -1
- package/dist/components/styled/HoverPopover.css +1 -0
- package/dist/components/styled/HoverPopover.d.ts +28 -0
- package/dist/components/styled/HoverPopover.d.ts.map +1 -0
- package/dist/components/styled/HoverPopover.js +104 -0
- package/dist/components/styled/HoverPopover.js.map +1 -0
- package/dist/components/styled/HoverPopover.module.scss +10 -0
- package/dist/components/styled/HoverPopover.module.scss.js +10 -0
- package/dist/components/styled/HoverPopover.module.scss.js.map +1 -0
- package/dist/components/styled/index.d.ts +2 -0
- package/dist/components/styled/index.d.ts.map +1 -1
- package/dist/components/styled/index.js +11 -9
- package/dist/components/styled/index.js.map +1 -1
- package/dist/components/table/CsvPreview/CsvPreview.js +2 -2
- package/dist/components/table/CsvPreview/CsvPreviewDialog.js +2 -2
- package/dist/components/widgets/Range.js +1 -1
- package/dist/components/widgets/facet-nav/FacetNavPanel.d.ts.map +1 -1
- package/dist/components/widgets/facet-nav/FacetNavPanel.js +35 -32
- package/dist/components/widgets/facet-nav/FacetNavPanel.js.map +1 -1
- package/dist/components/widgets/facet-nav/PlotsContainer.d.ts +1 -1
- package/dist/components/widgets/facet-nav/PlotsContainer.d.ts.map +1 -1
- package/dist/components/widgets/facet-nav/PlotsContainer.js +69 -68
- package/dist/components/widgets/facet-nav/PlotsContainer.js.map +1 -1
- package/dist/components/widgets/facet-nav/useFacetPlots.d.ts.map +1 -1
- package/dist/components/widgets/facet-nav/useFacetPlots.js +24 -21
- package/dist/components/widgets/facet-nav/useFacetPlots.js.map +1 -1
- package/dist/components/widgets/query-filter/FacetFilterControls.js +3 -3
- package/dist/features/curator/GridPage/GridPage.js +2 -2
- package/dist/features/curator/GridPage/components/GridPageTitle.js +2 -2
- package/dist/features/entity/metadata-task/hooks/useMetadataTaskTable.js +1 -1
- package/dist/index.js +157 -155
- package/dist/index.js.map +1 -1
- package/dist/mocks/msw/handlers/accessRequirementHandlers.js +5 -5
- package/dist/mocks/msw/handlers/projectStorageHandlers.js +5 -5
- package/dist/mocks/msw/handlers/wikiHandlers.js +1 -1
- package/dist/mocks/msw/handlers.d.ts.map +1 -1
- package/dist/mocks/msw/handlers.js +67 -59
- package/dist/mocks/msw/handlers.js.map +1 -1
- package/dist/style/base/_core.scss +0 -1
- package/dist/style/components/_all.scss +0 -1
- package/dist/style/components/_entity-badge.scss +0 -2
- package/dist/style/components/_expandable_table_data.scss +3 -3
- package/dist/style/components/facet_nav/_facet-nav-panel.scss +3 -0
- package/dist/style/components/facet_nav/_facet-nav.scss +4 -0
- package/dist/style/main.css +1 -1
- package/dist/synapse-client/SynapseClient.js +118 -118
- package/dist/synapse-client/SynapseClient.js.map +1 -1
- package/dist/synapse-queries/auth/useOIDC.js +1 -1
- package/dist/synapse-queries/auth/useTwoFactorEnrollment.js +1 -1
- package/dist/synapse-queries/entity/index.js +6 -6
- package/dist/synapse-queries/grid/useEstablishWebsocketConnection.js +1 -1
- package/dist/synapse-queries/index.js +1 -1
- package/dist/synapse-queries/user/usePersonalAccessToken.js +1 -1
- package/dist/testutils/vitest.setup.js +10 -11
- package/dist/testutils/vitest.setup.js.map +1 -1
- package/dist/theme/DefaultTheme.js +1 -1
- package/dist/theme/ThemeProvider.d.ts +2 -1
- package/dist/theme/ThemeProvider.d.ts.map +1 -1
- package/dist/theme/ThemeProvider.js +11 -10
- package/dist/theme/ThemeProvider.js.map +1 -1
- package/dist/theme/index.js +1 -1
- package/dist/theme/mergeTheme.js +1 -1
- package/dist/tsconfig.build.tsbuildinfo +1 -1
- package/dist/utils/AppUtils/AppUtils.js +1 -1
- package/dist/utils/functions/SanitizeHtmlUtils.d.ts.map +1 -1
- package/dist/utils/functions/SanitizeHtmlUtils.js +34 -40
- package/dist/utils/functions/SanitizeHtmlUtils.js.map +1 -1
- package/dist/utils/functions/deepLinkingUtils.js +10 -10
- package/dist/utils/functions/deepLinkingUtils.js.map +1 -1
- package/dist/utils/hooks/index.js +6 -6
- package/dist/utils/hooks/useDetectSSOCode.js +3 -3
- package/dist/utils/hooks/useGetEntityMetadata.js +1 -1
- package/dist/utils/hooks/useNativeSearchParams.d.ts.map +1 -1
- package/dist/utils/hooks/useNativeSearchParams.js +1 -1
- package/dist/utils/hooks/useNativeSearchParams.js.map +1 -1
- package/dist/utils/hooks/useOneSageURL.d.ts.map +1 -1
- package/dist/utils/hooks/useOneSageURL.js +15 -15
- package/dist/utils/hooks/useOneSageURL.js.map +1 -1
- package/dist/utils/hooks/useSourceAppConfigs.d.ts +1 -0
- package/dist/utils/hooks/useSourceAppConfigs.d.ts.map +1 -1
- package/dist/utils/hooks/useSourceAppConfigs.js +79 -77
- package/dist/utils/hooks/useSourceAppConfigs.js.map +1 -1
- package/dist/utils/index.js +4 -4
- package/package.json +17 -18
- package/dist/_virtual/index.js +0 -6
- package/dist/_virtual/index.js.map +0 -1
- package/dist/_virtual/index2.js +0 -5
- package/dist/_virtual/index2.js.map +0 -1
- package/dist/_virtual/index3.js +0 -5
- package/dist/_virtual/index3.js.map +0 -1
- package/dist/_virtual/index4.js +0 -5
- package/dist/_virtual/index4.js.map +0 -1
- package/dist/_virtual/index5.js +0 -5
- package/dist/_virtual/index5.js.map +0 -1
- package/dist/assets/homepage/nci.svg +0 -6
- package/dist/assets/homepage/nci.svg.js +0 -7
- package/dist/assets/homepage/nci.svg.js.map +0 -1
- package/dist/assets/homepage/nih-mental.svg +0 -9
- package/dist/assets/homepage/nih-mental.svg.js +0 -7
- package/dist/assets/homepage/nih-mental.svg.js.map +0 -1
- package/dist/components/UserSearchBox/UserSearchBoxV2.d.ts +0 -21
- package/dist/components/UserSearchBox/UserSearchBoxV2.d.ts.map +0 -1
- package/dist/components/UserSearchBox/UserSearchBoxV2.js +0 -144
- package/dist/components/UserSearchBox/UserSearchBoxV2.js.map +0 -1
- package/dist/node_modules/.pnpm/base64-js@1.5.1/node_modules/base64-js/index.js +0 -53
- package/dist/node_modules/.pnpm/base64-js@1.5.1/node_modules/base64-js/index.js.map +0 -1
- package/dist/node_modules/.pnpm/buffer@6.0.3/node_modules/buffer/index.js +0 -948
- package/dist/node_modules/.pnpm/buffer@6.0.3/node_modules/buffer/index.js.map +0 -1
- package/dist/node_modules/.pnpm/ieee754@1.2.1/node_modules/ieee754/index.js +0 -30
- package/dist/node_modules/.pnpm/ieee754@1.2.1/node_modules/ieee754/index.js.map +0 -1
- package/dist/node_modules/.pnpm/vite-plugin-node-polyfills@0.17.0_rollup@4.55.1_vite@7.3.1_@types_node@22.19.13_sass@1._2da6e8f78437c36f3eb7db51bdd4d89e/node_modules/vite-plugin-node-polyfills/shims/dist/index.js +0 -15
- package/dist/node_modules/.pnpm/vite-plugin-node-polyfills@0.17.0_rollup@4.55.1_vite@7.3.1_@types_node@22.19.13_sass@1._2da6e8f78437c36f3eb7db51bdd4d89e/node_modules/vite-plugin-node-polyfills/shims/dist/index.js.map +0 -1
- package/dist/style/components/_user-search-box.scss +0 -30
|
@@ -4,22 +4,22 @@ import "../styled/LightTooltip.js";
|
|
|
4
4
|
import { StyledFormControl as f } from "../styled/StyledFormControl.js";
|
|
5
5
|
import "../styled/WideButton.js";
|
|
6
6
|
import "../styled/InputSizedButton.js";
|
|
7
|
+
import { InputLabel as v, Select as g, MenuItem as y } from "@mui/material";
|
|
8
|
+
import "react";
|
|
7
9
|
import "../../synapse-client/SynapseClient.js";
|
|
8
10
|
import "@sage-bionetworks/synapse-client/generated/models/ErrorResponseCode";
|
|
9
11
|
import "@sage-bionetworks/synapse-client/generated/models/TwoFactorAuthErrorResponse";
|
|
10
12
|
import "@sage-bionetworks/synapse-client/util/SynapseClientError";
|
|
11
|
-
import { parseEntityIdFromSqlStatement as
|
|
13
|
+
import { parseEntityIdFromSqlStatement as L } from "../../utils/functions/SqlFunctions.js";
|
|
12
14
|
import "../../utils/functions/EntityTypeUtils.js";
|
|
13
|
-
import { BUNDLE_MASK_QUERY_RESULTS as
|
|
15
|
+
import { BUNDLE_MASK_QUERY_RESULTS as T } from "../../utils/SynapseConstants.js";
|
|
14
16
|
import "lodash-es";
|
|
15
17
|
import "@sage-bionetworks/synapse-client/util/synapseClientFetch";
|
|
16
18
|
import "@tanstack/react-query";
|
|
17
19
|
import "../../utils/PermissionLevelToAccessType.js";
|
|
18
|
-
import "react";
|
|
19
20
|
import "../../utils/context/SynapseContext.js";
|
|
20
21
|
import "use-deep-compare-effect";
|
|
21
22
|
import "@sage-bionetworks/synapse-types";
|
|
22
|
-
import { InputLabel as y, Select as L, MenuItem as T } from "@mui/material";
|
|
23
23
|
import "../../utils/hooks/useCookiePreferences.js";
|
|
24
24
|
import "../../utils/hooks/useSourceAppConfigs.js";
|
|
25
25
|
import "universal-cookie";
|
|
@@ -42,19 +42,19 @@ const st = ({
|
|
|
42
42
|
species: i,
|
|
43
43
|
setSpecies: m
|
|
44
44
|
}) => {
|
|
45
|
-
const p =
|
|
45
|
+
const p = L(n), a = R({
|
|
46
46
|
entityId: p,
|
|
47
47
|
query: {
|
|
48
48
|
sql: `SELECT distinct unnest(species) FROM ${p} WHERE species IS NOT NULL AND observationTime IS NOT NULL GROUP BY species`,
|
|
49
49
|
additionalFilters: l
|
|
50
50
|
},
|
|
51
|
-
partMask:
|
|
51
|
+
partMask: T,
|
|
52
52
|
concreteType: "org.sagebionetworks.repo.model.table.QueryBundleRequest"
|
|
53
53
|
}), { data: u, isLoading: c } = a, t = u?.queryResult?.queryResults?.rows, s = t && t.length > 0 ? t[0].values[0] : void 0;
|
|
54
54
|
return i == null && s != null && m(s), c || !t || t.length < 2 ? /* @__PURE__ */ e(d, {}) : /* @__PURE__ */ e(b, { children: /* @__PURE__ */ S(f, { children: [
|
|
55
|
-
/* @__PURE__ */ e(
|
|
55
|
+
/* @__PURE__ */ e(v, { children: "Species" }),
|
|
56
56
|
/* @__PURE__ */ e(
|
|
57
|
-
|
|
57
|
+
g,
|
|
58
58
|
{
|
|
59
59
|
sx: { marginLeft: "2px", marginBottom: "2px" },
|
|
60
60
|
value: i,
|
|
@@ -64,7 +64,7 @@ const st = ({
|
|
|
64
64
|
},
|
|
65
65
|
children: t?.map((r) => {
|
|
66
66
|
const o = r.values[0];
|
|
67
|
-
return /* @__PURE__ */ e(
|
|
67
|
+
return /* @__PURE__ */ e(y, { value: o, children: o }, o);
|
|
68
68
|
})
|
|
69
69
|
}
|
|
70
70
|
)
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { TYPE_FILTER, UserGroupHeader } from '@sage-bionetworks/synapse-types';
|
|
2
|
+
export type UserSearchBoxProps = {
|
|
3
|
+
inputId?: string;
|
|
4
|
+
defaultValue?: string;
|
|
5
|
+
onChange?: (principalId: string | null, header: UserGroupHeader | null) => void;
|
|
6
|
+
typeFilter?: TYPE_FILTER;
|
|
7
|
+
filterPredicate?: (item: UserGroupHeader) => boolean;
|
|
8
|
+
placeholder?: string;
|
|
9
|
+
autoFocus?: boolean;
|
|
10
|
+
/**
|
|
11
|
+
* The principal ID of the currently selected user or team.
|
|
12
|
+
* - `undefined`: uncontrolled — the component manages its own selection state
|
|
13
|
+
* - `null`: controlled with no selection (clears the field)
|
|
14
|
+
* - string: controlled with the given principal ID selected
|
|
15
|
+
*/
|
|
16
|
+
value?: string | null;
|
|
17
|
+
};
|
|
18
|
+
/**
|
|
19
|
+
* Autocomplete component used to search for and select a user or team.
|
|
20
|
+
*/
|
|
21
|
+
declare function UserSearchBox(props: UserSearchBoxProps): import("react/jsx-runtime").JSX.Element;
|
|
22
|
+
export default UserSearchBox;
|
|
23
|
+
//# sourceMappingURL=UserSearchBox.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"UserSearchBox.d.ts","sourceRoot":"","sources":["../../../src/components/UserSearchBox/UserSearchBox.tsx"],"names":[],"mappings":"AAMA,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,iCAAiC,CAAA;AAI9E,MAAM,MAAM,kBAAkB,GAAG;IAE/B,OAAO,CAAC,EAAE,MAAM,CAAA;IAEhB,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,EAAE,CACT,WAAW,EAAE,MAAM,GAAG,IAAI,EAC1B,MAAM,EAAE,eAAe,GAAG,IAAI,KAC3B,IAAI,CAAA;IACT,UAAU,CAAC,EAAE,WAAW,CAAA;IACxB,eAAe,CAAC,EAAE,CAAC,IAAI,EAAE,eAAe,KAAK,OAAO,CAAA;IACpD,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,SAAS,CAAC,EAAE,OAAO,CAAA;IACnB;;;;;OAKG;IACH,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;CACtB,CAAA;AAED;;GAEG;AACH,iBAAS,aAAa,CAAC,KAAK,EAAE,kBAAkB,2CAmL/C;AAED,eAAe,aAAa,CAAA"}
|
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
import { jsx as t } from "react/jsx-runtime";
|
|
2
|
+
import { useState as p, useMemo as b, createElement as D } from "react";
|
|
3
|
+
import "../../synapse-client/SynapseClient.js";
|
|
4
|
+
import "@sage-bionetworks/synapse-client/generated/models/ErrorResponseCode";
|
|
5
|
+
import "@sage-bionetworks/synapse-client/generated/models/TwoFactorAuthErrorResponse";
|
|
6
|
+
import "@sage-bionetworks/synapse-client/util/SynapseClientError";
|
|
7
|
+
import { TYPE_FILTER as H } from "@sage-bionetworks/synapse-types";
|
|
8
|
+
import "../../utils/functions/EntityTypeUtils.js";
|
|
9
|
+
import "../../utils/SynapseConstants.js";
|
|
10
|
+
import "lodash-es";
|
|
11
|
+
import "@sage-bionetworks/synapse-client/util/synapseClientFetch";
|
|
12
|
+
import "@tanstack/react-query";
|
|
13
|
+
import "../../utils/PermissionLevelToAccessType.js";
|
|
14
|
+
import { useDebouncedEffect as Y } from "../../utils/hooks/useDebouncedEffect.js";
|
|
15
|
+
import "../../utils/context/SynapseContext.js";
|
|
16
|
+
import "use-deep-compare-effect";
|
|
17
|
+
import { Skeleton as k, Autocomplete as M, TextField as R, Box as j } from "@mui/material";
|
|
18
|
+
import "../../utils/hooks/useCookiePreferences.js";
|
|
19
|
+
import "../../utils/hooks/useSourceAppConfigs.js";
|
|
20
|
+
import "universal-cookie";
|
|
21
|
+
import "../../utils/AppUtils/session/ApplicationSessionContext.js";
|
|
22
|
+
import "../../utils/context/FullContextProvider.js";
|
|
23
|
+
import "../../utils/context/DocumentMetadataContext.js";
|
|
24
|
+
import '../../style/components/_spinner.css';/* empty css */
|
|
25
|
+
import "@tanstack/query-core";
|
|
26
|
+
import "lodash-es/isEmpty";
|
|
27
|
+
import "lodash-es/isEqual";
|
|
28
|
+
import "lodash-es/xorWith";
|
|
29
|
+
import "react-router";
|
|
30
|
+
import "@sage-bionetworks/synapse-client";
|
|
31
|
+
import "../../utils/types/IsType.js";
|
|
32
|
+
import { useGetUserGroupHeader as L, useSearchUserGroupHeaders as q } from "../../synapse-queries/user/useUserGroupHeader.js";
|
|
33
|
+
import V from "../UserOrTeamBadge/UserOrTeamBadge.js";
|
|
34
|
+
function Te(C) {
|
|
35
|
+
const {
|
|
36
|
+
inputId: E,
|
|
37
|
+
defaultValue: c = null,
|
|
38
|
+
onChange: T,
|
|
39
|
+
filterPredicate: f,
|
|
40
|
+
typeFilter: n,
|
|
41
|
+
placeholder: d,
|
|
42
|
+
autoFocus: w = !1,
|
|
43
|
+
value: l
|
|
44
|
+
} = C, i = l !== void 0, [r, h] = p(""), [a, x] = p("");
|
|
45
|
+
Y(
|
|
46
|
+
() => {
|
|
47
|
+
x(r);
|
|
48
|
+
},
|
|
49
|
+
[r],
|
|
50
|
+
500
|
|
51
|
+
);
|
|
52
|
+
const [N, g] = p(!1), { data: y, isLoading: F } = L(c ?? "", {
|
|
53
|
+
enabled: !!c && !i
|
|
54
|
+
}), I = i && typeof l == "string" ? l : null, {
|
|
55
|
+
data: G,
|
|
56
|
+
isLoading: U
|
|
57
|
+
} = L(I ?? "", {
|
|
58
|
+
enabled: !!I
|
|
59
|
+
}), [v, P] = p(void 0), s = i ? typeof l == "string" ? G ?? null : null : v !== void 0 ? v : y ?? null, m = s !== null && !N, _ = !!a, { data: O, isLoading: S } = q(
|
|
60
|
+
a,
|
|
61
|
+
n,
|
|
62
|
+
{
|
|
63
|
+
enabled: _
|
|
64
|
+
}
|
|
65
|
+
), B = b(
|
|
66
|
+
() => (O ?? []).filter(f ?? (() => !0)),
|
|
67
|
+
[O, f]
|
|
68
|
+
), A = b(() => d !== void 0 ? d : n == H.USERS_ONLY ? "Name (first and last)" : n == H.TEAMS_ONLY ? "Team name" : "Name (first and last) or team name", [d, n]);
|
|
69
|
+
return F || U ? /* @__PURE__ */ t(k, { width: "100%" }) : /* @__PURE__ */ t(
|
|
70
|
+
M,
|
|
71
|
+
{
|
|
72
|
+
id: E,
|
|
73
|
+
value: s,
|
|
74
|
+
inputValue: r,
|
|
75
|
+
onInputChange: (o, e, u) => {
|
|
76
|
+
h(u === "selectOption" || u === "reset" ? "" : e);
|
|
77
|
+
},
|
|
78
|
+
openOnFocus: s !== null,
|
|
79
|
+
onOpen: () => {
|
|
80
|
+
g(!0);
|
|
81
|
+
},
|
|
82
|
+
onClose: () => g(!1),
|
|
83
|
+
options: B,
|
|
84
|
+
filterOptions: (o) => o,
|
|
85
|
+
loading: S || r !== a,
|
|
86
|
+
isOptionEqualToValue: (o, e) => o.ownerId === e.ownerId,
|
|
87
|
+
getOptionLabel: (o) => o.userName,
|
|
88
|
+
renderOption: (o, e) => /* @__PURE__ */ D("li", { ...o, key: e.ownerId }, /* @__PURE__ */ t(
|
|
89
|
+
V,
|
|
90
|
+
{
|
|
91
|
+
userGroupHeader: e,
|
|
92
|
+
disableHref: !0,
|
|
93
|
+
showFullName: !0,
|
|
94
|
+
showCardOnHover: !1
|
|
95
|
+
}
|
|
96
|
+
)),
|
|
97
|
+
renderInput: ({
|
|
98
|
+
inputProps: o,
|
|
99
|
+
InputProps: e,
|
|
100
|
+
...u
|
|
101
|
+
}) => /* @__PURE__ */ t(
|
|
102
|
+
R,
|
|
103
|
+
{
|
|
104
|
+
...u,
|
|
105
|
+
placeholder: m ? void 0 : A,
|
|
106
|
+
autoFocus: w,
|
|
107
|
+
slotProps: {
|
|
108
|
+
htmlInput: {
|
|
109
|
+
...o,
|
|
110
|
+
// While the badge is displayed, hide the underlying input text and cursor.
|
|
111
|
+
// Merge custom styles with parent styles to preserve mouse selection and other behaviors.
|
|
112
|
+
style: {
|
|
113
|
+
...o.style,
|
|
114
|
+
...m ? { color: "transparent" } : {}
|
|
115
|
+
}
|
|
116
|
+
},
|
|
117
|
+
input: {
|
|
118
|
+
...e,
|
|
119
|
+
startAdornment: m ? /* @__PURE__ */ t(j, { sx: { ml: 1 }, children: /* @__PURE__ */ t(
|
|
120
|
+
V,
|
|
121
|
+
{
|
|
122
|
+
userGroupHeader: s,
|
|
123
|
+
disableHref: !0,
|
|
124
|
+
showFullName: !0,
|
|
125
|
+
showCardOnHover: !1
|
|
126
|
+
}
|
|
127
|
+
) }) : void 0
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
),
|
|
132
|
+
onChange: (o, e) => {
|
|
133
|
+
i || P(e), T?.(
|
|
134
|
+
e?.ownerId != null ? e.ownerId.toString() : null,
|
|
135
|
+
e ?? null
|
|
136
|
+
);
|
|
137
|
+
},
|
|
138
|
+
noOptionsText: S || r !== a ? "Loading…" : "No options",
|
|
139
|
+
clearOnEscape: !0
|
|
140
|
+
}
|
|
141
|
+
);
|
|
142
|
+
}
|
|
143
|
+
export {
|
|
144
|
+
Te as default
|
|
145
|
+
};
|
|
146
|
+
//# sourceMappingURL=UserSearchBox.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"UserSearchBox.js","sources":["../../../src/components/UserSearchBox/UserSearchBox.tsx"],"sourcesContent":["import {\n useGetUserGroupHeader,\n useSearchUserGroupHeaders,\n} from '@/synapse-queries'\nimport { useDebouncedEffect } from '@/utils/hooks/useDebouncedEffect'\nimport { Autocomplete, Box, Skeleton, TextField } from '@mui/material'\nimport { TYPE_FILTER, UserGroupHeader } from '@sage-bionetworks/synapse-types'\nimport { useMemo, useState } from 'react'\nimport UserOrTeamBadge from '../UserOrTeamBadge/UserOrTeamBadge'\n\nexport type UserSearchBoxProps = {\n /* id for the input element, for associating with a <label> */\n inputId?: string\n /* The initial principal ID (uncontrolled). Ignored if `value` is provided. */\n defaultValue?: string\n onChange?: (\n principalId: string | null,\n header: UserGroupHeader | null,\n ) => void\n typeFilter?: TYPE_FILTER\n filterPredicate?: (item: UserGroupHeader) => boolean\n placeholder?: string\n autoFocus?: boolean\n /**\n * The principal ID of the currently selected user or team.\n * - `undefined`: uncontrolled — the component manages its own selection state\n * - `null`: controlled with no selection (clears the field)\n * - string: controlled with the given principal ID selected\n */\n value?: string | null\n}\n\n/**\n * Autocomplete component used to search for and select a user or team.\n */\nfunction UserSearchBox(props: UserSearchBoxProps) {\n const {\n inputId,\n defaultValue = null,\n onChange,\n filterPredicate,\n typeFilter,\n placeholder,\n autoFocus = false,\n value: valueProp,\n } = props\n\n const isControlled = valueProp !== undefined\n\n const [inputValue, setInputValue] = useState('')\n const [debouncedInput, setDebouncedInput] = useState('')\n useDebouncedEffect(\n () => {\n setDebouncedInput(inputValue)\n },\n [inputValue],\n 500,\n )\n\n // Tracks whether the dropdown is open, used to toggle between badge display\n // and text-input search mode.\n const [isSearching, setIsSearching] = useState(false)\n\n // Resolve defaultValue principalId → UserGroupHeader for the initial uncontrolled state\n const { data: defaultUserGroupHeader, isLoading: isLoadingDefaultValue } =\n useGetUserGroupHeader(defaultValue ?? '', {\n enabled: !!defaultValue && !isControlled,\n })\n\n // Resolve controlled string principalId → UserGroupHeader\n const controlledPrincipalId =\n isControlled && typeof valueProp === 'string' ? valueProp : null\n\n const {\n data: resolvedControlledHeader,\n isLoading: isLoadingControlledValue,\n } = useGetUserGroupHeader(controlledPrincipalId ?? '', {\n enabled: !!controlledPrincipalId,\n })\n\n // Internal state for uncontrolled mode.\n // undefined = user hasn't interacted yet → falls back to defaultUserGroupHeader\n // null = user explicitly cleared the selection\n // header = user's current selection\n const [internalValue, setInternalValue] = useState<\n UserGroupHeader | null | undefined\n >(undefined)\n\n const controlledValue =\n typeof valueProp === 'string' ? resolvedControlledHeader ?? null : null\n const uncontrolledValue =\n internalValue !== undefined ? internalValue : defaultUserGroupHeader ?? null\n const resolvedValue: UserGroupHeader | null = isControlled\n ? controlledValue\n : uncontrolledValue\n\n // Show the badge in the input field when a value is selected and the user\n // is not actively searching.\n const showBadge = resolvedValue !== null && !isSearching\n\n const isSearchEnabled = !!debouncedInput\n const { data, isLoading } = useSearchUserGroupHeaders(\n debouncedInput,\n typeFilter,\n {\n enabled: isSearchEnabled,\n },\n )\n\n const options = useMemo(\n () => (data ?? []).filter(filterPredicate ?? (() => true)),\n [data, filterPredicate],\n )\n\n const placeholderText = useMemo(() => {\n if (placeholder !== undefined) {\n return placeholder\n } else if (typeFilter == TYPE_FILTER.USERS_ONLY) {\n return 'Name (first and last)'\n } else if (typeFilter == TYPE_FILTER.TEAMS_ONLY) {\n return 'Team name'\n } else {\n return 'Name (first and last) or team name'\n }\n }, [placeholder, typeFilter])\n\n if (isLoadingDefaultValue || isLoadingControlledValue) {\n return <Skeleton width=\"100%\" />\n }\n\n return (\n <Autocomplete<UserGroupHeader, false, false, false>\n id={inputId}\n value={resolvedValue}\n inputValue={inputValue}\n onInputChange={(_event, newInputValue, reason) => {\n if (reason === 'selectOption' || reason === 'reset') {\n // After an option is selected/removed, clear the input text so it's ready for the next search.\n setInputValue('')\n } else {\n setInputValue(newInputValue)\n }\n }}\n // When a value is selected, clicking the badge area should re-open the search.\n openOnFocus={resolvedValue !== null}\n onOpen={() => {\n setIsSearching(true)\n }}\n onClose={() => setIsSearching(false)}\n options={options}\n filterOptions={x => x}\n loading={isLoading || inputValue !== debouncedInput}\n isOptionEqualToValue={(option, val) => option.ownerId === val.ownerId}\n getOptionLabel={option => option.userName}\n renderOption={(optionProps, option) => (\n <li {...optionProps} key={option.ownerId}>\n <UserOrTeamBadge\n userGroupHeader={option}\n disableHref\n showFullName\n showCardOnHover={false}\n />\n </li>\n )}\n renderInput={({\n inputProps: inputPropsFromParams,\n InputProps: InputPropsFromParams,\n ...params\n }) => (\n <TextField\n {...params}\n placeholder={showBadge ? undefined : placeholderText}\n autoFocus={autoFocus}\n slotProps={{\n htmlInput: {\n ...inputPropsFromParams,\n // While the badge is displayed, hide the underlying input text and cursor.\n // Merge custom styles with parent styles to preserve mouse selection and other behaviors.\n style: {\n ...inputPropsFromParams.style,\n ...(showBadge ? { color: 'transparent' } : {}),\n },\n },\n input: {\n ...InputPropsFromParams,\n startAdornment: showBadge ? (\n <Box sx={{ ml: 1 }}>\n <UserOrTeamBadge\n userGroupHeader={resolvedValue}\n disableHref\n showFullName\n showCardOnHover={false}\n />\n </Box>\n ) : undefined,\n },\n }}\n />\n )}\n onChange={(_event, newValue) => {\n if (!isControlled) {\n setInternalValue(newValue)\n }\n onChange?.(\n newValue?.ownerId != null ? newValue.ownerId.toString() : null,\n newValue ?? null,\n )\n }}\n noOptionsText={\n isLoading || inputValue !== debouncedInput ? 'Loading…' : 'No options'\n }\n clearOnEscape\n />\n )\n}\n\nexport default UserSearchBox\n"],"names":["UserSearchBox","props","inputId","defaultValue","onChange","filterPredicate","typeFilter","placeholder","autoFocus","valueProp","isControlled","inputValue","setInputValue","useState","debouncedInput","setDebouncedInput","useDebouncedEffect","isSearching","setIsSearching","defaultUserGroupHeader","isLoadingDefaultValue","useGetUserGroupHeader","controlledPrincipalId","resolvedControlledHeader","isLoadingControlledValue","internalValue","setInternalValue","resolvedValue","showBadge","isSearchEnabled","data","isLoading","useSearchUserGroupHeaders","options","useMemo","placeholderText","TYPE_FILTER","jsx","Skeleton","Autocomplete","_event","newInputValue","reason","x","option","val","optionProps","createElement","UserOrTeamBadge","inputPropsFromParams","InputPropsFromParams","params","TextField","Box","newValue"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAmCA,SAASA,GAAcC,GAA2B;AAChD,QAAM;AAAA,IACJ,SAAAC;AAAA,IACA,cAAAC,IAAe;AAAA,IACf,UAAAC;AAAA,IACA,iBAAAC;AAAA,IACA,YAAAC;AAAA,IACA,aAAAC;AAAA,IACA,WAAAC,IAAY;AAAA,IACZ,OAAOC;AAAA,EAAA,IACLR,GAEES,IAAeD,MAAc,QAE7B,CAACE,GAAYC,CAAa,IAAIC,EAAS,EAAE,GACzC,CAACC,GAAgBC,CAAiB,IAAIF,EAAS,EAAE;AACvD,EAAAG;AAAA,IACE,MAAM;AACJ,MAAAD,EAAkBJ,CAAU;AAAA,IAC9B;AAAA,IACA,CAACA,CAAU;AAAA,IACX;AAAA,EAAA;AAKF,QAAM,CAACM,GAAaC,CAAc,IAAIL,EAAS,EAAK,GAG9C,EAAE,MAAMM,GAAwB,WAAWC,MAC/CC,EAAsBlB,KAAgB,IAAI;AAAA,IACxC,SAAS,CAAC,CAACA,KAAgB,CAACO;AAAA,EAAA,CAC7B,GAGGY,IACJZ,KAAgB,OAAOD,KAAc,WAAWA,IAAY,MAExD;AAAA,IACJ,MAAMc;AAAA,IACN,WAAWC;AAAA,EAAA,IACTH,EAAsBC,KAAyB,IAAI;AAAA,IACrD,SAAS,CAAC,CAACA;AAAA,EAAA,CACZ,GAMK,CAACG,GAAeC,CAAgB,IAAIb,EAExC,MAAS,GAMLc,IAAwCjB,IAH5C,OAAOD,KAAc,WAAWc,KAA4B,OAAO,OAEnEE,MAAkB,SAAYA,IAAgBN,KAA0B,MAOpES,IAAYD,MAAkB,QAAQ,CAACV,GAEvCY,IAAkB,CAAC,CAACf,GACpB,EAAE,MAAAgB,GAAM,WAAAC,EAAA,IAAcC;AAAA,IAC1BlB;AAAA,IACAR;AAAA,IACA;AAAA,MACE,SAASuB;AAAA,IAAA;AAAA,EACX,GAGII,IAAUC;AAAA,IACd,OAAOJ,KAAQ,CAAA,GAAI,OAAOzB,MAAoB,MAAM,GAAK;AAAA,IACzD,CAACyB,GAAMzB,CAAe;AAAA,EAAA,GAGlB8B,IAAkBD,EAAQ,MAC1B3B,MAAgB,SACXA,IACED,KAAc8B,EAAY,aAC5B,0BACE9B,KAAc8B,EAAY,aAC5B,cAEA,sCAER,CAAC7B,GAAaD,CAAU,CAAC;AAE5B,SAAIc,KAAyBI,IACpB,gBAAAa,EAACC,GAAA,EAAS,OAAM,OAAA,CAAO,IAI9B,gBAAAD;AAAA,IAACE;AAAA,IAAA;AAAA,MACC,IAAIrC;AAAA,MACJ,OAAOyB;AAAA,MACP,YAAAhB;AAAA,MACA,eAAe,CAAC6B,GAAQC,GAAeC,MAAW;AAChD,QAEE9B,EAFE8B,MAAW,kBAAkBA,MAAW,UAE5B,KAEAD,CAFE;AAAA,MAIpB;AAAA,MAEA,aAAad,MAAkB;AAAA,MAC/B,QAAQ,MAAM;AACZ,QAAAT,EAAe,EAAI;AAAA,MACrB;AAAA,MACA,SAAS,MAAMA,EAAe,EAAK;AAAA,MACnC,SAAAe;AAAA,MACA,eAAe,CAAAU,MAAKA;AAAA,MACpB,SAASZ,KAAapB,MAAeG;AAAA,MACrC,sBAAsB,CAAC8B,GAAQC,MAAQD,EAAO,YAAYC,EAAI;AAAA,MAC9D,gBAAgB,OAAUD,EAAO;AAAA,MACjC,cAAc,CAACE,GAAaF,MAC1B,gBAAAG,EAAC,QAAI,GAAGD,GAAa,KAAKF,EAAO,QAAA,GAC/B,gBAAAP;AAAA,QAACW;AAAA,QAAA;AAAA,UACC,iBAAiBJ;AAAA,UACjB,aAAW;AAAA,UACX,cAAY;AAAA,UACZ,iBAAiB;AAAA,QAAA;AAAA,MAAA,CAErB;AAAA,MAEF,aAAa,CAAC;AAAA,QACZ,YAAYK;AAAA,QACZ,YAAYC;AAAA,QACZ,GAAGC;AAAA,MAAA,MAEH,gBAAAd;AAAA,QAACe;AAAA,QAAA;AAAA,UACE,GAAGD;AAAA,UACJ,aAAavB,IAAY,SAAYO;AAAA,UACrC,WAAA3B;AAAA,UACA,WAAW;AAAA,YACT,WAAW;AAAA,cACT,GAAGyC;AAAA;AAAA;AAAA,cAGH,OAAO;AAAA,gBACL,GAAGA,EAAqB;AAAA,gBACxB,GAAIrB,IAAY,EAAE,OAAO,kBAAkB,CAAA;AAAA,cAAC;AAAA,YAC9C;AAAA,YAEF,OAAO;AAAA,cACL,GAAGsB;AAAA,cACH,gBAAgBtB,IACd,gBAAAS,EAACgB,GAAA,EAAI,IAAI,EAAE,IAAI,KACb,UAAA,gBAAAhB;AAAA,gBAACW;AAAA,gBAAA;AAAA,kBACC,iBAAiBrB;AAAA,kBACjB,aAAW;AAAA,kBACX,cAAY;AAAA,kBACZ,iBAAiB;AAAA,gBAAA;AAAA,cAAA,GAErB,IACE;AAAA,YAAA;AAAA,UACN;AAAA,QACF;AAAA,MAAA;AAAA,MAGJ,UAAU,CAACa,GAAQc,MAAa;AAC9B,QAAK5C,KACHgB,EAAiB4B,CAAQ,GAE3BlD;AAAA,UACEkD,GAAU,WAAW,OAAOA,EAAS,QAAQ,aAAa;AAAA,UAC1DA,KAAY;AAAA,QAAA;AAAA,MAEhB;AAAA,MACA,eACEvB,KAAapB,MAAeG,IAAiB,aAAa;AAAA,MAE5D,eAAa;AAAA,IAAA;AAAA,EAAA;AAGnB;"}
|
|
@@ -28,11 +28,11 @@ import "lodash-es/xorWith";
|
|
|
28
28
|
import "react-router";
|
|
29
29
|
import "@sage-bionetworks/synapse-client";
|
|
30
30
|
import "../../utils/types/IsType.js";
|
|
31
|
-
import { useGetRootWikiPageKey as F, useCreateWikiPage as
|
|
32
|
-
import {
|
|
33
|
-
import { WikiMarkdownEditor as
|
|
34
|
-
const f = "Failed to load the wiki page: ",
|
|
35
|
-
children:
|
|
31
|
+
import { useGetRootWikiPageKey as F, useCreateWikiPage as M, useGetWikiPage as j } from "../../synapse-queries/wiki/useWiki.js";
|
|
32
|
+
import { Markdown as v } from "../Markdown/MarkdownSynapse.js";
|
|
33
|
+
import { WikiMarkdownEditor as A } from "../WikiMarkdownEditor/WikiMarkdownEditor.js";
|
|
34
|
+
const f = "Failed to load the wiki page: ", B = "Edit Wiki Page", D = {
|
|
35
|
+
children: B,
|
|
36
36
|
color: "primary",
|
|
37
37
|
variant: "contained"
|
|
38
38
|
};
|
|
@@ -49,14 +49,14 @@ function yi(g) {
|
|
|
49
49
|
), [c, n] = O(!1), {
|
|
50
50
|
data: s,
|
|
51
51
|
isLoading: l,
|
|
52
|
-
error:
|
|
52
|
+
error: d
|
|
53
53
|
} = F(i, e, {
|
|
54
54
|
enabled: a === void 0
|
|
55
55
|
}), {
|
|
56
56
|
mutate: I,
|
|
57
57
|
isPending: h,
|
|
58
|
-
error:
|
|
59
|
-
} =
|
|
58
|
+
error: m
|
|
59
|
+
} = M({
|
|
60
60
|
onSuccess: () => n(!0)
|
|
61
61
|
}), P = k(() => {
|
|
62
62
|
const t = a || s?.wikiPageId || "";
|
|
@@ -69,11 +69,11 @@ function yi(g) {
|
|
|
69
69
|
data: r,
|
|
70
70
|
isLoading: u,
|
|
71
71
|
error: p
|
|
72
|
-
} =
|
|
72
|
+
} = j(P, {
|
|
73
73
|
enabled: P.wikiPageId !== "",
|
|
74
74
|
// Set staleTime to infinity to prevent re-fetching while editing
|
|
75
75
|
staleTime: 1 / 0
|
|
76
|
-
}), w = k(() =>
|
|
76
|
+
}), w = k(() => d ? f + d.reason : p ? f + p.reason : m ? m.reason : null, [d, p, m]), T = () => {
|
|
77
77
|
r ? n(!0) : s === null ? I({
|
|
78
78
|
ownerObjectId: e,
|
|
79
79
|
ownerObjectType: i,
|
|
@@ -107,7 +107,7 @@ function yi(g) {
|
|
|
107
107
|
children: u || l ? /* @__PURE__ */ o(x, {}) : (
|
|
108
108
|
// TODO - remove key once MarkdownSynapse uses tanstack-query
|
|
109
109
|
/* @__PURE__ */ o(
|
|
110
|
-
|
|
110
|
+
v,
|
|
111
111
|
{
|
|
112
112
|
...L
|
|
113
113
|
},
|
|
@@ -126,7 +126,7 @@ function yi(g) {
|
|
|
126
126
|
),
|
|
127
127
|
w && /* @__PURE__ */ o(_, { severity: "error", sx: { marginTop: 2 }, children: w }),
|
|
128
128
|
r && /* @__PURE__ */ o(
|
|
129
|
-
|
|
129
|
+
A,
|
|
130
130
|
{
|
|
131
131
|
open: c,
|
|
132
132
|
ownerObjectType: i,
|
|
@@ -140,7 +140,7 @@ function yi(g) {
|
|
|
140
140
|
] });
|
|
141
141
|
}
|
|
142
142
|
export {
|
|
143
|
-
|
|
143
|
+
B as DEFAULT_BUTTON_TEXT,
|
|
144
144
|
f as ERROR_LOADING_WIKI_FAILED,
|
|
145
145
|
yi as WikiMarkdownEditorButton,
|
|
146
146
|
yi as default
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { jsxs as a, jsx as r } from "react/jsx-runtime";
|
|
2
|
-
import {
|
|
2
|
+
import { Box as i, Typography as s, styled as c } from "@mui/material";
|
|
3
3
|
import x from "../IconSvg/IconSvg.js";
|
|
4
4
|
import f from "./WizardChoiceButtonDescription.js";
|
|
5
|
-
const g =
|
|
5
|
+
const g = c(
|
|
6
6
|
i,
|
|
7
7
|
{
|
|
8
8
|
shouldForwardProp: (o) => o !== "selected"
|
|
@@ -50,7 +50,7 @@ function k(o) {
|
|
|
50
50
|
),
|
|
51
51
|
/* @__PURE__ */ a(i, { sx: { flexGrow: 1, textAlign: "left" }, children: [
|
|
52
52
|
/* @__PURE__ */ r(
|
|
53
|
-
|
|
53
|
+
s,
|
|
54
54
|
{
|
|
55
55
|
variant: "headline2",
|
|
56
56
|
sx: {
|
|
@@ -33,7 +33,7 @@ import "../../utils/types/IsType.js";
|
|
|
33
33
|
import { useGetCurrentUserBundle as F } from "../../synapse-queries/user/useUserBundle.js";
|
|
34
34
|
import p from "@mui/material/Grid";
|
|
35
35
|
import B from "../UserOrTeamBadge/UserOrTeamBadge.js";
|
|
36
|
-
import L from "../UserSearchBox/
|
|
36
|
+
import L from "../UserSearchBox/UserSearchBox.js";
|
|
37
37
|
import { AccessApprovalsTable as _ } from "./AccessApprovalsTable.js";
|
|
38
38
|
import { AccessRequestSubmissionTable as D } from "./AccessRequestSubmissionTable.js";
|
|
39
39
|
import z from "./AccessRequirementSearchBox/AccessRequirementSearchBox.js";
|
|
@@ -44,12 +44,12 @@ const G = () => /* @__PURE__ */ t("div", { className: "text-center", children: [
|
|
|
44
44
|
const [a, l] = c(), [r, n] = c(""), [f, S] = c({
|
|
45
45
|
accessorId: r,
|
|
46
46
|
accessRequirementId: a
|
|
47
|
-
}), [b,
|
|
47
|
+
}), [b, v] = c({
|
|
48
48
|
showStatus: !0,
|
|
49
49
|
showSubmitter: !0,
|
|
50
50
|
accessorId: r,
|
|
51
51
|
accessRequirementId: a
|
|
52
|
-
}), { data:
|
|
52
|
+
}), { data: g } = F(), I = g?.isACTMember, o = E(), h = w(), P = 500, A = q((i) => {
|
|
53
53
|
n(i || "");
|
|
54
54
|
}, []);
|
|
55
55
|
return C(() => {
|
|
@@ -81,7 +81,7 @@ const G = () => /* @__PURE__ */ t("div", { className: "text-center", children: [
|
|
|
81
81
|
})(a, r), S({
|
|
82
82
|
accessorId: r,
|
|
83
83
|
accessRequirementId: a
|
|
84
|
-
}),
|
|
84
|
+
}), v({
|
|
85
85
|
showStatus: !0,
|
|
86
86
|
showSubmitter: !0,
|
|
87
87
|
accessorId: r,
|
|
@@ -107,7 +107,7 @@ const G = () => /* @__PURE__ */ t("div", { className: "text-center", children: [
|
|
|
107
107
|
{
|
|
108
108
|
inputId: "user-filter",
|
|
109
109
|
onChange: A,
|
|
110
|
-
|
|
110
|
+
value: r,
|
|
111
111
|
placeholder: "Search for a user name",
|
|
112
112
|
typeFilter: y.USERS_ONLY
|
|
113
113
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AccessHistoryDashboard.js","sources":["../../../src/components/dataaccess/AccessHistoryDashboard.tsx"],"sourcesContent":["import React from 'react'\nimport SearchImage from '@/assets/icons/SearchImage'\nimport { useGetCurrentUserBundle } from '@/synapse-queries'\nimport { useDebouncedEffect } from '@/utils/hooks/useDebouncedEffect'\nimport { Typography } from '@mui/material'\nimport Grid from '@mui/material/Grid'\nimport { TYPE_FILTER } from '@sage-bionetworks/synapse-types'\nimport { omitBy } from 'lodash-es'\nimport { useCallback, useEffect, useState } from 'react'\nimport { useLocation, useNavigate } from 'react-router'\nimport UserOrTeamBadge from '../UserOrTeamBadge/UserOrTeamBadge'\nimport
|
|
1
|
+
{"version":3,"file":"AccessHistoryDashboard.js","sources":["../../../src/components/dataaccess/AccessHistoryDashboard.tsx"],"sourcesContent":["import React from 'react'\nimport SearchImage from '@/assets/icons/SearchImage'\nimport { useGetCurrentUserBundle } from '@/synapse-queries'\nimport { useDebouncedEffect } from '@/utils/hooks/useDebouncedEffect'\nimport { Typography } from '@mui/material'\nimport Grid from '@mui/material/Grid'\nimport { TYPE_FILTER } from '@sage-bionetworks/synapse-types'\nimport { omitBy } from 'lodash-es'\nimport { useCallback, useEffect, useState } from 'react'\nimport { useLocation, useNavigate } from 'react-router'\nimport UserOrTeamBadge from '../UserOrTeamBadge/UserOrTeamBadge'\nimport UserSearchBox from '../UserSearchBox/UserSearchBox'\nimport {\n AccessApprovalsTable,\n AccessApprovalsTableProps,\n} from './AccessApprovalsTable'\nimport {\n AccessRequestSubmissionTable,\n AccessRequestSubmissionTableProps,\n} from './AccessRequestSubmissionTable'\nimport AccessRequirementSearchBox from './AccessRequirementSearchBox/AccessRequirementSearchBox'\n\nconst SearchStartComponent = (): React.ReactNode => {\n return (\n <div className=\"text-center\">\n <SearchImage className=\"SearchPlaceholderImage\" height=\"167px\" />\n <Typography variant=\"body1Italic\">\n Select a user using the search field above to view their data access\n history\n </Typography>\n </div>\n )\n}\n\nexport const UserHistoryDashboard = (): React.ReactNode => {\n const [accessRequirementId, setAccessRequirementId] = useState<\n string | undefined\n >()\n const [accessorId, setAccessorId] = useState<string>('')\n const [approvalTableProps, setApprovalTableProps] =\n useState<AccessApprovalsTableProps>({\n accessorId,\n accessRequirementId,\n })\n const [submissionTableProps, setSubmissionTableProps] =\n useState<AccessRequestSubmissionTableProps>({\n showStatus: true,\n showSubmitter: true,\n accessorId,\n accessRequirementId,\n })\n\n const { data: userBundle } = useGetCurrentUserBundle()\n const hasActPermissions = userBundle?.isACTMember\n\n const location = useLocation()\n const navigate = useNavigate()\n const INPUT_CHANGE_DEBOUNCE_DELAY_MS = 500\n\n const onAccessorChange = useCallback((selected: string | null) => {\n if (selected) {\n setAccessorId(selected)\n } else {\n setAccessorId('')\n }\n }, [])\n\n useEffect(() => {\n const initializeFromSearchParam = () => {\n const initialParams = new URLSearchParams(location.search)\n setAccessRequirementId(\n initialParams.get('accessRequirementId') ?? undefined,\n )\n setAccessorId(initialParams.get('accessorId') ?? '')\n }\n initializeFromSearchParam()\n }, [location.search])\n\n useDebouncedEffect(\n () => {\n const updateQueryParams = (\n accessRequirementId: string | undefined,\n accessorId: string,\n ) => {\n const params = new URLSearchParams(\n omitBy(\n {\n accessRequirementId,\n accessorId,\n },\n item => item === undefined || item === '',\n ) as Record<string, string>,\n )\n navigate(\n {\n pathname: location.pathname,\n search: params.toString(),\n },\n { replace: true },\n )\n }\n\n updateQueryParams(accessRequirementId, accessorId)\n setApprovalTableProps({\n accessorId,\n accessRequirementId,\n })\n setSubmissionTableProps({\n showStatus: true,\n showSubmitter: true,\n accessorId,\n accessRequirementId,\n })\n },\n [accessRequirementId, accessorId, navigate, location.pathname],\n INPUT_CHANGE_DEBOUNCE_DELAY_MS,\n )\n\n return (\n <div className=\"UserHistoryDashboard\">\n <Grid container spacing={2} className=\"InputPanel\">\n <Grid size={{ xs: 12, md: 6 }}>\n <Typography\n component=\"label\"\n variant=\"smallText2\"\n htmlFor=\"user-filter\"\n >\n Select a user to view their access history\n </Typography>\n <UserSearchBox\n inputId=\"user-filter\"\n onChange={onAccessorChange}\n value={accessorId}\n placeholder=\"Search for a user name\"\n typeFilter={TYPE_FILTER.USERS_ONLY}\n />\n </Grid>\n\n {accessorId && (\n <Grid size={{ xs: 12, md: 6 }}>\n <Typography\n component=\"label\"\n variant=\"smallText2\"\n htmlFor=\"arName-filter\"\n >\n Filter by Access Requirement Name\n </Typography>\n <AccessRequirementSearchBox\n inputId=\"arName-filter\"\n placeholder=\"Search for an Access Requirement Name \"\n onChange={setAccessRequirementId}\n />\n </Grid>\n )}\n </Grid>\n\n {accessorId ? (\n <>\n <Typography variant=\"headline3\">\n Submissions including <UserOrTeamBadge principalId={accessorId} />\n </Typography>\n <AccessRequestSubmissionTable {...submissionTableProps} />\n {hasActPermissions && (\n <>\n <Typography variant=\"headline3\">\n Status in Access Requirements\n </Typography>\n <AccessApprovalsTable {...approvalTableProps} />\n </>\n )}\n </>\n ) : (\n <SearchStartComponent />\n )}\n </div>\n )\n}\n"],"names":["SearchStartComponent","jsxs","jsx","SearchImage","Typography","UserHistoryDashboard","accessRequirementId","setAccessRequirementId","useState","accessorId","setAccessorId","approvalTableProps","setApprovalTableProps","submissionTableProps","setSubmissionTableProps","userBundle","useGetCurrentUserBundle","hasActPermissions","location","useLocation","navigate","useNavigate","INPUT_CHANGE_DEBOUNCE_DELAY_MS","onAccessorChange","useCallback","selected","useEffect","initialParams","useDebouncedEffect","params","omitBy","item","Grid","UserSearchBox","TYPE_FILTER","AccessRequirementSearchBox","Fragment","UserOrTeamBadge","AccessRequestSubmissionTable","AccessApprovalsTable"],"mappings":"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"}
|
|
@@ -10,8 +10,8 @@ import { useMemo as R, useState as I, useEffect as Y, useCallback as q } from "r
|
|
|
10
10
|
import { useLocation as L, useNavigate as B } from "react-router";
|
|
11
11
|
import { EntityFinderModal as H } from "../EntityFinder/EntityFinderModal.js";
|
|
12
12
|
import { FinderScope as G } from "../EntityFinder/tree/EntityTree.js";
|
|
13
|
-
import
|
|
14
|
-
import { AccessRequirementTable as
|
|
13
|
+
import z from "../UserSearchBox/UserSearchBox.js";
|
|
14
|
+
import { AccessRequirementTable as K } from "./AccessRequirementTable.js";
|
|
15
15
|
const S = "nameOrID", C = "relatedProjectId", y = "reviewerId", D = "type";
|
|
16
16
|
function se(N) {
|
|
17
17
|
const { onCreateNewAccessRequirementClicked: P } = N, o = L(), i = R(
|
|
@@ -158,7 +158,7 @@ function se(N) {
|
|
|
158
158
|
}
|
|
159
159
|
),
|
|
160
160
|
/* @__PURE__ */ t(
|
|
161
|
-
|
|
161
|
+
z,
|
|
162
162
|
{
|
|
163
163
|
inputId: "reviewer-filter",
|
|
164
164
|
placeholder: "Search for a username or team name",
|
|
@@ -169,7 +169,7 @@ function se(N) {
|
|
|
169
169
|
] })
|
|
170
170
|
] }),
|
|
171
171
|
/* @__PURE__ */ t(
|
|
172
|
-
|
|
172
|
+
K,
|
|
173
173
|
{
|
|
174
174
|
nameOrID: l,
|
|
175
175
|
relatedProjectId: r,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AccessRequirementDashboard.js","sources":["../../../src/components/dataaccess/AccessRequirementDashboard.tsx"],"sourcesContent":["import { InputSizedButton } from '@/components/styled/InputSizedButton'\nimport { SYNAPSE_ENTITY_ID_REGEX } from '@/utils/functions/RegularExpressions'\nimport { SearchOutlined } from '@mui/icons-material'\nimport { Grid, InputAdornment, TextField, Typography } from '@mui/material'\nimport { useDebouncedState } from '@react-hookz/web'\nimport { EntityType } from '@sage-bionetworks/synapse-client'\nimport { omitBy } from 'lodash-es'\nimport { useCallback, useEffect, useMemo, useState } from 'react'\nimport { useLocation, useNavigate } from 'react-router'\nimport { EntityFinderModal } from '../EntityFinder/EntityFinderModal'\nimport { FinderScope } from '../EntityFinder/tree/EntityTree'\nimport UserSearchBoxV2 from '../UserSearchBox/UserSearchBoxV2'\nimport { AccessRequirementTable } from './AccessRequirementTable'\n\nexport const AR_NAME_OR_ID_SEARCH_PARAM_KEY = 'nameOrID'\nexport const RELATED_PROJECT_ID_SEARCH_PARAM_KEY = 'relatedProjectId'\nexport const REVIEWER_ID_SEARCH_PARAM_KEY = 'reviewerId'\nexport const AR_TYPE_SEARCH_PARAM_KEY = 'type'\n\nexport type AccessRequirementDashboardProps = {\n onCreateNewAccessRequirementClicked?: () => void\n}\n\nexport function AccessRequirementDashboard(\n props: AccessRequirementDashboardProps,\n) {\n // Amount of time to wait after an input value changes before sending a new request\n const INPUT_CHANGE_DEBOUNCE_DELAY_MS = 500\n\n const { onCreateNewAccessRequirementClicked } = props\n\n const location = useLocation()\n const urlSearchParams = useMemo(\n () => new URLSearchParams(location.search),\n [location.search],\n )\n const navigate = useNavigate()\n\n /**\n * When an input changes, update the props passed to the table and update the search params.\n *\n * Debounced to prevent firing many queries while the user is entering text.\n */\n const [nameOrID, setNameOrID] = useDebouncedState<string>(\n urlSearchParams.get(AR_NAME_OR_ID_SEARCH_PARAM_KEY) ?? '',\n INPUT_CHANGE_DEBOUNCE_DELAY_MS,\n )\n const [relatedProjectId, setRelatedProjectId] = useDebouncedState<\n string | undefined\n >(\n urlSearchParams.get(RELATED_PROJECT_ID_SEARCH_PARAM_KEY) ?? undefined,\n INPUT_CHANGE_DEBOUNCE_DELAY_MS,\n )\n const [reviewerId, setReviewerId] = useDebouncedState<string | undefined>(\n urlSearchParams.get(REVIEWER_ID_SEARCH_PARAM_KEY) ?? undefined,\n INPUT_CHANGE_DEBOUNCE_DELAY_MS,\n )\n const [typeFilter, setTypeFilter] = useState<string | undefined>(\n urlSearchParams.get(AR_TYPE_SEARCH_PARAM_KEY) ?? undefined,\n )\n\n const projectFilterFieldIsError: boolean = useMemo(\n () =>\n !!(relatedProjectId && !SYNAPSE_ENTITY_ID_REGEX.exec(relatedProjectId)),\n [relatedProjectId],\n )\n\n const [showEntityFinder, setShowEntityFinder] = useState(false)\n\n // Update the QueryParams when the filter state changes\n useEffect(() => {\n // Don't include undefined/empty parameters\n const params = omitBy(\n {\n // Sync the search params state with the debounced props\n [AR_NAME_OR_ID_SEARCH_PARAM_KEY]: nameOrID,\n [RELATED_PROJECT_ID_SEARCH_PARAM_KEY]: relatedProjectId,\n [REVIEWER_ID_SEARCH_PARAM_KEY]: reviewerId,\n [AR_TYPE_SEARCH_PARAM_KEY]: typeFilter, // typeFilter state is not debounced\n },\n item => item === undefined || item === '',\n ) as Record<string, string>\n\n // Add the new params to the URL\n // Replace history because intuitively, the user has not navigated to a new page\n const paramsObject = new URLSearchParams(params)\n navigate(\n {\n pathname: location.pathname,\n search: paramsObject.toString(),\n },\n { replace: true },\n )\n }, [\n nameOrID,\n relatedProjectId,\n reviewerId,\n typeFilter,\n navigate,\n location.pathname,\n ])\n\n const onReviewerChange = useCallback(\n (selected: string | null) => {\n if (selected) {\n setReviewerId(selected)\n } else {\n setReviewerId(undefined)\n }\n },\n [setReviewerId],\n )\n\n return (\n <div className=\"AccessRequirementDashboard\">\n <EntityFinderModal\n configuration={{\n initialScope: FinderScope.ALL_PROJECTS,\n initialContainer: null,\n selectMultiple: false,\n selectableTypes: [EntityType.project],\n treeOnly: true,\n }}\n show={showEntityFinder}\n onCancel={() => {\n setShowEntityFinder(false)\n }}\n title={'Select Project to Filter Access Requirements'}\n promptCopy={\n 'Select a project to find Access Requirements that are associated with that project. Access Requirements will be found if the Access Requirement is applied to the project, or if it is applied to any item inside the project.'\n }\n onConfirm={selected => {\n setRelatedProjectId(selected[0].targetId)\n setShowEntityFinder(false)\n }}\n confirmButtonCopy={'Select'}\n />\n <Grid component={'form'} container spacing={2} className=\"InputPanel\">\n <Grid size={{ xs: 12, md: 4 }}>\n <TextField\n label=\"Filter by Access Requirement Name or ID\"\n id=\"ar-name-filter\"\n type=\"text\"\n fullWidth\n placeholder=\"Search for an Access Requirement Name or ID\"\n onChange={e => {\n setNameOrID(e.target.value)\n }}\n slotProps={{\n input: {\n endAdornment: (\n <InputAdornment position=\"end\">\n <SearchOutlined />\n </InputAdornment>\n ),\n },\n }}\n />\n </Grid>\n <Grid\n size={{ xs: 12, md: 4 }}\n sx={{\n display: 'flex',\n gap: '5px',\n alignItems: 'stretch',\n }}\n >\n <TextField\n label=\"Filter by Project\"\n id=\"project-id-filter\"\n type=\"text\"\n fullWidth\n placeholder=\"Enter a project SynID\"\n error={projectFilterFieldIsError}\n helperText={\n projectFilterFieldIsError\n ? 'Value must be a Synapse ID, e.g. \"syn1234\"'\n : undefined\n }\n onChange={e => {\n const newValue = e.target.value\n if (newValue === '') {\n setRelatedProjectId(undefined)\n } else {\n setRelatedProjectId(newValue)\n }\n }}\n />\n <InputSizedButton\n variant=\"outlined\"\n color=\"primary\"\n onClick={() => {\n setShowEntityFinder(true)\n }}\n >\n Browse\n </InputSizedButton>\n </Grid>\n <Grid size={{ xs: 12, md: 4 }}>\n <Typography\n component=\"label\"\n variant=\"smallText2\"\n htmlFor=\"reviewer-filter\"\n >\n Filter by Reviewer\n </Typography>\n <UserSearchBoxV2\n inputId=\"reviewer-filter\"\n placeholder=\"Search for a username or team name\"\n defaultValue={reviewerId}\n onChange={onReviewerChange}\n />\n </Grid>\n </Grid>\n <AccessRequirementTable\n nameOrID={nameOrID}\n relatedProjectId={relatedProjectId}\n reviewerId={reviewerId}\n onCreateNewAccessRequirementClicked={\n onCreateNewAccessRequirementClicked\n }\n typeFilter={typeFilter}\n onTypeFilterChange={setTypeFilter}\n />\n </div>\n )\n}\n\nexport default AccessRequirementDashboard\n"],"names":["AR_NAME_OR_ID_SEARCH_PARAM_KEY","RELATED_PROJECT_ID_SEARCH_PARAM_KEY","REVIEWER_ID_SEARCH_PARAM_KEY","AR_TYPE_SEARCH_PARAM_KEY","AccessRequirementDashboard","props","onCreateNewAccessRequirementClicked","location","useLocation","urlSearchParams","useMemo","navigate","useNavigate","nameOrID","setNameOrID","useDebouncedState","relatedProjectId","setRelatedProjectId","reviewerId","setReviewerId","typeFilter","setTypeFilter","useState","projectFilterFieldIsError","SYNAPSE_ENTITY_ID_REGEX","showEntityFinder","setShowEntityFinder","useEffect","params","omitBy","item","paramsObject","onReviewerChange","useCallback","selected","jsxs","jsx","EntityFinderModal","FinderScope","EntityType","Grid","TextField","InputAdornment","SearchOutlined","newValue","InputSizedButton","Typography","UserSearchBoxV2","AccessRequirementTable"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"AccessRequirementDashboard.js","sources":["../../../src/components/dataaccess/AccessRequirementDashboard.tsx"],"sourcesContent":["import { InputSizedButton } from '@/components/styled/InputSizedButton'\nimport { SYNAPSE_ENTITY_ID_REGEX } from '@/utils/functions/RegularExpressions'\nimport { SearchOutlined } from '@mui/icons-material'\nimport { Grid, InputAdornment, TextField, Typography } from '@mui/material'\nimport { useDebouncedState } from '@react-hookz/web'\nimport { EntityType } from '@sage-bionetworks/synapse-client'\nimport { omitBy } from 'lodash-es'\nimport { useCallback, useEffect, useMemo, useState } from 'react'\nimport { useLocation, useNavigate } from 'react-router'\nimport { EntityFinderModal } from '../EntityFinder/EntityFinderModal'\nimport { FinderScope } from '../EntityFinder/tree/EntityTree'\nimport UserSearchBox from '../UserSearchBox/UserSearchBox'\nimport { AccessRequirementTable } from './AccessRequirementTable'\n\nexport const AR_NAME_OR_ID_SEARCH_PARAM_KEY = 'nameOrID'\nexport const RELATED_PROJECT_ID_SEARCH_PARAM_KEY = 'relatedProjectId'\nexport const REVIEWER_ID_SEARCH_PARAM_KEY = 'reviewerId'\nexport const AR_TYPE_SEARCH_PARAM_KEY = 'type'\n\nexport type AccessRequirementDashboardProps = {\n onCreateNewAccessRequirementClicked?: () => void\n}\n\nexport function AccessRequirementDashboard(\n props: AccessRequirementDashboardProps,\n) {\n // Amount of time to wait after an input value changes before sending a new request\n const INPUT_CHANGE_DEBOUNCE_DELAY_MS = 500\n\n const { onCreateNewAccessRequirementClicked } = props\n\n const location = useLocation()\n const urlSearchParams = useMemo(\n () => new URLSearchParams(location.search),\n [location.search],\n )\n const navigate = useNavigate()\n\n /**\n * When an input changes, update the props passed to the table and update the search params.\n *\n * Debounced to prevent firing many queries while the user is entering text.\n */\n const [nameOrID, setNameOrID] = useDebouncedState<string>(\n urlSearchParams.get(AR_NAME_OR_ID_SEARCH_PARAM_KEY) ?? '',\n INPUT_CHANGE_DEBOUNCE_DELAY_MS,\n )\n const [relatedProjectId, setRelatedProjectId] = useDebouncedState<\n string | undefined\n >(\n urlSearchParams.get(RELATED_PROJECT_ID_SEARCH_PARAM_KEY) ?? undefined,\n INPUT_CHANGE_DEBOUNCE_DELAY_MS,\n )\n const [reviewerId, setReviewerId] = useDebouncedState<string | undefined>(\n urlSearchParams.get(REVIEWER_ID_SEARCH_PARAM_KEY) ?? undefined,\n INPUT_CHANGE_DEBOUNCE_DELAY_MS,\n )\n const [typeFilter, setTypeFilter] = useState<string | undefined>(\n urlSearchParams.get(AR_TYPE_SEARCH_PARAM_KEY) ?? undefined,\n )\n\n const projectFilterFieldIsError: boolean = useMemo(\n () =>\n !!(relatedProjectId && !SYNAPSE_ENTITY_ID_REGEX.exec(relatedProjectId)),\n [relatedProjectId],\n )\n\n const [showEntityFinder, setShowEntityFinder] = useState(false)\n\n // Update the QueryParams when the filter state changes\n useEffect(() => {\n // Don't include undefined/empty parameters\n const params = omitBy(\n {\n // Sync the search params state with the debounced props\n [AR_NAME_OR_ID_SEARCH_PARAM_KEY]: nameOrID,\n [RELATED_PROJECT_ID_SEARCH_PARAM_KEY]: relatedProjectId,\n [REVIEWER_ID_SEARCH_PARAM_KEY]: reviewerId,\n [AR_TYPE_SEARCH_PARAM_KEY]: typeFilter, // typeFilter state is not debounced\n },\n item => item === undefined || item === '',\n ) as Record<string, string>\n\n // Add the new params to the URL\n // Replace history because intuitively, the user has not navigated to a new page\n const paramsObject = new URLSearchParams(params)\n navigate(\n {\n pathname: location.pathname,\n search: paramsObject.toString(),\n },\n { replace: true },\n )\n }, [\n nameOrID,\n relatedProjectId,\n reviewerId,\n typeFilter,\n navigate,\n location.pathname,\n ])\n\n const onReviewerChange = useCallback(\n (selected: string | null) => {\n if (selected) {\n setReviewerId(selected)\n } else {\n setReviewerId(undefined)\n }\n },\n [setReviewerId],\n )\n\n return (\n <div className=\"AccessRequirementDashboard\">\n <EntityFinderModal\n configuration={{\n initialScope: FinderScope.ALL_PROJECTS,\n initialContainer: null,\n selectMultiple: false,\n selectableTypes: [EntityType.project],\n treeOnly: true,\n }}\n show={showEntityFinder}\n onCancel={() => {\n setShowEntityFinder(false)\n }}\n title={'Select Project to Filter Access Requirements'}\n promptCopy={\n 'Select a project to find Access Requirements that are associated with that project. Access Requirements will be found if the Access Requirement is applied to the project, or if it is applied to any item inside the project.'\n }\n onConfirm={selected => {\n setRelatedProjectId(selected[0].targetId)\n setShowEntityFinder(false)\n }}\n confirmButtonCopy={'Select'}\n />\n <Grid component={'form'} container spacing={2} className=\"InputPanel\">\n <Grid size={{ xs: 12, md: 4 }}>\n <TextField\n label=\"Filter by Access Requirement Name or ID\"\n id=\"ar-name-filter\"\n type=\"text\"\n fullWidth\n placeholder=\"Search for an Access Requirement Name or ID\"\n onChange={e => {\n setNameOrID(e.target.value)\n }}\n slotProps={{\n input: {\n endAdornment: (\n <InputAdornment position=\"end\">\n <SearchOutlined />\n </InputAdornment>\n ),\n },\n }}\n />\n </Grid>\n <Grid\n size={{ xs: 12, md: 4 }}\n sx={{\n display: 'flex',\n gap: '5px',\n alignItems: 'stretch',\n }}\n >\n <TextField\n label=\"Filter by Project\"\n id=\"project-id-filter\"\n type=\"text\"\n fullWidth\n placeholder=\"Enter a project SynID\"\n error={projectFilterFieldIsError}\n helperText={\n projectFilterFieldIsError\n ? 'Value must be a Synapse ID, e.g. \"syn1234\"'\n : undefined\n }\n onChange={e => {\n const newValue = e.target.value\n if (newValue === '') {\n setRelatedProjectId(undefined)\n } else {\n setRelatedProjectId(newValue)\n }\n }}\n />\n <InputSizedButton\n variant=\"outlined\"\n color=\"primary\"\n onClick={() => {\n setShowEntityFinder(true)\n }}\n >\n Browse\n </InputSizedButton>\n </Grid>\n <Grid size={{ xs: 12, md: 4 }}>\n <Typography\n component=\"label\"\n variant=\"smallText2\"\n htmlFor=\"reviewer-filter\"\n >\n Filter by Reviewer\n </Typography>\n <UserSearchBox\n inputId=\"reviewer-filter\"\n placeholder=\"Search for a username or team name\"\n defaultValue={reviewerId}\n onChange={onReviewerChange}\n />\n </Grid>\n </Grid>\n <AccessRequirementTable\n nameOrID={nameOrID}\n relatedProjectId={relatedProjectId}\n reviewerId={reviewerId}\n onCreateNewAccessRequirementClicked={\n onCreateNewAccessRequirementClicked\n }\n typeFilter={typeFilter}\n onTypeFilterChange={setTypeFilter}\n />\n </div>\n )\n}\n\nexport default AccessRequirementDashboard\n"],"names":["AR_NAME_OR_ID_SEARCH_PARAM_KEY","RELATED_PROJECT_ID_SEARCH_PARAM_KEY","REVIEWER_ID_SEARCH_PARAM_KEY","AR_TYPE_SEARCH_PARAM_KEY","AccessRequirementDashboard","props","onCreateNewAccessRequirementClicked","location","useLocation","urlSearchParams","useMemo","navigate","useNavigate","nameOrID","setNameOrID","useDebouncedState","relatedProjectId","setRelatedProjectId","reviewerId","setReviewerId","typeFilter","setTypeFilter","useState","projectFilterFieldIsError","SYNAPSE_ENTITY_ID_REGEX","showEntityFinder","setShowEntityFinder","useEffect","params","omitBy","item","paramsObject","onReviewerChange","useCallback","selected","jsxs","jsx","EntityFinderModal","FinderScope","EntityType","Grid","TextField","InputAdornment","SearchOutlined","newValue","InputSizedButton","Typography","UserSearchBox","AccessRequirementTable"],"mappings":"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"}
|
|
@@ -30,7 +30,7 @@ import { useLocation as Y, useNavigate as O } from "react-router";
|
|
|
30
30
|
import "@sage-bionetworks/synapse-client";
|
|
31
31
|
import "../../utils/types/IsType.js";
|
|
32
32
|
import { useIsCurrentUserACTMember as V } from "../../synapse-queries/user/useUserBundle.js";
|
|
33
|
-
import w from "../UserSearchBox/
|
|
33
|
+
import w from "../UserSearchBox/UserSearchBox.js";
|
|
34
34
|
import { AccessRequestSubmissionTable as j } from "./AccessRequestSubmissionTable.js";
|
|
35
35
|
import k from "./AccessRequirementSearchBox/AccessRequirementSearchBox.js";
|
|
36
36
|
const G = (r) => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AccessSubmissionDashboard.js","sources":["../../../src/components/dataaccess/AccessSubmissionDashboard.tsx"],"sourcesContent":["import React from 'react'\nimport { useIsCurrentUserACTMember } from '@/synapse-queries/index'\nimport { useDebouncedEffect } from '@/utils/hooks/useDebouncedEffect'\nimport { ACT_TEAM_ID } from '@/utils/SynapseConstants'\nimport {\n Checkbox,\n FormControlLabel,\n Grid,\n Tooltip,\n Typography,\n} from '@mui/material'\nimport {\n SubmissionReviewerFilterType,\n SubmissionState,\n TYPE_FILTER,\n} from '@sage-bionetworks/synapse-types'\nimport { omitBy } from 'lodash-es'\nimport { useCallback, useEffect, useState } from 'react'\nimport { useLocation, useNavigate } from 'react-router'\nimport UserSearchBoxV2 from '../UserSearchBox/UserSearchBoxV2'\nimport {\n AccessRequestSubmissionTable,\n AccessRequestSubmissionTableProps,\n} from './AccessRequestSubmissionTable'\nimport AccessRequirementSearchBox from './AccessRequirementSearchBox/AccessRequirementSearchBox'\n\nexport const getReviewerFilterID = (selected: string | null) => {\n if (selected && selected !== ACT_TEAM_ID.toString()) {\n return selected\n } else {\n return undefined\n }\n}\n\nexport const DataAccessSubmissionDashboard = (): React.ReactNode => {\n const [accessRequirementId, setAccessRequirementId] = useState<\n string | undefined\n >()\n const [accessorId, setAccessorId] = useState<string | undefined>()\n const [reviewerId, setReviewerId] = useState<string | undefined>()\n const [reviewerFilterType, setReviewerFilterType] = useState<\n SubmissionReviewerFilterType | undefined\n >(SubmissionReviewerFilterType.ALL)\n const [tableProps, setTableProps] =\n useState<AccessRequestSubmissionTableProps>({\n accessRequirementId,\n accessorId,\n reviewerId,\n showRequesters: true,\n submissionState: SubmissionState.SUBMITTED,\n })\n\n const location = useLocation()\n const navigate = useNavigate()\n const INPUT_CHANGE_DEBOUNCE_DELAY_MS = 500\n\n const { data: isACT } = useIsCurrentUserACTMember()\n\n useEffect(() => {\n const initializeFromSearchParam = () => {\n const initialParams = new URLSearchParams(location.search)\n setAccessRequirementId(\n initialParams.get('accessRequirementId') ?? undefined,\n )\n setAccessorId(initialParams.get('accessorId') ?? undefined)\n setReviewerId(initialParams.get('reviewerId') ?? undefined)\n setReviewerFilterType(\n (initialParams.get(\n 'reviewerFilterType',\n ) as SubmissionReviewerFilterType) ?? undefined,\n )\n }\n initializeFromSearchParam()\n }, [location.search])\n\n const onRequesterChange = useCallback((selected: string | null) => {\n if (selected) {\n setAccessorId(selected)\n } else {\n setAccessorId(undefined)\n }\n }, [])\n\n const onReviewerChange = useCallback((selected: string | null) => {\n setReviewerId(getReviewerFilterID(selected))\n }, [])\n\n useDebouncedEffect(\n () => {\n const updateQueryParams = (\n accessRequirementId: string | undefined,\n accessorId: string | undefined,\n reviewerId: string | undefined,\n reviewerFilterType: SubmissionReviewerFilterType | undefined,\n ) => {\n const params = new URLSearchParams(\n omitBy(\n {\n accessRequirementId,\n accessorId,\n reviewerId,\n reviewerFilterType,\n },\n item => item === undefined || item === '',\n ) as Record<string, string>,\n )\n navigate(\n {\n pathname: location.pathname,\n search: params.toString(),\n },\n { replace: true },\n )\n }\n\n updateQueryParams(\n accessRequirementId,\n accessorId,\n reviewerId,\n reviewerFilterType,\n )\n setTableProps({\n accessRequirementId,\n accessorId,\n reviewerId,\n reviewerFilterType,\n showRequesters: true,\n submissionState: SubmissionState.SUBMITTED,\n })\n },\n [\n accessRequirementId,\n accessorId,\n reviewerId,\n reviewerFilterType,\n navigate,\n location.pathname,\n ],\n INPUT_CHANGE_DEBOUNCE_DELAY_MS,\n )\n\n return (\n <div className=\"AccessSubmissionDashboard\">\n <Grid\n container\n spacing={2}\n className=\"InputPanel\"\n sx={{ alignItems: 'stretch' }}\n >\n <Grid size={{ xs: 12, md: 4 }}>\n <Typography\n component=\"label\"\n variant=\"smallText2\"\n htmlFor=\"arId-filter\"\n >\n Filter by Access Requirement Name\n </Typography>\n <AccessRequirementSearchBox\n inputId=\"arId-filter\"\n onChange={setAccessRequirementId}\n placeholder=\"Search for an Access Requirement Name \"\n />\n </Grid>\n <Grid size={{ xs: 12, md: 4 }}>\n <Typography\n component=\"label\"\n variant=\"smallText2\"\n htmlFor=\"requester-filter\"\n >\n Filter by Requester\n </Typography>\n <UserSearchBoxV2\n inputId=\"requester-filter\"\n placeholder=\"Search for a user name\"\n defaultValue={accessorId}\n onChange={onRequesterChange}\n typeFilter={TYPE_FILTER.USERS_ONLY}\n />\n </Grid>\n <Grid size={{ xs: 12, md: 4 }}>\n <Typography\n component=\"label\"\n variant=\"smallText2\"\n htmlFor=\"reviewer-filter\"\n >\n Filter by Reviewer\n </Typography>\n <UserSearchBoxV2\n inputId=\"reviewer-filter\"\n placeholder=\"Search for a user or team name\"\n defaultValue={reviewerId}\n onChange={onReviewerChange}\n />\n </Grid>\n {isACT && (\n <Grid size={12} sx={{ textAlign: 'right' }}>\n <Tooltip\n title={\n 'This will hide submissions that have a reviewer specifically assigned.'\n }\n >\n <FormControlLabel\n control={<Checkbox />}\n value={\n reviewerFilterType === SubmissionReviewerFilterType.ACT_ONLY\n }\n label=\"Reviewed by ACT only\"\n onChange={(_, checked) => {\n const newValue = checked\n ? SubmissionReviewerFilterType.ACT_ONLY\n : SubmissionReviewerFilterType.ALL\n setReviewerFilterType(newValue)\n }}\n />\n </Tooltip>\n </Grid>\n )}\n </Grid>\n\n <Typography variant=\"headline3\">Access Request Submissions</Typography>\n <AccessRequestSubmissionTable {...tableProps} />\n </div>\n )\n}\n"],"names":["getReviewerFilterID","selected","ACT_TEAM_ID","DataAccessSubmissionDashboard","accessRequirementId","setAccessRequirementId","useState","accessorId","setAccessorId","reviewerId","setReviewerId","reviewerFilterType","setReviewerFilterType","SubmissionReviewerFilterType","tableProps","setTableProps","SubmissionState","location","useLocation","navigate","useNavigate","INPUT_CHANGE_DEBOUNCE_DELAY_MS","isACT","useIsCurrentUserACTMember","useEffect","initialParams","onRequesterChange","useCallback","onReviewerChange","useDebouncedEffect","params","omitBy","item","jsxs","Grid","jsx","Typography","AccessRequirementSearchBox","UserSearchBoxV2","TYPE_FILTER","Tooltip","FormControlLabel","Checkbox","_","checked","newValue","AccessRequestSubmissionTable"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"AccessSubmissionDashboard.js","sources":["../../../src/components/dataaccess/AccessSubmissionDashboard.tsx"],"sourcesContent":["import React from 'react'\nimport { useIsCurrentUserACTMember } from '@/synapse-queries/index'\nimport { useDebouncedEffect } from '@/utils/hooks/useDebouncedEffect'\nimport { ACT_TEAM_ID } from '@/utils/SynapseConstants'\nimport {\n Checkbox,\n FormControlLabel,\n Grid,\n Tooltip,\n Typography,\n} from '@mui/material'\nimport {\n SubmissionReviewerFilterType,\n SubmissionState,\n TYPE_FILTER,\n} from '@sage-bionetworks/synapse-types'\nimport { omitBy } from 'lodash-es'\nimport { useCallback, useEffect, useState } from 'react'\nimport { useLocation, useNavigate } from 'react-router'\nimport UserSearchBox from '../UserSearchBox/UserSearchBox'\nimport {\n AccessRequestSubmissionTable,\n AccessRequestSubmissionTableProps,\n} from './AccessRequestSubmissionTable'\nimport AccessRequirementSearchBox from './AccessRequirementSearchBox/AccessRequirementSearchBox'\n\nexport const getReviewerFilterID = (selected: string | null) => {\n if (selected && selected !== ACT_TEAM_ID.toString()) {\n return selected\n } else {\n return undefined\n }\n}\n\nexport const DataAccessSubmissionDashboard = (): React.ReactNode => {\n const [accessRequirementId, setAccessRequirementId] = useState<\n string | undefined\n >()\n const [accessorId, setAccessorId] = useState<string | undefined>()\n const [reviewerId, setReviewerId] = useState<string | undefined>()\n const [reviewerFilterType, setReviewerFilterType] = useState<\n SubmissionReviewerFilterType | undefined\n >(SubmissionReviewerFilterType.ALL)\n const [tableProps, setTableProps] =\n useState<AccessRequestSubmissionTableProps>({\n accessRequirementId,\n accessorId,\n reviewerId,\n showRequesters: true,\n submissionState: SubmissionState.SUBMITTED,\n })\n\n const location = useLocation()\n const navigate = useNavigate()\n const INPUT_CHANGE_DEBOUNCE_DELAY_MS = 500\n\n const { data: isACT } = useIsCurrentUserACTMember()\n\n useEffect(() => {\n const initializeFromSearchParam = () => {\n const initialParams = new URLSearchParams(location.search)\n setAccessRequirementId(\n initialParams.get('accessRequirementId') ?? undefined,\n )\n setAccessorId(initialParams.get('accessorId') ?? undefined)\n setReviewerId(initialParams.get('reviewerId') ?? undefined)\n setReviewerFilterType(\n (initialParams.get(\n 'reviewerFilterType',\n ) as SubmissionReviewerFilterType) ?? undefined,\n )\n }\n initializeFromSearchParam()\n }, [location.search])\n\n const onRequesterChange = useCallback((selected: string | null) => {\n if (selected) {\n setAccessorId(selected)\n } else {\n setAccessorId(undefined)\n }\n }, [])\n\n const onReviewerChange = useCallback((selected: string | null) => {\n setReviewerId(getReviewerFilterID(selected))\n }, [])\n\n useDebouncedEffect(\n () => {\n const updateQueryParams = (\n accessRequirementId: string | undefined,\n accessorId: string | undefined,\n reviewerId: string | undefined,\n reviewerFilterType: SubmissionReviewerFilterType | undefined,\n ) => {\n const params = new URLSearchParams(\n omitBy(\n {\n accessRequirementId,\n accessorId,\n reviewerId,\n reviewerFilterType,\n },\n item => item === undefined || item === '',\n ) as Record<string, string>,\n )\n navigate(\n {\n pathname: location.pathname,\n search: params.toString(),\n },\n { replace: true },\n )\n }\n\n updateQueryParams(\n accessRequirementId,\n accessorId,\n reviewerId,\n reviewerFilterType,\n )\n setTableProps({\n accessRequirementId,\n accessorId,\n reviewerId,\n reviewerFilterType,\n showRequesters: true,\n submissionState: SubmissionState.SUBMITTED,\n })\n },\n [\n accessRequirementId,\n accessorId,\n reviewerId,\n reviewerFilterType,\n navigate,\n location.pathname,\n ],\n INPUT_CHANGE_DEBOUNCE_DELAY_MS,\n )\n\n return (\n <div className=\"AccessSubmissionDashboard\">\n <Grid\n container\n spacing={2}\n className=\"InputPanel\"\n sx={{ alignItems: 'stretch' }}\n >\n <Grid size={{ xs: 12, md: 4 }}>\n <Typography\n component=\"label\"\n variant=\"smallText2\"\n htmlFor=\"arId-filter\"\n >\n Filter by Access Requirement Name\n </Typography>\n <AccessRequirementSearchBox\n inputId=\"arId-filter\"\n onChange={setAccessRequirementId}\n placeholder=\"Search for an Access Requirement Name \"\n />\n </Grid>\n <Grid size={{ xs: 12, md: 4 }}>\n <Typography\n component=\"label\"\n variant=\"smallText2\"\n htmlFor=\"requester-filter\"\n >\n Filter by Requester\n </Typography>\n <UserSearchBox\n inputId=\"requester-filter\"\n placeholder=\"Search for a user name\"\n defaultValue={accessorId}\n onChange={onRequesterChange}\n typeFilter={TYPE_FILTER.USERS_ONLY}\n />\n </Grid>\n <Grid size={{ xs: 12, md: 4 }}>\n <Typography\n component=\"label\"\n variant=\"smallText2\"\n htmlFor=\"reviewer-filter\"\n >\n Filter by Reviewer\n </Typography>\n <UserSearchBox\n inputId=\"reviewer-filter\"\n placeholder=\"Search for a user or team name\"\n defaultValue={reviewerId}\n onChange={onReviewerChange}\n />\n </Grid>\n {isACT && (\n <Grid size={12} sx={{ textAlign: 'right' }}>\n <Tooltip\n title={\n 'This will hide submissions that have a reviewer specifically assigned.'\n }\n >\n <FormControlLabel\n control={<Checkbox />}\n value={\n reviewerFilterType === SubmissionReviewerFilterType.ACT_ONLY\n }\n label=\"Reviewed by ACT only\"\n onChange={(_, checked) => {\n const newValue = checked\n ? SubmissionReviewerFilterType.ACT_ONLY\n : SubmissionReviewerFilterType.ALL\n setReviewerFilterType(newValue)\n }}\n />\n </Tooltip>\n </Grid>\n )}\n </Grid>\n\n <Typography variant=\"headline3\">Access Request Submissions</Typography>\n <AccessRequestSubmissionTable {...tableProps} />\n </div>\n )\n}\n"],"names":["getReviewerFilterID","selected","ACT_TEAM_ID","DataAccessSubmissionDashboard","accessRequirementId","setAccessRequirementId","useState","accessorId","setAccessorId","reviewerId","setReviewerId","reviewerFilterType","setReviewerFilterType","SubmissionReviewerFilterType","tableProps","setTableProps","SubmissionState","location","useLocation","navigate","useNavigate","INPUT_CHANGE_DEBOUNCE_DELAY_MS","isACT","useIsCurrentUserACTMember","useEffect","initialParams","onRequesterChange","useCallback","onReviewerChange","useDebouncedEffect","params","omitBy","item","jsxs","Grid","jsx","Typography","AccessRequirementSearchBox","UserSearchBox","TYPE_FILTER","Tooltip","FormControlLabel","Checkbox","_","checked","newValue","AccessRequestSubmissionTable"],"mappings":"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"}
|