synapse-react-client 4.0.9 → 4.0.11
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.d.ts +1 -0
- package/dist/SWC.index.d.ts.map +1 -1
- package/dist/SWC.index.js +2 -1
- package/dist/SWC.index.js.map +1 -1
- package/dist/aridhia-queries/aridhiaTokenExchange.js.map +1 -1
- package/dist/aridhia-queries/useGetAridhiaRequests.js.map +1 -1
- package/dist/assets/icons/CloudWarning.d.ts +5 -0
- package/dist/assets/icons/CloudWarning.d.ts.map +1 -0
- package/dist/assets/icons/CloudWarning.js +47 -0
- package/dist/assets/icons/CloudWarning.js.map +1 -0
- package/dist/assets/icons/TasksIcon.d.ts.map +1 -1
- package/dist/assets/icons/TasksIcon.js +6 -10
- package/dist/assets/icons/TasksIcon.js.map +1 -1
- package/dist/components/AccessRequirementAclEditor/AccessRequirementAclEditor.d.ts.map +1 -1
- package/dist/components/AccessRequirementAclEditor/AccessRequirementAclEditor.js +69 -63
- package/dist/components/AccessRequirementAclEditor/AccessRequirementAclEditor.js.map +1 -1
- package/dist/components/AccessRequirementList/AccessApprovalCheckMark.js.map +1 -1
- package/dist/components/AccessRequirementList/AccessRequirementList.js.map +1 -1
- package/dist/components/AccessRequirementList/AccessRequirementListUtils.js.map +1 -1
- package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/DataAccessRequestAccessorsEditor.js.map +1 -1
- package/dist/components/AccessRequirementList/RequirementItem/SelfSignAccessRequirementItem.js.map +1 -1
- package/dist/components/AccessRequirementRelatedProjectsList/AccessRequirementRelatedProjectsList.js.map +1 -1
- package/dist/components/AccessTokenPage/AccessTokenCard/AccessTokenCard.js.map +1 -1
- package/dist/components/AcknowledgementsPage/StudyAcknowledgements.js.map +1 -1
- package/dist/components/AclEditor/PermissionLevelMenu.js.map +1 -1
- package/dist/components/AclEditor/ResourceAccessAndUserGroupHeader.js.map +1 -1
- package/dist/components/AclEditor/useSortResourceAccessList.js.map +1 -1
- package/dist/components/AclEditor/useUpdateAcl.js.map +1 -1
- package/dist/components/Aridhia/AridhiaAccessStatus.js.map +1 -1
- package/dist/components/Authentication/AuthenticationMethodSelection.d.ts.map +1 -1
- package/dist/components/Authentication/AuthenticationMethodSelection.js +38 -37
- package/dist/components/Authentication/AuthenticationMethodSelection.js.map +1 -1
- package/dist/components/Authentication/Constants.d.ts +1 -0
- package/dist/components/Authentication/Constants.d.ts.map +1 -1
- package/dist/components/Authentication/Constants.js +2 -2
- package/dist/components/Authentication/Constants.js.map +1 -1
- package/dist/components/Authentication/LastLoginInfo.js.map +1 -1
- package/dist/components/Authentication/RecoveryCodeForm.js.map +1 -1
- package/dist/components/Authentication/RecoveryCodeGrid.js.map +1 -1
- package/dist/components/Authentication/RegenerateBackupCodesWarning.js.map +1 -1
- package/dist/components/Authentication/Reset2FAWarning.js.map +1 -1
- package/dist/components/Authentication/StandaloneLoginForm.js +1 -1
- package/dist/components/Authentication/TwoFactorBackupCodes.js.map +1 -1
- package/dist/components/Authentication/TwoFactorEnrollmentForm.d.ts.map +1 -1
- package/dist/components/Authentication/TwoFactorEnrollmentForm.js +2 -1
- package/dist/components/Authentication/TwoFactorEnrollmentForm.js.map +1 -1
- package/dist/components/BasePortalCard/ColorfulPortalCardWithChips/ColorfulPortalCardWithChips.js.map +1 -1
- package/dist/components/CardContainer/CardContainer.js.map +1 -1
- package/dist/components/CardDeck/CardDeck.Mobile.js.map +1 -1
- package/dist/components/CardDeck/TableQueryCardDeck.js.map +1 -1
- package/dist/components/CertificationQuiz/CertificationQuiz.js.map +1 -1
- package/dist/components/ChallengeDataDownload/ChallengeDataDownload.js.map +1 -1
- package/dist/components/ChallengeSubmission/ChallengeSubmission.js.map +1 -1
- package/dist/components/ChallengeSubmission/ChallengeSubmissionStepper.js.map +1 -1
- package/dist/components/ChallengeSubmission/EvaluationQueueCurrentRoundInfo.js.map +1 -1
- package/dist/components/ChallengeSubmission/EvaluationQueueList.js.map +1 -1
- package/dist/components/ChallengeSubmission/SubmissionDirectoryList.d.ts.map +1 -1
- package/dist/components/ChallengeSubmission/SubmissionDirectoryList.js +143 -140
- package/dist/components/ChallengeSubmission/SubmissionDirectoryList.js.map +1 -1
- package/dist/components/ChallengeTeamWizard/ChallengeTeamWizard.js.map +1 -1
- package/dist/components/ChallengeTeamWizard/CreateChallengeTeam.js.map +1 -1
- package/dist/components/ChangePassword/ChangePassword.js.map +1 -1
- package/dist/components/ChangePassword/ChangePasswordWithToken.js.map +1 -1
- package/dist/components/ChangePassword/useChangePasswordFormState.js +1 -1
- package/dist/components/ChangePassword/useChangePasswordFormState.js.map +1 -1
- package/dist/components/CitationPopover/CitationPopoverContent.js.map +1 -1
- package/dist/components/ColumnFilter/ColumnFilter.js.map +1 -1
- package/dist/components/ComponentCollapse.js.map +1 -1
- package/dist/components/CookiesNotification/CookiesNotification.js.map +1 -1
- package/dist/components/CreateProjectModal/CreateProjectModal.js.map +1 -1
- package/dist/components/CreateTableViewWizard/CreateTableViewWizardUtils.js.map +1 -1
- package/dist/components/DataGrid/DataGrid.d.ts +0 -1
- package/dist/components/DataGrid/DataGrid.d.ts.map +1 -1
- package/dist/components/DataGrid/DataGrid.js +72 -72
- package/dist/components/DataGrid/DataGrid.js.map +1 -1
- package/dist/components/DataGrid/DataGridWebSocket.d.ts +4 -0
- package/dist/components/DataGrid/DataGridWebSocket.d.ts.map +1 -1
- package/dist/components/DataGrid/DataGridWebSocket.js +9 -8
- package/dist/components/DataGrid/DataGridWebSocket.js.map +1 -1
- package/dist/components/DataGrid/SynapseGrid.d.ts.map +1 -1
- package/dist/components/DataGrid/SynapseGrid.js +326 -268
- package/dist/components/DataGrid/SynapseGrid.js.map +1 -1
- package/dist/components/DataGrid/columns/AutocompleteColumn.d.ts +2 -0
- package/dist/components/DataGrid/columns/AutocompleteColumn.d.ts.map +1 -1
- package/dist/components/DataGrid/columns/AutocompleteColumn.js +124 -67
- package/dist/components/DataGrid/columns/AutocompleteColumn.js.map +1 -1
- package/dist/components/DataGrid/columns/AutocompleteMultipleEnumColumn.d.ts +2 -1
- package/dist/components/DataGrid/columns/AutocompleteMultipleEnumColumn.d.ts.map +1 -1
- package/dist/components/DataGrid/columns/AutocompleteMultipleEnumColumn.js +126 -122
- package/dist/components/DataGrid/columns/AutocompleteMultipleEnumColumn.js.map +1 -1
- package/dist/components/DataGrid/columns/useGridAutocompleteState.d.ts +58 -0
- package/dist/components/DataGrid/columns/useGridAutocompleteState.d.ts.map +1 -0
- package/dist/components/DataGrid/columns/useGridAutocompleteState.js +52 -0
- package/dist/components/DataGrid/columns/useGridAutocompleteState.js.map +1 -0
- package/dist/components/DataGrid/components/ValidationAlert.d.ts +5 -2
- package/dist/components/DataGrid/components/ValidationAlert.d.ts.map +1 -1
- package/dist/components/DataGrid/components/ValidationAlert.js +429 -24
- package/dist/components/DataGrid/components/ValidationAlert.js.map +1 -1
- package/dist/components/DataGrid/hooks/useColumnResizeHandles.js.map +1 -1
- package/dist/components/DataGrid/hooks/useGetSchemaForGrid.js.map +1 -1
- package/dist/components/DataGrid/hooks/useGridUndoRedo.js.map +1 -1
- package/dist/components/DataGrid/hooks/useStack.js.map +1 -1
- package/dist/components/DataGrid/useCRDTModelView.js.map +1 -1
- package/dist/components/DataGrid/useDataGridWebsocket.d.ts +7 -0
- package/dist/components/DataGrid/useDataGridWebsocket.d.ts.map +1 -1
- package/dist/components/DataGrid/useDataGridWebsocket.js +16 -2
- package/dist/components/DataGrid/useDataGridWebsocket.js.map +1 -1
- package/dist/components/DataGrid/useInitializeGridConnection.js.map +1 -1
- package/dist/components/DataGrid/useMergeGridWithRecordSet.js.map +1 -1
- package/dist/components/DataGrid/useMergeGridWithSource.js.map +1 -1
- package/dist/components/DataGrid/useMergeGridWithTable.js.map +1 -1
- package/dist/components/DataGrid/utils/DataGridUtils.js.map +1 -1
- package/dist/components/DataGrid/utils/applyModelChange.d.ts +1 -1
- package/dist/components/DataGrid/utils/applyModelChange.d.ts.map +1 -1
- package/dist/components/DataGrid/utils/applyModelChange.js +27 -24
- package/dist/components/DataGrid/utils/applyModelChange.js.map +1 -1
- package/dist/components/DataGrid/utils/columnFactory.d.ts +8 -0
- package/dist/components/DataGrid/utils/columnFactory.d.ts.map +1 -1
- package/dist/components/DataGrid/utils/columnFactory.js +47 -44
- package/dist/components/DataGrid/utils/columnFactory.js.map +1 -1
- package/dist/components/DataGrid/utils/computeReplicaSelectionModel.js.map +1 -1
- package/dist/components/DataGrid/utils/extractColumnValidationMessages.js.map +1 -1
- package/dist/components/DataGrid/utils/getCellClassName.d.ts.map +1 -1
- package/dist/components/DataGrid/utils/getCellClassName.js +8 -8
- package/dist/components/DataGrid/utils/getCellClassName.js.map +1 -1
- package/dist/components/DataGrid/utils/getEmptyValue.d.ts +2 -0
- package/dist/components/DataGrid/utils/getEmptyValue.d.ts.map +1 -0
- package/dist/components/DataGrid/utils/getEmptyValue.js +8 -0
- package/dist/components/DataGrid/utils/getEmptyValue.js.map +1 -0
- package/dist/components/DataGrid/utils/json-rx/JsonRx.js.map +1 -1
- package/dist/components/DataGrid/utils/modelColsToGrid.d.ts.map +1 -1
- package/dist/components/DataGrid/utils/modelColsToGrid.js +2 -1
- package/dist/components/DataGrid/utils/modelColsToGrid.js.map +1 -1
- package/dist/components/DataGrid/utils/modelRowsToGrid.js.map +1 -1
- package/dist/components/DataGrid/utils/parseFreeTextUsingJsonSchemaType.js.map +1 -1
- package/dist/components/DataGrid/utils/schemaAwarePasteValue.d.ts +32 -0
- package/dist/components/DataGrid/utils/schemaAwarePasteValue.d.ts.map +1 -0
- package/dist/components/DataGrid/utils/schemaAwarePasteValue.js +22 -0
- package/dist/components/DataGrid/utils/schemaAwarePasteValue.js.map +1 -0
- package/dist/components/DataGrid/utils/splitPatch.js.map +1 -1
- package/dist/components/DateTimePicker/DateTimePicker.js.map +1 -1
- package/dist/components/DirectDownload/DirectDownload.js.map +1 -1
- package/dist/components/DirectDownloadButton.js.map +1 -1
- package/dist/components/DownloadCart/CreatePackageV2.js.map +1 -1
- package/dist/components/DownloadCart/DownloadIneligibleForPackagingFilesFromListButton.css +1 -0
- package/dist/components/DownloadCart/DownloadIneligibleForPackagingFilesFromListButton.d.ts.map +1 -1
- package/dist/components/DownloadCart/DownloadIneligibleForPackagingFilesFromListButton.js +199 -132
- package/dist/components/DownloadCart/DownloadIneligibleForPackagingFilesFromListButton.js.map +1 -1
- package/dist/components/DownloadCart/DownloadIneligibleForPackagingFilesFromListButton.module.js +22 -0
- package/dist/components/DownloadCart/DownloadIneligibleForPackagingFilesFromListButton.module.js.map +1 -0
- package/dist/components/DownloadCart/DownloadIneligibleForPackagingFilesFromListButton.module.scss +170 -0
- package/dist/components/DownloadCart/DownloadListActionsRequired.js.map +1 -1
- package/dist/components/DownloadCart/DownloadListTable.js.map +1 -1
- package/dist/components/DownloadCart/fileNameUtils.js.map +1 -1
- package/dist/components/DraggableDialog/DraggableDialog.js.map +1 -1
- package/dist/components/DynamicForm/DynamicFormModal.js.map +1 -1
- package/dist/components/Ecosystem/TableQueryEcosystem.js.map +1 -1
- package/dist/components/EntityAclEditor/EntityAclEditor.d.ts.map +1 -1
- package/dist/components/EntityAclEditor/EntityAclEditor.js +103 -103
- package/dist/components/EntityAclEditor/EntityAclEditor.js.map +1 -1
- package/dist/components/EntityAclEditor/useNotifyNewACLUsers.js.map +1 -1
- package/dist/components/EntityBadgeIcons/EntityBadgeIcons.js.map +1 -1
- package/dist/components/EntityCitation/EntityCitation.js.map +1 -1
- package/dist/components/EntityDownloadButton/EntityDownloadButton.d.ts.map +1 -1
- package/dist/components/EntityDownloadButton/EntityDownloadButton.js +1 -0
- package/dist/components/EntityDownloadButton/EntityDownloadButton.js.map +1 -1
- package/dist/components/EntityDownloadConfirmation/EntityDownloadConfirmation.d.ts.map +1 -1
- package/dist/components/EntityDownloadConfirmation/EntityDownloadConfirmation.js +36 -30
- package/dist/components/EntityDownloadConfirmation/EntityDownloadConfirmation.js.map +1 -1
- package/dist/components/EntityFinder/EntityFinder.js.map +1 -1
- package/dist/components/EntityFinder/VersionSelectionType.js.map +1 -1
- package/dist/components/EntityFinder/details/configurations/EntityChildrenDetails.js.map +1 -1
- package/dist/components/EntityFinder/details/configurations/FavoritesDetails.js.map +1 -1
- package/dist/components/EntityFinder/details/configurations/ProjectListDetails.js.map +1 -1
- package/dist/components/EntityFinder/details/view/DetailsView.js.map +1 -1
- package/dist/components/EntityFinder/tree/EntityTree.js.map +1 -1
- package/dist/components/EntityFinder/tree/VirtualizedTree.js.map +1 -1
- package/dist/components/EntityFinder/useEntitySelection.js.map +1 -1
- package/dist/components/EntityForm/EntityForm.js.map +1 -1
- package/dist/components/EntityHeaderTable/EntityHeaderTable.js.map +1 -1
- package/dist/components/EntityHeaderTable/Filter.js.map +1 -1
- package/dist/components/EntityHeaderTable/useEntityHeaderTableState.js.map +1 -1
- package/dist/components/EntitySubjectsSelector/EntitySubjectsSelector.js.map +1 -1
- package/dist/components/EntityTreeTable/components/IdColumnHeader.js.map +1 -1
- package/dist/components/EntityTreeTable/hooks/useEntityTreeState.js.map +1 -1
- package/dist/components/EntityTreeTable/hooks/useTableColumns.js.map +1 -1
- package/dist/components/EntityTreeTable/hooks/useTableData.js.map +1 -1
- package/dist/components/EntityTreeTable/hooks/useTreeOperationsWithDirectFetch.js.map +1 -1
- package/dist/components/EntityUpload/EntityUpload.js.map +1 -1
- package/dist/components/EntityViewScopeEditor/EntityViewMaskEditor.d.ts.map +1 -1
- package/dist/components/EntityViewScopeEditor/EntityViewMaskEditor.js +15 -14
- package/dist/components/EntityViewScopeEditor/EntityViewMaskEditor.js.map +1 -1
- package/dist/components/ExperimentalMode/ExperimentalMode.js.map +1 -1
- package/dist/components/ExternalFileHandleLink/ExternalFileHandleLink.js.map +1 -1
- package/dist/components/FeaturedDataTabs/FacetPlotsCard.js.map +1 -1
- package/dist/components/FeaturedDataTabs/QueryPerFacetPlotsCard.js.map +1 -1
- package/dist/components/FeaturedDataTabs/SingleQueryFacetPlotsCards.js.map +1 -1
- package/dist/components/FeaturedResearch/FeaturedResearch.js.map +1 -1
- package/dist/components/FeaturedToolsList/FeaturedToolsList.js.map +1 -1
- package/dist/components/FilePreview/FileHandleContentRenderer.js.map +1 -1
- package/dist/components/FilePreview/HtmlPreview/HtmlPreview.js.map +1 -1
- package/dist/components/FilePreview/PreviewRendererType.js.map +1 -1
- package/dist/components/Forum/DiscussionReply.d.ts +1 -0
- package/dist/components/Forum/DiscussionReply.d.ts.map +1 -1
- package/dist/components/Forum/DiscussionReply.js +19 -19
- package/dist/components/Forum/DiscussionReply.js.map +1 -1
- package/dist/components/Forum/DiscussionSearchResult.js.map +1 -1
- package/dist/components/Forum/DiscussionThread.d.ts +1 -0
- package/dist/components/Forum/DiscussionThread.d.ts.map +1 -1
- package/dist/components/Forum/DiscussionThread.js +73 -72
- package/dist/components/Forum/DiscussionThread.js.map +1 -1
- package/dist/components/Forum/ForumTable.js.map +1 -1
- package/dist/components/Forum/ForumThreadEditor.js.map +1 -1
- package/dist/components/FullTextSearch/FullTextSearchUtils.js.map +1 -1
- package/dist/components/GenericCard/BioregistryRules.d.ts.map +1 -1
- package/dist/components/GenericCard/BioregistryRules.js +7 -3
- package/dist/components/GenericCard/BioregistryRules.js.map +1 -1
- package/dist/components/GenericCard/GenericCard.d.ts.map +1 -1
- package/dist/components/GenericCard/GenericCard.js +12 -7
- package/dist/components/GenericCard/GenericCard.js.map +1 -1
- package/dist/components/GenericCard/Linkify.js.map +1 -1
- package/dist/components/GenericCard/SynapseCardLabel.js.map +1 -1
- package/dist/components/GenericCard/TableRowGenericCard.js +105 -105
- package/dist/components/GenericCard/TableRowGenericCard.js.map +1 -1
- package/dist/components/Goals/Goals.Mobile.js.map +1 -1
- package/dist/components/Goals/Goals.js.map +1 -1
- package/dist/components/GoalsV2/GoalsV2.Mobile.js.map +1 -1
- package/dist/components/GoalsV2/GoalsV2.js.map +1 -1
- package/dist/components/GoalsV3/GoalsV3.Mobile.js.map +1 -1
- package/dist/components/GoalsV3/GoalsV3.js.map +1 -1
- package/dist/components/GoogleMap/SynapseUserMarker.js.map +1 -1
- package/dist/components/HasAccess/AccessIcon.js.map +1 -1
- package/dist/components/HasAccess/useHasAccess.js.map +1 -1
- package/dist/components/HeaderCard/HeaderCardV2.js.map +1 -1
- package/dist/components/HeaderCard.d.ts +6 -1
- package/dist/components/HeaderCard.d.ts.map +1 -1
- package/dist/components/HeaderCard.js +107 -76
- package/dist/components/HeaderCard.js.map +1 -1
- package/dist/components/HexGrid/HexGrid.js.map +1 -1
- package/dist/components/IconList.js.map +1 -1
- package/dist/components/IconSvg/IconSvg.d.ts.map +1 -1
- package/dist/components/IconSvg/IconSvg.js +2 -1
- package/dist/components/IconSvg/IconSvg.js.map +1 -1
- package/dist/components/ImageCardGridWithLinks/ImageCardGridWithLinks.js.map +1 -1
- package/dist/components/ImageFromSynapseTable.js.map +1 -1
- package/dist/components/JSONArrayEditor/useParseCsv.js.map +1 -1
- package/dist/components/JsonSchemaForm/templates/ArrayFieldDescriptionTemplate.js.map +1 -1
- package/dist/components/JsonSchemaForm/templates/ArrayFieldItemTemplate.js.map +1 -1
- package/dist/components/JsonSchemaForm/templates/BaseInputTemplate.js.map +1 -1
- package/dist/components/JsonSchemaForm/templates/FieldTemplate.js.map +1 -1
- package/dist/components/JsonSchemaForm/templates/RJSFInputLabel.js.map +1 -1
- package/dist/components/Markdown/MarkdownGithub.js.map +1 -1
- package/dist/components/Markdown/MarkdownSynapse.js.map +1 -1
- package/dist/components/Markdown/MarkdownUtils.js.map +1 -1
- package/dist/components/Markdown/SynapseWikiContext.js.map +1 -1
- package/dist/components/Markdown/UserMentionModal.js.map +1 -1
- package/dist/components/Markdown/widget/MarkdownProvenanceGraph.js.map +1 -1
- package/dist/components/MissingQueryResultsWarning/MissingQueryResultsWarning.js.map +1 -1
- package/dist/components/ModalDownload/ModalDownload.js.map +1 -1
- package/dist/components/OAuthClientAclEditor/OAuthClientAclEditor.d.ts.map +1 -1
- package/dist/components/OAuthClientAclEditor/OAuthClientAclEditor.js +45 -39
- package/dist/components/OAuthClientAclEditor/OAuthClientAclEditor.js.map +1 -1
- package/dist/components/OAuthClientManagement/OAuthManagement.js.map +1 -1
- package/dist/components/PageProgress/PageProgress.js.map +1 -1
- package/dist/components/Plot/DotPlot.js.map +1 -1
- package/dist/components/Plot/Plot.js.map +1 -1
- package/dist/components/Plot/SynapsePlot.js.map +1 -1
- package/dist/components/Plot/ThemesPlot.js.map +1 -1
- package/dist/components/Plot/UpsetPlot.js.map +1 -1
- package/dist/components/PortalAclEditor/PortalAclEditor.d.ts.map +1 -1
- package/dist/components/PortalAclEditor/PortalAclEditor.js +43 -41
- package/dist/components/PortalAclEditor/PortalAclEditor.js.map +1 -1
- package/dist/components/PortalFeaturedPartners/PortalFeaturedPartners.js.map +1 -1
- package/dist/components/PortalList/CreatePortalModal.js.map +1 -1
- package/dist/components/ProgrammaticInstructionsModal/ProgrammaticInstructionsModal.js.map +1 -1
- package/dist/components/ProgrammaticTableDownload/ProgrammaticTableDownload.js.map +1 -1
- package/dist/components/Programs/Programs.Mobile.js.map +1 -1
- package/dist/components/Programs/Programs.js.map +1 -1
- package/dist/components/ProvenanceGraph/ProvenanceExternalIcon.js.map +1 -1
- package/dist/components/ProvenanceGraph/ProvenanceGraph.js.map +1 -1
- package/dist/components/ProvenanceGraph/ProvenanceGraphUtils.js.map +1 -1
- package/dist/components/ProvenanceGraph/ProvenanceUtils.js.map +1 -1
- package/dist/components/QueryCount/QueryCount.js.map +1 -1
- package/dist/components/QueryCountButton/QueryCountButton.js.map +1 -1
- package/dist/components/QueryVisualizationWrapper/QueryVisualizationWrapper.js.map +1 -1
- package/dist/components/QueryWrapper/QueryWrapper.js.map +1 -1
- package/dist/components/QueryWrapper/TableQueryUseQueryOptions.js.map +1 -1
- package/dist/components/QueryWrapper/TableRowSelectionState.js.map +1 -1
- package/dist/components/QueryWrapper/generateEncodedPathAndQueryForSelectedFacetURL.js.map +1 -1
- package/dist/components/QueryWrapper/useGetQueryMetadata.js.map +1 -1
- package/dist/components/QueryWrapperErrorBoundary.js.map +1 -1
- package/dist/components/QueryWrapperPlotNav/QueryWrapperPlotNav.js.map +1 -1
- package/dist/components/QueryWrapperPlotNav/UseRowSet.js.map +1 -1
- package/dist/components/RecentPublicationsGrid/RecentPublicationsGrid.js.map +1 -1
- package/dist/components/ReleaseCard/ReleaseCardUtils.js.map +1 -1
- package/dist/components/ResizableContainer/hooks/useResizable.js.map +1 -1
- package/dist/components/Resources/Resources.Mobile.js.map +1 -1
- package/dist/components/Resources/Resources.js.map +1 -1
- package/dist/components/RowDataTable/RowDataTableWithQuery.js.map +1 -1
- package/dist/components/SageResourcesPopover/SageResourcesPopover.js.map +1 -1
- package/dist/components/SchemaDrivenAnnotationEditor/AnnotationEditorUtils.js.map +1 -1
- package/dist/components/SetAccessRequirementCommonFields/SetAccessRequirementCommonFields.js.map +1 -1
- package/dist/components/SetManagedAccessRequirementFields/SetManagedAccessRequirementFields.js.map +1 -1
- package/dist/components/SmartLink/SmartButton.js.map +1 -1
- package/dist/components/SmartLink/SmartLink.js.map +1 -1
- package/dist/components/SourceAppImage.js.map +1 -1
- package/dist/components/StandaloneQueryWrapper/StandaloneQueryWrapper.js.map +1 -1
- package/dist/components/StatisticsPlot.js.map +1 -1
- package/dist/components/StorybookComponentWrapper.js.map +1 -1
- package/dist/components/SubsectionRowRenderer/SubsectionRowRenderer.js.map +1 -1
- package/dist/components/SustainabilityScorecard/SustainabilityScorecard.js.map +1 -1
- package/dist/components/SynapseChat/GridAgentChat.js.map +1 -1
- package/dist/components/SynapseChat/SynapseChatInteraction.js.map +1 -1
- package/dist/components/SynapseChat/SynapseChatMessage.js.map +1 -1
- package/dist/components/SynapseChat/extractMessageFromTraceEvent.js.map +1 -1
- package/dist/components/SynapseForm/StepsSideNav.js.map +1 -1
- package/dist/components/SynapseForm/SummaryTable.js.map +1 -1
- package/dist/components/SynapseForm/SynapseForm.js +4 -2
- package/dist/components/SynapseForm/SynapseForm.js.map +1 -1
- package/dist/components/SynapseForm/SynapseFormWrapper.js.map +1 -1
- package/dist/components/SynapseHomepageV2/SynapseByTheNumbersItem.js.map +1 -1
- package/dist/components/SynapseHomepageV2/SynapseFeatureItem.js.map +1 -1
- package/dist/components/SynapseHomepageV2/SynapseHomepageChatSearch.js.map +1 -1
- package/dist/components/SynapseHomepageV2/SynapseHomepageSearch.js.map +1 -1
- package/dist/components/SynapseHomepageV2/SynapseInActionItem.js.map +1 -1
- package/dist/components/SynapseHomepageV2/SynapsePlans.js.map +1 -1
- package/dist/components/SynapseHomepageV2/SynapseTrendingProjects.js.map +1 -1
- package/dist/components/SynapseNavDrawer/SynapseNavDrawer.d.ts +8 -7
- package/dist/components/SynapseNavDrawer/SynapseNavDrawer.d.ts.map +1 -1
- package/dist/components/SynapseNavDrawer/SynapseNavDrawer.js +173 -164
- package/dist/components/SynapseNavDrawer/SynapseNavDrawer.js.map +1 -1
- package/dist/components/SynapsePortalBanners/SynapsePortalBanners.js.map +1 -1
- package/dist/components/SynapseSearchPageResults/SearchFacetPanel/SearchFacetPanel.js.map +1 -1
- package/dist/components/SynapseSearchPageResults/SearchFacetPanel/SearchFacetPanelUtils.js.map +1 -1
- package/dist/components/SynapseSearchPageResults/SynapseSearchPageResults.js.map +1 -1
- package/dist/components/SynapseTable/EntityIDColumnCopyIcon.js.map +1 -1
- package/dist/components/SynapseTable/NoContentPlaceholderType.js.map +1 -1
- package/dist/components/SynapseTable/RowSelection/RowSelectionControls.js.map +1 -1
- package/dist/components/SynapseTable/SynapseTableCell/SynapseTableCell.js.map +1 -1
- package/dist/components/SynapseTable/SynapseTableRenderers.js.map +1 -1
- package/dist/components/SynapseTable/datasets/DatasetItemsEditor.js.map +1 -1
- package/dist/components/SynapseTable/table-top/ColumnSelection.js.map +1 -1
- package/dist/components/SynapseTable/table-top/DownloadOptions.js.map +1 -1
- package/dist/components/SynapseTable/usePrefetchTableData.js.map +1 -1
- package/dist/components/TableColumnSchemaEditor/ColumnModelForm.js.map +1 -1
- package/dist/components/TableColumnSchemaEditor/ColumnModelFormFields/DefaultValueField.js.map +1 -1
- package/dist/components/TableColumnSchemaEditor/ImportTableColumnsButton.js.map +1 -1
- package/dist/components/TableColumnSchemaEditor/TableColumnSchemaEditorUtils.d.ts +1 -1
- package/dist/components/TableColumnSchemaEditor/TableColumnSchemaEditorUtils.d.ts.map +1 -1
- package/dist/components/TableColumnSchemaEditor/TableColumnSchemaEditorUtils.js.map +1 -1
- package/dist/components/TableColumnSchemaEditor/TableColumnSchemaForm.js.map +1 -1
- package/dist/components/TableColumnSchemaEditor/TableColumnSchemaFormReducer.js.map +1 -1
- package/dist/components/TableColumnSchemaEditor/Validators/ColumnModelValidator.js.map +1 -1
- package/dist/components/TableColumnSchemaEditor/Validators/DatetimeSchema.js.map +1 -1
- package/dist/components/TanStackTable/ColumnHeader.d.ts +1 -0
- package/dist/components/TanStackTable/ColumnHeader.d.ts.map +1 -1
- package/dist/components/TanStackTable/ColumnHeader.js +8 -8
- package/dist/components/TanStackTable/ColumnHeader.js.map +1 -1
- package/dist/components/TanStackTable/ColumnHeaderEnumFilter.js.map +1 -1
- package/dist/components/TanStackTable/TableBody.js.map +1 -1
- package/dist/components/TeamSubjectsSelector/TeamSubjectsSelector.js.map +1 -1
- package/dist/components/TextField/TextField.js.map +1 -1
- package/dist/components/TimelinePlot/TimelinePhase.js.map +1 -1
- package/dist/components/TimelinePlot/TimelinePlot.js.map +1 -1
- package/dist/components/TimelinePlot/TimelinePlotSpeciesSelector.js.map +1 -1
- package/dist/components/UserCard/Avatar.js.map +1 -1
- package/dist/components/UserCardList/UserCardList.js.map +1 -1
- package/dist/components/UserCardList/UserCardListGroups/UserCardListGroups.Mobile.js.map +1 -1
- package/dist/components/UserCardList/UserCardListRotate.js.map +1 -1
- package/dist/components/UserOrTeamBadge/useUserOrTeam.js.map +1 -1
- package/dist/components/UserProfileLinks/UserProjects.js.map +1 -1
- package/dist/components/UserSearchBox/UserSearchBox.js.map +1 -1
- package/dist/components/Webhook/WebhookDashboard.js.map +1 -1
- package/dist/components/WikiMarkdownEditor/WikiMarkdownEditor.js.map +1 -1
- package/dist/components/WikiMarkdownEditorButton/WikiMarkdownEditorButton.js.map +1 -1
- package/dist/components/dataaccess/AccessApprovalsTable.js.map +1 -1
- package/dist/components/dataaccess/AccessRequestSubmissionTable.js.map +1 -1
- package/dist/components/dataaccess/SubmissionPage/SubmissionPage.d.ts.map +1 -1
- package/dist/components/dataaccess/SubmissionPage/SubmissionPage.js +157 -148
- package/dist/components/dataaccess/SubmissionPage/SubmissionPage.js.map +1 -1
- package/dist/components/dataaccess/UseAccessRequirementTable.js.map +1 -1
- package/dist/components/dataaccess/UserAccessRequestHistory/UserAccessRequestHistoryTable.js.map +1 -1
- package/dist/components/doi/CreateOrUpdateDoiModal.d.ts.map +1 -1
- package/dist/components/doi/CreateOrUpdateDoiModal.js +20 -19
- package/dist/components/doi/CreateOrUpdateDoiModal.js.map +1 -1
- package/dist/components/entity/page/CreatedByModifiedBy.js.map +1 -1
- package/dist/components/entity/page/action_menu/EntityActionMenu.js.map +1 -1
- package/dist/components/entity/page/title_bar/useDataCiteUsage.js.map +1 -1
- package/dist/components/entity/page/title_bar/useGetMentions.js.map +1 -1
- package/dist/components/error/ErrorPage.js.map +1 -1
- package/dist/components/favorites/FavoritesPage.js.map +1 -1
- package/dist/components/file/upload/BasicFileHandleUpload.js.map +1 -1
- package/dist/components/layout/SWCHeader.d.ts +9 -0
- package/dist/components/layout/SWCHeader.d.ts.map +1 -0
- package/dist/components/layout/SWCHeader.js +19 -0
- package/dist/components/layout/SWCHeader.js.map +1 -0
- package/dist/components/layout/SWCPageLayout.d.ts +9 -0
- package/dist/components/layout/SWCPageLayout.d.ts.map +1 -0
- package/dist/components/layout/SWCPageLayout.js +14 -0
- package/dist/components/layout/SWCPageLayout.js.map +1 -0
- package/dist/components/menu/ComplexMenu.js.map +1 -1
- package/dist/components/row_renderers/utils/ChipContainer.js.map +1 -1
- package/dist/components/styled/StyledPopover.js.map +1 -1
- package/dist/components/table/CsvPreview/CsvPreview.js +2 -1
- package/dist/components/table/CsvPreview/CsvPreview.js.map +1 -1
- package/dist/components/table/CsvPreview/CsvPreviewDialog.js.map +1 -1
- package/dist/components/trash/TrashCanList.js.map +1 -1
- package/dist/components/widgets/FileHandleLink.js.map +1 -1
- package/dist/components/widgets/RangeSlider/RangeSlider.js.map +1 -1
- package/dist/components/widgets/SynapseVideo.js.map +1 -1
- package/dist/components/widgets/facet-nav/FacetNavPanel.js.map +1 -1
- package/dist/components/widgets/facet-nav/PlotsContainer.js.map +1 -1
- package/dist/components/widgets/facet-nav/SelectionCriteriaPills.js.map +1 -1
- package/dist/components/widgets/facet-nav/useFacetPlots.js.map +1 -1
- package/dist/components/widgets/query-filter/CombinedRangeFacetFilter.js.map +1 -1
- package/dist/components/widgets/query-filter/EnumFacetFilter/EnumFacetFilter.js.map +1 -1
- package/dist/components/widgets/query-filter/FacetFilterControls.js.map +1 -1
- package/dist/components/widgets/query-filter/RangeFacetFilter.js.map +1 -1
- package/dist/components/widgets/query-filter/RangeFacetFilterUI.js.map +1 -1
- package/dist/features/curator/GridPage/components/GridPageTitle.d.ts.map +1 -1
- package/dist/features/curator/GridPage/components/GridPageTitle.js +23 -30
- package/dist/features/curator/GridPage/components/GridPageTitle.js.map +1 -1
- package/dist/features/curator/dashboard/CuratorDashboard.d.ts +2 -0
- package/dist/features/curator/dashboard/CuratorDashboard.d.ts.map +1 -0
- package/dist/features/curator/dashboard/CuratorDashboard.js +45 -0
- package/dist/features/curator/dashboard/CuratorDashboard.js.map +1 -0
- package/dist/features/curator/dashboard/components/CurationTaskCard.css +1 -0
- package/dist/features/curator/dashboard/components/CurationTaskCard.d.ts +9 -0
- package/dist/features/curator/dashboard/components/CurationTaskCard.d.ts.map +1 -0
- package/dist/features/curator/dashboard/components/CurationTaskCard.js +106 -0
- package/dist/features/curator/dashboard/components/CurationTaskCard.js.map +1 -0
- package/dist/features/curator/dashboard/components/CurationTaskCard.module.js +12 -0
- package/dist/features/curator/dashboard/components/CurationTaskCard.module.js.map +1 -0
- package/dist/features/curator/dashboard/components/CurationTaskCard.module.scss +52 -0
- package/dist/features/curator/dashboard/components/NextStepButton.css +1 -0
- package/dist/features/curator/dashboard/components/NextStepButton.d.ts +14 -0
- package/dist/features/curator/dashboard/components/NextStepButton.d.ts.map +1 -0
- package/dist/features/curator/dashboard/components/NextStepButton.js +35 -0
- package/dist/features/curator/dashboard/components/NextStepButton.js.map +1 -0
- package/dist/features/curator/dashboard/components/NextStepButton.module.js +11 -0
- package/dist/features/curator/dashboard/components/NextStepButton.module.js.map +1 -0
- package/dist/features/curator/dashboard/components/NextStepButton.module.scss +57 -0
- package/dist/features/curator/dashboard/components/UserOrTeamChip.css +1 -1
- package/dist/features/curator/dashboard/components/UserOrTeamChip.module.js +1 -1
- package/dist/features/curator/dashboard/components/UserOrTeamChip.module.js.map +1 -1
- package/dist/features/curator/dashboard/components/UserOrTeamChip.module.scss +5 -5
- package/dist/features/curator/dashboard/components/shared.css +1 -0
- package/dist/features/curator/dashboard/components/shared.module.js +5 -0
- package/dist/features/curator/dashboard/components/shared.module.js.map +1 -0
- package/dist/features/curator/dashboard/components/shared.module.scss +8 -0
- package/dist/features/entity/metadata-task/components/MetadataTaskTableActionCell.d.ts +0 -2
- package/dist/features/entity/metadata-task/components/MetadataTaskTableActionCell.d.ts.map +1 -1
- package/dist/features/entity/metadata-task/components/MetadataTaskTableActionCell.js +16 -34
- package/dist/features/entity/metadata-task/components/MetadataTaskTableActionCell.js.map +1 -1
- package/dist/features/entity/metadata-task/components/MetadataTasksTableAssigneeCell.d.ts.map +1 -1
- package/dist/features/entity/metadata-task/components/MetadataTasksTableAssigneeCell.js +1 -1
- package/dist/features/entity/metadata-task/components/MetadataTasksTableAssigneeCell.js.map +1 -1
- package/dist/features/entity/metadata-task/hooks/useGetOrCreateGridSessionForSource.js.map +1 -1
- package/dist/features/entity/metadata-task/hooks/useGridSessionForCurationTask.js.map +1 -1
- package/dist/features/entity/metadata-task/hooks/useGridSessionForCurationTask_legacy.js.map +1 -1
- package/dist/features/entity/metadata-task/hooks/useMetadataTaskTable.js +1 -1
- package/dist/features/entity/metadata-task/hooks/useMetadataTaskTable.js.map +1 -1
- package/dist/features/entity/metadata-task/hooks/useOpenCuratorButton.d.ts +10 -0
- package/dist/features/entity/metadata-task/hooks/useOpenCuratorButton.d.ts.map +1 -0
- package/dist/features/entity/metadata-task/hooks/useOpenCuratorButton.js +37 -0
- package/dist/features/entity/metadata-task/hooks/useOpenCuratorButton.js.map +1 -0
- package/dist/features/entity/metadata-task/utils/constants.d.ts +5 -0
- package/dist/features/entity/metadata-task/utils/constants.d.ts.map +1 -0
- package/dist/features/entity/metadata-task/utils/constants.js +6 -0
- package/dist/features/entity/metadata-task/utils/constants.js.map +1 -0
- package/dist/mocks/challenge/mockChallenge.js.map +1 -1
- package/dist/mocks/entity/mockDataset.js.map +1 -1
- package/dist/mocks/entity/mockDatasetCollection.js.map +1 -1
- package/dist/mocks/entity/mockFileEntity.js.map +1 -1
- package/dist/mocks/entity/mockFileView.js.map +1 -1
- package/dist/mocks/entity/mockGeneratedEntityData.js.map +1 -1
- package/dist/mocks/entity/mockProject.js.map +1 -1
- package/dist/mocks/entity/mockProjectView.js.map +1 -1
- package/dist/mocks/entity/mockRootEntity.js.map +1 -1
- package/dist/mocks/entity/mockTableEntity.js.map +1 -1
- package/dist/mocks/mockWiki.js.map +1 -1
- package/dist/mocks/msw/handlers/asyncJobHandlers.js.map +1 -1
- package/dist/mocks/msw/handlers/challengeHandlers.js.map +1 -1
- package/dist/mocks/msw/handlers/changePasswordHandlers.js.map +1 -1
- package/dist/mocks/msw/handlers/discussionHandlers.js.map +1 -1
- package/dist/mocks/msw/handlers/entityHandlers.js.map +1 -1
- package/dist/mocks/msw/handlers/fileHandlers.js.map +1 -1
- package/dist/mocks/msw/handlers/gridHandlers.js.map +1 -1
- package/dist/mocks/msw/handlers/personalAccessTokenHandlers.js.map +1 -1
- package/dist/mocks/msw/handlers/subscriptionHandlers.js.map +1 -1
- package/dist/mocks/msw/handlers/teamHandlers.js.map +1 -1
- package/dist/mocks/msw/handlers/userProfileHandlers.js.map +1 -1
- package/dist/mocks/msw/handlers/wikiHandlers.js.map +1 -1
- package/dist/mocks/provenance/mockActivity.js.map +1 -1
- package/dist/mocks/query/mockReleaseCardsTableQueryResultBundle.js.map +1 -1
- package/dist/ror-client/index.js.map +1 -1
- package/dist/style/components/_cards.scss +4 -0
- package/dist/style/components/_data-grid-extra.css +1 -1
- package/dist/style/components/_data-grid-extra.scss +2 -0
- package/dist/style/main.css +1 -1
- package/dist/synapse-client/HttpClient.js.map +1 -1
- package/dist/synapse-client/SynapseClient.js.map +1 -1
- package/dist/synapse-queries/KeyFactory.d.ts +1 -0
- package/dist/synapse-queries/KeyFactory.d.ts.map +1 -1
- package/dist/synapse-queries/KeyFactory.js +3 -0
- package/dist/synapse-queries/KeyFactory.js.map +1 -1
- package/dist/synapse-queries/QueryMatching.test-utils.js.map +1 -1
- package/dist/synapse-queries/auth/useTwoFactorEnrollment.js.map +1 -1
- package/dist/synapse-queries/curation/task/useCurationTask.d.ts +1 -1
- package/dist/synapse-queries/curation/task/useCurationTask.d.ts.map +1 -1
- package/dist/synapse-queries/curation/task/useCurationTask.js +1 -1
- package/dist/synapse-queries/curation/task/useCurationTask.js.map +1 -1
- package/dist/synapse-queries/dataaccess/useRestrictionInformation.js.map +1 -1
- package/dist/synapse-queries/doi/useDOI.js.map +1 -1
- package/dist/synapse-queries/download/useDownloadList.js.map +1 -1
- package/dist/synapse-queries/entity/useEntity.js.map +1 -1
- package/dist/synapse-queries/entity/useEntityBundle.js.map +1 -1
- package/dist/synapse-queries/entity/useExportTableQueryToAnalysisPlatform.js.map +1 -1
- package/dist/synapse-queries/entity/useExportToTerra.js.map +1 -1
- package/dist/synapse-queries/entity/useGetQueryResultBundle.js.map +1 -1
- package/dist/synapse-queries/entity/useSchema.js.map +1 -1
- package/dist/synapse-queries/file/UploadToS3.js.map +1 -1
- package/dist/synapse-queries/file/useDirectUploadToS3.js.map +1 -1
- package/dist/synapse-queries/file/useFiles.js.map +1 -1
- package/dist/synapse-queries/forum/useReply.js.map +1 -1
- package/dist/synapse-queries/forum/useThread.d.ts +1 -0
- package/dist/synapse-queries/forum/useThread.d.ts.map +1 -1
- package/dist/synapse-queries/forum/useThread.js +19 -12
- package/dist/synapse-queries/forum/useThread.js.map +1 -1
- package/dist/synapse-queries/grid/useEstablishWebsocketConnection.d.ts +2 -0
- package/dist/synapse-queries/grid/useEstablishWebsocketConnection.d.ts.map +1 -1
- package/dist/synapse-queries/grid/useEstablishWebsocketConnection.js.map +1 -1
- package/dist/synapse-queries/grid/useExportGrid.js.map +1 -1
- package/dist/synapse-queries/grid/useGridSession.js.map +1 -1
- package/dist/synapse-queries/grid/useImportCsvIntoGrid.js.map +1 -1
- package/dist/synapse-queries/subscription/useSubscription.js.map +1 -1
- package/dist/synapse-queries/table/useGetCsvPreview.js.map +1 -1
- package/dist/synapse-queries/table/useTableUpdateTransaction.js.map +1 -1
- package/dist/synapse-queries/team/useTeamMembers.js.map +1 -1
- package/dist/synapse-queries/user/useGetUserChallenges.js.map +1 -1
- package/dist/synapse-queries/user/useUserBundle.js.map +1 -1
- package/dist/synapse-queries/user/useUserGroupHeader.js.map +1 -1
- package/dist/testutils/ReactQueryMockUtils.js.map +1 -1
- package/dist/theme/ThemeProvider.js.map +1 -1
- package/dist/tsconfig.build.tsbuildinfo +1 -1
- package/dist/utils/APIConstants.d.ts +1 -0
- package/dist/utils/APIConstants.d.ts.map +1 -1
- package/dist/utils/APIConstants.js +2 -2
- package/dist/utils/APIConstants.js.map +1 -1
- package/dist/utils/AppUtils/session/ApplicationSessionManager.d.ts.map +1 -1
- package/dist/utils/AppUtils/session/ApplicationSessionManager.js +7 -4
- package/dist/utils/AppUtils/session/ApplicationSessionManager.js.map +1 -1
- package/dist/utils/AppUtils/session/SynapseSessionManager.js.map +1 -1
- package/dist/utils/AppUtils/session/useSessionManager.js.map +1 -1
- package/dist/utils/PermissionLevelToAccessType.js.map +1 -1
- package/dist/utils/challenge/evaluation/EvaluationUtils.js.map +1 -1
- package/dist/utils/context/SynapseContext.js.map +1 -1
- package/dist/utils/functions/AccessControlListUtils.d.ts +4 -0
- package/dist/utils/functions/AccessControlListUtils.d.ts.map +1 -1
- package/dist/utils/functions/AccessControlListUtils.js +12 -1
- package/dist/utils/functions/AccessControlListUtils.js.map +1 -1
- package/dist/utils/functions/EntityTypeUtils.d.ts.map +1 -1
- package/dist/utils/functions/EntityTypeUtils.js +15 -4
- package/dist/utils/functions/EntityTypeUtils.js.map +1 -1
- package/dist/utils/functions/GridApiUtils.js.map +1 -1
- package/dist/utils/functions/QueryFilterUtils.js.map +1 -1
- package/dist/utils/functions/RealmUtils.d.ts +4 -0
- package/dist/utils/functions/RealmUtils.d.ts.map +1 -1
- package/dist/utils/functions/RealmUtils.js +9 -3
- package/dist/utils/functions/RealmUtils.js.map +1 -1
- package/dist/utils/functions/SanitizeHtmlUtils.js.map +1 -1
- package/dist/utils/functions/SanitizeHtmlUtils.test-utils.js.map +1 -1
- package/dist/utils/functions/SqlFunctions.js.map +1 -1
- package/dist/utils/functions/StringUtils.js.map +1 -1
- package/dist/utils/functions/deepLinkingUtils.js.map +1 -1
- package/dist/utils/functions/getDataFromFromStorage.js.map +1 -1
- package/dist/utils/functions/getEndpoint.js.map +1 -1
- package/dist/utils/functions/getUserData.js.map +1 -1
- package/dist/utils/functions/queryUtils.js.map +1 -1
- package/dist/utils/functions/testDownloadSpeed.js.map +1 -1
- package/dist/utils/hooks/useConfirmItems.js.map +1 -1
- package/dist/utils/hooks/useCookiePreferences.js.map +1 -1
- package/dist/utils/hooks/useCreateShortUrl.js.map +1 -1
- package/dist/utils/hooks/useDetectSSOCode.js.map +1 -1
- package/dist/utils/hooks/useDirectDownloadHandler.js.map +1 -1
- package/dist/utils/hooks/useGetGoalData.js.map +1 -1
- package/dist/utils/hooks/useGetInfoFromIds.js.map +1 -1
- package/dist/utils/hooks/useImageUrlUtils.js.map +1 -1
- package/dist/utils/hooks/useImmutableTableQuery/useImmutableTableQuery.js.map +1 -1
- package/dist/utils/hooks/useImmutableTableQuery/useTableQueryReducer.js.map +1 -1
- package/dist/utils/hooks/useIsBot.js.map +1 -1
- package/dist/utils/hooks/useListState.js.map +1 -1
- package/dist/utils/hooks/useLogin.d.ts.map +1 -1
- package/dist/utils/hooks/useLogin.js +53 -52
- package/dist/utils/hooks/useLogin.js.map +1 -1
- package/dist/utils/hooks/useMutuallyExclusiveState.js.map +1 -1
- package/dist/utils/hooks/useOverlay.js.map +1 -1
- package/dist/utils/hooks/usePreFetchResource.js.map +1 -1
- package/dist/utils/hooks/useQuerySearchParam.js.map +1 -1
- package/dist/utils/hooks/useScrollFadeTransition.js.map +1 -1
- package/dist/utils/hooks/useSet.js.map +1 -1
- package/dist/utils/hooks/useSourceAppConfigs.js.map +1 -1
- package/dist/utils/hooks/useTableImageUrl.js.map +1 -1
- package/dist/utils/hooks/useUploadFileEntity/useCreatePathsAndGetParentId.js.map +1 -1
- package/dist/utils/hooks/useUploadFileEntity/useLinkFileEntityToURL.js.map +1 -1
- package/dist/utils/hooks/useUploadFileEntity/usePrepareFileEntityUpload.js.map +1 -1
- package/dist/utils/hooks/useUploadFileEntity/useTrackFileUploads.js.map +1 -1
- package/dist/utils/hooks/useUploadFileEntity/useUploadFileEntities.js.map +1 -1
- package/dist/utils/hooks/useUploadFileEntity/useUploadFiles.js.map +1 -1
- package/dist/utils/hooks/useUploadFileEntity/willUploadsExceedStorageLimit.js.map +1 -1
- package/dist/utils/html/TargetEnum.js.map +1 -1
- package/dist/utils/jsonschema/SchemaAnnotationUtils.js.map +1 -1
- package/package.json +5 -5
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AccessRequirementList.js","names":[],"sources":["../../../src/components/AccessRequirementList/AccessRequirementList.tsx"],"sourcesContent":["import {\n useGetAccessRequirementsForEntity,\n useGetAccessRequirementsForTeam,\n useSortAccessRequirementIdsByCompletion,\n} from '@/synapse-queries'\nimport {\n storeRedirectURLForOneSageLoginAndGotoURL,\n useSynapseContext,\n} from '@/utils'\nimport { StyledComponent } from '@emotion/styled'\nimport {\n Button,\n Dialog,\n DialogActions,\n DialogContent,\n styled,\n Typography,\n TypographyProps,\n} from '@mui/material'\nimport {\n AccessRequirement,\n ACT_ACCESS_REQUIREMENT_CONCRETE_TYPE_VALUE,\n LOCK_ACCESS_REQUIREMENT_CONCRETE_TYPE_VALUE,\n MANAGED_ACT_ACCESS_REQUIREMENT_CONCRETE_TYPE_VALUE,\n ManagedACTAccessRequirement,\n Renewal,\n Request,\n RestrictableObjectType,\n SELF_SIGN_ACCESS_REQUIREMENT_CONCRETE_TYPE_VALUE,\n TERMS_OF_USE_ACCESS_REQUIREMENT_CONCRETE_TYPE_VALUE,\n} from '@sage-bionetworks/synapse-types'\nimport noop from 'lodash-es/noop'\nimport groupBy from 'lodash-es/groupBy'\nimport { ReactNode, useMemo, useState } from 'react'\nimport { DialogBaseTitle } from '../DialogBase'\nimport { EntityLink } from '../EntityLink'\nimport IconSvg from '../IconSvg/IconSvg'\nimport UserOrTeamBadge from '../UserOrTeamBadge'\nimport { AccessRequirementListItem } from './AccessRequirementListItem'\nimport { useCanShowManagedACTWikiInWizard } from './AccessRequirementListUtils'\nimport CancelRequestDataAccess from './ManagedACTAccessRequirementRequestFlow/CancelRequestDataAccess'\nimport DataAccessRequestAccessorsFilesForm from './ManagedACTAccessRequirementRequestFlow/DataAccessRequestAccessorsFilesForm/DataAccessRequestAccessorsFilesForm'\nimport RequestDataAccessSuccess from './ManagedACTAccessRequirementRequestFlow/RequestDataAccessSuccess'\nimport ResearchProjectForm from './ManagedACTAccessRequirementRequestFlow/ResearchProjectForm/ResearchProjectForm'\nimport AuthenticatedRequirement from './RequirementItem/AuthenticatedRequirement'\nimport CertificationRequirement from './RequirementItem/CertificationRequirement'\nimport TwoFactorAuthEnabledRequirement from './RequirementItem/TwoFactorAuthEnabledRequirement'\nimport ValidationRequirement from './RequirementItem/ValidationRequirement'\nimport { useOneSageURL } from '@/utils/hooks'\n\nexport type AccessRequirementListProps = {\n /* if provided, will show this instead of the entity information */\n numberOfFilesAffected?: number\n /* if provided, will show this instead of the entity information or numberOfFilesAffected */\n requestObjectName?: string\n /* If true, this component will render in its own modal */\n renderAsModal?: boolean\n /* Overrides the default dialog title. This only applies if renderAsModal is true */\n dialogTitle?: string\n /* Called when the user rejects the terms of a listed AccessRequirement. If renderAsModal is true, this is also called when the user closes the modal. */\n onHide: () => void\n /* Displays the provided list of access requirements, instead of the ones fetched using the subject ID */\n accessRequirementFromProps?: Array<AccessRequirement>\n /* If provided, displays these actions on when viewing all ARs */\n customDialogActions?: ReactNode\n /* Optional callback invoked if a submission is created via this component */\n onSubmissionCreated?: (submissionId: string) => void\n} & (\n | {\n /**\n * Fetches the access requirements associated with an entity\n * @deprecated Please use `subjectId` and `subjectType`\n */\n entityId: string\n }\n | {\n /**\n * Fetches the access requirements associated with a team\n * @deprecated Please use `subjectId` and `subjectType`\n */\n teamId: string\n }\n | {\n /* The ID of the object for which access is being requested */\n subjectId?: string\n /* The type of the object for which access is being requested */\n subjectType?: RestrictableObjectType\n }\n)\n\nconst SUPPORTED_ACCESS_REQUIREMENT_TYPES_SORTED: AccessRequirement['concreteType'][] =\n [\n SELF_SIGN_ACCESS_REQUIREMENT_CONCRETE_TYPE_VALUE,\n TERMS_OF_USE_ACCESS_REQUIREMENT_CONCRETE_TYPE_VALUE,\n MANAGED_ACT_ACCESS_REQUIREMENT_CONCRETE_TYPE_VALUE,\n ACT_ACCESS_REQUIREMENT_CONCRETE_TYPE_VALUE,\n LOCK_ACCESS_REQUIREMENT_CONCRETE_TYPE_VALUE,\n ]\n\nconst SUPPORTED_ACCESS_REQUIREMENT_TYPES = new Set<\n AccessRequirement['concreteType']\n>(SUPPORTED_ACCESS_REQUIREMENT_TYPES_SORTED)\n\nconst DialogSubsectionHeader: StyledComponent<TypographyProps> = styled(\n Typography,\n {\n label: 'DialogSubsectionHeader',\n },\n)(({ theme }) => ({\n marginTop: theme.spacing(4),\n marginBottom: theme.spacing(2),\n paddingBottom: theme.spacing(1),\n fontSize: '18px',\n fontWeight: 'bold',\n borderBottom: '1px solid',\n borderColor: theme.palette.grey['200'],\n}))\n\nexport const checkHasUnsupportedRequirement = (\n accessRequirements: Array<AccessRequirement>,\n): boolean => {\n return accessRequirements.some(isARUnsupported)\n}\n\nconst isARUnsupported = (accessRequirement: AccessRequirement) => {\n return !SUPPORTED_ACCESS_REQUIREMENT_TYPES.has(accessRequirement.concreteType)\n}\n\n/**\n * Represents a distinct screen in the wizard used to apply to a ManagedACTAccessRequirement\n */\nenum RequestDataStep {\n SHOW_ALL_ARS = 0,\n UPDATE_RESEARCH_PROJECT = 1,\n UPDATE_ACCESSORS_AND_FILES = 2,\n PROMPT_CANCEL = 3,\n PROMPT_LOGIN = 4,\n COMPLETE = 5,\n}\n\nexport type RequestDataStepCallbackArgs = {\n step: RequestDataStep\n managedACTAccessRequirement?: ManagedACTAccessRequirement\n researchProjectId?: string\n dataAccessRequest?: Request | Renewal\n}\n\n/**\n * The AccessRequirementListV2 component renders a set of {@link AccessRequirement}s (either pre-defined, or those applied\n * to an entity, based on provided props).\n *\n * The component shows the user the approval status of each AR and provides a workflow for accepting the terms of or\n * creating a submission for any of the Access Requirements.\n */\nexport default function AccessRequirementList(\n props: AccessRequirementListProps,\n) {\n const {\n onHide = noop,\n renderAsModal = false,\n numberOfFilesAffected,\n requestObjectName,\n customDialogActions,\n onSubmissionCreated = noop,\n } = props\n\n const isShowingRequirementsForEntity = 'entityId' in props\n const isShowingRequirementsForTeam = 'teamId' in props\n const isShowingRequirementsFromProps = 'accessRequirementFromProps' in props\n\n const subjectId =\n 'subjectId' in props\n ? props.subjectId\n : isShowingRequirementsForEntity\n ? props.entityId\n : isShowingRequirementsForTeam\n ? props.teamId\n : undefined\n\n const subjectType =\n 'subjectType' in props\n ? props.subjectType\n : isShowingRequirementsForEntity\n ? RestrictableObjectType.ENTITY\n : isShowingRequirementsForTeam\n ? RestrictableObjectType.TEAM\n : undefined\n\n let { dialogTitle = 'Data Access Request' } = props\n const { isAuthenticated } = useSynapseContext()\n const [requestDataStep, setRequestDataStep] = useState<RequestDataStep>(\n RequestDataStep.SHOW_ALL_ARS,\n )\n const oneSageURL = useOneSageURL()\n const [managedACTAccessRequirement, setManagedACTAccessRequirement] =\n useState<ManagedACTAccessRequirement>()\n const [researchProjectId, setResearchProjectId] = useState<string>('')\n const [dataAccessRequest, setDataAccessRequest] = useState<\n Request | Renewal | undefined\n >()\n\n const canShowManagedACTWikiInWizard = useCanShowManagedACTWikiInWizard()\n\n const { data: fetchedRequirementsForTeam } = useGetAccessRequirementsForTeam(\n subjectId!,\n {\n enabled:\n subjectId !== undefined && subjectType === RestrictableObjectType.TEAM,\n },\n )\n const { data: fetchedRequirementsForEntity } =\n useGetAccessRequirementsForEntity(subjectId!, {\n enabled:\n subjectId !== undefined &&\n subjectType === RestrictableObjectType.ENTITY,\n })\n\n const requirementsFromProps = isShowingRequirementsFromProps\n ? props.accessRequirementFromProps\n : undefined\n\n const accessRequirements =\n requirementsFromProps ??\n fetchedRequirementsForEntity ??\n fetchedRequirementsForTeam\n\n /**\n * Set the initial ordering of the Access Requirements to show complete ARs first. The individual AR Item components\n * retrieve and render status independently, so this data only determines ordering. For this reason, the query data\n * should not be invalidated or updated as the user progresses through the workflow.\n */\n const { data: sortedAccessRequirementIds } =\n useSortAccessRequirementIdsByCompletion(\n (accessRequirements ?? []).map(ar => String(ar.id)),\n {\n enabled: !!accessRequirements,\n // Set the stale time to infinity because we don't want to refetch this and change the order\n staleTime: Infinity,\n },\n )\n\n const sortedGroupedAccessRequirementsByType = useMemo(() => {\n if (accessRequirements && sortedAccessRequirementIds) {\n // SWC-7218: Group by access requirement type\n const groupedAccessRequirementsByType = groupBy(\n accessRequirements,\n 'concreteType',\n )\n const sortedByTypeAndStatus =\n SUPPORTED_ACCESS_REQUIREMENT_TYPES_SORTED.map(type => {\n const arsOfType = groupedAccessRequirementsByType[type]\n if (arsOfType) {\n return sortedAccessRequirementIds.map(\n id => arsOfType.find(ar => id === String(ar.id))!,\n )\n }\n return []\n })\n .flat()\n .filter((item): item is AccessRequirement => item !== undefined)\n return sortedByTypeAndStatus\n }\n return undefined\n }, [accessRequirements, sortedAccessRequirementIds])\n\n const requestDataStepCallback = (props: RequestDataStepCallbackArgs) => {\n const {\n managedACTAccessRequirement,\n step,\n researchProjectId,\n dataAccessRequest: newDataAccessRequest,\n } = props\n if (managedACTAccessRequirement) {\n // required for step 1, 2 form\n setManagedACTAccessRequirement(managedACTAccessRequirement)\n }\n if (researchProjectId) {\n setResearchProjectId(researchProjectId)\n }\n if (newDataAccessRequest) {\n setDataAccessRequest(newDataAccessRequest)\n }\n setRequestDataStep(step)\n }\n\n const anyARsRequireTwoFactorAuth = accessRequirements?.some(\n accessRequirement =>\n accessRequirement.concreteType ===\n MANAGED_ACT_ACCESS_REQUIREMENT_CONCRETE_TYPE_VALUE &&\n accessRequirement.isTwoFaRequired,\n )\n\n const anyARsRequireCertification = accessRequirements?.some(\n accessRequirement =>\n (accessRequirement.concreteType ===\n MANAGED_ACT_ACCESS_REQUIREMENT_CONCRETE_TYPE_VALUE ||\n accessRequirement.concreteType ===\n SELF_SIGN_ACCESS_REQUIREMENT_CONCRETE_TYPE_VALUE) &&\n accessRequirement.isCertifiedUserRequired,\n )\n\n const anyARsRequireProfileValidation = accessRequirements?.some(\n accessRequirement =>\n (accessRequirement.concreteType ===\n MANAGED_ACT_ACCESS_REQUIREMENT_CONCRETE_TYPE_VALUE ||\n accessRequirement.concreteType ===\n SELF_SIGN_ACCESS_REQUIREMENT_CONCRETE_TYPE_VALUE) &&\n accessRequirement.isValidatedProfileRequired,\n )\n\n const requestDetails = useMemo(() => {\n // Prioritize requestObjectName, then the number of files affected, then the entity/team name\n if (requestObjectName) return requestObjectName\n if (numberOfFilesAffected)\n return (\n <>\n <IconSvg icon=\"file\" sx={{ width: '30px' }} /> {numberOfFilesAffected}{' '}\n File(s)\n </>\n )\n if (\n subjectId !== undefined &&\n subjectType === RestrictableObjectType.ENTITY\n ) {\n return <EntityLink entity={subjectId} />\n } else if (subjectType === RestrictableObjectType.TEAM) {\n return <UserOrTeamBadge principalId={subjectId} />\n } else {\n console.warn(\n `Unhandled case for AccessRequirementList requestDetails: ${subjectType}: ${subjectId}`,\n )\n return <></>\n }\n }, [numberOfFilesAffected, requestObjectName, subjectId, subjectType])\n\n const dialogWidth =\n [\n RequestDataStep.UPDATE_ACCESSORS_AND_FILES,\n RequestDataStep.UPDATE_RESEARCH_PROJECT,\n ].includes(requestDataStep) && canShowManagedACTWikiInWizard\n ? 'xl'\n : 'md'\n\n let renderContent = <></>\n switch (requestDataStep) {\n case RequestDataStep.UPDATE_RESEARCH_PROJECT:\n renderContent = (\n <ResearchProjectForm\n managedACTAccessRequirement={managedACTAccessRequirement!}\n onSave={researchProject => {\n requestDataStepCallback({\n managedACTAccessRequirement,\n step: RequestDataStep.UPDATE_ACCESSORS_AND_FILES,\n researchProjectId: researchProject.id,\n })\n }}\n onHide={onHide}\n />\n )\n break\n case RequestDataStep.UPDATE_ACCESSORS_AND_FILES:\n renderContent = (\n <DataAccessRequestAccessorsFilesForm\n researchProjectId={researchProjectId}\n managedACTAccessRequirement={managedACTAccessRequirement!}\n subjectId={subjectId ?? ''}\n subjectType={subjectType ?? RestrictableObjectType.ENTITY}\n onHide={onHide}\n onCancel={dataAccessRequestInProgress => {\n requestDataStepCallback({\n step: RequestDataStep.PROMPT_CANCEL,\n dataAccessRequest: dataAccessRequestInProgress,\n })\n }}\n onSubmissionCreated={submissionId => {\n requestDataStepCallback({ step: RequestDataStep.COMPLETE })\n onSubmissionCreated(submissionId)\n }}\n onBackClicked={() => {\n requestDataStepCallback({\n step: RequestDataStep.UPDATE_RESEARCH_PROJECT,\n })\n }}\n />\n )\n break\n case RequestDataStep.PROMPT_CANCEL:\n renderContent = (\n <CancelRequestDataAccess\n modifiedDataAccessRequest={dataAccessRequest}\n onHide={onHide} // for closing dialogs\n />\n )\n break\n case RequestDataStep.PROMPT_LOGIN:\n // Send to OneSage login page\n storeRedirectURLForOneSageLoginAndGotoURL(oneSageURL.toString())\n dialogTitle = 'Please Log In'\n renderContent = <></>\n break\n case RequestDataStep.COMPLETE:\n renderContent = <RequestDataAccessSuccess onHide={onHide} />\n break\n case RequestDataStep.SHOW_ALL_ARS:\n default:\n renderContent = (\n <>\n {renderAsModal ? (\n <DialogBaseTitle title={dialogTitle} onCancel={onHide} />\n ) : (\n <Typography variant=\"h5\" sx={{ mb: 2 }}>\n {dialogTitle}\n </Typography>\n )}\n <DialogContent>\n <DialogSubsectionHeader variant={'h4'} sx={{ mt: 0 }}>\n What is this request for?\n </DialogSubsectionHeader>\n <Typography variant={'body1'} component={'span'}>\n {requestDetails}\n </Typography>\n <DialogSubsectionHeader variant={'h4'}>\n What do I need to do?\n </DialogSubsectionHeader>\n <AuthenticatedRequirement />\n {anyARsRequireCertification && <CertificationRequirement />}\n {anyARsRequireProfileValidation && <ValidationRequirement />}\n {anyARsRequireTwoFactorAuth && <TwoFactorAuthEnabledRequirement />}\n {sortedGroupedAccessRequirementsByType?.map(accessRequirement => {\n return (\n <AccessRequirementListItem\n key={accessRequirement.id}\n accessRequirement={accessRequirement}\n subjectId={subjectId}\n subjectType={subjectType}\n onHide={onHide}\n onRequestAccess={accessRequirement => {\n const nextStep = isAuthenticated\n ? RequestDataStep.UPDATE_RESEARCH_PROJECT\n : RequestDataStep.PROMPT_LOGIN\n requestDataStepCallback({\n managedACTAccessRequirement: accessRequirement,\n step: nextStep,\n })\n }}\n />\n )\n })}\n </DialogContent>\n <DialogActions>\n {customDialogActions ? (\n customDialogActions\n ) : (\n <>\n {renderAsModal && (\n <Button variant=\"contained\" onClick={onHide}>\n Close\n </Button>\n )}\n </>\n )}\n </DialogActions>\n </>\n )\n }\n\n if (renderAsModal) {\n return (\n <Dialog maxWidth={dialogWidth} fullWidth open={true} onClose={onHide}>\n {renderContent}\n </Dialog>\n )\n }\n\n return <>{renderContent}</>\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"AccessRequirementList.js","names":[],"sources":["../../../src/components/AccessRequirementList/AccessRequirementList.tsx"],"sourcesContent":["import {\n useGetAccessRequirementsForEntity,\n useGetAccessRequirementsForTeam,\n useSortAccessRequirementIdsByCompletion,\n} from '@/synapse-queries'\nimport {\n storeRedirectURLForOneSageLoginAndGotoURL,\n useSynapseContext,\n} from '@/utils'\nimport { StyledComponent } from '@emotion/styled'\nimport {\n Button,\n Dialog,\n DialogActions,\n DialogContent,\n styled,\n Typography,\n TypographyProps,\n} from '@mui/material'\nimport {\n AccessRequirement,\n ACT_ACCESS_REQUIREMENT_CONCRETE_TYPE_VALUE,\n LOCK_ACCESS_REQUIREMENT_CONCRETE_TYPE_VALUE,\n MANAGED_ACT_ACCESS_REQUIREMENT_CONCRETE_TYPE_VALUE,\n ManagedACTAccessRequirement,\n Renewal,\n Request,\n RestrictableObjectType,\n SELF_SIGN_ACCESS_REQUIREMENT_CONCRETE_TYPE_VALUE,\n TERMS_OF_USE_ACCESS_REQUIREMENT_CONCRETE_TYPE_VALUE,\n} from '@sage-bionetworks/synapse-types'\nimport noop from 'lodash-es/noop'\nimport groupBy from 'lodash-es/groupBy'\nimport { ReactNode, useMemo, useState } from 'react'\nimport { DialogBaseTitle } from '../DialogBase'\nimport { EntityLink } from '../EntityLink'\nimport IconSvg from '../IconSvg/IconSvg'\nimport UserOrTeamBadge from '../UserOrTeamBadge'\nimport { AccessRequirementListItem } from './AccessRequirementListItem'\nimport { useCanShowManagedACTWikiInWizard } from './AccessRequirementListUtils'\nimport CancelRequestDataAccess from './ManagedACTAccessRequirementRequestFlow/CancelRequestDataAccess'\nimport DataAccessRequestAccessorsFilesForm from './ManagedACTAccessRequirementRequestFlow/DataAccessRequestAccessorsFilesForm/DataAccessRequestAccessorsFilesForm'\nimport RequestDataAccessSuccess from './ManagedACTAccessRequirementRequestFlow/RequestDataAccessSuccess'\nimport ResearchProjectForm from './ManagedACTAccessRequirementRequestFlow/ResearchProjectForm/ResearchProjectForm'\nimport AuthenticatedRequirement from './RequirementItem/AuthenticatedRequirement'\nimport CertificationRequirement from './RequirementItem/CertificationRequirement'\nimport TwoFactorAuthEnabledRequirement from './RequirementItem/TwoFactorAuthEnabledRequirement'\nimport ValidationRequirement from './RequirementItem/ValidationRequirement'\nimport { useOneSageURL } from '@/utils/hooks'\n\nexport type AccessRequirementListProps = {\n /* if provided, will show this instead of the entity information */\n numberOfFilesAffected?: number\n /* if provided, will show this instead of the entity information or numberOfFilesAffected */\n requestObjectName?: string\n /* If true, this component will render in its own modal */\n renderAsModal?: boolean\n /* Overrides the default dialog title. This only applies if renderAsModal is true */\n dialogTitle?: string\n /* Called when the user rejects the terms of a listed AccessRequirement. If renderAsModal is true, this is also called when the user closes the modal. */\n onHide: () => void\n /* Displays the provided list of access requirements, instead of the ones fetched using the subject ID */\n accessRequirementFromProps?: Array<AccessRequirement>\n /* If provided, displays these actions on when viewing all ARs */\n customDialogActions?: ReactNode\n /* Optional callback invoked if a submission is created via this component */\n onSubmissionCreated?: (submissionId: string) => void\n} & (\n | {\n /**\n * Fetches the access requirements associated with an entity\n * @deprecated Please use `subjectId` and `subjectType`\n */\n entityId: string\n }\n | {\n /**\n * Fetches the access requirements associated with a team\n * @deprecated Please use `subjectId` and `subjectType`\n */\n teamId: string\n }\n | {\n /* The ID of the object for which access is being requested */\n subjectId?: string\n /* The type of the object for which access is being requested */\n subjectType?: RestrictableObjectType\n }\n)\n\nconst SUPPORTED_ACCESS_REQUIREMENT_TYPES_SORTED: AccessRequirement['concreteType'][] =\n [\n SELF_SIGN_ACCESS_REQUIREMENT_CONCRETE_TYPE_VALUE,\n TERMS_OF_USE_ACCESS_REQUIREMENT_CONCRETE_TYPE_VALUE,\n MANAGED_ACT_ACCESS_REQUIREMENT_CONCRETE_TYPE_VALUE,\n ACT_ACCESS_REQUIREMENT_CONCRETE_TYPE_VALUE,\n LOCK_ACCESS_REQUIREMENT_CONCRETE_TYPE_VALUE,\n ]\n\nconst SUPPORTED_ACCESS_REQUIREMENT_TYPES = new Set<\n AccessRequirement['concreteType']\n>(SUPPORTED_ACCESS_REQUIREMENT_TYPES_SORTED)\n\nconst DialogSubsectionHeader: StyledComponent<TypographyProps> = styled(\n Typography,\n {\n label: 'DialogSubsectionHeader',\n },\n)(({ theme }) => ({\n marginTop: theme.spacing(4),\n marginBottom: theme.spacing(2),\n paddingBottom: theme.spacing(1),\n fontSize: '18px',\n fontWeight: 'bold',\n borderBottom: '1px solid',\n borderColor: theme.palette.grey['200'],\n}))\n\nexport const checkHasUnsupportedRequirement = (\n accessRequirements: Array<AccessRequirement>,\n): boolean => {\n return accessRequirements.some(isARUnsupported)\n}\n\nconst isARUnsupported = (accessRequirement: AccessRequirement) => {\n return !SUPPORTED_ACCESS_REQUIREMENT_TYPES.has(accessRequirement.concreteType)\n}\n\n/**\n * Represents a distinct screen in the wizard used to apply to a ManagedACTAccessRequirement\n */\nenum RequestDataStep {\n SHOW_ALL_ARS = 0,\n UPDATE_RESEARCH_PROJECT = 1,\n UPDATE_ACCESSORS_AND_FILES = 2,\n PROMPT_CANCEL = 3,\n PROMPT_LOGIN = 4,\n COMPLETE = 5,\n}\n\nexport type RequestDataStepCallbackArgs = {\n step: RequestDataStep\n managedACTAccessRequirement?: ManagedACTAccessRequirement\n researchProjectId?: string\n dataAccessRequest?: Request | Renewal\n}\n\n/**\n * The AccessRequirementListV2 component renders a set of {@link AccessRequirement}s (either pre-defined, or those applied\n * to an entity, based on provided props).\n *\n * The component shows the user the approval status of each AR and provides a workflow for accepting the terms of or\n * creating a submission for any of the Access Requirements.\n */\nexport default function AccessRequirementList(\n props: AccessRequirementListProps,\n) {\n const {\n onHide = noop,\n renderAsModal = false,\n numberOfFilesAffected,\n requestObjectName,\n customDialogActions,\n onSubmissionCreated = noop,\n } = props\n\n const isShowingRequirementsForEntity = 'entityId' in props\n const isShowingRequirementsForTeam = 'teamId' in props\n const isShowingRequirementsFromProps = 'accessRequirementFromProps' in props\n\n const subjectId =\n 'subjectId' in props\n ? props.subjectId\n : isShowingRequirementsForEntity\n ? props.entityId\n : isShowingRequirementsForTeam\n ? props.teamId\n : undefined\n\n const subjectType =\n 'subjectType' in props\n ? props.subjectType\n : isShowingRequirementsForEntity\n ? RestrictableObjectType.ENTITY\n : isShowingRequirementsForTeam\n ? RestrictableObjectType.TEAM\n : undefined\n\n let { dialogTitle = 'Data Access Request' } = props\n const { isAuthenticated } = useSynapseContext()\n const [requestDataStep, setRequestDataStep] = useState<RequestDataStep>(\n RequestDataStep.SHOW_ALL_ARS,\n )\n const oneSageURL = useOneSageURL()\n const [managedACTAccessRequirement, setManagedACTAccessRequirement] =\n useState<ManagedACTAccessRequirement>()\n const [researchProjectId, setResearchProjectId] = useState<string>('')\n const [dataAccessRequest, setDataAccessRequest] = useState<\n Request | Renewal | undefined\n >()\n\n const canShowManagedACTWikiInWizard = useCanShowManagedACTWikiInWizard()\n\n const { data: fetchedRequirementsForTeam } = useGetAccessRequirementsForTeam(\n subjectId!,\n {\n enabled:\n subjectId !== undefined && subjectType === RestrictableObjectType.TEAM,\n },\n )\n const { data: fetchedRequirementsForEntity } =\n useGetAccessRequirementsForEntity(subjectId!, {\n enabled:\n subjectId !== undefined &&\n subjectType === RestrictableObjectType.ENTITY,\n })\n\n const requirementsFromProps = isShowingRequirementsFromProps\n ? props.accessRequirementFromProps\n : undefined\n\n const accessRequirements =\n requirementsFromProps ??\n fetchedRequirementsForEntity ??\n fetchedRequirementsForTeam\n\n /**\n * Set the initial ordering of the Access Requirements to show complete ARs first. The individual AR Item components\n * retrieve and render status independently, so this data only determines ordering. For this reason, the query data\n * should not be invalidated or updated as the user progresses through the workflow.\n */\n const { data: sortedAccessRequirementIds } =\n useSortAccessRequirementIdsByCompletion(\n (accessRequirements ?? []).map(ar => String(ar.id)),\n {\n enabled: !!accessRequirements,\n // Set the stale time to infinity because we don't want to refetch this and change the order\n staleTime: Infinity,\n },\n )\n\n const sortedGroupedAccessRequirementsByType = useMemo(() => {\n if (accessRequirements && sortedAccessRequirementIds) {\n // SWC-7218: Group by access requirement type\n const groupedAccessRequirementsByType = groupBy(\n accessRequirements,\n 'concreteType',\n )\n const sortedByTypeAndStatus =\n SUPPORTED_ACCESS_REQUIREMENT_TYPES_SORTED.map(type => {\n const arsOfType = groupedAccessRequirementsByType[type]\n if (arsOfType) {\n return sortedAccessRequirementIds.map(\n id => arsOfType.find(ar => id === String(ar.id))!,\n )\n }\n return []\n })\n .flat()\n .filter((item): item is AccessRequirement => item !== undefined)\n return sortedByTypeAndStatus\n }\n return undefined\n }, [accessRequirements, sortedAccessRequirementIds])\n\n const requestDataStepCallback = (props: RequestDataStepCallbackArgs) => {\n const {\n managedACTAccessRequirement,\n step,\n researchProjectId,\n dataAccessRequest: newDataAccessRequest,\n } = props\n if (managedACTAccessRequirement) {\n // required for step 1, 2 form\n setManagedACTAccessRequirement(managedACTAccessRequirement)\n }\n if (researchProjectId) {\n setResearchProjectId(researchProjectId)\n }\n if (newDataAccessRequest) {\n setDataAccessRequest(newDataAccessRequest)\n }\n setRequestDataStep(step)\n }\n\n const anyARsRequireTwoFactorAuth = accessRequirements?.some(\n accessRequirement =>\n accessRequirement.concreteType ===\n MANAGED_ACT_ACCESS_REQUIREMENT_CONCRETE_TYPE_VALUE &&\n accessRequirement.isTwoFaRequired,\n )\n\n const anyARsRequireCertification = accessRequirements?.some(\n accessRequirement =>\n (accessRequirement.concreteType ===\n MANAGED_ACT_ACCESS_REQUIREMENT_CONCRETE_TYPE_VALUE ||\n accessRequirement.concreteType ===\n SELF_SIGN_ACCESS_REQUIREMENT_CONCRETE_TYPE_VALUE) &&\n accessRequirement.isCertifiedUserRequired,\n )\n\n const anyARsRequireProfileValidation = accessRequirements?.some(\n accessRequirement =>\n (accessRequirement.concreteType ===\n MANAGED_ACT_ACCESS_REQUIREMENT_CONCRETE_TYPE_VALUE ||\n accessRequirement.concreteType ===\n SELF_SIGN_ACCESS_REQUIREMENT_CONCRETE_TYPE_VALUE) &&\n accessRequirement.isValidatedProfileRequired,\n )\n\n const requestDetails = useMemo(() => {\n // Prioritize requestObjectName, then the number of files affected, then the entity/team name\n if (requestObjectName) return requestObjectName\n if (numberOfFilesAffected)\n return (\n <>\n <IconSvg icon=\"file\" sx={{ width: '30px' }} /> {numberOfFilesAffected}{' '}\n File(s)\n </>\n )\n if (\n subjectId !== undefined &&\n subjectType === RestrictableObjectType.ENTITY\n ) {\n return <EntityLink entity={subjectId} />\n } else if (subjectType === RestrictableObjectType.TEAM) {\n return <UserOrTeamBadge principalId={subjectId} />\n } else {\n console.warn(\n `Unhandled case for AccessRequirementList requestDetails: ${subjectType}: ${subjectId}`,\n )\n return <></>\n }\n }, [numberOfFilesAffected, requestObjectName, subjectId, subjectType])\n\n const dialogWidth =\n [\n RequestDataStep.UPDATE_ACCESSORS_AND_FILES,\n RequestDataStep.UPDATE_RESEARCH_PROJECT,\n ].includes(requestDataStep) && canShowManagedACTWikiInWizard\n ? 'xl'\n : 'md'\n\n let renderContent = <></>\n switch (requestDataStep) {\n case RequestDataStep.UPDATE_RESEARCH_PROJECT:\n renderContent = (\n <ResearchProjectForm\n managedACTAccessRequirement={managedACTAccessRequirement!}\n onSave={researchProject => {\n requestDataStepCallback({\n managedACTAccessRequirement,\n step: RequestDataStep.UPDATE_ACCESSORS_AND_FILES,\n researchProjectId: researchProject.id,\n })\n }}\n onHide={onHide}\n />\n )\n break\n case RequestDataStep.UPDATE_ACCESSORS_AND_FILES:\n renderContent = (\n <DataAccessRequestAccessorsFilesForm\n researchProjectId={researchProjectId}\n managedACTAccessRequirement={managedACTAccessRequirement!}\n subjectId={subjectId ?? ''}\n subjectType={subjectType ?? RestrictableObjectType.ENTITY}\n onHide={onHide}\n onCancel={dataAccessRequestInProgress => {\n requestDataStepCallback({\n step: RequestDataStep.PROMPT_CANCEL,\n dataAccessRequest: dataAccessRequestInProgress,\n })\n }}\n onSubmissionCreated={submissionId => {\n requestDataStepCallback({ step: RequestDataStep.COMPLETE })\n onSubmissionCreated(submissionId)\n }}\n onBackClicked={() => {\n requestDataStepCallback({\n step: RequestDataStep.UPDATE_RESEARCH_PROJECT,\n })\n }}\n />\n )\n break\n case RequestDataStep.PROMPT_CANCEL:\n renderContent = (\n <CancelRequestDataAccess\n modifiedDataAccessRequest={dataAccessRequest}\n onHide={onHide} // for closing dialogs\n />\n )\n break\n case RequestDataStep.PROMPT_LOGIN:\n // Send to OneSage login page\n storeRedirectURLForOneSageLoginAndGotoURL(oneSageURL.toString())\n dialogTitle = 'Please Log In'\n renderContent = <></>\n break\n case RequestDataStep.COMPLETE:\n renderContent = <RequestDataAccessSuccess onHide={onHide} />\n break\n case RequestDataStep.SHOW_ALL_ARS:\n default:\n renderContent = (\n <>\n {renderAsModal ? (\n <DialogBaseTitle title={dialogTitle} onCancel={onHide} />\n ) : (\n <Typography variant=\"h5\" sx={{ mb: 2 }}>\n {dialogTitle}\n </Typography>\n )}\n <DialogContent>\n <DialogSubsectionHeader variant={'h4'} sx={{ mt: 0 }}>\n What is this request for?\n </DialogSubsectionHeader>\n <Typography variant={'body1'} component={'span'}>\n {requestDetails}\n </Typography>\n <DialogSubsectionHeader variant={'h4'}>\n What do I need to do?\n </DialogSubsectionHeader>\n <AuthenticatedRequirement />\n {anyARsRequireCertification && <CertificationRequirement />}\n {anyARsRequireProfileValidation && <ValidationRequirement />}\n {anyARsRequireTwoFactorAuth && <TwoFactorAuthEnabledRequirement />}\n {sortedGroupedAccessRequirementsByType?.map(accessRequirement => {\n return (\n <AccessRequirementListItem\n key={accessRequirement.id}\n accessRequirement={accessRequirement}\n subjectId={subjectId}\n subjectType={subjectType}\n onHide={onHide}\n onRequestAccess={accessRequirement => {\n const nextStep = isAuthenticated\n ? RequestDataStep.UPDATE_RESEARCH_PROJECT\n : RequestDataStep.PROMPT_LOGIN\n requestDataStepCallback({\n managedACTAccessRequirement: accessRequirement,\n step: nextStep,\n })\n }}\n />\n )\n })}\n </DialogContent>\n <DialogActions>\n {customDialogActions ? (\n customDialogActions\n ) : (\n <>\n {renderAsModal && (\n <Button variant=\"contained\" onClick={onHide}>\n Close\n </Button>\n )}\n </>\n )}\n </DialogActions>\n </>\n )\n }\n\n if (renderAsModal) {\n return (\n <Dialog maxWidth={dialogWidth} fullWidth open={true} onClose={onHide}>\n {renderContent}\n </Dialog>\n )\n }\n\n return <>{renderContent}</>\n}\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AccessRequirementListUtils.js","names":[],"sources":["../../../src/components/AccessRequirementList/AccessRequirementListUtils.ts"],"sourcesContent":["import { getAccessRequirementStatus } from '@/synapse-client/SynapseClient'\nimport { useMediaQuery, useTheme } from '@mui/material'\nimport { sortBy } from 'lodash-es'\n\n/**\n * Given an array of access requirement IDs, return the IDs sorted by the user's status, where\n * completed access requirements are shown first.\n * @param accessToken\n * @param requirementIds\n */\nexport const sortAccessRequirementsByCompletion = async (\n accessToken: string | undefined,\n requirementIds: string[],\n): Promise<string[]> => {\n const statuses = requirementIds.map(id => {\n return getAccessRequirementStatus(accessToken, id)\n })\n const accessRequirementStatuses = await Promise.all(statuses)\n\n return sortBy(requirementIds, id => {\n // if its true then it should come first, which means that it should be higher in the list\n // which is sorted ascendingly\n return (\n -1 *\n Number(\n accessRequirementStatuses.find(\n status => id === status.accessRequirementId,\n )!.isApproved,\n )\n )\n })\n}\n\n/**\n * Determines if we can show ManagedACTAccessRequirement wiki content alongside the forms using a media query.\n * See SWC-6432.\n */\nexport function useCanShowManagedACTWikiInWizard(): boolean {\n const theme = useTheme()\n const matchesBreakpoint = useMediaQuery(theme.breakpoints.up('md'))\n return matchesBreakpoint\n}\n"],"mappings":";;;;AAUA,IAAa,IAAqC,OAChD,GACA,MACsB;CACtB,IAAM,IAAW,EAAe,KAAI,MAC3B,EAA2B,GAAa,EAAG,CAClD,EACI,IAA4B,MAAM,QAAQ,IAAI,EAAS;AAE7D,QAAO,EAAO,IAAgB,MAI1B,KACA,OACE,EAA0B,MACxB,MAAU,MAAO,EAAO,oBACzB,CAAE,WACJ,CAEH;;AAOJ,SAAgB,IAA4C;AAG1D,QAD0B,EADZ,
|
|
1
|
+
{"version":3,"file":"AccessRequirementListUtils.js","names":[],"sources":["../../../src/components/AccessRequirementList/AccessRequirementListUtils.ts"],"sourcesContent":["import { getAccessRequirementStatus } from '@/synapse-client/SynapseClient'\nimport { useMediaQuery, useTheme } from '@mui/material'\nimport { sortBy } from 'lodash-es'\n\n/**\n * Given an array of access requirement IDs, return the IDs sorted by the user's status, where\n * completed access requirements are shown first.\n * @param accessToken\n * @param requirementIds\n */\nexport const sortAccessRequirementsByCompletion = async (\n accessToken: string | undefined,\n requirementIds: string[],\n): Promise<string[]> => {\n const statuses = requirementIds.map(id => {\n return getAccessRequirementStatus(accessToken, id)\n })\n const accessRequirementStatuses = await Promise.all(statuses)\n\n return sortBy(requirementIds, id => {\n // if its true then it should come first, which means that it should be higher in the list\n // which is sorted ascendingly\n return (\n -1 *\n Number(\n accessRequirementStatuses.find(\n status => id === status.accessRequirementId,\n )!.isApproved,\n )\n )\n })\n}\n\n/**\n * Determines if we can show ManagedACTAccessRequirement wiki content alongside the forms using a media query.\n * See SWC-6432.\n */\nexport function useCanShowManagedACTWikiInWizard(): boolean {\n const theme = useTheme()\n const matchesBreakpoint = useMediaQuery(theme.breakpoints.up('md'))\n return matchesBreakpoint\n}\n"],"mappings":";;;;AAUA,IAAa,IAAqC,OAChD,GACA,MACsB;CACtB,IAAM,IAAW,EAAe,KAAI,MAC3B,EAA2B,GAAa,EAAG,CAClD,EACI,IAA4B,MAAM,QAAQ,IAAI,EAAS;AAE7D,QAAO,EAAO,IAAgB,MAI1B,KACA,OACE,EAA0B,MACxB,MAAU,MAAO,EAAO,oBACzB,CAAE,WACJ,CAEH;;AAOJ,SAAgB,IAA4C;AAG1D,QAD0B,EADZ,GAC0B,CAAM,YAAY,GAAG,KAAK,CAC3D"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DataAccessRequestAccessorsEditor.js","names":[],"sources":["../../../../src/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/DataAccessRequestAccessorsEditor.tsx"],"sourcesContent":["import { useGetCurrentUserProfile } from '@/synapse-queries'\nimport {\n Button,\n FormControlLabel,\n Radio,\n RadioGroup,\n Stack,\n Typography,\n} from '@mui/material'\nimport {\n AccessorChange,\n AccessType,\n TYPE_FILTER,\n UserGroupHeader,\n} from '@sage-bionetworks/synapse-types'\nimport { ReactNode } from 'react'\nimport IconSvg from '../../IconSvg/IconSvg'\nimport { UserBadge } from '../../UserCard/UserBadge'\nimport UserSearchBox from '../../UserSearchBox/UserSearchBox'\n\nexport type DataAccessRequestAccessorsEditorProps = {\n /* The current set of accessor changes for a data access request */\n accessorChanges: AccessorChange[]\n /* Invoked when the set of accessors is updated */\n onChange: (updater: (prevValue: AccessorChange[]) => AccessorChange[]) => void\n /* Whether this request is a renewal */\n isRenewal: boolean\n /* Text to show to inform the user about requirements accessors may need to meet */\n helpText: ReactNode\n}\n\n/**\n * Component that handles adding/removing/revoking accessors for a data access request.\n */\nexport default function DataAccessRequestAccessorsEditor(\n props: DataAccessRequestAccessorsEditorProps,\n) {\n const { accessorChanges, onChange, isRenewal, helpText } = props\n const { data: user } = useGetCurrentUserProfile()\n\n const onSelectUserCallback = (\n id: string | null,\n ugh: UserGroupHeader | null,\n ) => {\n if (ugh) {\n onChange(previousValue => {\n const currentAccessorIds = previousValue.map(ac => ac.userId)\n // if user is not already in the accessor list (prevent duplicates in accessor list)\n if (!currentAccessorIds.includes(ugh.ownerId)) {\n const selectedAccessor: AccessorChange = {\n userId: ugh.ownerId,\n type: AccessType.GAIN_ACCESS,\n }\n previousValue.push(selectedAccessor)\n }\n return previousValue\n })\n }\n }\n\n const onClearAccessor = (userId: string) => {\n onChange(previousValue => {\n return previousValue.filter(item => item.userId !== userId)\n })\n }\n\n // For renewal only\n const onAccessorAccessTypeChange = (\n accessType: AccessType,\n userId: string,\n ) => {\n onChange(previousValue => {\n const indexOfUser = previousValue.findIndex(\n item => item.userId === userId,\n )\n previousValue[indexOfUser].type = accessType\n return previousValue\n })\n }\n\n return (\n <>\n <Typography variant={'headline3'} sx={{ mt: 4, mb: 2 }}>\n Data Requesters\n </Typography>\n <Typography\n component={'div'}\n variant={'body1'}\n sx={{ mb: 1 }}\n className={'requester-label'}\n >\n {helpText}\n </Typography>\n <UserSearchBox\n inputId={'requesters'}\n typeFilter={TYPE_FILTER.USERS_ONLY}\n onChange={onSelectUserCallback}\n filterPredicate={userGroupHeader =>\n !accessorChanges\n .map(ac => ac.userId)\n .includes(userGroupHeader.ownerId)\n }\n value={null}\n />\n <Stack sx={{ my: 1, gap: 1 }}>\n {accessorChanges.map((ac, i) => {\n return (\n <div className={'list-items'} key={`accessor-${i}`}>\n <UserBadge\n userId={ac.userId}\n showAccountLevelIcon={true}\n disableLink={true}\n showFullName={true}\n />\n {\n // only display delete button if the user profile is not the current user and has not had access before\n user?.ownerId !== ac.userId &&\n ac.type === AccessType.GAIN_ACCESS && (\n <Button\n aria-label={`Remove user`}\n variant={'text'}\n sx={{\n ml: 1,\n px: 0,\n }}\n onClick={() => onClearAccessor(ac.userId)}\n >\n <IconSvg icon=\"clear\" />\n </Button>\n )\n }\n {\n // Renewal/Revoke data access, only display if isRenewal is true\n // TODO: It's possible to that the accessors list is in an illegal state with no way to recover -- see PLFM-7893\n isRenewal &&\n user?.ownerId !== ac.userId &&\n ac.type !== AccessType.GAIN_ACCESS && (\n <>\n <RadioGroup\n value={ac.type}\n onChange={(_event, value) =>\n onAccessorAccessTypeChange(\n value as AccessType,\n ac.userId,\n )\n }\n >\n <FormControlLabel\n control={<Radio />}\n label={'Renew'}\n value={AccessType.RENEW_ACCESS}\n />\n <FormControlLabel\n control={<Radio />}\n label={'Revoke'}\n value={AccessType.REVOKE_ACCESS}\n />\n </RadioGroup>\n </>\n )\n }\n </div>\n )\n })}\n </Stack>\n </>\n )\n}\n"],"mappings":";;;;;;;;;AAkCA,SAAwB,EACtB,GACA;CACA,IAAM,EAAE,oBAAiB,aAAU,cAAW,gBAAa,GACrD,EAAE,MAAM,MAAS,GAA0B,EAE3C,KACJ,GACA,MACG;AACH,EAAI,KACF,GAAS,MAAiB;AAGxB,OAAI,CAFuB,EAAc,KAAI,MAAM,EAAG,
|
|
1
|
+
{"version":3,"file":"DataAccessRequestAccessorsEditor.js","names":[],"sources":["../../../../src/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/DataAccessRequestAccessorsEditor.tsx"],"sourcesContent":["import { useGetCurrentUserProfile } from '@/synapse-queries'\nimport {\n Button,\n FormControlLabel,\n Radio,\n RadioGroup,\n Stack,\n Typography,\n} from '@mui/material'\nimport {\n AccessorChange,\n AccessType,\n TYPE_FILTER,\n UserGroupHeader,\n} from '@sage-bionetworks/synapse-types'\nimport { ReactNode } from 'react'\nimport IconSvg from '../../IconSvg/IconSvg'\nimport { UserBadge } from '../../UserCard/UserBadge'\nimport UserSearchBox from '../../UserSearchBox/UserSearchBox'\n\nexport type DataAccessRequestAccessorsEditorProps = {\n /* The current set of accessor changes for a data access request */\n accessorChanges: AccessorChange[]\n /* Invoked when the set of accessors is updated */\n onChange: (updater: (prevValue: AccessorChange[]) => AccessorChange[]) => void\n /* Whether this request is a renewal */\n isRenewal: boolean\n /* Text to show to inform the user about requirements accessors may need to meet */\n helpText: ReactNode\n}\n\n/**\n * Component that handles adding/removing/revoking accessors for a data access request.\n */\nexport default function DataAccessRequestAccessorsEditor(\n props: DataAccessRequestAccessorsEditorProps,\n) {\n const { accessorChanges, onChange, isRenewal, helpText } = props\n const { data: user } = useGetCurrentUserProfile()\n\n const onSelectUserCallback = (\n id: string | null,\n ugh: UserGroupHeader | null,\n ) => {\n if (ugh) {\n onChange(previousValue => {\n const currentAccessorIds = previousValue.map(ac => ac.userId)\n // if user is not already in the accessor list (prevent duplicates in accessor list)\n if (!currentAccessorIds.includes(ugh.ownerId)) {\n const selectedAccessor: AccessorChange = {\n userId: ugh.ownerId,\n type: AccessType.GAIN_ACCESS,\n }\n previousValue.push(selectedAccessor)\n }\n return previousValue\n })\n }\n }\n\n const onClearAccessor = (userId: string) => {\n onChange(previousValue => {\n return previousValue.filter(item => item.userId !== userId)\n })\n }\n\n // For renewal only\n const onAccessorAccessTypeChange = (\n accessType: AccessType,\n userId: string,\n ) => {\n onChange(previousValue => {\n const indexOfUser = previousValue.findIndex(\n item => item.userId === userId,\n )\n previousValue[indexOfUser].type = accessType\n return previousValue\n })\n }\n\n return (\n <>\n <Typography variant={'headline3'} sx={{ mt: 4, mb: 2 }}>\n Data Requesters\n </Typography>\n <Typography\n component={'div'}\n variant={'body1'}\n sx={{ mb: 1 }}\n className={'requester-label'}\n >\n {helpText}\n </Typography>\n <UserSearchBox\n inputId={'requesters'}\n typeFilter={TYPE_FILTER.USERS_ONLY}\n onChange={onSelectUserCallback}\n filterPredicate={userGroupHeader =>\n !accessorChanges\n .map(ac => ac.userId)\n .includes(userGroupHeader.ownerId)\n }\n value={null}\n />\n <Stack sx={{ my: 1, gap: 1 }}>\n {accessorChanges.map((ac, i) => {\n return (\n <div className={'list-items'} key={`accessor-${i}`}>\n <UserBadge\n userId={ac.userId}\n showAccountLevelIcon={true}\n disableLink={true}\n showFullName={true}\n />\n {\n // only display delete button if the user profile is not the current user and has not had access before\n user?.ownerId !== ac.userId &&\n ac.type === AccessType.GAIN_ACCESS && (\n <Button\n aria-label={`Remove user`}\n variant={'text'}\n sx={{\n ml: 1,\n px: 0,\n }}\n onClick={() => onClearAccessor(ac.userId)}\n >\n <IconSvg icon=\"clear\" />\n </Button>\n )\n }\n {\n // Renewal/Revoke data access, only display if isRenewal is true\n // TODO: It's possible to that the accessors list is in an illegal state with no way to recover -- see PLFM-7893\n isRenewal &&\n user?.ownerId !== ac.userId &&\n ac.type !== AccessType.GAIN_ACCESS && (\n <>\n <RadioGroup\n value={ac.type}\n onChange={(_event, value) =>\n onAccessorAccessTypeChange(\n value as AccessType,\n ac.userId,\n )\n }\n >\n <FormControlLabel\n control={<Radio />}\n label={'Renew'}\n value={AccessType.RENEW_ACCESS}\n />\n <FormControlLabel\n control={<Radio />}\n label={'Revoke'}\n value={AccessType.REVOKE_ACCESS}\n />\n </RadioGroup>\n </>\n )\n }\n </div>\n )\n })}\n </Stack>\n </>\n )\n}\n"],"mappings":";;;;;;;;;AAkCA,SAAwB,EACtB,GACA;CACA,IAAM,EAAE,oBAAiB,aAAU,cAAW,gBAAa,GACrD,EAAE,MAAM,MAAS,GAA0B,EAE3C,KACJ,GACA,MACG;AACH,EAAI,KACF,GAAS,MAAiB;AAGxB,OAAI,CAFuB,EAAc,KAAI,MAAM,EAAG,OAEjD,CAAmB,SAAS,EAAI,QAAQ,EAAE;IAC7C,IAAM,IAAmC;KACvC,QAAQ,EAAI;KACZ,MAAM,EAAW;KAClB;AACD,MAAc,KAAK,EAAiB;;AAEtC,UAAO;IACP;IAIA,KAAmB,MAAmB;AAC1C,KAAS,MACA,EAAc,QAAO,MAAQ,EAAK,WAAW,EAAO,CAC3D;IAIE,KACJ,GACA,MACG;AACH,KAAS,MAAiB;GACxB,IAAM,IAAc,EAAc,WAChC,MAAQ,EAAK,WAAW,EACzB;AAED,UADA,EAAc,GAAa,OAAO,GAC3B;IACP;;AAGJ,QACE,kBAAA,GAAA,EAAA,UAAA;EACE,kBAAC,GAAD;GAAY,SAAS;GAAa,IAAI;IAAE,IAAI;IAAG,IAAI;IAAG;aAAE;GAE3C,CAAA;EACb,kBAAC,GAAD;GACE,WAAW;GACX,SAAS;GACT,IAAI,EAAE,IAAI,GAAG;GACb,WAAW;aAEV;GACU,CAAA;EACb,kBAAC,GAAD;GACE,SAAS;GACT,YAAY,EAAY;GACxB,UAAU;GACV,kBAAiB,MACf,CAAC,EACE,KAAI,MAAM,EAAG,OAAO,CACpB,SAAS,EAAgB,QAAQ;GAEtC,OAAO;GACP,CAAA;EACF,kBAAC,GAAD;GAAO,IAAI;IAAE,IAAI;IAAG,KAAK;IAAG;aACzB,EAAgB,KAAK,GAAI,MAEtB,kBAAC,OAAD;IAAK,WAAW;cAAhB;KACE,kBAAC,GAAD;MACE,QAAQ,EAAG;MACX,sBAAsB;MACtB,aAAa;MACb,cAAc;MACd,CAAA;KAGA,GAAM,YAAY,EAAG,UACnB,EAAG,SAAS,EAAW,eACrB,kBAAC,GAAD;MACE,cAAY;MACZ,SAAS;MACT,IAAI;OACF,IAAI;OACJ,IAAI;OACL;MACD,eAAe,EAAgB,EAAG,OAAO;gBAEzC,kBAAC,GAAD,EAAS,MAAK,SAAU,CAAA;MACjB,CAAA;KAMb,KACE,GAAM,YAAY,EAAG,UACrB,EAAG,SAAS,EAAW,eACrB,kBAAA,GAAA,EAAA,UACE,kBAAC,GAAD;MACE,OAAO,EAAG;MACV,WAAW,GAAQ,MACjB,EACE,GACA,EAAG,OACJ;gBANL,CASE,kBAAC,GAAD;OACE,SAAS,kBAAC,GAAD,EAAS,CAAA;OAClB,OAAO;OACP,OAAO,EAAW;OAClB,CAAA,EACF,kBAAC,GAAD;OACE,SAAS,kBAAC,GAAD,EAAS,CAAA;OAClB,OAAO;OACP,OAAO,EAAW;OAClB,CAAA,CACS;SACZ,CAAA;KAGL;MAtD6B,YAAY,IAsDzC,CAER;GACI,CAAA;EACP,EAAA,CAAA"}
|
package/dist/components/AccessRequirementList/RequirementItem/SelfSignAccessRequirementItem.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SelfSignAccessRequirementItem.js","names":[],"sources":["../../../../src/components/AccessRequirementList/RequirementItem/SelfSignAccessRequirementItem.tsx"],"sourcesContent":["import {\n useCreateAccessApproval,\n useGetAccessRequirementStatus,\n useGetAccessRequirementWikiPageKey,\n useGetCurrentUserBundle,\n useGetCurrentUserProfile,\n} from '@/synapse-queries'\nimport { useSynapseContext } from '@/utils/context/SynapseContext'\nimport { isTermsOfUseAccessRequirement } from '@/utils/types/IsType'\nimport { Alert, Box, ButtonProps, Link, Typography } from '@mui/material'\nimport {\n ApprovalState,\n CreateAccessApprovalRequest,\n SelfSignAccessRequirement,\n TermsOfUseAccessRequirement,\n} from '@sage-bionetworks/synapse-types'\nimport { useState } from 'react'\nimport MarkdownSynapse from '../../Markdown/MarkdownSynapse'\nimport { RequirementItemStatus } from '../AccessApprovalCheckMark'\nimport RequirementItem from './RequirementItem'\n\nexport type SelfSignAccessRequirementItemProps = {\n accessRequirement: SelfSignAccessRequirement | TermsOfUseAccessRequirement\n onHide: () => void\n}\n\n/**\n * Renders a {@link RequirementItem} for an self-sign Access Requirement, including {@link SelfSignAccessRequirement} or\n * {@link TermsOfUseAccessRequirement}.\n *\n * For {@link ManagedACTAccessRequirement}s, see {@link RequestDataAccess}\n */\nexport default function SelfSignAccessRequirementItem(\n props: SelfSignAccessRequirementItemProps,\n) {\n const { accessRequirement, onHide } = props\n const { isAuthenticated } = useSynapseContext()\n const isTermsOfUse = isTermsOfUseAccessRequirement(accessRequirement)\n\n const { data: user } = useGetCurrentUserProfile()\n const { data: userBundle } = useGetCurrentUserBundle()\n\n const certificationRequirementNotMet =\n isAuthenticated &&\n userBundle &&\n !isTermsOfUse &&\n accessRequirement.isCertifiedUserRequired &&\n !userBundle.isCertified\n const verificationRequirementNotMet =\n isAuthenticated &&\n userBundle &&\n !isTermsOfUse &&\n accessRequirement.isValidatedProfileRequired &&\n !userBundle.isVerified\n\n const { data: accessRequirementStatus, isLoading: isLoadingStatus } =\n useGetAccessRequirementStatus(String(accessRequirement.id))\n\n const isApproved = accessRequirementStatus?.isApproved\n\n const { data: wikiPage } = useGetAccessRequirementWikiPageKey(\n accessRequirement.id.toString(),\n // TermsOfUse ARs may have the terms embedded in the AR or an associated Wiki.\n )\n\n const [showTerms, setShowTerms] = useState<boolean>(false)\n\n const {\n mutate: createAccessApproval,\n isPending: createAccessApprovalIsPending,\n error,\n } = useCreateAccessApproval({\n onError: err => {\n console.error('Error creating access approval: ', err)\n },\n })\n\n const onAcceptClicked = () => {\n const accessApprovalRequest: CreateAccessApprovalRequest = {\n requirementId: accessRequirement?.id,\n submitterId: user?.ownerId!,\n accessorId: user?.ownerId!,\n state: ApprovalState.APPROVED,\n }\n\n createAccessApproval(accessApprovalRequest)\n }\n\n let renderedTerms = <></>\n if (isTermsOfUse && accessRequirement.termsOfUse) {\n renderedTerms = <MarkdownSynapse markdown={accessRequirement.termsOfUse} />\n } else if (wikiPage) {\n renderedTerms = (\n <MarkdownSynapse\n wikiId={wikiPage?.wikiPageId}\n ownerId={wikiPage?.ownerObjectId}\n objectType={wikiPage?.ownerObjectType}\n />\n )\n }\n let actions: ButtonProps[] | undefined = undefined\n\n if (isAuthenticated && !isApproved) {\n let acceptButtonText = 'I Accept Terms of Use'\n let acceptButtonDisabled = false\n if (certificationRequirementNotMet || verificationRequirementNotMet) {\n acceptButtonDisabled = true\n acceptButtonText = `You must ${\n certificationRequirementNotMet ? 'be certified' : ''\n }${\n certificationRequirementNotMet && verificationRequirementNotMet\n ? ' and '\n : ''\n }${\n verificationRequirementNotMet ? 'have a validated user profile' : ''\n } to accept`\n }\n\n actions = [\n {\n variant: 'outlined',\n onClick: onAcceptClicked,\n children: acceptButtonText,\n disabled: createAccessApprovalIsPending || acceptButtonDisabled,\n },\n {\n variant: 'text',\n onClick: onHide,\n children: 'I do not accept',\n },\n ]\n }\n\n return (\n <RequirementItem\n data-testid=\"SelfSignAccessRequirementItem\"\n status={\n isLoadingStatus\n ? RequirementItemStatus.LOADING\n : isApproved\n ? RequirementItemStatus.COMPLETE\n : RequirementItemStatus.LOCKED\n }\n actions={actions}\n >\n {isApproved ? (\n <>\n <Typography variant={'body1'}>\n You have accepted the terms of use.{' '}\n <Link role=\"button\" onClick={() => setShowTerms(!showTerms)}>\n {showTerms ? 'Hide Terms' : 'View Terms'}\n </Link>\n </Typography>\n {showTerms && <Box sx={{ my: 1 }}>{renderedTerms}</Box>}\n </>\n ) : (\n renderedTerms\n )}\n {error && <Alert severity=\"error\">{error.reason}</Alert>}\n </RequirementItem>\n )\n}\n"],"mappings":";;;;;;;;;;;;;AAgCA,SAAwB,EACtB,GACA;CACA,IAAM,EAAE,sBAAmB,cAAW,GAChC,EAAE,uBAAoB,GAAmB,EACzC,IAAe,EAA8B,EAAkB,EAE/D,EAAE,MAAM,MAAS,GAA0B,EAC3C,EAAE,MAAM,MAAe,GAAyB,EAEhD,IACJ,KACA,KACA,CAAC,KACD,EAAkB,2BAClB,CAAC,EAAW,aACR,IACJ,KACA,KACA,CAAC,KACD,EAAkB,8BAClB,CAAC,EAAW,YAER,EAAE,MAAM,GAAyB,WAAW,MAChD,EAA8B,OAAO,EAAkB,GAAG,CAAC,EAEvD,IAAa,GAAyB,YAEtC,EAAE,MAAM,MAAa,EACzB,EAAkB,GAAG,UAAU,CAEhC,EAEK,CAAC,GAAW,KAAgB,EAAkB,GAAM,EAEpD,EACJ,QAAQ,GACR,WAAW,GACX,aACE,EAAwB,EAC1B,UAAS,MAAO;AACd,UAAQ,MAAM,oCAAoC,EAAI;IAEzD,CAAC,EAEI,UAAwB;AAQ5B,
|
|
1
|
+
{"version":3,"file":"SelfSignAccessRequirementItem.js","names":[],"sources":["../../../../src/components/AccessRequirementList/RequirementItem/SelfSignAccessRequirementItem.tsx"],"sourcesContent":["import {\n useCreateAccessApproval,\n useGetAccessRequirementStatus,\n useGetAccessRequirementWikiPageKey,\n useGetCurrentUserBundle,\n useGetCurrentUserProfile,\n} from '@/synapse-queries'\nimport { useSynapseContext } from '@/utils/context/SynapseContext'\nimport { isTermsOfUseAccessRequirement } from '@/utils/types/IsType'\nimport { Alert, Box, ButtonProps, Link, Typography } from '@mui/material'\nimport {\n ApprovalState,\n CreateAccessApprovalRequest,\n SelfSignAccessRequirement,\n TermsOfUseAccessRequirement,\n} from '@sage-bionetworks/synapse-types'\nimport { useState } from 'react'\nimport MarkdownSynapse from '../../Markdown/MarkdownSynapse'\nimport { RequirementItemStatus } from '../AccessApprovalCheckMark'\nimport RequirementItem from './RequirementItem'\n\nexport type SelfSignAccessRequirementItemProps = {\n accessRequirement: SelfSignAccessRequirement | TermsOfUseAccessRequirement\n onHide: () => void\n}\n\n/**\n * Renders a {@link RequirementItem} for an self-sign Access Requirement, including {@link SelfSignAccessRequirement} or\n * {@link TermsOfUseAccessRequirement}.\n *\n * For {@link ManagedACTAccessRequirement}s, see {@link RequestDataAccess}\n */\nexport default function SelfSignAccessRequirementItem(\n props: SelfSignAccessRequirementItemProps,\n) {\n const { accessRequirement, onHide } = props\n const { isAuthenticated } = useSynapseContext()\n const isTermsOfUse = isTermsOfUseAccessRequirement(accessRequirement)\n\n const { data: user } = useGetCurrentUserProfile()\n const { data: userBundle } = useGetCurrentUserBundle()\n\n const certificationRequirementNotMet =\n isAuthenticated &&\n userBundle &&\n !isTermsOfUse &&\n accessRequirement.isCertifiedUserRequired &&\n !userBundle.isCertified\n const verificationRequirementNotMet =\n isAuthenticated &&\n userBundle &&\n !isTermsOfUse &&\n accessRequirement.isValidatedProfileRequired &&\n !userBundle.isVerified\n\n const { data: accessRequirementStatus, isLoading: isLoadingStatus } =\n useGetAccessRequirementStatus(String(accessRequirement.id))\n\n const isApproved = accessRequirementStatus?.isApproved\n\n const { data: wikiPage } = useGetAccessRequirementWikiPageKey(\n accessRequirement.id.toString(),\n // TermsOfUse ARs may have the terms embedded in the AR or an associated Wiki.\n )\n\n const [showTerms, setShowTerms] = useState<boolean>(false)\n\n const {\n mutate: createAccessApproval,\n isPending: createAccessApprovalIsPending,\n error,\n } = useCreateAccessApproval({\n onError: err => {\n console.error('Error creating access approval: ', err)\n },\n })\n\n const onAcceptClicked = () => {\n const accessApprovalRequest: CreateAccessApprovalRequest = {\n requirementId: accessRequirement?.id,\n submitterId: user?.ownerId!,\n accessorId: user?.ownerId!,\n state: ApprovalState.APPROVED,\n }\n\n createAccessApproval(accessApprovalRequest)\n }\n\n let renderedTerms = <></>\n if (isTermsOfUse && accessRequirement.termsOfUse) {\n renderedTerms = <MarkdownSynapse markdown={accessRequirement.termsOfUse} />\n } else if (wikiPage) {\n renderedTerms = (\n <MarkdownSynapse\n wikiId={wikiPage?.wikiPageId}\n ownerId={wikiPage?.ownerObjectId}\n objectType={wikiPage?.ownerObjectType}\n />\n )\n }\n let actions: ButtonProps[] | undefined = undefined\n\n if (isAuthenticated && !isApproved) {\n let acceptButtonText = 'I Accept Terms of Use'\n let acceptButtonDisabled = false\n if (certificationRequirementNotMet || verificationRequirementNotMet) {\n acceptButtonDisabled = true\n acceptButtonText = `You must ${\n certificationRequirementNotMet ? 'be certified' : ''\n }${\n certificationRequirementNotMet && verificationRequirementNotMet\n ? ' and '\n : ''\n }${\n verificationRequirementNotMet ? 'have a validated user profile' : ''\n } to accept`\n }\n\n actions = [\n {\n variant: 'outlined',\n onClick: onAcceptClicked,\n children: acceptButtonText,\n disabled: createAccessApprovalIsPending || acceptButtonDisabled,\n },\n {\n variant: 'text',\n onClick: onHide,\n children: 'I do not accept',\n },\n ]\n }\n\n return (\n <RequirementItem\n data-testid=\"SelfSignAccessRequirementItem\"\n status={\n isLoadingStatus\n ? RequirementItemStatus.LOADING\n : isApproved\n ? RequirementItemStatus.COMPLETE\n : RequirementItemStatus.LOCKED\n }\n actions={actions}\n >\n {isApproved ? (\n <>\n <Typography variant={'body1'}>\n You have accepted the terms of use.{' '}\n <Link role=\"button\" onClick={() => setShowTerms(!showTerms)}>\n {showTerms ? 'Hide Terms' : 'View Terms'}\n </Link>\n </Typography>\n {showTerms && <Box sx={{ my: 1 }}>{renderedTerms}</Box>}\n </>\n ) : (\n renderedTerms\n )}\n {error && <Alert severity=\"error\">{error.reason}</Alert>}\n </RequirementItem>\n )\n}\n"],"mappings":";;;;;;;;;;;;;AAgCA,SAAwB,EACtB,GACA;CACA,IAAM,EAAE,sBAAmB,cAAW,GAChC,EAAE,uBAAoB,GAAmB,EACzC,IAAe,EAA8B,EAAkB,EAE/D,EAAE,MAAM,MAAS,GAA0B,EAC3C,EAAE,MAAM,MAAe,GAAyB,EAEhD,IACJ,KACA,KACA,CAAC,KACD,EAAkB,2BAClB,CAAC,EAAW,aACR,IACJ,KACA,KACA,CAAC,KACD,EAAkB,8BAClB,CAAC,EAAW,YAER,EAAE,MAAM,GAAyB,WAAW,MAChD,EAA8B,OAAO,EAAkB,GAAG,CAAC,EAEvD,IAAa,GAAyB,YAEtC,EAAE,MAAM,MAAa,EACzB,EAAkB,GAAG,UAAU,CAEhC,EAEK,CAAC,GAAW,KAAgB,EAAkB,GAAM,EAEpD,EACJ,QAAQ,GACR,WAAW,GACX,aACE,EAAwB,EAC1B,UAAS,MAAO;AACd,UAAQ,MAAM,oCAAoC,EAAI;IAEzD,CAAC,EAEI,UAAwB;AAQ5B,IAAqB;GANnB,eAAe,GAAmB;GAClC,aAAa,GAAM;GACnB,YAAY,GAAM;GAClB,OAAO,EAAc;GAGF,CAAsB;IAGzC,IAAgB,kBAAA,GAAA,EAAK,CAAA;AACzB,CAAI,KAAgB,EAAkB,aACpC,IAAgB,kBAAC,GAAD,EAAiB,UAAU,EAAkB,YAAc,CAAA,GAClE,MACT,IACE,kBAAC,GAAD;EACE,QAAQ,GAAU;EAClB,SAAS,GAAU;EACnB,YAAY,GAAU;EACtB,CAAA;CAGN,IAAI;AAEJ,KAAI,KAAmB,CAAC,GAAY;EAClC,IAAI,IAAmB,yBACnB,IAAuB;AAc3B,GAbI,KAAkC,OACpC,IAAuB,IACvB,IAAmB,YACjB,IAAiC,iBAAiB,KAElD,KAAkC,IAC9B,UACA,KAEJ,IAAgC,kCAAkC,GACnE,cAGH,IAAU,CACR;GACE,SAAS;GACT,SAAS;GACT,UAAU;GACV,UAAU,KAAiC;GAC5C,EACD;GACE,SAAS;GACT,SAAS;GACT,UAAU;GACX,CACF;;AAGH,QACE,kBAAC,GAAD;EACE,eAAY;EACZ,QACE,IACI,EAAsB,UACtB,IACA,EAAsB,WACtB,EAAsB;EAEnB;YATX,CAWG,IACC,kBAAA,GAAA,EAAA,UAAA,CACE,kBAAC,GAAD;GAAY,SAAS;aAArB;IAA8B;IACQ;IACpC,kBAAC,GAAD;KAAM,MAAK;KAAS,eAAe,EAAa,CAAC,EAAU;eACxD,IAAY,eAAe;KACvB,CAAA;IACI;MACZ,KAAa,kBAAC,GAAD;GAAK,IAAI,EAAE,IAAI,GAAG;aAAG;GAAoB,CAAA,CACtD,EAAA,CAAA,GAEH,GAED,KAAS,kBAAC,GAAD;GAAO,UAAS;aAAS,EAAM;GAAe,CAAA,CACxC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AccessRequirementRelatedProjectsList.js","names":[],"sources":["../../../src/components/AccessRequirementRelatedProjectsList/AccessRequirementRelatedProjectsList.tsx"],"sourcesContent":["import React from 'react'\nimport { useSearchAccessRequirementsInfinite } from '@/synapse-queries'\nimport { Alert, List, ListItem, Typography } from '@mui/material'\nimport { AccessRequirementSearchRequest } from '@sage-bionetworks/synapse-types'\nimport pluralize from 'pluralize'\nimport { EntityLink } from '../EntityLink'\n\nexport type AccessRequirementRelatedProjectsListProps = {\n accessRequirementId: number\n}\n\nexport const AccessRequirementRelatedProjectsList = (\n props: AccessRequirementRelatedProjectsListProps,\n): React.ReactNode => {\n const searchRequest: Omit<AccessRequirementSearchRequest, 'nextPageToken'> = {\n ids: [props.accessRequirementId],\n }\n\n const { data, isError, error } =\n useSearchAccessRequirementsInfinite(searchRequest)\n const ar = data?.pages.flatMap(page => page.results)[0] ?? undefined\n\n const nRelatedProjects = ar?.relatedProjectIds.length || 0\n const relatedProjectsTitle = `${pluralize(\n 'project',\n nRelatedProjects,\n true,\n )}${nRelatedProjects > 0 ? ':' : ''}`\n\n return (\n <>\n {ar && (\n <>\n <Typography variant=\"body1\">{relatedProjectsTitle}</Typography>\n <List sx={{ listStyleType: 'disc', pl: 4 }}>\n {ar.relatedProjectIds.map(projectId => (\n <ListItem\n sx={{\n display: 'list-item',\n py: '4px',\n // remove extra margin added by type.less to p tags\n '.no-margin-y': { my: 0 },\n }}\n key={projectId}\n >\n <EntityLink\n entity={projectId}\n link={false}\n showIcon={false}\n className=\"no-margin-y\"\n />\n </ListItem>\n ))}\n </List>\n </>\n )}\n {isError && <Alert severity=\"error\">{error.message}</Alert>}\n </>\n )\n}\n"],"mappings":";;;;;;;;AAWA,IAAa,KACX,MACoB;CAKpB,IAAM,EAAE,SAAM,YAAS,aACrB,
|
|
1
|
+
{"version":3,"file":"AccessRequirementRelatedProjectsList.js","names":[],"sources":["../../../src/components/AccessRequirementRelatedProjectsList/AccessRequirementRelatedProjectsList.tsx"],"sourcesContent":["import React from 'react'\nimport { useSearchAccessRequirementsInfinite } from '@/synapse-queries'\nimport { Alert, List, ListItem, Typography } from '@mui/material'\nimport { AccessRequirementSearchRequest } from '@sage-bionetworks/synapse-types'\nimport pluralize from 'pluralize'\nimport { EntityLink } from '../EntityLink'\n\nexport type AccessRequirementRelatedProjectsListProps = {\n accessRequirementId: number\n}\n\nexport const AccessRequirementRelatedProjectsList = (\n props: AccessRequirementRelatedProjectsListProps,\n): React.ReactNode => {\n const searchRequest: Omit<AccessRequirementSearchRequest, 'nextPageToken'> = {\n ids: [props.accessRequirementId],\n }\n\n const { data, isError, error } =\n useSearchAccessRequirementsInfinite(searchRequest)\n const ar = data?.pages.flatMap(page => page.results)[0] ?? undefined\n\n const nRelatedProjects = ar?.relatedProjectIds.length || 0\n const relatedProjectsTitle = `${pluralize(\n 'project',\n nRelatedProjects,\n true,\n )}${nRelatedProjects > 0 ? ':' : ''}`\n\n return (\n <>\n {ar && (\n <>\n <Typography variant=\"body1\">{relatedProjectsTitle}</Typography>\n <List sx={{ listStyleType: 'disc', pl: 4 }}>\n {ar.relatedProjectIds.map(projectId => (\n <ListItem\n sx={{\n display: 'list-item',\n py: '4px',\n // remove extra margin added by type.less to p tags\n '.no-margin-y': { my: 0 },\n }}\n key={projectId}\n >\n <EntityLink\n entity={projectId}\n link={false}\n showIcon={false}\n className=\"no-margin-y\"\n />\n </ListItem>\n ))}\n </List>\n </>\n )}\n {isError && <Alert severity=\"error\">{error.message}</Alert>}\n </>\n )\n}\n"],"mappings":";;;;;;;;AAWA,IAAa,KACX,MACoB;CAKpB,IAAM,EAAE,SAAM,YAAS,aACrB,EAAoC,EAJpC,KAAK,CAAC,EAAM,oBAAoB,EAII,CAAc,EAC9C,IAAK,GAAM,MAAM,SAAQ,MAAQ,EAAK,QAAQ,CAAC,MAAM,KAAA,GAErD,IAAmB,GAAI,kBAAkB,UAAU,GACnD,IAAuB,GAAG,EAC9B,WACA,GACA,GACD,GAAG,IAAmB,IAAI,MAAM;AAEjC,QACE,kBAAA,GAAA,EAAA,UAAA,CACG,KACC,kBAAA,GAAA,EAAA,UAAA,CACE,kBAAC,GAAD;EAAY,SAAQ;YAAS;EAAkC,CAAA,EAC/D,kBAAC,GAAD;EAAM,IAAI;GAAE,eAAe;GAAQ,IAAI;GAAG;YACvC,EAAG,kBAAkB,KAAI,MACxB,kBAAC,GAAD;GACE,IAAI;IACF,SAAS;IACT,IAAI;IAEJ,gBAAgB,EAAE,IAAI,GAAG;IAC1B;aAGD,kBAAC,GAAD;IACE,QAAQ;IACR,MAAM;IACN,UAAU;IACV,WAAU;IACV,CAAA;GACO,EARJ,EAQI,CACX;EACG,CAAA,CACN,EAAA,CAAA,EAEJ,KAAW,kBAAC,GAAD;EAAO,UAAS;YAAS,EAAM;EAAgB,CAAA,CAC1D,EAAA,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AccessTokenCard.js","names":[],"sources":["../../../../src/components/AccessTokenPage/AccessTokenCard/AccessTokenCard.tsx"],"sourcesContent":["import { useDeletePersonalAccessToken } from '@/synapse-queries/user/usePersonalAccessToken'\nimport DeleteTwoToneIcon from '@mui/icons-material/DeleteTwoTone'\nimport {\n Box,\n Card,\n IconButton,\n Stack,\n Tooltip,\n Typography,\n} from '@mui/material'\nimport {\n AccessTokenRecord,\n scopeDescriptions,\n} from '@sage-bionetworks/synapse-types'\nimport dayjs from 'dayjs'\nimport relativeTime from 'dayjs/plugin/relativeTime'\nimport { noop } from 'lodash-es'\nimport { useCallback, useState } from 'react'\nimport IconSvg from '../../IconSvg/IconSvg'\nimport WarningDialog from '../../SynapseForm/WarningDialog'\n\ndayjs.extend(relativeTime)\n\nexport type AccessTokenCardProps = {\n /** Record referring to an access token, not a token itself */\n accessToken: AccessTokenRecord\n onDelete?: () => void\n}\n\nexport const EXPIRED_PAT_WARNING =\n 'This token has expired. It no longer works and can only be deleted.'\n\nexport function AccessTokenCard(props: AccessTokenCardProps) {\n const { accessToken, onDelete = noop } = props\n const [showModal, setShowModal] = useState(false)\n\n const isExpired = accessToken.state === 'EXPIRED'\n\n const { mutate: deleteToken, isPending: deleteIsPending } =\n useDeletePersonalAccessToken({\n onSuccess: () => {\n onDelete()\n },\n throwOnError: true,\n })\n\n const onClickDeleteButton = useCallback(() => {\n if (isExpired) {\n // token no longer works, no need for warning/confirmation\n deleteToken(accessToken.id)\n } else {\n setShowModal(true)\n }\n }, [accessToken.id, deleteToken, isExpired])\n\n const warningDialog = (\n <WarningDialog\n title={'Confirm Deletion'}\n content={\n <>\n <Typography variant={'body1'}>\n If you delete this token, any applications using it will stop\n working. This action cannot be undone.\n </Typography>\n <Typography\n variant={'body1'}\n sx={{\n fontWeight: '700',\n }}\n >\n Are you sure you want to delete this token?\n </Typography>\n </>\n }\n confirmButtonText={'Delete Token'}\n onCancel={() => setShowModal(false)}\n onConfirm={() => {\n deleteToken(accessToken.id)\n setShowModal(false)\n }}\n confirmButtonColor=\"error\"\n open={showModal}\n />\n )\n return (\n <Card\n sx={{\n my: 2,\n height: '120px',\n width: '100%',\n p: 1.5,\n pl: 4,\n backgroundColor: isExpired ? '#fcf8e3' : 'inherit',\n }}\n >\n {warningDialog}\n <Box\n sx={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n height: '100%',\n }}\n >\n <Stack\n sx={{\n flexGrow: 1,\n gap: 1,\n justifyContent: 'space-between',\n }}\n >\n <Typography variant={'headline3'} sx={{ fontSize: '16px' }}>\n {accessToken.name}\n </Typography>\n <div>\n <span>Permissions: </span>\n {accessToken.scopes.map(scope => {\n const scopeDescriptionKey =\n scope as keyof typeof scopeDescriptions\n let scopeDescription = scopeDescriptions[scopeDescriptionKey]\n if (scopeDescription === undefined) {\n const titleCaseScope =\n scope.charAt(0).toUpperCase() + scope.slice(1)\n scopeDescription = {\n displayName: titleCaseScope,\n description: titleCaseScope,\n }\n }\n return (\n <Tooltip key={scope} title={scopeDescription.description}>\n <Typography\n component={'span'}\n variant={'smallText1'}\n sx={{ mx: 0.25, cursor: 'default', color: 'primary.main' }}\n >\n {scopeDescription.displayName}\n </Typography>\n </Tooltip>\n )\n })}\n </div>\n <div>\n <Typography component={'span'} variant={'smallText1'}>\n Last used {dayjs(accessToken.lastUsed).fromNow()}\n </Typography>\n <Typography\n component={'span'}\n variant={'smallText1'}\n sx={{\n color: 'grey.700',\n }}\n >\n {' | '}\n </Typography>\n <Typography component={'span'} variant={'smallText1'}>\n Created {dayjs(accessToken.createdOn).fromNow()}\n </Typography>\n </div>\n </Stack>\n <Box\n sx={{\n alignSelf: 'flex-start',\n display: 'flex',\n gap: 1,\n alignItems: 'center',\n }}\n >\n {isExpired && (\n <Tooltip title={EXPIRED_PAT_WARNING} placement={'top'}>\n <IconButton>\n <IconSvg\n icon=\"warning\"\n sx={{ color: 'warning.main', fontSize: 'inherit' }}\n wrap={false}\n />\n </IconButton>\n </Tooltip>\n )}\n <Tooltip title={'Delete Token'} placement={'top'}>\n <IconButton\n disabled={deleteIsPending}\n color=\"error\"\n onClick={onClickDeleteButton}\n >\n <DeleteTwoToneIcon />\n </IconButton>\n </Tooltip>\n </Box>\n </Box>\n </Card>\n )\n}\n"],"mappings":";;;;;;;;;;;;AAqBA,EAAM,OAAO,EAAa;AAQ1B,IAAa,IACX;AAEF,SAAgB,EAAgB,GAA6B;CAC3D,IAAM,EAAE,gBAAa,cAAW,MAAS,GACnC,CAAC,GAAW,KAAgB,EAAS,GAAM,EAE3C,IAAY,EAAY,UAAU,WAElC,EAAE,QAAQ,GAAa,WAAW,MACtC,EAA6B;EAC3B,iBAAiB;AACf,MAAU;;EAEZ,cAAc;EACf,CAAC,EAEE,IAAsB,QAAkB;AAC5C,EAAI,IAEF,EAAY,EAAY,GAAG,GAE3B,EAAa,GAAK;IAEnB;EAAC,EAAY;EAAI;EAAa;EAAU,CAAC;AA+B5C,QACE,kBAAC,GAAD;EACE,IAAI;GACF,IAAI;GACJ,QAAQ;GACR,OAAO;GACP,GAAG;GACH,IAAI;GACJ,iBAAiB,IAAY,YAAY;GAC1C;YARH,CA7BA,kBAAC,GAAD;GACE,OAAO;GACP,SACE,kBAAA,GAAA,EAAA,UAAA,CACE,kBAAC,GAAD;IAAY,SAAS;cAAS;IAGjB,CAAA,EACb,kBAAC,GAAD;IACE,SAAS;IACT,IAAI,EACF,YAAY,OACb;cACF;IAEY,CAAA,CACZ,EAAA,CAAA;GAEL,mBAAmB;GACnB,gBAAgB,EAAa,GAAM;GACnC,iBAAiB;AAEf,IADA,EAAY,EAAY,GAAG,EAC3B,EAAa,GAAM;;GAErB,oBAAmB;GACnB,MAAM;GACN,
|
|
1
|
+
{"version":3,"file":"AccessTokenCard.js","names":[],"sources":["../../../../src/components/AccessTokenPage/AccessTokenCard/AccessTokenCard.tsx"],"sourcesContent":["import { useDeletePersonalAccessToken } from '@/synapse-queries/user/usePersonalAccessToken'\nimport DeleteTwoToneIcon from '@mui/icons-material/DeleteTwoTone'\nimport {\n Box,\n Card,\n IconButton,\n Stack,\n Tooltip,\n Typography,\n} from '@mui/material'\nimport {\n AccessTokenRecord,\n scopeDescriptions,\n} from '@sage-bionetworks/synapse-types'\nimport dayjs from 'dayjs'\nimport relativeTime from 'dayjs/plugin/relativeTime'\nimport { noop } from 'lodash-es'\nimport { useCallback, useState } from 'react'\nimport IconSvg from '../../IconSvg/IconSvg'\nimport WarningDialog from '../../SynapseForm/WarningDialog'\n\ndayjs.extend(relativeTime)\n\nexport type AccessTokenCardProps = {\n /** Record referring to an access token, not a token itself */\n accessToken: AccessTokenRecord\n onDelete?: () => void\n}\n\nexport const EXPIRED_PAT_WARNING =\n 'This token has expired. It no longer works and can only be deleted.'\n\nexport function AccessTokenCard(props: AccessTokenCardProps) {\n const { accessToken, onDelete = noop } = props\n const [showModal, setShowModal] = useState(false)\n\n const isExpired = accessToken.state === 'EXPIRED'\n\n const { mutate: deleteToken, isPending: deleteIsPending } =\n useDeletePersonalAccessToken({\n onSuccess: () => {\n onDelete()\n },\n throwOnError: true,\n })\n\n const onClickDeleteButton = useCallback(() => {\n if (isExpired) {\n // token no longer works, no need for warning/confirmation\n deleteToken(accessToken.id)\n } else {\n setShowModal(true)\n }\n }, [accessToken.id, deleteToken, isExpired])\n\n const warningDialog = (\n <WarningDialog\n title={'Confirm Deletion'}\n content={\n <>\n <Typography variant={'body1'}>\n If you delete this token, any applications using it will stop\n working. This action cannot be undone.\n </Typography>\n <Typography\n variant={'body1'}\n sx={{\n fontWeight: '700',\n }}\n >\n Are you sure you want to delete this token?\n </Typography>\n </>\n }\n confirmButtonText={'Delete Token'}\n onCancel={() => setShowModal(false)}\n onConfirm={() => {\n deleteToken(accessToken.id)\n setShowModal(false)\n }}\n confirmButtonColor=\"error\"\n open={showModal}\n />\n )\n return (\n <Card\n sx={{\n my: 2,\n height: '120px',\n width: '100%',\n p: 1.5,\n pl: 4,\n backgroundColor: isExpired ? '#fcf8e3' : 'inherit',\n }}\n >\n {warningDialog}\n <Box\n sx={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n height: '100%',\n }}\n >\n <Stack\n sx={{\n flexGrow: 1,\n gap: 1,\n justifyContent: 'space-between',\n }}\n >\n <Typography variant={'headline3'} sx={{ fontSize: '16px' }}>\n {accessToken.name}\n </Typography>\n <div>\n <span>Permissions: </span>\n {accessToken.scopes.map(scope => {\n const scopeDescriptionKey =\n scope as keyof typeof scopeDescriptions\n let scopeDescription = scopeDescriptions[scopeDescriptionKey]\n if (scopeDescription === undefined) {\n const titleCaseScope =\n scope.charAt(0).toUpperCase() + scope.slice(1)\n scopeDescription = {\n displayName: titleCaseScope,\n description: titleCaseScope,\n }\n }\n return (\n <Tooltip key={scope} title={scopeDescription.description}>\n <Typography\n component={'span'}\n variant={'smallText1'}\n sx={{ mx: 0.25, cursor: 'default', color: 'primary.main' }}\n >\n {scopeDescription.displayName}\n </Typography>\n </Tooltip>\n )\n })}\n </div>\n <div>\n <Typography component={'span'} variant={'smallText1'}>\n Last used {dayjs(accessToken.lastUsed).fromNow()}\n </Typography>\n <Typography\n component={'span'}\n variant={'smallText1'}\n sx={{\n color: 'grey.700',\n }}\n >\n {' | '}\n </Typography>\n <Typography component={'span'} variant={'smallText1'}>\n Created {dayjs(accessToken.createdOn).fromNow()}\n </Typography>\n </div>\n </Stack>\n <Box\n sx={{\n alignSelf: 'flex-start',\n display: 'flex',\n gap: 1,\n alignItems: 'center',\n }}\n >\n {isExpired && (\n <Tooltip title={EXPIRED_PAT_WARNING} placement={'top'}>\n <IconButton>\n <IconSvg\n icon=\"warning\"\n sx={{ color: 'warning.main', fontSize: 'inherit' }}\n wrap={false}\n />\n </IconButton>\n </Tooltip>\n )}\n <Tooltip title={'Delete Token'} placement={'top'}>\n <IconButton\n disabled={deleteIsPending}\n color=\"error\"\n onClick={onClickDeleteButton}\n >\n <DeleteTwoToneIcon />\n </IconButton>\n </Tooltip>\n </Box>\n </Box>\n </Card>\n )\n}\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"StudyAcknowledgements.js","names":[],"sources":["../../../src/components/AcknowledgementsPage/StudyAcknowledgements.tsx"],"sourcesContent":["import { useGetQueryResultBundleWithAsyncStatus } from '@/synapse-queries'\nimport { parseEntityIdFromSqlStatement } from '@/utils/functions'\nimport { BUNDLE_MASK_QUERY_RESULTS } from '@/utils/SynapseConstants'\nimport { StudyAcknowledgement } from './StudyAcknowledgement'\nimport { AcknowledgementItem } from './AcknowledgementsPage'\n\nexport type StudyAcknowledgementsProps = {\n // First column should be the study name, second column should be the acknowledgement statement\n sql: string\n onSelectChange?: (item: AcknowledgementItem, checked: boolean) => void\n}\n\nexport function StudyAcknowledgements({\n sql,\n onSelectChange,\n}: StudyAcknowledgementsProps) {\n const entityId = parseEntityIdFromSqlStatement(sql)\n const { data } = useGetQueryResultBundleWithAsyncStatus({\n entityId: entityId,\n query: {\n sql,\n },\n partMask: BUNDLE_MASK_QUERY_RESULTS,\n concreteType: 'org.sagebionetworks.repo.model.table.QueryBundleRequest',\n })\n\n // get raw data. parse and then inject? or just inject without parsing?\n const rows = data?.responseBody?.queryResult?.queryResults?.rows\n return (\n <>\n {rows?.map((row, index) => {\n const studyName = row.values[0]\n const acknowledgementStatementWikiRef = row.values[1]\n if (!studyName || !acknowledgementStatementWikiRef) {\n return null\n }\n return (\n <StudyAcknowledgement\n key={index}\n studyName={studyName}\n acknowledgementStatementWikiRef={acknowledgementStatementWikiRef}\n onSelectChange={onSelectChange}\n />\n )\n })}\n </>\n )\n}\n"],"mappings":";;;;;;;;AAYA,SAAgB,EAAsB,EACpC,QACA,qBAC6B;CAE7B,IAAM,EAAE,YAAS,EAAuC;EAC5C,UAFK,EAA8B,
|
|
1
|
+
{"version":3,"file":"StudyAcknowledgements.js","names":[],"sources":["../../../src/components/AcknowledgementsPage/StudyAcknowledgements.tsx"],"sourcesContent":["import { useGetQueryResultBundleWithAsyncStatus } from '@/synapse-queries'\nimport { parseEntityIdFromSqlStatement } from '@/utils/functions'\nimport { BUNDLE_MASK_QUERY_RESULTS } from '@/utils/SynapseConstants'\nimport { StudyAcknowledgement } from './StudyAcknowledgement'\nimport { AcknowledgementItem } from './AcknowledgementsPage'\n\nexport type StudyAcknowledgementsProps = {\n // First column should be the study name, second column should be the acknowledgement statement\n sql: string\n onSelectChange?: (item: AcknowledgementItem, checked: boolean) => void\n}\n\nexport function StudyAcknowledgements({\n sql,\n onSelectChange,\n}: StudyAcknowledgementsProps) {\n const entityId = parseEntityIdFromSqlStatement(sql)\n const { data } = useGetQueryResultBundleWithAsyncStatus({\n entityId: entityId,\n query: {\n sql,\n },\n partMask: BUNDLE_MASK_QUERY_RESULTS,\n concreteType: 'org.sagebionetworks.repo.model.table.QueryBundleRequest',\n })\n\n // get raw data. parse and then inject? or just inject without parsing?\n const rows = data?.responseBody?.queryResult?.queryResults?.rows\n return (\n <>\n {rows?.map((row, index) => {\n const studyName = row.values[0]\n const acknowledgementStatementWikiRef = row.values[1]\n if (!studyName || !acknowledgementStatementWikiRef) {\n return null\n }\n return (\n <StudyAcknowledgement\n key={index}\n studyName={studyName}\n acknowledgementStatementWikiRef={acknowledgementStatementWikiRef}\n onSelectChange={onSelectChange}\n />\n )\n })}\n </>\n )\n}\n"],"mappings":";;;;;;;;AAYA,SAAgB,EAAsB,EACpC,QACA,qBAC6B;CAE7B,IAAM,EAAE,YAAS,EAAuC;EAC5C,UAFK,EAA8B,EAEnC;EACV,OAAO,EACL,QACD;EACD,UAAA;EACA,cAAc;EACf,CAAC,EAGI,IAAO,GAAM,cAAc,aAAa,cAAc;AAC5D,QACE,kBAAA,GAAA,EAAA,UACG,GAAM,KAAK,GAAK,MAAU;EACzB,IAAM,IAAY,EAAI,OAAO,IACvB,IAAkC,EAAI,OAAO;AAInD,SAHI,CAAC,KAAa,CAAC,IACV,OAGP,kBAAC,GAAD;GAEa;GACsB;GACjB;GAChB,EAJK,EAIL;GAEJ,EACD,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PermissionLevelMenu.js","names":[],"sources":["../../../src/components/AclEditor/PermissionLevelMenu.tsx"],"sourcesContent":["import {\n getAccessTypeFromPermissionLevel,\n getPermissionLevelFromAccessType,\n PermissionLevel,\n permissionLevelToLabel,\n} from '@/utils/PermissionLevelToAccessType'\nimport { MenuItem, TextField, Typography } from '@mui/material'\nimport { ACCESS_TYPE } from '@sage-bionetworks/synapse-types'\nimport React from 'react'\n\nexport type PermissionLevelMenuProps = {\n currentAccessType: ACCESS_TYPE[]\n availablePermissionLevels: PermissionLevel[]\n onChange: (accessTypes: ACCESS_TYPE[]) => void\n}\n\nconst CUSTOM_VALUE = 'CUSTOM'\nconst CUSTOM_TEXT = 'Custom'\n\nexport function PermissionLevelMenu(\n props: PermissionLevelMenuProps,\n): React.ReactNode {\n const { currentAccessType, availablePermissionLevels, onChange } = props\n\n const selectedPermissionLevel: PermissionLevel | null =\n getPermissionLevelFromAccessType(currentAccessType)\n\n const isCustomPermissionSelected = selectedPermissionLevel == null\n\n return (\n <TextField\n value={\n isCustomPermissionSelected ? CUSTOM_VALUE : selectedPermissionLevel\n }\n onChange={e => {\n const accessType = getAccessTypeFromPermissionLevel(\n e.target.value as PermissionLevel,\n )\n\n onChange(accessType || currentAccessType)\n }}\n fullWidth\n select\n size=\"small\"\n slotProps={{\n select: {\n renderValue: selected => {\n if (selected == CUSTOM_VALUE) {\n return CUSTOM_TEXT\n }\n return permissionLevelToLabel[selected as PermissionLevel]\n },\n },\n }}\n >\n {Object.values(availablePermissionLevels).map(permissionLevel => {\n return (\n <MenuItem key={permissionLevel} value={permissionLevel}>\n <Typography variant=\"smallText1\" noWrap>\n {permissionLevelToLabel[permissionLevel]}\n </Typography>\n </MenuItem>\n )\n })}\n {isCustomPermissionSelected && (\n <MenuItem value={CUSTOM_VALUE}>\n <Typography variant=\"smallText1\" noWrap>\n {CUSTOM_TEXT}\n </Typography>\n </MenuItem>\n )}\n </TextField>\n )\n}\n"],"mappings":";;;;;AAgBA,IAAM,IAAe,UACf,IAAc;AAEpB,SAAgB,EACd,GACiB;CACjB,IAAM,EAAE,sBAAmB,8BAA2B,gBAAa,GAE7D,IACJ,EAAiC,EAAkB,EAE/C,IAA6B,KAA2B;AAE9D,QACE,kBAAC,GAAD;EACE,OACE,IAA6B,IAAe;EAE9C,WAAU,MAAK;AAKb,KAJmB,EACjB,EAAE,OAAO,
|
|
1
|
+
{"version":3,"file":"PermissionLevelMenu.js","names":[],"sources":["../../../src/components/AclEditor/PermissionLevelMenu.tsx"],"sourcesContent":["import {\n getAccessTypeFromPermissionLevel,\n getPermissionLevelFromAccessType,\n PermissionLevel,\n permissionLevelToLabel,\n} from '@/utils/PermissionLevelToAccessType'\nimport { MenuItem, TextField, Typography } from '@mui/material'\nimport { ACCESS_TYPE } from '@sage-bionetworks/synapse-types'\nimport React from 'react'\n\nexport type PermissionLevelMenuProps = {\n currentAccessType: ACCESS_TYPE[]\n availablePermissionLevels: PermissionLevel[]\n onChange: (accessTypes: ACCESS_TYPE[]) => void\n}\n\nconst CUSTOM_VALUE = 'CUSTOM'\nconst CUSTOM_TEXT = 'Custom'\n\nexport function PermissionLevelMenu(\n props: PermissionLevelMenuProps,\n): React.ReactNode {\n const { currentAccessType, availablePermissionLevels, onChange } = props\n\n const selectedPermissionLevel: PermissionLevel | null =\n getPermissionLevelFromAccessType(currentAccessType)\n\n const isCustomPermissionSelected = selectedPermissionLevel == null\n\n return (\n <TextField\n value={\n isCustomPermissionSelected ? CUSTOM_VALUE : selectedPermissionLevel\n }\n onChange={e => {\n const accessType = getAccessTypeFromPermissionLevel(\n e.target.value as PermissionLevel,\n )\n\n onChange(accessType || currentAccessType)\n }}\n fullWidth\n select\n size=\"small\"\n slotProps={{\n select: {\n renderValue: selected => {\n if (selected == CUSTOM_VALUE) {\n return CUSTOM_TEXT\n }\n return permissionLevelToLabel[selected as PermissionLevel]\n },\n },\n }}\n >\n {Object.values(availablePermissionLevels).map(permissionLevel => {\n return (\n <MenuItem key={permissionLevel} value={permissionLevel}>\n <Typography variant=\"smallText1\" noWrap>\n {permissionLevelToLabel[permissionLevel]}\n </Typography>\n </MenuItem>\n )\n })}\n {isCustomPermissionSelected && (\n <MenuItem value={CUSTOM_VALUE}>\n <Typography variant=\"smallText1\" noWrap>\n {CUSTOM_TEXT}\n </Typography>\n </MenuItem>\n )}\n </TextField>\n )\n}\n"],"mappings":";;;;;AAgBA,IAAM,IAAe,UACf,IAAc;AAEpB,SAAgB,EACd,GACiB;CACjB,IAAM,EAAE,sBAAmB,8BAA2B,gBAAa,GAE7D,IACJ,EAAiC,EAAkB,EAE/C,IAA6B,KAA2B;AAE9D,QACE,kBAAC,GAAD;EACE,OACE,IAA6B,IAAe;EAE9C,WAAU,MAAK;AAKb,KAJmB,EACjB,EAAE,OAAO,MAGF,IAAc,EAAkB;;EAE3C,WAAA;EACA,QAAA;EACA,MAAK;EACL,WAAW,EACT,QAAQ,EACN,cAAa,MACP,KAAY,IACP,IAEF,EAAuB,IAEjC,EACF;YAvBH,CAyBG,OAAO,OAAO,EAA0B,CAAC,KAAI,MAE1C,kBAAC,GAAD;GAAgC,OAAO;aACrC,kBAAC,GAAD;IAAY,SAAQ;IAAa,QAAA;cAC9B,EAAuB;IACb,CAAA;GACJ,EAJI,EAIJ,CAEb,EACD,KACC,kBAAC,GAAD;GAAU,OAAO;aACf,kBAAC,GAAD;IAAY,SAAQ;IAAa,QAAA;cAC9B;IACU,CAAA;GACJ,CAAA,CAEH"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ResourceAccessAndUserGroupHeader.js","names":[],"sources":["../../../src/components/AclEditor/ResourceAccessAndUserGroupHeader.ts"],"sourcesContent":["import {\n ACCESS_TYPE,\n ResourceAccess,\n UserGroupHeader,\n} from '@sage-bionetworks/synapse-types'\n\n/**\n * Utility type to combine a ResourceAccess and the associated UserGroupHeader for that principalId.\n * This allows us to easily sort the ResourceAccess list by the name of the user or team.\n */\nexport type ResourceAccessAndUserGroupHeader = {\n resourceAccess: ResourceAccess\n userGroupHeader: UserGroupHeader\n}\n\n/**\n * Comparator for ResourceAccess list. Sorts by the following criteria:\n * 1. Users or teams with the CHANGE_PERMISSIONS permission should be at the top, sorted alphabetically by username\n * 2. The authenticated group (all users signed in to Synapse)\n * 3. The public group (all users signed in to Synapse, and 'anonymous')\n * 4. All other users or teams, sorted alphabetically by username\n */\nexport function compareResourceAccessAndUserGroupHeader(\n a: ResourceAccessAndUserGroupHeader,\n b: ResourceAccessAndUserGroupHeader,\n authenticatedPrincipalId?: string,\n publicPrincipalId?: string,\n): number {\n enum CompareResult {\n A_FIRST = -1,\n B_FIRST = 1,\n }\n\n const hasChangePermissionA = a.resourceAccess.accessType.includes(\n ACCESS_TYPE.CHANGE_PERMISSIONS,\n )\n const hasChangePermissionB = b.resourceAccess.accessType.includes(\n ACCESS_TYPE.CHANGE_PERMISSIONS,\n )\n\n if (hasChangePermissionA && !hasChangePermissionB)\n return CompareResult.A_FIRST\n if (!hasChangePermissionA && hasChangePermissionB)\n return CompareResult.B_FIRST\n\n // Both have CHANGE_PERMISSIONS or neither have it, proceed with other checks\n\n // AUTHENTICATED group always appears before PUBLIC group\n if (\n authenticatedPrincipalId &&\n String(a.resourceAccess.principalId) === authenticatedPrincipalId &&\n String(b.resourceAccess.principalId) !== authenticatedPrincipalId\n )\n return CompareResult.A_FIRST\n if (\n authenticatedPrincipalId &&\n String(a.resourceAccess.principalId) !== authenticatedPrincipalId &&\n String(b.resourceAccess.principalId) === authenticatedPrincipalId\n )\n return CompareResult.B_FIRST\n\n // PUBLIC group always appears before other users / teams\n if (\n publicPrincipalId &&\n String(a.resourceAccess.principalId) === publicPrincipalId &&\n String(b.resourceAccess.principalId) !== publicPrincipalId\n )\n return CompareResult.A_FIRST\n if (\n publicPrincipalId &&\n String(a.resourceAccess.principalId) !== publicPrincipalId &&\n String(b.resourceAccess.principalId) === publicPrincipalId\n )\n return CompareResult.B_FIRST\n\n // If none of the other cases apply, sort alphabetically by userName\n return a.userGroupHeader.userName.localeCompare(b.userGroupHeader.userName)\n}\n"],"mappings":";;AAsBA,SAAgB,EACd,GACA,GACA,GACA,GACQ;CACR,IAAK,IAAL,yBAAA,GAAA;SACE,EAAA,EAAA,
|
|
1
|
+
{"version":3,"file":"ResourceAccessAndUserGroupHeader.js","names":[],"sources":["../../../src/components/AclEditor/ResourceAccessAndUserGroupHeader.ts"],"sourcesContent":["import {\n ACCESS_TYPE,\n ResourceAccess,\n UserGroupHeader,\n} from '@sage-bionetworks/synapse-types'\n\n/**\n * Utility type to combine a ResourceAccess and the associated UserGroupHeader for that principalId.\n * This allows us to easily sort the ResourceAccess list by the name of the user or team.\n */\nexport type ResourceAccessAndUserGroupHeader = {\n resourceAccess: ResourceAccess\n userGroupHeader: UserGroupHeader\n}\n\n/**\n * Comparator for ResourceAccess list. Sorts by the following criteria:\n * 1. Users or teams with the CHANGE_PERMISSIONS permission should be at the top, sorted alphabetically by username\n * 2. The authenticated group (all users signed in to Synapse)\n * 3. The public group (all users signed in to Synapse, and 'anonymous')\n * 4. All other users or teams, sorted alphabetically by username\n */\nexport function compareResourceAccessAndUserGroupHeader(\n a: ResourceAccessAndUserGroupHeader,\n b: ResourceAccessAndUserGroupHeader,\n authenticatedPrincipalId?: string,\n publicPrincipalId?: string,\n): number {\n enum CompareResult {\n A_FIRST = -1,\n B_FIRST = 1,\n }\n\n const hasChangePermissionA = a.resourceAccess.accessType.includes(\n ACCESS_TYPE.CHANGE_PERMISSIONS,\n )\n const hasChangePermissionB = b.resourceAccess.accessType.includes(\n ACCESS_TYPE.CHANGE_PERMISSIONS,\n )\n\n if (hasChangePermissionA && !hasChangePermissionB)\n return CompareResult.A_FIRST\n if (!hasChangePermissionA && hasChangePermissionB)\n return CompareResult.B_FIRST\n\n // Both have CHANGE_PERMISSIONS or neither have it, proceed with other checks\n\n // AUTHENTICATED group always appears before PUBLIC group\n if (\n authenticatedPrincipalId &&\n String(a.resourceAccess.principalId) === authenticatedPrincipalId &&\n String(b.resourceAccess.principalId) !== authenticatedPrincipalId\n )\n return CompareResult.A_FIRST\n if (\n authenticatedPrincipalId &&\n String(a.resourceAccess.principalId) !== authenticatedPrincipalId &&\n String(b.resourceAccess.principalId) === authenticatedPrincipalId\n )\n return CompareResult.B_FIRST\n\n // PUBLIC group always appears before other users / teams\n if (\n publicPrincipalId &&\n String(a.resourceAccess.principalId) === publicPrincipalId &&\n String(b.resourceAccess.principalId) !== publicPrincipalId\n )\n return CompareResult.A_FIRST\n if (\n publicPrincipalId &&\n String(a.resourceAccess.principalId) !== publicPrincipalId &&\n String(b.resourceAccess.principalId) === publicPrincipalId\n )\n return CompareResult.B_FIRST\n\n // If none of the other cases apply, sort alphabetically by userName\n return a.userGroupHeader.userName.localeCompare(b.userGroupHeader.userName)\n}\n"],"mappings":";;AAsBA,SAAgB,EACd,GACA,GACA,GACA,GACQ;CACR,IAAK,IAAL,yBAAA,GAAA;SACE,EAAA,EAAA,UAAU,MAAC,WACX,EAAA,EAAA,UAAU,KAAA;MACX,EAEK,IAAuB,EAAE,eAAe,WAAW,SACvD,EAAY,mBACb,EACK,IAAuB,EAAE,eAAe,WAAW,SACvD,EAAY,mBACb;AAsCD,QApCI,KAAwB,CAAC,IACpB,EAAc,UACnB,CAAC,KAAwB,IACpB,EAAc,UAMrB,KACA,OAAO,EAAE,eAAe,YAAY,KAAK,KACzC,OAAO,EAAE,eAAe,YAAY,KAAK,IAElC,EAAc,UAErB,KACA,OAAO,EAAE,eAAe,YAAY,KAAK,KACzC,OAAO,EAAE,eAAe,YAAY,KAAK,IAElC,EAAc,UAIrB,KACA,OAAO,EAAE,eAAe,YAAY,KAAK,KACzC,OAAO,EAAE,eAAe,YAAY,KAAK,IAElC,EAAc,UAErB,KACA,OAAO,EAAE,eAAe,YAAY,KAAK,KACzC,OAAO,EAAE,eAAe,YAAY,KAAK,IAElC,EAAc,UAGhB,EAAE,gBAAgB,SAAS,cAAc,EAAE,gBAAgB,SAAS"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useSortResourceAccessList.js","names":[],"sources":["../../../src/components/AclEditor/useSortResourceAccessList.ts"],"sourcesContent":["import { useGetUserGroupHeaders } from '@/synapse-queries'\nimport { useGetRealmPrincipals } from '@/synapse-queries/realm/useRealmPrincipals'\nimport { ResourceAccess } from '@sage-bionetworks/synapse-types'\nimport { useEffect, useMemo } from 'react'\nimport {\n compareResourceAccessAndUserGroupHeader,\n ResourceAccessAndUserGroupHeader,\n} from './ResourceAccessAndUserGroupHeader'\n\n/**\n * Custom hook to sort a list of ResourceAccess objects by the permissions and name of the user or team.\n * @param resourceAccessList\n */\nexport default function useSortResourceAccessList(\n resourceAccessList: ResourceAccess[],\n) {\n const { data } = useGetRealmPrincipals()\n const realmPrincipals = data || {}\n const {\n authenticatedUsers: authenticatedUsersId,\n publicGroup: publicGroupId,\n } = realmPrincipals\n const principalIdsOnResourceAccessList = useMemo(\n () => resourceAccessList.map(ra => ra.principalId),\n [resourceAccessList],\n )\n\n const {\n data: userGroupHeadersOnResourceAccessList,\n isLoading,\n error,\n } = useGetUserGroupHeaders(principalIdsOnResourceAccessList.map(String), {\n enabled: principalIdsOnResourceAccessList.length > 0,\n })\n\n useEffect(() => {\n if (error) {\n console.error('Error fetching user group headers: ', error)\n }\n }, [error])\n\n const sortedResourceAccessList = useMemo(() => {\n if (!userGroupHeadersOnResourceAccessList) {\n return null\n }\n\n const joinedWithUserGroupHeaders = resourceAccessList.map(\n (ral): ResourceAccessAndUserGroupHeader => ({\n resourceAccess: ral,\n userGroupHeader: userGroupHeadersOnResourceAccessList.find(\n ugh => String(ugh.ownerId) === String(ral.principalId),\n )!,\n }),\n )\n\n const allEntriesHaveUserGroupHeader = joinedWithUserGroupHeaders.every(\n obj => Boolean(obj.userGroupHeader),\n )\n\n if (!allEntriesHaveUserGroupHeader) {\n console.warn(\n 'Some ACL entries do not have a corresponding UserGroupHeader. The ResourceAccess list will not be sorted. Missing entries: ',\n joinedWithUserGroupHeaders.filter(obj => !obj.userGroupHeader),\n )\n return null\n }\n\n return joinedWithUserGroupHeaders\n .toSorted((a, b) =>\n compareResourceAccessAndUserGroupHeader(\n a,\n b,\n authenticatedUsersId,\n publicGroupId,\n ),\n )\n .map(obj => obj.resourceAccess)\n }, [\n resourceAccessList,\n userGroupHeadersOnResourceAccessList,\n authenticatedUsersId,\n publicGroupId,\n ])\n\n return {\n sortedResourceAccessList,\n isLoading,\n }\n}\n"],"mappings":";;;;;;AAaA,SAAwB,EACtB,GACA;CACA,IAAM,EAAE,YAAS,GAAuB,EAElC,EACJ,oBAAoB,GACpB,aAAa,MAHS,KAAQ,EAAE,EAK5B,IAAmC,QACjC,EAAmB,KAAI,MAAM,EAAG,YAAY,EAClD,CAAC,EAAmB,CACrB,EAEK,EACJ,MAAM,GACN,cACA,aACE,EAAuB,EAAiC,IAAI,OAAO,EAAE,EACvE,SAAS,EAAiC,SAAS,GACpD,CAAC;AAmDF,QAjDA,QAAgB;AACd,EAAI,KACF,QAAQ,MAAM,uCAAuC,EAAM;IAE5D,CAAC,EAAM,CAAC,EA6CJ;EACL,0BA5C+B,QAAc;AAC7C,OAAI,CAAC,EACH,QAAO;GAGT,IAAM,IAA6B,EAAmB,KACnD,OAA2C;IAC1C,gBAAgB;IAChB,iBAAiB,EAAqC,MACpD,MAAO,OAAO,EAAI,QAAQ,KAAK,OAAO,EAAI,YAAY,CACvD;IACF,EACF;AAcD,UAZsC,EAA2B,OAC/D,MAAO,EAAQ,EAAI,
|
|
1
|
+
{"version":3,"file":"useSortResourceAccessList.js","names":[],"sources":["../../../src/components/AclEditor/useSortResourceAccessList.ts"],"sourcesContent":["import { useGetUserGroupHeaders } from '@/synapse-queries'\nimport { useGetRealmPrincipals } from '@/synapse-queries/realm/useRealmPrincipals'\nimport { ResourceAccess } from '@sage-bionetworks/synapse-types'\nimport { useEffect, useMemo } from 'react'\nimport {\n compareResourceAccessAndUserGroupHeader,\n ResourceAccessAndUserGroupHeader,\n} from './ResourceAccessAndUserGroupHeader'\n\n/**\n * Custom hook to sort a list of ResourceAccess objects by the permissions and name of the user or team.\n * @param resourceAccessList\n */\nexport default function useSortResourceAccessList(\n resourceAccessList: ResourceAccess[],\n) {\n const { data } = useGetRealmPrincipals()\n const realmPrincipals = data || {}\n const {\n authenticatedUsers: authenticatedUsersId,\n publicGroup: publicGroupId,\n } = realmPrincipals\n const principalIdsOnResourceAccessList = useMemo(\n () => resourceAccessList.map(ra => ra.principalId),\n [resourceAccessList],\n )\n\n const {\n data: userGroupHeadersOnResourceAccessList,\n isLoading,\n error,\n } = useGetUserGroupHeaders(principalIdsOnResourceAccessList.map(String), {\n enabled: principalIdsOnResourceAccessList.length > 0,\n })\n\n useEffect(() => {\n if (error) {\n console.error('Error fetching user group headers: ', error)\n }\n }, [error])\n\n const sortedResourceAccessList = useMemo(() => {\n if (!userGroupHeadersOnResourceAccessList) {\n return null\n }\n\n const joinedWithUserGroupHeaders = resourceAccessList.map(\n (ral): ResourceAccessAndUserGroupHeader => ({\n resourceAccess: ral,\n userGroupHeader: userGroupHeadersOnResourceAccessList.find(\n ugh => String(ugh.ownerId) === String(ral.principalId),\n )!,\n }),\n )\n\n const allEntriesHaveUserGroupHeader = joinedWithUserGroupHeaders.every(\n obj => Boolean(obj.userGroupHeader),\n )\n\n if (!allEntriesHaveUserGroupHeader) {\n console.warn(\n 'Some ACL entries do not have a corresponding UserGroupHeader. The ResourceAccess list will not be sorted. Missing entries: ',\n joinedWithUserGroupHeaders.filter(obj => !obj.userGroupHeader),\n )\n return null\n }\n\n return joinedWithUserGroupHeaders\n .toSorted((a, b) =>\n compareResourceAccessAndUserGroupHeader(\n a,\n b,\n authenticatedUsersId,\n publicGroupId,\n ),\n )\n .map(obj => obj.resourceAccess)\n }, [\n resourceAccessList,\n userGroupHeadersOnResourceAccessList,\n authenticatedUsersId,\n publicGroupId,\n ])\n\n return {\n sortedResourceAccessList,\n isLoading,\n }\n}\n"],"mappings":";;;;;;AAaA,SAAwB,EACtB,GACA;CACA,IAAM,EAAE,YAAS,GAAuB,EAElC,EACJ,oBAAoB,GACpB,aAAa,MAHS,KAAQ,EAAE,EAK5B,IAAmC,QACjC,EAAmB,KAAI,MAAM,EAAG,YAAY,EAClD,CAAC,EAAmB,CACrB,EAEK,EACJ,MAAM,GACN,cACA,aACE,EAAuB,EAAiC,IAAI,OAAO,EAAE,EACvE,SAAS,EAAiC,SAAS,GACpD,CAAC;AAmDF,QAjDA,QAAgB;AACd,EAAI,KACF,QAAQ,MAAM,uCAAuC,EAAM;IAE5D,CAAC,EAAM,CAAC,EA6CJ;EACL,0BA5C+B,QAAc;AAC7C,OAAI,CAAC,EACH,QAAO;GAGT,IAAM,IAA6B,EAAmB,KACnD,OAA2C;IAC1C,gBAAgB;IAChB,iBAAiB,EAAqC,MACpD,MAAO,OAAO,EAAI,QAAQ,KAAK,OAAO,EAAI,YAAY,CACvD;IACF,EACF;AAcD,UAZsC,EAA2B,OAC/D,MAAO,EAAQ,EAAI,gBAGhB,GAQE,EACJ,UAAU,GAAG,MACZ,EACE,GACA,GACA,GACA,EACD,CACF,CACA,KAAI,MAAO,EAAI,eAAe,IAhB/B,QAAQ,KACN,+HACA,EAA2B,QAAO,MAAO,CAAC,EAAI,gBAAgB,CAC/D,EACM;KAaR;GACD;GACA;GACA;GACA;GACD,CAGC;EACA;EACD"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useUpdateAcl.js","names":[],"sources":["../../../src/components/AclEditor/useUpdateAcl.ts"],"sourcesContent":["import { useGlobalIsEditingContext } from '@/utils/context/GlobalIsEditingContext'\nimport { ACCESS_TYPE, ResourceAccess } from '@sage-bionetworks/synapse-types'\nimport {\n Dispatch,\n SetStateAction,\n useCallback,\n useEffect,\n useState,\n} from 'react'\nimport { noop } from 'lodash-es'\nimport useSortResourceAccessList from './useSortResourceAccessList'\n\nexport const PRINCIPAL_ALREADY_ADDED_ERROR_MESSAGE =\n 'User or team already has permissions.'\n\nexport type UseUpdateAclOptions = {\n initialResourceAccessList?: ResourceAccess[]\n onChange?: (resourceAccessList: ResourceAccess[]) => void\n onError?: (e: string) => void\n}\n\ntype UseUpdateAclReturn = {\n /** The ResourceAccess list that is being updated. It will automatically be sorted unless the `add`, `update` or `remove` functions are called. */\n resourceAccessList: ResourceAccess[]\n /** Set the ResourceAccess list. Does not prevent re-sorting */\n setResourceAccessList: Dispatch<SetStateAction<ResourceAccess[]>>\n /** Adds a principal to the list with the provided accessTypes */\n addResourceAccessItem: (\n principalId: number,\n accessTypes: ACCESS_TYPE[],\n ) => void\n /** Updates the principal in the list with the provided accessTypes */\n updateResourceAccessItem: (\n principalId: number,\n accessType: ACCESS_TYPE[],\n ) => void\n /** Removes the principal from the list */\n removeResourceAccessItem: (principalId: number) => void\n /** Resets the dirty state of the form, which will immediately trigger sorting the resourceAccessList */\n resetDirtyState: () => void\n}\n\nconst EMPTY_ARRAY: ResourceAccess[] = []\n\nexport default function useUpdateAcl(\n options: UseUpdateAclOptions = {},\n): UseUpdateAclReturn {\n const {\n initialResourceAccessList = EMPTY_ARRAY,\n onChange = noop,\n onError = noop,\n } = options\n const [isDirty, setIsDirty] = useState(false)\n const { setIsEditing } = useGlobalIsEditingContext()\n\n // When the form is dirty, set the global editing state to true\n useEffect(() => {\n setIsEditing(isDirty)\n return () => {\n setIsEditing(false)\n }\n }, [isDirty, setIsEditing])\n\n const [resourceAccessList, setResourceAccessList] = useState<\n ResourceAccess[]\n >(initialResourceAccessList)\n const [hasSorted, setHasSorted] = useState(false)\n\n // While the form has not been edited, sort the resourceAccessList\n const { sortedResourceAccessList, isLoading: isLoadingSortedList } =\n useSortResourceAccessList(resourceAccessList)\n useEffect(() => {\n if (\n !isDirty &&\n !isLoadingSortedList &&\n !hasSorted &&\n sortedResourceAccessList != null\n ) {\n setResourceAccessList(sortedResourceAccessList)\n // `useSortResourceAccessList` will return a new array every time `resourceAccessList` changes, so we need to\n // track if we've already sorted to prevent an infinite loop\n setHasSorted(true)\n }\n }, [hasSorted, isDirty, isLoadingSortedList, sortedResourceAccessList])\n\n useEffect(() => {\n onChange(resourceAccessList)\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [resourceAccessList])\n\n const addResourceAccessItem = useCallback(\n (principalId: number, accessTypes: ACCESS_TYPE[]) => {\n setIsDirty(true)\n if (principalId) {\n setResourceAccessList(resourceAccessList => {\n const alreadyReviewer = resourceAccessList.some(\n resourceAccess => resourceAccess.principalId === principalId,\n )\n if (alreadyReviewer) {\n onError(PRINCIPAL_ALREADY_ADDED_ERROR_MESSAGE)\n } else {\n const newResourceAccess: ResourceAccess = {\n principalId: principalId,\n accessType: accessTypes,\n }\n return [...resourceAccessList, newResourceAccess]\n }\n return resourceAccessList\n })\n }\n },\n [onError],\n )\n\n const updateResourceAccessItem = useCallback(\n (principalId: number, accessType: ACCESS_TYPE[]) => {\n setIsDirty(true)\n setResourceAccessList(resourceAccessList =>\n resourceAccessList.map(resourceAccess => {\n return resourceAccess.principalId === principalId\n ? { ...resourceAccess, accessType }\n : resourceAccess\n }),\n )\n },\n [],\n )\n\n const removeResourceAccessItem = useCallback((principalId: number) => {\n setIsDirty(true)\n setResourceAccessList(resourceAccessList =>\n resourceAccessList.filter(\n raListItem => raListItem.principalId !== principalId,\n ),\n )\n }, [])\n\n const resetDirtyState = useCallback(() => {\n setIsDirty(false)\n }, [])\n\n return {\n resourceAccessList,\n setResourceAccessList,\n addResourceAccessItem,\n updateResourceAccessItem,\n removeResourceAccessItem,\n resetDirtyState,\n }\n}\n"],"mappings":";;;;;AAYA,IAAa,IACX,yCA6BI,IAAgC,EAAE;AAExC,SAAwB,EACtB,IAA+B,EAAE,EACb;CACpB,IAAM,EACJ,+BAA4B,GAC5B,cAAW,GACX,aAAU,MACR,GACE,CAAC,GAAS,KAAc,EAAS,GAAM,EACvC,EAAE,oBAAiB,GAA2B;AAGpD,UACE,EAAa,EAAQ,QACR;AACX,IAAa,GAAM;KAEpB,CAAC,GAAS,EAAa,CAAC;CAE3B,IAAM,CAAC,GAAoB,KAAyB,EAElD,EAA0B,EACtB,CAAC,GAAW,KAAgB,EAAS,GAAM,EAG3C,EAAE,6BAA0B,WAAW,MAC3C,EAA0B,EAAmB;AAuE/C,QAtEA,QAAgB;AACd,EACE,CAAC,KACD,CAAC,KACD,CAAC,KACD,KAA4B,SAE5B,EAAsB,EAAyB,EAG/C,EAAa,GAAK;IAEnB;EAAC;EAAW;EAAS;EAAqB;EAAyB,CAAC,EAEvE,QAAgB;AACd,IAAS,EAAmB;IAE3B,CAAC,EAAmB,CAAC,EAqDjB;EACL;EACA;EACA,uBAtD4B,GAC3B,GAAqB,MAA+B;AAEnD,GADA,EAAW,GAAK,EACZ,KACF,GAAsB,MAAsB;AAI1C,QAHwB,EAAmB,MACzC,MAAkB,EAAe,gBAAgB,
|
|
1
|
+
{"version":3,"file":"useUpdateAcl.js","names":[],"sources":["../../../src/components/AclEditor/useUpdateAcl.ts"],"sourcesContent":["import { useGlobalIsEditingContext } from '@/utils/context/GlobalIsEditingContext'\nimport { ACCESS_TYPE, ResourceAccess } from '@sage-bionetworks/synapse-types'\nimport {\n Dispatch,\n SetStateAction,\n useCallback,\n useEffect,\n useState,\n} from 'react'\nimport { noop } from 'lodash-es'\nimport useSortResourceAccessList from './useSortResourceAccessList'\n\nexport const PRINCIPAL_ALREADY_ADDED_ERROR_MESSAGE =\n 'User or team already has permissions.'\n\nexport type UseUpdateAclOptions = {\n initialResourceAccessList?: ResourceAccess[]\n onChange?: (resourceAccessList: ResourceAccess[]) => void\n onError?: (e: string) => void\n}\n\ntype UseUpdateAclReturn = {\n /** The ResourceAccess list that is being updated. It will automatically be sorted unless the `add`, `update` or `remove` functions are called. */\n resourceAccessList: ResourceAccess[]\n /** Set the ResourceAccess list. Does not prevent re-sorting */\n setResourceAccessList: Dispatch<SetStateAction<ResourceAccess[]>>\n /** Adds a principal to the list with the provided accessTypes */\n addResourceAccessItem: (\n principalId: number,\n accessTypes: ACCESS_TYPE[],\n ) => void\n /** Updates the principal in the list with the provided accessTypes */\n updateResourceAccessItem: (\n principalId: number,\n accessType: ACCESS_TYPE[],\n ) => void\n /** Removes the principal from the list */\n removeResourceAccessItem: (principalId: number) => void\n /** Resets the dirty state of the form, which will immediately trigger sorting the resourceAccessList */\n resetDirtyState: () => void\n}\n\nconst EMPTY_ARRAY: ResourceAccess[] = []\n\nexport default function useUpdateAcl(\n options: UseUpdateAclOptions = {},\n): UseUpdateAclReturn {\n const {\n initialResourceAccessList = EMPTY_ARRAY,\n onChange = noop,\n onError = noop,\n } = options\n const [isDirty, setIsDirty] = useState(false)\n const { setIsEditing } = useGlobalIsEditingContext()\n\n // When the form is dirty, set the global editing state to true\n useEffect(() => {\n setIsEditing(isDirty)\n return () => {\n setIsEditing(false)\n }\n }, [isDirty, setIsEditing])\n\n const [resourceAccessList, setResourceAccessList] = useState<\n ResourceAccess[]\n >(initialResourceAccessList)\n const [hasSorted, setHasSorted] = useState(false)\n\n // While the form has not been edited, sort the resourceAccessList\n const { sortedResourceAccessList, isLoading: isLoadingSortedList } =\n useSortResourceAccessList(resourceAccessList)\n useEffect(() => {\n if (\n !isDirty &&\n !isLoadingSortedList &&\n !hasSorted &&\n sortedResourceAccessList != null\n ) {\n setResourceAccessList(sortedResourceAccessList)\n // `useSortResourceAccessList` will return a new array every time `resourceAccessList` changes, so we need to\n // track if we've already sorted to prevent an infinite loop\n setHasSorted(true)\n }\n }, [hasSorted, isDirty, isLoadingSortedList, sortedResourceAccessList])\n\n useEffect(() => {\n onChange(resourceAccessList)\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [resourceAccessList])\n\n const addResourceAccessItem = useCallback(\n (principalId: number, accessTypes: ACCESS_TYPE[]) => {\n setIsDirty(true)\n if (principalId) {\n setResourceAccessList(resourceAccessList => {\n const alreadyReviewer = resourceAccessList.some(\n resourceAccess => resourceAccess.principalId === principalId,\n )\n if (alreadyReviewer) {\n onError(PRINCIPAL_ALREADY_ADDED_ERROR_MESSAGE)\n } else {\n const newResourceAccess: ResourceAccess = {\n principalId: principalId,\n accessType: accessTypes,\n }\n return [...resourceAccessList, newResourceAccess]\n }\n return resourceAccessList\n })\n }\n },\n [onError],\n )\n\n const updateResourceAccessItem = useCallback(\n (principalId: number, accessType: ACCESS_TYPE[]) => {\n setIsDirty(true)\n setResourceAccessList(resourceAccessList =>\n resourceAccessList.map(resourceAccess => {\n return resourceAccess.principalId === principalId\n ? { ...resourceAccess, accessType }\n : resourceAccess\n }),\n )\n },\n [],\n )\n\n const removeResourceAccessItem = useCallback((principalId: number) => {\n setIsDirty(true)\n setResourceAccessList(resourceAccessList =>\n resourceAccessList.filter(\n raListItem => raListItem.principalId !== principalId,\n ),\n )\n }, [])\n\n const resetDirtyState = useCallback(() => {\n setIsDirty(false)\n }, [])\n\n return {\n resourceAccessList,\n setResourceAccessList,\n addResourceAccessItem,\n updateResourceAccessItem,\n removeResourceAccessItem,\n resetDirtyState,\n }\n}\n"],"mappings":";;;;;AAYA,IAAa,IACX,yCA6BI,IAAgC,EAAE;AAExC,SAAwB,EACtB,IAA+B,EAAE,EACb;CACpB,IAAM,EACJ,+BAA4B,GAC5B,cAAW,GACX,aAAU,MACR,GACE,CAAC,GAAS,KAAc,EAAS,GAAM,EACvC,EAAE,oBAAiB,GAA2B;AAGpD,UACE,EAAa,EAAQ,QACR;AACX,IAAa,GAAM;KAEpB,CAAC,GAAS,EAAa,CAAC;CAE3B,IAAM,CAAC,GAAoB,KAAyB,EAElD,EAA0B,EACtB,CAAC,GAAW,KAAgB,EAAS,GAAM,EAG3C,EAAE,6BAA0B,WAAW,MAC3C,EAA0B,EAAmB;AAuE/C,QAtEA,QAAgB;AACd,EACE,CAAC,KACD,CAAC,KACD,CAAC,KACD,KAA4B,SAE5B,EAAsB,EAAyB,EAG/C,EAAa,GAAK;IAEnB;EAAC;EAAW;EAAS;EAAqB;EAAyB,CAAC,EAEvE,QAAgB;AACd,IAAS,EAAmB;IAE3B,CAAC,EAAmB,CAAC,EAqDjB;EACL;EACA;EACA,uBAtD4B,GAC3B,GAAqB,MAA+B;AAEnD,GADA,EAAW,GAAK,EACZ,KACF,GAAsB,MAAsB;AAI1C,QAHwB,EAAmB,MACzC,MAAkB,EAAe,gBAAgB,EAE/C,CACF,GAAQ,EAAsC;SACzC;KACL,IAAM,IAAoC;MAC3B;MACb,YAAY;MACb;AACD,YAAO,CAAC,GAAG,GAAoB,EAAkB;;AAEnD,WAAO;KACP;KAGN,CAAC,EAAQ,CAiCT;EACA,0BA/B+B,GAC9B,GAAqB,MAA8B;AAElD,GADA,EAAW,GAAK,EAChB,GAAsB,MACpB,EAAmB,KAAI,MACd,EAAe,gBAAgB,IAClC;IAAE,GAAG;IAAgB;IAAY,GACjC,EACJ,CACH;KAEH,EAAE,CAoBF;EACA,0BAlB+B,GAAa,MAAwB;AAEpE,GADA,EAAW,GAAK,EAChB,GAAsB,MACpB,EAAmB,QACjB,MAAc,EAAW,gBAAgB,EAC1C,CACF;KACA,EAAE,CAWH;EACA,iBAVsB,QAAkB;AACxC,KAAW,GAAM;KAChB,EAAE,CAQH;EACD"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AridhiaAccessStatus.js","names":[],"sources":["../../../src/components/Aridhia/AridhiaAccessStatus.tsx"],"sourcesContent":["import { Button } from '@mui/material'\nimport { useGetAridhiaRequests } from '@/aridhia-queries'\nimport AccessIcon, { RestrictionUiType } from '../HasAccess/AccessIcon'\nimport { SRC_SIGN_IN_CLASS } from '@/utils/SynapseConstants'\nimport { useSynapseContext } from '@/utils'\nimport {\n getRestrictionUiTypeFromAridhiaRequest,\n findRequestForDataset,\n} from './aridhiaAccessStatusUtils'\n\nconst buttonSx = { p: '0px', minWidth: 'unset' }\n\nexport type AridhiaAccessStatusProps = {\n /**\n * dataset code\n */\n datasetCode: string\n url?: string\n}\n\n/**\n * Component that displays the Aridhia data access request status.\n * If the user is not authenticated with Aridhia, shows a sign-in button.\n * Otherwise, shows the access status based on the data access requests.\n */\nexport default function AridhiaAccessStatus(props: AridhiaAccessStatusProps) {\n const { datasetCode, url } = props\n const { isAuthenticated } = useSynapseContext()\n const { data: requestsResponse, isLoading } = useGetAridhiaRequests()\n\n if (!isAuthenticated) {\n return (\n <Button\n sx={buttonSx}\n className={SRC_SIGN_IN_CLASS}\n onClick={ev => {\n if (ev.isTrusted) {\n /*\n There is a tricky problem - \n The portals listens to click events for buttons with the class SRC_SIGN_IN_CLASS set, it listens to this event\n so that it can display the login modal.\n\n This button has an svg inside of it which is problematic because more often than not clicking this button will \n instead click that svg. The event listener in the portals will break as a result.\n\n Though the svg may get the actual click event, because of event bubbling this button will get its onClick called.\n Once onClick is called we can manually dispatch an event off of this button. This does pose a problem, we end up in a \n infinite loop because this button keeps dispatching click events, so we can use the isTrusted to recognize if onClick was\n triggered programmatically or by user click. Lastly, using { bubbles: true } ensures the event bubbles up to the document level.\n\n */\n const clickEvent = new MouseEvent('click', { bubbles: true })\n ev.currentTarget.dispatchEvent(clickEvent)\n }\n }}\n >\n <AccessIcon\n restrictionUiType={RestrictionUiType.AccessBlockedToAnonymous}\n />\n </Button>\n )\n }\n\n // Show loading state\n if (isLoading) {\n return <></>\n }\n\n // Check if there's a request for this dataset\n const entityRequest = findRequestForDataset(\n requestsResponse?.items ?? [],\n datasetCode,\n )\n\n const restrictionUiType =\n getRestrictionUiTypeFromAridhiaRequest(entityRequest)\n\n const icon = <AccessIcon restrictionUiType={restrictionUiType} />\n\n // If URL provided, wrap icon in link\n return url ? (\n <a href={url} target=\"_blank\" rel=\"noopener noreferrer\">\n {icon}\n </a>\n ) : (\n icon\n )\n}\n"],"mappings":";;;;;;;;;;AAUA,IAAM,IAAW;CAAE,GAAG;CAAO,UAAU;CAAS;AAehD,SAAwB,EAAoB,GAAiC;CAC3E,IAAM,EAAE,gBAAa,WAAQ,GACvB,EAAE,uBAAoB,GAAmB,EACzC,EAAE,MAAM,GAAkB,iBAAc,GAAuB;AAErE,KAAI,CAAC,EACH,QACE,kBAAC,GAAD;EACE,IAAI;EACJ,WAAW;EACX,UAAS,MAAM;AACb,OAAI,EAAG,WAAW;IAehB,IAAM,IAAa,IAAI,WAAW,SAAS,EAAE,SAAS,IAAM,CAAC;AAC7D,MAAG,cAAc,cAAc,EAAW;;;YAI9C,kBAAC,GAAD,EACE,mBAAmB,EAAkB,0BACrC,CAAA;EACK,CAAA;AAKb,KAAI,EACF,QAAO,kBAAA,GAAA,EAAK,CAAA;CAYd,IAAM,IAAO,kBAAC,GAAD,EAA+B,mBAF1C,EANoB,EACpB,GAAkB,SAAS,EAAE,EAC7B,
|
|
1
|
+
{"version":3,"file":"AridhiaAccessStatus.js","names":[],"sources":["../../../src/components/Aridhia/AridhiaAccessStatus.tsx"],"sourcesContent":["import { Button } from '@mui/material'\nimport { useGetAridhiaRequests } from '@/aridhia-queries'\nimport AccessIcon, { RestrictionUiType } from '../HasAccess/AccessIcon'\nimport { SRC_SIGN_IN_CLASS } from '@/utils/SynapseConstants'\nimport { useSynapseContext } from '@/utils'\nimport {\n getRestrictionUiTypeFromAridhiaRequest,\n findRequestForDataset,\n} from './aridhiaAccessStatusUtils'\n\nconst buttonSx = { p: '0px', minWidth: 'unset' }\n\nexport type AridhiaAccessStatusProps = {\n /**\n * dataset code\n */\n datasetCode: string\n url?: string\n}\n\n/**\n * Component that displays the Aridhia data access request status.\n * If the user is not authenticated with Aridhia, shows a sign-in button.\n * Otherwise, shows the access status based on the data access requests.\n */\nexport default function AridhiaAccessStatus(props: AridhiaAccessStatusProps) {\n const { datasetCode, url } = props\n const { isAuthenticated } = useSynapseContext()\n const { data: requestsResponse, isLoading } = useGetAridhiaRequests()\n\n if (!isAuthenticated) {\n return (\n <Button\n sx={buttonSx}\n className={SRC_SIGN_IN_CLASS}\n onClick={ev => {\n if (ev.isTrusted) {\n /*\n There is a tricky problem - \n The portals listens to click events for buttons with the class SRC_SIGN_IN_CLASS set, it listens to this event\n so that it can display the login modal.\n\n This button has an svg inside of it which is problematic because more often than not clicking this button will \n instead click that svg. The event listener in the portals will break as a result.\n\n Though the svg may get the actual click event, because of event bubbling this button will get its onClick called.\n Once onClick is called we can manually dispatch an event off of this button. This does pose a problem, we end up in a \n infinite loop because this button keeps dispatching click events, so we can use the isTrusted to recognize if onClick was\n triggered programmatically or by user click. Lastly, using { bubbles: true } ensures the event bubbles up to the document level.\n\n */\n const clickEvent = new MouseEvent('click', { bubbles: true })\n ev.currentTarget.dispatchEvent(clickEvent)\n }\n }}\n >\n <AccessIcon\n restrictionUiType={RestrictionUiType.AccessBlockedToAnonymous}\n />\n </Button>\n )\n }\n\n // Show loading state\n if (isLoading) {\n return <></>\n }\n\n // Check if there's a request for this dataset\n const entityRequest = findRequestForDataset(\n requestsResponse?.items ?? [],\n datasetCode,\n )\n\n const restrictionUiType =\n getRestrictionUiTypeFromAridhiaRequest(entityRequest)\n\n const icon = <AccessIcon restrictionUiType={restrictionUiType} />\n\n // If URL provided, wrap icon in link\n return url ? (\n <a href={url} target=\"_blank\" rel=\"noopener noreferrer\">\n {icon}\n </a>\n ) : (\n icon\n )\n}\n"],"mappings":";;;;;;;;;;AAUA,IAAM,IAAW;CAAE,GAAG;CAAO,UAAU;CAAS;AAehD,SAAwB,EAAoB,GAAiC;CAC3E,IAAM,EAAE,gBAAa,WAAQ,GACvB,EAAE,uBAAoB,GAAmB,EACzC,EAAE,MAAM,GAAkB,iBAAc,GAAuB;AAErE,KAAI,CAAC,EACH,QACE,kBAAC,GAAD;EACE,IAAI;EACJ,WAAW;EACX,UAAS,MAAM;AACb,OAAI,EAAG,WAAW;IAehB,IAAM,IAAa,IAAI,WAAW,SAAS,EAAE,SAAS,IAAM,CAAC;AAC7D,MAAG,cAAc,cAAc,EAAW;;;YAI9C,kBAAC,GAAD,EACE,mBAAmB,EAAkB,0BACrC,CAAA;EACK,CAAA;AAKb,KAAI,EACF,QAAO,kBAAA,GAAA,EAAK,CAAA;CAYd,IAAM,IAAO,kBAAC,GAAD,EAA+B,mBAF1C,EANoB,EACpB,GAAkB,SAAS,EAAE,EAC7B,EAIuC,CAEG,EAAqB,CAAA;AAGjE,QAAO,IACL,kBAAC,KAAD;EAAG,MAAM;EAAK,QAAO;EAAS,KAAI;YAC/B;EACC,CAAA,GAEJ"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AuthenticationMethodSelection.d.ts","sourceRoot":"","sources":["../../../src/components/Authentication/AuthenticationMethodSelection.tsx"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAsB,MAAM,SAAS,CAAA;
|
|
1
|
+
{"version":3,"file":"AuthenticationMethodSelection.d.ts","sourceRoot":"","sources":["../../../src/components/Authentication/AuthenticationMethodSelection.tsx"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAsB,MAAM,SAAS,CAAA;AAazD,OAAO,EAAE,KAAK,EAAE,MAAM,kCAAkC,CAAA;AAMxD,KAAK,kCAAkC,GAAG;IACxC,cAAc,CAAC,EAAE,MAAM,CAAA;IAEvB,kBAAkB,CAAC,EAAE,MAAM,IAAI,CAAA;IAC/B,2BAA2B,EAAE,MAAM,IAAI,CAAA;IACvC,KAAK,CAAC,EAAE,WAAW,CAAA;IACnB,KAAK,CAAC,EAAE,KAAK,CAAA;CACd,CAAA;AAID;;;;GAIG;AACH,MAAM,CAAC,OAAO,UAAU,6BAA6B,CACnD,KAAK,EAAE,kCAAkC,2CAgF1C"}
|
|
@@ -1,62 +1,63 @@
|
|
|
1
1
|
import { OAUTH2_PROVIDERS as e } from "../../utils/SynapseConstants.js";
|
|
2
2
|
import t from "../../synapse-client/index.js";
|
|
3
|
-
import {
|
|
4
|
-
import
|
|
5
|
-
import i from "
|
|
6
|
-
import { hasArcusProvider as a } from "../../utils/functions/RealmUtils.js";
|
|
3
|
+
import { generateCsrfToken as n } from "../../utils/functions/generateCsrfToken.js";
|
|
4
|
+
import r from "./LoginMethodButton.js";
|
|
5
|
+
import { hasArcusProvider as i, hasSageBionetworksProvider as a } from "../../utils/functions/RealmUtils.js";
|
|
7
6
|
import { Box as o } from "@mui/material";
|
|
8
7
|
import { Fragment as s, jsx as c, jsxs as l } from "react/jsx-runtime";
|
|
9
|
-
import { FeatureFlagEnum as u } from "@sage-bionetworks/synapse-types";
|
|
10
8
|
//#region src/components/Authentication/AuthenticationMethodSelection.tsx
|
|
11
|
-
var
|
|
12
|
-
function
|
|
13
|
-
let { onBeginOAuthSignIn:
|
|
14
|
-
...
|
|
15
|
-
csrfToken:
|
|
9
|
+
var u = n();
|
|
10
|
+
function d(n) {
|
|
11
|
+
let { onBeginOAuthSignIn: d, ssoRedirectUrl: f, onSelectUsernameAndPassword: p, state: m, realm: h } = n, g = i(h), _ = a(h), v = g || _, y = {
|
|
12
|
+
...m,
|
|
13
|
+
csrfToken: u
|
|
16
14
|
};
|
|
17
15
|
function b(e, n) {
|
|
18
|
-
|
|
19
|
-
let r =
|
|
16
|
+
d && d(), e.preventDefault();
|
|
17
|
+
let r = f ? `${f}${n}` : `${t.getRootURL()}?provider=${n}`;
|
|
20
18
|
t.oAuthUrlRequest(n, r, y).then((e) => {
|
|
21
19
|
window.location.href = e.authorizationUrl;
|
|
22
20
|
}).catch((e) => {
|
|
23
21
|
console.log("Error on oAuth url ", e);
|
|
24
22
|
});
|
|
25
23
|
}
|
|
26
|
-
return /* @__PURE__ */ l(o, { children: [
|
|
27
|
-
/* @__PURE__ */
|
|
28
|
-
|
|
29
|
-
|
|
24
|
+
return /* @__PURE__ */ l(o, { children: [
|
|
25
|
+
!v && /* @__PURE__ */ l(s, { children: [
|
|
26
|
+
/* @__PURE__ */ c(r, {
|
|
27
|
+
loginMethod: "GOOGLE",
|
|
28
|
+
iconName: "google24",
|
|
29
|
+
onClick: (t) => {
|
|
30
|
+
b(t, e.GOOGLE);
|
|
31
|
+
}
|
|
32
|
+
}),
|
|
33
|
+
/* @__PURE__ */ c(r, {
|
|
34
|
+
loginMethod: "ORCID",
|
|
35
|
+
iconName: "orcid",
|
|
36
|
+
onClick: (t) => {
|
|
37
|
+
b(t, e.ORCID);
|
|
38
|
+
}
|
|
39
|
+
}),
|
|
40
|
+
/* @__PURE__ */ c(r, {
|
|
41
|
+
loginMethod: "EMAIL",
|
|
42
|
+
iconName: "email",
|
|
43
|
+
onClick: p
|
|
44
|
+
})
|
|
45
|
+
] }),
|
|
46
|
+
g && /* @__PURE__ */ c(r, {
|
|
47
|
+
loginMethod: "ARCUS",
|
|
30
48
|
onClick: (t) => {
|
|
31
|
-
b(t, e.
|
|
49
|
+
b(t, e.ARCUS);
|
|
32
50
|
}
|
|
33
51
|
}),
|
|
34
|
-
/* @__PURE__ */ c(
|
|
35
|
-
loginMethod: "ORCID",
|
|
36
|
-
iconName: "orcid",
|
|
37
|
-
onClick: (t) => {
|
|
38
|
-
b(t, e.ORCID);
|
|
39
|
-
}
|
|
40
|
-
}),
|
|
41
|
-
/* @__PURE__ */ c(i, {
|
|
42
|
-
loginMethod: "EMAIL",
|
|
43
|
-
iconName: "email",
|
|
44
|
-
onClick: m
|
|
45
|
-
}),
|
|
46
|
-
v && /* @__PURE__ */ c(i, {
|
|
52
|
+
_ && /* @__PURE__ */ c(r, {
|
|
47
53
|
loginMethod: "SAGE_BIONETWORKS",
|
|
48
54
|
onClick: (t) => {
|
|
49
55
|
b(t, e.SAGE_BIONETWORKS);
|
|
50
56
|
}
|
|
51
57
|
})
|
|
52
|
-
] })
|
|
53
|
-
loginMethod: "ARCUS",
|
|
54
|
-
onClick: (t) => {
|
|
55
|
-
b(t, e.ARCUS);
|
|
56
|
-
}
|
|
57
|
-
})] });
|
|
58
|
+
] });
|
|
58
59
|
}
|
|
59
60
|
//#endregion
|
|
60
|
-
export {
|
|
61
|
+
export { d as default };
|
|
61
62
|
|
|
62
63
|
//# sourceMappingURL=AuthenticationMethodSelection.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AuthenticationMethodSelection.js","names":[],"sources":["../../../src/components/Authentication/AuthenticationMethodSelection.tsx"],"sourcesContent":["import SynapseClient from '@/synapse-client'\nimport { OAuth2State, SynapseClientError } from '@/utils'\nimport { generateCsrfToken } from '@/utils/functions/generateCsrfToken'\nimport {\n LOGIN_METHOD_EMAIL,\n LOGIN_METHOD_OAUTH2_ARCUS,\n LOGIN_METHOD_OAUTH2_GOOGLE,\n LOGIN_METHOD_OAUTH2_ORCID,\n LOGIN_METHOD_OAUTH2_SAGE_BIONETWORKS,\n OAUTH2_PROVIDERS,\n} from '@/utils/SynapseConstants'\nimport { Box } from '@mui/material'\nimport { MouseEvent } from 'react'\nimport LoginMethodButton from './LoginMethodButton'\nimport {
|
|
1
|
+
{"version":3,"file":"AuthenticationMethodSelection.js","names":[],"sources":["../../../src/components/Authentication/AuthenticationMethodSelection.tsx"],"sourcesContent":["import SynapseClient from '@/synapse-client'\nimport { OAuth2State, SynapseClientError } from '@/utils'\nimport { generateCsrfToken } from '@/utils/functions/generateCsrfToken'\nimport {\n LOGIN_METHOD_EMAIL,\n LOGIN_METHOD_OAUTH2_ARCUS,\n LOGIN_METHOD_OAUTH2_GOOGLE,\n LOGIN_METHOD_OAUTH2_ORCID,\n LOGIN_METHOD_OAUTH2_SAGE_BIONETWORKS,\n OAUTH2_PROVIDERS,\n} from '@/utils/SynapseConstants'\nimport { Box } from '@mui/material'\nimport { MouseEvent } from 'react'\nimport LoginMethodButton from './LoginMethodButton'\nimport { Realm } from '@sage-bionetworks/synapse-client'\nimport {\n hasArcusProvider,\n hasSageBionetworksProvider,\n} from '@/utils/functions/RealmUtils'\n\ntype AuthenticationMethodSelectionProps = {\n ssoRedirectUrl?: string\n /* Invoked before redirecting to OAuth provider. Useful in portals where we may want to store the current URL to redirect back here. */\n onBeginOAuthSignIn?: () => void\n onSelectUsernameAndPassword: () => void\n state?: OAuth2State\n realm?: Realm\n}\n\nconst csrfToken = generateCsrfToken()\n\n/**\n * To support Google SSO in your portal, you must add your domain to the Authorized Redirect URIs for Synapse authentication.\n * This can be done by visiting https://sagebionetworks.jira.com/servicedesk/customer/portal/9 to set up a collaboration.\n * Synapse engineers must add your redirect URL in the Google API console found at https://console.cloud.google.com/ for this functionality to work.\n */\nexport default function AuthenticationMethodSelection(\n props: AuthenticationMethodSelectionProps,\n) {\n const {\n onBeginOAuthSignIn,\n ssoRedirectUrl,\n onSelectUsernameAndPassword,\n state,\n realm,\n } = props\n\n const showArcusSSOButtonOnly = hasArcusProvider(realm)\n const showSageBionetworksSSOButtonOnly = hasSageBionetworksProvider(realm)\n\n const isSingleIdpOnly =\n showArcusSSOButtonOnly || showSageBionetworksSSOButtonOnly\n const stateWithCSRF: OAuth2State = { ...state, csrfToken }\n\n function onSSOSignIn(event: MouseEvent<HTMLButtonElement>, provider: string) {\n if (onBeginOAuthSignIn) {\n onBeginOAuthSignIn()\n }\n\n event.preventDefault()\n const redirectUrl = ssoRedirectUrl\n ? `${ssoRedirectUrl}${provider}`\n : `${SynapseClient.getRootURL()}?provider=${provider}`\n SynapseClient.oAuthUrlRequest(provider, redirectUrl, stateWithCSRF)\n .then(data => {\n // Send the user to the authorization URL\n window.location.href = data.authorizationUrl\n })\n .catch((err: SynapseClientError) => {\n console.log('Error on oAuth url ', err)\n })\n }\n\n return (\n <Box>\n {!isSingleIdpOnly && (\n <>\n <LoginMethodButton\n loginMethod={LOGIN_METHOD_OAUTH2_GOOGLE}\n iconName=\"google24\"\n onClick={event => {\n onSSOSignIn(event, OAUTH2_PROVIDERS.GOOGLE)\n }}\n />\n <LoginMethodButton\n loginMethod={LOGIN_METHOD_OAUTH2_ORCID}\n iconName=\"orcid\"\n onClick={event => {\n onSSOSignIn(event, OAUTH2_PROVIDERS.ORCID)\n }}\n />\n <LoginMethodButton\n loginMethod={LOGIN_METHOD_EMAIL}\n iconName=\"email\"\n onClick={onSelectUsernameAndPassword}\n />\n </>\n )}\n {showArcusSSOButtonOnly && (\n <LoginMethodButton\n loginMethod={LOGIN_METHOD_OAUTH2_ARCUS}\n // iconName=\"arcusbio\"\n onClick={event => {\n onSSOSignIn(event, OAUTH2_PROVIDERS.ARCUS)\n }}\n />\n )}\n {showSageBionetworksSSOButtonOnly && (\n <LoginMethodButton\n loginMethod={LOGIN_METHOD_OAUTH2_SAGE_BIONETWORKS}\n onClick={event => {\n onSSOSignIn(event, OAUTH2_PROVIDERS.SAGE_BIONETWORKS)\n }}\n />\n )}\n </Box>\n )\n}\n"],"mappings":";;;;;;;;AA6BA,IAAM,IAAY,GAAmB;AAOrC,SAAwB,EACtB,GACA;CACA,IAAM,EACJ,uBACA,mBACA,gCACA,UACA,aACE,GAEE,IAAyB,EAAiB,EAAM,EAChD,IAAmC,EAA2B,EAAM,EAEpE,IACJ,KAA0B,GACtB,IAA6B;EAAE,GAAG;EAAO;EAAW;CAE1D,SAAS,EAAY,GAAsC,GAAkB;AAK3E,EAJI,KACF,GAAoB,EAGtB,EAAM,gBAAgB;EACtB,IAAM,IAAc,IAChB,GAAG,IAAiB,MACpB,GAAG,EAAc,YAAY,CAAC,YAAY;AAC9C,IAAc,gBAAgB,GAAU,GAAa,EAAc,CAChE,MAAK,MAAQ;AAEZ,UAAO,SAAS,OAAO,EAAK;IAC5B,CACD,OAAO,MAA4B;AAClC,WAAQ,IAAI,uBAAuB,EAAI;IACvC;;AAGN,QACE,kBAAC,GAAD,EAAA,UAAA;EACG,CAAC,KACA,kBAAA,GAAA,EAAA,UAAA;GACE,kBAAC,GAAD;IACE,aAAA;IACA,UAAS;IACT,UAAS,MAAS;AAChB,OAAY,GAAO,EAAiB,OAAO;;IAE7C,CAAA;GACF,kBAAC,GAAD;IACE,aAAA;IACA,UAAS;IACT,UAAS,MAAS;AAChB,OAAY,GAAO,EAAiB,MAAM;;IAE5C,CAAA;GACF,kBAAC,GAAD;IACE,aAAA;IACA,UAAS;IACT,SAAS;IACT,CAAA;GACD,EAAA,CAAA;EAEJ,KACC,kBAAC,GAAD;GACE,aAAA;GAEA,UAAS,MAAS;AAChB,MAAY,GAAO,EAAiB,MAAM;;GAE5C,CAAA;EAEH,KACC,kBAAC,GAAD;GACE,aAAA;GACA,UAAS,MAAS;AAChB,MAAY,GAAO,EAAiB,iBAAiB;;GAEvD,CAAA;EAEA,EAAA,CAAA"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
1
|
export declare const TOTP_GUIDANCE_TEXT = "Enter the 6-digit, time-based verification code provided by your authenticator app.";
|
|
2
2
|
export declare const RECOVERY_CODE_GUIDANCE_TEXT_SHORT = "Enter a one-time backup code. Your backup code is a 16 digit code, with groups of 4 letters or numbers separated by hyphens.";
|
|
3
|
+
export declare const TOTP_CLOCK_SKEW_ERROR_APPENDAGE = "Please ensure automatic date and time is enabled in your device settings and try again.";
|
|
3
4
|
//# sourceMappingURL=Constants.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Constants.d.ts","sourceRoot":"","sources":["../../../src/components/Authentication/Constants.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,kBAAkB,wFACwD,CAAA;AAEvF,eAAO,MAAM,iCAAiC,iIACkF,CAAA"}
|
|
1
|
+
{"version":3,"file":"Constants.d.ts","sourceRoot":"","sources":["../../../src/components/Authentication/Constants.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,kBAAkB,wFACwD,CAAA;AAEvF,eAAO,MAAM,iCAAiC,iIACkF,CAAA;AAEhI,eAAO,MAAM,+BAA+B,4FAC+C,CAAA"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
//#region src/components/Authentication/Constants.ts
|
|
2
|
-
var e = "Enter the 6-digit, time-based verification code provided by your authenticator app.", t = "Enter a one-time backup code. Your backup code is a 16 digit code, with groups of 4 letters or numbers separated by hyphens.";
|
|
2
|
+
var e = "Enter the 6-digit, time-based verification code provided by your authenticator app.", t = "Enter a one-time backup code. Your backup code is a 16 digit code, with groups of 4 letters or numbers separated by hyphens.", n = "Please ensure automatic date and time is enabled in your device settings and try again.";
|
|
3
3
|
//#endregion
|
|
4
|
-
export { t as RECOVERY_CODE_GUIDANCE_TEXT_SHORT, e as TOTP_GUIDANCE_TEXT };
|
|
4
|
+
export { t as RECOVERY_CODE_GUIDANCE_TEXT_SHORT, n as TOTP_CLOCK_SKEW_ERROR_APPENDAGE, e as TOTP_GUIDANCE_TEXT };
|
|
5
5
|
|
|
6
6
|
//# sourceMappingURL=Constants.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Constants.js","names":[],"sources":["../../../src/components/Authentication/Constants.ts"],"sourcesContent":["export const TOTP_GUIDANCE_TEXT =\n 'Enter the 6-digit, time-based verification code provided by your authenticator app.'\n\nexport const RECOVERY_CODE_GUIDANCE_TEXT_SHORT =\n 'Enter a one-time backup code. Your backup code is a 16 digit code, with groups of 4 letters or numbers separated by hyphens.'\n"],"mappings":";AAAA,IAAa,IACX,uFAEW,IACX"}
|
|
1
|
+
{"version":3,"file":"Constants.js","names":[],"sources":["../../../src/components/Authentication/Constants.ts"],"sourcesContent":["export const TOTP_GUIDANCE_TEXT =\n 'Enter the 6-digit, time-based verification code provided by your authenticator app.'\n\nexport const RECOVERY_CODE_GUIDANCE_TEXT_SHORT =\n 'Enter a one-time backup code. Your backup code is a 16 digit code, with groups of 4 letters or numbers separated by hyphens.'\n\nexport const TOTP_CLOCK_SKEW_ERROR_APPENDAGE =\n 'Please ensure automatic date and time is enabled in your device settings and try again.'\n"],"mappings":";AAAA,IAAa,IACX,uFAEW,IACX,gIAEW,IACX"}
|