synapse-react-client 4.0.3 → 4.0.4
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/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.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.js +7 -7
- package/dist/components/BasePortalCard/ColorfulPortalCardWithChips/ColorfulPortalCardWithChips.module.scss +13 -5
- package/dist/components/BasePortalCard/ColorfulPortalCardWithChips/ColorfulPortalCardWithChips.module.scss.js +5 -5
- 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/SynapseSearchPageResults/HasAccessChip.js +1 -1
- package/dist/components/SynapseSearchPageResults/SearchPagePortalBanners.d.ts.map +1 -1
- package/dist/components/SynapseSearchPageResults/SearchPagePortalBanners.js +12 -13
- 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 +103 -0
- package/dist/components/styled/HoverPopover.js.map +1 -0
- package/dist/components/styled/HoverPopover.module.scss +9 -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 +14 -15
- 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/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
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AcknowledgementsPage.js","sources":["../../../src/components/AcknowledgementsPage/AcknowledgementsPage.tsx"],"sourcesContent":["import { Box, Button, Container, Link, Typography } from '@mui/material'\nimport { useCallback, useState } from 'react'\nimport { ReactComponent as AcknowledgementStatementsIllustration } from '../../assets/illustrations/acknowledgement_statements_illustration.svg'\nimport TextToComponentCollapse from '../TextToComponentCollapse'\nimport AcknowledgementsDialog from './AcknowledgementsDialog'\nimport { MarkdownSynapseProps } from '../Markdown/MarkdownSynapse'\nimport MarkdownCollapse from '../Markdown/MarkdownCollapse'\nimport { StudyAcknowledgements } from './StudyAcknowledgements'\nimport { LaunchTwoTone } from '@mui/icons-material'\nexport type AcknowledgementPageProps = {\n portalName: string\n createDoiHelpUrl: string\n portalAcknowledgementProps?: MarkdownSynapseProps\n dataAvailabilityProps?: MarkdownSynapseProps\n studyAcknowledgementSql: string\n}\n\nexport type AcknowledgementItem = {\n title: string\n statement: string\n}\n\nexport function AcknowledgementPage(props: AcknowledgementPageProps) {\n const {\n portalName,\n createDoiHelpUrl,\n portalAcknowledgementProps,\n dataAvailabilityProps,\n studyAcknowledgementSql,\n } = props\n const [isAcknowledgementsDialogOpen, setAcknowledgementsDialogOpen] =\n useState<boolean>(false)\n\n const [portalAcknowledgement, setPortalAcknowledgement] = useState<string>()\n const [dataAvailabilityStatement, setDataAvailabilityStatement] =\n useState<string>()\n const [acknowledgementItems, setAcknowledgementItems] = useState<\n AcknowledgementItem[]\n >([])\n const handleCloseDialog = useCallback(\n () => setAcknowledgementsDialogOpen(false),\n [],\n )\n return (\n <>\n <Container maxWidth={'lg'} sx={{ mt: '2em', mb: '2em' }}>\n <Typography variant=\"h5\" sx={{ fontWeight: 'bold' }}>\n How to acknowledge data from this portal\n </Typography>\n <hr />\n <Typography variant=\"body1\" sx={{ mb: '1em' }}>\n The data available in the {portalName} would not be possible without\n the participation of research volunteers and the contribution of data\n by collaborating researchers. All use of data from the {portalName}{' '}\n must be acknowledged and referenced appropriately.\n </Typography>\n <Typography variant=\"body1\" sx={{ fontWeight: 'bold', mb: '1em' }}>\n All publications using {portalName} data must include the provided\n statements:\n </Typography>\n <Box sx={{ mb: '2em', svg: { maxWidth: '100%' } }}>\n <AcknowledgementStatementsIllustration />\n </Box>\n <Typography variant=\"h5\" sx={{ fontWeight: 'bold' }}>\n How to use this page:\n </Typography>\n <hr />\n <Typography variant=\"body1\" sx={{ mb: '.5em' }}>\n This page will guide you through creating the acknowledgement\n statements required when publishing with {portalName} data.\n </Typography>\n <Typography\n variant=\"body1\"\n sx={{\n mb: '2em',\n '& li::marker': {\n fontWeight: 'bold', // bold the number\n },\n }}\n >\n <ol>\n <li>\n <strong>Select study acknowledgement statements</strong>\n <br />\n From the list below, select all the studies whose data you used.\n Each study has a pre-written acknowledgement statement that must\n be included in your publication.\n </li>\n <li>\n <strong>Generate compiled statement</strong>\n <br />\n Click the Generate Compiled Statement button at the bottom of the\n page. This will compile:\n <ul>\n <li>The Portal Acknowledgement Statement</li>\n <li>The acknowledgement(s) for the studies you selected</li>\n <li>A template data availability statement</li>\n </ul>\n <i>\n Important: You will need to edit the compiled statement to add a\n brief description of the data used in your manuscript and a DOI\n that points to your dataset.\n </i>\n </li>\n <li>\n <strong>Create a DOI for your dataset</strong>\n <br />\n As part of the data availability statement, you will need to\n create a dataset that captures all files used in your publication\n and mint the dataset with a persistent Digital Object Identifier\n (DOI). For more instructions read \n <Link\n href={createDoiHelpUrl}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n How to get a DOI for your Publication\n </Link>\n </li>\n </ol>\n </Typography>\n <Typography variant=\"h5\" sx={{ fontWeight: 'bold' }}>\n <ol start={1} style={{ paddingInlineStart: '20px' }}>\n <li>Select study acknowledgement statements</li>\n </ol>\n </Typography>\n <hr />\n <Typography variant=\"body1\">\n From the list below, select all studies whose data you used. Each\n study has a pre-written acknowledgement statement that must be\n included in your publication.\n </Typography>\n <Typography variant=\"body1\" sx={{ mb: '2em' }}>\n You can also expand each section for detailed information or click\n \"Copy full statement to clipboard\" to save the text.\n </Typography>\n <StudyAcknowledgements\n sql={studyAcknowledgementSql}\n onSelectChange={(item, checked) => {\n if (checked) {\n // add\n acknowledgementItems.push(item)\n } else {\n // remove\n const index = acknowledgementItems.findIndex(\n i => i.title === item.title && i.statement === item.statement,\n )\n if (index > -1) {\n acknowledgementItems.splice(index, 1)\n }\n }\n setAcknowledgementItems([...acknowledgementItems])\n }}\n />\n <Typography variant=\"h5\" sx={{ fontWeight: 'bold' }}>\n <ol start={2} style={{ paddingInlineStart: '25px' }}>\n <li>Generate compiled statement</li>\n </ol>\n </Typography>\n <hr />\n <Typography variant=\"body1\" sx={{ fontWeight: 'bold', mb: '1em' }}>\n Click to generate a compiled statement for your publication.\n </Typography>\n <Typography variant=\"body1\" sx={{ mb: '1em' }}>\n The generated text will include your selected study acknowledgement\n statements and all other required statements listed below.\n </Typography>\n <Button\n variant=\"contained\"\n onClick={() => setAcknowledgementsDialogOpen(true)}\n sx={{ mb: '3em' }}\n >\n Generate compiled statement\n </Button>\n <TextToComponentCollapse\n text={'Click to see other text included in the compiled statement'}\n textVariant=\"h5\"\n textSx={{ fontSize: '16px', fontWeight: 'bold' }}\n textContainerSx={{ backgroundColor: 'unset', p: 0 }}\n collapseBoxSx={{ backgroundColor: 'unset', p: '20px 0px' }}\n iconSx={{ width: '20px', height: '20px' }}\n >\n {portalAcknowledgementProps && (\n <>\n <Typography variant=\"h5\" sx={{ fontSize: '18px', mb: '1em' }}>\n Portal Acknowledgement Statement (Required)\n </Typography>\n <Typography variant=\"body1\" sx={{ mb: '1em' }}>\n This statement is required and automatically included in the\n compiled statement\n </Typography>\n <MarkdownCollapse\n {...portalAcknowledgementProps}\n setPlainTextResult={setPortalAcknowledgement}\n textDescription=\"full statement\"\n showCopyPlainText={true}\n />\n </>\n )}\n {dataAvailabilityProps && (\n <>\n <Typography variant=\"h5\" sx={{ fontSize: '18px', m: '1em 0' }}>\n Data Availability Statement (Required)\n </Typography>\n <Typography variant=\"body1\" sx={{ mb: '1em' }}>\n This statement is required and automatically included in the\n compiled statement\n </Typography>\n <MarkdownCollapse\n {...dataAvailabilityProps}\n setPlainTextResult={setDataAvailabilityStatement}\n textDescription=\"full statement\"\n showCopyPlainText={true}\n />\n </>\n )}\n </TextToComponentCollapse>\n <hr />\n <Typography variant=\"h5\" sx={{ fontWeight: 'bold' }}>\n <ol start={3} style={{ paddingInlineStart: '25px' }}>\n <li>Create a DOI for your dataset</li>\n </ol>\n </Typography>\n <hr />\n <Typography variant=\"body1\" sx={{ mb: '1em' }}>\n A digital object identifier (DOI) provides a persistent identifier\n that allows readers to find the data cited in your publication.\n Creating a DOI in the Synapse platform is free and required as part of\n the data availability statement.\n </Typography>\n\n <Button\n variant=\"outlined\"\n href={createDoiHelpUrl}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n <LaunchTwoTone sx={{ mr: '0.5em' }} />\n Learn how to get a DOI for your publication\n </Button>\n </Container>\n\n <AcknowledgementsDialog\n open={isAcknowledgementsDialogOpen}\n onClose={handleCloseDialog}\n createDoiHelpUrl={createDoiHelpUrl}\n portalAcknowledgement={portalAcknowledgement}\n dataAvailabilityStatement={dataAvailabilityStatement}\n studyAcknowledgements={acknowledgementItems}\n />\n </>\n )\n}\n\nexport default AcknowledgementPage\n"],"names":["AcknowledgementPage","props","portalName","createDoiHelpUrl","portalAcknowledgementProps","dataAvailabilityProps","studyAcknowledgementSql","isAcknowledgementsDialogOpen","setAcknowledgementsDialogOpen","useState","portalAcknowledgement","setPortalAcknowledgement","dataAvailabilityStatement","setDataAvailabilityStatement","acknowledgementItems","setAcknowledgementItems","handleCloseDialog","useCallback","jsxs","Fragment","Container","jsx","Typography","Box","AcknowledgementStatementsIllustration","Link","StudyAcknowledgements","item","checked","index","i","Button","TextToComponentCollapse","MarkdownCollapse","LaunchTwoTone","AcknowledgementsDialog"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"AcknowledgementsPage.js","sources":["../../../src/components/AcknowledgementsPage/AcknowledgementsPage.tsx"],"sourcesContent":["import { Box, Button, Container, Link, Typography } from '@mui/material'\nimport { useCallback, useState } from 'react'\nimport { ReactComponent as AcknowledgementStatementsIllustration } from '../../assets/illustrations/acknowledgement_statements_illustration.svg'\nimport TextToComponentCollapse from '../TextToComponentCollapse'\nimport AcknowledgementsDialog from './AcknowledgementsDialog'\nimport { MarkdownSynapseProps } from '../Markdown/MarkdownSynapse'\nimport MarkdownCollapse from '../Markdown/MarkdownCollapse'\nimport { StudyAcknowledgements } from './StudyAcknowledgements'\nimport { LaunchTwoTone } from '@mui/icons-material'\nexport type AcknowledgementPageProps = {\n portalName: string\n createDoiHelpUrl: string\n portalAcknowledgementProps?: MarkdownSynapseProps\n dataAvailabilityProps?: MarkdownSynapseProps\n studyAcknowledgementSql: string\n}\n\nexport type AcknowledgementItem = {\n title: string\n statement: string\n}\n\nexport function AcknowledgementPage(props: AcknowledgementPageProps) {\n const {\n portalName,\n createDoiHelpUrl,\n portalAcknowledgementProps,\n dataAvailabilityProps,\n studyAcknowledgementSql,\n } = props\n const [isAcknowledgementsDialogOpen, setAcknowledgementsDialogOpen] =\n useState<boolean>(false)\n\n const [portalAcknowledgement, setPortalAcknowledgement] = useState<string>()\n const [dataAvailabilityStatement, setDataAvailabilityStatement] =\n useState<string>()\n const [acknowledgementItems, setAcknowledgementItems] = useState<\n AcknowledgementItem[]\n >([])\n const handleCloseDialog = useCallback(\n () => setAcknowledgementsDialogOpen(false),\n [],\n )\n return (\n <>\n <Container maxWidth={'lg'} sx={{ mt: '2em', mb: '2em' }}>\n <Typography variant=\"h5\" sx={{ fontWeight: 'bold' }}>\n How to acknowledge data from this portal\n </Typography>\n <hr />\n <Typography variant=\"body1\" sx={{ mb: '1em' }}>\n The data available in the {portalName} would not be possible without\n the participation of research volunteers and the contribution of data\n by collaborating researchers. All use of data from the {portalName}{' '}\n must be acknowledged and referenced appropriately.\n </Typography>\n <Typography variant=\"body1\" sx={{ fontWeight: 'bold', mb: '1em' }}>\n All publications using {portalName} data must include the provided\n statements:\n </Typography>\n <Box sx={{ mb: '2em', svg: { maxWidth: '100%' } }}>\n <AcknowledgementStatementsIllustration />\n </Box>\n <Typography variant=\"h5\" sx={{ fontWeight: 'bold' }}>\n How to use this page:\n </Typography>\n <hr />\n <Typography variant=\"body1\" sx={{ mb: '.5em' }}>\n This page will guide you through creating the acknowledgement\n statements required when publishing with {portalName} data.\n </Typography>\n <Typography\n variant=\"body1\"\n component={'div'}\n sx={{\n mb: '2em',\n '& li::marker': {\n fontWeight: 'bold', // bold the number\n },\n }}\n >\n <ol>\n <li>\n <strong>Select study acknowledgement statements</strong>\n <br />\n From the list below, select all the studies whose data you used.\n Each study has a pre-written acknowledgement statement that must\n be included in your publication.\n </li>\n <li>\n <strong>Generate compiled statement</strong>\n <br />\n Click the Generate Compiled Statement button at the bottom of the\n page. This will compile:\n <ul>\n <li>The Portal Acknowledgement Statement</li>\n <li>The acknowledgement(s) for the studies you selected</li>\n <li>A template data availability statement</li>\n </ul>\n <i>\n Important: You will need to edit the compiled statement to add a\n brief description of the data used in your manuscript and a DOI\n that points to your dataset.\n </i>\n </li>\n <li>\n <strong>Create a DOI for your dataset</strong>\n <br />\n As part of the data availability statement, you will need to\n create a dataset that captures all files used in your publication\n and mint the dataset with a persistent Digital Object Identifier\n (DOI). For more instructions read \n <Link\n href={createDoiHelpUrl}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n How to get a DOI for your Publication\n </Link>\n </li>\n </ol>\n </Typography>\n <Typography component={'div'} variant=\"h5\" sx={{ fontWeight: 'bold' }}>\n <ol start={1} style={{ paddingInlineStart: '20px' }}>\n <li>Select study acknowledgement statements</li>\n </ol>\n </Typography>\n <hr />\n <Typography variant=\"body1\">\n From the list below, select all studies whose data you used. Each\n study has a pre-written acknowledgement statement that must be\n included in your publication.\n </Typography>\n <Typography variant=\"body1\" sx={{ mb: '2em' }}>\n You can also expand each section for detailed information or click\n \"Copy full statement to clipboard\" to save the text.\n </Typography>\n <StudyAcknowledgements\n sql={studyAcknowledgementSql}\n onSelectChange={(item, checked) => {\n if (checked) {\n // add\n acknowledgementItems.push(item)\n } else {\n // remove\n const index = acknowledgementItems.findIndex(\n i => i.title === item.title && i.statement === item.statement,\n )\n if (index > -1) {\n acknowledgementItems.splice(index, 1)\n }\n }\n setAcknowledgementItems([...acknowledgementItems])\n }}\n />\n <Typography variant=\"h5\" component={'div'} sx={{ fontWeight: 'bold' }}>\n <ol start={2} style={{ paddingInlineStart: '25px' }}>\n <li>Generate compiled statement</li>\n </ol>\n </Typography>\n <hr />\n <Typography variant=\"body1\" sx={{ fontWeight: 'bold', mb: '1em' }}>\n Click to generate a compiled statement for your publication.\n </Typography>\n <Typography variant=\"body1\" sx={{ mb: '1em' }}>\n The generated text will include your selected study acknowledgement\n statements and all other required statements listed below.\n </Typography>\n <Button\n variant=\"contained\"\n onClick={() => setAcknowledgementsDialogOpen(true)}\n sx={{ mb: '3em' }}\n >\n Generate compiled statement\n </Button>\n <TextToComponentCollapse\n text={'Click to see other text included in the compiled statement'}\n textVariant=\"h5\"\n textSx={{ fontSize: '16px', fontWeight: 'bold' }}\n textContainerSx={{ backgroundColor: 'unset', p: 0 }}\n collapseBoxSx={{ backgroundColor: 'unset', p: '20px 0px' }}\n iconSx={{ width: '20px', height: '20px' }}\n >\n {portalAcknowledgementProps && (\n <>\n <Typography variant=\"h5\" sx={{ fontSize: '18px', mb: '1em' }}>\n Portal Acknowledgement Statement (Required)\n </Typography>\n <Typography variant=\"body1\" sx={{ mb: '1em' }}>\n This statement is required and automatically included in the\n compiled statement\n </Typography>\n <MarkdownCollapse\n {...portalAcknowledgementProps}\n setPlainTextResult={setPortalAcknowledgement}\n textDescription=\"full statement\"\n showCopyPlainText={true}\n />\n </>\n )}\n {dataAvailabilityProps && (\n <>\n <Typography variant=\"h5\" sx={{ fontSize: '18px', m: '1em 0' }}>\n Data Availability Statement (Required)\n </Typography>\n <Typography variant=\"body1\" sx={{ mb: '1em' }}>\n This statement is required and automatically included in the\n compiled statement\n </Typography>\n <MarkdownCollapse\n {...dataAvailabilityProps}\n setPlainTextResult={setDataAvailabilityStatement}\n textDescription=\"full statement\"\n showCopyPlainText={true}\n />\n </>\n )}\n </TextToComponentCollapse>\n <hr />\n <Typography variant=\"h5\" component={'div'} sx={{ fontWeight: 'bold' }}>\n <ol start={3} style={{ paddingInlineStart: '25px' }}>\n <li>Create a DOI for your dataset</li>\n </ol>\n </Typography>\n <hr />\n <Typography variant=\"body1\" sx={{ mb: '1em' }}>\n A digital object identifier (DOI) provides a persistent identifier\n that allows readers to find the data cited in your publication.\n Creating a DOI in the Synapse platform is free and required as part of\n the data availability statement.\n </Typography>\n\n <Button\n variant=\"outlined\"\n href={createDoiHelpUrl}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n <LaunchTwoTone sx={{ mr: '0.5em' }} />\n Learn how to get a DOI for your publication\n </Button>\n </Container>\n\n <AcknowledgementsDialog\n open={isAcknowledgementsDialogOpen}\n onClose={handleCloseDialog}\n createDoiHelpUrl={createDoiHelpUrl}\n portalAcknowledgement={portalAcknowledgement}\n dataAvailabilityStatement={dataAvailabilityStatement}\n studyAcknowledgements={acknowledgementItems}\n />\n </>\n )\n}\n\nexport default AcknowledgementPage\n"],"names":["AcknowledgementPage","props","portalName","createDoiHelpUrl","portalAcknowledgementProps","dataAvailabilityProps","studyAcknowledgementSql","isAcknowledgementsDialogOpen","setAcknowledgementsDialogOpen","useState","portalAcknowledgement","setPortalAcknowledgement","dataAvailabilityStatement","setDataAvailabilityStatement","acknowledgementItems","setAcknowledgementItems","handleCloseDialog","useCallback","jsxs","Fragment","Container","jsx","Typography","Box","AcknowledgementStatementsIllustration","Link","StudyAcknowledgements","item","checked","index","i","Button","TextToComponentCollapse","MarkdownCollapse","LaunchTwoTone","AcknowledgementsDialog"],"mappings":"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"}
|
|
@@ -4,10 +4,10 @@ import { Box as t, Typography as n, Collapse as S, Button as k, Tooltip as D, Fo
|
|
|
4
4
|
import { noop as X } from "lodash-es";
|
|
5
5
|
import { TransitionGroup as j } from "react-transition-group";
|
|
6
6
|
import b from "../IconSvg/IconSvg.js";
|
|
7
|
-
import F from "../UserSearchBox/
|
|
8
|
-
import { AclEditorSkeleton as
|
|
9
|
-
import { ResourceAccessItem as
|
|
10
|
-
const
|
|
7
|
+
import F from "../UserSearchBox/UserSearchBox.js";
|
|
8
|
+
import { AclEditorSkeleton as Y } from "./AclEditorSkeleton.js";
|
|
9
|
+
import { ResourceAccessItem as H } from "./ResourceAccessItem.js";
|
|
10
|
+
const V = "Add a user or team", z = "Make Public", K = "Remove Public Access", W = "Notify people via email";
|
|
11
11
|
function te(v) {
|
|
12
12
|
const {
|
|
13
13
|
resourceAccessList: s,
|
|
@@ -35,7 +35,7 @@ function te(v) {
|
|
|
35
35
|
R
|
|
36
36
|
].filter((i) => i !== void 0);
|
|
37
37
|
if (x || g)
|
|
38
|
-
return /* @__PURE__ */ e(
|
|
38
|
+
return /* @__PURE__ */ e(Y, {});
|
|
39
39
|
const E = !!s.find(
|
|
40
40
|
(i) => f.some((r) => i.principalId === Number(r))
|
|
41
41
|
) ? {
|
|
@@ -74,7 +74,7 @@ function te(v) {
|
|
|
74
74
|
s.length === 0 ? /* @__PURE__ */ e(n, { variant: "body1Italic", children: C }) : /* @__PURE__ */ e(j, { children: s.map((i) => {
|
|
75
75
|
const r = typeof o == "function" ? o(i) : o, N = typeof l == "function" ? l(i) : l, O = u ? u(i) : void 0;
|
|
76
76
|
return /* @__PURE__ */ e(S, { children: /* @__PURE__ */ e(
|
|
77
|
-
|
|
77
|
+
H,
|
|
78
78
|
{
|
|
79
79
|
resourceAccess: i,
|
|
80
80
|
availablePermissionLevels: I,
|
|
@@ -123,7 +123,7 @@ function te(v) {
|
|
|
123
123
|
component: "label",
|
|
124
124
|
variant: "smallText2",
|
|
125
125
|
htmlFor: "reviewer-search",
|
|
126
|
-
children:
|
|
126
|
+
children: V
|
|
127
127
|
}
|
|
128
128
|
),
|
|
129
129
|
/* @__PURE__ */ e(
|
|
@@ -184,7 +184,7 @@ function te(v) {
|
|
|
184
184
|
] });
|
|
185
185
|
}
|
|
186
186
|
export {
|
|
187
|
-
|
|
187
|
+
V as ADD_PRINCIPAL_TO_ACL_COMBOBOX_LABEL,
|
|
188
188
|
z as ADD_PUBLIC_PRINCIPALS_BUTTON_TEXT,
|
|
189
189
|
te as AclEditor,
|
|
190
190
|
W as NOTIFY_NEW_ACL_USERS_CHECKBOX_LABEL,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AclEditor.js","sources":["../../../src/components/AclEditor/AclEditor.tsx"],"sourcesContent":["import { PermissionLevel } from '@/utils/PermissionLevelToAccessType'\nimport { useGetRealmPrincipals } from '@/synapse-queries/realm/useRealmPrincipals'\nimport {\n Box,\n Button,\n ButtonProps,\n Checkbox,\n Collapse,\n FormControlLabel,\n Tooltip,\n Typography,\n} from '@mui/material'\nimport { ResourceAccess } from '@sage-bionetworks/synapse-types'\nimport { noop } from 'lodash-es'\nimport React, { ReactNode } from 'react'\nimport { TransitionGroup } from 'react-transition-group'\nimport IconSvg from '../IconSvg'\nimport UserSearchBoxV2 from '../UserSearchBox/UserSearchBoxV2'\nimport { AclEditorSkeleton } from './AclEditorSkeleton'\nimport { ResourceAccessItem } from './ResourceAccessItem'\nimport useUpdateAcl from './useUpdateAcl'\n\nexport const ADD_PRINCIPAL_TO_ACL_COMBOBOX_LABEL = 'Add a user or team'\nexport const ADD_PUBLIC_PRINCIPALS_BUTTON_TEXT = 'Make Public'\nexport const REMOVE_PUBLIC_PRINCIPALS_BUTTON_TEXT = 'Remove Public Access'\n\nexport type AclEditorProps = {\n resourceAccessList: ResourceAccess[]\n availablePermissionLevels: PermissionLevel[]\n /** If true, the user can edit the ACL. If a function, it will be called with the ResourceAccess to determine if the user can edit it. */\n canEdit: boolean | ((resourceAccess: ResourceAccess) => boolean)\n /** If true, object ACL is inherited from another object */\n isInherited: boolean\n /**\n * If true, the user can remove any entry from the ACL. a function, it will be called with the ResourceAccess to determine if the user can remove it.\n * If undefined, then the behavior will fall back to the value of `canEdit`\n */\n canRemoveEntry?: boolean | ((resourceAccess: ResourceAccess) => boolean)\n isLoading?: boolean\n emptyText: ReactNode\n onAddPrincipalToAcl: (id: number) => void\n updateResourceAccessItem: ReturnType<\n typeof useUpdateAcl\n >['updateResourceAccessItem']\n removeResourceAccessItem: ReturnType<\n typeof useUpdateAcl\n >['removeResourceAccessItem']\n /** If true, shows a button to add/remove AUTHENTICATED and PUBLIC groups when in edit mode */\n showAddRemovePublicButton: boolean\n /** If present, a checkbox to notify those added to the email will be shown. */\n showNotifyCheckbox: boolean\n notifyCheckboxValue?: boolean\n onNotifyCheckboxChange?: (checked: boolean) => void\n /**\n * In special cases, can be used to display a permission level that is different from the typical permission levels.\n * For example, the PUBLIC group \"Can download\" an entity if they have READ access and the entity is marked as\n * \"open data\" (open data status is not captured in the ResourceAccess)\n */\n displayedPermissionLevelOverride?: (\n resourceAccess: ResourceAccess,\n ) => string | undefined\n}\n\nexport const NOTIFY_NEW_ACL_USERS_CHECKBOX_LABEL = 'Notify people via email'\n\nexport function AclEditor(props: AclEditorProps): React.ReactNode {\n const {\n resourceAccessList,\n availablePermissionLevels,\n canEdit,\n isInherited,\n canRemoveEntry = canEdit,\n isLoading = false,\n emptyText,\n onAddPrincipalToAcl,\n updateResourceAccessItem,\n removeResourceAccessItem,\n showAddRemovePublicButton,\n showNotifyCheckbox,\n notifyCheckboxValue,\n onNotifyCheckboxChange = noop,\n displayedPermissionLevelOverride,\n } = props\n\n const { data, isLoading: isLoadingRealmPrincipals } = useGetRealmPrincipals()\n const realmPrincipals = data || {}\n const {\n authenticatedUsers: authenticatedUsersId,\n publicGroup: publicGroupId,\n anonymousUser: anonymousUserId,\n } = realmPrincipals\n\n const publicPrincipalIds = [\n authenticatedUsersId,\n publicGroupId,\n anonymousUserId,\n ].filter((id): id is string => id !== undefined)\n\n if (isLoading || isLoadingRealmPrincipals) {\n return <AclEditorSkeleton />\n }\n\n const resourceAccessListCurrentlyIncludesPublic = Boolean(\n resourceAccessList.find(resourceAccess =>\n publicPrincipalIds.some(id => resourceAccess.principalId === Number(id)),\n ),\n )\n\n const addOrRemovePublicButtonProps: ButtonProps =\n resourceAccessListCurrentlyIncludesPublic\n ? {\n startIcon: <IconSvg icon={'close'} wrap={false} />,\n children: REMOVE_PUBLIC_PRINCIPALS_BUTTON_TEXT,\n onClick: () => {\n publicPrincipalIds.forEach(publicId => {\n removeResourceAccessItem(Number(publicId))\n })\n },\n }\n : {\n startIcon: <IconSvg icon={'public'} wrap={false} />,\n children: ADD_PUBLIC_PRINCIPALS_BUTTON_TEXT,\n onClick: () => {\n if (publicGroupId) onAddPrincipalToAcl(Number(publicGroupId))\n if (authenticatedUsersId)\n onAddPrincipalToAcl(Number(authenticatedUsersId))\n },\n }\n\n return (\n <Box>\n <Box\n sx={{\n mb: '30px',\n }}\n >\n <Typography\n variant=\"headline3\"\n sx={{\n mb: '10px',\n }}\n >\n Users and Teams with Permissions\n </Typography>\n\n {resourceAccessList.length === 0 ? (\n <Typography variant=\"body1Italic\">{emptyText}</Typography>\n ) : (\n <TransitionGroup>\n {resourceAccessList.map(resourceAccess => {\n const canChangePermission =\n typeof canEdit === 'function'\n ? canEdit(resourceAccess)\n : canEdit\n const canDelete =\n typeof canRemoveEntry === 'function'\n ? canRemoveEntry(resourceAccess)\n : canRemoveEntry\n\n const permissionLevelOverride = displayedPermissionLevelOverride\n ? displayedPermissionLevelOverride(resourceAccess)\n : undefined\n return (\n <Collapse key={resourceAccess.principalId}>\n <ResourceAccessItem\n resourceAccess={resourceAccess}\n availablePermissionLevels={availablePermissionLevels}\n canChangePermission={canChangePermission}\n displayedPermissionLevelOverride={permissionLevelOverride}\n showDeleteButton={canDelete}\n onChange={accessType =>\n updateResourceAccessItem(\n resourceAccess.principalId,\n accessType,\n )\n }\n onRemove={() =>\n removeResourceAccessItem(resourceAccess.principalId)\n }\n />\n </Collapse>\n )\n })}\n </TransitionGroup>\n )}\n </Box>\n {canEdit && (\n <Box>\n <Typography\n variant=\"headline3\"\n sx={{\n mb: '10px',\n }}\n >\n Add More\n </Typography>\n <Typography\n sx={{\n mb: '20px',\n variant: 'body1',\n lineHeight: '20px',\n fontStyle: 'italic',\n color: 'text.secondary',\n }}\n >\n Search for a username or team to add. You can search by username,\n first or last names, or team name.\n </Typography>\n <Box sx={{ mb: 1 }}>\n <Typography\n component=\"label\"\n variant=\"smallText2\"\n htmlFor=\"reviewer-search\"\n >\n {ADD_PRINCIPAL_TO_ACL_COMBOBOX_LABEL}\n </Typography>\n <UserSearchBoxV2\n value={null}\n inputId=\"reviewer-search\"\n placeholder=\"Username, name (first and last) or team name.\"\n onChange={id => {\n const parsedId = parseInt(id || '')\n if (parsedId) {\n onAddPrincipalToAcl(parsedId)\n }\n }}\n />\n </Box>\n <Box\n sx={{\n display: 'flex',\n justifyContent: 'space-between',\n gap: 2,\n }}\n >\n <Box>\n {showAddRemovePublicButton && (\n <Button\n size={'small'}\n variant={'outlined'}\n {...addOrRemovePublicButtonProps}\n />\n )}\n </Box>\n {showNotifyCheckbox && (\n <Tooltip\n title={\n 'Select to notify newly added people that this item has been shared with them'\n }\n >\n <FormControlLabel\n sx={{ mr: 0 }}\n control={\n <Checkbox\n value={notifyCheckboxValue}\n onChange={() =>\n onNotifyCheckboxChange(!notifyCheckboxValue)\n }\n />\n }\n label={\n <Typography variant={'smallText1'}>\n {NOTIFY_NEW_ACL_USERS_CHECKBOX_LABEL}\n </Typography>\n }\n />\n </Tooltip>\n )}\n </Box>\n </Box>\n )}\n {!canEdit && !isInherited && (\n <Typography variant={'body1'}>\n You do not have sufficient privileges to modify the sharing settings.\n </Typography>\n )}\n </Box>\n )\n}\n"],"names":["ADD_PRINCIPAL_TO_ACL_COMBOBOX_LABEL","ADD_PUBLIC_PRINCIPALS_BUTTON_TEXT","REMOVE_PUBLIC_PRINCIPALS_BUTTON_TEXT","NOTIFY_NEW_ACL_USERS_CHECKBOX_LABEL","AclEditor","props","resourceAccessList","availablePermissionLevels","canEdit","isInherited","canRemoveEntry","isLoading","emptyText","onAddPrincipalToAcl","updateResourceAccessItem","removeResourceAccessItem","showAddRemovePublicButton","showNotifyCheckbox","notifyCheckboxValue","onNotifyCheckboxChange","noop","displayedPermissionLevelOverride","data","isLoadingRealmPrincipals","useGetRealmPrincipals","realmPrincipals","authenticatedUsersId","publicGroupId","anonymousUserId","publicPrincipalIds","id","AclEditorSkeleton","addOrRemovePublicButtonProps","resourceAccess","jsx","IconSvg","publicId","Box","jsxs","Typography","TransitionGroup","canChangePermission","canDelete","permissionLevelOverride","Collapse","ResourceAccessItem","accessType","UserSearchBoxV2","parsedId","Button","Tooltip","FormControlLabel","Checkbox"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"AclEditor.js","sources":["../../../src/components/AclEditor/AclEditor.tsx"],"sourcesContent":["import { PermissionLevel } from '@/utils/PermissionLevelToAccessType'\nimport { useGetRealmPrincipals } from '@/synapse-queries/realm/useRealmPrincipals'\nimport {\n Box,\n Button,\n ButtonProps,\n Checkbox,\n Collapse,\n FormControlLabel,\n Tooltip,\n Typography,\n} from '@mui/material'\nimport { ResourceAccess } from '@sage-bionetworks/synapse-types'\nimport { noop } from 'lodash-es'\nimport React, { ReactNode } from 'react'\nimport { TransitionGroup } from 'react-transition-group'\nimport IconSvg from '../IconSvg'\nimport UserSearchBox from '../UserSearchBox/UserSearchBox'\nimport { AclEditorSkeleton } from './AclEditorSkeleton'\nimport { ResourceAccessItem } from './ResourceAccessItem'\nimport useUpdateAcl from './useUpdateAcl'\n\nexport const ADD_PRINCIPAL_TO_ACL_COMBOBOX_LABEL = 'Add a user or team'\nexport const ADD_PUBLIC_PRINCIPALS_BUTTON_TEXT = 'Make Public'\nexport const REMOVE_PUBLIC_PRINCIPALS_BUTTON_TEXT = 'Remove Public Access'\n\nexport type AclEditorProps = {\n resourceAccessList: ResourceAccess[]\n availablePermissionLevels: PermissionLevel[]\n /** If true, the user can edit the ACL. If a function, it will be called with the ResourceAccess to determine if the user can edit it. */\n canEdit: boolean | ((resourceAccess: ResourceAccess) => boolean)\n /** If true, object ACL is inherited from another object */\n isInherited: boolean\n /**\n * If true, the user can remove any entry from the ACL. a function, it will be called with the ResourceAccess to determine if the user can remove it.\n * If undefined, then the behavior will fall back to the value of `canEdit`\n */\n canRemoveEntry?: boolean | ((resourceAccess: ResourceAccess) => boolean)\n isLoading?: boolean\n emptyText: ReactNode\n onAddPrincipalToAcl: (id: number) => void\n updateResourceAccessItem: ReturnType<\n typeof useUpdateAcl\n >['updateResourceAccessItem']\n removeResourceAccessItem: ReturnType<\n typeof useUpdateAcl\n >['removeResourceAccessItem']\n /** If true, shows a button to add/remove AUTHENTICATED and PUBLIC groups when in edit mode */\n showAddRemovePublicButton: boolean\n /** If present, a checkbox to notify those added to the email will be shown. */\n showNotifyCheckbox: boolean\n notifyCheckboxValue?: boolean\n onNotifyCheckboxChange?: (checked: boolean) => void\n /**\n * In special cases, can be used to display a permission level that is different from the typical permission levels.\n * For example, the PUBLIC group \"Can download\" an entity if they have READ access and the entity is marked as\n * \"open data\" (open data status is not captured in the ResourceAccess)\n */\n displayedPermissionLevelOverride?: (\n resourceAccess: ResourceAccess,\n ) => string | undefined\n}\n\nexport const NOTIFY_NEW_ACL_USERS_CHECKBOX_LABEL = 'Notify people via email'\n\nexport function AclEditor(props: AclEditorProps): React.ReactNode {\n const {\n resourceAccessList,\n availablePermissionLevels,\n canEdit,\n isInherited,\n canRemoveEntry = canEdit,\n isLoading = false,\n emptyText,\n onAddPrincipalToAcl,\n updateResourceAccessItem,\n removeResourceAccessItem,\n showAddRemovePublicButton,\n showNotifyCheckbox,\n notifyCheckboxValue,\n onNotifyCheckboxChange = noop,\n displayedPermissionLevelOverride,\n } = props\n\n const { data, isLoading: isLoadingRealmPrincipals } = useGetRealmPrincipals()\n const realmPrincipals = data || {}\n const {\n authenticatedUsers: authenticatedUsersId,\n publicGroup: publicGroupId,\n anonymousUser: anonymousUserId,\n } = realmPrincipals\n\n const publicPrincipalIds = [\n authenticatedUsersId,\n publicGroupId,\n anonymousUserId,\n ].filter((id): id is string => id !== undefined)\n\n if (isLoading || isLoadingRealmPrincipals) {\n return <AclEditorSkeleton />\n }\n\n const resourceAccessListCurrentlyIncludesPublic = Boolean(\n resourceAccessList.find(resourceAccess =>\n publicPrincipalIds.some(id => resourceAccess.principalId === Number(id)),\n ),\n )\n\n const addOrRemovePublicButtonProps: ButtonProps =\n resourceAccessListCurrentlyIncludesPublic\n ? {\n startIcon: <IconSvg icon={'close'} wrap={false} />,\n children: REMOVE_PUBLIC_PRINCIPALS_BUTTON_TEXT,\n onClick: () => {\n publicPrincipalIds.forEach(publicId => {\n removeResourceAccessItem(Number(publicId))\n })\n },\n }\n : {\n startIcon: <IconSvg icon={'public'} wrap={false} />,\n children: ADD_PUBLIC_PRINCIPALS_BUTTON_TEXT,\n onClick: () => {\n if (publicGroupId) onAddPrincipalToAcl(Number(publicGroupId))\n if (authenticatedUsersId)\n onAddPrincipalToAcl(Number(authenticatedUsersId))\n },\n }\n\n return (\n <Box>\n <Box\n sx={{\n mb: '30px',\n }}\n >\n <Typography\n variant=\"headline3\"\n sx={{\n mb: '10px',\n }}\n >\n Users and Teams with Permissions\n </Typography>\n\n {resourceAccessList.length === 0 ? (\n <Typography variant=\"body1Italic\">{emptyText}</Typography>\n ) : (\n <TransitionGroup>\n {resourceAccessList.map(resourceAccess => {\n const canChangePermission =\n typeof canEdit === 'function'\n ? canEdit(resourceAccess)\n : canEdit\n const canDelete =\n typeof canRemoveEntry === 'function'\n ? canRemoveEntry(resourceAccess)\n : canRemoveEntry\n\n const permissionLevelOverride = displayedPermissionLevelOverride\n ? displayedPermissionLevelOverride(resourceAccess)\n : undefined\n return (\n <Collapse key={resourceAccess.principalId}>\n <ResourceAccessItem\n resourceAccess={resourceAccess}\n availablePermissionLevels={availablePermissionLevels}\n canChangePermission={canChangePermission}\n displayedPermissionLevelOverride={permissionLevelOverride}\n showDeleteButton={canDelete}\n onChange={accessType =>\n updateResourceAccessItem(\n resourceAccess.principalId,\n accessType,\n )\n }\n onRemove={() =>\n removeResourceAccessItem(resourceAccess.principalId)\n }\n />\n </Collapse>\n )\n })}\n </TransitionGroup>\n )}\n </Box>\n {canEdit && (\n <Box>\n <Typography\n variant=\"headline3\"\n sx={{\n mb: '10px',\n }}\n >\n Add More\n </Typography>\n <Typography\n sx={{\n mb: '20px',\n variant: 'body1',\n lineHeight: '20px',\n fontStyle: 'italic',\n color: 'text.secondary',\n }}\n >\n Search for a username or team to add. You can search by username,\n first or last names, or team name.\n </Typography>\n <Box sx={{ mb: 1 }}>\n <Typography\n component=\"label\"\n variant=\"smallText2\"\n htmlFor=\"reviewer-search\"\n >\n {ADD_PRINCIPAL_TO_ACL_COMBOBOX_LABEL}\n </Typography>\n <UserSearchBox\n value={null}\n inputId=\"reviewer-search\"\n placeholder=\"Username, name (first and last) or team name.\"\n onChange={id => {\n const parsedId = parseInt(id || '')\n if (parsedId) {\n onAddPrincipalToAcl(parsedId)\n }\n }}\n />\n </Box>\n <Box\n sx={{\n display: 'flex',\n justifyContent: 'space-between',\n gap: 2,\n }}\n >\n <Box>\n {showAddRemovePublicButton && (\n <Button\n size={'small'}\n variant={'outlined'}\n {...addOrRemovePublicButtonProps}\n />\n )}\n </Box>\n {showNotifyCheckbox && (\n <Tooltip\n title={\n 'Select to notify newly added people that this item has been shared with them'\n }\n >\n <FormControlLabel\n sx={{ mr: 0 }}\n control={\n <Checkbox\n value={notifyCheckboxValue}\n onChange={() =>\n onNotifyCheckboxChange(!notifyCheckboxValue)\n }\n />\n }\n label={\n <Typography variant={'smallText1'}>\n {NOTIFY_NEW_ACL_USERS_CHECKBOX_LABEL}\n </Typography>\n }\n />\n </Tooltip>\n )}\n </Box>\n </Box>\n )}\n {!canEdit && !isInherited && (\n <Typography variant={'body1'}>\n You do not have sufficient privileges to modify the sharing settings.\n </Typography>\n )}\n </Box>\n )\n}\n"],"names":["ADD_PRINCIPAL_TO_ACL_COMBOBOX_LABEL","ADD_PUBLIC_PRINCIPALS_BUTTON_TEXT","REMOVE_PUBLIC_PRINCIPALS_BUTTON_TEXT","NOTIFY_NEW_ACL_USERS_CHECKBOX_LABEL","AclEditor","props","resourceAccessList","availablePermissionLevels","canEdit","isInherited","canRemoveEntry","isLoading","emptyText","onAddPrincipalToAcl","updateResourceAccessItem","removeResourceAccessItem","showAddRemovePublicButton","showNotifyCheckbox","notifyCheckboxValue","onNotifyCheckboxChange","noop","displayedPermissionLevelOverride","data","isLoadingRealmPrincipals","useGetRealmPrincipals","realmPrincipals","authenticatedUsersId","publicGroupId","anonymousUserId","publicPrincipalIds","id","AclEditorSkeleton","addOrRemovePublicButtonProps","resourceAccess","jsx","IconSvg","publicId","Box","jsxs","Typography","TransitionGroup","canChangePermission","canDelete","permissionLevelOverride","Collapse","ResourceAccessItem","accessType","UserSearchBox","parsedId","Button","Tooltip","FormControlLabel","Checkbox"],"mappings":"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"}
|
|
@@ -1,40 +1,40 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { screen as r, waitFor as a, within as i } from "@testing-library/react";
|
|
2
2
|
import { REMOVE_BUTTON_LABEL as m } from "./ResourceAccessItem.js";
|
|
3
3
|
import { PUBLIC_GROUP_DISPLAY_TEXT as B, AUTHENTICATED_GROUP_DISPLAY_TEXT as T } from "../TeamBadge.js";
|
|
4
|
-
import {
|
|
5
|
-
function u(
|
|
6
|
-
return
|
|
4
|
+
import { ADD_PUBLIC_PRINCIPALS_BUTTON_TEXT as x, ADD_PRINCIPAL_TO_ACL_COMBOBOX_LABEL as y } from "./AclEditor.js";
|
|
5
|
+
function u(e, n) {
|
|
6
|
+
return e.find((t) => i(t).queryByText(n, { exact: !1 }));
|
|
7
7
|
}
|
|
8
|
-
async function R(
|
|
9
|
-
let
|
|
8
|
+
async function R(e, n, t) {
|
|
9
|
+
let o;
|
|
10
10
|
try {
|
|
11
11
|
await a(() => {
|
|
12
|
-
|
|
12
|
+
o = u(e, n), expect(o).toBeInTheDocument();
|
|
13
13
|
});
|
|
14
14
|
} catch (l) {
|
|
15
15
|
throw r.debug(), new Error(`Principal ${n} not found in ACL`, { cause: l });
|
|
16
16
|
}
|
|
17
|
-
const c = i(
|
|
18
|
-
return c ? expect(c).toHaveTextContent(t) : i(
|
|
17
|
+
const c = i(o).queryByRole("combobox");
|
|
18
|
+
return c ? expect(c).toHaveTextContent(t) : i(o).getByText(t), o;
|
|
19
19
|
}
|
|
20
|
-
function b(
|
|
21
|
-
expect(i(
|
|
20
|
+
function b(e, n, t) {
|
|
21
|
+
expect(i(e).queryByRole("link") ?? e).toHaveTextContent(
|
|
22
22
|
n
|
|
23
23
|
);
|
|
24
|
-
const
|
|
25
|
-
|
|
24
|
+
const o = i(e).queryByRole("combobox");
|
|
25
|
+
o ? expect(o).toHaveTextContent(t) : i(e).getByText(t);
|
|
26
26
|
}
|
|
27
|
-
async function d(
|
|
28
|
-
const
|
|
27
|
+
async function d(e, n, t = !0) {
|
|
28
|
+
const o = i(e).getByRole("button", {
|
|
29
29
|
name: m
|
|
30
30
|
});
|
|
31
|
-
await n.click(
|
|
32
|
-
expect(
|
|
31
|
+
await n.click(o), t && await a(() => {
|
|
32
|
+
expect(o).not.toBeInTheDocument(), expect(e).not.toBeInTheDocument();
|
|
33
33
|
});
|
|
34
34
|
}
|
|
35
|
-
async function h(
|
|
36
|
-
const
|
|
37
|
-
await n.click(
|
|
35
|
+
async function h(e, n, t) {
|
|
36
|
+
const o = i(e).getByRole("combobox");
|
|
37
|
+
await n.click(o);
|
|
38
38
|
const c = r.getByRole("option", {
|
|
39
39
|
name: t
|
|
40
40
|
});
|
|
@@ -42,30 +42,30 @@ async function h(o, n, t) {
|
|
|
42
42
|
expect(c).not.toBeInTheDocument();
|
|
43
43
|
});
|
|
44
44
|
}
|
|
45
|
-
function
|
|
45
|
+
function w() {
|
|
46
46
|
return r.queryByRole("combobox", {
|
|
47
|
-
name:
|
|
47
|
+
name: y
|
|
48
48
|
});
|
|
49
49
|
}
|
|
50
|
-
async function A(
|
|
51
|
-
const t =
|
|
52
|
-
expect(t).toBeInTheDocument(), await
|
|
53
|
-
const
|
|
54
|
-
await
|
|
50
|
+
async function A(e, n) {
|
|
51
|
+
const t = w();
|
|
52
|
+
expect(t).toBeInTheDocument(), await e.clear(t), await e.type(t, n);
|
|
53
|
+
const o = await r.findByText(new RegExp(`\\(@${n}\\)`));
|
|
54
|
+
await e.click(o), await a(() => expect(o).not.toBeInTheDocument());
|
|
55
55
|
const c = r.getAllByRole("row");
|
|
56
56
|
return c[c.length - 1];
|
|
57
57
|
}
|
|
58
|
-
async function _(
|
|
58
|
+
async function _(e) {
|
|
59
59
|
const n = r.getByRole("button", {
|
|
60
|
-
name:
|
|
60
|
+
name: x
|
|
61
61
|
});
|
|
62
|
-
await
|
|
63
|
-
let t = [],
|
|
62
|
+
await e.click(n);
|
|
63
|
+
let t = [], o, c;
|
|
64
64
|
return await a(() => {
|
|
65
|
-
t = r.getAllByRole("row"),
|
|
65
|
+
t = r.getAllByRole("row"), o = u(t, B), c = u(
|
|
66
66
|
t,
|
|
67
67
|
T
|
|
68
|
-
), expect(
|
|
68
|
+
), expect(o).toBeInTheDocument(), expect(c).toBeInTheDocument();
|
|
69
69
|
}), {
|
|
70
70
|
publicRow: t[t.length - 2],
|
|
71
71
|
authenticatedUsersRow: t[t.length - 1]
|
|
@@ -76,7 +76,7 @@ export {
|
|
|
76
76
|
A as addUserToAcl,
|
|
77
77
|
b as confirmItem,
|
|
78
78
|
R as confirmItemViaQuery,
|
|
79
|
-
|
|
79
|
+
w as queryForAddUserCombobox,
|
|
80
80
|
u as queryForRowWithPrincipalName,
|
|
81
81
|
d as removeItem,
|
|
82
82
|
h as updatePermissionLevel
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AclEditor.test-utils.js","sources":["../../../src/components/AclEditor/AclEditor.test-utils.ts"],"sourcesContent":["import userEvent from '@testing-library/user-event'\nimport { screen, waitFor, within } from '@testing-library/react'\nimport { REMOVE_BUTTON_LABEL } from './ResourceAccessItem'\nimport {\n AUTHENTICATED_GROUP_DISPLAY_TEXT,\n PUBLIC_GROUP_DISPLAY_TEXT,\n} from '../TeamBadge'\nimport {\n ADD_PRINCIPAL_TO_ACL_COMBOBOX_LABEL,\n ADD_PUBLIC_PRINCIPALS_BUTTON_TEXT,\n} from './AclEditor'\n\n/**\n * Find a row in the ACL editor that contains the specified principal name.\n * @param rows\n * @param principalName\n */\nexport function queryForRowWithPrincipalName(\n rows: HTMLElement[],\n principalName: string,\n) {\n return rows.find(row => {\n return within(row).queryByText(principalName, { exact: false })\n })\n}\n\n/**\n * Verify that a row in the ACL editor contains the expected principal name and access type.\n * @param rows\n * @param principalName\n * @param accessTypeLabel\n */\nexport async function confirmItemViaQuery(\n rows: HTMLElement[],\n principalName: string,\n accessTypeLabel: string,\n) {\n let row: HTMLElement | undefined\n try {\n await waitFor(() => {\n row = queryForRowWithPrincipalName(rows, principalName)!\n expect(row).toBeInTheDocument()\n })\n } catch (e) {\n screen.debug()\n throw new Error(`Principal ${principalName} not found in ACL`, { cause: e })\n }\n\n const editorCombobox = within(row!).queryByRole('combobox')\n if (editorCombobox) {\n expect(editorCombobox).toHaveTextContent(accessTypeLabel)\n } else {\n within(row!).getByText(accessTypeLabel)\n }\n return row!\n}\n\n/**\n * Verify that a row in the ACL editor contains the expected principal name and access type.\n * @param row\n * @param principalName\n * @param accessTypeLabel\n */\nexport function confirmItem(\n row: HTMLElement,\n principalName: string,\n accessTypeLabel: string,\n) {\n expect(within(row).queryByRole('link') ?? row).toHaveTextContent(\n principalName,\n )\n const editorCombobox = within(row).queryByRole('combobox')\n if (editorCombobox) {\n expect(editorCombobox).toHaveTextContent(accessTypeLabel)\n } else {\n within(row).getByText(accessTypeLabel)\n }\n}\n\n/**\n * Remove a particular row from the HTML editor.\n * @param row\n * @param user\n * @param verifyRemoval\n */\nexport async function removeItem(\n row: HTMLElement,\n user: ReturnType<(typeof userEvent)['setup']>,\n verifyRemoval = true,\n) {\n const removeButton = within(row).getByRole('button', {\n name: REMOVE_BUTTON_LABEL,\n })\n await user.click(removeButton)\n if (verifyRemoval) {\n await waitFor(() => {\n expect(removeButton).not.toBeInTheDocument()\n expect(row).not.toBeInTheDocument()\n })\n }\n}\n\n/**\n * Updates the permission level of a particular row in the ACL editor.\n * @param row\n * @param user\n * @param updatedPermissionLevelLabel\n */\nexport async function updatePermissionLevel(\n row: HTMLElement,\n user: ReturnType<(typeof userEvent)['setup']>,\n updatedPermissionLevelLabel: string,\n) {\n const menu = within(row).getByRole('combobox')\n await user.click(menu)\n\n const option = screen.getByRole('option', {\n name: updatedPermissionLevelLabel,\n })\n await user.click(option)\n\n await waitFor(() => {\n expect(option).not.toBeInTheDocument()\n })\n}\n\nexport function queryForAddUserCombobox() {\n return screen.queryByRole('combobox', {\n name: ADD_PRINCIPAL_TO_ACL_COMBOBOX_LABEL,\n })\n}\n\n/**\n * Adds a user to the ACL editor.\n * @param user\n * @param userName\n */\nexport async function addUserToAcl(\n user: ReturnType<(typeof userEvent)['setup']>,\n userName: string,\n) {\n const userInput = queryForAddUserCombobox()!\n expect(userInput).toBeInTheDocument()\n await user.type(userInput, userName)\n\n const option = await screen.findByText(new RegExp(`\\\\(@${userName}\\\\)`))\n await user.click(option)\n\n await waitFor(() => expect(option).not.toBeInTheDocument())\n const rows = screen.getAllByRole('row')\n return rows[rows.length - 1]\n}\n\n/**\n * Adds public / authenticated groups to the ACL editor.\n * @param user\n */\nexport async function addPublicToAcl(\n user: ReturnType<(typeof userEvent)['setup']>,\n) {\n const makePublicButton = screen.getByRole('button', {\n name: ADD_PUBLIC_PRINCIPALS_BUTTON_TEXT,\n })\n await user.click(makePublicButton)\n\n let rows: HTMLElement[] = []\n let publicRow: HTMLElement | undefined = undefined\n let authenticatedUsersRow: HTMLElement | undefined = undefined\n await waitFor(() => {\n rows = screen.getAllByRole('row')\n publicRow = queryForRowWithPrincipalName(rows, PUBLIC_GROUP_DISPLAY_TEXT)\n authenticatedUsersRow = queryForRowWithPrincipalName(\n rows,\n AUTHENTICATED_GROUP_DISPLAY_TEXT,\n )\n expect(publicRow).toBeInTheDocument()\n expect(authenticatedUsersRow).toBeInTheDocument()\n })\n\n return {\n publicRow: rows[rows.length - 2],\n authenticatedUsersRow: rows[rows.length - 1],\n }\n}\n"],"names":["queryForRowWithPrincipalName","rows","principalName","row","within","confirmItemViaQuery","accessTypeLabel","waitFor","e","screen","editorCombobox","confirmItem","removeItem","user","verifyRemoval","removeButton","REMOVE_BUTTON_LABEL","updatePermissionLevel","updatedPermissionLevelLabel","menu","option","queryForAddUserCombobox","ADD_PRINCIPAL_TO_ACL_COMBOBOX_LABEL","addUserToAcl","userName","userInput","addPublicToAcl","makePublicButton","ADD_PUBLIC_PRINCIPALS_BUTTON_TEXT","publicRow","authenticatedUsersRow","PUBLIC_GROUP_DISPLAY_TEXT","AUTHENTICATED_GROUP_DISPLAY_TEXT"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"AclEditor.test-utils.js","sources":["../../../src/components/AclEditor/AclEditor.test-utils.ts"],"sourcesContent":["import userEvent from '@testing-library/user-event'\nimport { screen, waitFor, within } from '@testing-library/react'\nimport { REMOVE_BUTTON_LABEL } from './ResourceAccessItem'\nimport {\n AUTHENTICATED_GROUP_DISPLAY_TEXT,\n PUBLIC_GROUP_DISPLAY_TEXT,\n} from '../TeamBadge'\nimport {\n ADD_PRINCIPAL_TO_ACL_COMBOBOX_LABEL,\n ADD_PUBLIC_PRINCIPALS_BUTTON_TEXT,\n} from './AclEditor'\n\n/**\n * Find a row in the ACL editor that contains the specified principal name.\n * @param rows\n * @param principalName\n */\nexport function queryForRowWithPrincipalName(\n rows: HTMLElement[],\n principalName: string,\n) {\n return rows.find(row => {\n return within(row).queryByText(principalName, { exact: false })\n })\n}\n\n/**\n * Verify that a row in the ACL editor contains the expected principal name and access type.\n * @param rows\n * @param principalName\n * @param accessTypeLabel\n */\nexport async function confirmItemViaQuery(\n rows: HTMLElement[],\n principalName: string,\n accessTypeLabel: string,\n) {\n let row: HTMLElement | undefined\n try {\n await waitFor(() => {\n row = queryForRowWithPrincipalName(rows, principalName)!\n expect(row).toBeInTheDocument()\n })\n } catch (e) {\n screen.debug()\n throw new Error(`Principal ${principalName} not found in ACL`, { cause: e })\n }\n\n const editorCombobox = within(row!).queryByRole('combobox')\n if (editorCombobox) {\n expect(editorCombobox).toHaveTextContent(accessTypeLabel)\n } else {\n within(row!).getByText(accessTypeLabel)\n }\n return row!\n}\n\n/**\n * Verify that a row in the ACL editor contains the expected principal name and access type.\n * @param row\n * @param principalName\n * @param accessTypeLabel\n */\nexport function confirmItem(\n row: HTMLElement,\n principalName: string,\n accessTypeLabel: string,\n) {\n expect(within(row).queryByRole('link') ?? row).toHaveTextContent(\n principalName,\n )\n const editorCombobox = within(row).queryByRole('combobox')\n if (editorCombobox) {\n expect(editorCombobox).toHaveTextContent(accessTypeLabel)\n } else {\n within(row).getByText(accessTypeLabel)\n }\n}\n\n/**\n * Remove a particular row from the HTML editor.\n * @param row\n * @param user\n * @param verifyRemoval\n */\nexport async function removeItem(\n row: HTMLElement,\n user: ReturnType<(typeof userEvent)['setup']>,\n verifyRemoval = true,\n) {\n const removeButton = within(row).getByRole('button', {\n name: REMOVE_BUTTON_LABEL,\n })\n await user.click(removeButton)\n if (verifyRemoval) {\n await waitFor(() => {\n expect(removeButton).not.toBeInTheDocument()\n expect(row).not.toBeInTheDocument()\n })\n }\n}\n\n/**\n * Updates the permission level of a particular row in the ACL editor.\n * @param row\n * @param user\n * @param updatedPermissionLevelLabel\n */\nexport async function updatePermissionLevel(\n row: HTMLElement,\n user: ReturnType<(typeof userEvent)['setup']>,\n updatedPermissionLevelLabel: string,\n) {\n const menu = within(row).getByRole('combobox')\n await user.click(menu)\n\n const option = screen.getByRole('option', {\n name: updatedPermissionLevelLabel,\n })\n await user.click(option)\n\n await waitFor(() => {\n expect(option).not.toBeInTheDocument()\n })\n}\n\nexport function queryForAddUserCombobox() {\n return screen.queryByRole('combobox', {\n name: ADD_PRINCIPAL_TO_ACL_COMBOBOX_LABEL,\n })\n}\n\n/**\n * Adds a user to the ACL editor.\n * @param user\n * @param userName\n */\nexport async function addUserToAcl(\n user: ReturnType<(typeof userEvent)['setup']>,\n userName: string,\n) {\n const userInput = queryForAddUserCombobox()!\n expect(userInput).toBeInTheDocument()\n await user.clear(userInput)\n await user.type(userInput, userName)\n\n const option = await screen.findByText(new RegExp(`\\\\(@${userName}\\\\)`))\n await user.click(option)\n\n await waitFor(() => expect(option).not.toBeInTheDocument())\n const rows = screen.getAllByRole('row')\n return rows[rows.length - 1]\n}\n\n/**\n * Adds public / authenticated groups to the ACL editor.\n * @param user\n */\nexport async function addPublicToAcl(\n user: ReturnType<(typeof userEvent)['setup']>,\n) {\n const makePublicButton = screen.getByRole('button', {\n name: ADD_PUBLIC_PRINCIPALS_BUTTON_TEXT,\n })\n await user.click(makePublicButton)\n\n let rows: HTMLElement[] = []\n let publicRow: HTMLElement | undefined = undefined\n let authenticatedUsersRow: HTMLElement | undefined = undefined\n await waitFor(() => {\n rows = screen.getAllByRole('row')\n publicRow = queryForRowWithPrincipalName(rows, PUBLIC_GROUP_DISPLAY_TEXT)\n authenticatedUsersRow = queryForRowWithPrincipalName(\n rows,\n AUTHENTICATED_GROUP_DISPLAY_TEXT,\n )\n expect(publicRow).toBeInTheDocument()\n expect(authenticatedUsersRow).toBeInTheDocument()\n })\n\n return {\n publicRow: rows[rows.length - 2],\n authenticatedUsersRow: rows[rows.length - 1],\n }\n}\n"],"names":["queryForRowWithPrincipalName","rows","principalName","row","within","confirmItemViaQuery","accessTypeLabel","waitFor","e","screen","editorCombobox","confirmItem","removeItem","user","verifyRemoval","removeButton","REMOVE_BUTTON_LABEL","updatePermissionLevel","updatedPermissionLevelLabel","menu","option","queryForAddUserCombobox","ADD_PRINCIPAL_TO_ACL_COMBOBOX_LABEL","addUserToAcl","userName","userInput","addPublicToAcl","makePublicButton","ADD_PUBLIC_PRINCIPALS_BUTTON_TEXT","publicRow","authenticatedUsersRow","PUBLIC_GROUP_DISPLAY_TEXT","AUTHENTICATED_GROUP_DISPLAY_TEXT"],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { jsxs as s,
|
|
1
|
+
import { jsxs as s, Fragment as d, jsx as t } from "react/jsx-runtime";
|
|
2
2
|
import * as a from "../../synapse-client/SynapseClient.js";
|
|
3
3
|
import "@sage-bionetworks/synapse-client/generated/models/ErrorResponseCode";
|
|
4
4
|
import "@sage-bionetworks/synapse-client/generated/models/TwoFactorAuthErrorResponse";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TwoFactorEnrollmentForm.d.ts","sourceRoot":"","sources":["../../../src/components/Authentication/TwoFactorEnrollmentForm.tsx"],"names":[],"mappings":"AAeA,OAAO,EAAE,UAAU,EAAE,MAAM,iCAAiC,CAAA;
|
|
1
|
+
{"version":3,"file":"TwoFactorEnrollmentForm.d.ts","sourceRoot":"","sources":["../../../src/components/Authentication/TwoFactorEnrollmentForm.tsx"],"names":[],"mappings":"AAeA,OAAO,EAAE,UAAU,EAAE,MAAM,iCAAiC,CAAA;AAW5D;;;;GAIG;AACH,iBAAS,YAAY,CAAC,MAAM,EAAE,UAAU,UAEvC;AA6BD,eAAO,MAAM,oBAAoB,+HAC6F,CAAA;AAE9H,MAAM,MAAM,4BAA4B,GAAG;IACzC,UAAU,EAAE,UAAU,CAAA;IACtB,4BAA4B,EAAE,MAAM,IAAI,CAAA;IACxC,aAAa,EAAE,MAAM,IAAI,CAAA;CAC1B,CAAA;AAED,MAAM,CAAC,OAAO,UAAU,uBAAuB,CAC7C,KAAK,EAAE,4BAA4B,2CA6NpC;AAED,eAAO,MAAM,yBAAyB;;CAAmB,CAAA"}
|
|
@@ -2,13 +2,14 @@ import { jsx as t, jsxs as o } from "react/jsx-runtime";
|
|
|
2
2
|
import { StyledOuterContainer as I } from "../styled/LeftRightPanel.js";
|
|
3
3
|
import { useFinishTwoFactorEnrollment as k } from "../../synapse-queries/auth/useTwoFactorEnrollment.js";
|
|
4
4
|
import { styled as S, Box as s, Paper as E, IconButton as O, Typography as i, Link as a, Stack as y, Divider as x, Button as D } from "@mui/material";
|
|
5
|
-
import
|
|
5
|
+
import * as G from "qrcode";
|
|
6
6
|
import { useState as p, useRef as R, useEffect as B } from "react";
|
|
7
7
|
import W from "../FullWidthAlert/FullWidthAlert.js";
|
|
8
8
|
import _ from "../IconSvg/IconSvg.js";
|
|
9
9
|
import { SynapseSpinner as M } from "../LoadingScreen/LoadingScreen.js";
|
|
10
10
|
import Q from "../TextField/TextField.js";
|
|
11
11
|
import $ from "./TwoFactorSecretDialog.js";
|
|
12
|
+
const { toCanvas: j } = G;
|
|
12
13
|
function v(e) {
|
|
13
14
|
return `otpauth://totp/Synapse:${e.username}?secret=${e.secret}&issuer=Sage%20Bionetworks&algorithm=${e.alg}&digits=${e.digits}&period=${e.period}`;
|
|
14
15
|
}
|
|
@@ -36,7 +37,7 @@ const c = S(
|
|
|
36
37
|
gap: "18px"
|
|
37
38
|
}
|
|
38
39
|
})
|
|
39
|
-
),
|
|
40
|
+
), L = "https://help.synapse.org/docs/Managing-Your-Account.2055405596.html#Adding-Two-Factor-Authentication-(2FA)-to-your-account";
|
|
40
41
|
function J(e) {
|
|
41
42
|
const { onTwoFactorEnrollmentSuccess: b, onBackClicked: u, totpSecret: r } = e, [l, w] = p(""), [m, C] = p(!1), [A, f] = p(!1), d = R(null), {
|
|
42
43
|
mutate: F,
|
|
@@ -47,7 +48,7 @@ function J(e) {
|
|
|
47
48
|
});
|
|
48
49
|
return B(() => {
|
|
49
50
|
async function n() {
|
|
50
|
-
r && d.current && (await
|
|
51
|
+
r && d.current && (await j(d.current, v(r), {
|
|
51
52
|
version: 10,
|
|
52
53
|
margin: 0,
|
|
53
54
|
scale: 3.5
|
|
@@ -95,7 +96,7 @@ function J(e) {
|
|
|
95
96
|
" or ORCiD account, you may need to use 2FA as part of",
|
|
96
97
|
"that process as well.",
|
|
97
98
|
" ",
|
|
98
|
-
/* @__PURE__ */ t(a, { href:
|
|
99
|
+
/* @__PURE__ */ t(a, { href: L, children: "Learn more about 2FA" }),
|
|
99
100
|
"."
|
|
100
101
|
] })
|
|
101
102
|
] }),
|
|
@@ -251,7 +252,7 @@ function J(e) {
|
|
|
251
252
|
const Z = { toOtpAuthUrl: v };
|
|
252
253
|
export {
|
|
253
254
|
Z as EXPORTED_FOR_UNIT_TESTING,
|
|
254
|
-
|
|
255
|
+
L as TWO_FACTOR_DOCS_LINK,
|
|
255
256
|
J as default
|
|
256
257
|
};
|
|
257
258
|
//# sourceMappingURL=TwoFactorEnrollmentForm.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TwoFactorEnrollmentForm.js","sources":["../../../src/components/Authentication/TwoFactorEnrollmentForm.tsx"],"sourcesContent":["import { StyledOuterContainer } from '@/components/styled/LeftRightPanel'\nimport { useFinishTwoFactorEnrollment } from '@/synapse-queries/auth/useTwoFactorEnrollment'\nimport { StyledComponent } from '@emotion/styled'\nimport {\n Box,\n BoxProps,\n Button,\n Divider,\n IconButton,\n Link,\n Paper,\n Stack,\n styled,\n Typography,\n} from '@mui/material'\nimport { TotpSecret } from '@sage-bionetworks/synapse-types'\nimport { toCanvas } from 'qrcode'\nimport { useEffect, useRef, useState } from 'react'\nimport FullWidthAlert from '../FullWidthAlert/FullWidthAlert'\nimport IconSvg from '../IconSvg/IconSvg'\nimport { SynapseSpinner } from '../LoadingScreen/LoadingScreen'\nimport TextField from '../TextField/TextField'\nimport TwoFactorSecretDialog from './TwoFactorSecretDialog'\n\n/**\n * Returns a URL that can be used to generate a QR code that 2FA authenticator apps can interpret.\n * This uses the username fro TotpSecret to create the friendly name for the account in the authenticator app.\n * @param secret\n */\nfunction toOtpAuthUrl(secret: TotpSecret) {\n return `otpauth://totp/Synapse:${secret.username}?secret=${secret.secret}&issuer=Sage%20Bionetworks&algorithm=${secret.alg}&digits=${secret.digits}&period=${secret.period}`\n}\n\nconst Section: StyledComponent<BoxProps> = styled(\n (props: BoxProps) => (\n <Box\n sx={{\n my: 3,\n ...props.sx,\n }}\n {...props}\n />\n ),\n {\n label: 'Section',\n },\n)(() => ({}))\n\nconst SectionInnerGrid = styled(Box, { label: 'SectionInnerGrid' })(\n ({ theme }) => ({\n display: 'grid',\n gridTemplateColumns: 'auto 200px',\n columnGap: theme.spacing(5),\n [theme.breakpoints.down('sm')]: {\n gridTemplateColumns: '1fr',\n gap: '18px',\n },\n }),\n)\n\nexport const TWO_FACTOR_DOCS_LINK =\n 'https://help.synapse.org/docs/Managing-Your-Account.2055405596.html#Adding-Two-Factor-Authentication-(2FA)-to-your-account'\n\nexport type TwoFactorEnrollmentFormProps = {\n totpSecret: TotpSecret\n onTwoFactorEnrollmentSuccess: () => void\n onBackClicked: () => void\n}\n\nexport default function TwoFactorEnrollmentForm(\n props: TwoFactorEnrollmentFormProps,\n) {\n const { onTwoFactorEnrollmentSuccess, onBackClicked, totpSecret } = props\n\n const [totp, setTotp] = useState('')\n const [hasQrCode, setHasQrCode] = useState(false)\n const [showSecretInModal, setShowSecretInModal] = useState(false)\n const qrCodeCanvasElement = useRef<HTMLCanvasElement>(null)\n\n const {\n mutate: finishEnrollment,\n isPending: isFinishingEnrollment,\n error,\n } = useFinishTwoFactorEnrollment({\n onSuccess: onTwoFactorEnrollmentSuccess,\n })\n\n useEffect(() => {\n async function createQrCode() {\n if (totpSecret && qrCodeCanvasElement.current) {\n await toCanvas(qrCodeCanvasElement.current, toOtpAuthUrl(totpSecret), {\n version: 10,\n margin: 0,\n scale: 3.5,\n })\n setHasQrCode(true)\n }\n }\n void createQrCode()\n }, [totpSecret])\n\n return (\n <StyledOuterContainer>\n <Paper\n sx={{\n position: 'relative',\n width: { xs: '100%', md: '800px' },\n py: 6.5,\n px: 8,\n mx: 'auto',\n }}\n >\n {onBackClicked && (\n <IconButton\n type=\"button\"\n onClick={() => {\n onBackClicked()\n }}\n sx={theme => ({\n position: 'absolute',\n top: theme.spacing(2),\n left: theme.spacing(2),\n })}\n >\n <IconSvg\n icon=\"arrowBack\"\n wrap={false}\n sx={{ height: '24px', width: '24px' }}\n />\n </IconButton>\n )}\n <Section>\n <Typography variant=\"headline2\" sx={{ mb: 3 }}>\n Activate Two-factor Authentication\n </Typography>\n <Typography variant=\"body1\">\n After setting up 2FA, you’ll use an authenticator app as part of\n your login process, in addition to your existing password. If you\n log in using your Google\n {/* eslint-disable-next-line no-constant-binary-expression -- Remove conditionality when NIH RAS login is supported */}\n {false && ', NIH RAS,'} or ORCiD account, you may need to use 2FA as\n part of\n {/*those processes*/}\n that process as well.{' '}\n <Link href={TWO_FACTOR_DOCS_LINK}>Learn more about 2FA</Link>.\n </Typography>\n </Section>\n <Section>\n <SectionInnerGrid>\n <Box>\n <Typography variant=\"body1\" sx={{ fontWeight: 700 }}>\n Step 1. Get one of these apps\n </Typography>\n <Typography variant=\"body1\">\n Download and install one of these authentication apps to set up\n 2FA on your mobile device, tablet, or desktop. If you have one\n of these apps already installed, you can skip this step.\n </Typography>\n </Box>\n <Stack\n sx={theme => ({\n justifyContent: 'space-between',\n flexShrink: 0,\n [theme.breakpoints.down('sm')]: {\n gap: '20px',\n },\n })}\n >\n <Link href={'https://authy.com/download/'}>Authy</Link>\n <Link\n href={\n 'https://duo.com/product/multi-factor-authentication-mfa/duo-mobile-app'\n }\n >\n DUO Mobile\n </Link>\n <Link href={'https://googleauthenticator.net/'}>\n Google Authenticator\n </Link>\n <Link\n href={\n 'https://www.microsoft.com/en-us/security/mobile-authenticator-app'\n }\n >\n Microsoft Authenticator\n </Link>\n </Stack>\n </SectionInnerGrid>\n </Section>\n <Divider />\n <Section>\n <SectionInnerGrid>\n <Box>\n <Typography variant=\"body1\" sx={{ fontWeight: 700 }}>\n Step 2. Scan the QR Code\n </Typography>\n <Typography component=\"ol\" variant=\"body1\" sx={{ pl: 2, my: 1 }}>\n <li>Open your authenticator app</li>\n <li>Tap the "+" button</li>\n <li>Use your camera to scan the image to the right</li>\n </Typography>\n <Link\n onClick={() => {\n setShowSecretInModal(true)\n }}\n >\n Can't use your camera?\n </Link>\n <TwoFactorSecretDialog\n secret={totpSecret?.secret ?? ''}\n open={showSecretInModal}\n onClose={() => setShowSecretInModal(false)}\n />\n </Box>\n <Box\n sx={{\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'middle',\n height: 'auto',\n }}\n >\n {!hasQrCode && <SynapseSpinner size={50} />}\n <canvas\n style={{ display: hasQrCode ? undefined : 'none' }}\n ref={qrCodeCanvasElement}\n />\n </Box>\n </SectionInnerGrid>\n </Section>\n <Divider />\n <Section>\n <SectionInnerGrid>\n <Box>\n <Typography variant=\"body1\" sx={{ fontWeight: 700 }}>\n Step 3. Enter the Verification Code\n </Typography>\n <Typography variant=\"body1\">\n After scanning in the QR code in step 2, your app will provide a\n 6-digit code. Enter it in in the field to the right.\n </Typography>\n </Box>\n <form\n onSubmit={e => {\n e.preventDefault()\n finishEnrollment({\n secretId: totpSecret.secretId,\n totp,\n })\n }}\n >\n <Stack\n direction={'row'}\n sx={{\n gap: 2,\n height: '48px',\n }}\n >\n <TextField\n noWrapInFormControl\n autoFocus\n inputProps={{ maxLength: totpSecret?.digits }}\n value={totp}\n onChange={e => {\n setTotp(e.target.value)\n }}\n />\n <Button\n type={'submit'}\n variant={'contained'}\n sx={{ flexShrink: 0 }}\n disabled={\n isFinishingEnrollment || totp.length != totpSecret?.digits\n }\n >\n Activate\n </Button>\n </Stack>\n </form>\n </SectionInnerGrid>\n </Section>\n {error && (\n <FullWidthAlert\n variant={'danger'}\n isGlobal={false}\n description={error.reason}\n />\n )}\n </Paper>\n </StyledOuterContainer>\n )\n}\n\nexport const EXPORTED_FOR_UNIT_TESTING = { toOtpAuthUrl }\n"],"names":["toOtpAuthUrl","secret","Section","styled","props","jsx","Box","SectionInnerGrid","theme","TWO_FACTOR_DOCS_LINK","TwoFactorEnrollmentForm","onTwoFactorEnrollmentSuccess","onBackClicked","totpSecret","totp","setTotp","useState","hasQrCode","setHasQrCode","showSecretInModal","setShowSecretInModal","qrCodeCanvasElement","useRef","finishEnrollment","isFinishingEnrollment","error","useFinishTwoFactorEnrollment","useEffect","createQrCode","toCanvas","StyledOuterContainer","jsxs","Paper","IconButton","IconSvg","Typography","Link","Stack","Divider","TwoFactorSecretDialog","SynapseSpinner","e","TextField","Button","FullWidthAlert","EXPORTED_FOR_UNIT_TESTING"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"TwoFactorEnrollmentForm.js","sources":["../../../src/components/Authentication/TwoFactorEnrollmentForm.tsx"],"sourcesContent":["import { StyledOuterContainer } from '@/components/styled/LeftRightPanel'\nimport { useFinishTwoFactorEnrollment } from '@/synapse-queries/auth/useTwoFactorEnrollment'\nimport { StyledComponent } from '@emotion/styled'\nimport {\n Box,\n BoxProps,\n Button,\n Divider,\n IconButton,\n Link,\n Paper,\n Stack,\n styled,\n Typography,\n} from '@mui/material'\nimport { TotpSecret } from '@sage-bionetworks/synapse-types'\nimport * as qrcode from 'qrcode'\n// qrcode is CJS-only; use namespace import for Vite dev mode CJS interop.\nconst { toCanvas } = qrcode\nimport { useEffect, useRef, useState } from 'react'\nimport FullWidthAlert from '../FullWidthAlert/FullWidthAlert'\nimport IconSvg from '../IconSvg/IconSvg'\nimport { SynapseSpinner } from '../LoadingScreen/LoadingScreen'\nimport TextField from '../TextField/TextField'\nimport TwoFactorSecretDialog from './TwoFactorSecretDialog'\n\n/**\n * Returns a URL that can be used to generate a QR code that 2FA authenticator apps can interpret.\n * This uses the username fro TotpSecret to create the friendly name for the account in the authenticator app.\n * @param secret\n */\nfunction toOtpAuthUrl(secret: TotpSecret) {\n return `otpauth://totp/Synapse:${secret.username}?secret=${secret.secret}&issuer=Sage%20Bionetworks&algorithm=${secret.alg}&digits=${secret.digits}&period=${secret.period}`\n}\n\nconst Section: StyledComponent<BoxProps> = styled(\n (props: BoxProps) => (\n <Box\n sx={{\n my: 3,\n ...props.sx,\n }}\n {...props}\n />\n ),\n {\n label: 'Section',\n },\n)(() => ({}))\n\nconst SectionInnerGrid = styled(Box, { label: 'SectionInnerGrid' })(\n ({ theme }) => ({\n display: 'grid',\n gridTemplateColumns: 'auto 200px',\n columnGap: theme.spacing(5),\n [theme.breakpoints.down('sm')]: {\n gridTemplateColumns: '1fr',\n gap: '18px',\n },\n }),\n)\n\nexport const TWO_FACTOR_DOCS_LINK =\n 'https://help.synapse.org/docs/Managing-Your-Account.2055405596.html#Adding-Two-Factor-Authentication-(2FA)-to-your-account'\n\nexport type TwoFactorEnrollmentFormProps = {\n totpSecret: TotpSecret\n onTwoFactorEnrollmentSuccess: () => void\n onBackClicked: () => void\n}\n\nexport default function TwoFactorEnrollmentForm(\n props: TwoFactorEnrollmentFormProps,\n) {\n const { onTwoFactorEnrollmentSuccess, onBackClicked, totpSecret } = props\n\n const [totp, setTotp] = useState('')\n const [hasQrCode, setHasQrCode] = useState(false)\n const [showSecretInModal, setShowSecretInModal] = useState(false)\n const qrCodeCanvasElement = useRef<HTMLCanvasElement>(null)\n\n const {\n mutate: finishEnrollment,\n isPending: isFinishingEnrollment,\n error,\n } = useFinishTwoFactorEnrollment({\n onSuccess: onTwoFactorEnrollmentSuccess,\n })\n\n useEffect(() => {\n async function createQrCode() {\n if (totpSecret && qrCodeCanvasElement.current) {\n await toCanvas(qrCodeCanvasElement.current, toOtpAuthUrl(totpSecret), {\n version: 10,\n margin: 0,\n scale: 3.5,\n })\n setHasQrCode(true)\n }\n }\n void createQrCode()\n }, [totpSecret])\n\n return (\n <StyledOuterContainer>\n <Paper\n sx={{\n position: 'relative',\n width: { xs: '100%', md: '800px' },\n py: 6.5,\n px: 8,\n mx: 'auto',\n }}\n >\n {onBackClicked && (\n <IconButton\n type=\"button\"\n onClick={() => {\n onBackClicked()\n }}\n sx={theme => ({\n position: 'absolute',\n top: theme.spacing(2),\n left: theme.spacing(2),\n })}\n >\n <IconSvg\n icon=\"arrowBack\"\n wrap={false}\n sx={{ height: '24px', width: '24px' }}\n />\n </IconButton>\n )}\n <Section>\n <Typography variant=\"headline2\" sx={{ mb: 3 }}>\n Activate Two-factor Authentication\n </Typography>\n <Typography variant=\"body1\">\n After setting up 2FA, you’ll use an authenticator app as part of\n your login process, in addition to your existing password. If you\n log in using your Google\n {/* eslint-disable-next-line no-constant-binary-expression -- Remove conditionality when NIH RAS login is supported */}\n {false && ', NIH RAS,'} or ORCiD account, you may need to use 2FA as\n part of\n {/*those processes*/}\n that process as well.{' '}\n <Link href={TWO_FACTOR_DOCS_LINK}>Learn more about 2FA</Link>.\n </Typography>\n </Section>\n <Section>\n <SectionInnerGrid>\n <Box>\n <Typography variant=\"body1\" sx={{ fontWeight: 700 }}>\n Step 1. Get one of these apps\n </Typography>\n <Typography variant=\"body1\">\n Download and install one of these authentication apps to set up\n 2FA on your mobile device, tablet, or desktop. If you have one\n of these apps already installed, you can skip this step.\n </Typography>\n </Box>\n <Stack\n sx={theme => ({\n justifyContent: 'space-between',\n flexShrink: 0,\n [theme.breakpoints.down('sm')]: {\n gap: '20px',\n },\n })}\n >\n <Link href={'https://authy.com/download/'}>Authy</Link>\n <Link\n href={\n 'https://duo.com/product/multi-factor-authentication-mfa/duo-mobile-app'\n }\n >\n DUO Mobile\n </Link>\n <Link href={'https://googleauthenticator.net/'}>\n Google Authenticator\n </Link>\n <Link\n href={\n 'https://www.microsoft.com/en-us/security/mobile-authenticator-app'\n }\n >\n Microsoft Authenticator\n </Link>\n </Stack>\n </SectionInnerGrid>\n </Section>\n <Divider />\n <Section>\n <SectionInnerGrid>\n <Box>\n <Typography variant=\"body1\" sx={{ fontWeight: 700 }}>\n Step 2. Scan the QR Code\n </Typography>\n <Typography component=\"ol\" variant=\"body1\" sx={{ pl: 2, my: 1 }}>\n <li>Open your authenticator app</li>\n <li>Tap the "+" button</li>\n <li>Use your camera to scan the image to the right</li>\n </Typography>\n <Link\n onClick={() => {\n setShowSecretInModal(true)\n }}\n >\n Can't use your camera?\n </Link>\n <TwoFactorSecretDialog\n secret={totpSecret?.secret ?? ''}\n open={showSecretInModal}\n onClose={() => setShowSecretInModal(false)}\n />\n </Box>\n <Box\n sx={{\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'middle',\n height: 'auto',\n }}\n >\n {!hasQrCode && <SynapseSpinner size={50} />}\n <canvas\n style={{ display: hasQrCode ? undefined : 'none' }}\n ref={qrCodeCanvasElement}\n />\n </Box>\n </SectionInnerGrid>\n </Section>\n <Divider />\n <Section>\n <SectionInnerGrid>\n <Box>\n <Typography variant=\"body1\" sx={{ fontWeight: 700 }}>\n Step 3. Enter the Verification Code\n </Typography>\n <Typography variant=\"body1\">\n After scanning in the QR code in step 2, your app will provide a\n 6-digit code. Enter it in in the field to the right.\n </Typography>\n </Box>\n <form\n onSubmit={e => {\n e.preventDefault()\n finishEnrollment({\n secretId: totpSecret.secretId,\n totp,\n })\n }}\n >\n <Stack\n direction={'row'}\n sx={{\n gap: 2,\n height: '48px',\n }}\n >\n <TextField\n noWrapInFormControl\n autoFocus\n inputProps={{ maxLength: totpSecret?.digits }}\n value={totp}\n onChange={e => {\n setTotp(e.target.value)\n }}\n />\n <Button\n type={'submit'}\n variant={'contained'}\n sx={{ flexShrink: 0 }}\n disabled={\n isFinishingEnrollment || totp.length != totpSecret?.digits\n }\n >\n Activate\n </Button>\n </Stack>\n </form>\n </SectionInnerGrid>\n </Section>\n {error && (\n <FullWidthAlert\n variant={'danger'}\n isGlobal={false}\n description={error.reason}\n />\n )}\n </Paper>\n </StyledOuterContainer>\n )\n}\n\nexport const EXPORTED_FOR_UNIT_TESTING = { toOtpAuthUrl }\n"],"names":["toCanvas","qrcode","toOtpAuthUrl","secret","Section","styled","props","jsx","Box","SectionInnerGrid","theme","TWO_FACTOR_DOCS_LINK","TwoFactorEnrollmentForm","onTwoFactorEnrollmentSuccess","onBackClicked","totpSecret","totp","setTotp","useState","hasQrCode","setHasQrCode","showSecretInModal","setShowSecretInModal","qrCodeCanvasElement","useRef","finishEnrollment","isFinishingEnrollment","error","useFinishTwoFactorEnrollment","useEffect","createQrCode","StyledOuterContainer","jsxs","Paper","IconButton","IconSvg","Typography","Link","Stack","Divider","TwoFactorSecretDialog","SynapseSpinner","e","TextField","Button","FullWidthAlert","EXPORTED_FOR_UNIT_TESTING"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
.
|
|
1
|
+
._BasePortalCard__root_1hm6w_1.MuiCard-root{position:relative;display:flex;flex-direction:column}._BasePortalCard__contentBelow_1hm6w_7{margin-top:15px}._BasePortalCard__content_1hm6w_7.MuiCardContent-root:last-child{padding:0;flex:1;display:flex;flex-direction:column}._BasePortalCard__media_1hm6w_18{height:50%;flex-shrink:0;overflow:hidden;border-bottom:1px solid rgba(0,0,0,.05)}@media(min-width:768px){._BasePortalCard__media_1hm6w_18{height:60%}}._BasePortalCard__media_1hm6w_18 .MuiCardMedia-root{height:100%}._small_1hm6w_33{width:100%;height:250px;min-height:150px}@media(min-width:768px){._small_1hm6w_33{width:250px}}._medium_1hm6w_44{width:100%;height:400px;min-height:200px}@media(min-width:768px){._medium_1hm6w_44{width:400px}}._large_1hm6w_55{width:100%;height:500px;min-height:300px}@media(min-width:768px){._large_1hm6w_55{width:600px}}
|
|
@@ -3,6 +3,8 @@
|
|
|
3
3
|
|
|
4
4
|
.BasePortalCard__root:global(.MuiCard-root) {
|
|
5
5
|
position: relative;
|
|
6
|
+
display: flex;
|
|
7
|
+
flex-direction: column;
|
|
6
8
|
}
|
|
7
9
|
|
|
8
10
|
.BasePortalCard__contentBelow {
|
|
@@ -11,10 +13,14 @@
|
|
|
11
13
|
|
|
12
14
|
.BasePortalCard__content:global(.MuiCardContent-root):last-child {
|
|
13
15
|
padding: 0;
|
|
16
|
+
flex: 1;
|
|
17
|
+
display: flex;
|
|
18
|
+
flex-direction: column;
|
|
14
19
|
}
|
|
15
20
|
|
|
16
21
|
.BasePortalCard__media {
|
|
17
22
|
height: 50%;
|
|
23
|
+
flex-shrink: 0;
|
|
18
24
|
overflow: hidden;
|
|
19
25
|
border-bottom: 1px solid rgba(0, 0, 0, 0.05);
|
|
20
26
|
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import './BasePortalCard.css';const a = "
|
|
1
|
+
import './BasePortalCard.css';const a = "_BasePortalCard__root_1hm6w_1", _ = "_BasePortalCard__contentBelow_1hm6w_7", t = "_BasePortalCard__content_1hm6w_7", o = "_BasePortalCard__media_1hm6w_18", e = "_small_1hm6w_33", r = "_medium_1hm6w_44", l = "_large_1hm6w_55", s = {
|
|
2
2
|
BasePortalCard__root: a,
|
|
3
3
|
BasePortalCard__contentBelow: _,
|
|
4
4
|
BasePortalCard__content: t,
|
package/dist/components/BasePortalCard/ColorfulPortalCardWithChips/ColorfulPortalCardWithChips.css
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
.
|
|
1
|
+
._ColorfulPortalCardWithChips__root_1uazc_1{position:relative}._ColorfulPortalCardWithChips__container_1uazc_5{height:100%;display:flex;justify-content:center;flex-direction:column;align-items:center;gap:20px;flex-wrap:wrap}@media(min-width:1024px){._ColorfulPortalCardWithChips__container_1uazc_5{flex-direction:row;align-items:flex-start;padding:40px 100px 20px}}._ColorfulPortalCardWithChips__titleSection_1uazc_22{color:#fff;max-width:310px;top:0;position:absolute;padding-left:30px;padding-top:65px}._ColorfulPortalCardWithChips__title_1uazc_22.MuiTypography-root{overflow:hidden;text-overflow:ellipsis;display:-webkit-box;-webkit-line-clamp:4;-webkit-box-orient:vertical;overflow-wrap:break-word}._ColorfulPortalCardWithChips__sectionTitle_1uazc_40.MuiTypography-root{color:var(--synapse-black);margin-bottom:25px;font-size:48px;line-height:80px;text-align:center}._ColorfulPortalCardWithChips__backgroundImage_1uazc_48.MuiCardMedia-root{background-size:contain}._ColorfulPortalCardWithChips__challengeName_1uazc_52.MuiTypography-root{font-weight:300;overflow:hidden;text-overflow:ellipsis;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow-wrap:break-word}._ColorfulPortalCardWithChips__sectionContainer_1uazc_62{flex:1}._ColorfulPortalCardWithChips__bottomSection_1uazc_66{min-height:0;flex:1;gap:12px;padding:30px;align-items:flex-start}._ColorfulPortalCardWithChips__descriptionTitle_1uazc_74.MuiTypography-root{color:var(--synapse-black);overflow:hidden;text-overflow:ellipsis;display:-webkit-box;-webkit-line-clamp:1;-webkit-box-orient:vertical}._ColorfulPortalCardWithChips__registrationStatus_1uazc_83.MuiChip-root{color:var(--synapse-gray-900);position:absolute;top:0;right:0;margin:26px 20px 0 0}._ColorfulPortalCardWithChips__chipsContainer_1uazc_92{display:flex;gap:5px;flex-wrap:wrap;max-width:400px}._ColorfulPortalCardWithChips__learnMoreButton_1uazc_99.MuiButton-root{display:flex;margin-top:auto;height:36px;padding:6px 16px;border-radius:8px;color:var(--synapse-black)!important;border:1px solid var(--synapse-black)!important}@media(max-width:768px){._ColorfulPortalCardWithChips__learnMoreButton_1uazc_99.MuiButton-root{width:100%}}._ColorfulPortalCardWithChips__chip_1uazc_92{flex-direction:row-reverse;padding-right:0;gap:5px;margin-bottom:5px}._ColorfulPortalCardWithChips__chip_1uazc_92.MuiChip-root .MuiChip-label{padding-right:0;color:var(--synapse-gray-900)}._ColorfulPortalCardWithChips__chip_1uazc_92.MuiChip-root .MuiChip-icon{margin-left:0;margin-right:5px;padding-right:5px;color:var(--synapse-black)}._ColorfulPortalCardWithChips__triangleImage_1uazc_133{position:absolute;left:10%;bottom:100%;transform:translate(-50%);z-index:1}@media(min-width:1024px){._ColorfulPortalCardWithChips__triangleImage_1uazc_133{left:35%}}._ColorfulPortalCardWithChips__circleImage_1uazc_146{position:absolute;left:10%;top:4%;transform:translate(-50%);z-index:1}@media(min-width:1024px){._ColorfulPortalCardWithChips__circleImage_1uazc_146{left:35%;top:7%}}._ColorfulPortalCardWithChips__doubleLineImage_1uazc_160{display:flex;position:absolute;left:42%;top:5%;transform:translate(-50%);z-index:1}@media(min-width:1024px){._ColorfulPortalCardWithChips__doubleLineImage_1uazc_160{left:45%;top:10%}}._ColorfulPortalCardWithChips__longLineImage_1uazc_175{position:absolute;right:10%;bottom:100%;transform:translate(-50%);z-index:1}@media(min-width:1024px){._ColorfulPortalCardWithChips__longLineImage_1uazc_175{right:5%;left:62%}}._ColorfulPortalCardWithChips__shortLineImage_1uazc_189{position:absolute;right:7%;transform:translate(-50%);z-index:1}@media(min-width:1024px){._ColorfulPortalCardWithChips__shortLineImage_1uazc_189{right:2%;left:63%}}._ColorfulPortalCardWithChips__description_1uazc_74 .markdown{--description-line-height: 20px;--description-max-lines: 3;overflow:hidden;text-overflow:ellipsis;display:-webkit-box;-webkit-line-clamp:var(--description-max-lines);-webkit-box-orient:vertical;min-height:calc(var(--description-max-lines) * var(--description-line-height))}._ColorfulPortalCardWithChips__description_1uazc_74 .markdown p{color:var(--synapse-black)!important;font-size:14px;line-height:var(--description-line-height)}
|