synapse-react-client 4.0.1 → 4.0.3-b
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/DNA_Two.svg +0 -0
- package/dist/assets/icons/Data2.svg +0 -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.d.ts +3 -0
- package/dist/components/EntityDownloadButton/EntityDownloadButton.d.ts.map +1 -1
- package/dist/components/EntityDownloadButton/EntityDownloadButton.js +113 -119
- 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/SynapseHomepageV2/SynapseHomepageChatSearch.d.ts.map +1 -1
- package/dist/components/SynapseHomepageV2/SynapseHomepageChatSearch.js +30 -32
- package/dist/components/SynapseHomepageV2/SynapseHomepageChatSearch.js.map +1 -1
- package/dist/components/SynapseHomepageV2/SynapseHomepageSearch.d.ts.map +1 -1
- package/dist/components/SynapseHomepageV2/SynapseHomepageSearch.js +27 -30
- package/dist/components/SynapseHomepageV2/SynapseHomepageSearch.js.map +1 -1
- package/dist/components/SynapseHomepageV2/SynapseSearchChips.d.ts.map +1 -1
- package/dist/components/SynapseHomepageV2/SynapseSearchChips.js +14 -17
- package/dist/components/SynapseHomepageV2/SynapseSearchChips.js.map +1 -1
- package/dist/components/SynapseNavDrawer/SynapseNavDrawer.d.ts.map +1 -1
- package/dist/components/SynapseNavDrawer/SynapseNavDrawer.js +114 -115
- package/dist/components/SynapseNavDrawer/SynapseNavDrawer.js.map +1 -1
- package/dist/components/SynapsePortalBanners/SynapsePortalBanners.d.ts.map +1 -1
- package/dist/components/SynapsePortalBanners/SynapsePortalBanners.js +39 -39
- package/dist/components/SynapsePortalBanners/SynapsePortalBanners.js.map +1 -1
- package/dist/components/SynapseSearchPageResults/SearchPagePortalBanners.js +18 -18
- package/dist/components/SynapseSearchPageResults/SearchPagePortalBanners.js.map +1 -1
- package/dist/components/SynapseSearchPageResults/SynapseSearchResultsCard.d.ts.map +1 -1
- package/dist/components/SynapseSearchPageResults/SynapseSearchResultsCard.js +66 -64
- package/dist/components/SynapseSearchPageResults/SynapseSearchResultsCard.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/abstracts/_functions.scss +0 -0
- package/dist/style/abstracts/_mixins.scss +0 -0
- package/dist/style/abstracts/_variables.scss +0 -0
- package/dist/style/base/_base.scss +0 -0
- package/dist/style/base/_fonts.scss +0 -0
- package/dist/style/base/_helpers.scss +0 -0
- 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/style/main.scss +0 -0
- package/dist/style/vendors/_normalize.scss +0 -0
- 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 +25 -24
- 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":"QueryWrapperPlotNav.js","sources":["../../../src/components/QueryWrapperPlotNav/QueryWrapperPlotNav.tsx"],"sourcesContent":["import { QueryOrDeprecatedSearchParams } from '@/components/CardContainerLogic/CardContainerLogic'\nimport AddToDownloadListConfirmationAlert from '@/components/download_list/AddToDownloadListConfirmationAlert/AddToDownloadListConfirmationAlert'\nimport { useGetAddToDownloadListRequestForCurrentQuery } from '@/components/QueryWrapper/useGetAddToDownloadListRequestForCurrentQuery'\nimport { NoContentPlaceholderType } from '@/components/SynapseTable/NoContentPlaceholderType'\nimport { useGetEntity } from '@/synapse-queries'\nimport { SynapseConstants } from '@/utils'\nimport {\n getAdditionalFilters,\n parseEntityIdAndVersionFromSqlStatement,\n} from '@/utils/functions'\nimport { isTable } from '@/utils/functions/EntityTypeUtils'\nimport { DEFAULT_PAGE_SIZE } from '@/utils/SynapseConstants'\nimport { Box } from '@mui/material'\nimport { Query, QueryBundleRequest } from '@sage-bionetworks/synapse-types'\nimport { useQuery } from '@tanstack/react-query'\nimport { useAtomValue } from 'jotai'\nimport { useMemo, useState } from 'react'\nimport { CardConfiguration } from '../CardContainer/CardConfiguration'\nimport { SynapseErrorBoundary } from '../error'\nimport FullTextSearch from '../FullTextSearch/FullTextSearch'\nimport ModalDownload from '../ModalDownload/ModalDownload'\nimport { QueryWrapperPlotNavCustomPlotParams } from '../Plot/SynapsePlot'\nimport { QueryContextType, useQueryContext } from '../QueryContext'\nimport {\n QueryVisualizationContextConsumer,\n QueryVisualizationWrapper,\n QueryVisualizationWrapperProps,\n} from '../QueryVisualizationWrapper'\nimport { QueryWrapper, QueryWrapperProps } from '../QueryWrapper'\nimport { isRowSelectionVisibleAtom } from '../QueryWrapper/TableRowSelectionState'\nimport { QueryWrapperErrorBoundary } from '../QueryWrapperErrorBoundary'\nimport { SynapseTableConfiguration } from '../SynapseTable'\nimport SearchV2, { SearchV2Props } from '../SynapseTable/SearchV2'\nimport SqlEditor from '../SynapseTable/SqlEditor'\nimport TopLevelControls, {\n TopLevelControlsProps,\n CustomControl,\n} from '../SynapseTable/TopLevelControls/TopLevelControls'\nimport { CustomControls } from '../SynapseTable/CustomControls/CustomControls'\nimport TotalQueryResults from '../TotalQueryResults'\nimport PlotsContainer, {\n PlotsContainerProps,\n} from '../widgets/facet-nav/PlotsContainer'\nimport FacetFilterControls, {\n FacetFilterControlsProps,\n} from '../widgets/query-filter/FacetFilterControls'\nimport { QueryWrapperSynapsePlotProps } from './QueryWrapperSynapsePlot'\nimport { RowSetView } from './RowSetView'\n\nexport const QUERY_FILTERS_EXPANDED_CSS: string = 'isShowingFacetFilters'\nexport const QUERY_FILTERS_COLLAPSED_CSS: string = 'isHidingFacetFilters'\n\nexport const HAS_SELECTED_ROWS_CSS: string = 'hasSelectedRows'\n\ntype QueryWrapperPlotNavOwnProps = {\n /** Whether the displayed results should be paginated or infinite. Default for cards is true, default for table is false */\n isInfinite?: boolean\n /** Set to true when you want the query to be saved in the URL search parameters. If you are controlling the view (such as in PortalSearch), you'll want to set this to false */\n shouldDeepLink?: boolean\n /** If onQueryChange is set, the callback will be invoked when the Query changes */\n onQueryChange?: (newQueryJson: string) => void\n /** If onQueryResultBundleChange is set, the callback will be invoked when the QueryResultBundle changes */\n onQueryResultBundleChange?: (newQueryResultBundleJson: string) => void\n /** If initQueryJson is set, it will be the Query used in the initial QueryBundleRequest */\n initQueryJson?: string\n tableConfiguration?: SynapseTableConfiguration\n cardConfiguration?: CardConfiguration\n searchConfiguration?: Omit<\n SearchV2Props,\n 'queryContext' | 'queryVisualizationContext'\n >\n facetsToPlot?: string[]\n availableFacets?: FacetFilterControlsProps['availableFacets']\n initialExpandedFacetControls?: FacetFilterControlsProps['initialExpandedFacetControls']\n customPlots?: QueryWrapperSynapsePlotProps[]\n customControls?: CustomControl[]\n defaultColumn?: string\n defaultShowSearchBox?: boolean\n lockedColumn?: QueryWrapperProps['lockedColumn']\n onViewSharingSettingsClicked?: (benefactorId: string) => void\n initialLimit?: number\n} & Omit<TopLevelControlsProps, 'entityId'> &\n Pick<QueryWrapperPlotNavCustomPlotParams, 'onCustomPlotClick'> &\n Pick<\n QueryWrapperProps,\n | 'isRowSelectionVisible'\n | 'rowSelectionPrimaryKey'\n | 'isRowSelectionUIFloating'\n | 'fileIdColumnName'\n | 'fileNameColumnName'\n | 'fileVersionColumnName'\n > &\n Pick<\n QueryVisualizationWrapperProps,\n | 'defaultShowPlots'\n | 'visibleColumnCount'\n | 'columnAliases'\n | 'rgbIndex'\n | 'showLastUpdatedOn'\n | 'noContentPlaceholderType'\n | 'unitDescription'\n | 'additionalFiltersSessionStorageKey'\n | 'helpConfiguration'\n | 'hideCopyToClipboard'\n | 'hideSearchBarControl'\n | 'hideVisualizationsControl'\n | 'enabledExternalAnalysisPlatforms'\n > &\n Pick<QueryContextType, 'combineRangeFacetConfig'>\n\nexport type QueryWrapperPlotNavProps = QueryOrDeprecatedSearchParams &\n PlotsContainerProps &\n QueryWrapperPlotNavOwnProps\n\ntype QueryWrapperPlotNavContentsProps = Pick<\n QueryWrapperPlotNavProps,\n | 'tableConfiguration'\n | 'name'\n | 'cardConfiguration'\n | 'facetsToPlot'\n | 'availableFacets'\n | 'initialExpandedFacetControls'\n | 'hideDownload'\n | 'hideQueryCount'\n | 'hideSqlEditorControl'\n | 'hideVisualizationsControl'\n | 'searchConfiguration'\n | 'enabledExternalAnalysisPlatforms'\n | 'cavaticaConnectAccountURL'\n | 'customControls'\n | 'customPlots'\n | 'fileIdColumnName'\n | 'fileNameColumnName'\n | 'fileVersionColumnName'\n | 'initialLimit'\n | 'initialPlotType'\n> & {\n isFullTextSearchEnabled: boolean\n remount: () => void\n}\n\nfunction QueryWrapperPlotNavContents(props: QueryWrapperPlotNavContentsProps) {\n const {\n tableConfiguration,\n name,\n cardConfiguration,\n facetsToPlot,\n availableFacets,\n initialExpandedFacetControls,\n hideDownload,\n hideQueryCount,\n hideSqlEditorControl,\n hideVisualizationsControl,\n searchConfiguration,\n cavaticaConnectAccountURL,\n customControls,\n remount,\n isFullTextSearchEnabled,\n customPlots,\n initialLimit,\n initialPlotType,\n } = props\n const queryContext = useQueryContext()\n const [showExportMetadata, setShowExportMetadata] = useState(false)\n const { hasFacetedSelectColumn: isFaceted, queryMetadataQueryOptions } =\n queryContext\n const { isLoading: isLoadingQueryMetadata } = useQuery(\n queryMetadataQueryOptions,\n )\n\n const isRowSelectionVisible = useAtomValue(isRowSelectionVisibleAtom)\n\n const currentQueryRequest = queryContext.currentQueryRequest\n\n const hasFacetsOrFilters =\n (currentQueryRequest?.query.selectedFacets !== undefined &&\n currentQueryRequest.query.selectedFacets.length > 0) ||\n (currentQueryRequest?.query.additionalFilters !== undefined &&\n currentQueryRequest?.query.additionalFilters.length > 0)\n\n const addToDownloadListRequest =\n useGetAddToDownloadListRequestForCurrentQuery()\n\n return (\n <QueryVisualizationContextConsumer>\n {queryVisualizationContext => {\n if (queryVisualizationContext === undefined) {\n throw new Error(\n 'No queryVisualizationContext found when using QueryVisualizationContextConsumer',\n )\n }\n\n return (\n <Box\n className={`QueryWrapperPlotNav ${\n queryVisualizationContext.showFacetFilter\n ? QUERY_FILTERS_EXPANDED_CSS\n : QUERY_FILTERS_COLLAPSED_CSS\n } ${isRowSelectionVisible ? HAS_SELECTED_ROWS_CSS : ''}`}\n sx={{\n '*': {\n cursor: isLoadingQueryMetadata ? 'wait' : undefined,\n },\n }}\n >\n <QueryWrapperErrorBoundary>\n {isFullTextSearchEnabled ? (\n <FullTextSearch ftsConfig={searchConfiguration?.ftsConfig} />\n ) : (\n <SearchV2\n {...searchConfiguration}\n queryContext={queryContext}\n queryVisualizationContext={queryVisualizationContext}\n />\n )}\n <SqlEditor />\n {queryVisualizationContext.showDownloadConfirmation && (\n <AddToDownloadListConfirmationAlert\n addToDownloadListRequest={addToDownloadListRequest}\n onClose={() =>\n queryVisualizationContext.setShowDownloadConfirmation(false)\n }\n />\n )}\n <SynapseErrorBoundary>\n <TopLevelControls\n showColumnSelection={tableConfiguration !== undefined}\n name={name}\n hideDownload={hideDownload}\n hideQueryCount={hideQueryCount}\n hideFacetFilterControl={!isFaceted}\n hideVisualizationsControl={\n !isFaceted || hideVisualizationsControl\n }\n hideSqlEditorControl={hideSqlEditorControl}\n cavaticaConnectAccountURL={cavaticaConnectAccountURL}\n remount={remount}\n customControls={customControls}\n />\n </SynapseErrorBoundary>\n {isFaceted && (\n <>\n <FacetFilterControls\n availableFacets={availableFacets}\n initialExpandedFacetControls={initialExpandedFacetControls}\n />\n </>\n )}\n <TotalQueryResults\n frontText={''}\n endText={hasFacetsOrFilters ? 'filtered by' : ''}\n hideIfUnfiltered={true}\n />\n <CustomControls\n customControls={customControls}\n remount={remount}\n />\n <PlotsContainer\n facetsToPlot={facetsToPlot}\n customPlots={customPlots}\n initialPlotType={initialPlotType}\n />\n <RowSetView\n tableConfiguration={tableConfiguration}\n hideDownload={hideDownload}\n cardConfiguration={cardConfiguration}\n initialLimit={initialLimit}\n />\n {showExportMetadata && (\n <ModalDownload\n getLastQueryRequest={queryContext?.getCurrentQueryRequest}\n onClose={() => setShowExportMetadata(false)}\n />\n )}\n </QueryWrapperErrorBoundary>\n </Box>\n )\n }}\n </QueryVisualizationContextConsumer>\n )\n}\n\nexport default function QueryWrapperPlotNav(props: QueryWrapperPlotNavProps) {\n const {\n sql: deprecatedSql,\n tableConfiguration,\n isInfinite = !tableConfiguration,\n limit = DEFAULT_PAGE_SIZE,\n showLastUpdatedOn,\n unitDescription,\n additionalFiltersSessionStorageKey,\n helpConfiguration,\n customPlots,\n enabledExternalAnalysisPlatforms,\n } = props\n\n const sql = props.query?.sql ?? deprecatedSql ?? ''\n const { entityId, versionNumber } =\n parseEntityIdAndVersionFromSqlStatement(sql)\n\n const query: Query = useMemo(() => {\n if (props.query) {\n // use query if set\n return props.query\n } else if (props.initQueryJson) {\n // Otherwise use initQueryJson\n return JSON.parse(props.initQueryJson) as Query\n } else {\n // use the deprecated sql, searchParams, and sqlOperator\n const additionalFilters = getAdditionalFilters(\n props.searchParams,\n props.sqlOperator,\n additionalFiltersSessionStorageKey,\n )\n return {\n sql: deprecatedSql!,\n additionalFilters,\n limit: limit,\n offset: 0,\n }\n }\n }, [\n props.query,\n props.initQueryJson,\n props.searchParams,\n props.sqlOperator,\n additionalFiltersSessionStorageKey,\n deprecatedSql,\n limit,\n ])\n\n const [componentKey, setComponentKey] = useState(1)\n const remount = () => {\n setComponentKey(componentKey + 1)\n }\n\n const { data: entity } = useGetEntity(entityId, versionNumber)\n const initQueryRequest: QueryBundleRequest = {\n entityId: entityId ?? '',\n concreteType: 'org.sagebionetworks.repo.model.table.QueryBundleRequest',\n partMask:\n SynapseConstants.BUNDLE_MASK_QUERY_RESULTS |\n SynapseConstants.BUNDLE_MASK_QUERY_COUNT |\n SynapseConstants.BUNDLE_MASK_QUERY_SELECT_COLUMNS |\n SynapseConstants.BUNDLE_MASK_QUERY_MAX_ROWS_PER_PAGE |\n SynapseConstants.BUNDLE_MASK_QUERY_COLUMN_MODELS |\n SynapseConstants.BUNDLE_MASK_QUERY_FACETS |\n SynapseConstants.BUNDLE_MASK_SUM_FILES_SIZE_BYTES |\n SynapseConstants.BUNDLE_MASK_LAST_UPDATED_ON,\n query,\n }\n const isFullTextSearchEnabled =\n (entity && isTable(entity) && entity.isSearchEnabled) ?? false\n\n /**\n * Fully re-render the uncontrolled QueryWrapper component when the initial query changes. This eliminates a class of\n * bugs where our 'derived' state (the current query), which should be reset, is out of sync with props.\n *\n * See https://legacy.reactjs.org/blog/2018/06/07/you-probably-dont-need-derived-state.html#recommendation-fully-uncontrolled-component-with-a-key\n */\n const queryWrapperKey = `${JSON.stringify(initQueryRequest)}-${componentKey}`\n\n return (\n <QueryWrapper\n {...props}\n initQueryRequest={initQueryRequest}\n key={queryWrapperKey}\n isInfinite={isInfinite}\n >\n <QueryVisualizationWrapper\n unitDescription={unitDescription}\n rgbIndex={props.rgbIndex}\n columnAliases={props.columnAliases}\n helpConfiguration={helpConfiguration}\n visibleColumnCount={props.visibleColumnCount}\n defaultShowPlots={props.defaultShowPlots}\n hideCopyToClipboard={props.hideCopyToClipboard}\n defaultShowSearchBar={\n (props.defaultShowSearchBox || isFullTextSearchEnabled) &&\n !props.hideSearchBarControl\n }\n hideSearchBarControl={props.hideSearchBarControl}\n showLastUpdatedOn={showLastUpdatedOn}\n noContentPlaceholderType={NoContentPlaceholderType.INTERACTIVE}\n hasCustomPlots={Array.isArray(customPlots) && customPlots.length > 0}\n enabledExternalAnalysisPlatforms={enabledExternalAnalysisPlatforms}\n >\n <QueryWrapperPlotNavContents\n {...props}\n isFullTextSearchEnabled={isFullTextSearchEnabled}\n remount={remount}\n />\n </QueryVisualizationWrapper>\n </QueryWrapper>\n )\n}\n"],"names":["QUERY_FILTERS_EXPANDED_CSS","QUERY_FILTERS_COLLAPSED_CSS","HAS_SELECTED_ROWS_CSS","QueryWrapperPlotNavContents","props","tableConfiguration","name","cardConfiguration","facetsToPlot","availableFacets","initialExpandedFacetControls","hideDownload","hideQueryCount","hideSqlEditorControl","hideVisualizationsControl","searchConfiguration","cavaticaConnectAccountURL","customControls","remount","isFullTextSearchEnabled","customPlots","initialLimit","initialPlotType","queryContext","useQueryContext","showExportMetadata","setShowExportMetadata","useState","isFaceted","queryMetadataQueryOptions","isLoadingQueryMetadata","useQuery","isRowSelectionVisible","useAtomValue","isRowSelectionVisibleAtom","currentQueryRequest","hasFacetsOrFilters","addToDownloadListRequest","useGetAddToDownloadListRequestForCurrentQuery","jsx","QueryVisualizationContextConsumer","queryVisualizationContext","Box","QueryWrapperErrorBoundary","FullTextSearch","SearchV2","SqlEditor","AddToDownloadListConfirmationAlert","SynapseErrorBoundary","TopLevelControls","Fragment","FacetFilterControls","TotalQueryResults","CustomControls","PlotsContainer","RowSetView","ModalDownload","QueryWrapperPlotNav","deprecatedSql","isInfinite","limit","DEFAULT_PAGE_SIZE","showLastUpdatedOn","unitDescription","additionalFiltersSessionStorageKey","helpConfiguration","enabledExternalAnalysisPlatforms","sql","entityId","versionNumber","parseEntityIdAndVersionFromSqlStatement","query","useMemo","additionalFilters","getAdditionalFilters","componentKey","setComponentKey","entity","useGetEntity","initQueryRequest","SynapseConstants.BUNDLE_MASK_QUERY_RESULTS","SynapseConstants.BUNDLE_MASK_QUERY_COUNT","SynapseConstants.BUNDLE_MASK_QUERY_SELECT_COLUMNS","SynapseConstants.BUNDLE_MASK_QUERY_MAX_ROWS_PER_PAGE","SynapseConstants.BUNDLE_MASK_QUERY_COLUMN_MODELS","SynapseConstants.BUNDLE_MASK_QUERY_FACETS","SynapseConstants.BUNDLE_MASK_SUM_FILES_SIZE_BYTES","SynapseConstants.BUNDLE_MASK_LAST_UPDATED_ON","isTable","queryWrapperKey","createElement","QueryWrapper","QueryVisualizationWrapper","NoContentPlaceholderType"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"QueryWrapperPlotNav.js","sources":["../../../src/components/QueryWrapperPlotNav/QueryWrapperPlotNav.tsx"],"sourcesContent":["import { QueryOrDeprecatedSearchParams } from '@/components/CardContainerLogic/CardContainerLogic'\nimport AddToDownloadListConfirmationAlert from '@/components/download_list/AddToDownloadListConfirmationAlert/AddToDownloadListConfirmationAlert'\nimport { useGetAddToDownloadListRequestForCurrentQuery } from '@/components/QueryWrapper/useGetAddToDownloadListRequestForCurrentQuery'\nimport { NoContentPlaceholderType } from '@/components/SynapseTable/NoContentPlaceholderType'\nimport { useGetEntity } from '@/synapse-queries'\nimport { SynapseConstants } from '@/utils'\nimport {\n getAdditionalFilters,\n parseEntityIdAndVersionFromSqlStatement,\n} from '@/utils/functions'\nimport { isTable } from '@/utils/functions/EntityTypeUtils'\nimport { DEFAULT_PAGE_SIZE } from '@/utils/SynapseConstants'\nimport { Box } from '@mui/material'\nimport { Query, QueryBundleRequest } from '@sage-bionetworks/synapse-types'\nimport { useQuery } from '@tanstack/react-query'\nimport { useAtomValue } from 'jotai'\nimport { useMemo, useState } from 'react'\nimport { CardConfiguration } from '../CardContainer/CardConfiguration'\nimport { SynapseErrorBoundary } from '../error'\nimport FullTextSearch from '../FullTextSearch/FullTextSearch'\nimport ModalDownload from '../ModalDownload/ModalDownload'\nimport { QueryWrapperPlotNavCustomPlotParams } from '../Plot/SynapsePlot'\nimport { QueryContextType, useQueryContext } from '../QueryContext'\nimport {\n QueryVisualizationContextConsumer,\n QueryVisualizationWrapper,\n QueryVisualizationWrapperProps,\n} from '../QueryVisualizationWrapper'\nimport { QueryWrapper, QueryWrapperProps } from '../QueryWrapper'\nimport { isRowSelectionVisibleAtom } from '../QueryWrapper/TableRowSelectionState'\nimport { QueryWrapperErrorBoundary } from '../QueryWrapperErrorBoundary'\nimport { SynapseTableConfiguration } from '../SynapseTable'\nimport SearchV2, { SearchV2Props } from '../SynapseTable/SearchV2'\nimport SqlEditor from '../SynapseTable/SqlEditor'\nimport TopLevelControls, {\n TopLevelControlsProps,\n CustomControl,\n} from '../SynapseTable/TopLevelControls/TopLevelControls'\nimport { CustomControls } from '../SynapseTable/CustomControls/CustomControls'\nimport TotalQueryResults from '../TotalQueryResults'\nimport PlotsContainer, {\n PlotsContainerProps,\n} from '../widgets/facet-nav/PlotsContainer'\nimport FacetFilterControls, {\n FacetFilterControlsProps,\n} from '../widgets/query-filter/FacetFilterControls'\nimport { QueryWrapperSynapsePlotProps } from './QueryWrapperSynapsePlot'\nimport { RowSetView } from './RowSetView'\n\nexport const QUERY_FILTERS_EXPANDED_CSS: string = 'isShowingFacetFilters'\nexport const QUERY_FILTERS_COLLAPSED_CSS: string = 'isHidingFacetFilters'\n\nexport const HAS_SELECTED_ROWS_CSS: string = 'hasSelectedRows'\n\ntype QueryWrapperPlotNavOwnProps = {\n /** Whether the displayed results should be paginated or infinite. Default for cards is true, default for table is false */\n isInfinite?: boolean\n /** Set to true when you want the query to be saved in the URL search parameters. If you are controlling the view (such as in PortalSearch), you'll want to set this to false */\n shouldDeepLink?: boolean\n /** If onQueryChange is set, the callback will be invoked when the Query changes */\n onQueryChange?: (newQueryJson: string) => void\n /** If onQueryResultBundleChange is set, the callback will be invoked when the QueryResultBundle changes */\n onQueryResultBundleChange?: (newQueryResultBundleJson: string) => void\n /** If initQueryJson is set, it will be the Query used in the initial QueryBundleRequest */\n initQueryJson?: string\n tableConfiguration?: SynapseTableConfiguration\n cardConfiguration?: CardConfiguration\n searchConfiguration?: Omit<\n SearchV2Props,\n 'queryContext' | 'queryVisualizationContext'\n >\n facetsToPlot?: string[]\n availableFacets?: FacetFilterControlsProps['availableFacets']\n initialExpandedFacetControls?: FacetFilterControlsProps['initialExpandedFacetControls']\n customPlots?: QueryWrapperSynapsePlotProps[]\n customControls?: CustomControl[]\n defaultColumn?: string\n defaultShowSearchBox?: boolean\n lockedColumn?: QueryWrapperProps['lockedColumn']\n onViewSharingSettingsClicked?: (benefactorId: string) => void\n initialLimit?: number\n hideTopLevelControls?: boolean\n} & Omit<TopLevelControlsProps, 'entityId'> &\n Pick<QueryWrapperPlotNavCustomPlotParams, 'onCustomPlotClick'> &\n Pick<\n QueryWrapperProps,\n | 'isRowSelectionVisible'\n | 'rowSelectionPrimaryKey'\n | 'isRowSelectionUIFloating'\n | 'fileIdColumnName'\n | 'fileNameColumnName'\n | 'fileVersionColumnName'\n > &\n Pick<\n QueryVisualizationWrapperProps,\n | 'defaultShowPlots'\n | 'visibleColumnCount'\n | 'columnAliases'\n | 'rgbIndex'\n | 'showLastUpdatedOn'\n | 'noContentPlaceholderType'\n | 'unitDescription'\n | 'additionalFiltersSessionStorageKey'\n | 'helpConfiguration'\n | 'hideCopyToClipboard'\n | 'hideSearchBarControl'\n | 'hideVisualizationsControl'\n | 'enabledExternalAnalysisPlatforms'\n > &\n Pick<QueryContextType, 'combineRangeFacetConfig'>\n\nexport type QueryWrapperPlotNavProps = QueryOrDeprecatedSearchParams &\n PlotsContainerProps &\n QueryWrapperPlotNavOwnProps\n\ntype QueryWrapperPlotNavContentsProps = Pick<\n QueryWrapperPlotNavProps,\n | 'tableConfiguration'\n | 'name'\n | 'cardConfiguration'\n | 'facetsToPlot'\n | 'availableFacets'\n | 'initialExpandedFacetControls'\n | 'hideDownload'\n | 'hideQueryCount'\n | 'hideSqlEditorControl'\n | 'hideVisualizationsControl'\n | 'searchConfiguration'\n | 'enabledExternalAnalysisPlatforms'\n | 'cavaticaConnectAccountURL'\n | 'customControls'\n | 'customPlots'\n | 'fileIdColumnName'\n | 'fileNameColumnName'\n | 'fileVersionColumnName'\n | 'initialLimit'\n | 'initialPlotType'\n | 'hideTopLevelControls'\n> & {\n isFullTextSearchEnabled: boolean\n remount: () => void\n}\n\nfunction QueryWrapperPlotNavContents(props: QueryWrapperPlotNavContentsProps) {\n const {\n tableConfiguration,\n name,\n cardConfiguration,\n facetsToPlot,\n availableFacets,\n initialExpandedFacetControls,\n hideDownload,\n hideQueryCount,\n hideSqlEditorControl,\n hideVisualizationsControl,\n searchConfiguration,\n cavaticaConnectAccountURL,\n customControls,\n remount,\n isFullTextSearchEnabled,\n customPlots,\n initialLimit,\n initialPlotType,\n hideTopLevelControls,\n } = props\n const queryContext = useQueryContext()\n const [showExportMetadata, setShowExportMetadata] = useState(false)\n const { hasFacetedSelectColumn: isFaceted, queryMetadataQueryOptions } =\n queryContext\n const { isLoading: isLoadingQueryMetadata } = useQuery(\n queryMetadataQueryOptions,\n )\n\n const isRowSelectionVisible = useAtomValue(isRowSelectionVisibleAtom)\n\n const currentQueryRequest = queryContext.currentQueryRequest\n\n const hasFacetsOrFilters =\n (currentQueryRequest?.query.selectedFacets !== undefined &&\n currentQueryRequest.query.selectedFacets.length > 0) ||\n (currentQueryRequest?.query.additionalFilters !== undefined &&\n currentQueryRequest?.query.additionalFilters.length > 0)\n\n const addToDownloadListRequest =\n useGetAddToDownloadListRequestForCurrentQuery()\n\n return (\n <QueryVisualizationContextConsumer>\n {queryVisualizationContext => {\n if (queryVisualizationContext === undefined) {\n throw new Error(\n 'No queryVisualizationContext found when using QueryVisualizationContextConsumer',\n )\n }\n\n return (\n <Box\n className={`QueryWrapperPlotNav ${\n queryVisualizationContext.showFacetFilter\n ? QUERY_FILTERS_EXPANDED_CSS\n : QUERY_FILTERS_COLLAPSED_CSS\n } ${isRowSelectionVisible ? HAS_SELECTED_ROWS_CSS : ''} ${\n hideTopLevelControls ? 'isHidingTopLevelControls' : ''\n }`}\n sx={{\n '*': {\n cursor: isLoadingQueryMetadata ? 'wait' : undefined,\n },\n }}\n >\n <QueryWrapperErrorBoundary>\n {isFullTextSearchEnabled ? (\n <FullTextSearch ftsConfig={searchConfiguration?.ftsConfig} />\n ) : (\n <SearchV2\n {...searchConfiguration}\n queryContext={queryContext}\n queryVisualizationContext={queryVisualizationContext}\n />\n )}\n <SqlEditor />\n {queryVisualizationContext.showDownloadConfirmation && (\n <AddToDownloadListConfirmationAlert\n addToDownloadListRequest={addToDownloadListRequest}\n onClose={() =>\n queryVisualizationContext.setShowDownloadConfirmation(false)\n }\n />\n )}\n {!hideTopLevelControls && (\n <SynapseErrorBoundary>\n <TopLevelControls\n showColumnSelection={tableConfiguration !== undefined}\n name={name}\n hideDownload={hideDownload}\n hideQueryCount={hideQueryCount}\n hideFacetFilterControl={!isFaceted}\n hideVisualizationsControl={\n !isFaceted || hideVisualizationsControl\n }\n hideSqlEditorControl={hideSqlEditorControl}\n cavaticaConnectAccountURL={cavaticaConnectAccountURL}\n remount={remount}\n customControls={customControls}\n />\n </SynapseErrorBoundary>\n )}\n {isFaceted && (\n <>\n <FacetFilterControls\n availableFacets={availableFacets}\n initialExpandedFacetControls={initialExpandedFacetControls}\n />\n </>\n )}\n <TotalQueryResults\n frontText={''}\n endText={hasFacetsOrFilters ? 'filtered by' : ''}\n hideIfUnfiltered={true}\n />\n <CustomControls\n customControls={customControls}\n remount={remount}\n />\n <PlotsContainer\n facetsToPlot={facetsToPlot}\n customPlots={customPlots}\n initialPlotType={initialPlotType}\n />\n <RowSetView\n tableConfiguration={tableConfiguration}\n hideDownload={hideDownload}\n cardConfiguration={cardConfiguration}\n initialLimit={initialLimit}\n />\n {showExportMetadata && (\n <ModalDownload\n getLastQueryRequest={queryContext?.getCurrentQueryRequest}\n onClose={() => setShowExportMetadata(false)}\n />\n )}\n </QueryWrapperErrorBoundary>\n </Box>\n )\n }}\n </QueryVisualizationContextConsumer>\n )\n}\n\nexport default function QueryWrapperPlotNav(props: QueryWrapperPlotNavProps) {\n const {\n sql: deprecatedSql,\n tableConfiguration,\n isInfinite = !tableConfiguration,\n limit = DEFAULT_PAGE_SIZE,\n showLastUpdatedOn,\n unitDescription,\n additionalFiltersSessionStorageKey,\n helpConfiguration,\n customPlots,\n enabledExternalAnalysisPlatforms,\n } = props\n\n const sql = props.query?.sql ?? deprecatedSql ?? ''\n const { entityId, versionNumber } =\n parseEntityIdAndVersionFromSqlStatement(sql)\n\n const query: Query = useMemo(() => {\n if (props.query) {\n // use query if set\n return props.query\n } else if (props.initQueryJson) {\n // Otherwise use initQueryJson\n return JSON.parse(props.initQueryJson) as Query\n } else {\n // use the deprecated sql, searchParams, and sqlOperator\n const additionalFilters = getAdditionalFilters(\n props.searchParams,\n props.sqlOperator,\n additionalFiltersSessionStorageKey,\n )\n return {\n sql: deprecatedSql!,\n additionalFilters,\n limit: limit,\n offset: 0,\n }\n }\n }, [\n props.query,\n props.initQueryJson,\n props.searchParams,\n props.sqlOperator,\n additionalFiltersSessionStorageKey,\n deprecatedSql,\n limit,\n ])\n\n const [componentKey, setComponentKey] = useState(1)\n const remount = () => {\n setComponentKey(componentKey + 1)\n }\n\n const { data: entity } = useGetEntity(entityId, versionNumber)\n const initQueryRequest: QueryBundleRequest = {\n entityId: entityId ?? '',\n concreteType: 'org.sagebionetworks.repo.model.table.QueryBundleRequest',\n partMask:\n SynapseConstants.BUNDLE_MASK_QUERY_RESULTS |\n SynapseConstants.BUNDLE_MASK_QUERY_COUNT |\n SynapseConstants.BUNDLE_MASK_QUERY_SELECT_COLUMNS |\n SynapseConstants.BUNDLE_MASK_QUERY_MAX_ROWS_PER_PAGE |\n SynapseConstants.BUNDLE_MASK_QUERY_COLUMN_MODELS |\n SynapseConstants.BUNDLE_MASK_QUERY_FACETS |\n SynapseConstants.BUNDLE_MASK_SUM_FILES_SIZE_BYTES |\n SynapseConstants.BUNDLE_MASK_LAST_UPDATED_ON,\n query,\n }\n const isFullTextSearchEnabled =\n (entity && isTable(entity) && entity.isSearchEnabled) ?? false\n\n /**\n * Fully re-render the uncontrolled QueryWrapper component when the initial query changes. This eliminates a class of\n * bugs where our 'derived' state (the current query), which should be reset, is out of sync with props.\n *\n * See https://legacy.reactjs.org/blog/2018/06/07/you-probably-dont-need-derived-state.html#recommendation-fully-uncontrolled-component-with-a-key\n */\n const queryWrapperKey = `${JSON.stringify(initQueryRequest)}-${componentKey}`\n\n return (\n <QueryWrapper\n {...props}\n initQueryRequest={initQueryRequest}\n key={queryWrapperKey}\n isInfinite={isInfinite}\n >\n <QueryVisualizationWrapper\n unitDescription={unitDescription}\n rgbIndex={props.rgbIndex}\n columnAliases={props.columnAliases}\n helpConfiguration={helpConfiguration}\n visibleColumnCount={props.visibleColumnCount}\n defaultShowPlots={props.defaultShowPlots}\n hideCopyToClipboard={props.hideCopyToClipboard}\n defaultShowSearchBar={\n (props.defaultShowSearchBox || isFullTextSearchEnabled) &&\n !props.hideSearchBarControl\n }\n hideSearchBarControl={props.hideSearchBarControl}\n showLastUpdatedOn={showLastUpdatedOn}\n noContentPlaceholderType={NoContentPlaceholderType.INTERACTIVE}\n hasCustomPlots={Array.isArray(customPlots) && customPlots.length > 0}\n enabledExternalAnalysisPlatforms={enabledExternalAnalysisPlatforms}\n >\n <QueryWrapperPlotNavContents\n {...props}\n isFullTextSearchEnabled={isFullTextSearchEnabled}\n remount={remount}\n />\n </QueryVisualizationWrapper>\n </QueryWrapper>\n )\n}\n"],"names":["QUERY_FILTERS_EXPANDED_CSS","QUERY_FILTERS_COLLAPSED_CSS","HAS_SELECTED_ROWS_CSS","QueryWrapperPlotNavContents","props","tableConfiguration","name","cardConfiguration","facetsToPlot","availableFacets","initialExpandedFacetControls","hideDownload","hideQueryCount","hideSqlEditorControl","hideVisualizationsControl","searchConfiguration","cavaticaConnectAccountURL","customControls","remount","isFullTextSearchEnabled","customPlots","initialLimit","initialPlotType","hideTopLevelControls","queryContext","useQueryContext","showExportMetadata","setShowExportMetadata","useState","isFaceted","queryMetadataQueryOptions","isLoadingQueryMetadata","useQuery","isRowSelectionVisible","useAtomValue","isRowSelectionVisibleAtom","currentQueryRequest","hasFacetsOrFilters","addToDownloadListRequest","useGetAddToDownloadListRequestForCurrentQuery","jsx","QueryVisualizationContextConsumer","queryVisualizationContext","Box","QueryWrapperErrorBoundary","FullTextSearch","SearchV2","SqlEditor","AddToDownloadListConfirmationAlert","SynapseErrorBoundary","TopLevelControls","Fragment","FacetFilterControls","TotalQueryResults","CustomControls","PlotsContainer","RowSetView","ModalDownload","QueryWrapperPlotNav","deprecatedSql","isInfinite","limit","DEFAULT_PAGE_SIZE","showLastUpdatedOn","unitDescription","additionalFiltersSessionStorageKey","helpConfiguration","enabledExternalAnalysisPlatforms","sql","entityId","versionNumber","parseEntityIdAndVersionFromSqlStatement","query","useMemo","additionalFilters","getAdditionalFilters","componentKey","setComponentKey","entity","useGetEntity","initQueryRequest","SynapseConstants.BUNDLE_MASK_QUERY_RESULTS","SynapseConstants.BUNDLE_MASK_QUERY_COUNT","SynapseConstants.BUNDLE_MASK_QUERY_SELECT_COLUMNS","SynapseConstants.BUNDLE_MASK_QUERY_MAX_ROWS_PER_PAGE","SynapseConstants.BUNDLE_MASK_QUERY_COLUMN_MODELS","SynapseConstants.BUNDLE_MASK_QUERY_FACETS","SynapseConstants.BUNDLE_MASK_SUM_FILES_SIZE_BYTES","SynapseConstants.BUNDLE_MASK_LAST_UPDATED_ON","isTable","queryWrapperKey","createElement","QueryWrapper","QueryVisualizationWrapper","NoContentPlaceholderType"],"mappings":"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"}
|
|
@@ -18,11 +18,14 @@ import "@mui/material/SvgIcon";
|
|
|
18
18
|
import "../assets/icons/AccessPending.svg.js";
|
|
19
19
|
import "../assets/icons/AccessPendingCloud.svg.js";
|
|
20
20
|
import "../assets/icons/FileWithShield.svg.js";
|
|
21
|
+
import "../assets/icons/MultiFile.svg.js";
|
|
22
|
+
import "../assets/icons/UnpackagableFile.svg.js";
|
|
21
23
|
import "../assets/icons/bioChemicalPhysical.svg.js";
|
|
22
24
|
import "../assets/icons/computationalTool.svg.js";
|
|
23
25
|
import "../assets/icons/dataReuse.svg.js";
|
|
24
26
|
import "../assets/icons/inSilicoModel.svg.js";
|
|
25
27
|
import "../assets/icons/modelSystem.svg.js";
|
|
28
|
+
import "../assets/mui_components/PackagableFile.svg.js";
|
|
26
29
|
import "../assets/icons/spatialProfiling.svg.js";
|
|
27
30
|
import { SynapseToastContainer as Q } from "./ToastMessage/ToastMessage.js";
|
|
28
31
|
import "./Authentication/RecoveryCodeGrid.js";
|
|
@@ -64,7 +67,7 @@ function U(n) {
|
|
|
64
67
|
const e = M[n];
|
|
65
68
|
window.SRC_OVERRIDE_ENDPOINT_CONFIG = e;
|
|
66
69
|
}
|
|
67
|
-
function
|
|
70
|
+
function Vt(n) {
|
|
68
71
|
const { storybookContext: e } = n, r = e.globals.stack || e.parameters.stack;
|
|
69
72
|
p(() => {
|
|
70
73
|
U(r);
|
|
@@ -168,7 +171,7 @@ function Bt(n) {
|
|
|
168
171
|
return /* @__PURE__ */ i(N, { router: v });
|
|
169
172
|
}
|
|
170
173
|
export {
|
|
171
|
-
|
|
172
|
-
|
|
174
|
+
Vt as StorybookComponentWrapper,
|
|
175
|
+
Vt as default
|
|
173
176
|
};
|
|
174
177
|
//# sourceMappingURL=StorybookComponentWrapper.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"StorybookComponentWrapper.js","sources":["../../src/components/StorybookComponentWrapper.tsx"],"sourcesContent":["import { StandaloneLoginForm } from '@/components/Authentication/index'\nimport SynapseClient from '@/synapse-client'\nimport {\n defaultQueryClientConfig,\n SynapseContextProvider,\n SynapseContextType,\n} from '@/utils'\nimport { ApplicationSessionContextProvider } from '@/utils/AppUtils/session/ApplicationSessionContext'\nimport {\n SynapseSessionManager,\n type SessionState,\n} from '@/utils/AppUtils/session/SynapseSessionManager'\nimport { STACK_MAP, SynapseStack } from '@/utils/functions/getEndpoint'\nimport useDetectSSOCode from '@/utils/hooks/useDetectSSOCode'\nimport { QueryClient, QueryClientProvider } from '@tanstack/react-query'\nimport { ReactQueryDevtools } from '@tanstack/react-query-devtools'\nimport {\n ReactNode,\n Suspense,\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useSyncExternalStore,\n} from 'react'\nimport { createMemoryRouter } from 'react-router'\nimport { RouterProvider } from 'react-router/dom'\nimport { SynapseToastContainer } from './ToastMessage'\n\nconst storybookQueryClient = new QueryClient(defaultQueryClientConfig)\n\n// Module-level session manager instance, stable across story switches (like the QueryClient above)\nconst sessionManager = new SynapseSessionManager({\n onSessionInvalid: () => {\n // In Storybook, just refresh the session instead of reloading the page\n sessionManager.refreshSession()\n },\n})\n\nfunction overrideEndpoint(stack: SynapseStack) {\n const endpointConfig = STACK_MAP[stack]\n ;(window as any)['SRC_OVERRIDE_ENDPOINT_CONFIG'] = endpointConfig\n}\n\n/**\n * Wraps storybook story components to ensure that all components receive required context.\n * @param props\n * @returns\n */\nexport function StorybookComponentWrapper(props: {\n children: ReactNode\n /* This will match the `globalTypes` object in preview.tsx. */\n storybookContext: {\n args: {\n isAuthenticated?: boolean\n }\n globals: {\n stack?: SynapseStack\n showReactQueryDevtools?: boolean\n }\n parameters: {\n stack?: SynapseStack\n withRouter?: boolean\n requireLogin?: boolean\n }\n }\n}) {\n const { storybookContext } = props\n\n const currentStack: SynapseStack = (storybookContext.globals.stack ||\n storybookContext.parameters.stack) as SynapseStack\n\n useEffect(() => {\n overrideEndpoint(currentStack)\n }, [currentStack])\n\n // Subscribe to the framework-agnostic SynapseSessionManager for token/auth state\n // These methods are bound in the SynapseSessionManager constructor, so they are safe to pass directly.\n const sessionState: SessionState = useSyncExternalStore(\n // eslint-disable-next-line @typescript-eslint/unbound-method\n sessionManager.subscribe,\n // eslint-disable-next-line @typescript-eslint/unbound-method\n sessionManager.getSnapshot,\n )\n\n // Track whether we've started the manager so we only start once (module-level instance persists across renders)\n const managerStartedRef = useRef(false)\n\n useEffect(() => {\n if (!managerStartedRef.current) {\n sessionManager.start()\n managerStartedRef.current = true\n }\n return () => {\n sessionManager.dispose()\n managerStartedRef.current = false\n }\n }, [])\n\n // When the stack changes, restart the session manager to pick up the new endpoint\n useEffect(() => {\n if (managerStartedRef.current) {\n sessionManager.dispose()\n sessionManager.start()\n }\n }, [currentStack])\n\n const shouldPromptForLogin =\n storybookContext.parameters.requireLogin &&\n currentStack !== 'mock' &&\n sessionState.hasInitializedSession &&\n !sessionState.isAuthenticated\n\n const { isLoading: isLoadingSSO } = useDetectSSOCode({\n onSignInComplete: () => {\n void sessionManager.refreshSession()\n },\n onError: (err: unknown) => {\n console.error('SSO error in Storybook:', err)\n },\n isInitializingSession: !sessionState.hasInitializedSession,\n isAuthenticated: sessionState.isAuthenticated,\n })\n\n useEffect(() => {\n async function resetCache() {\n await storybookQueryClient.cancelQueries()\n await storybookQueryClient.resetQueries()\n }\n\n void resetCache()\n }, [sessionState.token, currentStack])\n\n const effectiveToken = useMemo(() => {\n if (currentStack === 'mock') {\n return storybookContext.args.isAuthenticated ? 'fake token' : undefined\n }\n return sessionState.token\n }, [sessionState.token, currentStack, storybookContext.args.isAuthenticated])\n\n const effectiveIsAuthenticated = useMemo(() => {\n if (currentStack === 'mock') {\n return !!storybookContext.args.isAuthenticated\n }\n return sessionState.isAuthenticated\n }, [\n sessionState.isAuthenticated,\n currentStack,\n storybookContext.args.isAuthenticated,\n ])\n\n const refreshSession = useCallback(async () => {\n await sessionManager.refreshSession()\n }, [])\n\n const clearSession = useCallback(async () => {\n await sessionManager.clearSession()\n }, [])\n\n const applicationSessionContext = useMemo(\n () => ({\n token: effectiveToken,\n realmId: sessionState.realmId,\n userId: sessionState.userId,\n isAuthenticated: effectiveIsAuthenticated,\n hasInitializedSession: sessionState.hasInitializedSession,\n refreshSession,\n clearSession,\n isLoadingSSO,\n twoFactorAuthSSOErrorResponse: undefined,\n termsOfServiceStatus: undefined,\n twoFactorStatus: undefined,\n }),\n [\n effectiveToken,\n effectiveIsAuthenticated,\n sessionState.realmId,\n sessionState.userId,\n sessionState.hasInitializedSession,\n refreshSession,\n clearSession,\n isLoadingSSO,\n ],\n )\n\n const synapseContext: Partial<SynapseContextType> = useMemo(\n () => ({\n accessToken: effectiveToken,\n isAuthenticated: effectiveIsAuthenticated,\n isInExperimentalMode: SynapseClient.isInSynapseExperimentalMode(),\n utcTime: SynapseClient.getUseUtcTimeFromCookie(),\n withErrorBoundary: true,\n downloadCartPageUrl: '/?path=/story/download-downloadcartpage--demo',\n }),\n [effectiveToken, effectiveIsAuthenticated],\n )\n\n const wrappedStory = (\n <Suspense fallback={'global suspense loading...'}>\n <QueryClientProvider client={storybookQueryClient}>\n <ApplicationSessionContextProvider context={applicationSessionContext}>\n <SynapseContextProvider\n key={currentStack}\n synapseContext={synapseContext}\n >\n {storybookContext.globals.showReactQueryDevtools && (\n <ReactQueryDevtools />\n )}\n <SynapseToastContainer />\n <main>\n {shouldPromptForLogin ? (\n <StandaloneLoginForm\n sessionCallback={() => {\n void sessionManager.refreshSession()\n }}\n />\n ) : (\n props.children\n )}\n </main>\n </SynapseContextProvider>\n </ApplicationSessionContextProvider>\n </QueryClientProvider>\n </Suspense>\n )\n\n if (!storybookContext.parameters.withRouter) {\n return wrappedStory\n }\n\n const router = createMemoryRouter([\n {\n path: '/',\n element: wrappedStory,\n },\n ])\n\n return <RouterProvider router={router} />\n}\n\nexport default StorybookComponentWrapper\n"],"names":["storybookQueryClient","QueryClient","defaultQueryClientConfig","sessionManager","SynapseSessionManager","overrideEndpoint","stack","endpointConfig","STACK_MAP","StorybookComponentWrapper","props","storybookContext","currentStack","useEffect","sessionState","useSyncExternalStore","managerStartedRef","useRef","shouldPromptForLogin","isLoadingSSO","useDetectSSOCode","err","resetCache","effectiveToken","useMemo","effectiveIsAuthenticated","refreshSession","useCallback","clearSession","applicationSessionContext","synapseContext","SynapseClient","wrappedStory","jsx","Suspense","QueryClientProvider","ApplicationSessionContextProvider","jsxs","SynapseContextProvider","ReactQueryDevtools","SynapseToastContainer","StandaloneLoginForm","router","createMemoryRouter","RouterProvider"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA6BA,MAAMA,IAAuB,IAAIC,EAAYC,CAAwB,GAG/DC,IAAiB,IAAIC,EAAsB;AAAA,EAC/C,kBAAkB,MAAM;AAEtB,IAAAD,EAAe,eAAA;AAAA,EACjB;AACF,CAAC;AAED,SAASE,EAAiBC,GAAqB;AAC7C,QAAMC,IAAiBC,EAAUF,CAAK;AACpC,SAAe,+BAAkCC;AACrD;AAOO,SAASE,GAA0BC,GAiBvC;AACD,QAAM,EAAE,kBAAAC,MAAqBD,GAEvBE,IAA8BD,EAAiB,QAAQ,SAC3DA,EAAiB,WAAW;AAE9B,EAAAE,EAAU,MAAM;AACd,IAAAR,EAAiBO,CAAY;AAAA,EAC/B,GAAG,CAACA,CAAY,CAAC;AAIjB,QAAME,IAA6BC;AAAA;AAAA,IAEjCZ,EAAe;AAAA;AAAA,IAEfA,EAAe;AAAA,EAAA,GAIXa,IAAoBC,EAAO,EAAK;AAEtC,EAAAJ,EAAU,OACHG,EAAkB,YACrBb,EAAe,MAAA,GACfa,EAAkB,UAAU,KAEvB,MAAM;AACX,IAAAb,EAAe,QAAA,GACfa,EAAkB,UAAU;AAAA,EAC9B,IACC,CAAA,CAAE,GAGLH,EAAU,MAAM;AACd,IAAIG,EAAkB,YACpBb,EAAe,QAAA,GACfA,EAAe,MAAA;AAAA,EAEnB,GAAG,CAACS,CAAY,CAAC;AAEjB,QAAMM,IACJP,EAAiB,WAAW,gBAC5BC,MAAiB,UACjBE,EAAa,yBACb,CAACA,EAAa,iBAEV,EAAE,WAAWK,EAAA,IAAiBC,EAAiB;AAAA,IACnD,kBAAkB,MAAM;AACtB,MAAKjB,EAAe,eAAA;AAAA,IACtB;AAAA,IACA,SAAS,CAACkB,MAAiB;AACzB,cAAQ,MAAM,2BAA2BA,CAAG;AAAA,IAC9C;AAAA,IACA,uBAAuB,CAACP,EAAa;AAAA,IACrC,iBAAiBA,EAAa;AAAA,EAAA,CAC/B;AAED,EAAAD,EAAU,MAAM;AACd,mBAAeS,IAAa;AAC1B,YAAMtB,EAAqB,cAAA,GAC3B,MAAMA,EAAqB,aAAA;AAAA,IAC7B;AAEA,IAAKsB,EAAA;AAAA,EACP,GAAG,CAACR,EAAa,OAAOF,CAAY,CAAC;AAErC,QAAMW,IAAiBC,EAAQ,MACzBZ,MAAiB,SACZD,EAAiB,KAAK,kBAAkB,eAAe,SAEzDG,EAAa,OACnB,CAACA,EAAa,OAAOF,GAAcD,EAAiB,KAAK,eAAe,CAAC,GAEtEc,IAA2BD,EAAQ,MACnCZ,MAAiB,SACZ,CAAC,CAACD,EAAiB,KAAK,kBAE1BG,EAAa,iBACnB;AAAA,IACDA,EAAa;AAAA,IACbF;AAAA,IACAD,EAAiB,KAAK;AAAA,EAAA,CACvB,GAEKe,IAAiBC,EAAY,YAAY;AAC7C,UAAMxB,EAAe,eAAA;AAAA,EACvB,GAAG,CAAA,CAAE,GAECyB,IAAeD,EAAY,YAAY;AAC3C,UAAMxB,EAAe,aAAA;AAAA,EACvB,GAAG,CAAA,CAAE,GAEC0B,IAA4BL;AAAA,IAChC,OAAO;AAAA,MACL,OAAOD;AAAA,MACP,SAAST,EAAa;AAAA,MACtB,QAAQA,EAAa;AAAA,MACrB,iBAAiBW;AAAA,MACjB,uBAAuBX,EAAa;AAAA,MACpC,gBAAAY;AAAA,MACA,cAAAE;AAAA,MACA,cAAAT;AAAA,MACA,+BAA+B;AAAA,MAC/B,sBAAsB;AAAA,MACtB,iBAAiB;AAAA,IAAA;AAAA,IAEnB;AAAA,MACEI;AAAA,MACAE;AAAA,MACAX,EAAa;AAAA,MACbA,EAAa;AAAA,MACbA,EAAa;AAAA,MACbY;AAAA,MACAE;AAAA,MACAT;AAAA,IAAA;AAAA,EACF,GAGIW,IAA8CN;AAAA,IAClD,OAAO;AAAA,MACL,aAAaD;AAAA,MACb,iBAAiBE;AAAA,MACjB,sBAAsBM,EAAc,4BAAA;AAAA,MACpC,SAASA,EAAc,wBAAA;AAAA,MACvB,mBAAmB;AAAA,MACnB,qBAAqB;AAAA,IAAA;AAAA,IAEvB,CAACR,GAAgBE,CAAwB;AAAA,EAAA,GAGrCO,IACJ,gBAAAC,EAACC,GAAA,EAAS,UAAU,8BAClB,UAAA,gBAAAD,EAACE,GAAA,EAAoB,QAAQnC,GAC3B,UAAA,gBAAAiC,EAACG,GAAA,EAAkC,SAASP,GAC1C,UAAA,gBAAAQ;AAAA,IAACC;AAAA,IAAA;AAAA,MAEC,gBAAAR;AAAA,MAEC,UAAA;AAAA,QAAAnB,EAAiB,QAAQ,0BACxB,gBAAAsB,EAACM,GAAA,CAAA,CAAmB;AAAA,0BAErBC,GAAA,EAAsB;AAAA,QACvB,gBAAAP,EAAC,UACE,UAAAf,IACC,gBAAAe;AAAA,UAACQ;AAAA,UAAA;AAAA,YACC,iBAAiB,MAAM;AACrB,cAAKtC,EAAe,eAAA;AAAA,YACtB;AAAA,UAAA;AAAA,QAAA,IAGFO,EAAM,SAAA,CAEV;AAAA,MAAA;AAAA,IAAA;AAAA,IAjBKE;AAAA,EAAA,EAkBP,CACF,GACF,GACF;AAGF,MAAI,CAACD,EAAiB,WAAW;AAC/B,WAAOqB;AAGT,QAAMU,IAASC,EAAmB;AAAA,IAChC;AAAA,MACE,MAAM;AAAA,MACN,SAASX;AAAA,IAAA;AAAA,EACX,CACD;AAED,SAAO,gBAAAC,EAACW,KAAe,QAAAF,GAAgB;AACzC;"}
|
|
1
|
+
{"version":3,"file":"StorybookComponentWrapper.js","sources":["../../src/components/StorybookComponentWrapper.tsx"],"sourcesContent":["import { StandaloneLoginForm } from '@/components/Authentication/index'\nimport SynapseClient from '@/synapse-client'\nimport {\n defaultQueryClientConfig,\n SynapseContextProvider,\n SynapseContextType,\n} from '@/utils'\nimport { ApplicationSessionContextProvider } from '@/utils/AppUtils/session/ApplicationSessionContext'\nimport {\n SynapseSessionManager,\n type SessionState,\n} from '@/utils/AppUtils/session/SynapseSessionManager'\nimport { STACK_MAP, SynapseStack } from '@/utils/functions/getEndpoint'\nimport useDetectSSOCode from '@/utils/hooks/useDetectSSOCode'\nimport { QueryClient, QueryClientProvider } from '@tanstack/react-query'\nimport { ReactQueryDevtools } from '@tanstack/react-query-devtools'\nimport {\n ReactNode,\n Suspense,\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useSyncExternalStore,\n} from 'react'\nimport { createMemoryRouter } from 'react-router'\nimport { RouterProvider } from 'react-router/dom'\nimport { SynapseToastContainer } from './ToastMessage'\n\nconst storybookQueryClient = new QueryClient(defaultQueryClientConfig)\n\n// Module-level session manager instance, stable across story switches (like the QueryClient above)\nconst sessionManager = new SynapseSessionManager({\n onSessionInvalid: () => {\n // In Storybook, just refresh the session instead of reloading the page\n sessionManager.refreshSession()\n },\n})\n\nfunction overrideEndpoint(stack: SynapseStack) {\n const endpointConfig = STACK_MAP[stack]\n ;(window as any)['SRC_OVERRIDE_ENDPOINT_CONFIG'] = endpointConfig\n}\n\n/**\n * Wraps storybook story components to ensure that all components receive required context.\n * @param props\n * @returns\n */\nexport function StorybookComponentWrapper(props: {\n children: ReactNode\n /* This will match the `globalTypes` object in preview.tsx. */\n storybookContext: {\n args: {\n isAuthenticated?: boolean\n }\n globals: {\n stack?: SynapseStack\n showReactQueryDevtools?: boolean\n }\n parameters: {\n stack?: SynapseStack\n withRouter?: boolean\n requireLogin?: boolean\n }\n }\n}) {\n const { storybookContext } = props\n\n const currentStack: SynapseStack = (storybookContext.globals.stack ||\n storybookContext.parameters.stack) as SynapseStack\n\n useEffect(() => {\n overrideEndpoint(currentStack)\n }, [currentStack])\n\n // Subscribe to the framework-agnostic SynapseSessionManager for token/auth state\n // These methods are bound in the SynapseSessionManager constructor, so they are safe to pass directly.\n const sessionState: SessionState = useSyncExternalStore(\n // eslint-disable-next-line @typescript-eslint/unbound-method\n sessionManager.subscribe,\n // eslint-disable-next-line @typescript-eslint/unbound-method\n sessionManager.getSnapshot,\n )\n\n // Track whether we've started the manager so we only start once (module-level instance persists across renders)\n const managerStartedRef = useRef(false)\n\n useEffect(() => {\n if (!managerStartedRef.current) {\n sessionManager.start()\n managerStartedRef.current = true\n }\n return () => {\n sessionManager.dispose()\n managerStartedRef.current = false\n }\n }, [])\n\n // When the stack changes, restart the session manager to pick up the new endpoint\n useEffect(() => {\n if (managerStartedRef.current) {\n sessionManager.dispose()\n sessionManager.start()\n }\n }, [currentStack])\n\n const shouldPromptForLogin =\n storybookContext.parameters.requireLogin &&\n currentStack !== 'mock' &&\n sessionState.hasInitializedSession &&\n !sessionState.isAuthenticated\n\n const { isLoading: isLoadingSSO } = useDetectSSOCode({\n onSignInComplete: () => {\n void sessionManager.refreshSession()\n },\n onError: (err: unknown) => {\n console.error('SSO error in Storybook:', err)\n },\n isInitializingSession: !sessionState.hasInitializedSession,\n isAuthenticated: sessionState.isAuthenticated,\n })\n\n useEffect(() => {\n async function resetCache() {\n await storybookQueryClient.cancelQueries()\n await storybookQueryClient.resetQueries()\n }\n\n void resetCache()\n }, [sessionState.token, currentStack])\n\n const effectiveToken = useMemo(() => {\n if (currentStack === 'mock') {\n return storybookContext.args.isAuthenticated ? 'fake token' : undefined\n }\n return sessionState.token\n }, [sessionState.token, currentStack, storybookContext.args.isAuthenticated])\n\n const effectiveIsAuthenticated = useMemo(() => {\n if (currentStack === 'mock') {\n return !!storybookContext.args.isAuthenticated\n }\n return sessionState.isAuthenticated\n }, [\n sessionState.isAuthenticated,\n currentStack,\n storybookContext.args.isAuthenticated,\n ])\n\n const refreshSession = useCallback(async () => {\n await sessionManager.refreshSession()\n }, [])\n\n const clearSession = useCallback(async () => {\n await sessionManager.clearSession()\n }, [])\n\n const applicationSessionContext = useMemo(\n () => ({\n token: effectiveToken,\n realmId: sessionState.realmId,\n userId: sessionState.userId,\n isAuthenticated: effectiveIsAuthenticated,\n hasInitializedSession: sessionState.hasInitializedSession,\n refreshSession,\n clearSession,\n isLoadingSSO,\n twoFactorAuthSSOErrorResponse: undefined,\n termsOfServiceStatus: undefined,\n twoFactorStatus: undefined,\n }),\n [\n effectiveToken,\n effectiveIsAuthenticated,\n sessionState.realmId,\n sessionState.userId,\n sessionState.hasInitializedSession,\n refreshSession,\n clearSession,\n isLoadingSSO,\n ],\n )\n\n const synapseContext: Partial<SynapseContextType> = useMemo(\n () => ({\n accessToken: effectiveToken,\n isAuthenticated: effectiveIsAuthenticated,\n isInExperimentalMode: SynapseClient.isInSynapseExperimentalMode(),\n utcTime: SynapseClient.getUseUtcTimeFromCookie(),\n withErrorBoundary: true,\n downloadCartPageUrl: '/?path=/story/download-downloadcartpage--demo',\n }),\n [effectiveToken, effectiveIsAuthenticated],\n )\n\n const wrappedStory = (\n <Suspense fallback={'global suspense loading...'}>\n <QueryClientProvider client={storybookQueryClient}>\n <ApplicationSessionContextProvider context={applicationSessionContext}>\n <SynapseContextProvider\n key={currentStack}\n synapseContext={synapseContext}\n >\n {storybookContext.globals.showReactQueryDevtools && (\n <ReactQueryDevtools />\n )}\n <SynapseToastContainer />\n <main>\n {shouldPromptForLogin ? (\n <StandaloneLoginForm\n sessionCallback={() => {\n void sessionManager.refreshSession()\n }}\n />\n ) : (\n props.children\n )}\n </main>\n </SynapseContextProvider>\n </ApplicationSessionContextProvider>\n </QueryClientProvider>\n </Suspense>\n )\n\n if (!storybookContext.parameters.withRouter) {\n return wrappedStory\n }\n\n const router = createMemoryRouter([\n {\n path: '/',\n element: wrappedStory,\n },\n ])\n\n return <RouterProvider router={router} />\n}\n\nexport default StorybookComponentWrapper\n"],"names":["storybookQueryClient","QueryClient","defaultQueryClientConfig","sessionManager","SynapseSessionManager","overrideEndpoint","stack","endpointConfig","STACK_MAP","StorybookComponentWrapper","props","storybookContext","currentStack","useEffect","sessionState","useSyncExternalStore","managerStartedRef","useRef","shouldPromptForLogin","isLoadingSSO","useDetectSSOCode","err","resetCache","effectiveToken","useMemo","effectiveIsAuthenticated","refreshSession","useCallback","clearSession","applicationSessionContext","synapseContext","SynapseClient","wrappedStory","jsx","Suspense","QueryClientProvider","ApplicationSessionContextProvider","jsxs","SynapseContextProvider","ReactQueryDevtools","SynapseToastContainer","StandaloneLoginForm","router","createMemoryRouter","RouterProvider"],"mappings":"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"}
|
|
@@ -13,6 +13,12 @@ export type SynapseChatProps = {
|
|
|
13
13
|
externalChatState?: ChatState;
|
|
14
14
|
defaultAgentAccessLevel?: AgentAccessLevel;
|
|
15
15
|
showAccessLevelMenu?: boolean;
|
|
16
|
+
/**
|
|
17
|
+
* Optional callback invoked once when a chat response is received from the server.
|
|
18
|
+
* Use this for side effects such as navigation based on the response content.
|
|
19
|
+
* Called in the mutation onSuccess handler so it runs exactly once per response.
|
|
20
|
+
*/
|
|
21
|
+
onChatResponse?: (responseText: string) => void;
|
|
16
22
|
};
|
|
17
23
|
export type ChatInteraction = {
|
|
18
24
|
userMessage: string;
|
|
@@ -23,6 +29,6 @@ export type ChatInteraction = {
|
|
|
23
29
|
export type TraceEventWithFriendlyMessage = {
|
|
24
30
|
friendlyMessage?: string;
|
|
25
31
|
} & TraceEvent;
|
|
26
|
-
export declare function SynapseChat({ initialMessage, agentRegistrationId, chatbotName, hideTitle, textboxPositionOffset, sessionContext, externalSession, setExternalSession, externalChatState, showAccessLevelMenu, }: SynapseChatProps): import("react/jsx-runtime").JSX.Element;
|
|
32
|
+
export declare function SynapseChat({ initialMessage, agentRegistrationId, chatbotName, hideTitle, textboxPositionOffset, sessionContext, externalSession, setExternalSession, externalChatState, showAccessLevelMenu, onChatResponse, }: SynapseChatProps): import("react/jsx-runtime").JSX.Element;
|
|
27
33
|
export default SynapseChat;
|
|
28
34
|
//# sourceMappingURL=SynapseChat.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SynapseChat.d.ts","sourceRoot":"","sources":["../../../src/components/SynapseChat/SynapseChat.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAgB,MAAM,uCAAuC,CAAA;AAiB/E,OAAO,EAAE,uBAAuB,EAAE,MAAM,kCAAkC,CAAA;AAC1E,OAAO,EACL,gBAAgB,EAChB,YAAY,EACZ,UAAU,EACX,MAAM,iCAAiC,CAAA;AAQxC,MAAM,MAAM,gBAAgB,GAAG;IAC7B,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,mBAAmB,CAAC,EAAE,MAAM,CAAA;IAC5B,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,SAAS,CAAC,EAAE,OAAO,CAAA;IACnB,qBAAqB,CAAC,EAAE,MAAM,CAAA;IAE9B,cAAc,CAAC,EAAE,uBAAuB,CAAA;IAExC,eAAe,CAAC,EAAE,YAAY,CAAA;IAE9B,kBAAkB,CAAC,EAAE,CAAC,CAAC,EAAE,YAAY,GAAG,SAAS,KAAK,IAAI,CAAA;IAE1D,iBAAiB,CAAC,EAAE,SAAS,CAAA;IAE7B,uBAAuB,CAAC,EAAE,gBAAgB,CAAA;IAE1C,mBAAmB,CAAC,EAAE,OAAO,CAAA;
|
|
1
|
+
{"version":3,"file":"SynapseChat.d.ts","sourceRoot":"","sources":["../../../src/components/SynapseChat/SynapseChat.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAgB,MAAM,uCAAuC,CAAA;AAiB/E,OAAO,EAAE,uBAAuB,EAAE,MAAM,kCAAkC,CAAA;AAC1E,OAAO,EACL,gBAAgB,EAChB,YAAY,EACZ,UAAU,EACX,MAAM,iCAAiC,CAAA;AAQxC,MAAM,MAAM,gBAAgB,GAAG;IAC7B,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,mBAAmB,CAAC,EAAE,MAAM,CAAA;IAC5B,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,SAAS,CAAC,EAAE,OAAO,CAAA;IACnB,qBAAqB,CAAC,EAAE,MAAM,CAAA;IAE9B,cAAc,CAAC,EAAE,uBAAuB,CAAA;IAExC,eAAe,CAAC,EAAE,YAAY,CAAA;IAE9B,kBAAkB,CAAC,EAAE,CAAC,CAAC,EAAE,YAAY,GAAG,SAAS,KAAK,IAAI,CAAA;IAE1D,iBAAiB,CAAC,EAAE,SAAS,CAAA;IAE7B,uBAAuB,CAAC,EAAE,gBAAgB,CAAA;IAE1C,mBAAmB,CAAC,EAAE,OAAO,CAAA;IAC7B;;;;OAIG;IACH,cAAc,CAAC,EAAE,CAAC,YAAY,EAAE,MAAM,KAAK,IAAI,CAAA;CAChD,CAAA;AAED,MAAM,MAAM,eAAe,GAAG;IAC5B,WAAW,EAAE,MAAM,CAAA;IACnB,gBAAgB,CAAC,EAAE,MAAM,CAAA;IACzB,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB,iBAAiB,CAAC,EAAE,6BAA6B,EAAE,CAAA;CACpD,CAAA;AAED,MAAM,MAAM,6BAA6B,GAAG;IAC1C,eAAe,CAAC,EAAE,MAAM,CAAA;CACzB,GAAG,UAAU,CAAA;AAEd,wBAAgB,WAAW,CAAC,EAC1B,cAAc,EACd,mBAAmB,EACnB,WAA2B,EAC3B,SAAiB,EACjB,qBAA6B,EAC7B,cAAc,EACd,eAAe,EACf,kBAAkB,EAClB,iBAAiB,EACjB,mBAA0B,EAC1B,cAAc,GACf,EAAE,gBAAgB,2CA0PlB;AAED,eAAe,WAAW,CAAA"}
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
import { jsx as t, jsxs as
|
|
2
|
-
import { useChatState as
|
|
3
|
-
import { useCreateAgentSession as
|
|
1
|
+
import { jsx as t, jsxs as i } from "react/jsx-runtime";
|
|
2
|
+
import { useChatState as $ } from "./useChatState.js";
|
|
3
|
+
import { useCreateAgentSession as z, useUpdateAgentSession as F } from "../../synapse-queries/chat/useChat.js";
|
|
4
4
|
import "../../utils/PermissionLevelToAccessType.js";
|
|
5
5
|
import "../../utils/SynapseConstants.js";
|
|
6
|
-
import { useState as
|
|
6
|
+
import { useState as a, useEffect as b } from "react";
|
|
7
7
|
import "../../synapse-client/SynapseClient.js";
|
|
8
8
|
import "@sage-bionetworks/synapse-client/generated/models/ErrorResponseCode";
|
|
9
9
|
import "@sage-bionetworks/synapse-client/generated/models/TwoFactorAuthErrorResponse";
|
|
@@ -12,14 +12,14 @@ import { AgentAccessLevel as T } from "@sage-bionetworks/synapse-types";
|
|
|
12
12
|
import "../../utils/functions/EntityTypeUtils.js";
|
|
13
13
|
import "lodash-es";
|
|
14
14
|
import "@sage-bionetworks/synapse-client/util/synapseClientFetch";
|
|
15
|
-
import { useSynapseContext as
|
|
15
|
+
import { useSynapseContext as G } from "../../utils/context/SynapseContext.js";
|
|
16
16
|
import "use-deep-compare-effect";
|
|
17
17
|
import "@tanstack/react-query";
|
|
18
18
|
import "@tanstack/query-core";
|
|
19
19
|
import "lodash-es/isEmpty";
|
|
20
20
|
import "lodash-es/isEqual";
|
|
21
21
|
import "lodash-es/xorWith";
|
|
22
|
-
import { useTheme as
|
|
22
|
+
import { useTheme as O, Alert as q, Box as p, Typography as k, List as H, TextField as Q, IconButton as X } from "@mui/material";
|
|
23
23
|
import "@sage-bionetworks/synapse-client";
|
|
24
24
|
import "../../utils/types/IsType.js";
|
|
25
25
|
import "../../utils/hooks/useCookiePreferences.js";
|
|
@@ -30,59 +30,60 @@ import "../../utils/context/FullContextProvider.js";
|
|
|
30
30
|
import "../../utils/context/DocumentMetadataContext.js";
|
|
31
31
|
import '../../style/components/_spinner.css';/* empty css */
|
|
32
32
|
import "react-router";
|
|
33
|
-
import { ArrowUpward as
|
|
33
|
+
import { ArrowUpward as Z } from "@mui/icons-material";
|
|
34
34
|
import "@mui/material/Skeleton";
|
|
35
|
-
import { SkeletonParagraph as
|
|
36
|
-
import { displayToast as
|
|
37
|
-
import { AccessLevelMenu as
|
|
38
|
-
import { SynapseChatInteraction as
|
|
39
|
-
import
|
|
40
|
-
function
|
|
41
|
-
initialMessage:
|
|
35
|
+
import { SkeletonParagraph as N } from "../Skeleton/SkeletonParagraph.js";
|
|
36
|
+
import { displayToast as ee } from "../ToastMessage/ToastMessage.js";
|
|
37
|
+
import { AccessLevelMenu as te } from "./AccessLevelMenu.js";
|
|
38
|
+
import { SynapseChatInteraction as oe } from "./SynapseChatInteraction.js";
|
|
39
|
+
import re from "./SynapseChatMessage.js";
|
|
40
|
+
function $e({
|
|
41
|
+
initialMessage: m,
|
|
42
42
|
agentRegistrationId: f,
|
|
43
|
-
chatbotName:
|
|
43
|
+
chatbotName: l = "SynapseChat",
|
|
44
44
|
hideTitle: v = !1,
|
|
45
45
|
textboxPositionOffset: w = "0px",
|
|
46
|
-
sessionContext:
|
|
46
|
+
sessionContext: c,
|
|
47
47
|
externalSession: I,
|
|
48
48
|
setExternalSession: L,
|
|
49
49
|
externalChatState: E,
|
|
50
|
-
showAccessLevelMenu: D = !0
|
|
50
|
+
showAccessLevelMenu: D = !0,
|
|
51
|
+
onChatResponse: M
|
|
51
52
|
}) {
|
|
52
|
-
const { accessToken:
|
|
53
|
+
const { accessToken: B } = G(), [P, R] = a(), o = I ?? P, g = L ?? R, { mutate: d, error: S } = z({
|
|
53
54
|
onSuccess: (e) => g(e)
|
|
54
|
-
}), { mutate:
|
|
55
|
+
}), { mutate: U } = F({
|
|
55
56
|
onSuccess: (e) => g(e),
|
|
56
|
-
onError: (e) =>
|
|
57
|
+
onError: (e) => ee(
|
|
57
58
|
`Unable to update the agent session: ${e.message}`,
|
|
58
59
|
"danger"
|
|
59
60
|
)
|
|
60
|
-
}),
|
|
61
|
-
|
|
62
|
-
),
|
|
61
|
+
}), V = O(), [u, W] = a(
|
|
62
|
+
c ? T.WRITE_YOUR_PRIVATE_DATA : T.PUBLICLY_ACCESSIBLE
|
|
63
|
+
), Y = $(o, M), _ = E ?? Y, { pendingMessage: x, chatJobIds: K, sendChat: r } = _, [s, y] = a(""), [C, j] = a(!1);
|
|
63
64
|
b(() => {
|
|
64
|
-
|
|
65
|
-
agentAccessLevel:
|
|
65
|
+
d && !o && d({
|
|
66
|
+
agentAccessLevel: u,
|
|
66
67
|
agentRegistrationId: f,
|
|
67
|
-
sessionContext:
|
|
68
|
+
sessionContext: c
|
|
68
69
|
});
|
|
69
70
|
}, [
|
|
70
|
-
c,
|
|
71
|
-
o,
|
|
72
|
-
M,
|
|
73
|
-
l,
|
|
74
71
|
d,
|
|
72
|
+
o,
|
|
73
|
+
B,
|
|
74
|
+
c,
|
|
75
|
+
u,
|
|
75
76
|
f
|
|
76
77
|
]), b(() => {
|
|
77
|
-
o &&
|
|
78
|
-
}, [o,
|
|
78
|
+
o && m && !C && (r(m), j(!0));
|
|
79
|
+
}, [o, m, C, r]);
|
|
79
80
|
const h = () => {
|
|
80
|
-
|
|
81
|
-
},
|
|
82
|
-
!
|
|
83
|
-
},
|
|
84
|
-
return S ? /* @__PURE__ */ t(
|
|
85
|
-
|
|
81
|
+
s.trim() && (r(s.trim()), y(""));
|
|
82
|
+
}, n = !o || !s || !!x, J = (e) => {
|
|
83
|
+
!n && e.key === "Enter" && !e.shiftKey && (e.preventDefault(), h());
|
|
84
|
+
}, A = V.palette.secondary[300];
|
|
85
|
+
return S ? /* @__PURE__ */ t(q, { severity: "error", sx: { my: 2 }, children: S.reason }) : /* @__PURE__ */ i(
|
|
86
|
+
p,
|
|
86
87
|
{
|
|
87
88
|
sx: {
|
|
88
89
|
display: "flex",
|
|
@@ -106,24 +107,24 @@ function Je({
|
|
|
106
107
|
backgroundColor: "white",
|
|
107
108
|
zIndex: 1
|
|
108
109
|
},
|
|
109
|
-
children:
|
|
110
|
+
children: l
|
|
110
111
|
}
|
|
111
112
|
),
|
|
112
113
|
D && /* @__PURE__ */ t(
|
|
113
|
-
|
|
114
|
+
te,
|
|
114
115
|
{
|
|
115
|
-
initAccessLevel:
|
|
116
|
+
initAccessLevel: u,
|
|
116
117
|
onChange: (e) => {
|
|
117
|
-
|
|
118
|
+
W(e), U({
|
|
118
119
|
agentAccessLevel: e,
|
|
119
120
|
sessionId: o.sessionId
|
|
120
121
|
});
|
|
121
122
|
}
|
|
122
123
|
}
|
|
123
124
|
),
|
|
124
|
-
!o && /* @__PURE__ */ t(
|
|
125
|
-
o && /* @__PURE__ */ t(
|
|
126
|
-
|
|
125
|
+
!o && /* @__PURE__ */ t(N, { numRows: 10 }),
|
|
126
|
+
o && /* @__PURE__ */ t(p, { sx: { flexGrow: 1, overflowY: "auto", mb: 2 }, children: /* @__PURE__ */ i(
|
|
127
|
+
H,
|
|
127
128
|
{
|
|
128
129
|
sx: {
|
|
129
130
|
flex: 1,
|
|
@@ -133,29 +134,37 @@ function Je({
|
|
|
133
134
|
flexDirection: "column"
|
|
134
135
|
},
|
|
135
136
|
children: [
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
137
|
+
K.map((e) => /* @__PURE__ */ t(
|
|
138
|
+
re,
|
|
139
|
+
{
|
|
140
|
+
chatJobId: e,
|
|
141
|
+
onSendChat: r
|
|
142
|
+
},
|
|
143
|
+
e
|
|
144
|
+
)),
|
|
145
|
+
x && /* @__PURE__ */ t(
|
|
146
|
+
oe,
|
|
139
147
|
{
|
|
140
|
-
userMessage:
|
|
148
|
+
userMessage: x,
|
|
141
149
|
chatResponseText: "",
|
|
142
150
|
chatErrorReason: "",
|
|
143
|
-
scrollIntoView: !0
|
|
151
|
+
scrollIntoView: !0,
|
|
152
|
+
onSendChat: r
|
|
144
153
|
}
|
|
145
154
|
)
|
|
146
155
|
]
|
|
147
156
|
}
|
|
148
157
|
) }),
|
|
149
158
|
/* @__PURE__ */ t(
|
|
150
|
-
|
|
159
|
+
p,
|
|
151
160
|
{
|
|
152
161
|
sx: {
|
|
153
162
|
position: "sticky",
|
|
154
163
|
bottom: w,
|
|
155
164
|
backgroundColor: "white"
|
|
156
165
|
},
|
|
157
|
-
children: /* @__PURE__ */
|
|
158
|
-
|
|
166
|
+
children: /* @__PURE__ */ i(
|
|
167
|
+
p,
|
|
159
168
|
{
|
|
160
169
|
component: "form",
|
|
161
170
|
sx: {
|
|
@@ -169,43 +178,43 @@ function Je({
|
|
|
169
178
|
onSubmit: h,
|
|
170
179
|
children: [
|
|
171
180
|
/* @__PURE__ */ t(
|
|
172
|
-
|
|
181
|
+
Q,
|
|
173
182
|
{
|
|
174
183
|
fullWidth: !0,
|
|
175
|
-
value:
|
|
184
|
+
value: s,
|
|
176
185
|
onChange: (e) => y(e.target.value),
|
|
177
|
-
onKeyDown:
|
|
178
|
-
placeholder: `Message ${
|
|
186
|
+
onKeyDown: J,
|
|
187
|
+
placeholder: `Message ${l}`,
|
|
179
188
|
slotProps: {
|
|
180
189
|
input: {
|
|
181
190
|
sx: { borderRadius: 96.6 },
|
|
182
191
|
endAdornment: /* @__PURE__ */ t(
|
|
183
|
-
|
|
192
|
+
X,
|
|
184
193
|
{
|
|
185
|
-
disabled:
|
|
194
|
+
disabled: n,
|
|
186
195
|
onClick: h,
|
|
187
196
|
sx: {
|
|
188
197
|
ml: "7px",
|
|
189
198
|
mr: "-8px",
|
|
190
|
-
color:
|
|
199
|
+
color: A,
|
|
191
200
|
borderStyle: "solid",
|
|
192
|
-
borderWidth:
|
|
193
|
-
borderColor:
|
|
201
|
+
borderWidth: n ? "1px" : "2px",
|
|
202
|
+
borderColor: n ? "gray" : A
|
|
194
203
|
},
|
|
195
|
-
children: /* @__PURE__ */ t(
|
|
204
|
+
children: /* @__PURE__ */ t(Z, {})
|
|
196
205
|
}
|
|
197
206
|
)
|
|
198
207
|
}
|
|
199
208
|
}
|
|
200
209
|
}
|
|
201
210
|
),
|
|
202
|
-
/* @__PURE__ */
|
|
211
|
+
/* @__PURE__ */ i(
|
|
203
212
|
k,
|
|
204
213
|
{
|
|
205
214
|
variant: "smallText1",
|
|
206
215
|
sx: { pt: "8px", textAlign: "center" },
|
|
207
216
|
children: [
|
|
208
|
-
|
|
217
|
+
l,
|
|
209
218
|
" can make mistakes."
|
|
210
219
|
]
|
|
211
220
|
}
|
|
@@ -220,7 +229,7 @@ function Je({
|
|
|
220
229
|
);
|
|
221
230
|
}
|
|
222
231
|
export {
|
|
223
|
-
|
|
224
|
-
|
|
232
|
+
$e as SynapseChat,
|
|
233
|
+
$e as default
|
|
225
234
|
};
|
|
226
235
|
//# sourceMappingURL=SynapseChat.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SynapseChat.js","sources":["../../../src/components/SynapseChat/SynapseChat.tsx"],"sourcesContent":["import { ChatState, useChatState } from '@/components/SynapseChat/useChatState'\nimport {\n useCreateAgentSession,\n useUpdateAgentSession,\n} from '@/synapse-queries/chat/useChat'\nimport { useSynapseContext } from '@/utils'\nimport { ArrowUpward } from '@mui/icons-material'\nimport {\n Alert,\n Box,\n IconButton,\n List,\n TextField,\n Typography,\n useTheme,\n} from '@mui/material'\nimport { Color } from '@mui/material/styles'\nimport { GridAgentSessionContext } from '@sage-bionetworks/synapse-client'\nimport {\n AgentAccessLevel,\n AgentSession,\n TraceEvent,\n} from '@sage-bionetworks/synapse-types'\nimport { KeyboardEventHandler, useEffect, useState } from 'react'\nimport { SkeletonParagraph } from '../Skeleton'\nimport { displayToast } from '../ToastMessage'\nimport AccessLevelMenu from './AccessLevelMenu'\nimport SynapseChatInteraction from './SynapseChatInteraction'\nimport SynapseChatMessage from './SynapseChatMessage'\n\nexport type SynapseChatProps = {\n initialMessage?: string //optional initial message\n agentRegistrationId?: string // if provided, use this agent\n chatbotName?: string // optional name of this chatbot agent\n hideTitle?: boolean\n textboxPositionOffset?: string // when embedded in a form, the textbox (form) stuck to the bottom may need to be offset due to container padding (dialog content for example!)\n /* optional session context for the agent session */\n sessionContext?: GridAgentSessionContext\n /* The current session, if state is lifted out of this component */\n externalSession?: AgentSession\n /* A callback invoked to bootstrap the current session, if state is to be lifted out of this component */\n setExternalSession?: (s: AgentSession | undefined) => void\n /* The current chat history, if state is lifted out of this component */\n externalChatState?: ChatState\n // default access level for the agent session.\n defaultAgentAccessLevel?: AgentAccessLevel\n // Whether to show the access level menu for the agent session.\n showAccessLevelMenu?: boolean\n}\n\nexport type ChatInteraction = {\n userMessage: string\n chatResponseText?: string\n chatErrorReason?: string\n chatResponseTrace?: TraceEventWithFriendlyMessage[]\n}\n\nexport type TraceEventWithFriendlyMessage = {\n friendlyMessage?: string\n} & TraceEvent\n\nexport function SynapseChat({\n initialMessage,\n agentRegistrationId,\n chatbotName = 'SynapseChat',\n hideTitle = false,\n textboxPositionOffset = '0px',\n sessionContext,\n externalSession,\n setExternalSession,\n externalChatState,\n showAccessLevelMenu = true,\n}: SynapseChatProps) {\n const { accessToken } = useSynapseContext()\n const [localAgentSession, setLocalAgentSession] = useState<AgentSession>()\n const agentSession = externalSession ?? localAgentSession\n const setAgentSession = setExternalSession ?? setLocalAgentSession\n\n const { mutate: createAgentSession, error: createAgentSessionError } =\n useCreateAgentSession({\n onSuccess: newAgentSession => setAgentSession(newAgentSession),\n })\n\n const { mutate: updateAgentSession } = useUpdateAgentSession({\n onSuccess: updatedAgentSession => setAgentSession(updatedAgentSession),\n onError: err =>\n displayToast(\n `Unable to update the agent session: ${err.message}`,\n 'danger',\n ),\n })\n const theme = useTheme()\n const [agentAccessLevel, setAgentAccessLevel] = useState<AgentAccessLevel>(\n sessionContext\n ? AgentAccessLevel.WRITE_YOUR_PRIVATE_DATA\n : AgentAccessLevel.PUBLICLY_ACCESSIBLE,\n )\n\n const internalChatState = useChatState(agentSession)\n const chatState = externalChatState ?? internalChatState\n const { pendingMessage, chatJobIds, sendChat } = chatState\n\n // Keep track of the text that the user is currently typing into the textfield\n const [userChatTextfieldValue, setUserChatTextfieldValue] = useState('')\n const [initialMessageProcessed, setInitialMessageProcessed] = useState(false)\n\n // Restore chat session history, if exists.\n // TODO: currently only a single page is restored. Add support for multiple pages (and detect the user scrolling up to restore the next page of results older)\n // const {\n // data: sessionHistoryInfiniteData,\n // } = //, hasNextPage: hasMoreSessionHistory, fetchNextPage: fetchNextSessionHistoryPage, isLoading: isSessionHistoryLoading } =\n // useGetAgentChatSessionHistoryInfinite(\n // {\n // sessionId: agentSession?.sessionId,\n // },\n // {\n // enabled: !!agentSession,\n // },\n // )\n\n // const sessionHistory = useMemo(\n // () =>\n // sessionHistoryInfiniteData?.pages\n // .flatMap(page => page.page)\n // /* Note: session history is ordered from most recent to least recent in each page, so reverse the order when restoring the chat interface */\n // .reverse() ?? [],\n // [sessionHistoryInfiniteData],\n // )\n\n useEffect(() => {\n // on mount, create a new agent session!\n if (createAgentSession && !agentSession) {\n createAgentSession({\n agentAccessLevel,\n agentRegistrationId,\n sessionContext,\n })\n }\n }, [\n createAgentSession,\n agentSession,\n accessToken,\n sessionContext,\n agentAccessLevel,\n agentRegistrationId,\n ])\n\n useEffect(() => {\n // on mount, resolve the initial message chat interaction (if set)\n if (agentSession && initialMessage && !initialMessageProcessed) {\n sendChat(initialMessage)\n setInitialMessageProcessed(true)\n }\n }, [agentSession, initialMessage, initialMessageProcessed, sendChat])\n\n const handleSendMessage = () => {\n if (userChatTextfieldValue.trim()) {\n sendChat(userChatTextfieldValue.trim())\n setUserChatTextfieldValue('')\n }\n }\n\n const isDisabled =\n !agentSession || !userChatTextfieldValue || !!pendingMessage\n\n const handleKeyDown: KeyboardEventHandler<HTMLDivElement> = event => {\n if (!isDisabled && event.key === 'Enter' && !event.shiftKey) {\n event.preventDefault()\n handleSendMessage()\n }\n }\n\n const sendMessageButtonColor = (\n theme.palette.secondary as unknown as Color\n )[300]\n if (createAgentSessionError) {\n return (\n <Alert severity={'error'} sx={{ my: 2 }}>\n {createAgentSessionError.reason}\n </Alert>\n )\n }\n\n return (\n <Box\n sx={{\n display: 'flex',\n flexDirection: 'column',\n justifyContent: 'space-between',\n maxWidth: '1100px',\n mx: 'auto',\n height: '100%',\n }}\n >\n {!hideTitle && (\n <Typography\n variant=\"headline1\"\n sx={{\n p: '20px',\n borderBottom: '1px solid',\n borderColor: 'grey.300',\n position: 'sticky',\n top: '0px',\n backgroundColor: 'white',\n zIndex: 1,\n }}\n >\n {chatbotName}\n </Typography>\n )}\n {showAccessLevelMenu && (\n <AccessLevelMenu\n initAccessLevel={agentAccessLevel}\n onChange={newAccessLevel => {\n setAgentAccessLevel(newAccessLevel)\n updateAgentSession({\n agentAccessLevel: newAccessLevel,\n sessionId: agentSession!.sessionId,\n })\n }}\n />\n )}\n {!agentSession && <SkeletonParagraph numRows={10} />}\n {agentSession && (\n <Box sx={{ flexGrow: 1, overflowY: 'auto', mb: 2 }}>\n <List\n sx={{\n flex: 1,\n overflowY: 'auto',\n pt: '20px',\n display: 'flex',\n flexDirection: 'column',\n }}\n >\n {/* {sessionHistory &&\n sessionHistory.map((interaction, index) => {\n return (\n <SynapseChatInteraction\n key={index}\n userMessage={interaction.usersRequestText}\n chatResponseText={interaction.agentResponseText}\n />\n )\n })} */}\n {chatJobIds.map(jobId => {\n return <SynapseChatMessage key={jobId} chatJobId={jobId} />\n })}\n {pendingMessage && (\n <SynapseChatInteraction\n userMessage={pendingMessage}\n chatResponseText={''}\n chatErrorReason={''}\n scrollIntoView\n />\n )}\n </List>\n </Box>\n )}\n <Box\n sx={{\n position: 'sticky',\n bottom: textboxPositionOffset,\n backgroundColor: 'white',\n }}\n >\n <Box\n component=\"form\"\n sx={{\n pt: '8px',\n mt: '5px',\n pb: '10px',\n position: 'sticky',\n borderTop: '1px solid',\n borderColor: 'grey.400',\n }}\n onSubmit={handleSendMessage}\n >\n <TextField\n fullWidth\n value={userChatTextfieldValue}\n onChange={e => setUserChatTextfieldValue(e.target.value)}\n onKeyDown={handleKeyDown}\n placeholder={`Message ${chatbotName}`}\n slotProps={{\n input: {\n sx: { borderRadius: 96.6 },\n endAdornment: (\n <IconButton\n disabled={isDisabled}\n onClick={handleSendMessage}\n sx={{\n ml: '7px',\n mr: '-8px',\n color: sendMessageButtonColor,\n borderStyle: 'solid',\n borderWidth: isDisabled ? '1px' : '2px',\n borderColor: isDisabled ? 'gray' : sendMessageButtonColor,\n }}\n >\n <ArrowUpward />\n </IconButton>\n ),\n },\n }}\n />\n <Typography\n variant=\"smallText1\"\n sx={{ pt: '8px', textAlign: 'center' }}\n >\n {chatbotName} can make mistakes.\n </Typography>\n </Box>\n </Box>\n </Box>\n )\n}\n\nexport default SynapseChat\n"],"names":["SynapseChat","initialMessage","agentRegistrationId","chatbotName","hideTitle","textboxPositionOffset","sessionContext","externalSession","setExternalSession","externalChatState","showAccessLevelMenu","accessToken","useSynapseContext","localAgentSession","setLocalAgentSession","useState","agentSession","setAgentSession","createAgentSession","createAgentSessionError","useCreateAgentSession","newAgentSession","updateAgentSession","useUpdateAgentSession","updatedAgentSession","err","displayToast","theme","useTheme","agentAccessLevel","setAgentAccessLevel","AgentAccessLevel","internalChatState","useChatState","chatState","pendingMessage","chatJobIds","sendChat","userChatTextfieldValue","setUserChatTextfieldValue","initialMessageProcessed","setInitialMessageProcessed","useEffect","handleSendMessage","isDisabled","handleKeyDown","event","sendMessageButtonColor","jsx","Alert","jsxs","Box","Typography","AccessLevelMenu","newAccessLevel","SkeletonParagraph","List","jobId","SynapseChatMessage","SynapseChatInteraction","TextField","IconButton","ArrowUpward"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA6DO,SAASA,GAAY;AAAA,EAC1B,gBAAAC;AAAA,EACA,qBAAAC;AAAA,EACA,aAAAC,IAAc;AAAA,EACd,WAAAC,IAAY;AAAA,EACZ,uBAAAC,IAAwB;AAAA,EACxB,gBAAAC;AAAA,EACA,iBAAAC;AAAA,EACA,oBAAAC;AAAA,EACA,mBAAAC;AAAA,EACA,qBAAAC,IAAsB;AACxB,GAAqB;AACnB,QAAM,EAAE,aAAAC,EAAA,IAAgBC,EAAA,GAClB,CAACC,GAAmBC,CAAoB,IAAIC,EAAA,GAC5CC,IAAeT,KAAmBM,GAClCI,IAAkBT,KAAsBM,GAExC,EAAE,QAAQI,GAAoB,OAAOC,EAAA,IACzCC,EAAsB;AAAA,IACpB,WAAW,CAAAC,MAAmBJ,EAAgBI,CAAe;AAAA,EAAA,CAC9D,GAEG,EAAE,QAAQC,EAAA,IAAuBC,EAAsB;AAAA,IAC3D,WAAW,CAAAC,MAAuBP,EAAgBO,CAAmB;AAAA,IACrE,SAAS,CAAAC,MACPC;AAAA,MACE,uCAAuCD,EAAI,OAAO;AAAA,MAClD;AAAA,IAAA;AAAA,EACF,CACH,GACKE,IAAQC,EAAA,GACR,CAACC,GAAkBC,CAAmB,IAAIf;AAAA,IAC9CT,IACIyB,EAAiB,0BACjBA,EAAiB;AAAA,EAAA,GAGjBC,IAAoBC,EAAajB,CAAY,GAC7CkB,IAAYzB,KAAqBuB,GACjC,EAAE,gBAAAG,GAAgB,YAAAC,GAAY,UAAAC,EAAA,IAAaH,GAG3C,CAACI,GAAwBC,CAAyB,IAAIxB,EAAS,EAAE,GACjE,CAACyB,GAAyBC,CAA0B,IAAI1B,EAAS,EAAK;AAyB5E,EAAA2B,EAAU,MAAM;AAEd,IAAIxB,KAAsB,CAACF,KACzBE,EAAmB;AAAA,MACjB,kBAAAW;AAAA,MACA,qBAAA3B;AAAA,MACA,gBAAAI;AAAA,IAAA,CACD;AAAA,EAEL,GAAG;AAAA,IACDY;AAAA,IACAF;AAAA,IACAL;AAAA,IACAL;AAAA,IACAuB;AAAA,IACA3B;AAAA,EAAA,CACD,GAEDwC,EAAU,MAAM;AAEd,IAAI1B,KAAgBf,KAAkB,CAACuC,MACrCH,EAASpC,CAAc,GACvBwC,EAA2B,EAAI;AAAA,EAEnC,GAAG,CAACzB,GAAcf,GAAgBuC,GAAyBH,CAAQ,CAAC;AAEpE,QAAMM,IAAoB,MAAM;AAC9B,IAAIL,EAAuB,WACzBD,EAASC,EAAuB,MAAM,GACtCC,EAA0B,EAAE;AAAA,EAEhC,GAEMK,IACJ,CAAC5B,KAAgB,CAACsB,KAA0B,CAAC,CAACH,GAE1CU,IAAsD,CAAAC,MAAS;AACnE,IAAI,CAACF,KAAcE,EAAM,QAAQ,WAAW,CAACA,EAAM,aACjDA,EAAM,eAAA,GACNH,EAAA;AAAA,EAEJ,GAEMI,IACJpB,EAAM,QAAQ,UACd,GAAG;AACL,SAAIR,IAEA,gBAAA6B,EAACC,GAAA,EAAM,UAAU,SAAS,IAAI,EAAE,IAAI,EAAA,GACjC,UAAA9B,EAAwB,OAAA,CAC3B,IAKF,gBAAA+B;AAAA,IAACC;AAAA,IAAA;AAAA,MACC,IAAI;AAAA,QACF,SAAS;AAAA,QACT,eAAe;AAAA,QACf,gBAAgB;AAAA,QAChB,UAAU;AAAA,QACV,IAAI;AAAA,QACJ,QAAQ;AAAA,MAAA;AAAA,MAGT,UAAA;AAAA,QAAA,CAAC/C,KACA,gBAAA4C;AAAA,UAACI;AAAA,UAAA;AAAA,YACC,SAAQ;AAAA,YACR,IAAI;AAAA,cACF,GAAG;AAAA,cACH,cAAc;AAAA,cACd,aAAa;AAAA,cACb,UAAU;AAAA,cACV,KAAK;AAAA,cACL,iBAAiB;AAAA,cACjB,QAAQ;AAAA,YAAA;AAAA,YAGT,UAAAjD;AAAA,UAAA;AAAA,QAAA;AAAA,QAGJO,KACC,gBAAAsC;AAAA,UAACK;AAAA,UAAA;AAAA,YACC,iBAAiBxB;AAAA,YACjB,UAAU,CAAAyB,MAAkB;AAC1B,cAAAxB,EAAoBwB,CAAc,GAClChC,EAAmB;AAAA,gBACjB,kBAAkBgC;AAAA,gBAClB,WAAWtC,EAAc;AAAA,cAAA,CAC1B;AAAA,YACH;AAAA,UAAA;AAAA,QAAA;AAAA,QAGH,CAACA,KAAgB,gBAAAgC,EAACO,GAAA,EAAkB,SAAS,GAAA,CAAI;AAAA,QACjDvC,KACC,gBAAAgC,EAACG,GAAA,EAAI,IAAI,EAAE,UAAU,GAAG,WAAW,QAAQ,IAAI,EAAA,GAC7C,UAAA,gBAAAD;AAAA,UAACM;AAAA,UAAA;AAAA,YACC,IAAI;AAAA,cACF,MAAM;AAAA,cACN,WAAW;AAAA,cACX,IAAI;AAAA,cACJ,SAAS;AAAA,cACT,eAAe;AAAA,YAAA;AAAA,YAahB,UAAA;AAAA,cAAApB,EAAW,IAAI,CAAAqB,MACP,gBAAAT,EAACU,IAAA,EAA+B,WAAWD,EAAA,GAAlBA,CAAyB,CAC1D;AAAA,cACAtB,KACC,gBAAAa;AAAA,gBAACW;AAAA,gBAAA;AAAA,kBACC,aAAaxB;AAAA,kBACb,kBAAkB;AAAA,kBAClB,iBAAiB;AAAA,kBACjB,gBAAc;AAAA,gBAAA;AAAA,cAAA;AAAA,YAChB;AAAA,UAAA;AAAA,QAAA,GAGN;AAAA,QAEF,gBAAAa;AAAA,UAACG;AAAA,UAAA;AAAA,YACC,IAAI;AAAA,cACF,UAAU;AAAA,cACV,QAAQ9C;AAAA,cACR,iBAAiB;AAAA,YAAA;AAAA,YAGnB,UAAA,gBAAA6C;AAAA,cAACC;AAAA,cAAA;AAAA,gBACC,WAAU;AAAA,gBACV,IAAI;AAAA,kBACF,IAAI;AAAA,kBACJ,IAAI;AAAA,kBACJ,IAAI;AAAA,kBACJ,UAAU;AAAA,kBACV,WAAW;AAAA,kBACX,aAAa;AAAA,gBAAA;AAAA,gBAEf,UAAUR;AAAA,gBAEV,UAAA;AAAA,kBAAA,gBAAAK;AAAA,oBAACY;AAAA,oBAAA;AAAA,sBACC,WAAS;AAAA,sBACT,OAAOtB;AAAA,sBACP,UAAU,CAAA,MAAKC,EAA0B,EAAE,OAAO,KAAK;AAAA,sBACvD,WAAWM;AAAA,sBACX,aAAa,WAAW1C,CAAW;AAAA,sBACnC,WAAW;AAAA,wBACT,OAAO;AAAA,0BACL,IAAI,EAAE,cAAc,KAAA;AAAA,0BACpB,cACE,gBAAA6C;AAAA,4BAACa;AAAA,4BAAA;AAAA,8BACC,UAAUjB;AAAA,8BACV,SAASD;AAAA,8BACT,IAAI;AAAA,gCACF,IAAI;AAAA,gCACJ,IAAI;AAAA,gCACJ,OAAOI;AAAA,gCACP,aAAa;AAAA,gCACb,aAAaH,IAAa,QAAQ;AAAA,gCAClC,aAAaA,IAAa,SAASG;AAAA,8BAAA;AAAA,8BAGrC,4BAACe,GAAA,CAAA,CAAY;AAAA,4BAAA;AAAA,0BAAA;AAAA,wBACf;AAAA,sBAEJ;AAAA,oBACF;AAAA,kBAAA;AAAA,kBAEF,gBAAAZ;AAAA,oBAACE;AAAA,oBAAA;AAAA,sBACC,SAAQ;AAAA,sBACR,IAAI,EAAE,IAAI,OAAO,WAAW,SAAA;AAAA,sBAE3B,UAAA;AAAA,wBAAAjD;AAAA,wBAAY;AAAA,sBAAA;AAAA,oBAAA;AAAA,kBAAA;AAAA,gBACf;AAAA,cAAA;AAAA,YAAA;AAAA,UACF;AAAA,QAAA;AAAA,MACF;AAAA,IAAA;AAAA,EAAA;AAGN;"}
|
|
1
|
+
{"version":3,"file":"SynapseChat.js","sources":["../../../src/components/SynapseChat/SynapseChat.tsx"],"sourcesContent":["import { ChatState, useChatState } from '@/components/SynapseChat/useChatState'\nimport {\n useCreateAgentSession,\n useUpdateAgentSession,\n} from '@/synapse-queries/chat/useChat'\nimport { useSynapseContext } from '@/utils'\nimport { ArrowUpward } from '@mui/icons-material'\nimport {\n Alert,\n Box,\n IconButton,\n List,\n TextField,\n Typography,\n useTheme,\n} from '@mui/material'\nimport { Color } from '@mui/material/styles'\nimport { GridAgentSessionContext } from '@sage-bionetworks/synapse-client'\nimport {\n AgentAccessLevel,\n AgentSession,\n TraceEvent,\n} from '@sage-bionetworks/synapse-types'\nimport { KeyboardEventHandler, useEffect, useState } from 'react'\nimport { SkeletonParagraph } from '../Skeleton'\nimport { displayToast } from '../ToastMessage'\nimport AccessLevelMenu from './AccessLevelMenu'\nimport SynapseChatInteraction from './SynapseChatInteraction'\nimport SynapseChatMessage from './SynapseChatMessage'\n\nexport type SynapseChatProps = {\n initialMessage?: string //optional initial message\n agentRegistrationId?: string // if provided, use this agent\n chatbotName?: string // optional name of this chatbot agent\n hideTitle?: boolean\n textboxPositionOffset?: string // when embedded in a form, the textbox (form) stuck to the bottom may need to be offset due to container padding (dialog content for example!)\n /* optional session context for the agent session */\n sessionContext?: GridAgentSessionContext\n /* The current session, if state is lifted out of this component */\n externalSession?: AgentSession\n /* A callback invoked to bootstrap the current session, if state is to be lifted out of this component */\n setExternalSession?: (s: AgentSession | undefined) => void\n /* The current chat history, if state is lifted out of this component */\n externalChatState?: ChatState\n // default access level for the agent session.\n defaultAgentAccessLevel?: AgentAccessLevel\n // Whether to show the access level menu for the agent session.\n showAccessLevelMenu?: boolean\n /**\n * Optional callback invoked once when a chat response is received from the server.\n * Use this for side effects such as navigation based on the response content.\n * Called in the mutation onSuccess handler so it runs exactly once per response.\n */\n onChatResponse?: (responseText: string) => void\n}\n\nexport type ChatInteraction = {\n userMessage: string\n chatResponseText?: string\n chatErrorReason?: string\n chatResponseTrace?: TraceEventWithFriendlyMessage[]\n}\n\nexport type TraceEventWithFriendlyMessage = {\n friendlyMessage?: string\n} & TraceEvent\n\nexport function SynapseChat({\n initialMessage,\n agentRegistrationId,\n chatbotName = 'SynapseChat',\n hideTitle = false,\n textboxPositionOffset = '0px',\n sessionContext,\n externalSession,\n setExternalSession,\n externalChatState,\n showAccessLevelMenu = true,\n onChatResponse,\n}: SynapseChatProps) {\n const { accessToken } = useSynapseContext()\n const [localAgentSession, setLocalAgentSession] = useState<AgentSession>()\n const agentSession = externalSession ?? localAgentSession\n const setAgentSession = setExternalSession ?? setLocalAgentSession\n\n const { mutate: createAgentSession, error: createAgentSessionError } =\n useCreateAgentSession({\n onSuccess: newAgentSession => setAgentSession(newAgentSession),\n })\n\n const { mutate: updateAgentSession } = useUpdateAgentSession({\n onSuccess: updatedAgentSession => setAgentSession(updatedAgentSession),\n onError: err =>\n displayToast(\n `Unable to update the agent session: ${err.message}`,\n 'danger',\n ),\n })\n const theme = useTheme()\n const [agentAccessLevel, setAgentAccessLevel] = useState<AgentAccessLevel>(\n sessionContext\n ? AgentAccessLevel.WRITE_YOUR_PRIVATE_DATA\n : AgentAccessLevel.PUBLICLY_ACCESSIBLE,\n )\n\n const internalChatState = useChatState(agentSession, onChatResponse)\n const chatState = externalChatState ?? internalChatState\n const { pendingMessage, chatJobIds, sendChat } = chatState\n\n // Keep track of the text that the user is currently typing into the textfield\n const [userChatTextfieldValue, setUserChatTextfieldValue] = useState('')\n const [initialMessageProcessed, setInitialMessageProcessed] = useState(false)\n\n // Restore chat session history, if exists.\n // TODO: currently only a single page is restored. Add support for multiple pages (and detect the user scrolling up to restore the next page of results older)\n // const {\n // data: sessionHistoryInfiniteData,\n // } = //, hasNextPage: hasMoreSessionHistory, fetchNextPage: fetchNextSessionHistoryPage, isLoading: isSessionHistoryLoading } =\n // useGetAgentChatSessionHistoryInfinite(\n // {\n // sessionId: agentSession?.sessionId,\n // },\n // {\n // enabled: !!agentSession,\n // },\n // )\n\n // const sessionHistory = useMemo(\n // () =>\n // sessionHistoryInfiniteData?.pages\n // .flatMap(page => page.page)\n // /* Note: session history is ordered from most recent to least recent in each page, so reverse the order when restoring the chat interface */\n // .reverse() ?? [],\n // [sessionHistoryInfiniteData],\n // )\n\n useEffect(() => {\n // on mount, create a new agent session!\n if (createAgentSession && !agentSession) {\n createAgentSession({\n agentAccessLevel,\n agentRegistrationId,\n sessionContext,\n })\n }\n }, [\n createAgentSession,\n agentSession,\n accessToken,\n sessionContext,\n agentAccessLevel,\n agentRegistrationId,\n ])\n\n useEffect(() => {\n // on mount, resolve the initial message chat interaction (if set)\n if (agentSession && initialMessage && !initialMessageProcessed) {\n sendChat(initialMessage)\n setInitialMessageProcessed(true)\n }\n }, [agentSession, initialMessage, initialMessageProcessed, sendChat])\n\n const handleSendMessage = () => {\n if (userChatTextfieldValue.trim()) {\n sendChat(userChatTextfieldValue.trim())\n setUserChatTextfieldValue('')\n }\n }\n\n const isDisabled =\n !agentSession || !userChatTextfieldValue || !!pendingMessage\n\n const handleKeyDown: KeyboardEventHandler<HTMLDivElement> = event => {\n if (!isDisabled && event.key === 'Enter' && !event.shiftKey) {\n event.preventDefault()\n handleSendMessage()\n }\n }\n\n const sendMessageButtonColor = (\n theme.palette.secondary as unknown as Color\n )[300]\n if (createAgentSessionError) {\n return (\n <Alert severity={'error'} sx={{ my: 2 }}>\n {createAgentSessionError.reason}\n </Alert>\n )\n }\n\n return (\n <Box\n sx={{\n display: 'flex',\n flexDirection: 'column',\n justifyContent: 'space-between',\n maxWidth: '1100px',\n mx: 'auto',\n height: '100%',\n }}\n >\n {!hideTitle && (\n <Typography\n variant=\"headline1\"\n sx={{\n p: '20px',\n borderBottom: '1px solid',\n borderColor: 'grey.300',\n position: 'sticky',\n top: '0px',\n backgroundColor: 'white',\n zIndex: 1,\n }}\n >\n {chatbotName}\n </Typography>\n )}\n {showAccessLevelMenu && (\n <AccessLevelMenu\n initAccessLevel={agentAccessLevel}\n onChange={newAccessLevel => {\n setAgentAccessLevel(newAccessLevel)\n updateAgentSession({\n agentAccessLevel: newAccessLevel,\n sessionId: agentSession!.sessionId,\n })\n }}\n />\n )}\n {!agentSession && <SkeletonParagraph numRows={10} />}\n {agentSession && (\n <Box sx={{ flexGrow: 1, overflowY: 'auto', mb: 2 }}>\n <List\n sx={{\n flex: 1,\n overflowY: 'auto',\n pt: '20px',\n display: 'flex',\n flexDirection: 'column',\n }}\n >\n {/* {sessionHistory &&\n sessionHistory.map((interaction, index) => {\n return (\n <SynapseChatInteraction\n key={index}\n userMessage={interaction.usersRequestText}\n chatResponseText={interaction.agentResponseText}\n />\n )\n })} */}\n {chatJobIds.map(jobId => {\n return (\n <SynapseChatMessage\n key={jobId}\n chatJobId={jobId}\n onSendChat={sendChat}\n />\n )\n })}\n {pendingMessage && (\n <SynapseChatInteraction\n userMessage={pendingMessage}\n chatResponseText={''}\n chatErrorReason={''}\n scrollIntoView\n onSendChat={sendChat}\n />\n )}\n </List>\n </Box>\n )}\n <Box\n sx={{\n position: 'sticky',\n bottom: textboxPositionOffset,\n backgroundColor: 'white',\n }}\n >\n <Box\n component=\"form\"\n sx={{\n pt: '8px',\n mt: '5px',\n pb: '10px',\n position: 'sticky',\n borderTop: '1px solid',\n borderColor: 'grey.400',\n }}\n onSubmit={handleSendMessage}\n >\n <TextField\n fullWidth\n value={userChatTextfieldValue}\n onChange={e => setUserChatTextfieldValue(e.target.value)}\n onKeyDown={handleKeyDown}\n placeholder={`Message ${chatbotName}`}\n slotProps={{\n input: {\n sx: { borderRadius: 96.6 },\n endAdornment: (\n <IconButton\n disabled={isDisabled}\n onClick={handleSendMessage}\n sx={{\n ml: '7px',\n mr: '-8px',\n color: sendMessageButtonColor,\n borderStyle: 'solid',\n borderWidth: isDisabled ? '1px' : '2px',\n borderColor: isDisabled ? 'gray' : sendMessageButtonColor,\n }}\n >\n <ArrowUpward />\n </IconButton>\n ),\n },\n }}\n />\n <Typography\n variant=\"smallText1\"\n sx={{ pt: '8px', textAlign: 'center' }}\n >\n {chatbotName} can make mistakes.\n </Typography>\n </Box>\n </Box>\n </Box>\n )\n}\n\nexport default SynapseChat\n"],"names":["SynapseChat","initialMessage","agentRegistrationId","chatbotName","hideTitle","textboxPositionOffset","sessionContext","externalSession","setExternalSession","externalChatState","showAccessLevelMenu","onChatResponse","accessToken","useSynapseContext","localAgentSession","setLocalAgentSession","useState","agentSession","setAgentSession","createAgentSession","createAgentSessionError","useCreateAgentSession","newAgentSession","updateAgentSession","useUpdateAgentSession","updatedAgentSession","err","displayToast","theme","useTheme","agentAccessLevel","setAgentAccessLevel","AgentAccessLevel","internalChatState","useChatState","chatState","pendingMessage","chatJobIds","sendChat","userChatTextfieldValue","setUserChatTextfieldValue","initialMessageProcessed","setInitialMessageProcessed","useEffect","handleSendMessage","isDisabled","handleKeyDown","event","sendMessageButtonColor","jsx","Alert","jsxs","Box","Typography","AccessLevelMenu","newAccessLevel","SkeletonParagraph","List","jobId","SynapseChatMessage","SynapseChatInteraction","TextField","IconButton","ArrowUpward"],"mappings":"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"}
|
|
@@ -5,7 +5,8 @@ export type SynapseChatInteractionProps = {
|
|
|
5
5
|
chatResponseTrace?: TraceEvent[];
|
|
6
6
|
scrollIntoView?: boolean;
|
|
7
7
|
chatErrorReason?: string;
|
|
8
|
+
onSendChat?: (message: string) => void;
|
|
8
9
|
};
|
|
9
|
-
export declare function SynapseChatInteraction({ userMessage, chatResponseText, chatErrorReason, chatResponseTrace, scrollIntoView, }: SynapseChatInteractionProps): import("react/jsx-runtime").JSX.Element;
|
|
10
|
+
export declare function SynapseChatInteraction({ userMessage, chatResponseText, chatErrorReason, chatResponseTrace, scrollIntoView, onSendChat, }: SynapseChatInteractionProps): import("react/jsx-runtime").JSX.Element;
|
|
10
11
|
export default SynapseChatInteraction;
|
|
11
12
|
//# sourceMappingURL=SynapseChatInteraction.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SynapseChatInteraction.d.ts","sourceRoot":"","sources":["../../../src/components/SynapseChat/SynapseChatInteraction.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"SynapseChatInteraction.d.ts","sourceRoot":"","sources":["../../../src/components/SynapseChat/SynapseChatInteraction.tsx"],"names":[],"mappings":"AAsBA,OAAO,EAAE,UAAU,EAAE,MAAM,iCAAiC,CAAA;AAI5D,MAAM,MAAM,2BAA2B,GAAG;IACxC,WAAW,EAAE,MAAM,CAAA;IACnB,gBAAgB,CAAC,EAAE,MAAM,CAAA;IACzB,iBAAiB,CAAC,EAAE,UAAU,EAAE,CAAA;IAChC,cAAc,CAAC,EAAE,OAAO,CAAA;IACxB,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB,UAAU,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAA;CACvC,CAAA;AAqBD,wBAAgB,sBAAsB,CAAC,EACrC,WAAW,EACX,gBAAgB,EAChB,eAAe,EACf,iBAAiB,EACjB,cAAsB,EACtB,UAAU,GACX,EAAE,2BAA2B,2CAgN7B;AAED,eAAe,sBAAsB,CAAA"}
|