synapse-react-client 4.0.2 → 4.0.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/SWC.index.js +1 -1
- package/dist/assets/icons/AwardScroll.d.ts +5 -0
- package/dist/assets/icons/AwardScroll.d.ts.map +1 -0
- package/dist/assets/icons/AwardScroll.js +78 -0
- package/dist/assets/icons/AwardScroll.js.map +1 -0
- package/dist/assets/icons/Baseline.d.ts +5 -0
- package/dist/assets/icons/Baseline.d.ts.map +1 -0
- package/dist/assets/icons/Baseline.js +43 -0
- package/dist/assets/icons/Baseline.js.map +1 -0
- package/dist/assets/icons/Challenge.svg +13 -0
- package/dist/assets/icons/Challenge.svg.js +7 -0
- package/dist/assets/icons/Challenge.svg.js.map +1 -0
- package/dist/assets/icons/ClappingHands.d.ts +5 -0
- package/dist/assets/icons/ClappingHands.d.ts.map +1 -0
- package/dist/assets/icons/ClappingHands.js +106 -0
- package/dist/assets/icons/ClappingHands.js.map +1 -0
- package/dist/assets/icons/HandWithMoney.d.ts +5 -0
- package/dist/assets/icons/HandWithMoney.d.ts.map +1 -0
- package/dist/assets/icons/HandWithMoney.js +15 -0
- package/dist/assets/icons/HandWithMoney.js.map +1 -0
- package/dist/assets/icons/MultiFile.d.ts +5 -0
- package/dist/assets/icons/MultiFile.d.ts.map +1 -0
- package/dist/assets/icons/MultiFile.js +8 -0
- package/dist/assets/icons/MultiFile.js.map +1 -0
- package/dist/assets/icons/MultiFile.svg +4 -0
- package/dist/assets/icons/MultiFile.svg.js +7 -0
- package/dist/assets/icons/MultiFile.svg.js.map +1 -0
- package/dist/assets/icons/OpenBook.d.ts +5 -0
- package/dist/assets/icons/OpenBook.d.ts.map +1 -0
- package/dist/assets/icons/OpenBook.js +99 -0
- package/dist/assets/icons/OpenBook.js.map +1 -0
- package/dist/assets/icons/Podium.d.ts +5 -0
- package/dist/assets/icons/Podium.d.ts.map +1 -0
- package/dist/assets/icons/Podium.js +36 -0
- package/dist/assets/icons/Podium.js.map +1 -0
- package/dist/assets/icons/RosetteRibbon.d.ts +5 -0
- package/dist/assets/icons/RosetteRibbon.d.ts.map +1 -0
- package/dist/assets/icons/RosetteRibbon.js +36 -0
- package/dist/assets/icons/RosetteRibbon.js.map +1 -0
- package/dist/assets/icons/StarTrophy.d.ts +5 -0
- package/dist/assets/icons/StarTrophy.d.ts.map +1 -0
- package/dist/assets/icons/StarTrophy.js +99 -0
- package/dist/assets/icons/StarTrophy.js.map +1 -0
- package/dist/assets/icons/ThreeStars.d.ts +5 -0
- package/dist/assets/icons/ThreeStars.d.ts.map +1 -0
- package/dist/assets/icons/ThreeStars.js +71 -0
- package/dist/assets/icons/ThreeStars.js.map +1 -0
- package/dist/assets/icons/UnpackagableFile.d.ts +5 -0
- package/dist/assets/icons/UnpackagableFile.d.ts.map +1 -0
- package/dist/assets/icons/UnpackagableFile.js +8 -0
- package/dist/assets/icons/UnpackagableFile.js.map +1 -0
- package/dist/assets/icons/UnpackagableFile.svg +4 -0
- package/dist/assets/icons/UnpackagableFile.svg.js +7 -0
- package/dist/assets/icons/UnpackagableFile.svg.js.map +1 -0
- package/dist/assets/mui_components/PackagableFile.d.ts.map +1 -1
- package/dist/assets/mui_components/PackagableFile.js +5 -4
- package/dist/assets/mui_components/PackagableFile.js.map +1 -1
- package/dist/assets/mui_components/PackagableFile.svg +3 -0
- package/dist/assets/mui_components/PackagableFile.svg.js +7 -0
- package/dist/assets/mui_components/PackagableFile.svg.js.map +1 -0
- package/dist/assets/themed_icons/index.d.ts +1 -2
- package/dist/assets/themed_icons/index.d.ts.map +1 -1
- package/dist/assets/themed_icons/index.js +8 -10
- package/dist/assets/themed_icons/index.js.map +1 -1
- package/dist/components/AcknowledgementsPage/AcknowledgementsPage.js +4 -4
- package/dist/components/AcknowledgementsPage/AcknowledgementsPage.js.map +1 -1
- package/dist/components/AddToDownloadListV2.js +10 -10
- package/dist/components/AddToDownloadListV2.js.map +1 -1
- package/dist/components/BasePortalCard/BasePortalCard.css +1 -1
- package/dist/components/BasePortalCard/BasePortalCard.d.ts +1 -2
- package/dist/components/BasePortalCard/BasePortalCard.d.ts.map +1 -1
- package/dist/components/BasePortalCard/BasePortalCard.js +21 -28
- package/dist/components/BasePortalCard/BasePortalCard.js.map +1 -1
- package/dist/components/BasePortalCard/BasePortalCard.module.scss +7 -1
- package/dist/components/BasePortalCard/BasePortalCard.module.scss.js +11 -11
- package/dist/components/BasePortalCard/ColorfulPortalCardWithChips/ColorfulPortalCardWithChips.d.ts.map +1 -1
- package/dist/components/BasePortalCard/ColorfulPortalCardWithChips/ColorfulPortalCardWithChips.js +24 -24
- package/dist/components/BasePortalCard/ColorfulPortalCardWithChips/ColorfulPortalCardWithChips.js.map +1 -1
- package/dist/components/CardContainerLogic/CardContainerLogic.d.ts +5 -1
- package/dist/components/CardContainerLogic/CardContainerLogic.d.ts.map +1 -1
- package/dist/components/CardContainerLogic/CardContainerLogic.js.map +1 -1
- package/dist/components/CardContainerLogic/index.d.ts +1 -1
- package/dist/components/CardContainerLogic/index.d.ts.map +1 -1
- package/dist/components/CardDeck/TableQueryCardDeck.js +12 -9
- package/dist/components/CardDeck/TableQueryCardDeck.js.map +1 -1
- package/dist/components/ChallengeDataDownload/ChallengeDataDownload.js +33 -33
- package/dist/components/ChallengeDataDownload/ChallengeDataDownload.js.map +1 -1
- package/dist/components/ChangePassword/useChangePasswordFormState.js +5 -2
- package/dist/components/ChangePassword/useChangePasswordFormState.js.map +1 -1
- package/dist/components/ComponentCollapse.d.ts +6 -10
- package/dist/components/ComponentCollapse.d.ts.map +1 -1
- package/dist/components/ComponentCollapse.js +31 -35
- package/dist/components/ComponentCollapse.js.map +1 -1
- package/dist/components/CreateOrUpdateAccessRequirementWizard/CreateOrUpdateAccessRequirementWizard.js +12 -9
- package/dist/components/CreateOrUpdateAccessRequirementWizard/CreateOrUpdateAccessRequirementWizard.js.map +1 -1
- package/dist/components/DataGrid/MergeGridWithSourceTableButton.js +8 -3
- package/dist/components/DataGrid/MergeGridWithSourceTableButton.js.map +1 -1
- package/dist/components/DataGrid/SynapseGrid.js +8 -3
- package/dist/components/DataGrid/SynapseGrid.js.map +1 -1
- package/dist/components/DataGrid/components/UploadCsvToGridDialog.js +8 -3
- package/dist/components/DataGrid/components/UploadCsvToGridDialog.js.map +1 -1
- package/dist/components/DirectDownload/DirectDownload.d.ts.map +1 -1
- package/dist/components/DirectDownload/DirectDownload.js +23 -23
- package/dist/components/DirectDownload/DirectDownload.js.map +1 -1
- package/dist/components/DownloadCart/AvailableForDownloadTable.d.ts +6 -2
- package/dist/components/DownloadCart/AvailableForDownloadTable.d.ts.map +1 -1
- package/dist/components/DownloadCart/AvailableForDownloadTable.js +10 -8
- package/dist/components/DownloadCart/AvailableForDownloadTable.js.map +1 -1
- package/dist/components/DownloadCart/CreatePackageV2.css +1 -0
- package/dist/components/DownloadCart/CreatePackageV2.d.ts.map +1 -1
- package/dist/components/DownloadCart/CreatePackageV2.js +50 -46
- package/dist/components/DownloadCart/CreatePackageV2.js.map +1 -1
- package/dist/components/DownloadCart/CreatePackageV2.module.scss +38 -0
- package/dist/components/DownloadCart/CreatePackageV2.module.scss.js +14 -0
- package/dist/components/DownloadCart/CreatePackageV2.module.scss.js.map +1 -0
- package/dist/components/DownloadCart/DownloadCartPage.css +1 -0
- package/dist/components/DownloadCart/DownloadCartPage.d.ts.map +1 -1
- package/dist/components/DownloadCart/DownloadCartPage.js +316 -186
- package/dist/components/DownloadCart/DownloadCartPage.js.map +1 -1
- package/dist/components/DownloadCart/DownloadCartPage.module.scss +217 -0
- package/dist/components/DownloadCart/DownloadCartPage.module.scss.js +48 -0
- package/dist/components/DownloadCart/DownloadCartPage.module.scss.js.map +1 -0
- package/dist/components/DownloadCart/DownloadDetails.js +1 -1
- package/dist/components/DownloadCart/DownloadDetails.js.map +1 -1
- package/dist/components/DownloadCart/DownloadIneligibleForPackagingFilesFromListButton.js +33 -33
- package/dist/components/DownloadCart/DownloadIneligibleForPackagingFilesFromListButton.js.map +1 -1
- package/dist/components/DownloadCart/DownloadListTable.d.ts +4 -1
- package/dist/components/DownloadCart/DownloadListTable.d.ts.map +1 -1
- package/dist/components/DownloadCart/DownloadListTable.js +156 -236
- package/dist/components/DownloadCart/DownloadListTable.js.map +1 -1
- package/dist/components/DownloadCart/ShowDownloadV2.js +5 -5
- package/dist/components/DownloadCart/ShowDownloadV2.js.map +1 -1
- package/dist/components/Ecosystem/EcosystemSkeleton.js +8 -3
- package/dist/components/Ecosystem/EcosystemSkeleton.js.map +1 -1
- package/dist/components/EntityDownloadButton/EntityDownloadButton.js +20 -20
- package/dist/components/EntityDownloadButton/EntityDownloadButton.js.map +1 -1
- package/dist/components/EntityFinder/details/view/table/AddToDownloadListCell.js +3 -3
- package/dist/components/EntityFinder/details/view/table/AddToDownloadListCell.js.map +1 -1
- package/dist/components/FeaturedDataTabs/FacetPlotsCard.js +6 -2
- package/dist/components/FeaturedDataTabs/FacetPlotsCard.js.map +1 -1
- package/dist/components/FeaturedDataTabs/FeaturedDataTabs.js +11 -8
- package/dist/components/FeaturedDataTabs/FeaturedDataTabs.js.map +1 -1
- package/dist/components/FullWidthAlert/FullWidthAlert.d.ts +2 -2
- package/dist/components/FullWidthAlert/FullWidthAlert.js.map +1 -1
- package/dist/components/GenericCard/GenericCard.d.ts +5 -5
- package/dist/components/GenericCard/GenericCard.d.ts.map +1 -1
- package/dist/components/GenericCard/GenericCard.js +117 -103
- package/dist/components/GenericCard/GenericCard.js.map +1 -1
- package/dist/components/GenericCard/LabelMaybeWithIcon.d.ts +10 -0
- package/dist/components/GenericCard/LabelMaybeWithIcon.d.ts.map +1 -0
- package/dist/components/GenericCard/LabelMaybeWithIcon.js +33 -0
- package/dist/components/GenericCard/LabelMaybeWithIcon.js.map +1 -0
- package/dist/components/GenericCard/SynapseCardLabel.d.ts +2 -1
- package/dist/components/GenericCard/SynapseCardLabel.d.ts.map +1 -1
- package/dist/components/GenericCard/SynapseCardLabel.js +86 -81
- package/dist/components/GenericCard/SynapseCardLabel.js.map +1 -1
- package/dist/components/GenericCard/TableRowGenericCard.d.ts +7 -1
- package/dist/components/GenericCard/TableRowGenericCard.d.ts.map +1 -1
- package/dist/components/GenericCard/TableRowGenericCard.js +239 -202
- package/dist/components/GenericCard/TableRowGenericCard.js.map +1 -1
- package/dist/components/HeaderCard.js +17 -13
- package/dist/components/HeaderCard.js.map +1 -1
- package/dist/components/Icon/Icon.js +52 -52
- package/dist/components/Icon/Icon.js.map +1 -1
- package/dist/components/IconSvg/IconSvg.d.ts +1 -1
- package/dist/components/IconSvg/IconSvg.d.ts.map +1 -1
- package/dist/components/IconSvg/IconSvg.js +215 -171
- package/dist/components/IconSvg/IconSvg.js.map +1 -1
- package/dist/components/QueryWrapperPlotNav/QueryWrapperPlotNav.d.ts +1 -0
- package/dist/components/QueryWrapperPlotNav/QueryWrapperPlotNav.d.ts.map +1 -1
- package/dist/components/QueryWrapperPlotNav/QueryWrapperPlotNav.js +103 -102
- package/dist/components/QueryWrapperPlotNav/QueryWrapperPlotNav.js.map +1 -1
- package/dist/components/StorybookComponentWrapper.js +6 -3
- package/dist/components/StorybookComponentWrapper.js.map +1 -1
- package/dist/components/SynapseChat/SynapseChat.d.ts +7 -1
- package/dist/components/SynapseChat/SynapseChat.d.ts.map +1 -1
- package/dist/components/SynapseChat/SynapseChat.js +76 -67
- package/dist/components/SynapseChat/SynapseChat.js.map +1 -1
- package/dist/components/SynapseChat/SynapseChatInteraction.d.ts +2 -1
- package/dist/components/SynapseChat/SynapseChatInteraction.d.ts.map +1 -1
- package/dist/components/SynapseChat/SynapseChatInteraction.js +83 -58
- package/dist/components/SynapseChat/SynapseChatInteraction.js.map +1 -1
- package/dist/components/SynapseChat/SynapseChatMessage.d.ts +1 -0
- package/dist/components/SynapseChat/SynapseChatMessage.d.ts.map +1 -1
- package/dist/components/SynapseChat/SynapseChatMessage.js +16 -15
- package/dist/components/SynapseChat/SynapseChatMessage.js.map +1 -1
- package/dist/components/SynapseChat/SynapsePortalChatDialog.d.ts +12 -0
- package/dist/components/SynapseChat/SynapsePortalChatDialog.d.ts.map +1 -0
- package/dist/components/SynapseChat/SynapsePortalChatDialog.js +30 -0
- package/dist/components/SynapseChat/SynapsePortalChatDialog.js.map +1 -0
- package/dist/components/SynapseChat/extractMessageFromTraceEvent.d.ts.map +1 -1
- package/dist/components/SynapseChat/extractMessageFromTraceEvent.js +22 -16
- package/dist/components/SynapseChat/extractMessageFromTraceEvent.js.map +1 -1
- package/dist/components/SynapseChat/index.d.ts +2 -0
- package/dist/components/SynapseChat/index.d.ts.map +1 -1
- package/dist/components/SynapseChat/index.js +5 -3
- package/dist/components/SynapseChat/index.js.map +1 -1
- package/dist/components/SynapseChat/useChatState.d.ts +1 -1
- package/dist/components/SynapseChat/useChatState.d.ts.map +1 -1
- package/dist/components/SynapseChat/useChatState.js +10 -7
- package/dist/components/SynapseChat/useChatState.js.map +1 -1
- package/dist/components/SynapseNavDrawer/SynapseNavDrawer.js +25 -25
- package/dist/components/SynapseNavDrawer/SynapseNavDrawer.js.map +1 -1
- package/dist/components/SynapseTable/RowSelection/RowSelectionControls.js +13 -13
- package/dist/components/SynapseTable/RowSelection/RowSelectionControls.js.map +1 -1
- package/dist/components/SynapseTable/TopLevelControls/TopLevelControlsUtils.js +9 -9
- package/dist/components/SynapseTable/TopLevelControls/TopLevelControlsUtils.js.map +1 -1
- package/dist/components/TextToComponentCollapse.d.ts +16 -0
- package/dist/components/TextToComponentCollapse.d.ts.map +1 -0
- package/dist/components/TextToComponentCollapse.js +29 -0
- package/dist/components/TextToComponentCollapse.js.map +1 -0
- package/dist/components/download_list/AddToDownloadListConfirmationAlert/AddToDownloadListConfirmationAlert.js +8 -3
- package/dist/components/download_list/AddToDownloadListConfirmationAlert/AddToDownloadListConfirmationAlert.js.map +1 -1
- package/dist/components/download_list/DownloadConfirmationUI.d.ts +1 -1
- package/dist/components/download_list/DownloadConfirmationUI.js +22 -22
- package/dist/components/download_list/DownloadConfirmationUI.js.map +1 -1
- package/dist/components/download_list/DownloadConfirmationUtils.js +4 -4
- package/dist/components/download_list/DownloadConfirmationUtils.js.map +1 -1
- package/dist/components/index.js +85 -83
- package/dist/components/index.js.map +1 -1
- package/dist/components/row_renderers/ObservationCard.js +12 -11
- package/dist/components/row_renderers/ObservationCard.js.map +1 -1
- package/dist/components/row_renderers/utils/CardFooter.d.ts +1 -3
- package/dist/components/row_renderers/utils/CardFooter.d.ts.map +1 -1
- package/dist/components/row_renderers/utils/CardFooter.js +31 -45
- package/dist/components/row_renderers/utils/CardFooter.js.map +1 -1
- package/dist/components/table/CsvPreview/CsvPreview.js +8 -3
- package/dist/components/table/CsvPreview/CsvPreview.js.map +1 -1
- package/dist/components/table/CsvPreview/CsvPreviewDialog.js +8 -3
- package/dist/components/table/CsvPreview/CsvPreviewDialog.js.map +1 -1
- package/dist/features/curator/GridPage/GridPage.js +8 -3
- package/dist/features/curator/GridPage/GridPage.js.map +1 -1
- package/dist/features/curator/GridPage/components/GridPageTitle.js +8 -3
- package/dist/features/curator/GridPage/components/GridPageTitle.js.map +1 -1
- package/dist/index.js +137 -135
- package/dist/index.js.map +1 -1
- package/dist/style/components/_all.scss +0 -1
- package/dist/style/components/_cards.scss +22 -0
- package/dist/style/components/_download-list-v2.scss +1 -1
- package/dist/style/components/_query-wrapper-plot-nav.scss +13 -0
- package/dist/style/main.css +1 -1
- package/dist/tsconfig.build.tsbuildinfo +1 -1
- package/dist/utils/AppUtils/session/ApplicationSessionManager.d.ts.map +1 -1
- package/dist/utils/AppUtils/session/ApplicationSessionManager.js.map +1 -1
- package/dist/utils/context/FullContextProvider.js +9 -9
- package/dist/utils/context/FullContextProvider.js.map +1 -1
- package/dist/utils/context/SynapseContext.d.ts.map +1 -1
- package/dist/utils/context/SynapseContext.js +1 -0
- package/dist/utils/context/SynapseContext.js.map +1 -1
- package/dist/utils/functions/SqlFunctions.d.ts +4 -0
- package/dist/utils/functions/SqlFunctions.d.ts.map +1 -1
- package/dist/utils/functions/SqlFunctions.js +25 -23
- package/dist/utils/functions/SqlFunctions.js.map +1 -1
- package/package.json +5 -5
- package/dist/assets/themed_icons/Challenge.d.ts +0 -3
- package/dist/assets/themed_icons/Challenge.d.ts.map +0 -1
- package/dist/assets/themed_icons/Challenge.js +0 -25
- package/dist/assets/themed_icons/Challenge.js.map +0 -1
- package/dist/style/components/_download-cart-page.scss +0 -204
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CreateOrUpdateAccessRequirementWizard.js","sources":["../../../src/components/CreateOrUpdateAccessRequirementWizard/CreateOrUpdateAccessRequirementWizard.tsx"],"sourcesContent":["import { MANAGED_ACT_ACCESS_REQUIREMENT_CONCRETE_TYPE_VALUE } from '@sage-bionetworks/synapse-types'\nimport { MouseEventHandler, useMemo, useRef, useState } from 'react'\nimport {\n AccessRequirementAclEditor,\n AccessRequirementAclEditorHandle,\n} from '../AccessRequirementAclEditor/AccessRequirementAclEditor'\nimport ConfirmationDialog from '../ConfirmationDialog'\nimport {\n SetAccessRequirementCommonFields,\n SetAccessRequirementCommonFieldsHandle,\n SetAccessRequirementCommonFieldsProps,\n} from '../SetAccessRequirementCommonFields'\nimport SetBasicAccessRequirementFields, {\n SetBasicAccessRequirementFieldsHandle,\n} from '../SetBasicAccessRequirementFields'\nimport SetManagedAccessRequirementFields, {\n SetManagedAccessRequirementFieldsHandle,\n} from '../SetManagedAccessRequirementFields'\nimport {\n CreateOrUpdateAccessRequirementWizardStep,\n getDialogTitle,\n isLastStep,\n} from './CreateOrUpdateAccessRequirementWizardUtils'\n\nexport type CreateOrUpdateAccessRequirementWizardProps = {\n open: boolean\n onCancel: () => void\n onComplete: (accessRequirementID?: string) => void // return the (possibly new) Access Requirement ID\n} & Pick<\n SetAccessRequirementCommonFieldsProps,\n 'subject' | 'accessRequirementId'\n>\n\nexport function CreateOrUpdateAccessRequirementWizard(\n props: CreateOrUpdateAccessRequirementWizardProps,\n) {\n const { open, onCancel, onComplete } = props\n\n const [step, setStep] = useState<CreateOrUpdateAccessRequirementWizardStep>(\n 'SET_AR_COMMON_FIELDS',\n )\n const [isLoading, setIsLoading] = useState<boolean>(false)\n const [accessRequirementId, setAccessRequirementId] = useState<\n string | undefined\n >(props.accessRequirementId)\n\n const setArCommonFieldsRef =\n useRef<SetAccessRequirementCommonFieldsHandle>(null)\n const setManagedArFieldsRef =\n useRef<SetManagedAccessRequirementFieldsHandle>(null)\n const editArAclRef = useRef<AccessRequirementAclEditorHandle>(null)\n const setBasicArFieldsRef =\n useRef<SetBasicAccessRequirementFieldsHandle>(null)\n\n const isEditing = Boolean(props['accessRequirementId'])\n\n const stepContent = useMemo(() => {\n switch (step) {\n case 'SET_AR_COMMON_FIELDS':\n return (\n <SetAccessRequirementCommonFields\n ref={setArCommonFieldsRef}\n onSave={(accessRequirementId, accessRequirementConcreteType) => {\n setAccessRequirementId(accessRequirementId)\n const nextStep: CreateOrUpdateAccessRequirementWizardStep =\n accessRequirementConcreteType ===\n MANAGED_ACT_ACCESS_REQUIREMENT_CONCRETE_TYPE_VALUE\n ? 'SET_MANAGED_AR_FIELDS'\n : 'SET_BASIC_AR_FIELDS'\n setStep(nextStep)\n setIsLoading(false)\n }}\n onError={() => setIsLoading(false)}\n subject={props.subject}\n accessRequirementId={props.accessRequirementId}\n />\n )\n case 'SET_MANAGED_AR_FIELDS':\n return (\n <SetManagedAccessRequirementFields\n ref={setManagedArFieldsRef}\n accessRequirementId={accessRequirementId!}\n onSave={() => {\n setStep('SET_MANAGED_AR_ACL_PERMISSIONS')\n setIsLoading(false)\n }}\n onError={() => {\n setIsLoading(false)\n }}\n />\n )\n case 'SET_MANAGED_AR_ACL_PERMISSIONS':\n return (\n <AccessRequirementAclEditor\n ref={editArAclRef}\n accessRequirementId={accessRequirementId!}\n onSaveComplete={saveSuccessful => {\n if (saveSuccessful) {\n onComplete(accessRequirementId)\n }\n setIsLoading(false)\n }}\n />\n )\n case 'SET_BASIC_AR_FIELDS':\n return (\n <SetBasicAccessRequirementFields\n ref={setBasicArFieldsRef}\n accessRequirementId={accessRequirementId!}\n onSave={() => {\n onComplete(accessRequirementId)\n setIsLoading(false)\n }}\n onError={() => setIsLoading(false)}\n />\n )\n }\n }, [\n step,\n props.subject,\n props.accessRequirementId,\n accessRequirementId,\n onComplete,\n ])\n\n const onClickPrimary: MouseEventHandler<HTMLButtonElement> = e => {\n // SWC-7055 - The default action may trigger `beforeunload` and erroneously warn the user about leaving the page.\n e.preventDefault()\n setIsLoading(true)\n switch (step) {\n case 'SET_AR_COMMON_FIELDS':\n setArCommonFieldsRef?.current?.save()\n return\n case 'SET_MANAGED_AR_FIELDS':\n setManagedArFieldsRef?.current?.save()\n return\n case 'SET_MANAGED_AR_ACL_PERMISSIONS':\n editArAclRef?.current?.save()\n return\n case 'SET_BASIC_AR_FIELDS':\n setBasicArFieldsRef?.current?.save()\n }\n }\n\n return (\n <ConfirmationDialog\n open={open}\n onCancel={onCancel}\n onConfirm={onClickPrimary}\n confirmButtonProps={{\n children: isLastStep(step) ? 'Save' : 'Save & Continue',\n disabled: isLoading,\n }}\n maxWidth={'md'}\n title={getDialogTitle(step, isEditing)}\n content={stepContent}\n />\n )\n}\n\nexport default CreateOrUpdateAccessRequirementWizard\n"],"names":["CreateOrUpdateAccessRequirementWizard","props","open","onCancel","onComplete","step","setStep","useState","isLoading","setIsLoading","accessRequirementId","setAccessRequirementId","setArCommonFieldsRef","useRef","setManagedArFieldsRef","editArAclRef","setBasicArFieldsRef","isEditing","stepContent","useMemo","jsx","SetAccessRequirementCommonFields","accessRequirementConcreteType","MANAGED_ACT_ACCESS_REQUIREMENT_CONCRETE_TYPE_VALUE","SetManagedAccessRequirementFields","AccessRequirementAclEditor","saveSuccessful","SetBasicAccessRequirementFields","ConfirmationDialog","e","isLastStep","getDialogTitle"],"mappings":"
|
|
1
|
+
{"version":3,"file":"CreateOrUpdateAccessRequirementWizard.js","sources":["../../../src/components/CreateOrUpdateAccessRequirementWizard/CreateOrUpdateAccessRequirementWizard.tsx"],"sourcesContent":["import { MANAGED_ACT_ACCESS_REQUIREMENT_CONCRETE_TYPE_VALUE } from '@sage-bionetworks/synapse-types'\nimport { MouseEventHandler, useMemo, useRef, useState } from 'react'\nimport {\n AccessRequirementAclEditor,\n AccessRequirementAclEditorHandle,\n} from '../AccessRequirementAclEditor/AccessRequirementAclEditor'\nimport ConfirmationDialog from '../ConfirmationDialog'\nimport {\n SetAccessRequirementCommonFields,\n SetAccessRequirementCommonFieldsHandle,\n SetAccessRequirementCommonFieldsProps,\n} from '../SetAccessRequirementCommonFields'\nimport SetBasicAccessRequirementFields, {\n SetBasicAccessRequirementFieldsHandle,\n} from '../SetBasicAccessRequirementFields'\nimport SetManagedAccessRequirementFields, {\n SetManagedAccessRequirementFieldsHandle,\n} from '../SetManagedAccessRequirementFields'\nimport {\n CreateOrUpdateAccessRequirementWizardStep,\n getDialogTitle,\n isLastStep,\n} from './CreateOrUpdateAccessRequirementWizardUtils'\n\nexport type CreateOrUpdateAccessRequirementWizardProps = {\n open: boolean\n onCancel: () => void\n onComplete: (accessRequirementID?: string) => void // return the (possibly new) Access Requirement ID\n} & Pick<\n SetAccessRequirementCommonFieldsProps,\n 'subject' | 'accessRequirementId'\n>\n\nexport function CreateOrUpdateAccessRequirementWizard(\n props: CreateOrUpdateAccessRequirementWizardProps,\n) {\n const { open, onCancel, onComplete } = props\n\n const [step, setStep] = useState<CreateOrUpdateAccessRequirementWizardStep>(\n 'SET_AR_COMMON_FIELDS',\n )\n const [isLoading, setIsLoading] = useState<boolean>(false)\n const [accessRequirementId, setAccessRequirementId] = useState<\n string | undefined\n >(props.accessRequirementId)\n\n const setArCommonFieldsRef =\n useRef<SetAccessRequirementCommonFieldsHandle>(null)\n const setManagedArFieldsRef =\n useRef<SetManagedAccessRequirementFieldsHandle>(null)\n const editArAclRef = useRef<AccessRequirementAclEditorHandle>(null)\n const setBasicArFieldsRef =\n useRef<SetBasicAccessRequirementFieldsHandle>(null)\n\n const isEditing = Boolean(props['accessRequirementId'])\n\n const stepContent = useMemo(() => {\n switch (step) {\n case 'SET_AR_COMMON_FIELDS':\n return (\n <SetAccessRequirementCommonFields\n ref={setArCommonFieldsRef}\n onSave={(accessRequirementId, accessRequirementConcreteType) => {\n setAccessRequirementId(accessRequirementId)\n const nextStep: CreateOrUpdateAccessRequirementWizardStep =\n accessRequirementConcreteType ===\n MANAGED_ACT_ACCESS_REQUIREMENT_CONCRETE_TYPE_VALUE\n ? 'SET_MANAGED_AR_FIELDS'\n : 'SET_BASIC_AR_FIELDS'\n setStep(nextStep)\n setIsLoading(false)\n }}\n onError={() => setIsLoading(false)}\n subject={props.subject}\n accessRequirementId={props.accessRequirementId}\n />\n )\n case 'SET_MANAGED_AR_FIELDS':\n return (\n <SetManagedAccessRequirementFields\n ref={setManagedArFieldsRef}\n accessRequirementId={accessRequirementId!}\n onSave={() => {\n setStep('SET_MANAGED_AR_ACL_PERMISSIONS')\n setIsLoading(false)\n }}\n onError={() => {\n setIsLoading(false)\n }}\n />\n )\n case 'SET_MANAGED_AR_ACL_PERMISSIONS':\n return (\n <AccessRequirementAclEditor\n ref={editArAclRef}\n accessRequirementId={accessRequirementId!}\n onSaveComplete={saveSuccessful => {\n if (saveSuccessful) {\n onComplete(accessRequirementId)\n }\n setIsLoading(false)\n }}\n />\n )\n case 'SET_BASIC_AR_FIELDS':\n return (\n <SetBasicAccessRequirementFields\n ref={setBasicArFieldsRef}\n accessRequirementId={accessRequirementId!}\n onSave={() => {\n onComplete(accessRequirementId)\n setIsLoading(false)\n }}\n onError={() => setIsLoading(false)}\n />\n )\n }\n }, [\n step,\n props.subject,\n props.accessRequirementId,\n accessRequirementId,\n onComplete,\n ])\n\n const onClickPrimary: MouseEventHandler<HTMLButtonElement> = e => {\n // SWC-7055 - The default action may trigger `beforeunload` and erroneously warn the user about leaving the page.\n e.preventDefault()\n setIsLoading(true)\n switch (step) {\n case 'SET_AR_COMMON_FIELDS':\n setArCommonFieldsRef?.current?.save()\n return\n case 'SET_MANAGED_AR_FIELDS':\n setManagedArFieldsRef?.current?.save()\n return\n case 'SET_MANAGED_AR_ACL_PERMISSIONS':\n editArAclRef?.current?.save()\n return\n case 'SET_BASIC_AR_FIELDS':\n setBasicArFieldsRef?.current?.save()\n }\n }\n\n return (\n <ConfirmationDialog\n open={open}\n onCancel={onCancel}\n onConfirm={onClickPrimary}\n confirmButtonProps={{\n children: isLastStep(step) ? 'Save' : 'Save & Continue',\n disabled: isLoading,\n }}\n maxWidth={'md'}\n title={getDialogTitle(step, isEditing)}\n content={stepContent}\n />\n )\n}\n\nexport default CreateOrUpdateAccessRequirementWizard\n"],"names":["CreateOrUpdateAccessRequirementWizard","props","open","onCancel","onComplete","step","setStep","useState","isLoading","setIsLoading","accessRequirementId","setAccessRequirementId","setArCommonFieldsRef","useRef","setManagedArFieldsRef","editArAclRef","setBasicArFieldsRef","isEditing","stepContent","useMemo","jsx","SetAccessRequirementCommonFields","accessRequirementConcreteType","MANAGED_ACT_ACCESS_REQUIREMENT_CONCRETE_TYPE_VALUE","SetManagedAccessRequirementFields","AccessRequirementAclEditor","saveSuccessful","SetBasicAccessRequirementFields","ConfirmationDialog","e","isLastStep","getDialogTitle"],"mappings":"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"}
|
|
@@ -56,11 +56,14 @@ import "@mui/material/SvgIcon";
|
|
|
56
56
|
import "../../assets/icons/AccessPending.svg.js";
|
|
57
57
|
import "../../assets/icons/AccessPendingCloud.svg.js";
|
|
58
58
|
import "../../assets/icons/FileWithShield.svg.js";
|
|
59
|
+
import "../../assets/icons/MultiFile.svg.js";
|
|
60
|
+
import "../../assets/icons/UnpackagableFile.svg.js";
|
|
59
61
|
import "../../assets/icons/bioChemicalPhysical.svg.js";
|
|
60
62
|
import "../../assets/icons/computationalTool.svg.js";
|
|
61
63
|
import "../../assets/icons/dataReuse.svg.js";
|
|
62
64
|
import "../../assets/icons/inSilicoModel.svg.js";
|
|
63
65
|
import "../../assets/icons/modelSystem.svg.js";
|
|
66
|
+
import "../../assets/mui_components/PackagableFile.svg.js";
|
|
64
67
|
import "../../assets/icons/spatialProfiling.svg.js";
|
|
65
68
|
import "../Authentication/AuthenticationMethodSelection.js";
|
|
66
69
|
import "mui-one-time-password-input";
|
|
@@ -85,6 +88,7 @@ import "../../assets/icons/study-complete.svg.js";
|
|
|
85
88
|
import "../../assets/icons/translational.svg.js";
|
|
86
89
|
import "../../assets/icons/tree_horizontal.svg.js";
|
|
87
90
|
import "../../assets/icons/standardDataModel.svg.js";
|
|
91
|
+
import "../../assets/icons/Challenge.svg.js";
|
|
88
92
|
import "react-intersection-observer";
|
|
89
93
|
import "@rjsf/utils";
|
|
90
94
|
import "../SchemaDrivenAnnotationEditor/template/AdditionalPropertyContext.js";
|
|
@@ -102,10 +106,10 @@ import "../../assets/icons/DoubleQuotes.svg.js";
|
|
|
102
106
|
import "../EntityDownloadConfirmation/EntityDownloadConfirmation.js";
|
|
103
107
|
import "../QueryContext/QueryContext.js";
|
|
104
108
|
import "../QueryVisualizationWrapper/QueryVisualizationContext.js";
|
|
109
|
+
import "react-share";
|
|
105
110
|
import "../GenericCard/GenericCard.js";
|
|
106
111
|
import "@mui/system";
|
|
107
112
|
import "../GenericCard/Linkify.js";
|
|
108
|
-
import "react-share";
|
|
109
113
|
import "jotai";
|
|
110
114
|
import "lodash-es/noop";
|
|
111
115
|
import "../QueryWrapper/TableRowSelectionState.js";
|
|
@@ -205,6 +209,7 @@ import "lodash-es/set";
|
|
|
205
209
|
import "lodash-es/trimStart";
|
|
206
210
|
import "../SynapseForm/SynapseFormSubmissionGrid.js";
|
|
207
211
|
import "../SynapseChat/AccessLevelMenu.js";
|
|
212
|
+
import "react-draggable";
|
|
208
213
|
import "../TimelinePlot/phasesQueryResponseData.js";
|
|
209
214
|
import "../EntityHeaderTable/EntityHeaderTable.js";
|
|
210
215
|
import "../MuiContainer.js";
|
|
@@ -212,7 +217,7 @@ import "@mui/material/Grid";
|
|
|
212
217
|
import "@mui/icons-material/ArrowForwardIos";
|
|
213
218
|
import "../PortalAclEditor/PortalAclEditor.js";
|
|
214
219
|
import "../SynapseHomepageV2/HomepageStyles.js";
|
|
215
|
-
function
|
|
220
|
+
function vr(o) {
|
|
216
221
|
const { sourceEntityId: t, gridSessionId: i } = o, { data: e, isLoading: n } = y(t), s = e?.concreteType ? l(e.concreteType) : void 0, { mutate: c, isPending: a } = u({
|
|
217
222
|
onSuccess: (p) => {
|
|
218
223
|
p.type === "entityview" ? S(p.data) : p.type === "table" ? h(p.data) : r("Successfully updated RecordSet.", "success");
|
|
@@ -262,6 +267,6 @@ function T(o) {
|
|
|
262
267
|
) ?? [];
|
|
263
268
|
}
|
|
264
269
|
export {
|
|
265
|
-
|
|
270
|
+
vr as default
|
|
266
271
|
};
|
|
267
272
|
//# sourceMappingURL=MergeGridWithSourceTableButton.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MergeGridWithSourceTableButton.js","sources":["../../../src/components/DataGrid/MergeGridWithSourceTableButton.tsx"],"sourcesContent":["import GridMenuButton from '@/components/DataGrid/components/GridMenuButton/GridMenuButton'\nimport useMergeGridWithSource from '@/components/DataGrid/useMergeGridWithSource'\nimport { displayToast } from '@/components/index'\nimport { useGetEntity } from '@/synapse-queries'\nimport { convertToEntityType } from '@/utils/functions/EntityTypeUtils'\nimport {\n EntityType,\n EntityUpdateResults,\n instanceOfEntityUpdateResults,\n instanceOfUploadToTableResult,\n SynchronizeGridResponse,\n TableUpdateTransactionResponse,\n} from '@sage-bionetworks/synapse-client'\n\nexport type MergeGridWithSourceTableButtonProps = {\n sourceEntityId: string\n gridSessionId: string\n sourceEntityType?: EntityType\n}\n\nexport default function MergeGridWithSourceTableButton(\n props: MergeGridWithSourceTableButtonProps,\n) {\n const { sourceEntityId, gridSessionId } = props\n\n const { data: entity, isLoading: entityLoading } =\n useGetEntity(sourceEntityId)\n\n const sourceEntityType = entity?.concreteType\n ? convertToEntityType(entity.concreteType)\n : undefined\n\n const { mutate: mergeGrid, isPending } = useMergeGridWithSource({\n onSuccess: result => {\n if (result.type === 'entityview') {\n onSynchronizeSuccess(result.data)\n } else if (result.type === 'table') {\n onMergeTableSuccess(result.data)\n } else {\n displayToast('Successfully updated RecordSet.', 'success')\n }\n },\n onError: e => displayToast(e.message, 'danger'),\n })\n\n const buttonText =\n sourceEntityType === 'entityview' ? 'Sync changes' : 'Apply changes'\n\n return (\n <GridMenuButton\n loading={isPending}\n disabled={entityLoading}\n onClick={() => {\n mergeGrid({ gridSessionId, sourceEntityId, sourceEntityType })\n }}\n variant=\"contained\"\n >\n {buttonText}\n </GridMenuButton>\n )\n}\n\nfunction onSynchronizeSuccess(result: SynchronizeGridResponse) {\n if (result.errorMessages == null || result.errorMessages.length === 0) {\n displayToast('Successfully synchronized metadata.', 'success')\n } else {\n displayToast(\n <ul>\n {result.errorMessages.map((msg, index) => (\n <li key={index}>{msg}</li>\n ))}\n </ul>,\n 'warning',\n { title: 'Some changes could not be applied' },\n )\n }\n}\n\nfunction onMergeTableSuccess(result: TableUpdateTransactionResponse) {\n if (result.results?.length) {\n // There should only be one result since the CSV upload is done in one step\n const updateResult = result.results[0]\n if (instanceOfEntityUpdateResults(updateResult)) {\n // This is an update to the contents of a View\n const failureMessages =\n getEntityUpdateResultsErrorMessages(updateResult).join('\\n')\n\n if (failureMessages) {\n displayToast(\n `Some changes could not be applied:\\n${failureMessages}`,\n 'danger',\n )\n } else {\n displayToast('Changes applied successfully', 'success')\n }\n } else if (instanceOfUploadToTableResult(updateResult)) {\n // This is an update to a TableEntity\n const rowsUpdatedStr = updateResult.rowsProcessed?.toLocaleString()\n displayToast(`Successfully updated ${rowsUpdatedStr} rows.`, 'success')\n }\n }\n}\n\nfunction getEntityUpdateResultsErrorMessages(\n results: EntityUpdateResults,\n): string[] {\n return (\n results.updateResults\n ?.filter(e => !!e.failureCode)\n .map(\n r => `${r.entityId}: ${r.failureMessage} (code: ${r.failureCode})`,\n ) ?? []\n )\n}\n"],"names":["MergeGridWithSourceTableButton","props","sourceEntityId","gridSessionId","entity","entityLoading","useGetEntity","sourceEntityType","convertToEntityType","mergeGrid","isPending","useMergeGridWithSource","result","onSynchronizeSuccess","onMergeTableSuccess","displayToast","e","jsx","GridMenuButton","msg","index","updateResult","instanceOfEntityUpdateResults","failureMessages","getEntityUpdateResultsErrorMessages","instanceOfUploadToTableResult","rowsUpdatedStr","results","r"],"mappings":"
|
|
1
|
+
{"version":3,"file":"MergeGridWithSourceTableButton.js","sources":["../../../src/components/DataGrid/MergeGridWithSourceTableButton.tsx"],"sourcesContent":["import GridMenuButton from '@/components/DataGrid/components/GridMenuButton/GridMenuButton'\nimport useMergeGridWithSource from '@/components/DataGrid/useMergeGridWithSource'\nimport { displayToast } from '@/components/index'\nimport { useGetEntity } from '@/synapse-queries'\nimport { convertToEntityType } from '@/utils/functions/EntityTypeUtils'\nimport {\n EntityType,\n EntityUpdateResults,\n instanceOfEntityUpdateResults,\n instanceOfUploadToTableResult,\n SynchronizeGridResponse,\n TableUpdateTransactionResponse,\n} from '@sage-bionetworks/synapse-client'\n\nexport type MergeGridWithSourceTableButtonProps = {\n sourceEntityId: string\n gridSessionId: string\n sourceEntityType?: EntityType\n}\n\nexport default function MergeGridWithSourceTableButton(\n props: MergeGridWithSourceTableButtonProps,\n) {\n const { sourceEntityId, gridSessionId } = props\n\n const { data: entity, isLoading: entityLoading } =\n useGetEntity(sourceEntityId)\n\n const sourceEntityType = entity?.concreteType\n ? convertToEntityType(entity.concreteType)\n : undefined\n\n const { mutate: mergeGrid, isPending } = useMergeGridWithSource({\n onSuccess: result => {\n if (result.type === 'entityview') {\n onSynchronizeSuccess(result.data)\n } else if (result.type === 'table') {\n onMergeTableSuccess(result.data)\n } else {\n displayToast('Successfully updated RecordSet.', 'success')\n }\n },\n onError: e => displayToast(e.message, 'danger'),\n })\n\n const buttonText =\n sourceEntityType === 'entityview' ? 'Sync changes' : 'Apply changes'\n\n return (\n <GridMenuButton\n loading={isPending}\n disabled={entityLoading}\n onClick={() => {\n mergeGrid({ gridSessionId, sourceEntityId, sourceEntityType })\n }}\n variant=\"contained\"\n >\n {buttonText}\n </GridMenuButton>\n )\n}\n\nfunction onSynchronizeSuccess(result: SynchronizeGridResponse) {\n if (result.errorMessages == null || result.errorMessages.length === 0) {\n displayToast('Successfully synchronized metadata.', 'success')\n } else {\n displayToast(\n <ul>\n {result.errorMessages.map((msg, index) => (\n <li key={index}>{msg}</li>\n ))}\n </ul>,\n 'warning',\n { title: 'Some changes could not be applied' },\n )\n }\n}\n\nfunction onMergeTableSuccess(result: TableUpdateTransactionResponse) {\n if (result.results?.length) {\n // There should only be one result since the CSV upload is done in one step\n const updateResult = result.results[0]\n if (instanceOfEntityUpdateResults(updateResult)) {\n // This is an update to the contents of a View\n const failureMessages =\n getEntityUpdateResultsErrorMessages(updateResult).join('\\n')\n\n if (failureMessages) {\n displayToast(\n `Some changes could not be applied:\\n${failureMessages}`,\n 'danger',\n )\n } else {\n displayToast('Changes applied successfully', 'success')\n }\n } else if (instanceOfUploadToTableResult(updateResult)) {\n // This is an update to a TableEntity\n const rowsUpdatedStr = updateResult.rowsProcessed?.toLocaleString()\n displayToast(`Successfully updated ${rowsUpdatedStr} rows.`, 'success')\n }\n }\n}\n\nfunction getEntityUpdateResultsErrorMessages(\n results: EntityUpdateResults,\n): string[] {\n return (\n results.updateResults\n ?.filter(e => !!e.failureCode)\n .map(\n r => `${r.entityId}: ${r.failureMessage} (code: ${r.failureCode})`,\n ) ?? []\n )\n}\n"],"names":["MergeGridWithSourceTableButton","props","sourceEntityId","gridSessionId","entity","entityLoading","useGetEntity","sourceEntityType","convertToEntityType","mergeGrid","isPending","useMergeGridWithSource","result","onSynchronizeSuccess","onMergeTableSuccess","displayToast","e","jsx","GridMenuButton","msg","index","updateResult","instanceOfEntityUpdateResults","failureMessages","getEntityUpdateResultsErrorMessages","instanceOfUploadToTableResult","rowsUpdatedStr","results","r"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAoBA,SAAwBA,GACtBC,GACA;AACA,QAAM,EAAE,gBAAAC,GAAgB,eAAAC,EAAA,IAAkBF,GAEpC,EAAE,MAAMG,GAAQ,WAAWC,EAAA,IAC/BC,EAAaJ,CAAc,GAEvBK,IAAmBH,GAAQ,eAC7BI,EAAoBJ,EAAO,YAAY,IACvC,QAEE,EAAE,QAAQK,GAAW,WAAAC,EAAA,IAAcC,EAAuB;AAAA,IAC9D,WAAW,CAAAC,MAAU;AACnB,MAAIA,EAAO,SAAS,eAClBC,EAAqBD,EAAO,IAAI,IACvBA,EAAO,SAAS,UACzBE,EAAoBF,EAAO,IAAI,IAE/BG,EAAa,mCAAmC,SAAS;AAAA,IAE7D;AAAA,IACA,SAAS,CAAAC,MAAKD,EAAaC,EAAE,SAAS,QAAQ;AAAA,EAAA,CAC/C;AAKD,SACE,gBAAAC;AAAA,IAACC;AAAA,IAAA;AAAA,MACC,SAASR;AAAA,MACT,UAAUL;AAAA,MACV,SAAS,MAAM;AACb,QAAAI,EAAU,EAAE,eAAAN,GAAe,gBAAAD,GAAgB,kBAAAK,EAAA,CAAkB;AAAA,MAC/D;AAAA,MACA,SAAQ;AAAA,MAEP,UAXHA,MAAqB,eAAe,iBAAiB;AAAA,IAWlD;AAAA,EAAA;AAGP;AAEA,SAASM,EAAqBD,GAAiC;AAC7D,EAAIA,EAAO,iBAAiB,QAAQA,EAAO,cAAc,WAAW,IAClEG,EAAa,uCAAuC,SAAS,IAE7DA;AAAA,IACE,gBAAAE,EAAC,MAAA,EACE,UAAAL,EAAO,cAAc,IAAI,CAACO,GAAKC,MAC9B,gBAAAH,EAAC,MAAA,EAAgB,UAAAE,EAAA,GAARC,CAAY,CACtB,GACH;AAAA,IACA;AAAA,IACA,EAAE,OAAO,oCAAA;AAAA,EAAoC;AAGnD;AAEA,SAASN,EAAoBF,GAAwC;AACnE,MAAIA,EAAO,SAAS,QAAQ;AAE1B,UAAMS,IAAeT,EAAO,QAAQ,CAAC;AACrC,QAAIU,EAA8BD,CAAY,GAAG;AAE/C,YAAME,IACJC,EAAoCH,CAAY,EAAE,KAAK;AAAA,CAAI;AAE7D,MAAIE,IACFR;AAAA,QACE;AAAA,EAAuCQ,CAAe;AAAA,QACtD;AAAA,MAAA,IAGFR,EAAa,gCAAgC,SAAS;AAAA,IAE1D,WAAWU,EAA8BJ,CAAY,GAAG;AAEtD,YAAMK,IAAiBL,EAAa,eAAe,eAAA;AACnD,MAAAN,EAAa,wBAAwBW,CAAc,UAAU,SAAS;AAAA,IACxE;AAAA,EACF;AACF;AAEA,SAASF,EACPG,GACU;AACV,SACEA,EAAQ,eACJ,OAAO,CAAAX,MAAK,CAAC,CAACA,EAAE,WAAW,EAC5B;AAAA,IACC,CAAAY,MAAK,GAAGA,EAAE,QAAQ,KAAKA,EAAE,cAAc,WAAWA,EAAE,WAAW;AAAA,EAAA,KAC5D,CAAA;AAEX;"}
|
|
@@ -63,11 +63,14 @@ import "@mui/material/SvgIcon";
|
|
|
63
63
|
import "../../assets/icons/AccessPending.svg.js";
|
|
64
64
|
import "../../assets/icons/AccessPendingCloud.svg.js";
|
|
65
65
|
import "../../assets/icons/FileWithShield.svg.js";
|
|
66
|
+
import "../../assets/icons/MultiFile.svg.js";
|
|
67
|
+
import "../../assets/icons/UnpackagableFile.svg.js";
|
|
66
68
|
import "../../assets/icons/bioChemicalPhysical.svg.js";
|
|
67
69
|
import "../../assets/icons/computationalTool.svg.js";
|
|
68
70
|
import "../../assets/icons/dataReuse.svg.js";
|
|
69
71
|
import "../../assets/icons/inSilicoModel.svg.js";
|
|
70
72
|
import "../../assets/icons/modelSystem.svg.js";
|
|
73
|
+
import "../../assets/mui_components/PackagableFile.svg.js";
|
|
71
74
|
import "../../assets/icons/spatialProfiling.svg.js";
|
|
72
75
|
import "../Authentication/AuthenticationMethodSelection.js";
|
|
73
76
|
import "mui-one-time-password-input";
|
|
@@ -92,6 +95,7 @@ import "../../assets/icons/study-complete.svg.js";
|
|
|
92
95
|
import "../../assets/icons/translational.svg.js";
|
|
93
96
|
import "../../assets/icons/tree_horizontal.svg.js";
|
|
94
97
|
import "../../assets/icons/standardDataModel.svg.js";
|
|
98
|
+
import "../../assets/icons/Challenge.svg.js";
|
|
95
99
|
import "react-intersection-observer";
|
|
96
100
|
import "@rjsf/utils";
|
|
97
101
|
import "../SchemaDrivenAnnotationEditor/template/AdditionalPropertyContext.js";
|
|
@@ -109,11 +113,11 @@ import "../../assets/icons/DoubleQuotes.svg.js";
|
|
|
109
113
|
import "../EntityDownloadConfirmation/EntityDownloadConfirmation.js";
|
|
110
114
|
import "../QueryContext/QueryContext.js";
|
|
111
115
|
import "../QueryVisualizationWrapper/QueryVisualizationContext.js";
|
|
116
|
+
import "react-share";
|
|
112
117
|
import "../GenericCard/GenericCard.js";
|
|
113
118
|
import { SkeletonTable as ht } from "../Skeleton/SkeletonTable.js";
|
|
114
119
|
import "@mui/system";
|
|
115
120
|
import "../GenericCard/Linkify.js";
|
|
116
|
-
import "react-share";
|
|
117
121
|
import "jotai";
|
|
118
122
|
import "lodash-es/noop";
|
|
119
123
|
import "../QueryWrapper/TableRowSelectionState.js";
|
|
@@ -211,6 +215,7 @@ import "lodash-es/set";
|
|
|
211
215
|
import "lodash-es/trimStart";
|
|
212
216
|
import "../SynapseForm/SynapseFormSubmissionGrid.js";
|
|
213
217
|
import "../SynapseChat/AccessLevelMenu.js";
|
|
218
|
+
import "react-draggable";
|
|
214
219
|
import "../TimelinePlot/phasesQueryResponseData.js";
|
|
215
220
|
import "../EntityHeaderTable/EntityHeaderTable.js";
|
|
216
221
|
import "../MuiContainer.js";
|
|
@@ -230,7 +235,7 @@ import { removeNoOpOperations as xt } from "./utils/DataGridUtils.js";
|
|
|
230
235
|
import { mapOperationsToModelChanges as Gt } from "./utils/mapOperationsToModelChanges.js";
|
|
231
236
|
import bt from "../AccessRequirementList/RequirementItem/CertificationRequirement.js";
|
|
232
237
|
import { ValidationAlert as vt } from "./components/ValidationAlert.js";
|
|
233
|
-
const
|
|
238
|
+
const Ye = st(
|
|
234
239
|
({ agentRegistrationId: B, showDebugInfo: R = !1 }, D) => {
|
|
235
240
|
const [o, P] = S(null), [p, A] = S(null), [j, v] = S(!1), [F, w] = S(
|
|
236
241
|
null
|
|
@@ -500,6 +505,6 @@ const He = st(
|
|
|
500
505
|
}
|
|
501
506
|
);
|
|
502
507
|
export {
|
|
503
|
-
|
|
508
|
+
Ye as default
|
|
504
509
|
};
|
|
505
510
|
//# sourceMappingURL=SynapseGrid.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SynapseGrid.js","sources":["../../../src/components/DataGrid/SynapseGrid.tsx"],"sourcesContent":["import GridMenuButton from '@/components/DataGrid/components/GridMenuButton/GridMenuButton'\nimport UploadCsvToGridButton from '@/components/DataGrid/components/UploadCsvToGridButton'\nimport ExportCsvFromGridButton from '@/components/DataGrid/components/ExportCsvFromGridButton'\nimport useGetSchemaForGrid from '@/components/DataGrid/hooks/useGetSchemaForGrid'\nimport MergeGridWithSourceTableButton from '@/components/DataGrid/MergeGridWithSourceTableButton'\nimport computeReplicaSelectionModel from '@/components/DataGrid/utils/computeReplicaSelectionModel'\nimport modelRowsToGrid from '@/components/DataGrid/utils/modelRowsToGrid'\nimport { SkeletonTable } from '@/components/index'\nimport { useGetEntity } from '@/synapse-queries/index'\nimport { getSchemaPropertiesInfo } from '@/utils/jsonschema/getSchemaPropertyInfo'\nimport { SmartToyTwoTone } from '@mui/icons-material'\nimport { Stack } from '@mui/material'\nimport Grid from '@mui/material/Grid'\nimport {\n CreateGridRequest,\n GridSession,\n} from '@sage-bionetworks/synapse-client'\nimport { ClickableJsonCrdt } from 'clickable-json'\nimport {\n forwardRef,\n useCallback,\n useEffect,\n useImperativeHandle,\n useMemo,\n useRef,\n useState,\n} from 'react'\nimport { DataSheetGridRef } from '@sage-bionetworks/react-datasheet-grid'\nimport { SelectionWithId } from '@sage-bionetworks/react-datasheet-grid'\nimport GridAgentChat from '../SynapseChat/GridAgentChat'\nimport DataGrid from './DataGrid'\nimport { DataGridRow, GridModel, Operation } from './DataGridTypes'\nimport { useGridUndoRedo } from './hooks/useGridUndoRedo'\nimport { StartGridSession, StartGridSessionHandle } from './StartGridSession'\nimport { useDataGridWebSocket } from './useDataGridWebsocket'\nimport { applyModelChange, ModelChange } from './utils/applyModelChange'\nimport { removeNoOpOperations } from './utils/DataGridUtils'\nimport { mapOperationsToModelChanges } from './utils/mapOperationsToModelChanges'\nimport { useGetCurrentUserBundle } from '@/synapse-queries'\nimport CertificationRequirement from '@/components/AccessRequirementList/RequirementItem/CertificationRequirement'\nimport { ValidationAlert } from './components/ValidationAlert'\n\nexport type SynapseGridProps = {\n agentRegistrationId?: string\n showDebugInfo?: boolean\n}\n\nexport type SynapseGridHandle = {\n initializeGrid: (request: CreateGridRequest) => void\n loadExistingSession: (sessionId: string) => void\n}\n\nconst SynapseGrid = forwardRef<SynapseGridHandle, SynapseGridProps>(\n ({ agentRegistrationId, showDebugInfo = false }, ref) => {\n const [session, setSession] = useState<GridSession | null>(null)\n const [replicaId, setReplicaId] = useState<number | null>(null)\n const [chatOpen, setChatOpen] = useState(false)\n const [lastSelection, setLastSelection] = useState<SelectionWithId | null>(\n null,\n )\n\n const startGridSessionRef = useRef<StartGridSessionHandle | null>(null)\n const gridRef = useRef<DataSheetGridRef | null>(null)\n\n const { data: userBundle, isLoading } = useGetCurrentUserBundle()\n\n useImperativeHandle(\n ref,\n () => ({\n initializeGrid: (request: CreateGridRequest) => {\n if (startGridSessionRef.current) {\n startGridSessionRef.current.handleStartSession(request)\n }\n },\n loadExistingSession: (sessionId: string) => {\n if (startGridSessionRef.current) {\n startGridSessionRef.current.handleLoadSession(sessionId)\n }\n },\n }),\n [],\n )\n\n // WebSocket state\n const {\n isConnected,\n websocketInstance,\n hasCompletedInitialSync,\n model,\n modelSnapshot,\n connect,\n presignedUrl,\n hasSufficientData,\n } = useDataGridWebSocket()\n\n const websocketInstanceRef = useRef<typeof websocketInstance | null>(null)\n\n useEffect(() => {\n websocketInstanceRef.current = websocketInstance\n }, [websocketInstance])\n\n // Track last connection parameters to avoid redundant connections\n const lastConnectParamsRef = useRef<{\n replicaId: number\n sessionId: string\n } | null>(null)\n\n useEffect(() => {\n if (\n replicaId === null ||\n replicaId === undefined ||\n !session?.sessionId\n ) {\n lastConnectParamsRef.current = null\n return\n }\n\n const nextParams = {\n replicaId,\n sessionId: session.sessionId,\n }\n\n const prevParams = lastConnectParamsRef.current\n\n if (\n prevParams &&\n prevParams.replicaId === nextParams.replicaId &&\n prevParams.sessionId === nextParams.sessionId\n ) {\n return\n }\n\n lastConnectParamsRef.current = nextParams\n connect(replicaId, session.sessionId)\n }, [replicaId, session?.sessionId, connect])\n\n // Reset grid state when model is reset (new session/replica)\n useEffect(() => {\n if (model === null) {\n // Clear any grid-specific state when starting a new session\n setLastSelection(null)\n // Clear active cell if grid exists\n if (gridRef.current) {\n gridRef.current.setActiveCell(null)\n }\n }\n }, [model])\n\n const jsonSchema = useGetSchemaForGrid(session)\n\n // Grid behaves differently for views vs recordSets\n // Note for future: can get modifiedOn to refresh grid when view changes\n const { data: entityData } = useGetEntity(\n session?.sourceEntityId,\n undefined,\n {\n enabled: !!session?.sourceEntityId,\n },\n )\n\n const entityIsView =\n entityData?.concreteType ===\n 'org.sagebionetworks.repo.model.table.EntityView'\n\n // Process schema properties once\n const schemaPropertiesInfo = useMemo(() => {\n return getSchemaPropertiesInfo(jsonSchema ?? null)\n }, [jsonSchema])\n\n const connectionStatus = isConnected ? 'Connected' : 'Disconnected'\n\n // Transform the model view rows and columns to DataSheetGrid format\n const rowValues = useMemo(\n () => (modelSnapshot ? modelRowsToGrid(model, modelSnapshot) : []),\n [model, modelSnapshot],\n )\n\n const commit = useCallback(() => {\n if (!isConnected || !websocketInstanceRef.current) {\n return\n }\n\n websocketInstanceRef.current.sendPatch()\n }, [isConnected, websocketInstanceRef])\n\n useEffect(() => {\n if (isConnected) {\n commit()\n }\n }, [isConnected, commit])\n\n const applyAndCommitChanges = useCallback(\n (model: GridModel, modelChanges: ModelChange[]) => {\n // Apply each change to the model\n modelChanges.forEach(change => {\n applyModelChange(model, change, schemaPropertiesInfo)\n })\n\n commit()\n },\n [commit, schemaPropertiesInfo],\n )\n\n const applyModelChangeFromUndoRedo = useCallback(\n (change: ModelChange) => {\n if (!model) {\n console.error('Model is not initialized')\n return\n }\n\n if (change.type === 'DELETE' && gridRef.current) {\n // The user may have set a cell as active that we are removing with an 'undo'. In that case, clear the active state\n gridRef.current.setActiveCell(null)\n }\n\n applyAndCommitChanges(model, [change])\n },\n [model, applyAndCommitChanges],\n )\n\n const { undoUI, redoUI, addOperationsToUndoStack, clearRedoStack } =\n useGridUndoRedo(applyModelChangeFromUndoRedo)\n\n const handleChange = useCallback(\n (newValue: DataGridRow[], operations: Operation[]) => {\n if (!model) {\n console.error('Model is not initialized')\n return\n }\n\n // Check that something changed before updating the model\n operations = removeNoOpOperations(newValue, rowValues, operations)\n\n if (operations.length > 0) {\n // Clear redo stack since new changes invalidate redo history\n clearRedoStack()\n\n // Track row creation, updates, and deletions to keep UI state and undo history in sync\n\n // Add all operations to the undo stack\n addOperationsToUndoStack(operations, rowValues, newValue)\n\n // Transform operations to model changes\n const modelChanges = mapOperationsToModelChanges(operations, newValue)\n\n applyAndCommitChanges(model, modelChanges)\n }\n },\n [\n model,\n rowValues,\n clearRedoStack,\n addOperationsToUndoStack,\n applyAndCommitChanges,\n ],\n )\n\n const handleSelectionChange = useCallback(\n (opts: { selection: SelectionWithId | null }) => {\n const { selection } = opts\n if (selection != null) {\n setLastSelection(selection)\n\n if (model != null && replicaId != null) {\n const replicaSelectionModel = computeReplicaSelectionModel(\n selection,\n model,\n )\n // insert it into the CRDT Model\n applyAndCommitChanges(model, [\n {\n type: 'SET_SELECTION',\n replicaId: replicaId.toString(),\n selection: replicaSelectionModel,\n },\n ])\n }\n }\n },\n [applyAndCommitChanges, model, replicaId],\n )\n\n // Track selected row index for validation display\n const selectedRowIndexRef = useRef<number | null>(null)\n const [, forceUpdate] = useState({})\n\n const handleSelectedRowChange = useCallback(\n (rowIndex: number | null, _row: DataGridRow | null) => {\n selectedRowIndexRef.current = rowIndex\n forceUpdate({}) // Force re-render to update validation display\n },\n [],\n )\n\n if (!isLoading && !userBundle?.isCertified) {\n return <CertificationRequirement />\n }\n\n return (\n <div>\n <Grid container spacing={2}>\n <Grid size={{ xs: 12, xl: 8 }}>\n <StartGridSession\n ref={startGridSessionRef}\n onSessionChange={setSession}\n onReplicaChange={setReplicaId}\n show={showDebugInfo}\n />\n </Grid>\n {/* Debug Information */}\n <Grid size={{ xs: 12, xl: 4 }}>\n {showDebugInfo && (\n <div>\n <p>Session ID: {session?.sessionId || 'No session created'}</p>\n <p>Replica ID: {replicaId || 'No replica created'}</p>\n <p>\n Source Entity ID:{' '}\n {session?.sourceEntityId || 'No source entity'}\n </p>\n <p>\n JSON Schema $id:{' '}\n {session?.gridJsonSchema$Id ||\n 'No schema attached to session'}\n </p>\n <p>\n Presigned URL:{' '}\n {presignedUrl\n ? presignedUrl.substring(0, 30) +\n (presignedUrl.length > 30\n ? ' ... ' +\n presignedUrl.substring(presignedUrl.length - 10)\n : '')\n : 'No URL generated'}\n </p>\n <p>\n WebSocket Status:{' '}\n <span style={{ color: isConnected ? 'green' : 'red' }}>\n {connectionStatus}\n </span>\n </p>\n </div>\n )}\n </Grid>\n\n {session && (\n <>\n {/* Grid Loading State */}\n {!hasSufficientData && (\n <Grid size={12}>\n <h3>Setting up grid...</h3>\n <div style={{ marginBottom: '10px' }}>\n {!session && <p>Creating grid session...</p>}\n {session && !replicaId && (\n <p>Setting up real-time sync...</p>\n )}\n {session && replicaId && !presignedUrl && (\n <p>Establishing secure connection...</p>\n )}\n {session && replicaId && presignedUrl && !isConnected && (\n <p>Connecting to server...</p>\n )}\n {isConnected && !hasCompletedInitialSync && (\n <p>Loading table data...</p>\n )}\n <SkeletonTable numRows={4} numCols={1} />\n </div>\n </Grid>\n )}\n {/* Grid */}\n {hasSufficientData && (\n <>\n <Grid size={12}>\n <Stack\n direction={'row'}\n spacing={1}\n sx={{ justifyContent: 'flex-end' }}\n >\n {undoUI}\n {redoUI}\n <GridMenuButton\n variant={'outlined'}\n onClick={() => setChatOpen(true)}\n startIcon={<SmartToyTwoTone />}\n >\n Open chat\n </GridMenuButton>\n <GridAgentChat\n agentRegistrationId={agentRegistrationId}\n open={chatOpen}\n onClose={() => setChatOpen(false)}\n gridSessionId={session.sessionId!}\n usersReplicaId={replicaId!}\n chatbotName=\"Grid Assistant\"\n />\n {session.sourceEntityId && (\n <UploadCsvToGridButton\n sourceEntityId={session.sourceEntityId}\n gridSessionId={session.sessionId!}\n />\n )}\n {session.sessionId && (\n <ExportCsvFromGridButton\n gridSessionId={session.sessionId}\n filename={\n 'grid-' + (session.sourceEntityId || 'export')\n }\n />\n )}\n {session.sourceEntityId && (\n <MergeGridWithSourceTableButton\n sourceEntityId={session.sourceEntityId}\n gridSessionId={session.sessionId!}\n />\n )}\n </Stack>\n </Grid>\n <Grid size={12}>\n <DataGrid\n gridRef={gridRef}\n rowValues={rowValues}\n columnNames={modelSnapshot?.columnNames ?? []}\n columnOrder={modelSnapshot?.columnOrder ?? []}\n schemaPropertiesInfo={schemaPropertiesInfo}\n entityIsView={entityIsView}\n jsonSchema={jsonSchema}\n lastSelection={lastSelection}\n handleChange={handleChange}\n handleSelectionChange={handleSelectionChange}\n onSelectedRowChange={handleSelectedRowChange}\n />\n </Grid>\n <Grid size={12}>\n <ValidationAlert\n selectedRowIndex={selectedRowIndexRef.current}\n rowValues={rowValues}\n />\n </Grid>\n </>\n )}\n {/* Debug Model Snapshot */}\n {showDebugInfo && (\n <Grid\n size={12}\n style={{\n margin: '10px 0',\n padding: '10px',\n border: '1px solid #ccc',\n maxHeight: '400px',\n overflowY: 'auto',\n }}\n >\n <h3>Model</h3>\n {model ? (\n <ClickableJsonCrdt model={model} />\n ) : (\n 'No model available'\n )}\n </Grid>\n )}\n </>\n )}\n </Grid>\n </div>\n )\n },\n)\n\nexport default SynapseGrid\n"],"names":["SynapseGrid","forwardRef","agentRegistrationId","showDebugInfo","ref","session","setSession","useState","replicaId","setReplicaId","chatOpen","setChatOpen","lastSelection","setLastSelection","startGridSessionRef","useRef","gridRef","userBundle","isLoading","useGetCurrentUserBundle","useImperativeHandle","request","sessionId","isConnected","websocketInstance","hasCompletedInitialSync","model","modelSnapshot","connect","presignedUrl","hasSufficientData","useDataGridWebSocket","websocketInstanceRef","useEffect","lastConnectParamsRef","nextParams","prevParams","jsonSchema","useGetSchemaForGrid","entityData","useGetEntity","entityIsView","schemaPropertiesInfo","useMemo","getSchemaPropertiesInfo","connectionStatus","rowValues","modelRowsToGrid","commit","useCallback","applyAndCommitChanges","modelChanges","change","applyModelChange","applyModelChangeFromUndoRedo","undoUI","redoUI","addOperationsToUndoStack","clearRedoStack","useGridUndoRedo","handleChange","newValue","operations","removeNoOpOperations","mapOperationsToModelChanges","handleSelectionChange","opts","selection","replicaSelectionModel","computeReplicaSelectionModel","selectedRowIndexRef","forceUpdate","handleSelectedRowChange","rowIndex","_row","CertificationRequirement","jsxs","Grid","jsx","StartGridSession","Fragment","SkeletonTable","Stack","GridMenuButton","SmartToyTwoTone","GridAgentChat","UploadCsvToGridButton","ExportCsvFromGridButton","MergeGridWithSourceTableButton","DataGrid","ValidationAlert","ClickableJsonCrdt"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"SynapseGrid.js","sources":["../../../src/components/DataGrid/SynapseGrid.tsx"],"sourcesContent":["import GridMenuButton from '@/components/DataGrid/components/GridMenuButton/GridMenuButton'\nimport UploadCsvToGridButton from '@/components/DataGrid/components/UploadCsvToGridButton'\nimport ExportCsvFromGridButton from '@/components/DataGrid/components/ExportCsvFromGridButton'\nimport useGetSchemaForGrid from '@/components/DataGrid/hooks/useGetSchemaForGrid'\nimport MergeGridWithSourceTableButton from '@/components/DataGrid/MergeGridWithSourceTableButton'\nimport computeReplicaSelectionModel from '@/components/DataGrid/utils/computeReplicaSelectionModel'\nimport modelRowsToGrid from '@/components/DataGrid/utils/modelRowsToGrid'\nimport { SkeletonTable } from '@/components/index'\nimport { useGetEntity } from '@/synapse-queries/index'\nimport { getSchemaPropertiesInfo } from '@/utils/jsonschema/getSchemaPropertyInfo'\nimport { SmartToyTwoTone } from '@mui/icons-material'\nimport { Stack } from '@mui/material'\nimport Grid from '@mui/material/Grid'\nimport {\n CreateGridRequest,\n GridSession,\n} from '@sage-bionetworks/synapse-client'\nimport { ClickableJsonCrdt } from 'clickable-json'\nimport {\n forwardRef,\n useCallback,\n useEffect,\n useImperativeHandle,\n useMemo,\n useRef,\n useState,\n} from 'react'\nimport { DataSheetGridRef } from '@sage-bionetworks/react-datasheet-grid'\nimport { SelectionWithId } from '@sage-bionetworks/react-datasheet-grid'\nimport GridAgentChat from '../SynapseChat/GridAgentChat'\nimport DataGrid from './DataGrid'\nimport { DataGridRow, GridModel, Operation } from './DataGridTypes'\nimport { useGridUndoRedo } from './hooks/useGridUndoRedo'\nimport { StartGridSession, StartGridSessionHandle } from './StartGridSession'\nimport { useDataGridWebSocket } from './useDataGridWebsocket'\nimport { applyModelChange, ModelChange } from './utils/applyModelChange'\nimport { removeNoOpOperations } from './utils/DataGridUtils'\nimport { mapOperationsToModelChanges } from './utils/mapOperationsToModelChanges'\nimport { useGetCurrentUserBundle } from '@/synapse-queries'\nimport CertificationRequirement from '@/components/AccessRequirementList/RequirementItem/CertificationRequirement'\nimport { ValidationAlert } from './components/ValidationAlert'\n\nexport type SynapseGridProps = {\n agentRegistrationId?: string\n showDebugInfo?: boolean\n}\n\nexport type SynapseGridHandle = {\n initializeGrid: (request: CreateGridRequest) => void\n loadExistingSession: (sessionId: string) => void\n}\n\nconst SynapseGrid = forwardRef<SynapseGridHandle, SynapseGridProps>(\n ({ agentRegistrationId, showDebugInfo = false }, ref) => {\n const [session, setSession] = useState<GridSession | null>(null)\n const [replicaId, setReplicaId] = useState<number | null>(null)\n const [chatOpen, setChatOpen] = useState(false)\n const [lastSelection, setLastSelection] = useState<SelectionWithId | null>(\n null,\n )\n\n const startGridSessionRef = useRef<StartGridSessionHandle | null>(null)\n const gridRef = useRef<DataSheetGridRef | null>(null)\n\n const { data: userBundle, isLoading } = useGetCurrentUserBundle()\n\n useImperativeHandle(\n ref,\n () => ({\n initializeGrid: (request: CreateGridRequest) => {\n if (startGridSessionRef.current) {\n startGridSessionRef.current.handleStartSession(request)\n }\n },\n loadExistingSession: (sessionId: string) => {\n if (startGridSessionRef.current) {\n startGridSessionRef.current.handleLoadSession(sessionId)\n }\n },\n }),\n [],\n )\n\n // WebSocket state\n const {\n isConnected,\n websocketInstance,\n hasCompletedInitialSync,\n model,\n modelSnapshot,\n connect,\n presignedUrl,\n hasSufficientData,\n } = useDataGridWebSocket()\n\n const websocketInstanceRef = useRef<typeof websocketInstance | null>(null)\n\n useEffect(() => {\n websocketInstanceRef.current = websocketInstance\n }, [websocketInstance])\n\n // Track last connection parameters to avoid redundant connections\n const lastConnectParamsRef = useRef<{\n replicaId: number\n sessionId: string\n } | null>(null)\n\n useEffect(() => {\n if (\n replicaId === null ||\n replicaId === undefined ||\n !session?.sessionId\n ) {\n lastConnectParamsRef.current = null\n return\n }\n\n const nextParams = {\n replicaId,\n sessionId: session.sessionId,\n }\n\n const prevParams = lastConnectParamsRef.current\n\n if (\n prevParams &&\n prevParams.replicaId === nextParams.replicaId &&\n prevParams.sessionId === nextParams.sessionId\n ) {\n return\n }\n\n lastConnectParamsRef.current = nextParams\n connect(replicaId, session.sessionId)\n }, [replicaId, session?.sessionId, connect])\n\n // Reset grid state when model is reset (new session/replica)\n useEffect(() => {\n if (model === null) {\n // Clear any grid-specific state when starting a new session\n setLastSelection(null)\n // Clear active cell if grid exists\n if (gridRef.current) {\n gridRef.current.setActiveCell(null)\n }\n }\n }, [model])\n\n const jsonSchema = useGetSchemaForGrid(session)\n\n // Grid behaves differently for views vs recordSets\n // Note for future: can get modifiedOn to refresh grid when view changes\n const { data: entityData } = useGetEntity(\n session?.sourceEntityId,\n undefined,\n {\n enabled: !!session?.sourceEntityId,\n },\n )\n\n const entityIsView =\n entityData?.concreteType ===\n 'org.sagebionetworks.repo.model.table.EntityView'\n\n // Process schema properties once\n const schemaPropertiesInfo = useMemo(() => {\n return getSchemaPropertiesInfo(jsonSchema ?? null)\n }, [jsonSchema])\n\n const connectionStatus = isConnected ? 'Connected' : 'Disconnected'\n\n // Transform the model view rows and columns to DataSheetGrid format\n const rowValues = useMemo(\n () => (modelSnapshot ? modelRowsToGrid(model, modelSnapshot) : []),\n [model, modelSnapshot],\n )\n\n const commit = useCallback(() => {\n if (!isConnected || !websocketInstanceRef.current) {\n return\n }\n\n websocketInstanceRef.current.sendPatch()\n }, [isConnected, websocketInstanceRef])\n\n useEffect(() => {\n if (isConnected) {\n commit()\n }\n }, [isConnected, commit])\n\n const applyAndCommitChanges = useCallback(\n (model: GridModel, modelChanges: ModelChange[]) => {\n // Apply each change to the model\n modelChanges.forEach(change => {\n applyModelChange(model, change, schemaPropertiesInfo)\n })\n\n commit()\n },\n [commit, schemaPropertiesInfo],\n )\n\n const applyModelChangeFromUndoRedo = useCallback(\n (change: ModelChange) => {\n if (!model) {\n console.error('Model is not initialized')\n return\n }\n\n if (change.type === 'DELETE' && gridRef.current) {\n // The user may have set a cell as active that we are removing with an 'undo'. In that case, clear the active state\n gridRef.current.setActiveCell(null)\n }\n\n applyAndCommitChanges(model, [change])\n },\n [model, applyAndCommitChanges],\n )\n\n const { undoUI, redoUI, addOperationsToUndoStack, clearRedoStack } =\n useGridUndoRedo(applyModelChangeFromUndoRedo)\n\n const handleChange = useCallback(\n (newValue: DataGridRow[], operations: Operation[]) => {\n if (!model) {\n console.error('Model is not initialized')\n return\n }\n\n // Check that something changed before updating the model\n operations = removeNoOpOperations(newValue, rowValues, operations)\n\n if (operations.length > 0) {\n // Clear redo stack since new changes invalidate redo history\n clearRedoStack()\n\n // Track row creation, updates, and deletions to keep UI state and undo history in sync\n\n // Add all operations to the undo stack\n addOperationsToUndoStack(operations, rowValues, newValue)\n\n // Transform operations to model changes\n const modelChanges = mapOperationsToModelChanges(operations, newValue)\n\n applyAndCommitChanges(model, modelChanges)\n }\n },\n [\n model,\n rowValues,\n clearRedoStack,\n addOperationsToUndoStack,\n applyAndCommitChanges,\n ],\n )\n\n const handleSelectionChange = useCallback(\n (opts: { selection: SelectionWithId | null }) => {\n const { selection } = opts\n if (selection != null) {\n setLastSelection(selection)\n\n if (model != null && replicaId != null) {\n const replicaSelectionModel = computeReplicaSelectionModel(\n selection,\n model,\n )\n // insert it into the CRDT Model\n applyAndCommitChanges(model, [\n {\n type: 'SET_SELECTION',\n replicaId: replicaId.toString(),\n selection: replicaSelectionModel,\n },\n ])\n }\n }\n },\n [applyAndCommitChanges, model, replicaId],\n )\n\n // Track selected row index for validation display\n const selectedRowIndexRef = useRef<number | null>(null)\n const [, forceUpdate] = useState({})\n\n const handleSelectedRowChange = useCallback(\n (rowIndex: number | null, _row: DataGridRow | null) => {\n selectedRowIndexRef.current = rowIndex\n forceUpdate({}) // Force re-render to update validation display\n },\n [],\n )\n\n if (!isLoading && !userBundle?.isCertified) {\n return <CertificationRequirement />\n }\n\n return (\n <div>\n <Grid container spacing={2}>\n <Grid size={{ xs: 12, xl: 8 }}>\n <StartGridSession\n ref={startGridSessionRef}\n onSessionChange={setSession}\n onReplicaChange={setReplicaId}\n show={showDebugInfo}\n />\n </Grid>\n {/* Debug Information */}\n <Grid size={{ xs: 12, xl: 4 }}>\n {showDebugInfo && (\n <div>\n <p>Session ID: {session?.sessionId || 'No session created'}</p>\n <p>Replica ID: {replicaId || 'No replica created'}</p>\n <p>\n Source Entity ID:{' '}\n {session?.sourceEntityId || 'No source entity'}\n </p>\n <p>\n JSON Schema $id:{' '}\n {session?.gridJsonSchema$Id ||\n 'No schema attached to session'}\n </p>\n <p>\n Presigned URL:{' '}\n {presignedUrl\n ? presignedUrl.substring(0, 30) +\n (presignedUrl.length > 30\n ? ' ... ' +\n presignedUrl.substring(presignedUrl.length - 10)\n : '')\n : 'No URL generated'}\n </p>\n <p>\n WebSocket Status:{' '}\n <span style={{ color: isConnected ? 'green' : 'red' }}>\n {connectionStatus}\n </span>\n </p>\n </div>\n )}\n </Grid>\n\n {session && (\n <>\n {/* Grid Loading State */}\n {!hasSufficientData && (\n <Grid size={12}>\n <h3>Setting up grid...</h3>\n <div style={{ marginBottom: '10px' }}>\n {!session && <p>Creating grid session...</p>}\n {session && !replicaId && (\n <p>Setting up real-time sync...</p>\n )}\n {session && replicaId && !presignedUrl && (\n <p>Establishing secure connection...</p>\n )}\n {session && replicaId && presignedUrl && !isConnected && (\n <p>Connecting to server...</p>\n )}\n {isConnected && !hasCompletedInitialSync && (\n <p>Loading table data...</p>\n )}\n <SkeletonTable numRows={4} numCols={1} />\n </div>\n </Grid>\n )}\n {/* Grid */}\n {hasSufficientData && (\n <>\n <Grid size={12}>\n <Stack\n direction={'row'}\n spacing={1}\n sx={{ justifyContent: 'flex-end' }}\n >\n {undoUI}\n {redoUI}\n <GridMenuButton\n variant={'outlined'}\n onClick={() => setChatOpen(true)}\n startIcon={<SmartToyTwoTone />}\n >\n Open chat\n </GridMenuButton>\n <GridAgentChat\n agentRegistrationId={agentRegistrationId}\n open={chatOpen}\n onClose={() => setChatOpen(false)}\n gridSessionId={session.sessionId!}\n usersReplicaId={replicaId!}\n chatbotName=\"Grid Assistant\"\n />\n {session.sourceEntityId && (\n <UploadCsvToGridButton\n sourceEntityId={session.sourceEntityId}\n gridSessionId={session.sessionId!}\n />\n )}\n {session.sessionId && (\n <ExportCsvFromGridButton\n gridSessionId={session.sessionId}\n filename={\n 'grid-' + (session.sourceEntityId || 'export')\n }\n />\n )}\n {session.sourceEntityId && (\n <MergeGridWithSourceTableButton\n sourceEntityId={session.sourceEntityId}\n gridSessionId={session.sessionId!}\n />\n )}\n </Stack>\n </Grid>\n <Grid size={12}>\n <DataGrid\n gridRef={gridRef}\n rowValues={rowValues}\n columnNames={modelSnapshot?.columnNames ?? []}\n columnOrder={modelSnapshot?.columnOrder ?? []}\n schemaPropertiesInfo={schemaPropertiesInfo}\n entityIsView={entityIsView}\n jsonSchema={jsonSchema}\n lastSelection={lastSelection}\n handleChange={handleChange}\n handleSelectionChange={handleSelectionChange}\n onSelectedRowChange={handleSelectedRowChange}\n />\n </Grid>\n <Grid size={12}>\n <ValidationAlert\n selectedRowIndex={selectedRowIndexRef.current}\n rowValues={rowValues}\n />\n </Grid>\n </>\n )}\n {/* Debug Model Snapshot */}\n {showDebugInfo && (\n <Grid\n size={12}\n style={{\n margin: '10px 0',\n padding: '10px',\n border: '1px solid #ccc',\n maxHeight: '400px',\n overflowY: 'auto',\n }}\n >\n <h3>Model</h3>\n {model ? (\n <ClickableJsonCrdt model={model} />\n ) : (\n 'No model available'\n )}\n </Grid>\n )}\n </>\n )}\n </Grid>\n </div>\n )\n },\n)\n\nexport default SynapseGrid\n"],"names":["SynapseGrid","forwardRef","agentRegistrationId","showDebugInfo","ref","session","setSession","useState","replicaId","setReplicaId","chatOpen","setChatOpen","lastSelection","setLastSelection","startGridSessionRef","useRef","gridRef","userBundle","isLoading","useGetCurrentUserBundle","useImperativeHandle","request","sessionId","isConnected","websocketInstance","hasCompletedInitialSync","model","modelSnapshot","connect","presignedUrl","hasSufficientData","useDataGridWebSocket","websocketInstanceRef","useEffect","lastConnectParamsRef","nextParams","prevParams","jsonSchema","useGetSchemaForGrid","entityData","useGetEntity","entityIsView","schemaPropertiesInfo","useMemo","getSchemaPropertiesInfo","connectionStatus","rowValues","modelRowsToGrid","commit","useCallback","applyAndCommitChanges","modelChanges","change","applyModelChange","applyModelChangeFromUndoRedo","undoUI","redoUI","addOperationsToUndoStack","clearRedoStack","useGridUndoRedo","handleChange","newValue","operations","removeNoOpOperations","mapOperationsToModelChanges","handleSelectionChange","opts","selection","replicaSelectionModel","computeReplicaSelectionModel","selectedRowIndexRef","forceUpdate","handleSelectedRowChange","rowIndex","_row","CertificationRequirement","jsxs","Grid","jsx","StartGridSession","Fragment","SkeletonTable","Stack","GridMenuButton","SmartToyTwoTone","GridAgentChat","UploadCsvToGridButton","ExportCsvFromGridButton","MergeGridWithSourceTableButton","DataGrid","ValidationAlert","ClickableJsonCrdt"],"mappings":"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"}
|
|
@@ -53,11 +53,14 @@ import "@mui/material/SvgIcon";
|
|
|
53
53
|
import "../../../assets/icons/AccessPending.svg.js";
|
|
54
54
|
import "../../../assets/icons/AccessPendingCloud.svg.js";
|
|
55
55
|
import "../../../assets/icons/FileWithShield.svg.js";
|
|
56
|
+
import "../../../assets/icons/MultiFile.svg.js";
|
|
57
|
+
import "../../../assets/icons/UnpackagableFile.svg.js";
|
|
56
58
|
import "../../../assets/icons/bioChemicalPhysical.svg.js";
|
|
57
59
|
import "../../../assets/icons/computationalTool.svg.js";
|
|
58
60
|
import "../../../assets/icons/dataReuse.svg.js";
|
|
59
61
|
import "../../../assets/icons/inSilicoModel.svg.js";
|
|
60
62
|
import "../../../assets/icons/modelSystem.svg.js";
|
|
63
|
+
import "../../../assets/mui_components/PackagableFile.svg.js";
|
|
61
64
|
import "../../../assets/icons/spatialProfiling.svg.js";
|
|
62
65
|
import "../../Authentication/AuthenticationMethodSelection.js";
|
|
63
66
|
import "mui-one-time-password-input";
|
|
@@ -82,6 +85,7 @@ import "../../../assets/icons/study-complete.svg.js";
|
|
|
82
85
|
import "../../../assets/icons/translational.svg.js";
|
|
83
86
|
import "../../../assets/icons/tree_horizontal.svg.js";
|
|
84
87
|
import "../../../assets/icons/standardDataModel.svg.js";
|
|
88
|
+
import "../../../assets/icons/Challenge.svg.js";
|
|
85
89
|
import "react-intersection-observer";
|
|
86
90
|
import "@rjsf/utils";
|
|
87
91
|
import "../../SchemaDrivenAnnotationEditor/template/AdditionalPropertyContext.js";
|
|
@@ -99,10 +103,10 @@ import "../../../assets/icons/DoubleQuotes.svg.js";
|
|
|
99
103
|
import "../../EntityDownloadConfirmation/EntityDownloadConfirmation.js";
|
|
100
104
|
import "../../QueryContext/QueryContext.js";
|
|
101
105
|
import "../../QueryVisualizationWrapper/QueryVisualizationContext.js";
|
|
106
|
+
import "react-share";
|
|
102
107
|
import "../../GenericCard/GenericCard.js";
|
|
103
108
|
import "@mui/system";
|
|
104
109
|
import "../../GenericCard/Linkify.js";
|
|
105
|
-
import "react-share";
|
|
106
110
|
import "jotai";
|
|
107
111
|
import "lodash-es/noop";
|
|
108
112
|
import "../../QueryWrapper/TableRowSelectionState.js";
|
|
@@ -202,6 +206,7 @@ import "lodash-es/set";
|
|
|
202
206
|
import "lodash-es/trimStart";
|
|
203
207
|
import "../../SynapseForm/SynapseFormSubmissionGrid.js";
|
|
204
208
|
import "../../SynapseChat/AccessLevelMenu.js";
|
|
209
|
+
import "react-draggable";
|
|
205
210
|
import "../../TimelinePlot/phasesQueryResponseData.js";
|
|
206
211
|
import "../../EntityHeaderTable/EntityHeaderTable.js";
|
|
207
212
|
import "../../MuiContainer.js";
|
|
@@ -219,7 +224,7 @@ function u({
|
|
|
219
224
|
let o = "";
|
|
220
225
|
return i > 0 && (o += `created ${i.toLocaleString()} rows`), i > 0 && r > 0 ? o += " and " : r == 0 && (o += "."), r > 0 && (o += `updated ${r.toLocaleString()} rows.`), I(o);
|
|
221
226
|
}
|
|
222
|
-
function
|
|
227
|
+
function yt(i) {
|
|
223
228
|
const { gridSessionId: r, open: o, onClose: m, onComplete: p } = i, {
|
|
224
229
|
mutate: e,
|
|
225
230
|
isPending: s,
|
|
@@ -251,7 +256,7 @@ function ut(i) {
|
|
|
251
256
|
);
|
|
252
257
|
}
|
|
253
258
|
export {
|
|
254
|
-
|
|
259
|
+
yt as default,
|
|
255
260
|
u as getUpdateMessage
|
|
256
261
|
};
|
|
257
262
|
//# sourceMappingURL=UploadCsvToGridDialog.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"UploadCsvToGridDialog.js","sources":["../../../../src/components/DataGrid/components/UploadCsvToGridDialog.tsx"],"sourcesContent":["import { displayToast } from '@/components/index'\nimport CsvPreviewDialog from '@/components/table/CsvPreview/CsvPreviewDialog'\nimport { useImportCsvIntoGrid } from '@/synapse-queries/grid/useImportCsvIntoGrid'\nimport { GridCsvImportResponse } from '@sage-bionetworks/synapse-client'\nimport upperFirst from 'lodash-es/upperFirst'\n\ntype UploadCsvToGridDialogProps = {\n gridSessionId: string\n open: boolean\n onClose: () => void\n onComplete: () => void\n}\n\nexport function getUpdateMessage({\n createdCount = 0,\n updatedCount = 0,\n}: GridCsvImportResponse): string {\n let message = ''\n if (createdCount > 0) {\n message += `created ${createdCount.toLocaleString()} rows`\n }\n if (createdCount > 0 && updatedCount > 0) {\n message += ' and '\n } else if (updatedCount == 0) {\n message += '.'\n }\n if (updatedCount > 0) {\n message += `updated ${updatedCount.toLocaleString()} rows.`\n }\n return upperFirst(message)\n}\n\nexport default function UploadCsvToGridDialog(\n props: UploadCsvToGridDialogProps,\n) {\n const { gridSessionId, open, onClose, onComplete } = props\n\n const {\n mutate: importCsvIntoGrid,\n isPending,\n error,\n } = useImportCsvIntoGrid({\n onSuccess: result => {\n displayToast(getUpdateMessage(result), 'success', {\n title: 'Data imported successfully',\n })\n onComplete()\n },\n })\n\n return (\n <CsvPreviewDialog\n open={open}\n onClose={onClose}\n onConfirm={(fileHandleId, schema, csvDescriptor) => {\n importCsvIntoGrid({\n concreteType:\n 'org.sagebionetworks.repo.model.grid.GridCsvImportRequest',\n sessionId: gridSessionId,\n fileHandleId,\n csvDescriptor,\n schema,\n })\n }}\n errorMessage={error?.message}\n confirmIsPending={isPending}\n />\n )\n}\n"],"names":["getUpdateMessage","createdCount","updatedCount","message","upperFirst","UploadCsvToGridDialog","props","gridSessionId","open","onClose","onComplete","importCsvIntoGrid","isPending","error","useImportCsvIntoGrid","result","displayToast","jsx","CsvPreviewDialog","fileHandleId","schema","csvDescriptor"],"mappings":"
|
|
1
|
+
{"version":3,"file":"UploadCsvToGridDialog.js","sources":["../../../../src/components/DataGrid/components/UploadCsvToGridDialog.tsx"],"sourcesContent":["import { displayToast } from '@/components/index'\nimport CsvPreviewDialog from '@/components/table/CsvPreview/CsvPreviewDialog'\nimport { useImportCsvIntoGrid } from '@/synapse-queries/grid/useImportCsvIntoGrid'\nimport { GridCsvImportResponse } from '@sage-bionetworks/synapse-client'\nimport upperFirst from 'lodash-es/upperFirst'\n\ntype UploadCsvToGridDialogProps = {\n gridSessionId: string\n open: boolean\n onClose: () => void\n onComplete: () => void\n}\n\nexport function getUpdateMessage({\n createdCount = 0,\n updatedCount = 0,\n}: GridCsvImportResponse): string {\n let message = ''\n if (createdCount > 0) {\n message += `created ${createdCount.toLocaleString()} rows`\n }\n if (createdCount > 0 && updatedCount > 0) {\n message += ' and '\n } else if (updatedCount == 0) {\n message += '.'\n }\n if (updatedCount > 0) {\n message += `updated ${updatedCount.toLocaleString()} rows.`\n }\n return upperFirst(message)\n}\n\nexport default function UploadCsvToGridDialog(\n props: UploadCsvToGridDialogProps,\n) {\n const { gridSessionId, open, onClose, onComplete } = props\n\n const {\n mutate: importCsvIntoGrid,\n isPending,\n error,\n } = useImportCsvIntoGrid({\n onSuccess: result => {\n displayToast(getUpdateMessage(result), 'success', {\n title: 'Data imported successfully',\n })\n onComplete()\n },\n })\n\n return (\n <CsvPreviewDialog\n open={open}\n onClose={onClose}\n onConfirm={(fileHandleId, schema, csvDescriptor) => {\n importCsvIntoGrid({\n concreteType:\n 'org.sagebionetworks.repo.model.grid.GridCsvImportRequest',\n sessionId: gridSessionId,\n fileHandleId,\n csvDescriptor,\n schema,\n })\n }}\n errorMessage={error?.message}\n confirmIsPending={isPending}\n />\n )\n}\n"],"names":["getUpdateMessage","createdCount","updatedCount","message","upperFirst","UploadCsvToGridDialog","props","gridSessionId","open","onClose","onComplete","importCsvIntoGrid","isPending","error","useImportCsvIntoGrid","result","displayToast","jsx","CsvPreviewDialog","fileHandleId","schema","csvDescriptor"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAaO,SAASA,EAAiB;AAAA,EAC/B,cAAAC,IAAe;AAAA,EACf,cAAAC,IAAe;AACjB,GAAkC;AAChC,MAAIC,IAAU;AACd,SAAIF,IAAe,MACjBE,KAAW,WAAWF,EAAa,eAAA,CAAgB,UAEjDA,IAAe,KAAKC,IAAe,IACrCC,KAAW,UACFD,KAAgB,MACzBC,KAAW,MAETD,IAAe,MACjBC,KAAW,WAAWD,EAAa,eAAA,CAAgB,WAE9CE,EAAWD,CAAO;AAC3B;AAEA,SAAwBE,GACtBC,GACA;AACA,QAAM,EAAE,eAAAC,GAAe,MAAAC,GAAM,SAAAC,GAAS,YAAAC,MAAeJ,GAE/C;AAAA,IACJ,QAAQK;AAAA,IACR,WAAAC;AAAA,IACA,OAAAC;AAAA,EAAA,IACEC,EAAqB;AAAA,IACvB,WAAW,CAAAC,MAAU;AACnB,MAAAC,EAAahB,EAAiBe,CAAM,GAAG,WAAW;AAAA,QAChD,OAAO;AAAA,MAAA,CACR,GACDL,EAAA;AAAA,IACF;AAAA,EAAA,CACD;AAED,SACE,gBAAAO;AAAA,IAACC;AAAA,IAAA;AAAA,MACC,MAAAV;AAAA,MACA,SAAAC;AAAA,MACA,WAAW,CAACU,GAAcC,GAAQC,MAAkB;AAClD,QAAAV,EAAkB;AAAA,UAChB,cACE;AAAA,UACF,WAAWJ;AAAA,UACX,cAAAY;AAAA,UACA,eAAAE;AAAA,UACA,QAAAD;AAAA,QAAA,CACD;AAAA,MACH;AAAA,MACA,cAAcP,GAAO;AAAA,MACrB,kBAAkBD;AAAA,IAAA;AAAA,EAAA;AAGxB;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DirectDownload.d.ts","sourceRoot":"","sources":["../../../src/components/DirectDownload/DirectDownload.tsx"],"names":[],"mappings":"AAGA,OAAO,EAEL,uBAAuB,EACxB,MAAM,iCAAiC,CAAA;AAExC,OAAgB,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AAI1D,MAAM,MAAM,uBAAuB,GAAG;IACpC,kBAAkB,EAAE,MAAM,CAAA;IAC1B,oBAAoB,EAAE,uBAAuB,CAAA;IAC7C,YAAY,EAAE,MAAM,CAAA;IACpB,eAAe,CAAC,EAAE,OAAO,CAAA;IACzB,eAAe,CAAC,EAAE,CAAC,cAAc,EAAE,OAAO,KAAK,IAAI,CAAA;IACnD,eAAe,CAAC,EAAE,OAAO,CAAA;IACzB,oBAAoB,CAAC,EAAE,OAAO,CAAC,YAAY,CAAC,CAAA;CAC7C,CAAA;AAsED,iBAAS,cAAc,CAAC,KAAK,EAAE,uBAAuB,
|
|
1
|
+
{"version":3,"file":"DirectDownload.d.ts","sourceRoot":"","sources":["../../../src/components/DirectDownload/DirectDownload.tsx"],"names":[],"mappings":"AAGA,OAAO,EAEL,uBAAuB,EACxB,MAAM,iCAAiC,CAAA;AAExC,OAAgB,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AAI1D,MAAM,MAAM,uBAAuB,GAAG;IACpC,kBAAkB,EAAE,MAAM,CAAA;IAC1B,oBAAoB,EAAE,uBAAuB,CAAA;IAC7C,YAAY,EAAE,MAAM,CAAA;IACpB,eAAe,CAAC,EAAE,OAAO,CAAA;IACzB,eAAe,CAAC,EAAE,CAAC,cAAc,EAAE,OAAO,KAAK,IAAI,CAAA;IACnD,eAAe,CAAC,EAAE,OAAO,CAAA;IACzB,oBAAoB,CAAC,EAAE,OAAO,CAAC,YAAY,CAAC,CAAA;CAC7C,CAAA;AAsED,iBAAS,cAAc,CAAC,KAAK,EAAE,uBAAuB,2CAuErD;AAED,eAAe,cAAc,CAAA"}
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
import { jsx as o, jsxs as F, Fragment as k } from "react/jsx-runtime";
|
|
2
|
-
import { useGetFileBatch as
|
|
2
|
+
import { useGetFileBatch as b } from "../../synapse-queries/file/useFiles.js";
|
|
3
3
|
import { implementsExternalFileHandleInterface as L } from "../../utils/types/IsType.js";
|
|
4
|
-
import { Tooltip as
|
|
5
|
-
import { forwardRef as
|
|
6
|
-
import
|
|
7
|
-
import { TOOLTIP_DELAY_SHOW as
|
|
8
|
-
import { useDirectDownloadHandler as
|
|
9
|
-
const
|
|
4
|
+
import { Tooltip as h } from "@mui/material";
|
|
5
|
+
import { forwardRef as x } from "react";
|
|
6
|
+
import g from "../IconSvg/IconSvg.js";
|
|
7
|
+
import { TOOLTIP_DELAY_SHOW as P } from "../SynapseTable/SynapseTableConstants.js";
|
|
8
|
+
import { useDirectDownloadHandler as N } from "../../utils/hooks/useDirectDownloadHandler.js";
|
|
9
|
+
const O = x(function(l, n) {
|
|
10
10
|
const {
|
|
11
11
|
isExternalFile: i,
|
|
12
12
|
onClick: r,
|
|
@@ -30,10 +30,10 @@ const h = b(function(l, n) {
|
|
|
30
30
|
"a",
|
|
31
31
|
{
|
|
32
32
|
className: "ignoreLink",
|
|
33
|
-
rel: "noreferrer",
|
|
33
|
+
rel: "noopener noreferrer",
|
|
34
34
|
href: d,
|
|
35
35
|
target: "_blank",
|
|
36
|
-
children: /* @__PURE__ */ o(
|
|
36
|
+
children: /* @__PURE__ */ o(g, { icon: "download", ...c })
|
|
37
37
|
}
|
|
38
38
|
)
|
|
39
39
|
}
|
|
@@ -46,13 +46,13 @@ const h = b(function(l, n) {
|
|
|
46
46
|
t(), s && a.stopPropagation();
|
|
47
47
|
},
|
|
48
48
|
children: [
|
|
49
|
-
/* @__PURE__ */ o(
|
|
49
|
+
/* @__PURE__ */ o(g, { icon: "download", ...c }),
|
|
50
50
|
m && e ? e : ""
|
|
51
51
|
]
|
|
52
52
|
}
|
|
53
53
|
) : /* @__PURE__ */ o(k, {});
|
|
54
54
|
});
|
|
55
|
-
function U(
|
|
55
|
+
function U(p) {
|
|
56
56
|
const {
|
|
57
57
|
associatedObjectId: l,
|
|
58
58
|
associatedObjectType: n,
|
|
@@ -61,27 +61,27 @@ function U(u) {
|
|
|
61
61
|
onClickCallback: t,
|
|
62
62
|
stopPropagation: s = !1,
|
|
63
63
|
iconSvgPropOverrides: d
|
|
64
|
-
} =
|
|
64
|
+
} = p, f = {
|
|
65
65
|
fileHandleId: i,
|
|
66
66
|
associateObjectId: l,
|
|
67
67
|
associateObjectType: n
|
|
68
|
-
}, { data: m } =
|
|
68
|
+
}, { data: m } = b({
|
|
69
69
|
requestedFiles: [f],
|
|
70
70
|
includeFileHandles: !0,
|
|
71
71
|
// don't get the presigned URL with this query, it may expire before the user clicks the download button
|
|
72
72
|
includePreSignedURLs: !1,
|
|
73
73
|
includePreviewPreSignedURLs: !1
|
|
74
|
-
}), e = m?.requestedFiles[0]?.fileHandle, c = !!e, a = e?.fileName,
|
|
74
|
+
}), e = m?.requestedFiles[0]?.fileHandle, c = !!e, a = e?.fileName, u = e ? L(e) : void 0, w = e ? e.externalURL : void 0, { downloadFile: D } = N();
|
|
75
75
|
return /* @__PURE__ */ o(
|
|
76
|
-
|
|
76
|
+
h,
|
|
77
77
|
{
|
|
78
|
-
title:
|
|
79
|
-
enterNextDelay:
|
|
78
|
+
title: "Click to begin download of this file",
|
|
79
|
+
enterNextDelay: P,
|
|
80
80
|
placement: "left",
|
|
81
|
-
children: /* @__PURE__ */ o(
|
|
82
|
-
|
|
81
|
+
children: /* @__PURE__ */ o("span", { children: /* @__PURE__ */ o(
|
|
82
|
+
O,
|
|
83
83
|
{
|
|
84
|
-
isExternalFile:
|
|
84
|
+
isExternalFile: u,
|
|
85
85
|
hasFileAccess: c,
|
|
86
86
|
onClick: t,
|
|
87
87
|
getDownloadLink: async () => {
|
|
@@ -89,15 +89,15 @@ function U(u) {
|
|
|
89
89
|
fileHandleId: i,
|
|
90
90
|
associatedObjectId: l,
|
|
91
91
|
associatedObjectType: n
|
|
92
|
-
}), t && t(
|
|
92
|
+
}), t && t(u);
|
|
93
93
|
},
|
|
94
94
|
stopPropagation: s,
|
|
95
|
-
externalURL:
|
|
95
|
+
externalURL: w,
|
|
96
96
|
displayFileName: r,
|
|
97
97
|
fileName: a,
|
|
98
98
|
iconSvgPropOverrides: d
|
|
99
99
|
}
|
|
100
|
-
)
|
|
100
|
+
) })
|
|
101
101
|
}
|
|
102
102
|
);
|
|
103
103
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DirectDownload.js","sources":["../../../src/components/DirectDownload/DirectDownload.tsx"],"sourcesContent":["import { useGetFileBatch } from '@/synapse-queries/file/useFiles'\nimport { implementsExternalFileHandleInterface } from '@/utils/types/IsType'\nimport { Tooltip } from '@mui/material'\nimport {\n ExternalFileHandle,\n FileHandleAssociateType,\n} from '@sage-bionetworks/synapse-types'\nimport { forwardRef } from 'react'\nimport IconSvg, { IconSvgProps } from '../IconSvg/IconSvg'\nimport { TOOLTIP_DELAY_SHOW } from '../SynapseTable/SynapseTableConstants'\nimport { useDirectDownloadHandler } from '@/utils/hooks/useDirectDownloadHandler'\n\nexport type DirectFileDownloadProps = {\n associatedObjectId: string\n associatedObjectType: FileHandleAssociateType\n fileHandleId: string\n displayFileName?: boolean\n onClickCallback?: (isExternalLink: boolean) => void // callback if you want to know when the link was clicked\n stopPropagation?: boolean\n iconSvgPropOverrides?: Partial<IconSvgProps>\n}\n\ntype DirectDownloadIconProps = {\n isExternalFile?: boolean\n hasFileAccess: boolean\n onClick?: (isExternalFile: boolean) => void\n getDownloadLink: () => Promise<void>\n stopPropagation: boolean\n externalURL?: string\n displayFileName: boolean\n fileName?: string\n iconSvgPropOverrides?: Partial<IconSvgProps>\n}\n\nconst DirectDownloadIcon = forwardRef<\n HTMLButtonElement,\n DirectDownloadIconProps\n>(function DirectDownloadIcon(props: DirectDownloadIconProps, ref) {\n const {\n isExternalFile,\n onClick,\n getDownloadLink,\n stopPropagation,\n externalURL,\n hasFileAccess,\n displayFileName,\n fileName,\n iconSvgPropOverrides = {},\n } = props\n if (isExternalFile) {\n return (\n <button\n ref={ref}\n className={'btn-download-icon'}\n onClick={event => {\n if (onClick) {\n onClick(isExternalFile)\n if (stopPropagation) event.stopPropagation()\n }\n }}\n >\n <a\n className=\"ignoreLink\"\n rel=\"noreferrer\"\n href={externalURL}\n target=\"_blank\"\n >\n <IconSvg icon=\"
|
|
1
|
+
{"version":3,"file":"DirectDownload.js","sources":["../../../src/components/DirectDownload/DirectDownload.tsx"],"sourcesContent":["import { useGetFileBatch } from '@/synapse-queries/file/useFiles'\nimport { implementsExternalFileHandleInterface } from '@/utils/types/IsType'\nimport { Tooltip } from '@mui/material'\nimport {\n ExternalFileHandle,\n FileHandleAssociateType,\n} from '@sage-bionetworks/synapse-types'\nimport { forwardRef } from 'react'\nimport IconSvg, { IconSvgProps } from '../IconSvg/IconSvg'\nimport { TOOLTIP_DELAY_SHOW } from '../SynapseTable/SynapseTableConstants'\nimport { useDirectDownloadHandler } from '@/utils/hooks/useDirectDownloadHandler'\n\nexport type DirectFileDownloadProps = {\n associatedObjectId: string\n associatedObjectType: FileHandleAssociateType\n fileHandleId: string\n displayFileName?: boolean\n onClickCallback?: (isExternalLink: boolean) => void // callback if you want to know when the link was clicked\n stopPropagation?: boolean\n iconSvgPropOverrides?: Partial<IconSvgProps>\n}\n\ntype DirectDownloadIconProps = {\n isExternalFile?: boolean\n hasFileAccess: boolean\n onClick?: (isExternalFile: boolean) => void\n getDownloadLink: () => Promise<void>\n stopPropagation: boolean\n externalURL?: string\n displayFileName: boolean\n fileName?: string\n iconSvgPropOverrides?: Partial<IconSvgProps>\n}\n\nconst DirectDownloadIcon = forwardRef<\n HTMLButtonElement,\n DirectDownloadIconProps\n>(function DirectDownloadIcon(props: DirectDownloadIconProps, ref) {\n const {\n isExternalFile,\n onClick,\n getDownloadLink,\n stopPropagation,\n externalURL,\n hasFileAccess,\n displayFileName,\n fileName,\n iconSvgPropOverrides = {},\n } = props\n if (isExternalFile) {\n return (\n <button\n ref={ref}\n className={'btn-download-icon'}\n onClick={event => {\n if (onClick) {\n onClick(isExternalFile)\n if (stopPropagation) event.stopPropagation()\n }\n }}\n >\n <a\n className=\"ignoreLink\"\n rel=\"noopener noreferrer\"\n href={externalURL}\n target=\"_blank\"\n >\n <IconSvg icon=\"download\" {...iconSvgPropOverrides} />\n </a>\n </button>\n )\n }\n if (hasFileAccess) {\n return (\n <button\n ref={ref}\n className={'btn-download-icon'}\n onClick={event => {\n getDownloadLink()\n if (stopPropagation) event.stopPropagation()\n }}\n >\n <IconSvg icon=\"download\" {...iconSvgPropOverrides} />\n {displayFileName && fileName ? fileName : ''}\n </button>\n )\n }\n return <></>\n})\n\nfunction DirectDownload(props: DirectFileDownloadProps) {\n const {\n associatedObjectId,\n associatedObjectType,\n fileHandleId,\n displayFileName = false,\n onClickCallback,\n stopPropagation = false,\n iconSvgPropOverrides,\n } = props\n\n const fileHandleAssociation = {\n fileHandleId: fileHandleId,\n associateObjectId: associatedObjectId,\n associateObjectType: associatedObjectType,\n }\n\n // Get file handle data to ensure we have access / display information\n const { data } = useGetFileBatch({\n requestedFiles: [fileHandleAssociation],\n includeFileHandles: true,\n // don't get the presigned URL with this query, it may expire before the user clicks the download button\n includePreSignedURLs: false,\n includePreviewPreSignedURLs: false,\n })\n\n const fileHandle = data?.requestedFiles[0]?.fileHandle\n const hasFileAccess = Boolean(fileHandle)\n const fileName = fileHandle?.fileName\n const isExternalFile = fileHandle\n ? implementsExternalFileHandleInterface(fileHandle)\n : undefined\n const externalURL: string | undefined = fileHandle\n ? (fileHandle as ExternalFileHandle).externalURL\n : undefined\n\n const { downloadFile } = useDirectDownloadHandler()\n\n const getDownloadLink = async () => {\n await downloadFile({\n fileHandleId,\n associatedObjectId,\n associatedObjectType,\n })\n\n if (onClickCallback) {\n onClickCallback(isExternalFile!)\n }\n }\n\n return (\n <Tooltip\n title=\"Click to begin download of this file\"\n enterNextDelay={TOOLTIP_DELAY_SHOW}\n placement=\"left\"\n >\n <span>\n <DirectDownloadIcon\n isExternalFile={isExternalFile}\n hasFileAccess={hasFileAccess}\n onClick={onClickCallback}\n getDownloadLink={getDownloadLink}\n stopPropagation={stopPropagation}\n externalURL={externalURL}\n displayFileName={displayFileName}\n fileName={fileName}\n iconSvgPropOverrides={iconSvgPropOverrides}\n />\n </span>\n </Tooltip>\n )\n}\n\nexport default DirectDownload\n"],"names":["DirectDownloadIcon","forwardRef","props","ref","isExternalFile","onClick","getDownloadLink","stopPropagation","externalURL","hasFileAccess","displayFileName","fileName","iconSvgPropOverrides","jsx","event","IconSvg","jsxs","Fragment","DirectDownload","associatedObjectId","associatedObjectType","fileHandleId","onClickCallback","fileHandleAssociation","data","useGetFileBatch","fileHandle","implementsExternalFileHandleInterface","downloadFile","useDirectDownloadHandler","Tooltip","TOOLTIP_DELAY_SHOW"],"mappings":";;;;;;;;AAkCA,MAAMA,IAAqBC,EAGzB,SAA4BC,GAAgCC,GAAK;AACjE,QAAM;AAAA,IACJ,gBAAAC;AAAA,IACA,SAAAC;AAAA,IACA,iBAAAC;AAAA,IACA,iBAAAC;AAAA,IACA,aAAAC;AAAA,IACA,eAAAC;AAAA,IACA,iBAAAC;AAAA,IACA,UAAAC;AAAA,IACA,sBAAAC,IAAuB,CAAA;AAAA,EAAC,IACtBV;AACJ,SAAIE,IAEA,gBAAAS;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,KAAAV;AAAA,MACA,WAAW;AAAA,MACX,SAAS,CAAAW,MAAS;AAChB,QAAIT,MACFA,EAAQD,CAAc,GAClBG,OAAuB,gBAAA;AAAA,MAE/B;AAAA,MAEA,UAAA,gBAAAM;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,WAAU;AAAA,UACV,KAAI;AAAA,UACJ,MAAML;AAAA,UACN,QAAO;AAAA,UAEP,UAAA,gBAAAK,EAACE,GAAA,EAAQ,MAAK,YAAY,GAAGH,EAAA,CAAsB;AAAA,QAAA;AAAA,MAAA;AAAA,IACrD;AAAA,EAAA,IAIFH,IAEA,gBAAAO;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,KAAAb;AAAA,MACA,WAAW;AAAA,MACX,SAAS,CAAAW,MAAS;AAChB,QAAAR,EAAA,GACIC,OAAuB,gBAAA;AAAA,MAC7B;AAAA,MAEA,UAAA;AAAA,QAAA,gBAAAM,EAACE,GAAA,EAAQ,MAAK,YAAY,GAAGH,EAAA,CAAsB;AAAA,QAClDF,KAAmBC,IAAWA,IAAW;AAAA,MAAA;AAAA,IAAA;AAAA,EAAA,IAIzC,gBAAAE,EAAAI,GAAA,EAAE;AACX,CAAC;AAED,SAASC,EAAehB,GAAgC;AACtD,QAAM;AAAA,IACJ,oBAAAiB;AAAA,IACA,sBAAAC;AAAA,IACA,cAAAC;AAAA,IACA,iBAAAX,IAAkB;AAAA,IAClB,iBAAAY;AAAA,IACA,iBAAAf,IAAkB;AAAA,IAClB,sBAAAK;AAAA,EAAA,IACEV,GAEEqB,IAAwB;AAAA,IAC5B,cAAAF;AAAA,IACA,mBAAmBF;AAAA,IACnB,qBAAqBC;AAAA,EAAA,GAIjB,EAAE,MAAAI,EAAA,IAASC,EAAgB;AAAA,IAC/B,gBAAgB,CAACF,CAAqB;AAAA,IACtC,oBAAoB;AAAA;AAAA,IAEpB,sBAAsB;AAAA,IACtB,6BAA6B;AAAA,EAAA,CAC9B,GAEKG,IAAaF,GAAM,eAAe,CAAC,GAAG,YACtCf,IAAgB,EAAQiB,GACxBf,IAAWe,GAAY,UACvBtB,IAAiBsB,IACnBC,EAAsCD,CAAU,IAChD,QACElB,IAAkCkB,IACnCA,EAAkC,cACnC,QAEE,EAAE,cAAAE,EAAA,IAAiBC,EAAA;AAczB,SACE,gBAAAhB;AAAA,IAACiB;AAAA,IAAA;AAAA,MACC,OAAM;AAAA,MACN,gBAAgBC;AAAA,MAChB,WAAU;AAAA,MAEV,4BAAC,QAAA,EACC,UAAA,gBAAAlB;AAAA,QAACb;AAAA,QAAA;AAAA,UACC,gBAAAI;AAAA,UACA,eAAAK;AAAA,UACA,SAASa;AAAA,UACT,iBAvBgB,YAAY;AAClC,kBAAMM,EAAa;AAAA,cACjB,cAAAP;AAAA,cACA,oBAAAF;AAAA,cACA,sBAAAC;AAAA,YAAA,CACD,GAEGE,KACFA,EAAgBlB,CAAe;AAAA,UAEnC;AAAA,UAcQ,iBAAAG;AAAA,UACA,aAAAC;AAAA,UACA,iBAAAE;AAAA,UACA,UAAAC;AAAA,UACA,sBAAAC;AAAA,QAAA;AAAA,MAAA,EACF,CACF;AAAA,IAAA;AAAA,EAAA;AAGN;"}
|
|
@@ -1,5 +1,9 @@
|
|
|
1
|
+
import { AvailableFilter } from '@sage-bionetworks/synapse-types';
|
|
2
|
+
export type AvailableForDownloadTableProps = {
|
|
3
|
+
filter?: AvailableFilter;
|
|
4
|
+
};
|
|
1
5
|
/**
|
|
2
|
-
* Table of the files added to the Download
|
|
6
|
+
* Table of the files added to the Download List that are currently available for download.
|
|
3
7
|
*/
|
|
4
|
-
export default function AvailableForDownloadTable(): import("react/jsx-runtime").JSX.Element;
|
|
8
|
+
export default function AvailableForDownloadTable({ filter, }: AvailableForDownloadTableProps): import("react/jsx-runtime").JSX.Element;
|
|
5
9
|
//# sourceMappingURL=AvailableForDownloadTable.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AvailableForDownloadTable.d.ts","sourceRoot":"","sources":["../../../src/components/DownloadCart/AvailableForDownloadTable.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"AvailableForDownloadTable.d.ts","sourceRoot":"","sources":["../../../src/components/DownloadCart/AvailableForDownloadTable.tsx"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,iCAAiC,CAAA;AAIjE,MAAM,MAAM,8BAA8B,GAAG;IAC3C,MAAM,CAAC,EAAE,eAAe,CAAA;CACzB,CAAA;AAED;;GAEG;AACH,MAAM,CAAC,OAAO,UAAU,yBAAyB,CAAC,EAChD,MAAM,GACP,EAAE,8BAA8B,2CAUhC"}
|