synapse-react-client 4.0.17 → 4.0.19
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/README.md +5 -3
- package/dist/SWC.index.d.ts +2 -0
- package/dist/SWC.index.d.ts.map +1 -1
- package/dist/SWC.index.js +3 -1
- package/dist/SWC.index.js.map +1 -1
- package/dist/assets/homepage/BlinkingLiveIcon.d.ts +1 -1
- package/dist/components/AccessRequirementAclEditor/AccessRequirementAclEditor.d.ts.map +1 -1
- package/dist/components/AccessRequirementAclEditor/AccessRequirementAclEditor.js.map +1 -1
- package/dist/components/AccessRequirementList/AccessRequirementList.js.map +1 -1
- package/dist/components/AccessRequirementList/RequirementItem/CertificationRequirement.js.map +1 -1
- package/dist/components/AccessRequirementList/RequirementItem/SelfSignAccessRequirementItem.js.map +1 -1
- package/dist/components/AccessRequirementList/RequirementItem/UnmanagedACTAccessRequirementItem.js.map +1 -1
- package/dist/components/AccessRequirementList/RequirementItem/ValidationRequirement.js.map +1 -1
- package/dist/components/AccessTokenPage/CreateAccessTokenModal.d.ts.map +1 -1
- package/dist/components/AccessTokenPage/CreateAccessTokenModal.js +56 -54
- package/dist/components/AccessTokenPage/CreateAccessTokenModal.js.map +1 -1
- package/dist/components/Authentication/PasswordField.d.ts +1 -1
- package/dist/components/Authentication/PasswordField.d.ts.map +1 -1
- package/dist/components/Authentication/PasswordField.js.map +1 -1
- package/dist/components/Authentication/TwoFactorEnrollmentForm.d.ts.map +1 -1
- package/dist/components/Authentication/TwoFactorEnrollmentForm.js +1 -2
- package/dist/components/Authentication/TwoFactorEnrollmentForm.js.map +1 -1
- package/dist/components/Authentication/UsernamePasswordForm.d.ts.map +1 -1
- package/dist/components/Authentication/UsernamePasswordForm.js +32 -29
- package/dist/components/Authentication/UsernamePasswordForm.js.map +1 -1
- package/dist/components/CardContainer/CardLink.d.ts +2 -2
- package/dist/components/CardContainer/CardLink.d.ts.map +1 -1
- package/dist/components/CardDeck/CardDeckCardProps.d.ts.map +1 -1
- package/dist/components/ChallengeSubmission/SubmissionDirectoryList.js.map +1 -1
- package/dist/components/ChallengeTeamWizard/CreateChallengeTeam.d.ts.map +1 -1
- package/dist/components/ChallengeTeamWizard/CreateChallengeTeam.js +106 -103
- package/dist/components/ChallengeTeamWizard/CreateChallengeTeam.js.map +1 -1
- package/dist/components/ChallengeTeamWizard/MembershipRequestForm.d.ts.map +1 -1
- package/dist/components/ChallengeTeamWizard/MembershipRequestForm.js.map +1 -1
- package/dist/components/ChallengeTeamWizard/useCreateAndRegisterChallengeTeam.d.ts.map +1 -1
- package/dist/components/ChallengeTeamWizard/useCreateAndRegisterChallengeTeam.js.map +1 -1
- package/dist/components/CreateProjectModal/CreateProjectModal.d.ts.map +1 -1
- package/dist/components/CreateProjectModal/CreateProjectModal.js +4 -4
- package/dist/components/CreateProjectModal/CreateProjectModal.js.map +1 -1
- package/dist/components/CreateTableViewWizard/TableNameForm.js +6 -6
- package/dist/components/CreateTableViewWizard/TableNameForm.js.map +1 -1
- package/dist/components/CrispChat/CrispChat.js +4 -4
- package/dist/components/CrispChat/CrispChat.js.map +1 -1
- package/dist/components/DataExplorer/DataExplorer.css +1 -0
- package/dist/components/DataExplorer/DataExplorer.d.ts +13 -0
- package/dist/components/DataExplorer/DataExplorer.d.ts.map +1 -0
- package/dist/components/DataExplorer/DataExplorer.js +119 -0
- package/dist/components/DataExplorer/DataExplorer.js.map +1 -0
- package/dist/components/DataExplorer/DataExplorer.module.js +22 -0
- package/dist/components/DataExplorer/DataExplorer.module.js.map +1 -0
- package/dist/components/DataExplorer/DataExplorer.module.scss +156 -0
- package/dist/components/DataGrid/columns/AutocompleteColumn.d.ts.map +1 -1
- package/dist/components/DataGrid/columns/AutocompleteColumn.js +106 -102
- package/dist/components/DataGrid/columns/AutocompleteColumn.js.map +1 -1
- package/dist/components/DataGrid/columns/AutocompleteMultipleEnumColumn.d.ts.map +1 -1
- package/dist/components/DataGrid/columns/AutocompleteMultipleEnumColumn.js +97 -89
- package/dist/components/DataGrid/columns/AutocompleteMultipleEnumColumn.js.map +1 -1
- package/dist/components/DataGrid/columns/useGridAutocompleteState.d.ts +19 -8
- package/dist/components/DataGrid/columns/useGridAutocompleteState.d.ts.map +1 -1
- package/dist/components/DataGrid/columns/useGridAutocompleteState.js +64 -43
- package/dist/components/DataGrid/columns/useGridAutocompleteState.js.map +1 -1
- package/dist/components/DataGrid/components/UploadCsvToGridDialog.d.ts.map +1 -1
- package/dist/components/DataGrid/components/UploadCsvToGridDialog.js +9 -9
- package/dist/components/DataGrid/components/UploadCsvToGridDialog.js.map +1 -1
- package/dist/components/DataGrid/hooks/useGetSchemaForGrid.d.ts.map +1 -1
- package/dist/components/DataGrid/hooks/useGetSchemaForGrid.js +8 -1
- package/dist/components/DataGrid/hooks/useGetSchemaForGrid.js.map +1 -1
- package/dist/components/DataGrid/utils/json-rx/JsonRxResponseComplete.js.map +1 -1
- package/dist/components/DownloadCart/RequestDownloadCard.js +14 -14
- package/dist/components/DownloadCart/RequestDownloadCard.js.map +1 -1
- package/dist/components/EntityAclEditor/EntityAclEditor.d.ts.map +1 -1
- package/dist/components/EntityAclEditor/EntityAclEditor.js.map +1 -1
- package/dist/components/EntityBadgeIcons/EntityBadgeIcons.d.ts.map +1 -1
- package/dist/components/EntityBadgeIcons/EntityBadgeIcons.js.map +1 -1
- package/dist/components/EntityCitation/EntityCitationUtils.js.map +1 -1
- package/dist/components/EntityDownloadConfirmation/EntityDownloadConfirmation.js.map +1 -1
- package/dist/components/EntityFinder/EntityFinder.js.map +1 -1
- package/dist/components/EntityFinder/EntityIdTextField.d.ts +17 -0
- package/dist/components/EntityFinder/EntityIdTextField.d.ts.map +1 -0
- package/dist/components/EntityFinder/EntityIdTextField.js +35 -0
- package/dist/components/EntityFinder/EntityIdTextField.js.map +1 -0
- package/dist/components/Evaluation/round_limits/EvaluationRoundLimitOptions.d.ts.map +1 -1
- package/dist/components/Evaluation/round_limits/EvaluationRoundLimitOptions.js +22 -16
- package/dist/components/Evaluation/round_limits/EvaluationRoundLimitOptions.js.map +1 -1
- package/dist/components/FeaturedDataTabs/FacetPlotsCardGrid.js.map +1 -1
- package/dist/components/Forum/ForumThreadEditor.js.map +1 -1
- package/dist/components/FullWidthAlert/FullWidthAlert.d.ts.map +1 -1
- package/dist/components/FullWidthAlert/FullWidthAlert.js.map +1 -1
- package/dist/components/GenericCard/PortalDOI/PortalDOIUtils.d.ts.map +1 -1
- package/dist/components/GenericCard/PortalDOI/PortalDOIUtils.js.map +1 -1
- package/dist/components/Markdown/widget/MarkdownSynapsePlot.js.map +1 -1
- package/dist/components/OAuthClientAclEditor/OAuthClientAclEditor.d.ts.map +1 -1
- package/dist/components/OAuthClientAclEditor/OAuthClientAclEditor.js.map +1 -1
- package/dist/components/PortalAclEditor/PortalAclEditor.d.ts.map +1 -1
- package/dist/components/PortalAclEditor/PortalAclEditor.js.map +1 -1
- package/dist/components/PortalHomePageHeader/PortalHomePageHeader.d.ts +1 -1
- package/dist/components/PortalHomePageHeader/PortalHomePageHeader.d.ts.map +1 -1
- package/dist/components/PortalHomePageHeader/PortalHomePageHeader.js +1 -1
- package/dist/components/PortalHomePageHeader/PortalHomePageHeader.js.map +1 -1
- package/dist/components/PortalList/CreatePortalModal.d.ts.map +1 -1
- package/dist/components/PortalList/CreatePortalModal.js +34 -33
- package/dist/components/PortalList/CreatePortalModal.js.map +1 -1
- package/dist/components/QueryVisualizationWrapper/QueryVisualizationWrapper.d.ts.map +1 -1
- package/dist/components/QueryVisualizationWrapper/QueryVisualizationWrapper.js +67 -65
- package/dist/components/QueryVisualizationWrapper/QueryVisualizationWrapper.js.map +1 -1
- package/dist/components/QueryWrapperPlotNav/QueryWrapperPlotNav.d.ts +1 -1
- package/dist/components/QueryWrapperPlotNav/QueryWrapperPlotNav.d.ts.map +1 -1
- package/dist/components/QueryWrapperPlotNav/QueryWrapperPlotNav.js +1 -0
- package/dist/components/QueryWrapperPlotNav/QueryWrapperPlotNav.js.map +1 -1
- package/dist/components/QueryWrapperPlotNav/RowSetView.d.ts.map +1 -1
- package/dist/components/QueryWrapperPlotNav/RowSetView.js.map +1 -1
- package/dist/components/Resources/Resources.Desktop.js.map +1 -1
- package/dist/components/SearchQueryWrapper/SearchQueryUseQueryOptions.js.map +1 -1
- package/dist/components/SearchQueryWrapperPlotNav/SearchQueryWrapperPlotNav.d.ts +1 -1
- package/dist/components/SearchQueryWrapperPlotNav/SearchQueryWrapperPlotNav.d.ts.map +1 -1
- package/dist/components/SearchQueryWrapperPlotNav/SearchQueryWrapperPlotNav.js +1 -0
- package/dist/components/SearchQueryWrapperPlotNav/SearchQueryWrapperPlotNav.js.map +1 -1
- package/dist/components/SetAccessRequirementCommonFields/SetAccessRequirementCommonFields.d.ts.map +1 -1
- package/dist/components/SetAccessRequirementCommonFields/SetAccessRequirementCommonFields.js.map +1 -1
- package/dist/components/SetBasicAccessRequirementFields/SetBasicAccessRequirementFields.d.ts.map +1 -1
- package/dist/components/SetBasicAccessRequirementFields/SetBasicAccessRequirementFields.js.map +1 -1
- package/dist/components/SetManagedAccessRequirementFields/SetManagedAccessRequirementFields.d.ts.map +1 -1
- package/dist/components/SetManagedAccessRequirementFields/SetManagedAccessRequirementFields.js.map +1 -1
- package/dist/components/StandaloneQueryWrapper/StandaloneQueryWrapper.d.ts +1 -1
- package/dist/components/StandaloneQueryWrapper/StandaloneQueryWrapper.d.ts.map +1 -1
- package/dist/components/StandaloneQueryWrapper/StandaloneQueryWrapper.js.map +1 -1
- package/dist/components/SynapseChat/SynapseChatInteraction.js.map +1 -1
- package/dist/components/SynapsePortalBanners/SynapsePortalBanners.d.ts.map +1 -1
- package/dist/components/SynapsePortalBanners/SynapsePortalBanners.js +1 -1
- package/dist/components/SynapsePortalBanners/SynapsePortalBanners.js.map +1 -1
- package/dist/components/SynapseTable/SearchV2.js.map +1 -1
- package/dist/components/SynapseTable/SynapseTable.js.map +1 -1
- package/dist/components/SynapseTable/SynapseTableUtils.d.ts.map +1 -1
- package/dist/components/SynapseTable/SynapseTableUtils.js.map +1 -1
- package/dist/components/SynapseTable/datasets/DatasetItemsEditor.js.map +1 -1
- package/dist/components/TableColumnSchemaEditor/ColumnModelForm.js +9 -9
- package/dist/components/TableColumnSchemaEditor/ColumnModelForm.js.map +1 -1
- package/dist/components/TableColumnSchemaEditor/ColumnModelFormFields/MultiValueField.js +4 -4
- package/dist/components/TableColumnSchemaEditor/TableColumnSchemaForm.d.ts.map +1 -1
- package/dist/components/TableColumnSchemaEditor/TableColumnSchemaForm.js +25 -25
- package/dist/components/TableColumnSchemaEditor/TableColumnSchemaForm.js.map +1 -1
- package/dist/components/TanStackTable/TanStackTableUtils.js.map +1 -1
- package/dist/components/TextField/TextField.css +1 -1
- package/dist/components/TextField/TextField.d.ts +14 -3
- package/dist/components/TextField/TextField.d.ts.map +1 -1
- package/dist/components/TextField/TextField.js +41 -43
- package/dist/components/TextField/TextField.js.map +1 -1
- package/dist/components/TextField/TextField.module.js +3 -4
- package/dist/components/TextField/TextField.module.js.map +1 -1
- package/dist/components/TextField/TextField.module.scss +18 -10
- package/dist/components/TimelinePlot/TimelinePlotSpeciesSelector.d.ts.map +1 -1
- package/dist/components/TimelinePlot/TimelinePlotSpeciesSelector.js +20 -16
- package/dist/components/TimelinePlot/TimelinePlotSpeciesSelector.js.map +1 -1
- package/dist/components/UserCardList/UserCardList.d.ts.map +1 -1
- package/dist/components/UserCardList/UserCardList.js.map +1 -1
- package/dist/components/UserCardList/UserCardListGroups/UserCardListGroups.Desktop.js.map +1 -1
- package/dist/components/UserOrTeamBadge/useUserOrTeam.js.map +1 -1
- package/dist/components/UserSearchBox/UserSearchBox.d.ts.map +1 -1
- package/dist/components/UserSearchBox/UserSearchBox.js.map +1 -1
- package/dist/components/WikiMarkdownEditorButton/WikiMarkdownEditorButton.js.map +1 -1
- package/dist/components/dataaccess/SubmissionPage/SubmissionPage.js.map +1 -1
- package/dist/components/doi/CreateOrUpdateDoiModal.js +13 -13
- package/dist/components/doi/CreateOrUpdateDoiModal.js.map +1 -1
- package/dist/components/entity/page/title_bar/TitleBarProperties.js +23 -23
- package/dist/components/entity/page/title_bar/TitleBarProperties.js.map +1 -1
- package/dist/components/entity/page/title_bar/useGetMentions.js.map +1 -1
- package/dist/components/index.js +17 -17
- package/dist/components/styled/StyledFormControl.d.ts +15 -0
- package/dist/components/styled/StyledFormControl.d.ts.map +1 -1
- package/dist/components/styled/StyledFormControl.js +1 -0
- package/dist/components/styled/StyledFormControl.js.map +1 -1
- package/dist/components/styled/index.js +3 -3
- package/dist/components/table/CsvPreview/CreateTableFromCsvDialog.d.ts +18 -0
- package/dist/components/table/CsvPreview/CreateTableFromCsvDialog.d.ts.map +1 -0
- package/dist/components/table/CsvPreview/CreateTableFromCsvDialog.js +116 -0
- package/dist/components/table/CsvPreview/CreateTableFromCsvDialog.js.map +1 -0
- package/dist/components/table/CsvPreview/CsvPreviewDialog.d.ts +5 -5
- package/dist/components/table/CsvPreview/CsvPreviewDialog.d.ts.map +1 -1
- package/dist/components/table/CsvPreview/CsvPreviewDialog.js +27 -76
- package/dist/components/table/CsvPreview/CsvPreviewDialog.js.map +1 -1
- package/dist/components/table/CsvPreview/CsvPreviewWithOptions.d.ts +19 -0
- package/dist/components/table/CsvPreview/CsvPreviewWithOptions.d.ts.map +1 -0
- package/dist/components/table/CsvPreview/CsvPreviewWithOptions.js +41 -0
- package/dist/components/table/CsvPreview/CsvPreviewWithOptions.js.map +1 -0
- package/dist/components/table/CsvPreview/CsvUploadPreviewContent.d.ts +12 -0
- package/dist/components/table/CsvPreview/CsvUploadPreviewContent.d.ts.map +1 -0
- package/dist/components/table/CsvPreview/CsvUploadPreviewContent.js +25 -0
- package/dist/components/table/CsvPreview/CsvUploadPreviewContent.js.map +1 -0
- package/dist/components/table/CsvPreview/UpdateTableWithCsvDialog.d.ts +18 -0
- package/dist/components/table/CsvPreview/UpdateTableWithCsvDialog.d.ts.map +1 -0
- package/dist/components/table/CsvPreview/UpdateTableWithCsvDialog.js +55 -0
- package/dist/components/table/CsvPreview/UpdateTableWithCsvDialog.js.map +1 -0
- package/dist/components/table/CsvPreview/useCreateTableFromCsv.d.ts +19 -0
- package/dist/components/table/CsvPreview/useCreateTableFromCsv.d.ts.map +1 -0
- package/dist/components/table/CsvPreview/useCreateTableFromCsv.js +35 -0
- package/dist/components/table/CsvPreview/useCreateTableFromCsv.js.map +1 -0
- package/dist/components/table/CsvPreview/useCsvUploadPreview.d.ts +22 -0
- package/dist/components/table/CsvPreview/useCsvUploadPreview.d.ts.map +1 -0
- package/dist/components/table/CsvPreview/useCsvUploadPreview.js +32 -0
- package/dist/components/table/CsvPreview/useCsvUploadPreview.js.map +1 -0
- package/dist/components/table/CsvPreview/useUploadCsvToExistingTable.d.ts +14 -0
- package/dist/components/table/CsvPreview/useUploadCsvToExistingTable.d.ts.map +1 -0
- package/dist/components/table/CsvPreview/useUploadCsvToExistingTable.js +23 -0
- package/dist/components/table/CsvPreview/useUploadCsvToExistingTable.js.map +1 -0
- package/dist/components/utils/ConditionalWrapper.d.ts.map +1 -1
- package/dist/components/utils/ConditionalWrapper.js.map +1 -1
- package/dist/components/widgets/ElementWithTooltip.js.map +1 -1
- package/dist/components/widgets/facet-nav/FacetNavPanel.d.ts.map +1 -1
- package/dist/components/widgets/facet-nav/FacetNavPanel.js +69 -62
- package/dist/components/widgets/facet-nav/FacetNavPanel.js.map +1 -1
- package/dist/components/widgets/query-filter/EnumFacetFilter/EnumFacetFilter.d.ts +1 -0
- package/dist/components/widgets/query-filter/EnumFacetFilter/EnumFacetFilter.d.ts.map +1 -1
- package/dist/components/widgets/query-filter/EnumFacetFilter/EnumFacetFilter.js +27 -26
- package/dist/components/widgets/query-filter/EnumFacetFilter/EnumFacetFilter.js.map +1 -1
- package/dist/components/widgets/query-filter/EnumFacetFilter/EnumFacetFilterDropdown.d.ts +1 -0
- package/dist/components/widgets/query-filter/EnumFacetFilter/EnumFacetFilterDropdown.d.ts.map +1 -1
- package/dist/components/widgets/query-filter/EnumFacetFilter/EnumFacetFilterDropdown.js +2 -1
- package/dist/components/widgets/query-filter/EnumFacetFilter/EnumFacetFilterDropdown.js.map +1 -1
- package/dist/components/widgets/query-filter/EnumFacetFilter/EnumFacetFilterUI.d.ts +1 -0
- package/dist/components/widgets/query-filter/EnumFacetFilter/EnumFacetFilterUI.d.ts.map +1 -1
- package/dist/components/widgets/query-filter/EnumFacetFilter/EnumFacetFilterUI.js +44 -43
- package/dist/components/widgets/query-filter/EnumFacetFilter/EnumFacetFilterUI.js.map +1 -1
- package/dist/features/entity/metadata-task/components/CreateOrUpdateCurationTaskDialog.d.ts +13 -0
- package/dist/features/entity/metadata-task/components/CreateOrUpdateCurationTaskDialog.d.ts.map +1 -0
- package/dist/features/entity/metadata-task/components/CreateOrUpdateCurationTaskDialog.js +398 -0
- package/dist/features/entity/metadata-task/components/CreateOrUpdateCurationTaskDialog.js.map +1 -0
- package/dist/features/entity/metadata-task/components/MetadataTaskTableActionCell.d.ts.map +1 -1
- package/dist/features/entity/metadata-task/components/MetadataTaskTableActionCell.js +49 -19
- package/dist/features/entity/metadata-task/components/MetadataTaskTableActionCell.js.map +1 -1
- package/dist/features/entity/metadata-task/components/MetadataTasksPage.d.ts.map +1 -1
- package/dist/features/entity/metadata-task/components/MetadataTasksPage.js +49 -25
- package/dist/features/entity/metadata-task/components/MetadataTasksPage.js.map +1 -1
- package/dist/features/entity/metadata-task/hooks/useGridSessionForCurationTask.d.ts +0 -1
- package/dist/features/entity/metadata-task/hooks/useGridSessionForCurationTask.d.ts.map +1 -1
- package/dist/features/entity/metadata-task/hooks/useGridSessionForCurationTask.js +20 -22
- package/dist/features/entity/metadata-task/hooks/useGridSessionForCurationTask.js.map +1 -1
- package/dist/features/entity/metadata-task/hooks/useOpenCuratorButton.d.ts.map +1 -1
- package/dist/features/entity/metadata-task/hooks/useOpenCuratorButton.js +25 -27
- package/dist/features/entity/metadata-task/hooks/useOpenCuratorButton.js.map +1 -1
- package/dist/features/entity/metadata-task/utils/constants.d.ts +29 -0
- package/dist/features/entity/metadata-task/utils/constants.d.ts.map +1 -1
- package/dist/features/entity/metadata-task/utils/constants.js +2 -2
- package/dist/features/entity/metadata-task/utils/constants.js.map +1 -1
- package/dist/index.js +17 -17
- package/dist/mockServiceWorker.js +6 -8
- package/dist/mocks/curation/mockCurationTask.d.ts +2 -2
- package/dist/mocks/curation/mockCurationTask.d.ts.map +1 -1
- package/dist/mocks/curation/mockCurationTask.js +9 -5
- package/dist/mocks/curation/mockCurationTask.js.map +1 -1
- package/dist/mocks/msw/handlers/featureFlagHandlers.d.ts +1 -1
- package/dist/mocks/msw/handlers/featureFlagHandlers.d.ts.map +1 -1
- package/dist/mocks/msw/handlers/featureFlagHandlers.js +1 -1
- package/dist/mocks/msw/handlers/featureFlagHandlers.js.map +1 -1
- package/dist/style/components/_cards.scss +0 -3
- package/dist/style/components/_data-grid-extra.scss +2 -2
- package/dist/style/components/_login.scss +6 -2
- package/dist/style/main.css +1 -1
- package/dist/synapse-client/SynapseClient.d.ts +2 -1
- package/dist/synapse-client/SynapseClient.d.ts.map +1 -1
- package/dist/synapse-client/SynapseClient.js.map +1 -1
- package/dist/synapse-queries/QueryFilterUtils.js.map +1 -1
- package/dist/synapse-queries/curation/task/useCurationTask.d.ts +1 -0
- package/dist/synapse-queries/curation/task/useCurationTask.d.ts.map +1 -1
- package/dist/synapse-queries/curation/task/useCurationTask.js +16 -6
- package/dist/synapse-queries/curation/task/useCurationTask.js.map +1 -1
- package/dist/synapse-queries/dataaccess/useAccessRequirements.d.ts.map +1 -1
- package/dist/synapse-queries/dataaccess/useAccessRequirements.js.map +1 -1
- package/dist/synapse-queries/entity/useGetQueryResultBundle.js.map +1 -1
- package/dist/synapse-queries/featureflags/useGetFeatureFlag.d.ts +1 -1
- package/dist/synapse-queries/featureflags/useGetFeatureFlag.d.ts.map +1 -1
- package/dist/synapse-queries/featureflags/useGetFeatureFlag.js.map +1 -1
- package/dist/synapse-queries/file/useFiles.d.ts.map +1 -1
- package/dist/synapse-queries/file/useFiles.js.map +1 -1
- package/dist/synapse-queries/termsOfService/useTermsOfService.d.ts.map +1 -1
- package/dist/synapse-queries/termsOfService/useTermsOfService.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/testutils/ReactQueryMockUtils.js.map +1 -1
- package/dist/theme/palette/Palettes.d.ts +2 -2
- package/dist/theme/palette/Palettes.d.ts.map +1 -1
- package/dist/theme/palette/Palettes.js +2 -2
- package/dist/theme/palette/Palettes.js.map +1 -1
- package/dist/tsconfig.build.tsbuildinfo +1 -1
- package/dist/types/ThemeTypes.d.ts +5 -6
- package/dist/utils/AppUtils/session/SynapseSessionManager.d.ts.map +1 -1
- package/dist/utils/AppUtils/session/SynapseSessionManager.js.map +1 -1
- package/dist/utils/featureflag/FeatureFlags.d.ts +13 -0
- package/dist/utils/featureflag/FeatureFlags.d.ts.map +1 -0
- package/dist/utils/featureflag/FeatureFlags.js +8 -0
- package/dist/utils/featureflag/FeatureFlags.js.map +1 -0
- package/dist/utils/functions/SanitizeHtmlUtils.js.map +1 -1
- package/dist/utils/functions/queryUtils.js.map +1 -1
- package/dist/utils/hooks/useGetInfoFromIds.d.ts.map +1 -1
- package/dist/utils/hooks/useGetInfoFromIds.js.map +1 -1
- package/dist/utils/slots/SlotUtils.d.ts.map +1 -1
- package/dist/utils/slots/SlotUtils.js.map +1 -1
- package/package.json +5 -6
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CreateOrUpdateDoiModal.js","names":[],"sources":["../../../src/components/doi/CreateOrUpdateDoiModal.tsx"],"sourcesContent":["import ConfirmCloseWithoutSavingDialog from '@/components/Dialog/ConfirmCloseWithoutSavingDialog'\nimport { DialogBase } from '@/components/DialogBase'\nimport { doiFormSchema, doiFormUiSchema } from '@/components/doi/DoiFormSchemas'\nimport { PrivateEntityDoiWarning } from '@/components/doi/PrivateEntityDoiWarning'\nimport { JsonSchemaForm } from '@/components/JsonSchemaForm/JsonSchemaForm'\nimport { MarkdownPopover } from '@/components/Markdown/MarkdownPopover'\nimport { StyledFormControl } from '@/components/styled/StyledFormControl'\nimport { displayToast } from '@/components/ToastMessage/ToastMessage'\nimport { useCreateOrUpdateDOI, useGetDOI } from '@/synapse-queries/doi/useDOI'\nimport { useGetVersions } from '@/synapse-queries/entity/useEntity'\nimport { useGetEntityBundle } from '@/synapse-queries/entity/useEntityBundle'\nimport { useGetPortal } from '@/synapse-queries/portal/usePortal'\nimport { useGetRealmPrincipals } from '@/synapse-queries/realm/useRealmPrincipals'\nimport { useGetCurrentUserProfile } from '@/synapse-queries/user/useUserBundle'\nimport { useGlobalIsEditingContext } from '@/utils/context/GlobalIsEditingContext'\nimport { isEntityPublic } from '@/utils/functions/AccessControlListUtils'\nimport {\n entityTypeToFriendlyName,\n isDataset,\n isTable,\n isVersionableEntity,\n} from '@/utils/functions/EntityTypeUtils'\nimport {\n BackendDestinationEnum,\n getEndpoint,\n} from '@/utils/functions/getEndpoint'\nimport { DATA_CATALOG_PATH_SEGMENT } from '@/utils/SynapseConstants'\nimport { HelpTwoTone } from '@mui/icons-material'\nimport {\n Alert,\n Button,\n InputLabel,\n Link,\n MenuItem,\n Select,\n TextField,\n Typography,\n} from '@mui/material'\nimport RJSF from '@rjsf/core'\nimport {\n DoiObjectType,\n DoiResourceTypeGeneral,\n DoiResourceTypeResourceTypeGeneralEnum,\n EntityType,\n V2Doi,\n} from '@sage-bionetworks/synapse-client'\nimport { isEmpty } from 'lodash-es'\nimport { useEffect, useMemo, useRef, useState } from 'react'\nimport { SynapseSpinner } from '../LoadingScreen/LoadingScreen'\n\ntype CreateOrUpdateDoiModalStep = 'warning' | 'form'\n\nexport type CreateOrUpdateDoiModalProps = {\n /** Whether the dialog is open */\n open: boolean\n /** Callback to call when the dialog is closed */\n onClose: () => void\n /** The type of object */\n objectType: DoiObjectType\n /** The ID of the object */\n objectId: string\n /** The optional version number of the object used to populate the form. */\n defaultVersionNumber?: number\n /** If minting a DOI for a portal, the ID of the portal object in Synapse */\n portalId?: string\n}\n\ntype DoiFormData = {\n titles?: string[]\n creators?: string[]\n resourceTypeGeneral?: DoiResourceTypeResourceTypeGeneralEnum\n publicationYear?: number\n}\n\nfunction getSuggestedResourceTypeGeneral(\n type: EntityType,\n): DoiResourceTypeGeneral {\n if (type === EntityType.project || type === EntityType.folder) {\n return DoiResourceTypeGeneral.Collection\n } else {\n return DoiResourceTypeGeneral.Dataset\n }\n}\n\nfunction convertDoiToFormData(doi: V2Doi): DoiFormData {\n return {\n titles: (doi.titles || []).map(title => title.title!),\n creators: (doi.creators || []).map(creator => creator.creatorName!),\n resourceTypeGeneral: doi.resourceType?.resourceTypeGeneral,\n publicationYear: doi.publicationYear,\n }\n}\n\n/**\n * Returns true if the DOI has fields that are not exposed in the UI, so we can let the user know that any changes\n * may be destructive to hidden fields.\n */\nfunction getWasModifiedViaAPI(doi: V2Doi) {\n if (doi.creators?.some(creator => !isEmpty(creator.nameIdentifiers))) {\n return true\n }\n return false\n}\n\nfunction convertFormDataToDoi(formData: DoiFormData): V2Doi {\n return {\n titles: formData.titles?.map(title => ({ title })) || [],\n creators:\n formData.creators?.map(creator => ({ creatorName: creator })) || [],\n resourceType: {\n resourceTypeGeneral: formData.resourceTypeGeneral,\n },\n publicationYear: formData.publicationYear,\n }\n}\n\nexport function CreateOrUpdateDoiModal(props: CreateOrUpdateDoiModalProps) {\n const {\n open,\n onClose,\n objectType,\n objectId,\n defaultVersionNumber,\n portalId,\n } = props\n\n const [showConfirmCloseModal, setShowConfirmCloseDialog] = useState(false)\n const [currentStep, setCurrentStep] =\n useState<CreateOrUpdateDoiModalStep | null>(null)\n const hasSetInitialStepForThisSession = useRef(false)\n const { isEditing, setIsEditing } = useGlobalIsEditingContext()\n useEffect(() => {\n setIsEditing(open)\n\n return () => {\n setIsEditing(false)\n }\n }, [open, setIsEditing])\n\n function handleClose() {\n if (isEditing) {\n setShowConfirmCloseDialog(true)\n } else {\n onClose()\n }\n }\n\n const [selectedVersionNumber, setSelectedVersionNumber] =\n useState(defaultVersionNumber)\n\n const { data: portal } = useGetPortal(portalId!, {\n enabled: Boolean(portalId),\n })\n\n const [formData, setFormData] = useState<DoiFormData>({\n titles: [''],\n creators: [''],\n })\n const { data: currentUser, isLoading: isLoadingCurrentUser } =\n useGetCurrentUserProfile()\n const { data: entityBundle, isLoading: isLoadingEntity } = useGetEntityBundle(\n objectId,\n selectedVersionNumber,\n {\n includeEntity: true,\n includeBenefactorACL: true,\n },\n {\n enabled: objectType === DoiObjectType.ENTITY,\n staleTime: Infinity,\n throwOnError: true,\n },\n )\n const { data: realmPrincipals, isLoading: isLoadingRealmPrincipals } =\n useGetRealmPrincipals()\n const { data: doi, isLoading: isLoadingDoi } = useGetDOI(\n {\n id: objectId,\n version: selectedVersionNumber,\n type: objectType,\n portalId: portalId,\n },\n {\n staleTime: Infinity,\n throwOnError: true,\n },\n )\n\n const shouldShowWarning = useMemo(() => {\n if (objectType !== DoiObjectType.ENTITY) {\n return false\n }\n return (\n open &&\n doi === null && // Creating new DOI\n entityBundle?.benefactorAcl &&\n realmPrincipals &&\n !isEntityPublic(\n entityBundle.benefactorAcl.resourceAccess,\n realmPrincipals,\n )\n )\n }, [open, doi, entityBundle, realmPrincipals, objectType])\n\n useEffect(() => {\n if (\n open &&\n !hasSetInitialStepForThisSession.current &&\n doi !== undefined && // Wait for DOI query to resolve before determining step\n shouldShowWarning !== undefined\n ) {\n const newStep = shouldShowWarning ? 'warning' : 'form'\n setCurrentStep(newStep)\n hasSetInitialStepForThisSession.current = true\n } else if (!open) {\n setCurrentStep(null)\n hasSetInitialStepForThisSession.current = false\n }\n }, [shouldShowWarning, open, doi])\n\n const doiCanBeAppliedToVersion =\n objectType === DoiObjectType.ENTITY &&\n entityBundle?.entity &&\n isVersionableEntity(entityBundle.entity)\n\n const { data: entityVersions } = useGetVersions(\n objectId,\n undefined,\n undefined,\n {\n enabled: doiCanBeAppliedToVersion,\n },\n )\n const formRef = useRef<RJSF>(null)\n\n const entityType = entityBundle?.entityType ?? EntityType.file\n const entityTypeDisplay = entityTypeToFriendlyName(entityType)\n let versionHelpMarkdown = `A DOI can be associated with a specific version of this ${entityTypeDisplay}.\n \n Versioned DOIs will link to the specified version of the ${entityTypeDisplay}.\n \n A DOI without a version will always link to the newest version of this ${entityTypeDisplay},\n so the data that someone retrieves using the DOI may change over time.`\n if (entityBundle?.entity && isTable(entityBundle.entity)) {\n const tableVersionCopy = isDataset(entityBundle.entity)\n ? 'version'\n : 'snapshot'\n versionHelpMarkdown += `\\n\\nTo create a DOI that will always link to the current set of data in the ${entityTypeDisplay},\n create a new ${tableVersionCopy} and mint a DOI for that ${tableVersionCopy}.`\n }\n\n const {\n mutate: createOrUpdateDoi,\n isPending: updateIsPending,\n error: updateDoiError,\n } = useCreateOrUpdateDOI({\n onSuccess: () => {\n displayToast('The DOI was successfully updated.', 'success')\n onClose()\n },\n })\n\n const isLoading =\n updateIsPending ||\n isLoadingCurrentUser ||\n isLoadingEntity ||\n isLoadingDoi ||\n isLoadingRealmPrincipals\n\n const wasModifiedViaAPI = Boolean(doi && getWasModifiedViaAPI(doi))\n\n useEffect(() => {\n if (doi) {\n setFormData(convertDoiToFormData(doi))\n }\n // If there is no DOI, then pre-fill the form.\n if (currentUser && entityBundle?.entity && doi === null) {\n const newFormData = {\n titles: [entityBundle.entity.name],\n creators: new Array<string>(),\n resourceTypeGeneral: getSuggestedResourceTypeGeneral(\n entityBundle.entityType,\n ),\n publicationYear: new Date().getFullYear(),\n } satisfies DoiFormData\n if (currentUser.lastName && currentUser.firstName) {\n newFormData.creators.push(\n `${currentUser.lastName}, ${currentUser.firstName}`,\n )\n }\n setFormData(newFormData)\n }\n }, [currentUser, doi, entityBundle])\n\n function onSave() {\n if (formRef.current && formRef.current.validateForm()) {\n const requestDoi: V2Doi = convertFormDataToDoi(formData)\n requestDoi.objectType = objectType\n requestDoi.objectId = objectId\n requestDoi.objectVersion = selectedVersionNumber\n requestDoi.etag = doi?.etag\n requestDoi.portalId = portalId\n createOrUpdateDoi({\n doi: requestDoi,\n concreteType: 'org.sagebionetworks.repo.model.doi.v2.DoiRequest',\n })\n }\n }\n\n const dialogContent = (\n <>\n <Typography variant={'body1'} gutterBottom>\n Minting a DOI allows you to credit contributors and makes it easy to\n cite your work.\n </Typography>\n <Typography variant={'body1'} gutterBottom sx={{ mb: 2 }}>\n Note that while the DOI and its associated metadata will be publicly\n visible outside of Synapse, your data will still adhere to its existing\n access conditions. If your data is private, it will remain restricted,\n but the DOI will still be listed. Resources with DOIs may be added to\n the{' '}\n <Link\n href={`${getEndpoint(\n BackendDestinationEnum.PORTAL_ENDPOINT,\n )}${DATA_CATALOG_PATH_SEGMENT}`}\n target=\"_blank\"\n rel=\"noopener\"\n >\n Synapse Data Catalog\n </Link>\n .\n </Typography>\n {portalId && (\n <TextField\n label={'Publisher'}\n fullWidth\n value={portal?.name || ''}\n disabled\n />\n )}\n {doiCanBeAppliedToVersion && (\n <StyledFormControl className=\"limit-type\" fullWidth sx={{ my: 2 }}>\n <InputLabel\n htmlFor=\"doi-version-select\"\n sx={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n width: '100%',\n }}\n >\n <span>Version</span>\n <MarkdownPopover\n contentProps={{ markdown: versionHelpMarkdown }}\n maxWidth=\"350px\"\n >\n <HelpTwoTone className={`HelpButton`} />\n </MarkdownPopover>\n </InputLabel>\n <Select\n id=\"doi-version-select\"\n value={selectedVersionNumber ?? -1}\n onChange={e => {\n if (e.target.value === -1) {\n setSelectedVersionNumber(undefined)\n } else {\n setSelectedVersionNumber(e.target.value)\n }\n }}\n >\n <MenuItem value={-1}>No version</MenuItem>\n {entityVersions &&\n entityVersions.results.map(version => (\n <MenuItem\n key={version.versionNumber}\n value={version.versionNumber}\n >\n Version {version.versionNumber}\n {/* display the version label if it exists & is different from the number itself */}\n {version.versionLabel &&\n version.versionLabel !== String(version.versionNumber)\n ? ` / ${version.versionLabel}`\n : ''}\n </MenuItem>\n ))}\n </Select>\n </StyledFormControl>\n )}\n <div className=\"JsonSchemaFormContainer\">\n <JsonSchemaForm\n formRef={formRef}\n disabled={isLoading || wasModifiedViaAPI}\n schema={doiFormSchema}\n formData={formData}\n onChange={e => {\n setFormData(e.formData)\n }}\n uiSchema={doiFormUiSchema}\n showErrorList={false}\n />\n </div>\n {doi && (\n <Alert severity={'warning'}>\n <Typography variant={'body1'}>\n A DOI has already been created. Updating the DOI information will\n cause old information to be lost!\n </Typography>\n </Alert>\n )}\n {wasModifiedViaAPI && (\n <Alert severity={'warning'} sx={{ my: 1 }}>\n <Typography variant={'body1'}>\n The metadata for this DOI was modified using a programmatic client,\n so data may be hidden from this view. Any changes may result in\n metadata being lost.\n </Typography>\n </Alert>\n )}\n {updateDoiError && (\n <Alert severity={'error'} sx={{ mt: 1 }}>\n <Typography variant={'body1'}>{updateDoiError.message}</Typography>\n </Alert>\n )}\n </>\n )\n\n const dialogActions = (\n <>\n <Button variant=\"outlined\" disabled={isLoading} onClick={handleClose}>\n Cancel\n </Button>\n <Button\n variant=\"contained\"\n disabled={isLoading}\n onClick={\n currentStep === 'warning'\n ? () => setCurrentStep('form')\n : e => {\n // SWC-7055 - The default action may trigger `beforeunload` and erroneously warn the user about leaving the page.\n e.preventDefault()\n onSave()\n }\n }\n >\n {currentStep === 'warning' ? 'Continue' : 'Save'}\n </Button>\n </>\n )\n\n return (\n <>\n <ConfirmCloseWithoutSavingDialog\n open={showConfirmCloseModal}\n onCancel={() => {\n setShowConfirmCloseDialog(false)\n }}\n onConfirm={() => {\n setShowConfirmCloseDialog(false)\n onClose()\n }}\n />\n <DialogBase\n open={open}\n onCancel={handleClose}\n title={\n currentStep === 'warning'\n ? 'This page is private'\n : 'Create or Update a DOI'\n }\n content={\n !currentStep ? (\n <SynapseSpinner />\n ) : (\n <>\n {currentStep === 'warning' && <PrivateEntityDoiWarning />}\n {currentStep === 'form' && dialogContent}\n </>\n )\n }\n actions={dialogActions}\n />\n </>\n )\n}\n\nexport default CreateOrUpdateDoiModal\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"CreateOrUpdateDoiModal.js","names":[],"sources":["../../../src/components/doi/CreateOrUpdateDoiModal.tsx"],"sourcesContent":["import ConfirmCloseWithoutSavingDialog from '@/components/Dialog/ConfirmCloseWithoutSavingDialog'\nimport { DialogBase } from '@/components/DialogBase'\nimport { doiFormSchema, doiFormUiSchema } from '@/components/doi/DoiFormSchemas'\nimport { PrivateEntityDoiWarning } from '@/components/doi/PrivateEntityDoiWarning'\nimport { JsonSchemaForm } from '@/components/JsonSchemaForm/JsonSchemaForm'\nimport { MarkdownPopover } from '@/components/Markdown/MarkdownPopover'\nimport { StyledFormControl } from '@/components/styled/StyledFormControl'\nimport { displayToast } from '@/components/ToastMessage/ToastMessage'\nimport { useCreateOrUpdateDOI, useGetDOI } from '@/synapse-queries/doi/useDOI'\nimport { useGetVersions } from '@/synapse-queries/entity/useEntity'\nimport { useGetEntityBundle } from '@/synapse-queries/entity/useEntityBundle'\nimport { useGetPortal } from '@/synapse-queries/portal/usePortal'\nimport { useGetRealmPrincipals } from '@/synapse-queries/realm/useRealmPrincipals'\nimport { useGetCurrentUserProfile } from '@/synapse-queries/user/useUserBundle'\nimport { useGlobalIsEditingContext } from '@/utils/context/GlobalIsEditingContext'\nimport { isEntityPublic } from '@/utils/functions/AccessControlListUtils'\nimport {\n entityTypeToFriendlyName,\n isDataset,\n isTable,\n isVersionableEntity,\n} from '@/utils/functions/EntityTypeUtils'\nimport {\n BackendDestinationEnum,\n getEndpoint,\n} from '@/utils/functions/getEndpoint'\nimport { DATA_CATALOG_PATH_SEGMENT } from '@/utils/SynapseConstants'\nimport { HelpTwoTone } from '@mui/icons-material'\nimport {\n Alert,\n Button,\n InputLabel,\n Link,\n MenuItem,\n Select,\n TextField,\n Typography,\n} from '@mui/material'\nimport RJSF from '@rjsf/core'\nimport {\n DoiObjectType,\n DoiResourceTypeGeneral,\n DoiResourceTypeResourceTypeGeneralEnum,\n EntityType,\n V2Doi,\n} from '@sage-bionetworks/synapse-client'\nimport { isEmpty } from 'lodash-es'\nimport { useEffect, useMemo, useRef, useState } from 'react'\nimport { SynapseSpinner } from '../LoadingScreen/LoadingScreen'\n\ntype CreateOrUpdateDoiModalStep = 'warning' | 'form'\n\nexport type CreateOrUpdateDoiModalProps = {\n /** Whether the dialog is open */\n open: boolean\n /** Callback to call when the dialog is closed */\n onClose: () => void\n /** The type of object */\n objectType: DoiObjectType\n /** The ID of the object */\n objectId: string\n /** The optional version number of the object used to populate the form. */\n defaultVersionNumber?: number\n /** If minting a DOI for a portal, the ID of the portal object in Synapse */\n portalId?: string\n}\n\ntype DoiFormData = {\n titles?: string[]\n creators?: string[]\n resourceTypeGeneral?: DoiResourceTypeResourceTypeGeneralEnum\n publicationYear?: number\n}\n\nfunction getSuggestedResourceTypeGeneral(\n type: EntityType,\n): DoiResourceTypeGeneral {\n if (type === EntityType.project || type === EntityType.folder) {\n return DoiResourceTypeGeneral.Collection\n } else {\n return DoiResourceTypeGeneral.Dataset\n }\n}\n\nfunction convertDoiToFormData(doi: V2Doi): DoiFormData {\n return {\n titles: (doi.titles || []).map(title => title.title!),\n creators: (doi.creators || []).map(creator => creator.creatorName!),\n resourceTypeGeneral: doi.resourceType?.resourceTypeGeneral,\n publicationYear: doi.publicationYear,\n }\n}\n\n/**\n * Returns true if the DOI has fields that are not exposed in the UI, so we can let the user know that any changes\n * may be destructive to hidden fields.\n */\nfunction getWasModifiedViaAPI(doi: V2Doi) {\n if (doi.creators?.some(creator => !isEmpty(creator.nameIdentifiers))) {\n return true\n }\n return false\n}\n\nfunction convertFormDataToDoi(formData: DoiFormData): V2Doi {\n return {\n titles: formData.titles?.map(title => ({ title })) || [],\n creators:\n formData.creators?.map(creator => ({ creatorName: creator })) || [],\n resourceType: {\n resourceTypeGeneral: formData.resourceTypeGeneral,\n },\n publicationYear: formData.publicationYear,\n }\n}\n\nexport function CreateOrUpdateDoiModal(props: CreateOrUpdateDoiModalProps) {\n const {\n open,\n onClose,\n objectType,\n objectId,\n defaultVersionNumber,\n portalId,\n } = props\n\n const [showConfirmCloseModal, setShowConfirmCloseDialog] = useState(false)\n const [currentStep, setCurrentStep] =\n useState<CreateOrUpdateDoiModalStep | null>(null)\n const hasSetInitialStepForThisSession = useRef(false)\n const { isEditing, setIsEditing } = useGlobalIsEditingContext()\n useEffect(() => {\n setIsEditing(open)\n\n return () => {\n setIsEditing(false)\n }\n }, [open, setIsEditing])\n\n function handleClose() {\n if (isEditing) {\n setShowConfirmCloseDialog(true)\n } else {\n onClose()\n }\n }\n\n const [selectedVersionNumber, setSelectedVersionNumber] =\n useState(defaultVersionNumber)\n\n const { data: portal } = useGetPortal(portalId!, {\n enabled: Boolean(portalId),\n })\n\n const [formData, setFormData] = useState<DoiFormData>({\n titles: [''],\n creators: [''],\n })\n const { data: currentUser, isLoading: isLoadingCurrentUser } =\n useGetCurrentUserProfile()\n const { data: entityBundle, isLoading: isLoadingEntity } = useGetEntityBundle(\n objectId,\n selectedVersionNumber,\n {\n includeEntity: true,\n includeBenefactorACL: true,\n },\n {\n enabled: objectType === DoiObjectType.ENTITY,\n staleTime: Infinity,\n throwOnError: true,\n },\n )\n const { data: realmPrincipals, isLoading: isLoadingRealmPrincipals } =\n useGetRealmPrincipals()\n const { data: doi, isLoading: isLoadingDoi } = useGetDOI(\n {\n id: objectId,\n version: selectedVersionNumber,\n type: objectType,\n portalId: portalId,\n },\n {\n staleTime: Infinity,\n throwOnError: true,\n },\n )\n\n const shouldShowWarning = useMemo(() => {\n if (objectType !== DoiObjectType.ENTITY) {\n return false\n }\n return (\n open &&\n doi === null && // Creating new DOI\n entityBundle?.benefactorAcl &&\n realmPrincipals &&\n !isEntityPublic(\n entityBundle.benefactorAcl.resourceAccess,\n realmPrincipals,\n )\n )\n }, [open, doi, entityBundle, realmPrincipals, objectType])\n\n useEffect(() => {\n if (\n open &&\n !hasSetInitialStepForThisSession.current &&\n doi !== undefined && // Wait for DOI query to resolve before determining step\n shouldShowWarning !== undefined\n ) {\n const newStep = shouldShowWarning ? 'warning' : 'form'\n setCurrentStep(newStep)\n hasSetInitialStepForThisSession.current = true\n } else if (!open) {\n setCurrentStep(null)\n hasSetInitialStepForThisSession.current = false\n }\n }, [shouldShowWarning, open, doi])\n\n const doiCanBeAppliedToVersion =\n objectType === DoiObjectType.ENTITY &&\n entityBundle?.entity &&\n isVersionableEntity(entityBundle.entity)\n\n const { data: entityVersions } = useGetVersions(\n objectId,\n undefined,\n undefined,\n {\n enabled: doiCanBeAppliedToVersion,\n },\n )\n const formRef = useRef<RJSF>(null)\n\n const entityType = entityBundle?.entityType ?? EntityType.file\n const entityTypeDisplay = entityTypeToFriendlyName(entityType)\n let versionHelpMarkdown = `A DOI can be associated with a specific version of this ${entityTypeDisplay}.\n \n Versioned DOIs will link to the specified version of the ${entityTypeDisplay}.\n \n A DOI without a version will always link to the newest version of this ${entityTypeDisplay},\n so the data that someone retrieves using the DOI may change over time.`\n if (entityBundle?.entity && isTable(entityBundle.entity)) {\n const tableVersionCopy = isDataset(entityBundle.entity)\n ? 'version'\n : 'snapshot'\n versionHelpMarkdown += `\\n\\nTo create a DOI that will always link to the current set of data in the ${entityTypeDisplay},\n create a new ${tableVersionCopy} and mint a DOI for that ${tableVersionCopy}.`\n }\n\n const {\n mutate: createOrUpdateDoi,\n isPending: updateIsPending,\n error: updateDoiError,\n } = useCreateOrUpdateDOI({\n onSuccess: () => {\n displayToast('The DOI was successfully updated.', 'success')\n onClose()\n },\n })\n\n const isLoading =\n updateIsPending ||\n isLoadingCurrentUser ||\n isLoadingEntity ||\n isLoadingDoi ||\n isLoadingRealmPrincipals\n\n const wasModifiedViaAPI = Boolean(doi && getWasModifiedViaAPI(doi))\n\n useEffect(() => {\n if (doi) {\n setFormData(convertDoiToFormData(doi))\n }\n // If there is no DOI, then pre-fill the form.\n if (currentUser && entityBundle?.entity && doi === null) {\n const newFormData = {\n titles: [entityBundle.entity.name],\n creators: new Array<string>(),\n resourceTypeGeneral: getSuggestedResourceTypeGeneral(\n entityBundle.entityType,\n ),\n publicationYear: new Date().getFullYear(),\n } satisfies DoiFormData\n if (currentUser.lastName && currentUser.firstName) {\n newFormData.creators.push(\n `${currentUser.lastName}, ${currentUser.firstName}`,\n )\n }\n setFormData(newFormData)\n }\n }, [currentUser, doi, entityBundle])\n\n function onSave() {\n if (formRef.current && formRef.current.validateForm()) {\n const requestDoi: V2Doi = convertFormDataToDoi(formData)\n requestDoi.objectType = objectType\n requestDoi.objectId = objectId\n requestDoi.objectVersion = selectedVersionNumber\n requestDoi.etag = doi?.etag\n requestDoi.portalId = portalId\n createOrUpdateDoi({\n doi: requestDoi,\n concreteType: 'org.sagebionetworks.repo.model.doi.v2.DoiRequest',\n })\n }\n }\n\n const dialogContent = (\n <>\n <Typography variant={'body1'} gutterBottom>\n Minting a DOI allows you to credit contributors and makes it easy to\n cite your work.\n </Typography>\n <Typography variant={'body1'} gutterBottom sx={{ mb: 2 }}>\n Note that while the DOI and its associated metadata will be publicly\n visible outside of Synapse, your data will still adhere to its existing\n access conditions. If your data is private, it will remain restricted,\n but the DOI will still be listed. Resources with DOIs may be added to\n the{' '}\n <Link\n href={`${getEndpoint(\n BackendDestinationEnum.PORTAL_ENDPOINT,\n )}${DATA_CATALOG_PATH_SEGMENT}`}\n target=\"_blank\"\n rel=\"noopener\"\n >\n Synapse Data Catalog\n </Link>\n .\n </Typography>\n {portalId && (\n <TextField\n label={'Publisher'}\n fullWidth\n value={portal?.name || ''}\n disabled\n />\n )}\n {doiCanBeAppliedToVersion && (\n <StyledFormControl className=\"limit-type\" fullWidth sx={{ my: 2 }}>\n <InputLabel\n id=\"doi-version-select\"\n sx={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n width: '100%',\n }}\n >\n <span>Version</span>\n <MarkdownPopover\n contentProps={{ markdown: versionHelpMarkdown }}\n maxWidth=\"350px\"\n >\n <HelpTwoTone className={`HelpButton`} />\n </MarkdownPopover>\n </InputLabel>\n <Select\n labelId=\"doi-version-select\"\n value={selectedVersionNumber ?? -1}\n onChange={e => {\n if (e.target.value === -1) {\n setSelectedVersionNumber(undefined)\n } else {\n setSelectedVersionNumber(e.target.value)\n }\n }}\n >\n <MenuItem value={-1}>No version</MenuItem>\n {entityVersions &&\n entityVersions.results.map(version => (\n <MenuItem\n key={version.versionNumber}\n value={version.versionNumber}\n >\n Version {version.versionNumber}\n {/* display the version label if it exists & is different from the number itself */}\n {version.versionLabel &&\n version.versionLabel !== String(version.versionNumber)\n ? ` / ${version.versionLabel}`\n : ''}\n </MenuItem>\n ))}\n </Select>\n </StyledFormControl>\n )}\n <div className=\"JsonSchemaFormContainer\">\n <JsonSchemaForm\n formRef={formRef}\n disabled={isLoading || wasModifiedViaAPI}\n schema={doiFormSchema}\n formData={formData}\n onChange={e => {\n setFormData(e.formData)\n }}\n uiSchema={doiFormUiSchema}\n showErrorList={false}\n />\n </div>\n {doi && (\n <Alert severity={'warning'}>\n <Typography variant={'body1'}>\n A DOI has already been created. Updating the DOI information will\n cause old information to be lost!\n </Typography>\n </Alert>\n )}\n {wasModifiedViaAPI && (\n <Alert severity={'warning'} sx={{ my: 1 }}>\n <Typography variant={'body1'}>\n The metadata for this DOI was modified using a programmatic client,\n so data may be hidden from this view. Any changes may result in\n metadata being lost.\n </Typography>\n </Alert>\n )}\n {updateDoiError && (\n <Alert severity={'error'} sx={{ mt: 1 }}>\n <Typography variant={'body1'}>{updateDoiError.message}</Typography>\n </Alert>\n )}\n </>\n )\n\n const dialogActions = (\n <>\n <Button variant=\"outlined\" disabled={isLoading} onClick={handleClose}>\n Cancel\n </Button>\n <Button\n variant=\"contained\"\n disabled={isLoading}\n onClick={\n currentStep === 'warning'\n ? () => setCurrentStep('form')\n : e => {\n // SWC-7055 - The default action may trigger `beforeunload` and erroneously warn the user about leaving the page.\n e.preventDefault()\n onSave()\n }\n }\n >\n {currentStep === 'warning' ? 'Continue' : 'Save'}\n </Button>\n </>\n )\n\n return (\n <>\n <ConfirmCloseWithoutSavingDialog\n open={showConfirmCloseModal}\n onCancel={() => {\n setShowConfirmCloseDialog(false)\n }}\n onConfirm={() => {\n setShowConfirmCloseDialog(false)\n onClose()\n }}\n />\n <DialogBase\n open={open}\n onCancel={handleClose}\n title={\n currentStep === 'warning'\n ? 'This page is private'\n : 'Create or Update a DOI'\n }\n content={\n !currentStep ? (\n <SynapseSpinner />\n ) : (\n <>\n {currentStep === 'warning' && <PrivateEntityDoiWarning />}\n {currentStep === 'form' && dialogContent}\n </>\n )\n }\n actions={dialogActions}\n />\n </>\n )\n}\n\nexport default CreateOrUpdateDoiModal\n"],"mappings":"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"}
|
|
@@ -1,79 +1,79 @@
|
|
|
1
1
|
import e from "../../../../synapse-queries/entity/useEntityBundle.js";
|
|
2
2
|
import { useGetFeatureFlag as t } from "../../../../synapse-queries/featureflags/useGetFeatureFlag.js";
|
|
3
3
|
import "../../../../synapse-queries/index.js";
|
|
4
|
-
import n from "
|
|
5
|
-
import
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
8
|
-
import {
|
|
9
|
-
import {
|
|
4
|
+
import { FeatureFlagEnum as n } from "../../../../utils/featureflag/FeatureFlags.js";
|
|
5
|
+
import r from "../../../AccessRequirement/AddConditionsForUseButton/AddConditionsForUseButton.js";
|
|
6
|
+
import { useGetEntityTitleBarProperties as i } from "./useGetEntityTitleBarProperties.js";
|
|
7
|
+
import { useState as a } from "react";
|
|
8
|
+
import { Box as o, Divider as s, Link as c, Stack as l, Typography as u } from "@mui/material";
|
|
9
|
+
import { jsx as d, jsxs as f } from "react/jsx-runtime";
|
|
10
10
|
//#region src/components/entity/page/title_bar/TitleBarProperties.tsx
|
|
11
11
|
function p(e) {
|
|
12
12
|
let { title: t, value: n } = e;
|
|
13
|
-
return /* @__PURE__ */
|
|
13
|
+
return /* @__PURE__ */ f("tr", { children: [/* @__PURE__ */ d("td", {
|
|
14
14
|
style: { paddingRight: "1em" },
|
|
15
|
-
children: /* @__PURE__ */ u
|
|
15
|
+
children: /* @__PURE__ */ d(u, {
|
|
16
16
|
component: "span",
|
|
17
17
|
variant: "smallText1",
|
|
18
18
|
sx: { fontWeight: 700 },
|
|
19
19
|
children: t
|
|
20
20
|
})
|
|
21
|
-
}), /* @__PURE__ */
|
|
21
|
+
}), /* @__PURE__ */ d("td", { children: /* @__PURE__ */ d(u, {
|
|
22
22
|
component: "span",
|
|
23
23
|
variant: "smallText1",
|
|
24
24
|
children: n
|
|
25
25
|
}) })] });
|
|
26
26
|
}
|
|
27
|
-
function m(
|
|
28
|
-
let { entityId: m, versionNumber: h, onActMemberClickAddConditionsForUse: g } =
|
|
29
|
-
return /* @__PURE__ */
|
|
27
|
+
function m(u) {
|
|
28
|
+
let { entityId: m, versionNumber: h, onActMemberClickAddConditionsForUse: g } = u, { data: _ } = e(m, h), v = t(n.DESCRIPTION_FIELD), y = i(m, h), [b, x] = a(!1);
|
|
29
|
+
return /* @__PURE__ */ f(o, {
|
|
30
30
|
sx: { padding: "20px 40px" },
|
|
31
31
|
children: [
|
|
32
|
-
/* @__PURE__ */
|
|
32
|
+
/* @__PURE__ */ f(l, {
|
|
33
33
|
direction: "row",
|
|
34
34
|
sx: {
|
|
35
35
|
justifyContent: "space-between",
|
|
36
36
|
alignItems: "flex-start"
|
|
37
37
|
},
|
|
38
|
-
children: [/* @__PURE__ */
|
|
38
|
+
children: [/* @__PURE__ */ f(l, {
|
|
39
39
|
direction: "row",
|
|
40
|
-
divider: /* @__PURE__ */
|
|
40
|
+
divider: /* @__PURE__ */ d(s, {
|
|
41
41
|
orientation: "vertical",
|
|
42
42
|
flexItem: !0
|
|
43
43
|
}),
|
|
44
44
|
spacing: 2,
|
|
45
45
|
sx: { alignItems: "flex-start" },
|
|
46
46
|
children: [
|
|
47
|
-
/* @__PURE__ */
|
|
47
|
+
/* @__PURE__ */ d("table", { children: /* @__PURE__ */ d("tbody", { children: y.slice(0, 2).map((e) => /* @__PURE__ */ d(p, {
|
|
48
48
|
title: e.title,
|
|
49
49
|
value: e.value
|
|
50
50
|
}, e.key)) }) }),
|
|
51
|
-
y.length > 2 && /* @__PURE__ */
|
|
51
|
+
y.length > 2 && /* @__PURE__ */ d("table", { children: /* @__PURE__ */ d("tbody", { children: y.slice(2, 4).map((e) => /* @__PURE__ */ d(p, {
|
|
52
52
|
title: e.title,
|
|
53
53
|
value: e.value
|
|
54
54
|
}, e.key)) }) }),
|
|
55
|
-
(y.length === 5 || y.length === 6) && /* @__PURE__ */
|
|
55
|
+
(y.length === 5 || y.length === 6) && /* @__PURE__ */ d("table", { children: /* @__PURE__ */ d("tbody", { children: y.slice(4, 6).map((e) => /* @__PURE__ */ d(p, {
|
|
56
56
|
title: e.title,
|
|
57
57
|
value: e.value
|
|
58
58
|
}, e.key)) }) }),
|
|
59
|
-
y.length > 6 && /* @__PURE__ */
|
|
59
|
+
y.length > 6 && /* @__PURE__ */ d(c, {
|
|
60
60
|
onClick: () => x((e) => !e),
|
|
61
61
|
children: b ? "Hide properties" : `${y.length - 4} more properties`
|
|
62
62
|
})
|
|
63
63
|
]
|
|
64
|
-
}), /* @__PURE__ */
|
|
64
|
+
}), /* @__PURE__ */ d(r, {
|
|
65
65
|
entityId: m,
|
|
66
66
|
onACTMemberClick: g
|
|
67
67
|
})]
|
|
68
68
|
}),
|
|
69
|
-
b && /* @__PURE__ */
|
|
69
|
+
b && /* @__PURE__ */ d(o, {
|
|
70
70
|
sx: { pt: "20px" },
|
|
71
|
-
children: /* @__PURE__ */
|
|
71
|
+
children: /* @__PURE__ */ d("table", { children: /* @__PURE__ */ d("tbody", { children: y.slice(4, Infinity).map((e) => /* @__PURE__ */ d(p, {
|
|
72
72
|
title: e.title,
|
|
73
73
|
value: e.value
|
|
74
74
|
}, e.key)) }) })
|
|
75
75
|
}),
|
|
76
|
-
_?.entity?.description && v && /* @__PURE__ */
|
|
76
|
+
_?.entity?.description && v && /* @__PURE__ */ d(o, {
|
|
77
77
|
sx: {
|
|
78
78
|
marginTop: "10px",
|
|
79
79
|
maxWidth: "720px"
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TitleBarProperties.js","names":[],"sources":["../../../../../src/components/entity/page/title_bar/TitleBarProperties.tsx"],"sourcesContent":["import { useGetEntityBundle, useGetFeatureFlag } from '@/synapse-queries'\nimport { Box, Divider, Link, Stack, Typography } from '@mui/material'\nimport { FeatureFlagEnum } from '
|
|
1
|
+
{"version":3,"file":"TitleBarProperties.js","names":[],"sources":["../../../../../src/components/entity/page/title_bar/TitleBarProperties.tsx"],"sourcesContent":["import { useGetEntityBundle, useGetFeatureFlag } from '@/synapse-queries'\nimport { Box, Divider, Link, Stack, Typography } from '@mui/material'\nimport { FeatureFlagEnum } from '@/utils/featureflag/FeatureFlags'\nimport { ReactNode, useState } from 'react'\nimport AddConditionsForUseButton from '../../../AccessRequirement/AddConditionsForUseButton/AddConditionsForUseButton'\nimport { useGetEntityTitleBarProperties } from './useGetEntityTitleBarProperties'\n\nexport type TitleBarPropertiesProps = {\n entityId: string\n versionNumber?: number\n /* Callback invoked when an ACT member clicks \"Add Conditions for Use\". */\n onActMemberClickAddConditionsForUse: () => void\n}\n\ntype PropertyProps = {\n title: string\n value: ReactNode\n}\nfunction Property(props: PropertyProps) {\n const { title, value } = props\n return (\n <tr>\n <td style={{ paddingRight: '1em' }}>\n <Typography\n component={'span'}\n variant={'smallText1'}\n sx={{\n fontWeight: 700,\n }}\n >\n {title}\n </Typography>\n </td>\n <td>\n <Typography component={'span'} variant={'smallText1'}>\n {value}\n </Typography>\n </td>\n </tr>\n )\n}\n\n/**\n * The TitleBarProperties component displays a tabular view of the entity metadata on the Entity page.\n */\nexport default function TitleBarProperties(props: TitleBarPropertiesProps) {\n const { entityId, versionNumber, onActMemberClickAddConditionsForUse } = props\n\n // We don't need the entire bundle, but it's fetched for the rest of the title bar and useGetEntityTitleBarProperties below, so the cache will be hot.\n const { data: bundle } = useGetEntityBundle(entityId, versionNumber)\n\n const isFeatureEnabled = useGetFeatureFlag(FeatureFlagEnum.DESCRIPTION_FIELD)\n\n // Actual entity data is fetched and transformed in this custom hook\n const properties = useGetEntityTitleBarProperties(entityId, versionNumber)\n\n const [showAllProperties, setShowAllProperties] = useState(false)\n\n return (\n <Box sx={{ padding: '20px 40px' }}>\n <Stack\n direction={'row'}\n sx={{\n justifyContent: 'space-between',\n alignItems: 'flex-start',\n }}\n >\n <Stack\n direction=\"row\"\n divider={<Divider orientation=\"vertical\" flexItem />}\n spacing={2}\n sx={{\n alignItems: 'flex-start',\n }}\n >\n {/* Always show the first 4 properties*/}\n <table>\n <tbody>\n {properties.slice(0, 2).map(p => {\n return <Property key={p.key} title={p.title} value={p.value} />\n })}\n </tbody>\n </table>\n {properties.length > 2 && (\n <table>\n <tbody>\n {properties.slice(2, 4).map(p => {\n return (\n <Property key={p.key} title={p.title} value={p.value} />\n )\n })}\n </tbody>\n </table>\n )}\n {/* If there are 5 or 6 properties, show them in the last column */}\n {(properties.length === 5 || properties.length === 6) && (\n <table>\n <tbody>\n {properties.slice(4, 6).map(p => {\n return (\n <Property key={p.key} title={p.title} value={p.value} />\n )\n })}\n </tbody>\n </table>\n )}\n {/* If there are more than 6 properties, then just show a button that toggles showing the rest */}\n {properties.length > 6 && (\n <Link onClick={() => setShowAllProperties(v => !v)}>\n {showAllProperties\n ? 'Hide properties'\n : `${properties.length - 4} more properties`}\n </Link>\n )}\n </Stack>\n <AddConditionsForUseButton\n entityId={entityId}\n onACTMemberClick={onActMemberClickAddConditionsForUse}\n />\n </Stack>\n {showAllProperties && (\n <Box sx={{ pt: '20px' }}>\n <table>\n <tbody>\n {/* Show the remaining properties. */}\n {properties.slice(4, Infinity).map(p => {\n return <Property key={p.key} title={p.title} value={p.value} />\n })}\n </tbody>\n </table>\n </Box>\n )}\n {bundle?.entity?.description && isFeatureEnabled && (\n <Box sx={{ marginTop: '10px', maxWidth: '720px' }}>\n {bundle?.entity?.description}\n </Box>\n )}\n </Box>\n )\n}\n"],"mappings":";;;;;;;;;;AAkBA,SAAS,EAAS,GAAsB;CACtC,IAAM,EAAE,UAAO,aAAU;AACzB,QACE,kBAAC,MAAD,EAAA,UAAA,CACE,kBAAC,MAAD;EAAI,OAAO,EAAE,cAAc,OAAO;YAChC,kBAAC,GAAD;GACE,WAAW;GACX,SAAS;GACT,IAAI,EACF,YAAY,KACb;aAEA;GACU,CAAA;EACV,CAAA,EACL,kBAAC,MAAD,EAAA,UACE,kBAAC,GAAD;EAAY,WAAW;EAAQ,SAAS;YACrC;EACU,CAAA,EACV,CAAA,CACF,EAAA,CAAA;;AAOT,SAAwB,EAAmB,GAAgC;CACzE,IAAM,EAAE,aAAU,kBAAe,2CAAwC,GAGnE,EAAE,MAAM,MAAW,EAAmB,GAAU,EAAc,EAE9D,IAAmB,EAAkB,EAAgB,kBAAkB,EAGvE,IAAa,EAA+B,GAAU,EAAc,EAEpE,CAAC,GAAmB,KAAwB,EAAS,GAAM;AAEjE,QACE,kBAAC,GAAD;EAAK,IAAI,EAAE,SAAS,aAAa;YAAjC;GACE,kBAAC,GAAD;IACE,WAAW;IACX,IAAI;KACF,gBAAgB;KAChB,YAAY;KACb;cALH,CAOE,kBAAC,GAAD;KACE,WAAU;KACV,SAAS,kBAAC,GAAD;MAAS,aAAY;MAAW,UAAA;MAAW,CAAA;KACpD,SAAS;KACT,IAAI,EACF,YAAY,cACb;eANH;MASE,kBAAC,SAAD,EAAA,UACE,kBAAC,SAAD,EAAA,UACG,EAAW,MAAM,GAAG,EAAE,CAAC,KAAI,MACnB,kBAAC,GAAD;OAAsB,OAAO,EAAE;OAAO,OAAO,EAAE;OAAS,EAAzC,EAAE,IAAuC,CAC/D,EACI,CAAA,EACF,CAAA;MACP,EAAW,SAAS,KACnB,kBAAC,SAAD,EAAA,UACE,kBAAC,SAAD,EAAA,UACG,EAAW,MAAM,GAAG,EAAE,CAAC,KAAI,MAExB,kBAAC,GAAD;OAAsB,OAAO,EAAE;OAAO,OAAO,EAAE;OAAS,EAAzC,EAAE,IAAuC,CAE1D,EACI,CAAA,EACF,CAAA;OAGR,EAAW,WAAW,KAAK,EAAW,WAAW,MACjD,kBAAC,SAAD,EAAA,UACE,kBAAC,SAAD,EAAA,UACG,EAAW,MAAM,GAAG,EAAE,CAAC,KAAI,MAExB,kBAAC,GAAD;OAAsB,OAAO,EAAE;OAAO,OAAO,EAAE;OAAS,EAAzC,EAAE,IAAuC,CAE1D,EACI,CAAA,EACF,CAAA;MAGT,EAAW,SAAS,KACnB,kBAAC,GAAD;OAAM,eAAe,GAAqB,MAAK,CAAC,EAAE;iBAC/C,IACG,oBACA,GAAG,EAAW,SAAS,EAAE;OACxB,CAAA;MAEH;QACR,kBAAC,GAAD;KACY;KACV,kBAAkB;KAClB,CAAA,CACI;;GACP,KACC,kBAAC,GAAD;IAAK,IAAI,EAAE,IAAI,QAAQ;cACrB,kBAAC,SAAD,EAAA,UACE,kBAAC,SAAD,EAAA,UAEG,EAAW,MAAM,GAAG,SAAS,CAAC,KAAI,MAC1B,kBAAC,GAAD;KAAsB,OAAO,EAAE;KAAO,OAAO,EAAE;KAAS,EAAzC,EAAE,IAAuC,CAC/D,EACI,CAAA,EACF,CAAA;IACJ,CAAA;GAEP,GAAQ,QAAQ,eAAe,KAC9B,kBAAC,GAAD;IAAK,IAAI;KAAE,WAAW;KAAQ,UAAU;KAAS;cAC9C,GAAQ,QAAQ;IACb,CAAA;GAEJ"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useGetMentions.js","names":[],"sources":["../../../../../src/components/entity/page/title_bar/useGetMentions.ts"],"sourcesContent":["import { useMemo } from 'react'\nimport { skipToken, useQuery, UseQueryOptions } from '@tanstack/react-query'\nimport {\n COLUMN_SINGLE_VALUE_QUERY_FILTER_CONCRETE_TYPE_VALUE,\n ColumnSingleValueFilterOperator,\n Query,\n} from '@sage-bionetworks/synapse-types'\nimport { useGetQueryResultBundleWithAsyncStatus } from '@/synapse-queries'\nimport { BUNDLE_MASK_QUERY_RESULTS } from '@/utils/SynapseConstants'\nimport { CitingWork } from './useDataCiteUsage'\n\nconst MENTIONS_SYNAPSE_TABLE_ID = 'syn66047339'\n\nexport type EuropePMCAuthor = {\n fullName?: string\n firstName?: string\n lastName?: string\n}\n\nexport type EuropePMCAuthorList = {\n author?: EuropePMCAuthor[]\n}\n\nexport type EuropePMCResult = {\n id?: string\n pmid?: string\n pmcid?: string\n doi?: string\n title?: string\n journalTitle?: string\n pubYear?: string\n authorList?: EuropePMCAuthorList\n}\n\nexport type EuropePMCResponse = {\n resultList: {\n result: EuropePMCResult[]\n }\n}\n\nexport const getMentionsQueryKey = (entityId: string) =>\n ['europepmc', entityId] as const\n\nexport async function fetchMetadataForPMCIDs(\n signal: AbortSignal,\n pmcids: string[],\n): Promise<CitingWork[]> {\n if (pmcids.length === 0) return []\n const query = pmcids.map(id => `PMCID:${id}`).join(' OR ')\n\n const url = new URL('https://www.ebi.ac.uk/europepmc/webservices/rest/search')\n url.searchParams.set('query', query)\n url.searchParams.set('format', 'json')\n url.searchParams.set('pageSize', String(pmcids.length))\n\n const resp = await fetch(url.toString(), {\n headers: { Accept: 'application/json' },\n signal,\n })\n if (!resp.ok)\n throw new Error(`Europe PMC error ${resp.status}: ${await resp.text()}`)\n\n const json = (await resp.json()) as EuropePMCResponse\n return mapEuropePMCResponseToCitingWorks(json)\n}\n\nexport function mapEuropePMCResponseToCitingWorks(\n json: EuropePMCResponse,\n): CitingWork[] {\n return json.resultList.result.map(\n r =>\n ({\n id: r.pmcid,\n title: r.title ?? '(Untitled)',\n doi: r.doi,\n publisher: r.journalTitle,\n publicationYear: r.pubYear ? Number(r.pubYear) : undefined,\n // authors: r.authorList?.author?.map((a: EuropePMCAuthor) => a.fullName ?? `${a.firstName ?? \"\"} ${a.lastName ?? \"\"}`.trim()) ?? [],\n } as CitingWork
|
|
1
|
+
{"version":3,"file":"useGetMentions.js","names":[],"sources":["../../../../../src/components/entity/page/title_bar/useGetMentions.ts"],"sourcesContent":["import { useMemo } from 'react'\nimport { skipToken, useQuery, UseQueryOptions } from '@tanstack/react-query'\nimport {\n COLUMN_SINGLE_VALUE_QUERY_FILTER_CONCRETE_TYPE_VALUE,\n ColumnSingleValueFilterOperator,\n Query,\n} from '@sage-bionetworks/synapse-types'\nimport { useGetQueryResultBundleWithAsyncStatus } from '@/synapse-queries'\nimport { BUNDLE_MASK_QUERY_RESULTS } from '@/utils/SynapseConstants'\nimport { CitingWork } from './useDataCiteUsage'\n\nconst MENTIONS_SYNAPSE_TABLE_ID = 'syn66047339'\n\nexport type EuropePMCAuthor = {\n fullName?: string\n firstName?: string\n lastName?: string\n}\n\nexport type EuropePMCAuthorList = {\n author?: EuropePMCAuthor[]\n}\n\nexport type EuropePMCResult = {\n id?: string\n pmid?: string\n pmcid?: string\n doi?: string\n title?: string\n journalTitle?: string\n pubYear?: string\n authorList?: EuropePMCAuthorList\n}\n\nexport type EuropePMCResponse = {\n resultList: {\n result: EuropePMCResult[]\n }\n}\n\nexport const getMentionsQueryKey = (entityId: string) =>\n ['europepmc', entityId] as const\n\nexport async function fetchMetadataForPMCIDs(\n signal: AbortSignal,\n pmcids: string[],\n): Promise<CitingWork[]> {\n if (pmcids.length === 0) return []\n const query = pmcids.map(id => `PMCID:${id}`).join(' OR ')\n\n const url = new URL('https://www.ebi.ac.uk/europepmc/webservices/rest/search')\n url.searchParams.set('query', query)\n url.searchParams.set('format', 'json')\n url.searchParams.set('pageSize', String(pmcids.length))\n\n const resp = await fetch(url.toString(), {\n headers: { Accept: 'application/json' },\n signal,\n })\n if (!resp.ok)\n throw new Error(`Europe PMC error ${resp.status}: ${await resp.text()}`)\n\n const json = (await resp.json()) as EuropePMCResponse\n return mapEuropePMCResponseToCitingWorks(json)\n}\n\nexport function mapEuropePMCResponseToCitingWorks(\n json: EuropePMCResponse,\n): CitingWork[] {\n return json.resultList.result.map(\n r =>\n ({\n id: r.pmcid,\n title: r.title ?? '(Untitled)',\n doi: r.doi,\n publisher: r.journalTitle,\n publicationYear: r.pubYear ? Number(r.pubYear) : undefined,\n // authors: r.authorList?.author?.map((a: EuropePMCAuthor) => a.fullName ?? `${a.firstName ?? \"\"} ${a.lastName ?? \"\"}`.trim()) ?? [],\n }) as CitingWork,\n )\n}\n\nexport function useGetMentions(\n entityId: string,\n options?: Omit<UseQueryOptions<CitingWork[], Error>, 'queryKey' | 'queryFn'>,\n) {\n const query: Query = {\n sql: `select pmcid from ${MENTIONS_SYNAPSE_TABLE_ID}`,\n additionalFilters: [\n {\n concreteType: COLUMN_SINGLE_VALUE_QUERY_FILTER_CONCRETE_TYPE_VALUE,\n columnName: 'synid',\n operator: ColumnSingleValueFilterOperator.EQUAL,\n values: [entityId],\n },\n ],\n }\n\n const { data } = useGetQueryResultBundleWithAsyncStatus({\n entityId: entityId,\n query,\n partMask: BUNDLE_MASK_QUERY_RESULTS,\n concreteType: 'org.sagebionetworks.repo.model.table.QueryBundleRequest',\n })\n\n const rows = data?.responseBody?.queryResult?.queryResults?.rows\n const pcmids = rows\n ?.map(row => {\n const pmcid = row.values[0]\n // remove \"pmc:\" prefix if present\n return pmcid?.toString().replace(/^pmc:/i, '')\n })\n .filter(pmcid => pmcid != null) as string[]\n const key = useMemo(() => getMentionsQueryKey(entityId), [entityId])\n return useQuery({\n ...options,\n queryKey: key,\n queryFn: pcmids\n ? ({ signal }) => {\n return fetchMetadataForPMCIDs(signal, pcmids)\n }\n : skipToken,\n })\n}\n"],"mappings":";;;;;;;AAWA,IAAM,IAA4B,eA6BrB,KAAuB,MAClC,CAAC,aAAa,EAAS;AAEzB,eAAsB,EACpB,GACA,GACuB;AACvB,KAAI,EAAO,WAAW,EAAG,QAAO,EAAE;CAClC,IAAM,IAAQ,EAAO,KAAI,MAAM,SAAS,IAAK,CAAC,KAAK,OAAO,EAEpD,IAAM,IAAI,IAAI,0DAA0D;AAG9E,CAFA,EAAI,aAAa,IAAI,SAAS,EAAM,EACpC,EAAI,aAAa,IAAI,UAAU,OAAO,EACtC,EAAI,aAAa,IAAI,YAAY,OAAO,EAAO,OAAO,CAAC;CAEvD,IAAM,IAAO,MAAM,MAAM,EAAI,UAAU,EAAE;EACvC,SAAS,EAAE,QAAQ,oBAAoB;EACvC;EACD,CAAC;AACF,KAAI,CAAC,EAAK,GACR,OAAU,MAAM,oBAAoB,EAAK,OAAO,IAAI,MAAM,EAAK,MAAM,GAAG;AAG1E,QAAO,EAAkC,MADrB,EAAK,MAAM,CACe;;AAGhD,SAAgB,EACd,GACc;AACd,QAAO,EAAK,WAAW,OAAO,KAC5B,OACG;EACC,IAAI,EAAE;EACN,OAAO,EAAE,SAAS;EAClB,KAAK,EAAE;EACP,WAAW,EAAE;EACb,iBAAiB,EAAE,UAAU,OAAO,EAAE,QAAQ,GAAG,KAAA;EAElD,EACJ;;AAGH,SAAgB,EACd,GACA,GACA;CAaA,IAAM,EAAE,YAAS,EAAuC;EAC5C;EACV,OAAA;GAbA,KAAK,qBAAqB;GAC1B,mBAAmB,CACjB;IACE,cAAc;IACd,YAAY;IACZ,UAAU,EAAgC;IAC1C,QAAQ,CAAC,EAAS;IACnB,CACF;GAKD;EACA,UAAA;EACA,cAAc;EACf,CAAC,EAGI,KADO,GAAM,cAAc,aAAa,cAAc,OAExD,KAAI,MACU,EAAI,OAAO,IAEX,UAAU,CAAC,QAAQ,UAAU,GAAG,CAC9C,CACD,QAAO,MAAS,KAAS,KAAK,EAC3B,IAAM,QAAc,EAAoB,EAAS,EAAE,CAAC,EAAS,CAAC;AACpE,QAAO,EAAS;EACd,GAAG;EACH,UAAU;EACV,SAAS,KACJ,EAAE,gBACM,EAAuB,GAAQ,EAAO,GAE/C;EACL,CAAC"}
|
package/dist/components/index.js
CHANGED
|
@@ -15,27 +15,27 @@ import "./ToastMessage/index.js";
|
|
|
15
15
|
import v, { SynapseErrorType as y } from "./error/ErrorPage.js";
|
|
16
16
|
import b from "./SynapseTable/NoContentAvailable.js";
|
|
17
17
|
import x from "./IconSvg/IconSvg.js";
|
|
18
|
-
import
|
|
19
|
-
import C from "./
|
|
20
|
-
import { AccessTokenPage as w } from "./AccessTokenPage/AccessTokenPage.js";
|
|
18
|
+
import S from "./TextField/TextField.js";
|
|
19
|
+
import { AccessTokenPage as C } from "./AccessTokenPage/AccessTokenPage.js";
|
|
21
20
|
import "./AccessTokenPage/index.js";
|
|
22
|
-
import { AccountLevelBadges as
|
|
21
|
+
import { AccountLevelBadges as w } from "./AccountLevelBadges/AccountLevelBadges.js";
|
|
23
22
|
import "./AccountLevelBadges/index.js";
|
|
24
|
-
import
|
|
23
|
+
import T, { useLastLoginInfo as E, useLastLoginInfoState as D } from "./Authentication/LastLoginInfo.js";
|
|
25
24
|
import "./TextField/index.js";
|
|
26
|
-
import
|
|
25
|
+
import O from "./Authentication/PasswordField.js";
|
|
27
26
|
import "./IconSvg/index.js";
|
|
28
|
-
import
|
|
29
|
-
import
|
|
30
|
-
import { LeftRightPanel as
|
|
31
|
-
import
|
|
32
|
-
import
|
|
33
|
-
import
|
|
27
|
+
import k from "./Authentication/OneTimePasswordForm.js";
|
|
28
|
+
import A from "./Authentication/StandaloneLoginForm.js";
|
|
29
|
+
import { LeftRightPanel as j, StyledInnerContainer as M, StyledOuterContainer as N } from "./styled/LeftRightPanel.js";
|
|
30
|
+
import P from "./Authentication/TwoFactorEnrollmentForm.js";
|
|
31
|
+
import F from "./Authentication/TwoFactorAuthSettingsPanel.js";
|
|
32
|
+
import I from "./Authentication/TwoFactorBackupCodes.js";
|
|
34
33
|
import "./Authentication/index.js";
|
|
35
|
-
import { getFileHandleAssociation as
|
|
36
|
-
import { Project as
|
|
37
|
-
import
|
|
38
|
-
import
|
|
34
|
+
import { getFileHandleAssociation as L, getLinkParams as R, getValueOrMultiValue as z } from "./GenericCard/CardUtils.js";
|
|
35
|
+
import { Project as B } from "../assets/themed_icons/Project.js";
|
|
36
|
+
import V from "./Icon/Icon.js";
|
|
37
|
+
import H from "./ShowMore/ShowMore.js";
|
|
38
|
+
import { StyledFormControl as U } from "./styled/StyledFormControl.js";
|
|
39
39
|
import { EntityDownloadConfirmation as W } from "./EntityDownloadConfirmation/EntityDownloadConfirmation.js";
|
|
40
40
|
import "./EntityDownloadConfirmation/index.js";
|
|
41
41
|
import { QueryContext as G, QueryContextConsumer as K, QueryContextProvider as q, useQueryContext as J } from "./QueryContext/QueryContext.js";
|
|
@@ -225,4 +225,4 @@ import { PortalList as Yt } from "./PortalList/PortalList.js";
|
|
|
225
225
|
import "./PortalList/index.js";
|
|
226
226
|
import "./PortalAclEditor/index.js";
|
|
227
227
|
import { visuallyHidden as Xt } from "./SynapseHomepageV2/HomepageStyles.js";
|
|
228
|
-
export { gt as AccessRequirementAclEditor, Pt as AccessRequirementRelatedProjectsList,
|
|
228
|
+
export { gt as AccessRequirementAclEditor, Pt as AccessRequirementRelatedProjectsList, C as AccessTokenPage, w as AccountLevelBadges, be as AvailableEvaluationQueueList, Y as CARD_SHORT_DESCRIPTION_CSS, De as CTASectionWrapper, ae as CardContainer, de as CardContainerLogic, fe as CardGridWithLinks, he as CertificationQuiz, ye as ChallengeDataDownload, ge as ChallengeDetailPage, xe as ChallengeSubmission, Se as ChangePassword, Ce as ChangePasswordWithToken, r as ClientError, Ee as ColoredBulletListItem, _ as ConfirmationDialog, we as CookiePreferencesDialog, Te as CookiesNotification, Jt as CreatePortalModal, Lt as DatasetJsonLdScript, He as DiscussionThread, ke as DownloadCartPage, Oe as DownloadIneligibleForPackagingFilesFromListButton, je as DynamicForm, Me as DynamicFormModal, i as EmptyFallbackComponent, ve as EntityBadgeIcons, W as EntityDownloadConfirmation, Ne as EntityFinder, Pe as EntityForm, Nt as EntityHeaderTable, a as ErrorBanner, o as ErrorFallbackComponent, v as ErrorPage, Fe as EvaluationCard, Ie as EvaluationEditorPage, Le as ExperimentalMode, Re as ExternalFileHandleLink, ze as FeaturedDataTabs, Ht as FeaturedResearch, Be as FeaturedToolsList, se as FileUpload, Ue as ForumPage, e as FullWidthAlert, Q as GenericCard, Ge as Goals, qe as GoalsV2, Je as GoalsV3, Ye as GoogleAnalytics, le as HasAccess, g as HelpPopover, _e as HoverPopover, V as Icon, x as IconSvg, Bt as ImageCardGridWithLinks, yt as InputSizedButton, It as JsonLdScript, T as LastLoginInfo, j as LeftRightPanel, d as LightTooltip, X as LongDescription, Xe as Map, Ze as MarkdownCollapse, Ve as MarkdownEditor, Qe as MarkdownGithubLatestTag, ce as ModalDownload, Ft as MuiContainer, b as NoContentAvailable, $e as OAuthClientManagement, k as OneTimePasswordForm, et as OrientationBanner, O as PasswordField, Gt as PortalAclEditor, Kt as PortalAclEditorModal, qt as PortalCard, Vt as PortalFeatureHighlights, Wt as PortalFeaturedPartners, Ut as PortalHomePageHeader, Yt as PortalList, Ke as PortalSectionHeader, at as ProgrammaticTableDownload, it as Programs, st as ProjectDataAvailability, B as ProjectIcon, ot as ProvenanceGraph, G as QueryContext, K as QueryContextConsumer, q as QueryContextProvider, We as QueryCount, ne as QueryWrapper, lt as QueryWrapperPlotNav, ct as QueryWrapperSynapsePlot, zt as RecentPublicationsGrid, pt as RegisterPageLogoutPrompt, mt as RenderIfInView, ht as Resources, pe as RowDataTable, me as RowDataTableWithQuery, _t as RssFeedCards, Rt as SageResourcesPopover, ut as SearchQueryWrapper, dt as SearchQueryWrapperPlotNav, Z as ShortDescription, Ae as ShowDownloadV2, H as ShowMore, s as SignInPrompt, f as SkeletonButton, p as SkeletonInlineBlock, h as SkeletonParagraph, m as SkeletonTable, A as StandaloneLoginForm, vt as StandaloneQueryWrapper, U as StyledFormControl, M as StyledInnerContainer, N as StyledOuterContainer, bt as SubscriptionPage, xt as SubsectionRowRenderer, ee as SynapseCardLabel, wt as SynapseChat, c as SynapseErrorBoundary, y as SynapseErrorType, Ct as SynapseFormSubmissionGrid, St as SynapseFormWrapper, rt as SynapsePlot, Tt as SynapsePortalChatDialog, ue as SynapseTable, t as SynapseToastContainer, Et as SystemUseNotification, Dt as TableFeedCards, l as TableRowFallbackComponent, Ot as TermsAndConditions, S as TextField, tt as ThemesPlot, kt as TimelinePlot, F as TwoFactorAuthSettingsPanel, I as TwoFactorBackupCodes, P as TwoFactorEnrollmentForm, nt as UpsetPlot, $ as UserCard, ie as UserCardList, jt as UserCardListGroups, At as UserCardListRotate, oe as UserOrTeamBadge, Mt as UserProfileLinks, re as WideButton, u as YOU_ARE_NOT_AUTHORIZED_MESSAGE, n as displayToast, te as generateEncodedPathAndQueryForSelectedFacetURL, L as getFileHandleAssociation, R as getLinkParams, z as getValueOrMultiValue, ft as isSearchQueryWrapperPlotNavProps, E as useLastLoginInfo, D as useLastLoginInfoState, J as useQueryContext, Xt as visuallyHidden };
|
|
@@ -1,5 +1,20 @@
|
|
|
1
1
|
import { FormControlProps } from '@mui/material';
|
|
2
2
|
import { StyledComponent } from '@emotion/styled';
|
|
3
|
+
/**
|
|
4
|
+
* Provides bootstrap-like label/text inputs for a MUI FormControl.
|
|
5
|
+
*
|
|
6
|
+
* This should not be used with components that provide their own FormControl, such as TextField.
|
|
7
|
+
*
|
|
8
|
+
* @example
|
|
9
|
+
* ```tsx
|
|
10
|
+
* <StyledFormControl fullWidth variant="standard" margin="normal">
|
|
11
|
+
* <InputLabel shrink htmlFor="someinput">
|
|
12
|
+
* labelText
|
|
13
|
+
* </InputLabel>
|
|
14
|
+
* <InputBase id="someinput"/>
|
|
15
|
+
* </StyledFormControl>
|
|
16
|
+
* ```
|
|
17
|
+
*/
|
|
3
18
|
export declare const StyledFormControl: StyledComponent<FormControlProps>;
|
|
4
19
|
export default StyledFormControl;
|
|
5
20
|
//# sourceMappingURL=StyledFormControl.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"StyledFormControl.d.ts","sourceRoot":"","sources":["../../../src/components/styled/StyledFormControl.tsx"],"names":[],"mappings":"AAAA,OAAO,EAEL,gBAAgB,EAIjB,MAAM,eAAe,CAAA;AACtB,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAA;
|
|
1
|
+
{"version":3,"file":"StyledFormControl.d.ts","sourceRoot":"","sources":["../../../src/components/styled/StyledFormControl.tsx"],"names":[],"mappings":"AAAA,OAAO,EAEL,gBAAgB,EAIjB,MAAM,eAAe,CAAA;AACtB,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAA;AAEjD;;;;;;;;;;;;;;GAcG;AACH,eAAO,MAAM,iBAAiB,EAAE,eAAe,CAAC,gBAAgB,CA2B7D,CAAA;AAEH,eAAe,iBAAiB,CAAA"}
|
|
@@ -2,6 +2,7 @@ import { FormControl as e, formHelperTextClasses as t, inputBaseClasses as n, st
|
|
|
2
2
|
//#region src/components/styled/StyledFormControl.tsx
|
|
3
3
|
var i = r(e, { label: "StyledFormControl" })(({ theme: e }) => ({
|
|
4
4
|
"& label": {
|
|
5
|
+
position: "static",
|
|
5
6
|
fontSize: "14px",
|
|
6
7
|
transform: "none"
|
|
7
8
|
},
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"StyledFormControl.js","names":[],"sources":["../../../src/components/styled/StyledFormControl.tsx"],"sourcesContent":["import {\n FormControl,\n FormControlProps,\n formHelperTextClasses,\n inputBaseClasses,\n styled,\n} from '@mui/material'\nimport { StyledComponent } from '@emotion/styled'\n\n
|
|
1
|
+
{"version":3,"file":"StyledFormControl.js","names":[],"sources":["../../../src/components/styled/StyledFormControl.tsx"],"sourcesContent":["import {\n FormControl,\n FormControlProps,\n formHelperTextClasses,\n inputBaseClasses,\n styled,\n} from '@mui/material'\nimport { StyledComponent } from '@emotion/styled'\n\n/**\n * Provides bootstrap-like label/text inputs for a MUI FormControl.\n *\n * This should not be used with components that provide their own FormControl, such as TextField.\n *\n * @example\n * ```tsx\n * <StyledFormControl fullWidth variant=\"standard\" margin=\"normal\">\n * <InputLabel shrink htmlFor=\"someinput\">\n * labelText\n * </InputLabel>\n * <InputBase id=\"someinput\"/>\n * </StyledFormControl>\n * ```\n */\nexport const StyledFormControl: StyledComponent<FormControlProps> = styled(\n FormControl,\n {\n label: 'StyledFormControl',\n },\n)(({ theme }) => ({\n '& label': {\n position: 'static',\n fontSize: '14px',\n transform: 'none',\n },\n [`& .${formHelperTextClasses.root}`]: {\n marginLeft: '0',\n [`&.Mui-error`]: {\n color: '#c13415',\n },\n },\n\n [`& .${inputBaseClasses.root}`]: {\n marginTop: theme.spacing(0.5),\n },\n '& .MuiInputBase-multiline': {\n padding: '0px',\n },\n '& fieldset': {\n border: 'none',\n },\n}))\n\nexport default StyledFormControl\n"],"mappings":";;AAwBA,IAAa,IAAuD,EAClE,GACA,EACE,OAAO,qBACR,CACF,EAAE,EAAE,gBAAa;CAChB,WAAW;EACT,UAAU;EACV,UAAU;EACV,WAAW;EACZ;EACA,MAAM,EAAsB,SAAS;EACpC,YAAY;EACX,eAAgB,EACf,OAAO,WACR;EACF;EAEA,MAAM,EAAiB,SAAS,EAC/B,WAAW,EAAM,QAAQ,GAAI,EAC9B;CACD,6BAA6B,EAC3B,SAAS,OACV;CACD,cAAc,EACZ,QAAQ,QACT;CACF,EAAE"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { LightTooltip as e } from "./LightTooltip.js";
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
2
|
+
import { LeftRightPanel as t, StyledInnerContainer as n, StyledOuterContainer as r } from "./LeftRightPanel.js";
|
|
3
|
+
import { StyledFormControl as i } from "./StyledFormControl.js";
|
|
4
4
|
import { WideButton as a } from "./WideButton.js";
|
|
5
5
|
import { HoverPopover as o } from "./HoverPopover.js";
|
|
6
6
|
import { InputSizedButton as s } from "./InputSizedButton.js";
|
|
7
|
-
export { o as HoverPopover, s as InputSizedButton,
|
|
7
|
+
export { o as HoverPopover, s as InputSizedButton, t as LeftRightPanel, e as LightTooltip, i as StyledFormControl, n as StyledInnerContainer, r as StyledOuterContainer, a as WideButton };
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
export type CreateTableFromCsvDialogProps = {
|
|
2
|
+
/** Whether the dialog is open */
|
|
3
|
+
open: boolean;
|
|
4
|
+
/** Callback when the dialog is closed */
|
|
5
|
+
onClose: () => void;
|
|
6
|
+
/** Destination project/folder to upload to */
|
|
7
|
+
parentId: string;
|
|
8
|
+
/** Invoked after all backend operations successfully complete */
|
|
9
|
+
onSuccess?: () => void;
|
|
10
|
+
};
|
|
11
|
+
/**
|
|
12
|
+
* A multi-step modal wizard used to create a Synapse Table entity from an uploaded CSV file.
|
|
13
|
+
* It manages two primary phases:
|
|
14
|
+
* 1. CSV Upload & Preview: Displays data preview and infers suggested column models.
|
|
15
|
+
* 2. Table Configuration: Sets table name and allows schema customization.
|
|
16
|
+
*/
|
|
17
|
+
export default function CreateTableFromCsvDialog(props: CreateTableFromCsvDialogProps): import("react/jsx-runtime").JSX.Element;
|
|
18
|
+
//# sourceMappingURL=CreateTableFromCsvDialog.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CreateTableFromCsvDialog.d.ts","sourceRoot":"","sources":["../../../../src/components/table/CsvPreview/CreateTableFromCsvDialog.tsx"],"names":[],"mappings":"AAwBA,MAAM,MAAM,6BAA6B,GAAG;IAC1C,iCAAiC;IACjC,IAAI,EAAE,OAAO,CAAA;IACb,yCAAyC;IACzC,OAAO,EAAE,MAAM,IAAI,CAAA;IACnB,8CAA8C;IAC9C,QAAQ,EAAE,MAAM,CAAA;IAChB,iEAAiE;IACjE,SAAS,CAAC,EAAE,MAAM,IAAI,CAAA;CACvB,CAAA;AAOD;;;;;GAKG;AACH,MAAM,CAAC,OAAO,UAAU,wBAAwB,CAC9C,KAAK,EAAE,6BAA6B,2CAyJrC"}
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
import { displayToast as e } from "../../ToastMessage/ToastMessage.js";
|
|
2
|
+
import { DialogBase as t } from "../../DialogBase.js";
|
|
3
|
+
import n, { CsvUploadPreviewStep as r } from "./useCsvUploadPreview.js";
|
|
4
|
+
import i from "./CsvUploadPreviewContent.js";
|
|
5
|
+
import a from "./useCreateTableFromCsv.js";
|
|
6
|
+
import o from "../../TableColumnSchemaEditor/TableColumnSchemaForm.js";
|
|
7
|
+
import { useCallback as s, useRef as c, useState as l } from "react";
|
|
8
|
+
import { isUndefined as u, omitBy as d } from "lodash-es";
|
|
9
|
+
import { Fragment as f, jsx as p, jsxs as m } from "react/jsx-runtime";
|
|
10
|
+
import { EntityType as h } from "@sage-bionetworks/synapse-client";
|
|
11
|
+
import g from "@mui/material/Typography";
|
|
12
|
+
import _ from "@mui/material/TextField";
|
|
13
|
+
import v from "@mui/material/Stack";
|
|
14
|
+
import y from "@mui/material/Button";
|
|
15
|
+
import b from "@mui/icons-material/ExpandMore";
|
|
16
|
+
import x from "@mui/material/Accordion";
|
|
17
|
+
import S from "@mui/material/AccordionDetails";
|
|
18
|
+
import C from "@mui/material/AccordionSummary";
|
|
19
|
+
//#region src/components/table/CsvPreview/CreateTableFromCsvDialog.tsx
|
|
20
|
+
var w = /* @__PURE__ */ function(e) {
|
|
21
|
+
return e[e.CSV_UPLOAD_PREVIEW = 0] = "CSV_UPLOAD_PREVIEW", e[e.TABLE_NAME = 1] = "TABLE_NAME", e;
|
|
22
|
+
}(w || {});
|
|
23
|
+
function T(T) {
|
|
24
|
+
let { open: E, onClose: D, parentId: O, onSuccess: k } = T, A = n(), [j, M] = l(w.CSV_UPLOAD_PREVIEW), [N, P] = l(""), [F, I] = l([]), L = c(null), { mutate: R, isPending: z } = a({
|
|
25
|
+
onSuccess() {
|
|
26
|
+
k?.();
|
|
27
|
+
},
|
|
28
|
+
onError(t) {
|
|
29
|
+
e(t.message, "danger");
|
|
30
|
+
}
|
|
31
|
+
}), B = s((e = []) => {
|
|
32
|
+
R({
|
|
33
|
+
parentId: O,
|
|
34
|
+
tableName: N,
|
|
35
|
+
columnModels: e,
|
|
36
|
+
csvTableDescriptor: A.csvTableDescriptor,
|
|
37
|
+
fileHandleId: A.uploadedFileHandleId
|
|
38
|
+
});
|
|
39
|
+
}, [
|
|
40
|
+
R,
|
|
41
|
+
O,
|
|
42
|
+
N,
|
|
43
|
+
A.csvTableDescriptor,
|
|
44
|
+
A.uploadedFileHandleId
|
|
45
|
+
]), V = s((e) => {
|
|
46
|
+
B(e);
|
|
47
|
+
}, [B]), H = s(() => {
|
|
48
|
+
let e = A.csvPreviewData?.suggestedColumns;
|
|
49
|
+
e && (I(e.map((e) => d(e, u))), M(w.TABLE_NAME));
|
|
50
|
+
}, [A.csvPreviewData, M]), U = /* @__PURE__ */ m(v, {
|
|
51
|
+
spacing: 2,
|
|
52
|
+
children: [
|
|
53
|
+
/* @__PURE__ */ p(_, {
|
|
54
|
+
required: !0,
|
|
55
|
+
label: "Table Name",
|
|
56
|
+
value: N,
|
|
57
|
+
onChange: (e) => P(e.target.value),
|
|
58
|
+
fullWidth: !0
|
|
59
|
+
}),
|
|
60
|
+
/* @__PURE__ */ p(g, {
|
|
61
|
+
variant: "body1",
|
|
62
|
+
children: "Use the schema options button to make changes to the columns of the table. Use the create button to finish building the table."
|
|
63
|
+
}),
|
|
64
|
+
/* @__PURE__ */ m(x, { children: [/* @__PURE__ */ p(C, {
|
|
65
|
+
expandIcon: /* @__PURE__ */ p(b, {}),
|
|
66
|
+
children: /* @__PURE__ */ p(g, {
|
|
67
|
+
variant: "headline3",
|
|
68
|
+
children: "Schema Options"
|
|
69
|
+
})
|
|
70
|
+
}), /* @__PURE__ */ p(S, { children: /* @__PURE__ */ p(o, {
|
|
71
|
+
initialData: F,
|
|
72
|
+
entityType: h.table,
|
|
73
|
+
ref: L,
|
|
74
|
+
onSubmit: V
|
|
75
|
+
}) })] })
|
|
76
|
+
]
|
|
77
|
+
});
|
|
78
|
+
return /* @__PURE__ */ p(t, {
|
|
79
|
+
maxWidth: "lg",
|
|
80
|
+
title: "Upload CSV",
|
|
81
|
+
onCancel: D,
|
|
82
|
+
open: E,
|
|
83
|
+
content: /* @__PURE__ */ m(f, { children: [j === w.CSV_UPLOAD_PREVIEW && /* @__PURE__ */ p(i, { workflow: A }), j === w.TABLE_NAME && U] }),
|
|
84
|
+
actions: /* @__PURE__ */ m(f, { children: [
|
|
85
|
+
/* @__PURE__ */ p(y, {
|
|
86
|
+
variant: "outlined",
|
|
87
|
+
disabled: A.isLoadingPreview,
|
|
88
|
+
onClick: () => {
|
|
89
|
+
D();
|
|
90
|
+
},
|
|
91
|
+
children: "Cancel"
|
|
92
|
+
}),
|
|
93
|
+
j === w.CSV_UPLOAD_PREVIEW && A.step === r.COLUMN_PREVIEW && /* @__PURE__ */ p(y, {
|
|
94
|
+
disabled: A.isLoadingPreview,
|
|
95
|
+
variant: "contained",
|
|
96
|
+
onClick: H,
|
|
97
|
+
children: "Next"
|
|
98
|
+
}),
|
|
99
|
+
j === w.TABLE_NAME && /* @__PURE__ */ m(f, { children: [/* @__PURE__ */ p(y, {
|
|
100
|
+
variant: "outlined",
|
|
101
|
+
onClick: () => M(w.CSV_UPLOAD_PREVIEW),
|
|
102
|
+
children: "Back"
|
|
103
|
+
}), /* @__PURE__ */ p(y, {
|
|
104
|
+
variant: "contained",
|
|
105
|
+
onClick: () => L.current?.submit(),
|
|
106
|
+
loading: z,
|
|
107
|
+
disabled: !N,
|
|
108
|
+
children: "Create"
|
|
109
|
+
})] })
|
|
110
|
+
] })
|
|
111
|
+
});
|
|
112
|
+
}
|
|
113
|
+
//#endregion
|
|
114
|
+
export { T as default };
|
|
115
|
+
|
|
116
|
+
//# sourceMappingURL=CreateTableFromCsvDialog.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CreateTableFromCsvDialog.js","names":[],"sources":["../../../../src/components/table/CsvPreview/CreateTableFromCsvDialog.tsx"],"sourcesContent":["import TableColumnSchemaForm, {\n SubmitHandle,\n} from '@/components/TableColumnSchemaEditor/TableColumnSchemaForm'\nimport { DialogBase } from '@/components/DialogBase'\nimport { displayToast } from '@/components/ToastMessage/ToastMessage'\nimport useCsvUploadPreview, {\n CsvUploadPreviewStep,\n} from '@/components/table/CsvPreview/useCsvUploadPreview'\nimport ExpandMoreIcon from '@mui/icons-material/ExpandMore'\nimport Accordion from '@mui/material/Accordion'\nimport AccordionDetails from '@mui/material/AccordionDetails'\nimport AccordionSummary from '@mui/material/AccordionSummary'\nimport Button from '@mui/material/Button'\nimport Stack from '@mui/material/Stack'\nimport TextField from '@mui/material/TextField'\nimport Typography from '@mui/material/Typography'\nimport { EntityType } from '@sage-bionetworks/synapse-client'\nimport { isUndefined, omitBy } from 'lodash-es'\nimport { useCallback, useRef, useState } from 'react'\nimport { SetOptional } from 'type-fest'\nimport { ColumnModel as SynapseTypesColumnModel } from '@sage-bionetworks/synapse-types'\nimport useCreateTableFromCsv from './useCreateTableFromCsv'\nimport CsvUploadPreviewContent from './CsvUploadPreviewContent'\n\nexport type CreateTableFromCsvDialogProps = {\n /** Whether the dialog is open */\n open: boolean\n /** Callback when the dialog is closed */\n onClose: () => void\n /** Destination project/folder to upload to */\n parentId: string\n /** Invoked after all backend operations successfully complete */\n onSuccess?: () => void\n}\n\nenum CreateTableFromCsvStep {\n CSV_UPLOAD_PREVIEW = 0,\n TABLE_NAME = 1,\n}\n\n/**\n * A multi-step modal wizard used to create a Synapse Table entity from an uploaded CSV file.\n * It manages two primary phases:\n * 1. CSV Upload & Preview: Displays data preview and infers suggested column models.\n * 2. Table Configuration: Sets table name and allows schema customization.\n */\nexport default function CreateTableFromCsvDialog(\n props: CreateTableFromCsvDialogProps,\n) {\n const { open, onClose, parentId, onSuccess } = props\n const csvUploadPreviewWorkflow = useCsvUploadPreview()\n const [step, setStep] = useState(CreateTableFromCsvStep.CSV_UPLOAD_PREVIEW)\n const [tableName, setTableName] = useState('')\n const [columnModels, setColumnModels] = useState<\n SetOptional<SynapseTypesColumnModel, 'id'>[]\n >([])\n const columnSchemaFormRef = useRef<SubmitHandle>(null)\n\n const { mutate: createTableFromCsv, isPending: isUploading } =\n useCreateTableFromCsv({\n onSuccess() {\n onSuccess?.()\n },\n onError(error) {\n displayToast(error.message, 'danger')\n },\n })\n\n const handleFinish = useCallback(\n (columnModelsParam: SetOptional<SynapseTypesColumnModel, 'id'>[] = []) => {\n createTableFromCsv({\n parentId,\n tableName,\n columnModels: columnModelsParam,\n csvTableDescriptor: csvUploadPreviewWorkflow.csvTableDescriptor,\n fileHandleId: csvUploadPreviewWorkflow.uploadedFileHandleId!,\n })\n },\n [\n createTableFromCsv,\n parentId,\n tableName,\n csvUploadPreviewWorkflow.csvTableDescriptor,\n csvUploadPreviewWorkflow.uploadedFileHandleId,\n ],\n )\n\n const onColumnSchemaSubmit = useCallback(\n (editedColumnModels: SetOptional<SynapseTypesColumnModel, 'id'>[]) => {\n void handleFinish(editedColumnModels)\n },\n [handleFinish],\n )\n\n const handlePreviewConfirm = useCallback(() => {\n const suggestedColumns =\n csvUploadPreviewWorkflow.csvPreviewData?.suggestedColumns\n if (!suggestedColumns) {\n return\n }\n\n // create new table; initialize schema editor with suggestions and proceed to naming.\n setColumnModels(\n suggestedColumns.map(cm => omitBy(cm, isUndefined)) as SetOptional<\n SynapseTypesColumnModel,\n 'id'\n >[],\n )\n setStep(CreateTableFromCsvStep.TABLE_NAME)\n }, [csvUploadPreviewWorkflow.csvPreviewData, setStep])\n\n const tableNameStepContent = (\n <Stack spacing={2}>\n <TextField\n required\n label={'Table Name'}\n value={tableName}\n onChange={e => setTableName(e.target.value)}\n fullWidth\n />\n <Typography variant={'body1'}>\n Use the schema options button to make changes to the columns of the\n table. Use the create button to finish building the table.\n </Typography>\n <Accordion>\n <AccordionSummary expandIcon={<ExpandMoreIcon />}>\n <Typography variant={'headline3'}>Schema Options</Typography>\n </AccordionSummary>\n <AccordionDetails>\n <TableColumnSchemaForm\n initialData={columnModels}\n entityType={EntityType.table}\n ref={columnSchemaFormRef}\n onSubmit={onColumnSchemaSubmit}\n />\n </AccordionDetails>\n </Accordion>\n </Stack>\n )\n\n return (\n <DialogBase\n maxWidth={'lg'}\n title={'Upload CSV'}\n onCancel={onClose}\n open={open}\n content={\n <>\n {step === CreateTableFromCsvStep.CSV_UPLOAD_PREVIEW && (\n <CsvUploadPreviewContent workflow={csvUploadPreviewWorkflow} />\n )}\n {step === CreateTableFromCsvStep.TABLE_NAME && tableNameStepContent}\n </>\n }\n actions={\n <>\n <Button\n variant={'outlined'}\n disabled={csvUploadPreviewWorkflow.isLoadingPreview}\n onClick={() => {\n onClose()\n }}\n >\n Cancel\n </Button>\n {step === CreateTableFromCsvStep.CSV_UPLOAD_PREVIEW &&\n csvUploadPreviewWorkflow.step ===\n CsvUploadPreviewStep.COLUMN_PREVIEW && (\n <Button\n disabled={csvUploadPreviewWorkflow.isLoadingPreview}\n variant={'contained'}\n onClick={handlePreviewConfirm}\n >\n Next\n </Button>\n )}\n {step === CreateTableFromCsvStep.TABLE_NAME && (\n <>\n <Button\n variant={'outlined'}\n onClick={() =>\n setStep(CreateTableFromCsvStep.CSV_UPLOAD_PREVIEW)\n }\n >\n Back\n </Button>\n <Button\n variant={'contained'}\n onClick={() => columnSchemaFormRef.current?.submit()}\n loading={isUploading}\n disabled={!tableName}\n >\n Create\n </Button>\n </>\n )}\n </>\n }\n />\n )\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;AAmCA,IAAK,IAAL,yBAAA,GAAA;QACE,EAAA,EAAA,qBAAqB,KAAA,sBACrB,EAAA,EAAA,aAAa,KAAA;EAFV,KAAA,EAAA,CAGJ;AAQD,SAAwB,EACtB,GACA;CACA,IAAM,EAAE,SAAM,YAAS,aAAU,iBAAc,GACzC,IAA2B,GAAqB,EAChD,CAAC,GAAM,KAAW,EAAS,EAAuB,mBAAmB,EACrE,CAAC,GAAW,KAAgB,EAAS,GAAG,EACxC,CAAC,GAAc,KAAmB,EAEtC,EAAE,CAAC,EACC,IAAsB,EAAqB,KAAK,EAEhD,EAAE,QAAQ,GAAoB,WAAW,MAC7C,EAAsB;EACpB,YAAY;AACV,QAAa;;EAEf,QAAQ,GAAO;AACb,KAAa,EAAM,SAAS,SAAS;;EAExC,CAAC,EAEE,IAAe,GAClB,IAAkE,EAAE,KAAK;AACxE,IAAmB;GACjB;GACA;GACA,cAAc;GACd,oBAAoB,EAAyB;GAC7C,cAAc,EAAyB;GACxC,CAAC;IAEJ;EACE;EACA;EACA;EACA,EAAyB;EACzB,EAAyB;EAC1B,CACF,EAEK,IAAuB,GAC1B,MAAqE;AAC/D,IAAa,EAAmB;IAEvC,CAAC,EAAa,CACf,EAEK,IAAuB,QAAkB;EAC7C,IAAM,IACJ,EAAyB,gBAAgB;AACtC,QAKL,EACE,EAAiB,KAAI,MAAM,EAAO,GAAI,EAAY,CAAC,CAIpD,EACD,EAAQ,EAAuB,WAAW;IACzC,CAAC,EAAyB,gBAAgB,EAAQ,CAAC,EAEhD,IACJ,kBAAC,GAAD;EAAO,SAAS;YAAhB;GACE,kBAAC,GAAD;IACE,UAAA;IACA,OAAO;IACP,OAAO;IACP,WAAU,MAAK,EAAa,EAAE,OAAO,MAAM;IAC3C,WAAA;IACA,CAAA;GACF,kBAAC,GAAD;IAAY,SAAS;cAAS;IAGjB,CAAA;GACb,kBAAC,GAAD,EAAA,UAAA,CACE,kBAAC,GAAD;IAAkB,YAAY,kBAAC,GAAD,EAAkB,CAAA;cAC9C,kBAAC,GAAD;KAAY,SAAS;eAAa;KAA2B,CAAA;IAC5C,CAAA,EACnB,kBAAC,GAAD,EAAA,UACE,kBAAC,GAAD;IACE,aAAa;IACb,YAAY,EAAW;IACvB,KAAK;IACL,UAAU;IACV,CAAA,EACe,CAAA,CACT,EAAA,CAAA;GACN;;AAGV,QACE,kBAAC,GAAD;EACE,UAAU;EACV,OAAO;EACP,UAAU;EACJ;EACN,SACE,kBAAA,GAAA,EAAA,UAAA,CACG,MAAS,EAAuB,sBAC/B,kBAAC,GAAD,EAAyB,UAAU,GAA4B,CAAA,EAEhE,MAAS,EAAuB,cAAc,EAC9C,EAAA,CAAA;EAEL,SACE,kBAAA,GAAA,EAAA,UAAA;GACE,kBAAC,GAAD;IACE,SAAS;IACT,UAAU,EAAyB;IACnC,eAAe;AACb,QAAS;;cAEZ;IAEQ,CAAA;GACR,MAAS,EAAuB,sBAC/B,EAAyB,SACvB,EAAqB,kBACrB,kBAAC,GAAD;IACE,UAAU,EAAyB;IACnC,SAAS;IACT,SAAS;cACV;IAEQ,CAAA;GAEZ,MAAS,EAAuB,cAC/B,kBAAA,GAAA,EAAA,UAAA,CACE,kBAAC,GAAD;IACE,SAAS;IACT,eACE,EAAQ,EAAuB,mBAAmB;cAErD;IAEQ,CAAA,EACT,kBAAC,GAAD;IACE,SAAS;IACT,eAAe,EAAoB,SAAS,QAAQ;IACpD,SAAS;IACT,UAAU,CAAC;cACZ;IAEQ,CAAA,CACR,EAAA,CAAA;GAEJ,EAAA,CAAA;EAEL,CAAA"}
|
|
@@ -4,15 +4,15 @@ export type CsvPreviewDialogProps = {
|
|
|
4
4
|
open: boolean;
|
|
5
5
|
/** Callback when the dialog is closed */
|
|
6
6
|
onClose: () => void;
|
|
7
|
-
/** Callback when the user confirms the column models
|
|
8
|
-
* @param dataFileHandleId - The file handle ID of the uploaded CSV
|
|
9
|
-
* @param columnModels - The confirmed column models
|
|
10
|
-
* */
|
|
11
|
-
onConfirm: (dataFileHandleId: string, columnModels: ColumnModel[], csvTableDescriptor: CsvTableDescriptor) => void;
|
|
12
7
|
/** Whether the confirm action is pending */
|
|
13
8
|
confirmIsPending?: boolean;
|
|
14
9
|
/** An optional error message to display */
|
|
15
10
|
errorMessage?: string;
|
|
11
|
+
/** Callback when the user confirms the column models
|
|
12
|
+
* @param dataFileHandleId - The file handle ID of the uploaded CSV
|
|
13
|
+
* @param columnModels - The confirmed column models
|
|
14
|
+
*/
|
|
15
|
+
onConfirm: (dataFileHandleId: string, columnModels: ColumnModel[], csvTableDescriptor: CsvTableDescriptor) => void;
|
|
16
16
|
};
|
|
17
17
|
export default function CsvPreviewDialog(props: CsvPreviewDialogProps): import("react/jsx-runtime").JSX.Element;
|
|
18
18
|
//# sourceMappingURL=CsvPreviewDialog.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CsvPreviewDialog.d.ts","sourceRoot":"","sources":["../../../../src/components/table/CsvPreview/CsvPreviewDialog.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"CsvPreviewDialog.d.ts","sourceRoot":"","sources":["../../../../src/components/table/CsvPreview/CsvPreviewDialog.tsx"],"names":[],"mappings":"AAOA,OAAO,EACL,WAAW,EACX,kBAAkB,EACnB,MAAM,kCAAkC,CAAA;AAGzC,MAAM,MAAM,qBAAqB,GAAG;IAClC,iCAAiC;IACjC,IAAI,EAAE,OAAO,CAAA;IACb,yCAAyC;IACzC,OAAO,EAAE,MAAM,IAAI,CAAA;IACnB,4CAA4C;IAC5C,gBAAgB,CAAC,EAAE,OAAO,CAAA;IAC1B,2CAA2C;IAC3C,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB;;;OAGG;IACH,SAAS,EAAE,CACT,gBAAgB,EAAE,MAAM,EACxB,YAAY,EAAE,WAAW,EAAE,EAC3B,kBAAkB,EAAE,kBAAkB,KACnC,IAAI,CAAA;CACV,CAAA;AAED,MAAM,CAAC,OAAO,UAAU,gBAAgB,CAAC,KAAK,EAAE,qBAAqB,2CAgEpE"}
|