synapse-react-client 4.0.45 → 4.0.46
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/SWC.index.js +1 -1
- package/dist/aridhia-queries/AridhiaKeyFactory.d.ts +1 -0
- package/dist/aridhia-queries/AridhiaKeyFactory.d.ts.map +1 -1
- package/dist/aridhia-queries/AridhiaKeyFactory.js +3 -0
- package/dist/aridhia-queries/AridhiaKeyFactory.js.map +1 -1
- package/dist/aridhia-queries/aridhiaTokenExchange.js +6 -6
- package/dist/aridhia-queries/index.d.ts +1 -0
- package/dist/aridhia-queries/index.d.ts.map +1 -1
- package/dist/aridhia-queries/index.js +11 -10
- package/dist/aridhia-queries/useGetAridhiaVocabularyTerm.d.ts +19 -0
- package/dist/aridhia-queries/useGetAridhiaVocabularyTerm.d.ts.map +1 -0
- package/dist/aridhia-queries/useGetAridhiaVocabularyTerm.js +14 -0
- package/dist/aridhia-queries/useGetAridhiaVocabularyTerm.js.map +1 -0
- package/dist/components/AccessRequirementList/AccessApprovalCheckMark.d.ts.map +1 -1
- package/dist/components/AccessRequirementList/AccessApprovalCheckMark.js +6 -4
- package/dist/components/AccessRequirementList/AccessApprovalCheckMark.js.map +1 -1
- package/dist/components/AccessRequirementList/AccessRequirementList.js.map +1 -1
- package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/AccessorRequirementHelpText.js +1 -1
- package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/AccessorRequirementHelpText.js.map +1 -1
- package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/ResearchProjectForm/ResearchProjectForm.js +1 -1
- package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/ResearchProjectForm/ResearchProjectForm.js.map +1 -1
- package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/ReviewCollaboratorsAndSigningOfficialAccordion.js +1 -1
- package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/ReviewCollaboratorsAndSigningOfficialAccordion.js.map +1 -1
- package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/SignatureStatusStep/SignatureStatusStep.d.ts.map +1 -1
- package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/SignatureStatusStep/SignatureStatusStep.js +11 -8
- package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/SignatureStatusStep/SignatureStatusStep.js.map +1 -1
- package/dist/components/AccessTokenPage/AccessTokenPage.js +1 -1
- package/dist/components/AccessTokenPage/AccessTokenPage.js.map +1 -1
- package/dist/components/AcknowledgementsPage/AcknowledgementsPage.js +1 -1
- package/dist/components/AcknowledgementsPage/AcknowledgementsPage.js.map +1 -1
- package/dist/components/Aridhia/DarWizard/DarSectionForm.d.ts.map +1 -1
- package/dist/components/Aridhia/DarWizard/DarSectionForm.js +17 -13
- package/dist/components/Aridhia/DarWizard/DarSectionForm.js.map +1 -1
- package/dist/components/Aridhia/DarWizard/DarSubmittedPanel.d.ts +3 -3
- package/dist/components/Aridhia/DarWizard/DarSubmittedPanel.d.ts.map +1 -1
- package/dist/components/Aridhia/DarWizard/DarSubmittedPanel.js +33 -34
- package/dist/components/Aridhia/DarWizard/DarSubmittedPanel.js.map +1 -1
- package/dist/components/Aridhia/fairFormToRjsf.js +1 -1
- package/dist/components/Aridhia/fairFormToRjsf.js.map +1 -1
- package/dist/components/Authentication/LastLoginInfo.js +1 -1
- package/dist/components/Authentication/LastLoginInfo.js.map +1 -1
- package/dist/components/CertificationQuiz/CertificationQuiz.js +1 -1
- package/dist/components/CertificationQuiz/CertificationQuiz.js.map +1 -1
- package/dist/components/ChallengeSubmission/AvailableEvaluationQueueList.js +1 -1
- package/dist/components/ChallengeSubmission/AvailableEvaluationQueueList.js.map +1 -1
- package/dist/components/ChallengeSubmission/EvaluationQueueCurrentRoundInfo.js +1 -1
- package/dist/components/ChallengeSubmission/EvaluationQueueCurrentRoundInfo.js.map +1 -1
- package/dist/components/ChallengeSubmission/SubmissionDirectoryList.js +6 -6
- package/dist/components/ChallengeSubmission/SubmissionDirectoryList.js.map +1 -1
- package/dist/components/ChallengeTeamWizard/ChallengeTeamTable.d.ts.map +1 -1
- package/dist/components/ChallengeTeamWizard/ChallengeTeamTable.js +4 -4
- package/dist/components/ChallengeTeamWizard/ChallengeTeamTable.js.map +1 -1
- package/dist/components/ChallengeTeamWizard/SelectChallengeTeam.js +4 -4
- package/dist/components/CitationPopover/CitationPopoverContent.js +4 -4
- package/dist/components/CitationPopover/CitationPopoverContent.js.map +1 -1
- package/dist/components/ComponentCollapse.d.ts.map +1 -1
- package/dist/components/ComponentCollapse.js +2 -1
- package/dist/components/ComponentCollapse.js.map +1 -1
- package/dist/components/DataGrid/SynapseGrid.d.ts.map +1 -1
- package/dist/components/DataGrid/SynapseGrid.js +231 -219
- package/dist/components/DataGrid/SynapseGrid.js.map +1 -1
- package/dist/components/DataGrid/SyncGridWithSourceButton.d.ts.map +1 -1
- package/dist/components/DataGrid/SyncGridWithSourceButton.js +5 -4
- package/dist/components/DataGrid/SyncGridWithSourceButton.js.map +1 -1
- package/dist/components/DataGrid/components/ColumnHeaderWithTooltip.d.ts.map +1 -1
- package/dist/components/DataGrid/components/ColumnHeaderWithTooltip.js +7 -5
- package/dist/components/DataGrid/components/ColumnHeaderWithTooltip.js.map +1 -1
- package/dist/components/DataGrid/components/ExportCsvFromGridButton.js +4 -4
- package/dist/components/DataGrid/components/ExportCsvFromGridButton.js.map +1 -1
- package/dist/components/DataGrid/components/ReorderColumnsButton.js +4 -4
- package/dist/components/DataGrid/components/ReorderColumnsButton.js.map +1 -1
- package/dist/components/DataGrid/components/ReorderColumnsDialog.d.ts.map +1 -1
- package/dist/components/DataGrid/components/ReorderColumnsDialog.js +12 -8
- package/dist/components/DataGrid/components/ReorderColumnsDialog.js.map +1 -1
- package/dist/components/DataGrid/components/UploadCsvToGridButton.js +1 -1
- package/dist/components/DataGrid/components/UploadCsvToGridButton.js.map +1 -1
- package/dist/components/DataGrid/hooks/useGridUndoRedo.js +5 -5
- package/dist/components/DataGrid/utils/applyModelChange.d.ts.map +1 -1
- package/dist/components/DataGrid/utils/applyModelChange.js +14 -14
- package/dist/components/DataGrid/utils/applyModelChange.js.map +1 -1
- package/dist/components/DataGrid/utils/columnFactory.js +1 -1
- package/dist/components/DataGrid/utils/columnFactory.js.map +1 -1
- package/dist/components/DataGrid/utils/splitPatch.d.ts.map +1 -1
- package/dist/components/DataGrid/utils/splitPatch.js +22 -13
- package/dist/components/DataGrid/utils/splitPatch.js.map +1 -1
- package/dist/components/DownloadCart/DownloadCartPage.js +1 -1
- package/dist/components/DownloadCart/DownloadCartPage.js.map +1 -1
- package/dist/components/DownloadCart/DownloadIneligibleForPackagingFilesFromListButton.d.ts.map +1 -1
- package/dist/components/DownloadCart/DownloadIneligibleForPackagingFilesFromListButton.js +2 -1
- package/dist/components/DownloadCart/DownloadIneligibleForPackagingFilesFromListButton.js.map +1 -1
- package/dist/components/DownloadCart/DownloadIneligibleForPackagingFilesFromListButton.module.js.map +1 -1
- package/dist/components/DownloadCart/DownloadIneligibleForPackagingFilesFromListButton.module.scss +1 -3
- package/dist/components/EntityBadgeIcons/EntityBadgeIcons.d.ts.map +1 -1
- package/dist/components/EntityBadgeIcons/EntityBadgeIcons.js +16 -10
- package/dist/components/EntityBadgeIcons/EntityBadgeIcons.js.map +1 -1
- package/dist/components/EntityDownloadButton/EntityDownloadButton.js +1 -1
- package/dist/components/EntityDownloadButton/EntityDownloadButton.js.map +1 -1
- package/dist/components/EntityFinder/EntityFinder.js +4 -4
- package/dist/components/EntityFinder/EntityIdTextField.js +1 -1
- package/dist/components/EntityFinder/EntityIdTextField.js.map +1 -1
- package/dist/components/EntityFinder/tree/VirtualizedTree.d.ts.map +1 -1
- package/dist/components/EntityFinder/tree/VirtualizedTree.js +5 -4
- package/dist/components/EntityFinder/tree/VirtualizedTree.js.map +1 -1
- package/dist/components/EntityHeaderTable/EntityHeaderTable.js +1 -1
- package/dist/components/EntityHeaderTable/EntityHeaderTable.js.map +1 -1
- package/dist/components/EntityTreeTable/components/EntityNameCell.d.ts.map +1 -1
- package/dist/components/EntityTreeTable/components/EntityNameCell.js +2 -1
- package/dist/components/EntityTreeTable/components/EntityNameCell.js.map +1 -1
- package/dist/components/EntityUpload/FileUploadProgress.d.ts.map +1 -1
- package/dist/components/EntityUpload/FileUploadProgress.js +11 -7
- package/dist/components/EntityUpload/FileUploadProgress.js.map +1 -1
- package/dist/components/Evaluation/round_limits/EvaluationRoundLimitOptionsList.d.ts.map +1 -1
- package/dist/components/Evaluation/round_limits/EvaluationRoundLimitOptionsList.js +4 -3
- package/dist/components/Evaluation/round_limits/EvaluationRoundLimitOptionsList.js.map +1 -1
- package/dist/components/ExperimentalMode/ExperimentalMode.js +1 -1
- package/dist/components/ExperimentalMode/ExperimentalMode.js.map +1 -1
- package/dist/components/ExternalFileHandleLink/ExternalFileHandleLink.js +1 -1
- package/dist/components/ExternalFileHandleLink/ExternalFileHandleLink.js.map +1 -1
- package/dist/components/FormTemplateEditor/ChoiceOptionsEditor.d.ts.map +1 -1
- package/dist/components/FormTemplateEditor/ChoiceOptionsEditor.js +2 -1
- package/dist/components/FormTemplateEditor/ChoiceOptionsEditor.js.map +1 -1
- package/dist/components/FormTemplateEditor/FieldDefinitionDrawer.d.ts.map +1 -1
- package/dist/components/FormTemplateEditor/FieldDefinitionDrawer.js +2 -1
- package/dist/components/FormTemplateEditor/FieldDefinitionDrawer.js.map +1 -1
- package/dist/components/FormTemplateEditor/FieldLibrary.d.ts.map +1 -1
- package/dist/components/FormTemplateEditor/FieldLibrary.js +2 -1
- package/dist/components/FormTemplateEditor/FieldLibrary.js.map +1 -1
- package/dist/components/FormTemplateEditor/FieldLibraryRow.js +4 -4
- package/dist/components/FormTemplateEditor/FieldLibraryRow.js.map +1 -1
- package/dist/components/FormTemplateEditor/FormStructurePanel.js +1 -1
- package/dist/components/FormTemplateEditor/FormStructurePanel.js.map +1 -1
- package/dist/components/FormTemplateEditor/FormTemplateEditorForm.js +1 -1
- package/dist/components/FormTemplateEditor/FormTemplateEditorForm.js.map +1 -1
- package/dist/components/FormTemplateEditor/StepCard.d.ts.map +1 -1
- package/dist/components/FormTemplateEditor/StepCard.js +15 -10
- package/dist/components/FormTemplateEditor/StepCard.js.map +1 -1
- package/dist/components/FormTemplateEditor/StepFieldRow.d.ts.map +1 -1
- package/dist/components/FormTemplateEditor/StepFieldRow.js +11 -6
- package/dist/components/FormTemplateEditor/StepFieldRow.js.map +1 -1
- package/dist/components/FormTemplateEditor/TemplateFileHandleField.d.ts.map +1 -1
- package/dist/components/FormTemplateEditor/TemplateFileHandleField.js +2 -1
- package/dist/components/FormTemplateEditor/TemplateFileHandleField.js.map +1 -1
- package/dist/components/GenericCard/DuoTermTags/DuoTermTags.js +45 -45
- package/dist/components/GenericCard/PortalDOI/PortalDOI.js +5 -5
- package/dist/components/GenericCard/PortalDOI/PortalDOI.js.map +1 -1
- package/dist/components/GenericCard/TableRowGenericCard.js +1 -1
- package/dist/components/GenericCard/TableRowGenericCard.js.map +1 -1
- package/dist/components/HelpPopover/HelpPopover.js +1 -1
- package/dist/components/HelpPopover/HelpPopover.js.map +1 -1
- package/dist/components/IconSvg/IconSvg.d.ts.map +1 -1
- package/dist/components/IconSvg/IconSvg.js +154 -47
- package/dist/components/IconSvg/IconSvg.js.map +1 -1
- package/dist/components/JsonSchemaForm/templates/ButtonTemplate.d.ts.map +1 -1
- package/dist/components/JsonSchemaForm/templates/ButtonTemplate.js +19 -16
- package/dist/components/JsonSchemaForm/templates/ButtonTemplate.js.map +1 -1
- package/dist/components/JsonSchemaForm/templates/RJSFInputLabel.d.ts.map +1 -1
- package/dist/components/JsonSchemaForm/templates/RJSFInputLabel.js +2 -1
- package/dist/components/JsonSchemaForm/templates/RJSFInputLabel.js.map +1 -1
- package/dist/components/JsonSchemaForm/widgets/PhoneWidget.d.ts +9 -0
- package/dist/components/JsonSchemaForm/widgets/PhoneWidget.d.ts.map +1 -0
- package/dist/components/JsonSchemaForm/widgets/PhoneWidget.js +21 -0
- package/dist/components/JsonSchemaForm/widgets/PhoneWidget.js.map +1 -0
- package/dist/components/Markdown/MarkdownCollapse.d.ts.map +1 -1
- package/dist/components/Markdown/MarkdownCollapse.js +3 -1
- package/dist/components/Markdown/MarkdownCollapse.js.map +1 -1
- package/dist/components/MissingQueryResultsWarning/MissingQueryResultsWarning.js +1 -1
- package/dist/components/MissingQueryResultsWarning/MissingQueryResultsWarning.js.map +1 -1
- package/dist/components/OAuthClientManagement/OAuthManagement.js +14 -13
- package/dist/components/OAuthClientManagement/OAuthManagement.js.map +1 -1
- package/dist/components/PortalList/PortalCard.d.ts.map +1 -1
- package/dist/components/PortalList/PortalCard.js +6 -5
- package/dist/components/PortalList/PortalCard.js.map +1 -1
- package/dist/components/PortalList/PortalList.js +4 -4
- package/dist/components/PortalList/PortalList.js.map +1 -1
- package/dist/components/ProjectVisibilityChip/ProjectVisibilityChip.js +6 -6
- package/dist/components/QueryBuilder/FilterConditionRow.js +4 -4
- package/dist/components/QueryCountButton/QueryCountButton.js +5 -5
- package/dist/components/QueryCountButton/QueryCountButton.js.map +1 -1
- package/dist/components/ReleaseCard/ReleaseCardLarge.js +5 -5
- package/dist/components/ReleaseCard/ReleaseCardLarge.js.map +1 -1
- package/dist/components/SetAccessRequirementCommonFields/SetAccessRequirementCommonFields.js +1 -1
- package/dist/components/SetAccessRequirementCommonFields/SetAccessRequirementCommonFields.js.map +1 -1
- package/dist/components/ShareThisPage/ShareThisPage.js +4 -4
- package/dist/components/ShareThisPage/ShareThisPage.js.map +1 -1
- package/dist/components/SustainabilityScorecard/DialLayout.js +1 -1
- package/dist/components/SustainabilityScorecard/DialLayout.js.map +1 -1
- package/dist/components/SustainabilityScorecard/SustainabilityScorecard.js +1 -1
- package/dist/components/SustainabilityScorecard/SustainabilityScorecard.js.map +1 -1
- package/dist/components/SynapseChat/SynapseChat.js +1 -1
- package/dist/components/SynapseChat/SynapseChat.js.map +1 -1
- package/dist/components/SynapseChat/SynapseChatInteraction.d.ts.map +1 -1
- package/dist/components/SynapseChat/SynapseChatInteraction.js +2 -1
- package/dist/components/SynapseChat/SynapseChatInteraction.js.map +1 -1
- package/dist/components/SynapseChat/components/ChatInputArea/ChatInputArea.js +1 -1
- package/dist/components/SynapseChat/components/ChatInputArea/ChatInputArea.js.map +1 -1
- package/dist/components/SynapseFooter/SynapseFooter.js +1 -1
- package/dist/components/SynapseFooter/SynapseFooter.js.map +1 -1
- package/dist/components/SynapseHomepageV2/SynapseFeaturedDatasetItem.js +1 -1
- package/dist/components/SynapseHomepageV2/SynapseFeaturedDatasetItem.js.map +1 -1
- package/dist/components/SynapseHomepageV2/SynapseHomepageNavBar.d.ts.map +1 -1
- package/dist/components/SynapseHomepageV2/SynapseHomepageNavBar.js +2 -1
- package/dist/components/SynapseHomepageV2/SynapseHomepageNavBar.js.map +1 -1
- package/dist/components/SynapseHomepageV2/SynapseInActionItem.js +4 -4
- package/dist/components/SynapseHomepageV2/SynapseInActionItem.js.map +1 -1
- package/dist/components/SynapseHomepageV2/SynapseTrendingProjectsItem.js +1 -1
- package/dist/components/SynapseHomepageV2/SynapseTrendingProjectsItem.js.map +1 -1
- package/dist/components/SynapseNavDrawer/SynapseNavDrawer.d.ts.map +1 -1
- package/dist/components/SynapseNavDrawer/SynapseNavDrawer.js +4 -1
- package/dist/components/SynapseNavDrawer/SynapseNavDrawer.js.map +1 -1
- package/dist/components/SynapsePortalBanners/SynapsePortalBanners.js +1 -1
- package/dist/components/SynapsePortalBanners/SynapsePortalBanners.js.map +1 -1
- package/dist/components/SynapseSearchPageResults/SynapseSearchPageResults.js +1 -1
- package/dist/components/SynapseSearchPageResults/SynapseSearchPageResults.js.map +1 -1
- package/dist/components/SynapseSearchPageResults/SynapseSearchResultsCard.d.ts.map +1 -1
- package/dist/components/SynapseSearchPageResults/SynapseSearchResultsCard.js +12 -9
- package/dist/components/SynapseSearchPageResults/SynapseSearchResultsCard.js.map +1 -1
- package/dist/components/SynapseTable/RowSelection/RowSelectionControls.js +4 -4
- package/dist/components/SynapseTable/RowSelection/RowSelectionControls.js.map +1 -1
- package/dist/components/SynapseTable/datasets/DatasetItemsEditor.js +140 -140
- package/dist/components/SynapseTable/datasets/DatasetItemsEditor.js.map +1 -1
- package/dist/components/TableColumnSchemaEditor/ColumnModelForm.js +1 -1
- package/dist/components/TableColumnSchemaEditor/ColumnModelForm.js.map +1 -1
- package/dist/components/TableColumnSchemaEditor/ImportTableColumnsButton.js +1 -1
- package/dist/components/TableColumnSchemaEditor/ImportTableColumnsButton.js.map +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 +9 -9
- package/dist/components/TableColumnSchemaEditor/TableColumnSchemaForm.js.map +1 -1
- package/dist/components/TableColumnSchemaEditor/TableColumnSchemaFormActions.d.ts.map +1 -1
- package/dist/components/TableColumnSchemaEditor/TableColumnSchemaFormActions.js +6 -4
- package/dist/components/TableColumnSchemaEditor/TableColumnSchemaFormActions.js.map +1 -1
- package/dist/components/TanStackTable/ColumnHeader.js +1 -1
- package/dist/components/TanStackTable/ColumnHeader.js.map +1 -1
- package/dist/components/TeamSubjectsSelector/TeamBadgeOrError.js +1 -1
- package/dist/components/TeamSubjectsSelector/TeamBadgeOrError.js.map +1 -1
- package/dist/components/TeamSubjectsSelector/TeamSubjectsSelector.d.ts.map +1 -1
- package/dist/components/TeamSubjectsSelector/TeamSubjectsSelector.js +4 -3
- package/dist/components/TeamSubjectsSelector/TeamSubjectsSelector.js.map +1 -1
- package/dist/components/Webhook/WebhookDashboard.js +1 -1
- package/dist/components/Webhook/WebhookDashboard.js.map +1 -1
- package/dist/components/dataaccess/AccessRequirementDashboard.js +4 -4
- package/dist/components/dataaccess/AccessRequirementDashboard.js.map +1 -1
- package/dist/components/dataaccess/AccessRequirementTable.js +1 -1
- package/dist/components/dataaccess/AccessRequirementTable.js.map +1 -1
- package/dist/components/dataaccess/EDucTemplateTable.d.ts.map +1 -1
- package/dist/components/dataaccess/EDucTemplateTable.js +13 -11
- package/dist/components/dataaccess/EDucTemplateTable.js.map +1 -1
- package/dist/components/dataaccess/FormTemplateTable.js +6 -6
- package/dist/components/dataaccess/FormTemplateTable.js.map +1 -1
- package/dist/components/dataaccess/ReviewerDashboard.js +17 -17
- package/dist/components/dataaccess/ReviewerDashboard.js.map +1 -1
- package/dist/components/dataaccess/SubmissionPage/SubmissionPage.js +4 -4
- package/dist/components/doi/CreateOrUpdateDoiModal.js +1 -1
- package/dist/components/doi/CreateOrUpdateDoiModal.js.map +1 -1
- package/dist/components/download_list/DownloadDetails.d.ts.map +1 -1
- package/dist/components/download_list/DownloadDetails.js +12 -10
- package/dist/components/download_list/DownloadDetails.js.map +1 -1
- package/dist/components/entity/metadata/AnnotationsTable.js +1 -1
- package/dist/components/entity/metadata/AnnotationsTable.js.map +1 -1
- package/dist/components/entity/page/CreatedByModifiedBy.js +1 -1
- package/dist/components/entity/page/CreatedByModifiedBy.js.map +1 -1
- package/dist/components/entity/page/action_menu/EntityActionMenu.d.ts.map +1 -1
- package/dist/components/entity/page/action_menu/EntityActionMenu.js.map +1 -1
- package/dist/components/entity/page/title_bar/useGetEntityTitleBarProperties.js +1 -1
- package/dist/components/entity/page/title_bar/useGetEntityTitleBarProperties.js.map +1 -1
- package/dist/components/error/ErrorChip.d.ts.map +1 -1
- package/dist/components/error/ErrorChip.js +2 -1
- package/dist/components/error/ErrorChip.js.map +1 -1
- package/dist/components/table/CsvPreview/CreateTableFromCsvDialog.js +14 -14
- package/dist/components/table/CsvPreview/CsvPreviewWithOptions.js +4 -4
- package/dist/components/table/CsvPreview/CsvPreviewWithOptions.js.map +1 -1
- package/dist/components/widgets/facet-nav/FacetNavPanel.js +1 -1
- package/dist/components/widgets/facet-nav/FacetNavPanel.js.map +1 -1
- package/dist/features/curator/dashboard/components/NextStepButton.d.ts.map +1 -1
- package/dist/features/curator/dashboard/components/NextStepButton.js +7 -6
- package/dist/features/curator/dashboard/components/NextStepButton.js.map +1 -1
- package/dist/features/entity/metadata-task/components/CreateOrUpdateCurationTaskDialog.js +8 -8
- package/dist/features/entity/metadata-task/components/CreateOrUpdateCurationTaskDialog.js.map +1 -1
- package/dist/features/entity/metadata-task/components/MetadataTaskTableActionCell.js +4 -4
- package/dist/features/entity/metadata-task/components/MetadataTaskTableActionCell.js.map +1 -1
- package/dist/features/entity/metadata-task/components/MetadataTasksPage.js +4 -4
- package/dist/features/entity/metadata-task/components/MetadataTasksPage.js.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/create-task/CurateTaskForm.js +4 -4
- package/dist/features/entity/metadata-task/create-task/CurateTaskForm.js.map +1 -1
- package/dist/features/entity/metadata-task/create-task/TaskCategoryCard.js +1 -1
- package/dist/features/entity/metadata-task/create-task/TaskCategoryCard.js.map +1 -1
- package/dist/features/entity/metadata-task/create-task/TaskFormHeader.js +1 -1
- package/dist/features/entity/metadata-task/create-task/TaskFormHeader.js.map +1 -1
- package/dist/features/entity/metadata-task/create-task/curationTaskFlowRoutes.js +10 -10
- package/dist/features/entity/metadata-task/create-task/curationTaskFlowRoutes.js.map +1 -1
- package/dist/features/team/invitation/components/OpenInvitationsToUserCard.js +1 -1
- package/dist/features/team/invitation/components/OpenInvitationsToUserCard.js.map +1 -1
- package/dist/mocks/msw/handlers/aridhiaHandlers.d.ts +8 -0
- package/dist/mocks/msw/handlers/aridhiaHandlers.d.ts.map +1 -1
- package/dist/mocks/msw/handlers/aridhiaHandlers.js +52 -41
- package/dist/mocks/msw/handlers/aridhiaHandlers.js.map +1 -1
- package/dist/mocks/msw/handlers/entityHandlers.d.ts.map +1 -1
- package/dist/mocks/msw/handlers/entityHandlers.js +70 -67
- package/dist/mocks/msw/handlers/entityHandlers.js.map +1 -1
- package/dist/mocks/msw/handlers/gridHandlers.js +2 -2
- package/dist/mocks/msw/handlers/gridHandlers.js.map +1 -1
- package/dist/mocks/msw/server.d.ts.map +1 -1
- package/dist/mocks/msw/server.js +4 -2
- package/dist/mocks/msw/server.js.map +1 -1
- package/dist/synapse-queries/user/useGetUserChallenges.d.ts.map +1 -1
- package/dist/synapse-queries/user/useGetUserChallenges.js.map +1 -1
- package/dist/theme/DefaultTheme.d.ts.map +1 -1
- package/dist/theme/DefaultTheme.js +4 -1
- package/dist/theme/DefaultTheme.js.map +1 -1
- package/dist/tsconfig.build.tsbuildinfo +1 -1
- package/dist/utils/APIConstants.d.ts.map +1 -1
- package/dist/utils/APIConstants.js.map +1 -1
- package/dist/utils/AppUtils/AppUtils.js +1 -1
- package/dist/utils/AppUtils/AppUtils.js.map +1 -1
- package/dist/utils/functions/EntityTypeUtils.d.ts.map +1 -1
- package/dist/utils/functions/EntityTypeUtils.js.map +1 -1
- package/package.json +7 -6
|
@@ -12,8 +12,11 @@ import { Alert as u, Box as d, Button as f, DialogActions as p, DialogContent as
|
|
|
12
12
|
import { Fragment as v, jsx as y, jsxs as b } from "react/jsx-runtime";
|
|
13
13
|
import { FileHandleAssociateType as x } from "@sage-bionetworks/synapse-types";
|
|
14
14
|
import { EDucSignerStatusStatusEnum as S } from "@sage-bionetworks/synapse-client";
|
|
15
|
-
import
|
|
16
|
-
import
|
|
15
|
+
import C from "dayjs";
|
|
16
|
+
import w from "@mui/icons-material/OpenInNew";
|
|
17
|
+
import T from "@mui/icons-material/CheckCircleOutline";
|
|
18
|
+
import E from "@mui/icons-material/HourglassEmpty";
|
|
19
|
+
import D from "@mui/icons-material/Refresh";
|
|
17
20
|
//#region src/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/SignatureStatusStep/SignatureStatusStep.tsx
|
|
18
21
|
var O = {
|
|
19
22
|
mx: 0,
|
|
@@ -24,7 +27,7 @@ var O = {
|
|
|
24
27
|
color: "grey.700"
|
|
25
28
|
};
|
|
26
29
|
function k(e) {
|
|
27
|
-
let { managedACTAccessRequirement: s, subjectId: S, subjectType:
|
|
30
|
+
let { managedACTAccessRequirement: s, subjectId: S, subjectType: C, onHide: O, onBackClicked: k, onSubmissionCreated: A, viewDucHrefOverride: j } = e, { data: M, isLoading: ae } = r(String(s.id), {
|
|
28
31
|
staleTime: Infinity,
|
|
29
32
|
throwOnError: !0
|
|
30
33
|
}), N = M?.id ?? "", { data: P, isLoading: F, isRefetching: I, error: L, refetch: R } = te(N, { enabled: !!N }), z = P?.signerStatus ?? [], B = z.filter((e) => e.status === "done").length, V = z.length, H = V > 0 && B === V, U = z.filter((e) => e.status !== "done"), { data: W } = ne(N, { enabled: !!N && !H }), { data: G } = ee(N, { enabled: !!N && !j }), K = j ?? (G?.fileHandleId && N ? t.getPortalFileHandleServletUrl(G.fileHandleId, N, x.DataAccessRequestAttachment) : void 0), { data: q } = a(N, { enabled: !!N && H }), [J, Y] = l(), [X, Z] = l(), { mutateAsync: oe, isPending: se } = i({ onError: (e) => Y(e.reason) }), { mutate: ce, isPending: Q } = n({
|
|
@@ -42,7 +45,7 @@ function k(e) {
|
|
|
42
45
|
requestId: e.id,
|
|
43
46
|
requestEtag: e.etag,
|
|
44
47
|
subjectId: S,
|
|
45
|
-
subjectType:
|
|
48
|
+
subjectType: C
|
|
46
49
|
},
|
|
47
50
|
accessRequirementId: String(s.id)
|
|
48
51
|
});
|
|
@@ -102,7 +105,7 @@ function k(e) {
|
|
|
102
105
|
mb: 1
|
|
103
106
|
},
|
|
104
107
|
children: [
|
|
105
|
-
H ? /* @__PURE__ */ y(
|
|
108
|
+
H ? /* @__PURE__ */ y(T, { color: "success" }) : /* @__PURE__ */ y(E, { sx: { color: "grey.700" } }),
|
|
106
109
|
/* @__PURE__ */ y(_, {
|
|
107
110
|
variant: "body1",
|
|
108
111
|
sx: { fontWeight: 700 },
|
|
@@ -118,7 +121,7 @@ function k(e) {
|
|
|
118
121
|
alignItems: "center",
|
|
119
122
|
gap: .5
|
|
120
123
|
},
|
|
121
|
-
children: ["View DUC", /* @__PURE__ */ y(
|
|
124
|
+
children: ["View DUC", /* @__PURE__ */ y(w, { fontSize: "small" })]
|
|
122
125
|
})
|
|
123
126
|
]
|
|
124
127
|
}),
|
|
@@ -137,7 +140,7 @@ function k(e) {
|
|
|
137
140
|
})] }),
|
|
138
141
|
/* @__PURE__ */ y(f, {
|
|
139
142
|
variant: "outlined",
|
|
140
|
-
startIcon: /* @__PURE__ */ y(
|
|
143
|
+
startIcon: /* @__PURE__ */ y(D, {}),
|
|
141
144
|
loading: I,
|
|
142
145
|
onClick: () => {
|
|
143
146
|
R();
|
|
@@ -184,7 +187,7 @@ function k(e) {
|
|
|
184
187
|
] });
|
|
185
188
|
}
|
|
186
189
|
function A(e) {
|
|
187
|
-
return !e.status || e.status === S.pending || e.status === S.done ? "" : e.status === S.declined && e.declinedOn ? ` (declined ${s(
|
|
190
|
+
return !e.status || e.status === S.pending || e.status === S.done ? "" : e.status === S.declined && e.declinedOn ? ` (declined ${s(C(e.declinedOn))})` : ` (${e.status})`;
|
|
188
191
|
}
|
|
189
192
|
function ie(t) {
|
|
190
193
|
let { signer: n } = t, r = n.name ?? "Unnamed signer";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SignatureStatusStep.js","names":[],"sources":["../../../../../src/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/SignatureStatusStep/SignatureStatusStep.tsx"],"sourcesContent":["import {\n useGetDataAccessRequestForUpdate,\n useGetDataAccessRequestPreview,\n useGetDataAccessRequestSignatureStatus,\n useGetDataAccessRequestSignatureUpdatable,\n useGetDataAccessRequestSignedFileHandleId,\n useSubmitDataAccessRequest,\n useUpdateDataAccessRequest,\n} from '@/synapse-queries'\nimport SynapseClient from '@/synapse-client'\nimport { formatDate } from '@/utils/functions/DateFormatter'\nimport { PRODUCTION_ENDPOINT_CONFIG } from '@/utils/functions/getEndpoint'\nimport {\n CheckCircleOutline,\n HourglassEmpty,\n OpenInNew,\n Refresh,\n} from '@mui/icons-material'\nimport {\n Alert,\n Box,\n Button,\n DialogActions,\n DialogContent,\n Link,\n Skeleton,\n Stack,\n SxProps,\n Typography,\n} from '@mui/material'\nimport {\n EDucSignerStatus,\n EDucSignerStatusStatusEnum,\n} from '@sage-bionetworks/synapse-client'\nimport {\n FileHandleAssociateType,\n RestrictableObjectType,\n} from '@sage-bionetworks/synapse-types'\nimport dayjs from 'dayjs'\nimport { useState } from 'react'\nimport { DialogBaseTitle } from '../../../DialogBase'\nimport { longFieldLabelSx } from '../styles'\nimport { RequestFlowAccessRequirement } from '../requestFlowTypes'\n\n/** Browser defaults indent a blockquote far too much for a nested list item. */\nconst declinedReasonSx: SxProps = {\n mx: 0,\n my: 0.5,\n pl: 1.5,\n borderLeft: '3px solid',\n borderColor: 'grey.300',\n color: 'grey.700',\n}\n\nexport type SignatureStatusStepProps = {\n managedACTAccessRequirement: RequestFlowAccessRequirement\n subjectId: string\n subjectType: RestrictableObjectType\n onHide: () => void\n /**\n * Called when the user clicks the Back button. When omitted, the Back button is hidden —\n * used when the step is reached via direct entry (e.g. a deep-link route) rather than\n * through the wizard flow, so there is no meaningful previous step to return to.\n */\n onBackClicked?: () => void\n onSubmissionCreated: (submissionId: string) => void\n /**\n * Optional href override for the \"View DUC\" link. When set, the preview file handle fetch\n * is skipped and this URL is used directly. Used by stories and tests where the portal\n * servlet is not available.\n */\n viewDucHrefOverride?: string\n}\n\n/**\n * Wizard step shown after the user has routed the eDUC for electronic signature\n * (PORTALS-4380). Polls the DocuSign envelope status, lists the pending signers,\n * and enables submission once every signer has signed.\n */\nexport default function SignatureStatusStep(props: SignatureStatusStepProps) {\n const {\n managedACTAccessRequirement,\n subjectId,\n subjectType,\n onHide,\n onBackClicked,\n onSubmissionCreated,\n viewDucHrefOverride,\n } = props\n\n const { data: dataAccessRequest, isLoading: isLoadingDar } =\n useGetDataAccessRequestForUpdate(String(managedACTAccessRequirement.id), {\n staleTime: Infinity,\n throwOnError: true,\n })\n\n const requestId = dataAccessRequest?.id ?? ''\n\n const {\n data: signatureStatus,\n isLoading: isLoadingStatus,\n isRefetching: isRefetchingStatus,\n error: statusError,\n refetch: refetchStatus,\n } = useGetDataAccessRequestSignatureStatus(requestId, {\n enabled: Boolean(requestId),\n })\n\n const signers: EDucSignerStatus[] = signatureStatus?.signerStatus ?? []\n const collectedCount = signers.filter(s => s.status === 'done').length\n const totalCount = signers.length\n const allCollected = totalCount > 0 && collectedCount === totalCount\n const outstandingSigners = signers.filter(s => s.status !== 'done')\n\n // Whether going Back could still deliver edits to this envelope is the server's call -- it knows\n // every state DocuSign will refuse to correct. Only the copy below depends on it, so a stale or\n // failed answer simply withholds the guidance rather than blocking the step.\n const { data: isEnvelopeUpdatable } =\n useGetDataAccessRequestSignatureUpdatable(requestId, {\n enabled: Boolean(requestId) && !allCollected,\n })\n\n const { data: previewFileHandle } = useGetDataAccessRequestPreview(\n requestId,\n { enabled: Boolean(requestId) && !viewDucHrefOverride },\n )\n const viewDucHref =\n viewDucHrefOverride ??\n (previewFileHandle?.fileHandleId && requestId\n ? SynapseClient.getPortalFileHandleServletUrl(\n previewFileHandle.fileHandleId,\n requestId,\n FileHandleAssociateType.DataAccessRequestAttachment,\n )\n : undefined)\n\n const { data: signedFileHandle } = useGetDataAccessRequestSignedFileHandleId(\n requestId,\n { enabled: Boolean(requestId) && allCollected },\n )\n\n const [updateDarError, setUpdateDarError] = useState<string | undefined>()\n const [submitDarError, setSubmitDarError] = useState<string | undefined>()\n\n const { mutateAsync: updateDarAsync, isPending: isUpdating } =\n useUpdateDataAccessRequest({\n onError: e => setUpdateDarError(e.reason),\n })\n\n const { mutate: submit, isPending: isSubmitting } =\n useSubmitDataAccessRequest({\n onSuccess: submission => onSubmissionCreated(submission.submissionId),\n onError: e => setSubmitDarError(e.reason),\n })\n\n const isSubmitDisabled =\n isLoadingDar ||\n isLoadingStatus ||\n isRefetchingStatus ||\n !dataAccessRequest ||\n !allCollected ||\n !signedFileHandle?.fileHandleId ||\n isUpdating ||\n isSubmitting\n\n const handleSubmit = async () => {\n if (!dataAccessRequest || !signedFileHandle?.fileHandleId) return\n setUpdateDarError(undefined)\n setSubmitDarError(undefined)\n const updated = await updateDarAsync({\n ...dataAccessRequest,\n ducFileHandleId: signedFileHandle.fileHandleId,\n }).catch(() => null)\n if (!updated) return\n submit({\n request: {\n requestId: updated.id,\n requestEtag: updated.etag,\n subjectId,\n subjectType,\n },\n accessRequirementId: String(managedACTAccessRequirement.id),\n })\n }\n\n return (\n <>\n <DialogBaseTitle title={'Request Access'} onCancel={onHide} />\n <DialogContent>\n <Typography variant={'headline3'} sx={{ mb: 2 }}>\n Sign a Data Use Certificate (DUC)\n </Typography>\n <Typography variant={'body1'} sx={{ ...longFieldLabelSx, mb: 2 }}>\n Your DUC has been emailed to your Collaborators. Once all signatures\n (including the Signing Official) have been collected, you can submit\n the Data Access Request.\n </Typography>\n {/* Editing is only worth offering while signatures are still outstanding -- once every\n signer is done the user should simply submit. Withheld until both the status and the\n precheck resolve, so the copy neither appears and then vanishes nor promises that\n existing signatures carry over when the server has already ruled that out. */}\n {onBackClicked &&\n signatureStatus &&\n !allCollected &&\n isEnvelopeUpdatable && (\n <Typography variant={'body1'} sx={{ ...longFieldLabelSx, mb: 3 }}>\n You can update the list of Collaborators by pressing{' '}\n <strong>Back</strong>. Your changes will be applied to this\n signature request, so anyone who has already signed will not need\n to sign again.\n </Typography>\n )}\n\n {isLoadingStatus && (\n <Skeleton\n variant={'rectangular'}\n width={'100%'}\n height={120}\n data-testid={'SignatureStatusStep-loading'}\n />\n )}\n\n {statusError && (\n <Alert severity={'error'}>\n <strong>\n Sorry, we couldn't load the current signature status.\n </strong>\n <br />\n {statusError.reason}\n </Alert>\n )}\n\n {!isLoadingStatus && !statusError && signatureStatus && (\n <>\n <Stack\n direction={'row'}\n sx={{ alignItems: 'center', gap: 1, mb: 1 }}\n >\n {allCollected ? (\n <CheckCircleOutline color={'success'} />\n ) : (\n <HourglassEmpty sx={{ color: 'grey.700' }} />\n )}\n <Typography variant={'body1'} sx={{ fontWeight: 700 }}>\n {allCollected\n ? 'All signatures collected.'\n : `${collectedCount} out of ${totalCount} signatures collected.`}\n </Typography>\n <Box sx={{ flexGrow: 1 }} />\n {viewDucHref && (\n <Link\n href={viewDucHref}\n target={'_blank'}\n rel={'noopener'}\n sx={{\n display: 'inline-flex',\n alignItems: 'center',\n gap: 0.5,\n }}\n >\n View DUC\n <OpenInNew fontSize={'small'} />\n </Link>\n )}\n </Stack>\n\n {outstandingSigners.length > 0 && (\n <>\n <Typography variant={'body1'} sx={{ mb: 1 }}>\n You're still waiting for signatures from\n </Typography>\n <Box component={'ul'} sx={{ mt: 0, mb: 2, pl: 3 }}>\n {outstandingSigners.map((signer, index) => (\n <li key={signer.userId ?? `${signer.name}-${index}`}>\n <SignerLine signer={signer} />\n </li>\n ))}\n </Box>\n </>\n )}\n\n <Button\n variant={'outlined'}\n startIcon={<Refresh />}\n loading={isRefetchingStatus}\n onClick={() => {\n refetchStatus()\n }}\n >\n Refresh\n </Button>\n </>\n )}\n\n {updateDarError && (\n <Alert severity={'error'} sx={{ mt: 2 }}>\n <strong>Sorry, we couldn't save your change.</strong>\n <br />\n {updateDarError}\n </Alert>\n )}\n {submitDarError && (\n <Alert severity={'error'} sx={{ mt: 2 }}>\n <strong>Sorry, we couldn't submit your request.</strong>\n <br />\n {submitDarError}\n </Alert>\n )}\n </DialogContent>\n <DialogActions>\n {onBackClicked && (\n <Button variant={'outlined'} onClick={onBackClicked}>\n Back\n </Button>\n )}\n <Box sx={{ flexGrow: 1 }} />\n <Button\n variant={'contained'}\n disabled={isSubmitDisabled}\n loading={isSubmitting}\n onClick={() => {\n handleSubmit()\n }}\n >\n Submit\n </Button>\n </DialogActions>\n </>\n )\n}\n\n/**\n * Only surface non-pending problem states inline; pending is implied by the section header. A\n * decline carries a timestamp, which folds into the label so the row doesn't read \"(declined)\"\n * and then repeat itself underneath.\n */\nfunction getSignerStatusLabel(signer: EDucSignerStatus): string {\n if (\n !signer.status ||\n signer.status === EDucSignerStatusStatusEnum.pending ||\n signer.status === EDucSignerStatusStatusEnum.done\n ) {\n return ''\n }\n if (\n signer.status === EDucSignerStatusStatusEnum.declined &&\n signer.declinedOn\n ) {\n return ` (declined ${formatDate(dayjs(signer.declinedOn))})`\n }\n return ` (${signer.status})`\n}\n\nfunction SignerLine(props: { signer: EDucSignerStatus }) {\n const { signer } = props\n const displayName = signer.name ?? 'Unnamed signer'\n const nameNode = signer.userId ? (\n <Link\n href={`${PRODUCTION_ENDPOINT_CONFIG.PORTAL}Profile:${signer.userId}`}\n target={'_blank'}\n rel={'noopener'}\n >\n {displayName}\n </Link>\n ) : (\n <>{displayName}</>\n )\n return (\n <>\n <Typography variant={'body1'} component={'span'}>\n {nameNode}\n {getSignerStatusLabel(signer)}\n </Typography>\n {/* The reason is the signer's own words, so it is quoted rather than restated as UI copy. */}\n {signer.declinedReason && (\n <Typography\n variant={'body1'}\n component={'blockquote'}\n sx={declinedReasonSx}\n >\n {signer.declinedReason}\n </Typography>\n )}\n </>\n )\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"SignatureStatusStep.js","names":[],"sources":["../../../../../src/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/SignatureStatusStep/SignatureStatusStep.tsx"],"sourcesContent":["import {\n useGetDataAccessRequestForUpdate,\n useGetDataAccessRequestPreview,\n useGetDataAccessRequestSignatureStatus,\n useGetDataAccessRequestSignatureUpdatable,\n useGetDataAccessRequestSignedFileHandleId,\n useSubmitDataAccessRequest,\n useUpdateDataAccessRequest,\n} from '@/synapse-queries'\nimport SynapseClient from '@/synapse-client'\nimport { formatDate } from '@/utils/functions/DateFormatter'\nimport { PRODUCTION_ENDPOINT_CONFIG } from '@/utils/functions/getEndpoint'\nimport CheckCircleOutline from '@mui/icons-material/CheckCircleOutline'\nimport HourglassEmpty from '@mui/icons-material/HourglassEmpty'\nimport OpenInNew from '@mui/icons-material/OpenInNew'\nimport Refresh from '@mui/icons-material/Refresh'\nimport {\n Alert,\n Box,\n Button,\n DialogActions,\n DialogContent,\n Link,\n Skeleton,\n Stack,\n SxProps,\n Typography,\n} from '@mui/material'\nimport {\n EDucSignerStatus,\n EDucSignerStatusStatusEnum,\n} from '@sage-bionetworks/synapse-client'\nimport {\n FileHandleAssociateType,\n RestrictableObjectType,\n} from '@sage-bionetworks/synapse-types'\nimport dayjs from 'dayjs'\nimport { useState } from 'react'\nimport { DialogBaseTitle } from '../../../DialogBase'\nimport { longFieldLabelSx } from '../styles'\nimport { RequestFlowAccessRequirement } from '../requestFlowTypes'\n\n/** Browser defaults indent a blockquote far too much for a nested list item. */\nconst declinedReasonSx: SxProps = {\n mx: 0,\n my: 0.5,\n pl: 1.5,\n borderLeft: '3px solid',\n borderColor: 'grey.300',\n color: 'grey.700',\n}\n\nexport type SignatureStatusStepProps = {\n managedACTAccessRequirement: RequestFlowAccessRequirement\n subjectId: string\n subjectType: RestrictableObjectType\n onHide: () => void\n /**\n * Called when the user clicks the Back button. When omitted, the Back button is hidden —\n * used when the step is reached via direct entry (e.g. a deep-link route) rather than\n * through the wizard flow, so there is no meaningful previous step to return to.\n */\n onBackClicked?: () => void\n onSubmissionCreated: (submissionId: string) => void\n /**\n * Optional href override for the \"View DUC\" link. When set, the preview file handle fetch\n * is skipped and this URL is used directly. Used by stories and tests where the portal\n * servlet is not available.\n */\n viewDucHrefOverride?: string\n}\n\n/**\n * Wizard step shown after the user has routed the eDUC for electronic signature\n * (PORTALS-4380). Polls the DocuSign envelope status, lists the pending signers,\n * and enables submission once every signer has signed.\n */\nexport default function SignatureStatusStep(props: SignatureStatusStepProps) {\n const {\n managedACTAccessRequirement,\n subjectId,\n subjectType,\n onHide,\n onBackClicked,\n onSubmissionCreated,\n viewDucHrefOverride,\n } = props\n\n const { data: dataAccessRequest, isLoading: isLoadingDar } =\n useGetDataAccessRequestForUpdate(String(managedACTAccessRequirement.id), {\n staleTime: Infinity,\n throwOnError: true,\n })\n\n const requestId = dataAccessRequest?.id ?? ''\n\n const {\n data: signatureStatus,\n isLoading: isLoadingStatus,\n isRefetching: isRefetchingStatus,\n error: statusError,\n refetch: refetchStatus,\n } = useGetDataAccessRequestSignatureStatus(requestId, {\n enabled: Boolean(requestId),\n })\n\n const signers: EDucSignerStatus[] = signatureStatus?.signerStatus ?? []\n const collectedCount = signers.filter(s => s.status === 'done').length\n const totalCount = signers.length\n const allCollected = totalCount > 0 && collectedCount === totalCount\n const outstandingSigners = signers.filter(s => s.status !== 'done')\n\n // Whether going Back could still deliver edits to this envelope is the server's call -- it knows\n // every state DocuSign will refuse to correct. Only the copy below depends on it, so a stale or\n // failed answer simply withholds the guidance rather than blocking the step.\n const { data: isEnvelopeUpdatable } =\n useGetDataAccessRequestSignatureUpdatable(requestId, {\n enabled: Boolean(requestId) && !allCollected,\n })\n\n const { data: previewFileHandle } = useGetDataAccessRequestPreview(\n requestId,\n { enabled: Boolean(requestId) && !viewDucHrefOverride },\n )\n const viewDucHref =\n viewDucHrefOverride ??\n (previewFileHandle?.fileHandleId && requestId\n ? SynapseClient.getPortalFileHandleServletUrl(\n previewFileHandle.fileHandleId,\n requestId,\n FileHandleAssociateType.DataAccessRequestAttachment,\n )\n : undefined)\n\n const { data: signedFileHandle } = useGetDataAccessRequestSignedFileHandleId(\n requestId,\n { enabled: Boolean(requestId) && allCollected },\n )\n\n const [updateDarError, setUpdateDarError] = useState<string | undefined>()\n const [submitDarError, setSubmitDarError] = useState<string | undefined>()\n\n const { mutateAsync: updateDarAsync, isPending: isUpdating } =\n useUpdateDataAccessRequest({\n onError: e => setUpdateDarError(e.reason),\n })\n\n const { mutate: submit, isPending: isSubmitting } =\n useSubmitDataAccessRequest({\n onSuccess: submission => onSubmissionCreated(submission.submissionId),\n onError: e => setSubmitDarError(e.reason),\n })\n\n const isSubmitDisabled =\n isLoadingDar ||\n isLoadingStatus ||\n isRefetchingStatus ||\n !dataAccessRequest ||\n !allCollected ||\n !signedFileHandle?.fileHandleId ||\n isUpdating ||\n isSubmitting\n\n const handleSubmit = async () => {\n if (!dataAccessRequest || !signedFileHandle?.fileHandleId) return\n setUpdateDarError(undefined)\n setSubmitDarError(undefined)\n const updated = await updateDarAsync({\n ...dataAccessRequest,\n ducFileHandleId: signedFileHandle.fileHandleId,\n }).catch(() => null)\n if (!updated) return\n submit({\n request: {\n requestId: updated.id,\n requestEtag: updated.etag,\n subjectId,\n subjectType,\n },\n accessRequirementId: String(managedACTAccessRequirement.id),\n })\n }\n\n return (\n <>\n <DialogBaseTitle title={'Request Access'} onCancel={onHide} />\n <DialogContent>\n <Typography variant={'headline3'} sx={{ mb: 2 }}>\n Sign a Data Use Certificate (DUC)\n </Typography>\n <Typography variant={'body1'} sx={{ ...longFieldLabelSx, mb: 2 }}>\n Your DUC has been emailed to your Collaborators. Once all signatures\n (including the Signing Official) have been collected, you can submit\n the Data Access Request.\n </Typography>\n {/* Editing is only worth offering while signatures are still outstanding -- once every\n signer is done the user should simply submit. Withheld until both the status and the\n precheck resolve, so the copy neither appears and then vanishes nor promises that\n existing signatures carry over when the server has already ruled that out. */}\n {onBackClicked &&\n signatureStatus &&\n !allCollected &&\n isEnvelopeUpdatable && (\n <Typography variant={'body1'} sx={{ ...longFieldLabelSx, mb: 3 }}>\n You can update the list of Collaborators by pressing{' '}\n <strong>Back</strong>. Your changes will be applied to this\n signature request, so anyone who has already signed will not need\n to sign again.\n </Typography>\n )}\n\n {isLoadingStatus && (\n <Skeleton\n variant={'rectangular'}\n width={'100%'}\n height={120}\n data-testid={'SignatureStatusStep-loading'}\n />\n )}\n\n {statusError && (\n <Alert severity={'error'}>\n <strong>\n Sorry, we couldn't load the current signature status.\n </strong>\n <br />\n {statusError.reason}\n </Alert>\n )}\n\n {!isLoadingStatus && !statusError && signatureStatus && (\n <>\n <Stack\n direction={'row'}\n sx={{ alignItems: 'center', gap: 1, mb: 1 }}\n >\n {allCollected ? (\n <CheckCircleOutline color={'success'} />\n ) : (\n <HourglassEmpty sx={{ color: 'grey.700' }} />\n )}\n <Typography variant={'body1'} sx={{ fontWeight: 700 }}>\n {allCollected\n ? 'All signatures collected.'\n : `${collectedCount} out of ${totalCount} signatures collected.`}\n </Typography>\n <Box sx={{ flexGrow: 1 }} />\n {viewDucHref && (\n <Link\n href={viewDucHref}\n target={'_blank'}\n rel={'noopener'}\n sx={{\n display: 'inline-flex',\n alignItems: 'center',\n gap: 0.5,\n }}\n >\n View DUC\n <OpenInNew fontSize={'small'} />\n </Link>\n )}\n </Stack>\n\n {outstandingSigners.length > 0 && (\n <>\n <Typography variant={'body1'} sx={{ mb: 1 }}>\n You're still waiting for signatures from\n </Typography>\n <Box component={'ul'} sx={{ mt: 0, mb: 2, pl: 3 }}>\n {outstandingSigners.map((signer, index) => (\n <li key={signer.userId ?? `${signer.name}-${index}`}>\n <SignerLine signer={signer} />\n </li>\n ))}\n </Box>\n </>\n )}\n\n <Button\n variant={'outlined'}\n startIcon={<Refresh />}\n loading={isRefetchingStatus}\n onClick={() => {\n refetchStatus()\n }}\n >\n Refresh\n </Button>\n </>\n )}\n\n {updateDarError && (\n <Alert severity={'error'} sx={{ mt: 2 }}>\n <strong>Sorry, we couldn't save your change.</strong>\n <br />\n {updateDarError}\n </Alert>\n )}\n {submitDarError && (\n <Alert severity={'error'} sx={{ mt: 2 }}>\n <strong>Sorry, we couldn't submit your request.</strong>\n <br />\n {submitDarError}\n </Alert>\n )}\n </DialogContent>\n <DialogActions>\n {onBackClicked && (\n <Button variant={'outlined'} onClick={onBackClicked}>\n Back\n </Button>\n )}\n <Box sx={{ flexGrow: 1 }} />\n <Button\n variant={'contained'}\n disabled={isSubmitDisabled}\n loading={isSubmitting}\n onClick={() => {\n handleSubmit()\n }}\n >\n Submit\n </Button>\n </DialogActions>\n </>\n )\n}\n\n/**\n * Only surface non-pending problem states inline; pending is implied by the section header. A\n * decline carries a timestamp, which folds into the label so the row doesn't read \"(declined)\"\n * and then repeat itself underneath.\n */\nfunction getSignerStatusLabel(signer: EDucSignerStatus): string {\n if (\n !signer.status ||\n signer.status === EDucSignerStatusStatusEnum.pending ||\n signer.status === EDucSignerStatusStatusEnum.done\n ) {\n return ''\n }\n if (\n signer.status === EDucSignerStatusStatusEnum.declined &&\n signer.declinedOn\n ) {\n return ` (declined ${formatDate(dayjs(signer.declinedOn))})`\n }\n return ` (${signer.status})`\n}\n\nfunction SignerLine(props: { signer: EDucSignerStatus }) {\n const { signer } = props\n const displayName = signer.name ?? 'Unnamed signer'\n const nameNode = signer.userId ? (\n <Link\n href={`${PRODUCTION_ENDPOINT_CONFIG.PORTAL}Profile:${signer.userId}`}\n target={'_blank'}\n rel={'noopener'}\n >\n {displayName}\n </Link>\n ) : (\n <>{displayName}</>\n )\n return (\n <>\n <Typography variant={'body1'} component={'span'}>\n {nameNode}\n {getSignerStatusLabel(signer)}\n </Typography>\n {/* The reason is the signer's own words, so it is quoted rather than restated as UI copy. */}\n {signer.declinedReason && (\n <Typography\n variant={'body1'}\n component={'blockquote'}\n sx={declinedReasonSx}\n >\n {signer.declinedReason}\n </Typography>\n )}\n </>\n )\n}\n"],"mappings":"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"}
|
|
@@ -6,7 +6,7 @@ import { CreateAccessTokenModal as a } from "./CreateAccessTokenModal.js";
|
|
|
6
6
|
import { useState as o } from "react";
|
|
7
7
|
import { Box as s, Button as c, Typography as l } from "@mui/material";
|
|
8
8
|
import { jsx as u, jsxs as d } from "react/jsx-runtime";
|
|
9
|
-
import
|
|
9
|
+
import f from "@mui/icons-material/AddCircleTwoTone";
|
|
10
10
|
//#region src/components/AccessTokenPage/AccessTokenPage.tsx
|
|
11
11
|
function p({ title: p, body: m }) {
|
|
12
12
|
let [h, g] = o(!1), { data: _, isLoading: v, error: y, fetchNextPage: b, hasNextPage: x } = r(), S = _?.pages.flatMap((e) => e.results) ?? [];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AccessTokenPage.js","names":[],"sources":["../../../src/components/AccessTokenPage/AccessTokenPage.tsx"],"sourcesContent":["import { useGetPersonalAccessTokensInfinite } from '@/synapse-queries/user/usePersonalAccessToken'\nimport
|
|
1
|
+
{"version":3,"file":"AccessTokenPage.js","names":[],"sources":["../../../src/components/AccessTokenPage/AccessTokenPage.tsx"],"sourcesContent":["import { useGetPersonalAccessTokensInfinite } from '@/synapse-queries/user/usePersonalAccessToken'\nimport AddCircleTwoTone from '@mui/icons-material/AddCircleTwoTone'\nimport { Box, Button, Typography } from '@mui/material'\nimport { ReactNode, useState } from 'react'\nimport { ErrorBanner, SynapseErrorBoundary } from '../error/ErrorBanner'\nimport loadingScreen from '../LoadingScreen/LoadingScreen'\nimport { AccessTokenCard } from './AccessTokenCard/AccessTokenCard'\nimport { CreateAccessTokenModal } from './CreateAccessTokenModal'\n\nexport type AccessTokenPageProps = {\n title: string\n body: ReactNode\n}\n\nexport function AccessTokenPage({ title, body }: AccessTokenPageProps) {\n const [showCreateTokenModal, setShowCreateTokenModal] = useState(false)\n\n const {\n data: infiniteData,\n isLoading,\n error,\n fetchNextPage,\n hasNextPage,\n } = useGetPersonalAccessTokensInfinite()\n\n const tokenRecords = infiniteData?.pages.flatMap(page => page.results) ?? []\n\n return (\n <div>\n <Box\n sx={{\n display: 'flex',\n gap: 2,\n justifyContent: 'space-between',\n flexDirection: { xs: 'column', md: 'row' },\n }}\n >\n <Box\n sx={{\n flexGrow: 1,\n }}\n >\n <h1>{title}</h1>\n {body}\n </Box>\n <Box\n sx={theme => ({\n flexShrink: 0,\n alignSelf: 'end',\n [theme.breakpoints.down('md')]: { width: '100%' },\n })}\n >\n <Button\n sx={theme => ({\n [theme.breakpoints.down('md')]: { width: '100%' },\n })}\n variant=\"contained\"\n color=\"primary\"\n onClick={() => setShowCreateTokenModal(true)}\n startIcon={<AddCircleTwoTone />}\n >\n Create New Token\n </Button>\n </Box>\n </Box>\n <SynapseErrorBoundary>\n {showCreateTokenModal && (\n <CreateAccessTokenModal\n onClose={() => setShowCreateTokenModal(false)}\n />\n )}\n\n <div>\n {!isLoading && !error && tokenRecords.length === 0 && (\n <Typography\n variant={'headline2'}\n sx={{\n m: 5,\n textAlign: 'center',\n }}\n >\n You currently have no personal access tokens.\n </Typography>\n )}\n <Box\n sx={{\n maxWidth: '800px',\n mx: 'auto',\n my: 2.5,\n }}\n >\n {tokenRecords.map(accessToken => {\n return (\n <AccessTokenCard\n key={accessToken.id}\n accessToken={accessToken}\n />\n )\n })}\n {isLoading && loadingScreen}\n {!isLoading && hasNextPage && !error && (\n <Box\n sx={{\n display: 'flex',\n justifyContent: 'flex-end',\n }}\n >\n <Button\n variant=\"contained\"\n color=\"primary\"\n onClick={() => {\n fetchNextPage()\n }}\n >\n Load More\n </Button>\n </Box>\n )}\n </Box>\n {error && <ErrorBanner error={error}></ErrorBanner>}\n </div>\n </SynapseErrorBoundary>\n </div>\n )\n}\n"],"mappings":";;;;;;;;;;AAcA,SAAgB,EAAgB,EAAE,UAAO,WAA8B;CACrE,IAAM,CAAC,GAAsB,KAA2B,EAAS,EAAK,GAEhE,EACJ,MAAM,GACN,cACA,UACA,kBACA,mBACE,EAAmC,GAEjC,IAAe,GAAc,MAAM,SAAQ,MAAQ,EAAK,OAAO,KAAK,CAAC;CAE3E,OACE,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,GAAD;EACE,IAAI;GACF,SAAS;GACT,KAAK;GACL,gBAAgB;GAChB,eAAe;IAAE,IAAI;IAAU,IAAI;GAAM;EAC3C;YANF,CAQE,kBAAC,GAAD;GACE,IAAI,EACF,UAAU,EACZ;aAHF,CAKE,kBAAC,MAAD,EAAA,UAAK,EAAU,CAAA,GACd,CACE;MACL,kBAAC,GAAD;GACE,KAAI,OAAU;IACZ,YAAY;IACZ,WAAW;KACV,EAAM,YAAY,KAAK,IAAI,IAAI,EAAE,OAAO,OAAO;GAClD;aAEA,kBAAC,GAAD;IACE,KAAI,OAAU,GACX,EAAM,YAAY,KAAK,IAAI,IAAI,EAAE,OAAO,OAAO,EAClD;IACA,SAAQ;IACR,OAAM;IACN,eAAe,EAAwB,EAAI;IAC3C,WAAW,kBAAC,GAAD,CAAmB,CAAA;cAC/B;GAEO,CAAA;EACL,CAAA,CACF;KACL,kBAAC,GAAD,EAAA,UAAA,CACG,KACC,kBAAC,GAAD,EACE,eAAe,EAAwB,EAAK,EAC7C,CAAA,GAGH,kBAAC,OAAD,EAAA,UAAA;EACG,CAAC,KAAa,CAAC,KAAS,EAAa,WAAW,KAC/C,kBAAC,GAAD;GACE,SAAS;GACT,IAAI;IACF,GAAG;IACH,WAAW;GACb;aACD;EAEW,CAAA;EAEd,kBAAC,GAAD;GACE,IAAI;IACF,UAAU;IACV,IAAI;IACJ,IAAI;GACN;aALF;IAOG,EAAa,KAAI,MAEd,kBAAC,GAAD,EAEe,eACd,GAFM,EAAY,EAElB,CAEJ;IACA,KAAa;IACb,CAAC,KAAa,KAAe,CAAC,KAC7B,kBAAC,GAAD;KACE,IAAI;MACF,SAAS;MACT,gBAAgB;KAClB;eAEA,kBAAC,GAAD;MACE,SAAQ;MACR,OAAM;MACN,eAAe;OACb,EAAc;MAChB;gBACD;KAEO,CAAA;IACL,CAAA;GAEJ;;EACJ,KAAS,kBAAC,GAAD,EAAoB,SAAoB,CAAA;CAC/C,EAAA,CAAA,CACe,EAAA,CAAA,CACnB,EAAA,CAAA;AAET"}
|
|
@@ -6,7 +6,7 @@ import { StudyAcknowledgements as i } from "./StudyAcknowledgements.js";
|
|
|
6
6
|
import { useCallback as a, useState as o } from "react";
|
|
7
7
|
import { Box as s, Button as c, Container as l, Link as u, Typography as d } from "@mui/material";
|
|
8
8
|
import { Fragment as f, jsx as p, jsxs as m } from "react/jsx-runtime";
|
|
9
|
-
import
|
|
9
|
+
import h from "@mui/icons-material/LaunchTwoTone";
|
|
10
10
|
//#region src/components/AcknowledgementsPage/AcknowledgementsPage.tsx
|
|
11
11
|
function g(g) {
|
|
12
12
|
let { portalName: _, createDoiHelpUrl: v, portalAcknowledgementProps: y, dataAvailabilityProps: b, studyAcknowledgementSql: x } = g, [S, C] = o(!1), [w, T] = o(), [E, D] = o(), [O, k] = o([]), A = a(() => C(!1), []);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AcknowledgementsPage.js","names":[],"sources":["../../../src/components/AcknowledgementsPage/AcknowledgementsPage.tsx"],"sourcesContent":["import { Box, Button, Container, Link, Typography } from '@mui/material'\nimport { useCallback, useState } from 'react'\nimport { ReactComponent as AcknowledgementStatementsIllustration } from '../../assets/illustrations/acknowledgement_statements_illustration.svg'\nimport TextToComponentCollapse from '../TextToComponentCollapse'\nimport AcknowledgementsDialog from './AcknowledgementsDialog'\nimport { MarkdownSynapseProps } from '../Markdown/MarkdownSynapse'\nimport MarkdownCollapse from '../Markdown/MarkdownCollapse'\nimport { StudyAcknowledgements } from './StudyAcknowledgements'\nimport { LaunchTwoTone } from '@mui/icons-material'\nexport type AcknowledgementPageProps = {\n portalName: string\n createDoiHelpUrl: string\n portalAcknowledgementProps?: MarkdownSynapseProps\n dataAvailabilityProps?: MarkdownSynapseProps\n studyAcknowledgementSql: string\n}\n\nexport type AcknowledgementItem = {\n title: string\n statement: string\n}\n\nexport function AcknowledgementPage(props: AcknowledgementPageProps) {\n const {\n portalName,\n createDoiHelpUrl,\n portalAcknowledgementProps,\n dataAvailabilityProps,\n studyAcknowledgementSql,\n } = props\n const [isAcknowledgementsDialogOpen, setAcknowledgementsDialogOpen] =\n useState<boolean>(false)\n\n const [portalAcknowledgement, setPortalAcknowledgement] = useState<string>()\n const [dataAvailabilityStatement, setDataAvailabilityStatement] =\n useState<string>()\n const [acknowledgementItems, setAcknowledgementItems] = useState<\n AcknowledgementItem[]\n >([])\n const handleCloseDialog = useCallback(\n () => setAcknowledgementsDialogOpen(false),\n [],\n )\n return (\n <>\n <Container maxWidth={'lg'} sx={{ mt: '2em', mb: '2em' }}>\n <Typography variant=\"h5\" sx={{ fontWeight: 'bold' }}>\n How to acknowledge data from this portal\n </Typography>\n <hr />\n <Typography variant=\"body1\" sx={{ mb: '1em' }}>\n The data available in the {portalName} would not be possible without\n the participation of research volunteers and the contribution of data\n by collaborating researchers. All use of data from the {portalName}{' '}\n must be acknowledged and referenced appropriately.\n </Typography>\n <Typography variant=\"body1\" sx={{ fontWeight: 'bold', mb: '1em' }}>\n All publications using {portalName} data must include the provided\n statements:\n </Typography>\n <Box sx={{ mb: '2em', svg: { maxWidth: '100%' } }}>\n <AcknowledgementStatementsIllustration />\n </Box>\n <Typography variant=\"h5\" sx={{ fontWeight: 'bold' }}>\n How to use this page:\n </Typography>\n <hr />\n <Typography variant=\"body1\" sx={{ mb: '.5em' }}>\n This page will guide you through creating the acknowledgement\n statements required when publishing with {portalName} data.\n </Typography>\n <Typography\n variant=\"body1\"\n component={'div'}\n sx={{\n mb: '2em',\n '& li::marker': {\n fontWeight: 'bold', // bold the number\n },\n }}\n >\n <ol>\n <li>\n <strong>Select study acknowledgement statements</strong>\n <br />\n From the list below, select all the studies whose data you used.\n Each study has a pre-written acknowledgement statement that must\n be included in your publication.\n </li>\n <li>\n <strong>Generate compiled statement</strong>\n <br />\n Click the Generate Compiled Statement button at the bottom of the\n page. This will compile:\n <ul>\n <li>The Portal Acknowledgement Statement</li>\n <li>The acknowledgement(s) for the studies you selected</li>\n <li>A template data availability statement</li>\n </ul>\n <i>\n Important: You will need to edit the compiled statement to add a\n brief description of the data used in your manuscript and a DOI\n that points to your dataset.\n </i>\n </li>\n <li>\n <strong>Create a DOI for your dataset</strong>\n <br />\n As part of the data availability statement, you will need to\n create a dataset that captures all files used in your publication\n and mint the dataset with a persistent Digital Object Identifier\n (DOI). For more instructions read \n <Link\n href={createDoiHelpUrl}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n How to get a DOI for your Publication\n </Link>\n </li>\n </ol>\n </Typography>\n <Typography component={'div'} variant=\"h5\" sx={{ fontWeight: 'bold' }}>\n <ol start={1} style={{ paddingInlineStart: '20px' }}>\n <li>Select study acknowledgement statements</li>\n </ol>\n </Typography>\n <hr />\n <Typography variant=\"body1\">\n From the list below, select all studies whose data you used. Each\n study has a pre-written acknowledgement statement that must be\n included in your publication.\n </Typography>\n <Typography variant=\"body1\" sx={{ mb: '2em' }}>\n You can also expand each section for detailed information or click\n \"Copy full statement to clipboard\" to save the text.\n </Typography>\n <StudyAcknowledgements\n sql={studyAcknowledgementSql}\n onSelectChange={(item, checked) => {\n if (checked) {\n // add\n acknowledgementItems.push(item)\n } else {\n // remove\n const index = acknowledgementItems.findIndex(\n i => i.title === item.title && i.statement === item.statement,\n )\n if (index > -1) {\n acknowledgementItems.splice(index, 1)\n }\n }\n setAcknowledgementItems([...acknowledgementItems])\n }}\n />\n <Typography variant=\"h5\" component={'div'} sx={{ fontWeight: 'bold' }}>\n <ol start={2} style={{ paddingInlineStart: '25px' }}>\n <li>Generate compiled statement</li>\n </ol>\n </Typography>\n <hr />\n <Typography variant=\"body1\" sx={{ fontWeight: 'bold', mb: '1em' }}>\n Click to generate a compiled statement for your publication.\n </Typography>\n <Typography variant=\"body1\" sx={{ mb: '1em' }}>\n The generated text will include your selected study acknowledgement\n statements and all other required statements listed below.\n </Typography>\n <Button\n variant=\"contained\"\n onClick={() => setAcknowledgementsDialogOpen(true)}\n sx={{ mb: '3em' }}\n >\n Generate compiled statement\n </Button>\n <TextToComponentCollapse\n text={'Click to see other text included in the compiled statement'}\n textVariant=\"h5\"\n textSx={{ fontSize: '16px', fontWeight: 'bold' }}\n textContainerSx={{ backgroundColor: 'unset', p: 0 }}\n collapseBoxSx={{ backgroundColor: 'unset', p: '20px 0px' }}\n iconSx={{ width: '20px', height: '20px' }}\n >\n {portalAcknowledgementProps && (\n <>\n <Typography variant=\"h5\" sx={{ fontSize: '18px', mb: '1em' }}>\n Portal Acknowledgement Statement (Required)\n </Typography>\n <Typography variant=\"body1\" sx={{ mb: '1em' }}>\n This statement is required and automatically included in the\n compiled statement\n </Typography>\n <MarkdownCollapse\n {...portalAcknowledgementProps}\n setPlainTextResult={setPortalAcknowledgement}\n textDescription=\"full statement\"\n showCopyPlainText={true}\n />\n </>\n )}\n {dataAvailabilityProps && (\n <>\n <Typography variant=\"h5\" sx={{ fontSize: '18px', m: '1em 0' }}>\n Data Availability Statement (Required)\n </Typography>\n <Typography variant=\"body1\" sx={{ mb: '1em' }}>\n This statement is required and automatically included in the\n compiled statement\n </Typography>\n <MarkdownCollapse\n {...dataAvailabilityProps}\n setPlainTextResult={setDataAvailabilityStatement}\n textDescription=\"full statement\"\n showCopyPlainText={true}\n />\n </>\n )}\n </TextToComponentCollapse>\n <hr />\n <Typography variant=\"h5\" component={'div'} sx={{ fontWeight: 'bold' }}>\n <ol start={3} style={{ paddingInlineStart: '25px' }}>\n <li>Create a DOI for your dataset</li>\n </ol>\n </Typography>\n <hr />\n <Typography variant=\"body1\" sx={{ mb: '1em' }}>\n A digital object identifier (DOI) provides a persistent identifier\n that allows readers to find the data cited in your publication.\n Creating a DOI in the Synapse platform is free and required as part of\n the data availability statement.\n </Typography>\n\n <Button\n variant=\"outlined\"\n href={createDoiHelpUrl}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n <LaunchTwoTone sx={{ mr: '0.5em' }} />\n Learn how to get a DOI for your publication\n </Button>\n </Container>\n\n <AcknowledgementsDialog\n open={isAcknowledgementsDialogOpen}\n onClose={handleCloseDialog}\n createDoiHelpUrl={createDoiHelpUrl}\n portalAcknowledgement={portalAcknowledgement}\n dataAvailabilityStatement={dataAvailabilityStatement}\n studyAcknowledgements={acknowledgementItems}\n />\n </>\n )\n}\n\nexport default AcknowledgementPage\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"AcknowledgementsPage.js","names":[],"sources":["../../../src/components/AcknowledgementsPage/AcknowledgementsPage.tsx"],"sourcesContent":["import { Box, Button, Container, Link, Typography } from '@mui/material'\nimport { useCallback, useState } from 'react'\nimport { ReactComponent as AcknowledgementStatementsIllustration } from '../../assets/illustrations/acknowledgement_statements_illustration.svg'\nimport TextToComponentCollapse from '../TextToComponentCollapse'\nimport AcknowledgementsDialog from './AcknowledgementsDialog'\nimport { MarkdownSynapseProps } from '../Markdown/MarkdownSynapse'\nimport MarkdownCollapse from '../Markdown/MarkdownCollapse'\nimport { StudyAcknowledgements } from './StudyAcknowledgements'\nimport LaunchTwoTone from '@mui/icons-material/LaunchTwoTone'\nexport type AcknowledgementPageProps = {\n portalName: string\n createDoiHelpUrl: string\n portalAcknowledgementProps?: MarkdownSynapseProps\n dataAvailabilityProps?: MarkdownSynapseProps\n studyAcknowledgementSql: string\n}\n\nexport type AcknowledgementItem = {\n title: string\n statement: string\n}\n\nexport function AcknowledgementPage(props: AcknowledgementPageProps) {\n const {\n portalName,\n createDoiHelpUrl,\n portalAcknowledgementProps,\n dataAvailabilityProps,\n studyAcknowledgementSql,\n } = props\n const [isAcknowledgementsDialogOpen, setAcknowledgementsDialogOpen] =\n useState<boolean>(false)\n\n const [portalAcknowledgement, setPortalAcknowledgement] = useState<string>()\n const [dataAvailabilityStatement, setDataAvailabilityStatement] =\n useState<string>()\n const [acknowledgementItems, setAcknowledgementItems] = useState<\n AcknowledgementItem[]\n >([])\n const handleCloseDialog = useCallback(\n () => setAcknowledgementsDialogOpen(false),\n [],\n )\n return (\n <>\n <Container maxWidth={'lg'} sx={{ mt: '2em', mb: '2em' }}>\n <Typography variant=\"h5\" sx={{ fontWeight: 'bold' }}>\n How to acknowledge data from this portal\n </Typography>\n <hr />\n <Typography variant=\"body1\" sx={{ mb: '1em' }}>\n The data available in the {portalName} would not be possible without\n the participation of research volunteers and the contribution of data\n by collaborating researchers. All use of data from the {portalName}{' '}\n must be acknowledged and referenced appropriately.\n </Typography>\n <Typography variant=\"body1\" sx={{ fontWeight: 'bold', mb: '1em' }}>\n All publications using {portalName} data must include the provided\n statements:\n </Typography>\n <Box sx={{ mb: '2em', svg: { maxWidth: '100%' } }}>\n <AcknowledgementStatementsIllustration />\n </Box>\n <Typography variant=\"h5\" sx={{ fontWeight: 'bold' }}>\n How to use this page:\n </Typography>\n <hr />\n <Typography variant=\"body1\" sx={{ mb: '.5em' }}>\n This page will guide you through creating the acknowledgement\n statements required when publishing with {portalName} data.\n </Typography>\n <Typography\n variant=\"body1\"\n component={'div'}\n sx={{\n mb: '2em',\n '& li::marker': {\n fontWeight: 'bold', // bold the number\n },\n }}\n >\n <ol>\n <li>\n <strong>Select study acknowledgement statements</strong>\n <br />\n From the list below, select all the studies whose data you used.\n Each study has a pre-written acknowledgement statement that must\n be included in your publication.\n </li>\n <li>\n <strong>Generate compiled statement</strong>\n <br />\n Click the Generate Compiled Statement button at the bottom of the\n page. This will compile:\n <ul>\n <li>The Portal Acknowledgement Statement</li>\n <li>The acknowledgement(s) for the studies you selected</li>\n <li>A template data availability statement</li>\n </ul>\n <i>\n Important: You will need to edit the compiled statement to add a\n brief description of the data used in your manuscript and a DOI\n that points to your dataset.\n </i>\n </li>\n <li>\n <strong>Create a DOI for your dataset</strong>\n <br />\n As part of the data availability statement, you will need to\n create a dataset that captures all files used in your publication\n and mint the dataset with a persistent Digital Object Identifier\n (DOI). For more instructions read \n <Link\n href={createDoiHelpUrl}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n How to get a DOI for your Publication\n </Link>\n </li>\n </ol>\n </Typography>\n <Typography component={'div'} variant=\"h5\" sx={{ fontWeight: 'bold' }}>\n <ol start={1} style={{ paddingInlineStart: '20px' }}>\n <li>Select study acknowledgement statements</li>\n </ol>\n </Typography>\n <hr />\n <Typography variant=\"body1\">\n From the list below, select all studies whose data you used. Each\n study has a pre-written acknowledgement statement that must be\n included in your publication.\n </Typography>\n <Typography variant=\"body1\" sx={{ mb: '2em' }}>\n You can also expand each section for detailed information or click\n \"Copy full statement to clipboard\" to save the text.\n </Typography>\n <StudyAcknowledgements\n sql={studyAcknowledgementSql}\n onSelectChange={(item, checked) => {\n if (checked) {\n // add\n acknowledgementItems.push(item)\n } else {\n // remove\n const index = acknowledgementItems.findIndex(\n i => i.title === item.title && i.statement === item.statement,\n )\n if (index > -1) {\n acknowledgementItems.splice(index, 1)\n }\n }\n setAcknowledgementItems([...acknowledgementItems])\n }}\n />\n <Typography variant=\"h5\" component={'div'} sx={{ fontWeight: 'bold' }}>\n <ol start={2} style={{ paddingInlineStart: '25px' }}>\n <li>Generate compiled statement</li>\n </ol>\n </Typography>\n <hr />\n <Typography variant=\"body1\" sx={{ fontWeight: 'bold', mb: '1em' }}>\n Click to generate a compiled statement for your publication.\n </Typography>\n <Typography variant=\"body1\" sx={{ mb: '1em' }}>\n The generated text will include your selected study acknowledgement\n statements and all other required statements listed below.\n </Typography>\n <Button\n variant=\"contained\"\n onClick={() => setAcknowledgementsDialogOpen(true)}\n sx={{ mb: '3em' }}\n >\n Generate compiled statement\n </Button>\n <TextToComponentCollapse\n text={'Click to see other text included in the compiled statement'}\n textVariant=\"h5\"\n textSx={{ fontSize: '16px', fontWeight: 'bold' }}\n textContainerSx={{ backgroundColor: 'unset', p: 0 }}\n collapseBoxSx={{ backgroundColor: 'unset', p: '20px 0px' }}\n iconSx={{ width: '20px', height: '20px' }}\n >\n {portalAcknowledgementProps && (\n <>\n <Typography variant=\"h5\" sx={{ fontSize: '18px', mb: '1em' }}>\n Portal Acknowledgement Statement (Required)\n </Typography>\n <Typography variant=\"body1\" sx={{ mb: '1em' }}>\n This statement is required and automatically included in the\n compiled statement\n </Typography>\n <MarkdownCollapse\n {...portalAcknowledgementProps}\n setPlainTextResult={setPortalAcknowledgement}\n textDescription=\"full statement\"\n showCopyPlainText={true}\n />\n </>\n )}\n {dataAvailabilityProps && (\n <>\n <Typography variant=\"h5\" sx={{ fontSize: '18px', m: '1em 0' }}>\n Data Availability Statement (Required)\n </Typography>\n <Typography variant=\"body1\" sx={{ mb: '1em' }}>\n This statement is required and automatically included in the\n compiled statement\n </Typography>\n <MarkdownCollapse\n {...dataAvailabilityProps}\n setPlainTextResult={setDataAvailabilityStatement}\n textDescription=\"full statement\"\n showCopyPlainText={true}\n />\n </>\n )}\n </TextToComponentCollapse>\n <hr />\n <Typography variant=\"h5\" component={'div'} sx={{ fontWeight: 'bold' }}>\n <ol start={3} style={{ paddingInlineStart: '25px' }}>\n <li>Create a DOI for your dataset</li>\n </ol>\n </Typography>\n <hr />\n <Typography variant=\"body1\" sx={{ mb: '1em' }}>\n A digital object identifier (DOI) provides a persistent identifier\n that allows readers to find the data cited in your publication.\n Creating a DOI in the Synapse platform is free and required as part of\n the data availability statement.\n </Typography>\n\n <Button\n variant=\"outlined\"\n href={createDoiHelpUrl}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n <LaunchTwoTone sx={{ mr: '0.5em' }} />\n Learn how to get a DOI for your publication\n </Button>\n </Container>\n\n <AcknowledgementsDialog\n open={isAcknowledgementsDialogOpen}\n onClose={handleCloseDialog}\n createDoiHelpUrl={createDoiHelpUrl}\n portalAcknowledgement={portalAcknowledgement}\n dataAvailabilityStatement={dataAvailabilityStatement}\n studyAcknowledgements={acknowledgementItems}\n />\n </>\n )\n}\n\nexport default AcknowledgementPage\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DarSectionForm.d.ts","sourceRoot":"","sources":["../../../../src/components/Aridhia/DarWizard/DarSectionForm.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAA;
|
|
1
|
+
{"version":3,"file":"DarSectionForm.d.ts","sourceRoot":"","sources":["../../../../src/components/Aridhia/DarWizard/DarSectionForm.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAA;AAMlD,MAAM,MAAM,uBAAuB,GAAG;IACpC,MAAM,EAAE,UAAU,CAAA;IAClB,QAAQ,EAAE,QAAQ,CAAA;IAClB,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IACjC,QAAQ,EAAE,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,IAAI,CAAA;CACtD,CAAA;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,uBAAuB,2CAiB5D"}
|
|
@@ -1,23 +1,27 @@
|
|
|
1
1
|
import { JsonSchemaForm as e } from "../../JsonSchemaForm/JsonSchemaForm.js";
|
|
2
2
|
import { DateWidget as t } from "../../JsonSchemaForm/widgets/DateWidget.js";
|
|
3
|
-
import n from "
|
|
4
|
-
import
|
|
3
|
+
import { PhoneWidget as n } from "../../JsonSchemaForm/widgets/PhoneWidget.js";
|
|
4
|
+
import r from "../FairLabelField.js";
|
|
5
|
+
import { Fragment as i, jsx as a } from "react/jsx-runtime";
|
|
5
6
|
//#region src/components/Aridhia/DarWizard/DarSectionForm.tsx
|
|
6
|
-
function
|
|
7
|
-
let { schema:
|
|
8
|
-
return /* @__PURE__ */
|
|
9
|
-
schema:
|
|
10
|
-
uiSchema:
|
|
11
|
-
formData:
|
|
12
|
-
fields: { fairLabel:
|
|
13
|
-
widgets: {
|
|
7
|
+
function o(o) {
|
|
8
|
+
let { schema: s, uiSchema: c, formData: l, onChange: u } = o;
|
|
9
|
+
return /* @__PURE__ */ a(e, {
|
|
10
|
+
schema: s,
|
|
11
|
+
uiSchema: c,
|
|
12
|
+
formData: l,
|
|
13
|
+
fields: { fairLabel: r },
|
|
14
|
+
widgets: {
|
|
15
|
+
DateWidget: t,
|
|
16
|
+
PhoneWidget: n
|
|
17
|
+
},
|
|
14
18
|
formContext: { booleanWidget: "checkbox" },
|
|
15
|
-
onChange: ({ formData: e }) =>
|
|
19
|
+
onChange: ({ formData: e }) => u(e ?? {}),
|
|
16
20
|
showErrorList: !1,
|
|
17
|
-
children: /* @__PURE__ */ i
|
|
21
|
+
children: /* @__PURE__ */ a(i, {})
|
|
18
22
|
});
|
|
19
23
|
}
|
|
20
24
|
//#endregion
|
|
21
|
-
export {
|
|
25
|
+
export { o as DarSectionForm };
|
|
22
26
|
|
|
23
27
|
//# sourceMappingURL=DarSectionForm.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DarSectionForm.js","names":[],"sources":["../../../../src/components/Aridhia/DarWizard/DarSectionForm.tsx"],"sourcesContent":["import { RJSFSchema, UiSchema } from '@rjsf/utils'\nimport { JsonSchemaForm } from '@/components/JsonSchemaForm/JsonSchemaForm'\nimport { DateWidget } from '@/components/JsonSchemaForm/widgets/DateWidget'\nimport FairLabelField from '@/components/Aridhia/FairLabelField'\n\nexport type DarFormSectionStepProps = {\n schema: RJSFSchema\n uiSchema: UiSchema\n formData: Record<string, unknown>\n onChange: (formData: Record<string, unknown>) => void\n}\n\n/**\n * Renders one `fairSectionToRjsf` schema/uiSchema pair via `JsonSchemaForm`, with the shared\n * `JsonSchemaForm` customizations needed for the Aridhia DAR flow.\n */\nexport function DarSectionForm(props: DarFormSectionStepProps) {\n const { schema, uiSchema, formData, onChange } = props\n return (\n <JsonSchemaForm<Record<string, unknown>>\n schema={schema}\n uiSchema={uiSchema}\n formData={formData}\n fields={{ fairLabel: FairLabelField }}\n widgets={{ DateWidget
|
|
1
|
+
{"version":3,"file":"DarSectionForm.js","names":[],"sources":["../../../../src/components/Aridhia/DarWizard/DarSectionForm.tsx"],"sourcesContent":["import { RJSFSchema, UiSchema } from '@rjsf/utils'\nimport { JsonSchemaForm } from '@/components/JsonSchemaForm/JsonSchemaForm'\nimport { DateWidget } from '@/components/JsonSchemaForm/widgets/DateWidget'\nimport { PhoneWidget } from '@/components/JsonSchemaForm/widgets/PhoneWidget'\nimport FairLabelField from '@/components/Aridhia/FairLabelField'\n\nexport type DarFormSectionStepProps = {\n schema: RJSFSchema\n uiSchema: UiSchema\n formData: Record<string, unknown>\n onChange: (formData: Record<string, unknown>) => void\n}\n\n/**\n * Renders one `fairSectionToRjsf` schema/uiSchema pair via `JsonSchemaForm`, with the shared\n * `JsonSchemaForm` customizations needed for the Aridhia DAR flow.\n */\nexport function DarSectionForm(props: DarFormSectionStepProps) {\n const { schema, uiSchema, formData, onChange } = props\n return (\n <JsonSchemaForm<Record<string, unknown>>\n schema={schema}\n uiSchema={uiSchema}\n formData={formData}\n fields={{ fairLabel: FairLabelField }}\n widgets={{ DateWidget, PhoneWidget }}\n formContext={{ booleanWidget: 'checkbox' }}\n onChange={({ formData: next }) => onChange(next ?? {})}\n showErrorList={false}\n >\n {/* Suppress the built-in submit button; the wizard owns navigation. */}\n <></>\n </JsonSchemaForm>\n )\n}\n"],"mappings":";;;;;;AAiBA,SAAgB,EAAe,GAAgC;CAC7D,IAAM,EAAE,WAAQ,aAAU,aAAU,gBAAa;CACjD,OACE,kBAAC,GAAD;EACU;EACE;EACA;EACV,QAAQ,EAAE,WAAW,EAAe;EACpC,SAAS;GAAE;GAAY;EAAY;EACnC,aAAa,EAAE,eAAe,WAAW;EACzC,WAAW,EAAE,UAAU,QAAW,EAAS,KAAQ,CAAC,CAAC;EACrD,eAAe;YAGf,kBAAA,GAAA,CAAI,CAAA;CACU,CAAA;AAEpB"}
|
|
@@ -3,9 +3,9 @@ export type DarSubmittedPanelProps = {
|
|
|
3
3
|
status?: string;
|
|
4
4
|
};
|
|
5
5
|
/**
|
|
6
|
-
* Confirmation panel shown after a successful `POST /fair/requests/`.
|
|
7
|
-
*
|
|
8
|
-
*
|
|
6
|
+
* Confirmation panel shown after a successful `POST /fair/requests/`. The guidance beneath the
|
|
7
|
+
* request code (review timeline, DUA step, where to check status) is maintained by C-Path as
|
|
8
|
+
* a FAIR vocabulary term, so it is fetched rather than bundled with the portal.
|
|
9
9
|
*/
|
|
10
10
|
export declare function DarSubmittedPanel(props: DarSubmittedPanelProps): import("react/jsx-runtime").JSX.Element;
|
|
11
11
|
//# sourceMappingURL=DarSubmittedPanel.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DarSubmittedPanel.d.ts","sourceRoot":"","sources":["../../../../src/components/Aridhia/DarWizard/DarSubmittedPanel.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"DarSubmittedPanel.d.ts","sourceRoot":"","sources":["../../../../src/components/Aridhia/DarWizard/DarSubmittedPanel.tsx"],"names":[],"mappings":"AAcA,MAAM,MAAM,sBAAsB,GAAG;IACnC,WAAW,EAAE,MAAM,CAAA;IACnB,MAAM,CAAC,EAAE,MAAM,CAAA;CAChB,CAAA;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,sBAAsB,2CAgC9D"}
|
|
@@ -1,48 +1,47 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import
|
|
1
|
+
import { Markdown as e } from "../../Markdown/MarkdownSynapse.js";
|
|
2
|
+
import { DAR_MESSAGE_VOCABULARY_CODE as t, useGetAridhiaVocabularyTerm as n } from "../../../aridhia-queries/useGetAridhiaVocabularyTerm.js";
|
|
3
|
+
import "../rdcaDapConstants.js";
|
|
4
|
+
import { Alert as r, Link as i, Skeleton as a, Stack as o, Typography as s } from "@mui/material";
|
|
5
|
+
import { Fragment as c, jsx as l, jsxs as u } from "react/jsx-runtime";
|
|
4
6
|
//#region src/components/Aridhia/DarWizard/DarSubmittedPanel.tsx
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
return /* @__PURE__ */ s(r, {
|
|
7
|
+
function d(d) {
|
|
8
|
+
let { requestCode: f, status: p } = d, { data: m, isLoading: h } = n(t), g = m?.value;
|
|
9
|
+
return /* @__PURE__ */ u(o, {
|
|
9
10
|
spacing: 2,
|
|
10
11
|
children: [
|
|
11
|
-
/* @__PURE__ */
|
|
12
|
+
/* @__PURE__ */ l(r, {
|
|
12
13
|
severity: "success",
|
|
13
14
|
children: "Your data access request was submitted."
|
|
14
15
|
}),
|
|
15
|
-
/* @__PURE__ */ s
|
|
16
|
+
/* @__PURE__ */ u(s, { children: [
|
|
16
17
|
"Request code: ",
|
|
17
|
-
/* @__PURE__ */
|
|
18
|
-
|
|
18
|
+
/* @__PURE__ */ l("strong", { children: f }),
|
|
19
|
+
p && /* @__PURE__ */ u(c, { children: [" — status: ", p] })
|
|
19
20
|
] }),
|
|
20
|
-
/* @__PURE__ */
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
"."
|
|
41
|
-
] })
|
|
21
|
+
h && /* @__PURE__ */ l(a, {
|
|
22
|
+
variant: "rounded",
|
|
23
|
+
height: 160
|
|
24
|
+
}),
|
|
25
|
+
g && /* @__PURE__ */ l(e, { markdown: g }),
|
|
26
|
+
!h && !g && /* @__PURE__ */ u(r, {
|
|
27
|
+
severity: "warning",
|
|
28
|
+
children: [
|
|
29
|
+
"We could not load the details about what happens next. You can check the status of your request at any time by logging in to",
|
|
30
|
+
" ",
|
|
31
|
+
/* @__PURE__ */ l(i, {
|
|
32
|
+
href: "https://portal.rdca.c-path.org/",
|
|
33
|
+
target: "_blank",
|
|
34
|
+
rel: "noopener noreferrer",
|
|
35
|
+
children: "RDCA-DAP"
|
|
36
|
+
}),
|
|
37
|
+
" ",
|
|
38
|
+
"and clicking Access > My Requests."
|
|
39
|
+
]
|
|
40
|
+
})
|
|
42
41
|
]
|
|
43
42
|
});
|
|
44
43
|
}
|
|
45
44
|
//#endregion
|
|
46
|
-
export {
|
|
45
|
+
export { d as DarSubmittedPanel };
|
|
47
46
|
|
|
48
47
|
//# sourceMappingURL=DarSubmittedPanel.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DarSubmittedPanel.js","names":[],"sources":["../../../../src/components/Aridhia/DarWizard/DarSubmittedPanel.tsx"],"sourcesContent":["import {
|
|
1
|
+
{"version":3,"file":"DarSubmittedPanel.js","names":[],"sources":["../../../../src/components/Aridhia/DarWizard/DarSubmittedPanel.tsx"],"sourcesContent":["import {\n Alert,\n Link as MuiLink,\n Skeleton,\n Stack,\n Typography,\n} from '@mui/material'\nimport {\n DAR_MESSAGE_VOCABULARY_CODE,\n useGetAridhiaVocabularyTerm,\n} from '@/aridhia-queries/useGetAridhiaVocabularyTerm'\nimport MarkdownSynapse from '@/components/Markdown/MarkdownSynapse'\nimport { RDCA_DAP_URL } from '@/components/Aridhia/rdcaDapConstants'\n\nexport type DarSubmittedPanelProps = {\n requestCode: string\n status?: string\n}\n\n/**\n * Confirmation panel shown after a successful `POST /fair/requests/`. The guidance beneath the\n * request code (review timeline, DUA step, where to check status) is maintained by C-Path as\n * a FAIR vocabulary term, so it is fetched rather than bundled with the portal.\n */\nexport function DarSubmittedPanel(props: DarSubmittedPanelProps) {\n const { requestCode, status } = props\n const { data: messageTerm, isLoading } = useGetAridhiaVocabularyTerm(\n DAR_MESSAGE_VOCABULARY_CODE,\n )\n const message = messageTerm?.value\n\n return (\n <Stack spacing={2}>\n <Alert severity=\"success\">Your data access request was submitted.</Alert>\n <Typography>\n Request code: <strong>{requestCode}</strong>\n {status && <> — status: {status}</>}\n </Typography>\n {isLoading && <Skeleton variant=\"rounded\" height={160} />}\n {message && <MarkdownSynapse markdown={message} />}\n {!isLoading && !message && (\n <Alert severity=\"warning\">\n We could not load the details about what happens next. You can check\n the status of your request at any time by logging in to{' '}\n <MuiLink\n href={RDCA_DAP_URL}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n RDCA-DAP\n </MuiLink>{' '}\n and clicking Access > My Requests.\n </Alert>\n )}\n </Stack>\n )\n}\n"],"mappings":";;;;;;AAwBA,SAAgB,EAAkB,GAA+B;CAC/D,IAAM,EAAE,gBAAa,cAAW,GAC1B,EAAE,MAAM,GAAa,iBAAc,EACvC,CACF,GACM,IAAU,GAAa;CAE7B,OACE,kBAAC,GAAD;EAAO,SAAS;YAAhB;GACE,kBAAC,GAAD;IAAO,UAAS;cAAU;GAA8C,CAAA;GACxE,kBAAC,GAAD,EAAA,UAAA;IAAY;IACI,kBAAC,UAAD,EAAA,UAAS,EAAoB,CAAA;IAC1C,KAAU,kBAAA,GAAA,EAAA,UAAA,CAAE,eAAkB,CAAS,EAAA,CAAA;GAC9B,EAAA,CAAA;GACX,KAAa,kBAAC,GAAD;IAAU,SAAQ;IAAU,QAAQ;GAAM,CAAA;GACvD,KAAW,kBAAC,GAAD,EAAiB,UAAU,EAAU,CAAA;GAChD,CAAC,KAAa,CAAC,KACd,kBAAC,GAAD;IAAO,UAAS;cAAhB;KAA0B;KAEgC;KACxD,kBAAC,GAAD;MACE,MAAA;MACA,QAAO;MACP,KAAI;gBACL;KAEQ,CAAA;KAAE;KAAI;IAEV;;EAEJ;;AAEX"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fairFormToRjsf.js","names":[],"sources":["../../../src/components/Aridhia/fairFormToRjsf.ts"],"sourcesContent":["import { RJSFSchema, UiSchema } from '@rjsf/utils'\nimport dayjs from 'dayjs'\nimport { FairField, FairFormPayload } from '@/aridhia-queries/FairFormPayload'\n\nexport type { FairField, FairFormPayload }\n\nexport type FairFormSection = {\n key: string\n label?: string\n fields: FairField[]\n}\n\nexport type FairRjsfSection = {\n schema: RJSFSchema\n uiSchema: UiSchema\n /** Fields whose `type` cannot be rendered; the wizard blocks submit and names them. */\n unsupported: FairField[]\n}\n\nconst RENDERABLE_TYPES = new Set([\n 'string',\n 'text',\n 'markdown',\n 'boolean',\n 'date',\n 'list',\n 'phone',\n 'label',\n])\n\n/**\n * Accepts both FAIR form-definition payload shapes seen in practice and normalizes them to\n * ordered sections:\n * - `{ sections: { about: { label, fields: [...] }, ... } }` — the shape returned by\n * `GET /workspaces-forms/{code}` (via `WorkspaceForm.sections`).\n * - `{ fields: { about: [...], project: [...] } }` — the shape declared for\n * `GET /workflows/{code}` (via `WorkflowNoControlsRequests.fields`).\n */\nexport function parseFairFormSections(\n payload: FairFormPayload | null | undefined,\n): FairFormSection[] {\n if (!payload || typeof payload !== 'object') {\n return []\n }\n\n const { sections } = payload\n if (sections && typeof sections === 'object') {\n return Object.entries(sections).map(([key, section]) => {\n const { label, fields } = section ?? {}\n return { key, label, fields: fields ?? [] }\n })\n }\n\n const fieldsBySection = payload.fields\n if (fieldsBySection && typeof fieldsBySection === 'object') {\n return Object.entries(fieldsBySection).map(([key, fields]) => ({\n key,\n fields: fields ?? [],\n }))\n }\n\n return []\n}\n\n/** FAIR sends `minimum`/`maximum` as strings; `undefined` in, `undefined` out. */\nfunction num(value: string | undefined): number | undefined {\n return value == null ? undefined : Number(value)\n}\n\n/** Translates one FAIR form section into an RJSF schema/uiSchema pair. */\nexport function fairSectionToRjsf(section: FairFormSection): FairRjsfSection {\n const properties: Record<string, RJSFSchema> = {}\n const uiSchema: UiSchema = {\n 'ui:order': section.fields.map(field => field.name!),\n }\n const required: string[] = []\n const unsupported: FairField[] = []\n\n for (const field of section.fields) {\n const name = field.name\n if (!name) {\n continue\n }\n const v = field.validation ?? {}\n\n if (!field.type || !RENDERABLE_TYPES.has(field.type)) {\n unsupported.push(field)\n continue\n }\n\n if (v.required === true && field.type !== 'label') {\n required.push(name)\n }\n\n switch (field.type) {\n case 'string': {\n properties[name] = {\n type: 'string',\n maxLength: num(v.maximum),\n minLength: num(v.minimum),\n }\n uiSchema[name] = { 'ui:placeholder': field.placeholder }\n break\n }\n case 'text':\n case 'markdown': {\n properties[name] = {\n type: 'string',\n maxLength: num(v.maximum),\n minLength: num(v.minimum),\n }\n uiSchema[name] = {\n 'ui:widget': 'textarea',\n 'ui:placeholder': field.placeholder,\n }\n break\n }\n case 'boolean': {\n properties[name] = { type: 'boolean' }\n break\n }\n case 'date': {\n // The FAIR API expects a `date-time`; the only date field is project_end_date\n // so a simple date picker (DateWidget) is ideal.\n properties[name] = { type: 'string', format: 'date-time' }\n uiSchema[name] = { 'ui:widget': 'DateWidget' }\n break\n }\n case 'list': {\n properties[name] = {\n type: 'string',\n oneOf: (field.options ?? []).map(option => ({\n const: option.value,\n title: option.text,\n ...(option.description ? { description: option.description } : {}),\n })),\n }\n if (field.default_options) {\n properties[name].default = field.default_options\n }\n uiSchema[name] = {\n 'ui:widget': 'SelectWidget',\n 'ui:placeholder': field.placeholder,\n }\n break\n }\n case 'phone': {\n properties[name] = { type: 'string', maxLength: num(v.maximum) }\n uiSchema[name] = { 'ui:
|
|
1
|
+
{"version":3,"file":"fairFormToRjsf.js","names":[],"sources":["../../../src/components/Aridhia/fairFormToRjsf.ts"],"sourcesContent":["import { RJSFSchema, UiSchema } from '@rjsf/utils'\nimport dayjs from 'dayjs'\nimport { FairField, FairFormPayload } from '@/aridhia-queries/FairFormPayload'\n\nexport type { FairField, FairFormPayload }\n\nexport type FairFormSection = {\n key: string\n label?: string\n fields: FairField[]\n}\n\nexport type FairRjsfSection = {\n schema: RJSFSchema\n uiSchema: UiSchema\n /** Fields whose `type` cannot be rendered; the wizard blocks submit and names them. */\n unsupported: FairField[]\n}\n\nconst RENDERABLE_TYPES = new Set([\n 'string',\n 'text',\n 'markdown',\n 'boolean',\n 'date',\n 'list',\n 'phone',\n 'label',\n])\n\n/**\n * Accepts both FAIR form-definition payload shapes seen in practice and normalizes them to\n * ordered sections:\n * - `{ sections: { about: { label, fields: [...] }, ... } }` — the shape returned by\n * `GET /workspaces-forms/{code}` (via `WorkspaceForm.sections`).\n * - `{ fields: { about: [...], project: [...] } }` — the shape declared for\n * `GET /workflows/{code}` (via `WorkflowNoControlsRequests.fields`).\n */\nexport function parseFairFormSections(\n payload: FairFormPayload | null | undefined,\n): FairFormSection[] {\n if (!payload || typeof payload !== 'object') {\n return []\n }\n\n const { sections } = payload\n if (sections && typeof sections === 'object') {\n return Object.entries(sections).map(([key, section]) => {\n const { label, fields } = section ?? {}\n return { key, label, fields: fields ?? [] }\n })\n }\n\n const fieldsBySection = payload.fields\n if (fieldsBySection && typeof fieldsBySection === 'object') {\n return Object.entries(fieldsBySection).map(([key, fields]) => ({\n key,\n fields: fields ?? [],\n }))\n }\n\n return []\n}\n\n/** FAIR sends `minimum`/`maximum` as strings; `undefined` in, `undefined` out. */\nfunction num(value: string | undefined): number | undefined {\n return value == null ? undefined : Number(value)\n}\n\n/** Translates one FAIR form section into an RJSF schema/uiSchema pair. */\nexport function fairSectionToRjsf(section: FairFormSection): FairRjsfSection {\n const properties: Record<string, RJSFSchema> = {}\n const uiSchema: UiSchema = {\n 'ui:order': section.fields.map(field => field.name!),\n }\n const required: string[] = []\n const unsupported: FairField[] = []\n\n for (const field of section.fields) {\n const name = field.name\n if (!name) {\n continue\n }\n const v = field.validation ?? {}\n\n if (!field.type || !RENDERABLE_TYPES.has(field.type)) {\n unsupported.push(field)\n continue\n }\n\n if (v.required === true && field.type !== 'label') {\n required.push(name)\n }\n\n switch (field.type) {\n case 'string': {\n properties[name] = {\n type: 'string',\n maxLength: num(v.maximum),\n minLength: num(v.minimum),\n }\n uiSchema[name] = { 'ui:placeholder': field.placeholder }\n break\n }\n case 'text':\n case 'markdown': {\n properties[name] = {\n type: 'string',\n maxLength: num(v.maximum),\n minLength: num(v.minimum),\n }\n uiSchema[name] = {\n 'ui:widget': 'textarea',\n 'ui:placeholder': field.placeholder,\n }\n break\n }\n case 'boolean': {\n properties[name] = { type: 'boolean' }\n break\n }\n case 'date': {\n // The FAIR API expects a `date-time`; the only date field is project_end_date\n // so a simple date picker (DateWidget) is ideal.\n properties[name] = { type: 'string', format: 'date-time' }\n uiSchema[name] = { 'ui:widget': 'DateWidget' }\n break\n }\n case 'list': {\n properties[name] = {\n type: 'string',\n oneOf: (field.options ?? []).map(option => ({\n const: option.value,\n title: option.text,\n ...(option.description ? { description: option.description } : {}),\n })),\n }\n if (field.default_options) {\n properties[name].default = field.default_options\n }\n uiSchema[name] = {\n 'ui:widget': 'SelectWidget',\n 'ui:placeholder': field.placeholder,\n }\n break\n }\n case 'phone': {\n properties[name] = { type: 'string', maxLength: num(v.maximum) }\n uiSchema[name] = { 'ui:widget': 'PhoneWidget' }\n break\n }\n case 'label': {\n properties[name] = { type: 'null', title: field.label }\n uiSchema[name] = { 'ui:field': 'fairLabel', 'ui:label': false }\n break\n }\n }\n\n if (field.type !== 'label' && field.label) {\n properties[name].title = field.label\n }\n\n if (field.defaultValue) {\n properties[name].default = field.defaultValue\n }\n }\n\n return {\n schema: {\n type: 'object',\n properties,\n required,\n },\n uiSchema,\n unsupported,\n }\n}\n\nexport type AnsweredField = { label: string; value: string }\n\nfunction formatAnswerValue(propertySchema: RJSFSchema, value: unknown): string {\n if (Array.isArray(value)) {\n return value.map(v => formatAnswerValue(propertySchema, v)).join(', ')\n }\n if (typeof value === 'boolean') {\n return value ? 'Yes' : 'No'\n }\n const oneOf = propertySchema.oneOf as\n | { const: unknown; title?: string }[]\n | undefined\n const matchedOption = oneOf?.find(option => option.const === value)\n if (matchedOption) {\n return matchedOption.title ?? String(value)\n }\n if (propertySchema.format === 'date-time' && typeof value === 'string') {\n // `DateWidget`-produced values are always UTC midnight for the picked calendar date;\n // format the date portion directly to avoid a local-timezone parse shifting it onto\n // the adjacent day.\n const parsed = dayjs(value.slice(0, 10))\n return parsed.isValid() ? parsed.format('MMM D, YYYY') : value\n }\n return String(value)\n}\n\n/**\n * Renders a `fairSectionToRjsf` schema's answered fields as `{ label, value }` pairs, in the\n * form's own field order, for read-only review UI (the DAR wizard's Review & submit step).\n * Unanswered fields (including `label`-type fields, which never carry a value) are omitted.\n */\nexport function summarizeFormAnswers(\n schema: RJSFSchema,\n values: Record<string, unknown>,\n): AnsweredField[] {\n const propertyNames = Object.keys(schema.properties ?? {})\n return propertyNames.flatMap(name => {\n const value = values[name]\n if (value === undefined || value === null || value === '') {\n return []\n }\n const propertySchema = (schema.properties as Record<string, RJSFSchema>)[\n name\n ]\n const label = propertySchema.title ?? name\n return [{ label, value: formatAnswerValue(propertySchema, value) }]\n })\n}\n"],"mappings":"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"}
|
|
@@ -3,7 +3,7 @@ import { formatDate as a } from "../../utils/functions/DateFormatter.js";
|
|
|
3
3
|
import { getLoginMethodFriendlyName as o } from "./LoginMethod.js";
|
|
4
4
|
import { Box as s, Link as c, Tooltip as l, Typography as u } from "@mui/material";
|
|
5
5
|
import { Fragment as d, jsx as f, jsxs as p } from "react/jsx-runtime";
|
|
6
|
-
import
|
|
6
|
+
import m from "@mui/icons-material/InfoTwoTone";
|
|
7
7
|
import h from "dayjs";
|
|
8
8
|
import { useLocalStorageValue as g } from "@react-hookz/web";
|
|
9
9
|
//#region src/components/Authentication/LastLoginInfo.tsx
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"LastLoginInfo.js","names":[],"sources":["../../../src/components/Authentication/LastLoginInfo.tsx"],"sourcesContent":["import { formatDate } from '@/utils/functions/DateFormatter'\nimport {\n CURRENT_SOURCEAPP_NAME_LOCALSTORAGE_KEY,\n LAST_LOGIN_DATE_LOCALSTORAGE_KEY,\n LAST_LOGIN_METHOD_LOCALSTORAGE_KEY,\n LAST_LOGIN_SOURCEAPP_NAME_LOCALSTORAGE_KEY,\n LAST_LOGIN_SOURCEAPP_URL_LOCALSTORAGE_KEY,\n} from '@/utils/SynapseConstants'\nimport
|
|
1
|
+
{"version":3,"file":"LastLoginInfo.js","names":[],"sources":["../../../src/components/Authentication/LastLoginInfo.tsx"],"sourcesContent":["import { formatDate } from '@/utils/functions/DateFormatter'\nimport {\n CURRENT_SOURCEAPP_NAME_LOCALSTORAGE_KEY,\n LAST_LOGIN_DATE_LOCALSTORAGE_KEY,\n LAST_LOGIN_METHOD_LOCALSTORAGE_KEY,\n LAST_LOGIN_SOURCEAPP_NAME_LOCALSTORAGE_KEY,\n LAST_LOGIN_SOURCEAPP_URL_LOCALSTORAGE_KEY,\n} from '@/utils/SynapseConstants'\nimport InfoTwoTone from '@mui/icons-material/InfoTwoTone'\nimport { Box, Link, Tooltip, Typography } from '@mui/material'\nimport { useLocalStorageValue } from '@react-hookz/web'\nimport dayjs from 'dayjs'\nimport { getLoginMethodFriendlyName, LoginMethod } from './LoginMethod'\n\nexport type LastLoginInfoProps = {\n currentSourceAppName: string | undefined\n lastLoginMethod: LoginMethod | undefined\n lastLoginSourceAppName: string | undefined\n lastLoginSourceAppURL: string | undefined\n lastLoginDate: string | undefined\n display: 'sentence' | 'box'\n}\n\nexport function useLastLoginInfoState() {\n return {\n currentSourceAppNameState: useLocalStorageValue<string>(\n CURRENT_SOURCEAPP_NAME_LOCALSTORAGE_KEY,\n ),\n lastLoginMethodState: useLocalStorageValue<LoginMethod>(\n LAST_LOGIN_METHOD_LOCALSTORAGE_KEY,\n ),\n lastLoginSourceAppNameState: useLocalStorageValue<string>(\n LAST_LOGIN_SOURCEAPP_NAME_LOCALSTORAGE_KEY,\n ),\n lastLoginSourceAppURLState: useLocalStorageValue<string>(\n LAST_LOGIN_SOURCEAPP_URL_LOCALSTORAGE_KEY,\n ),\n lastLoginDateState: useLocalStorageValue<string>(\n LAST_LOGIN_DATE_LOCALSTORAGE_KEY,\n ),\n }\n}\n\nexport function useLastLoginInfo() {\n const states = useLastLoginInfoState()\n return {\n currentSourceAppName: states.currentSourceAppNameState.value,\n lastLoginMethod: states.lastLoginMethodState.value,\n lastLoginSourceAppName: states.lastLoginSourceAppNameState.value,\n lastLoginSourceAppURL: states.lastLoginSourceAppURLState.value,\n lastLoginDate: states.lastLoginDateState.value,\n }\n}\n\nexport function clearLastLoginInfo() {\n const keys = [\n CURRENT_SOURCEAPP_NAME_LOCALSTORAGE_KEY,\n LAST_LOGIN_METHOD_LOCALSTORAGE_KEY,\n LAST_LOGIN_SOURCEAPP_NAME_LOCALSTORAGE_KEY,\n LAST_LOGIN_SOURCEAPP_URL_LOCALSTORAGE_KEY,\n LAST_LOGIN_DATE_LOCALSTORAGE_KEY,\n ]\n keys.forEach(key => localStorage.removeItem(key))\n}\n\nfunction getSourceAppIndefiniteArticle(val: string) {\n return val.match(/^[aeiou]/i) ? 'an' : 'a'\n}\n\nfunction getSourceAppDefiniteArticle(val: string) {\n return val.match(' Portal$') ? 'the ' : ''\n}\n\nexport default function LastLoginInfo(props: LastLoginInfoProps) {\n const {\n currentSourceAppName,\n lastLoginMethod,\n lastLoginSourceAppName,\n lastLoginSourceAppURL,\n lastLoginDate,\n display,\n } = props\n\n const showLastLoginInfo =\n currentSourceAppName &&\n lastLoginMethod &&\n lastLoginSourceAppName &&\n lastLoginSourceAppURL &&\n lastLoginDate &&\n currentSourceAppName !== lastLoginSourceAppName\n\n if (!showLastLoginInfo) {\n return null\n }\n\n const currentSourceAppIndefiniteArticle =\n getSourceAppIndefiniteArticle(currentSourceAppName)\n const currentSourceAppDefiniteArticle =\n getSourceAppDefiniteArticle(currentSourceAppName)\n const lastLoginSourceAppDefiniteArticle = getSourceAppDefiniteArticle(\n lastLoginSourceAppName,\n )\n\n const title = `You may already have ${currentSourceAppIndefiniteArticle} ${currentSourceAppName} account`\n const accountLastUsed = `Account last used on ${formatDate(\n dayjs(lastLoginDate),\n 'MMMM D, YYYY',\n )}`\n\n const tooltipText = (\n <>\n <Typography\n variant=\"smallText2\"\n sx={{\n mb: 1,\n }}\n >\n {title}\n </Typography>\n <Typography\n variant=\"smallText1\"\n color=\"white\"\n sx={{\n mb: 1,\n }}\n >\n {`This computer was used to sign in to an account on ${lastLoginSourceAppDefiniteArticle}${lastLoginSourceAppName}. \n You can use the same account to sign in to ${currentSourceAppDefiniteArticle}${currentSourceAppName}.`}\n </Typography>\n <Typography variant=\"smallText1\" color=\"white\">\n {accountLastUsed}\n </Typography>\n </>\n )\n\n const boxText = (\n <>\n <Typography\n variant=\"smallText2\"\n sx={{\n mb: 1,\n color: 'grey.900',\n fontSize: '12px',\n }}\n >\n {title}\n </Typography>\n <Typography\n variant=\"smallText1\"\n sx={{\n mb: 1,\n color: 'grey.900',\n fontSize: '12px',\n }}\n >\n It looks like you already have an account, last used on{' '}\n {lastLoginSourceAppDefiniteArticle}\n <Link href={lastLoginSourceAppURL}>{lastLoginSourceAppName}</Link>.{' '}\n {`You can use this account to sign in via ${getLoginMethodFriendlyName(\n lastLoginMethod,\n )}.`}\n </Typography>\n <Typography\n variant=\"smallText1\"\n sx={{ color: 'grey.700', fontSize: '10px' }}\n >\n {accountLastUsed}\n </Typography>\n </>\n )\n\n return (\n <>\n {display === 'sentence' ? (\n <Typography\n variant=\"smallText1\"\n sx={{ color: 'grey.700', textTransform: 'none' }}\n >\n You may be able to use an existing account\n <Tooltip\n title={tooltipText}\n placement={'top'}\n slotProps={{\n tooltip: {\n sx: {\n bgcolor: '#63676C',\n '& .MuiTooltip-arrow': {\n color: '#63676C',\n },\n },\n },\n }}\n >\n <InfoTwoTone\n sx={{\n color: 'grey.700',\n width: '12px',\n height: '12px',\n ml: '4px',\n verticalAlign: 'middle',\n }}\n />\n </Tooltip>\n </Typography>\n ) : (\n <Box sx={{ backgroundColor: 'grey.100', p: '10px' }}>{boxText}</Box>\n )}\n </>\n )\n}\n"],"mappings":";;;;;;;;;AAuBA,SAAgB,IAAwB;CACtC,OAAO;EACL,2BAA2B,EACzB,CACF;EACA,sBAAsB,EACpB,CACF;EACA,6BAA6B,EAC3B,CACF;EACA,4BAA4B,EAC1B,CACF;EACA,oBAAoB,EAClB,CACF;CACF;AACF;AAEA,SAAgB,IAAmB;CACjC,IAAM,IAAS,EAAsB;CACrC,OAAO;EACL,sBAAsB,EAAO,0BAA0B;EACvD,iBAAiB,EAAO,qBAAqB;EAC7C,wBAAwB,EAAO,4BAA4B;EAC3D,uBAAuB,EAAO,2BAA2B;EACzD,eAAe,EAAO,mBAAmB;CAC3C;AACF;AAEA,SAAgB,IAAqB;CAQnC;EANE;EACA;EACA;EACA;EACA;CAEF,EAAK,SAAQ,MAAO,aAAa,WAAW,CAAG,CAAC;AAClD;AAEA,SAAS,EAA8B,GAAa;CAClD,OAAO,EAAI,MAAM,WAAW,IAAI,OAAO;AACzC;AAEA,SAAS,EAA4B,GAAa;CAChD,OAAO,EAAI,MAAM,UAAU,IAAI,SAAS;AAC1C;AAEA,SAAwB,EAAc,GAA2B;CAC/D,IAAM,EACJ,yBACA,oBACA,2BACA,0BACA,kBACA,eACE;CAUJ,IAAI,EAPF,KACA,KACA,KACA,KACA,KACA,MAAyB,IAGzB,OAAO;CAGT,IAAM,IACJ,EAA8B,CAAoB,GAC9C,IACJ,EAA4B,CAAoB,GAC5C,IAAoC,EACxC,CACF,GAEM,IAAQ,wBAAwB,EAAkC,GAAG,EAAqB,WAC1F,IAAkB,wBAAwB,EAC9C,EAAM,CAAa,GACnB,cACF,KAEM,IACJ,kBAAA,GAAA,EAAA,UAAA;EACE,kBAAC,GAAD;GACE,SAAQ;GACR,IAAI,EACF,IAAI,EACN;aAEC;EACS,CAAA;EACZ,kBAAC,GAAD;GACE,SAAQ;GACR,OAAM;GACN,IAAI,EACF,IAAI,EACN;aAEC,sDAAsD,IAAoC,EAAuB;uDACnE,IAAkC,EAAqB;EAC5F,CAAA;EACZ,kBAAC,GAAD;GAAY,SAAQ;GAAa,OAAM;aACpC;EACS,CAAA;CACZ,EAAA,CAAA,GAGE,IACJ,kBAAA,GAAA,EAAA,UAAA;EACE,kBAAC,GAAD;GACE,SAAQ;GACR,IAAI;IACF,IAAI;IACJ,OAAO;IACP,UAAU;GACZ;aAEC;EACS,CAAA;EACZ,kBAAC,GAAD;GACE,SAAQ;GACR,IAAI;IACF,IAAI;IACJ,OAAO;IACP,UAAU;GACZ;aANF;IAOC;IACyD;IACvD;IACD,kBAAC,GAAD;KAAM,MAAM;eAAwB;IAA6B,CAAA;IAAC;IAAE;IACnE,2CAA2C,EAC1C,CACF,EAAE;GACQ;;EACZ,kBAAC,GAAD;GACE,SAAQ;GACR,IAAI;IAAE,OAAO;IAAY,UAAU;GAAO;aAEzC;EACS,CAAA;CACZ,EAAA,CAAA;CAGJ,OACE,kBAAA,GAAA,EAAA,UACG,MAAY,aACX,kBAAC,GAAD;EACE,SAAQ;EACR,IAAI;GAAE,OAAO;GAAY,eAAe;EAAO;YAFjD,CAGC,8CAEC,kBAAC,GAAD;GACE,OAAO;GACP,WAAW;GACX,WAAW,EACT,SAAS,EACP,IAAI;IACF,SAAS;IACT,uBAAuB,EACrB,OAAO,UACT;GACF,EACF,EACF;aAEA,kBAAC,GAAD,EACE,IAAI;IACF,OAAO;IACP,OAAO;IACP,QAAQ;IACR,IAAI;IACJ,eAAe;GACjB,EACD,CAAA;EACM,CAAA,CACC;MAEZ,kBAAC,GAAD;EAAK,IAAI;GAAE,iBAAiB;GAAY,GAAG;EAAO;YAAI;CAAa,CAAA,EAErE,CAAA;AAEN"}
|