synapse-react-client 4.0.2 → 4.0.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/SWC.index.js +1 -1
- package/dist/assets/icons/AwardScroll.d.ts +5 -0
- package/dist/assets/icons/AwardScroll.d.ts.map +1 -0
- package/dist/assets/icons/AwardScroll.js +78 -0
- package/dist/assets/icons/AwardScroll.js.map +1 -0
- package/dist/assets/icons/Baseline.d.ts +5 -0
- package/dist/assets/icons/Baseline.d.ts.map +1 -0
- package/dist/assets/icons/Baseline.js +43 -0
- package/dist/assets/icons/Baseline.js.map +1 -0
- package/dist/assets/icons/Challenge.svg +13 -0
- package/dist/assets/icons/Challenge.svg.js +7 -0
- package/dist/assets/icons/Challenge.svg.js.map +1 -0
- package/dist/assets/icons/ClappingHands.d.ts +5 -0
- package/dist/assets/icons/ClappingHands.d.ts.map +1 -0
- package/dist/assets/icons/ClappingHands.js +106 -0
- package/dist/assets/icons/ClappingHands.js.map +1 -0
- package/dist/assets/icons/HandWithMoney.d.ts +5 -0
- package/dist/assets/icons/HandWithMoney.d.ts.map +1 -0
- package/dist/assets/icons/HandWithMoney.js +15 -0
- package/dist/assets/icons/HandWithMoney.js.map +1 -0
- package/dist/assets/icons/MultiFile.d.ts +5 -0
- package/dist/assets/icons/MultiFile.d.ts.map +1 -0
- package/dist/assets/icons/MultiFile.js +8 -0
- package/dist/assets/icons/MultiFile.js.map +1 -0
- package/dist/assets/icons/MultiFile.svg +4 -0
- package/dist/assets/icons/MultiFile.svg.js +7 -0
- package/dist/assets/icons/MultiFile.svg.js.map +1 -0
- package/dist/assets/icons/OpenBook.d.ts +5 -0
- package/dist/assets/icons/OpenBook.d.ts.map +1 -0
- package/dist/assets/icons/OpenBook.js +99 -0
- package/dist/assets/icons/OpenBook.js.map +1 -0
- package/dist/assets/icons/Podium.d.ts +5 -0
- package/dist/assets/icons/Podium.d.ts.map +1 -0
- package/dist/assets/icons/Podium.js +36 -0
- package/dist/assets/icons/Podium.js.map +1 -0
- package/dist/assets/icons/RosetteRibbon.d.ts +5 -0
- package/dist/assets/icons/RosetteRibbon.d.ts.map +1 -0
- package/dist/assets/icons/RosetteRibbon.js +36 -0
- package/dist/assets/icons/RosetteRibbon.js.map +1 -0
- package/dist/assets/icons/StarTrophy.d.ts +5 -0
- package/dist/assets/icons/StarTrophy.d.ts.map +1 -0
- package/dist/assets/icons/StarTrophy.js +99 -0
- package/dist/assets/icons/StarTrophy.js.map +1 -0
- package/dist/assets/icons/ThreeStars.d.ts +5 -0
- package/dist/assets/icons/ThreeStars.d.ts.map +1 -0
- package/dist/assets/icons/ThreeStars.js +71 -0
- package/dist/assets/icons/ThreeStars.js.map +1 -0
- package/dist/assets/icons/UnpackagableFile.d.ts +5 -0
- package/dist/assets/icons/UnpackagableFile.d.ts.map +1 -0
- package/dist/assets/icons/UnpackagableFile.js +8 -0
- package/dist/assets/icons/UnpackagableFile.js.map +1 -0
- package/dist/assets/icons/UnpackagableFile.svg +4 -0
- package/dist/assets/icons/UnpackagableFile.svg.js +7 -0
- package/dist/assets/icons/UnpackagableFile.svg.js.map +1 -0
- package/dist/assets/mui_components/PackagableFile.d.ts.map +1 -1
- package/dist/assets/mui_components/PackagableFile.js +5 -4
- package/dist/assets/mui_components/PackagableFile.js.map +1 -1
- package/dist/assets/mui_components/PackagableFile.svg +3 -0
- package/dist/assets/mui_components/PackagableFile.svg.js +7 -0
- package/dist/assets/mui_components/PackagableFile.svg.js.map +1 -0
- package/dist/assets/themed_icons/index.d.ts +1 -2
- package/dist/assets/themed_icons/index.d.ts.map +1 -1
- package/dist/assets/themed_icons/index.js +8 -10
- package/dist/assets/themed_icons/index.js.map +1 -1
- package/dist/components/AccessRequirement/AddConditionsForUseButton/AddConditionsForUseButton.js +1 -1
- package/dist/components/AccessRequirementList/AccessRequirementList.js +4 -4
- package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/DataAccessRequestAccessorsEditor.d.ts.map +1 -1
- package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/DataAccessRequestAccessorsEditor.js +8 -7
- package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/DataAccessRequestAccessorsEditor.js.map +1 -1
- package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/ManagedACTAccessRequirementFormWikiWrapper.js +4 -4
- package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/ManagedACTAccessRequirementItem.js +11 -11
- package/dist/components/AccessRequirementList/RequirementItem/RequirementItem.js +1 -1
- package/dist/components/AccessRequirementList/RequirementItem/SelfSignAccessRequirementItem.js +9 -9
- package/dist/components/AccessRequirementList/RequirementItem/UnmanagedACTAccessRequirementItem.js +5 -5
- package/dist/components/AcknowledgementsPage/AcknowledgementsPage.d.ts.map +1 -1
- package/dist/components/AcknowledgementsPage/AcknowledgementsPage.js +36 -35
- package/dist/components/AcknowledgementsPage/AcknowledgementsPage.js.map +1 -1
- package/dist/components/AclEditor/AclEditor.js +8 -8
- package/dist/components/AclEditor/AclEditor.js.map +1 -1
- package/dist/components/AclEditor/AclEditor.test-utils.js +34 -34
- package/dist/components/AclEditor/AclEditor.test-utils.js.map +1 -1
- package/dist/components/AddToDownloadListV2.js +10 -10
- package/dist/components/AddToDownloadListV2.js.map +1 -1
- package/dist/components/Authentication/AuthenticationMethodSelection.js +1 -1
- package/dist/components/Authentication/TwoFactorEnrollmentForm.d.ts.map +1 -1
- package/dist/components/Authentication/TwoFactorEnrollmentForm.js +6 -5
- package/dist/components/Authentication/TwoFactorEnrollmentForm.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 +13 -1
- package/dist/components/BasePortalCard/BasePortalCard.module.scss.js +11 -11
- package/dist/components/BasePortalCard/ColorfulPortalCardWithChips/ColorfulPortalCardWithChips.css +1 -1
- package/dist/components/BasePortalCard/ColorfulPortalCardWithChips/ColorfulPortalCardWithChips.d.ts.map +1 -1
- package/dist/components/BasePortalCard/ColorfulPortalCardWithChips/ColorfulPortalCardWithChips.js +25 -25
- package/dist/components/BasePortalCard/ColorfulPortalCardWithChips/ColorfulPortalCardWithChips.js.map +1 -1
- package/dist/components/BasePortalCard/ColorfulPortalCardWithChips/ColorfulPortalCardWithChips.module.scss +13 -5
- package/dist/components/BasePortalCard/ColorfulPortalCardWithChips/ColorfulPortalCardWithChips.module.scss.js +5 -5
- package/dist/components/CardContainer/CardLink.d.ts +12 -0
- package/dist/components/CardContainer/CardLink.d.ts.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/ChallengeSubmission/AvailableEvaluationQueueList.js +12 -12
- package/dist/components/ChallengeTeamWizard/CreateChallengeTeam.d.ts.map +1 -1
- package/dist/components/ChallengeTeamWizard/CreateChallengeTeam.js +7 -7
- package/dist/components/ChallengeTeamWizard/CreateChallengeTeam.js.map +1 -1
- package/dist/components/ChangePassword/useChangePasswordFormState.js +5 -2
- package/dist/components/ChangePassword/useChangePasswordFormState.js.map +1 -1
- package/dist/components/CitationPopover/CitationPopoverContent.d.ts.map +1 -1
- package/dist/components/CitationPopover/CitationPopoverContent.js +13 -12
- package/dist/components/CitationPopover/CitationPopoverContent.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/CookiesNotification/CookiesNotification.js +1 -1
- package/dist/components/CreateOrUpdateAccessRequirementWizard/CreateOrUpdateAccessRequirementWizard.js +12 -10
- package/dist/components/CreateOrUpdateAccessRequirementWizard/CreateOrUpdateAccessRequirementWizard.js.map +1 -1
- package/dist/components/DataGrid/MergeGridWithSourceTableButton.js +10 -5
- package/dist/components/DataGrid/MergeGridWithSourceTableButton.js.map +1 -1
- package/dist/components/DataGrid/SynapseGrid.d.ts.map +1 -1
- package/dist/components/DataGrid/SynapseGrid.js +43 -38
- package/dist/components/DataGrid/SynapseGrid.js.map +1 -1
- package/dist/components/DataGrid/components/UploadCsvToGridDialog.js +10 -5
- package/dist/components/DataGrid/components/UploadCsvToGridDialog.js.map +1 -1
- package/dist/components/DataGrid/hooks/useExportDataGridToCsv.d.ts.map +1 -1
- package/dist/components/DataGrid/hooks/useExportDataGridToCsv.js +9 -7
- package/dist/components/DataGrid/hooks/useExportDataGridToCsv.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/ActionRequiredCard/ActionRequiredCard.js +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/RequestDownloadCard.js +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 +10 -5
- package/dist/components/Ecosystem/EcosystemSkeleton.js.map +1 -1
- package/dist/components/Ecosystem/TableQueryEcosystem.js +1 -1
- package/dist/components/EntityAclEditor/EntityAclEditorModal.js +1 -1
- package/dist/components/EntityAclEditor/OpenData.js +1 -1
- package/dist/components/EntityBadgeIcons/EntityBadgeIcons.d.ts.map +1 -1
- package/dist/components/EntityBadgeIcons/EntityBadgeIcons.js +113 -127
- package/dist/components/EntityBadgeIcons/EntityBadgeIcons.js.map +1 -1
- package/dist/components/EntityCitation/EntityCitation.js +1 -1
- package/dist/components/EntityDownloadButton/EntityDownloadButton.js +20 -20
- package/dist/components/EntityDownloadButton/EntityDownloadButton.js.map +1 -1
- package/dist/components/EntityFinder/details/view/table/AddToDownloadListCell.js +4 -4
- package/dist/components/EntityFinder/details/view/table/AddToDownloadListCell.js.map +1 -1
- package/dist/components/EntityFinder/details/view/table/CreatedOnCell.js +1 -1
- package/dist/components/EntityFinder/details/view/table/EntityNameCell.js +1 -1
- package/dist/components/EntityFinder/details/view/table/FileEntityMD5Cell.js +1 -1
- package/dist/components/EntityFinder/details/view/table/FileEntitySizeCell.js +1 -1
- package/dist/components/EntityFinder/details/view/table/ModifiedByCell.js +1 -1
- package/dist/components/EntityFinder/details/view/table/ModifiedOnCell.js +1 -1
- package/dist/components/EntityFinder/details/view/table/ParentProjectCell.js +1 -1
- package/dist/components/EntityFinder/tree/EntityTree.js +1 -1
- package/dist/components/EntityHeaderTable/EntityHeaderTable.d.ts.map +1 -1
- package/dist/components/EntityHeaderTable/EntityHeaderTable.js +39 -39
- package/dist/components/EntityHeaderTable/EntityHeaderTable.js.map +1 -1
- package/dist/components/Evaluation/DeleteEvaluationQueueConfirmationDialog.d.ts +8 -0
- package/dist/components/Evaluation/DeleteEvaluationQueueConfirmationDialog.d.ts.map +1 -0
- package/dist/components/Evaluation/DeleteEvaluationQueueConfirmationDialog.js +46 -0
- package/dist/components/Evaluation/DeleteEvaluationQueueConfirmationDialog.js.map +1 -0
- package/dist/components/Evaluation/EvaluationCard.d.ts.map +1 -1
- package/dist/components/Evaluation/EvaluationCard.js +35 -41
- package/dist/components/Evaluation/EvaluationCard.js.map +1 -1
- package/dist/components/Evaluation/EvaluationEditor.d.ts.map +1 -1
- package/dist/components/Evaluation/EvaluationEditor.js +95 -90
- package/dist/components/Evaluation/EvaluationEditor.js.map +1 -1
- package/dist/components/Evaluation/EvaluationRoundEditor.d.ts.map +1 -1
- package/dist/components/Evaluation/EvaluationRoundEditor.js +133 -124
- package/dist/components/Evaluation/EvaluationRoundEditor.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/FilePreview/EntityPreview.js +1 -1
- package/dist/components/Forum/DiscussionReply.js +10 -10
- package/dist/components/Forum/DiscussionThread.js +21 -21
- package/dist/components/FullWidthAlert/FullWidthAlert.d.ts +2 -2
- package/dist/components/FullWidthAlert/FullWidthAlert.js.map +1 -1
- package/dist/components/GenericCard/CardUtils.d.ts.map +1 -1
- package/dist/components/GenericCard/CardUtils.js +36 -36
- package/dist/components/GenericCard/CardUtils.js.map +1 -1
- package/dist/components/GenericCard/CollapsibleDescription.js +25 -25
- 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 +95 -85
- package/dist/components/GenericCard/SynapseCardLabel.js.map +1 -1
- package/dist/components/GenericCard/TableRowGenericCard.d.ts +10 -1
- package/dist/components/GenericCard/TableRowGenericCard.d.ts.map +1 -1
- package/dist/components/GenericCard/TableRowGenericCard.js +248 -209
- package/dist/components/GenericCard/TableRowGenericCard.js.map +1 -1
- package/dist/components/GoalsV2/GoalsV2.Desktop.d.ts.map +1 -1
- package/dist/components/GoalsV2/GoalsV2.Desktop.js +14 -15
- package/dist/components/GoalsV2/GoalsV2.Desktop.js.map +1 -1
- package/dist/components/GoogleAnalytics/GoogleAnalytics.js +1 -1
- package/dist/components/HasAccess/HasAccessV2.js +1 -1
- package/dist/components/HasAccess/useHasAccess.js +1 -1
- package/dist/components/HeaderCard.js +17 -13
- package/dist/components/HeaderCard.js.map +1 -1
- package/dist/components/IDUReport/IDUReportSubmissionInfo.js +23 -23
- package/dist/components/IDUReport/IDUReportSubmissionInfo.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/JSONArrayEditor/useParseCsv.d.ts +1 -1
- package/dist/components/JSONArrayEditor/useParseCsv.d.ts.map +1 -1
- package/dist/components/JSONArrayEditor/useParseCsv.js +9 -9
- package/dist/components/JSONArrayEditor/useParseCsv.js.map +1 -1
- package/dist/components/Markdown/MarkdownCollapse.js +7 -7
- package/dist/components/Markdown/MarkdownEditor.js +11 -11
- package/dist/components/Markdown/MarkdownGithub.js +1 -1
- package/dist/components/Markdown/MarkdownPopover.js +6 -6
- package/dist/components/Markdown/MarkdownPopover.js.map +1 -1
- package/dist/components/Markdown/MarkdownSynapse.d.ts.map +1 -1
- package/dist/components/Markdown/MarkdownSynapse.js +139 -135
- package/dist/components/Markdown/MarkdownSynapse.js.map +1 -1
- package/dist/components/Markdown/MarkdownUtils.d.ts +8 -0
- package/dist/components/Markdown/MarkdownUtils.d.ts.map +1 -1
- package/dist/components/Markdown/MarkdownUtils.js +139 -65
- package/dist/components/Markdown/MarkdownUtils.js.map +1 -1
- package/dist/components/Markdown/UserMentionModal.js +18 -18
- package/dist/components/Markdown/UserMentionModal.js.map +1 -1
- package/dist/components/Markdown/widget/MarkdownButton.js +3 -3
- package/dist/components/Markdown/widget/MarkdownButton.js.map +1 -1
- package/dist/components/MissingQueryResultsWarning/MissingQueryResultsWarning.d.ts.map +1 -1
- package/dist/components/MissingQueryResultsWarning/MissingQueryResultsWarning.js +9 -8
- package/dist/components/MissingQueryResultsWarning/MissingQueryResultsWarning.js.map +1 -1
- package/dist/components/Plot/SynapsePlot.css +1 -0
- package/dist/components/Plot/SynapsePlot.d.ts +2 -0
- package/dist/components/Plot/SynapsePlot.d.ts.map +1 -1
- package/dist/components/Plot/SynapsePlot.js +43 -39
- package/dist/components/Plot/SynapsePlot.js.map +1 -1
- package/dist/components/Plot/SynapsePlot.scss +8 -0
- package/dist/components/QueryVisualizationWrapper/QueryVisualizationWrapper.js +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 +137 -135
- package/dist/components/QueryWrapperPlotNav/QueryWrapperPlotNav.js.map +1 -1
- package/dist/components/QueryWrapperPlotNav/QueryWrapperSynapsePlot.d.ts +1 -1
- package/dist/components/QueryWrapperPlotNav/QueryWrapperSynapsePlot.d.ts.map +1 -1
- package/dist/components/QueryWrapperPlotNav/QueryWrapperSynapsePlot.js.map +1 -1
- package/dist/components/Resources/Resources.Desktop.js +7 -7
- package/dist/components/Resources/Resources.Mobile.js +6 -6
- package/dist/components/StorybookComponentWrapper.js +6 -3
- package/dist/components/StorybookComponentWrapper.js.map +1 -1
- package/dist/components/SubsectionRowRenderer/SubsectionRowRenderer.js +3 -3
- package/dist/components/SustainabilityScorecard/SustainabilityScorecardSummary.js +10 -10
- 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/SynapseForm/WarningDialog.d.ts +1 -0
- package/dist/components/SynapseForm/WarningDialog.d.ts.map +1 -1
- package/dist/components/SynapseForm/WarningDialog.js +18 -16
- package/dist/components/SynapseForm/WarningDialog.js.map +1 -1
- package/dist/components/SynapseHomepageV2/SynapseHomepageNavBar.js +1 -1
- package/dist/components/SynapseNavDrawer/SynapseNavDrawer.js +25 -25
- package/dist/components/SynapseNavDrawer/SynapseNavDrawer.js.map +1 -1
- package/dist/components/SynapseSearchPageResults/HasAccessChip.js +1 -1
- package/dist/components/SynapseSearchPageResults/SearchPagePortalBanners.d.ts.map +1 -1
- package/dist/components/SynapseSearchPageResults/SearchPagePortalBanners.js +12 -13
- package/dist/components/SynapseSearchPageResults/SearchPagePortalBanners.js.map +1 -1
- package/dist/components/SynapseSearchPageResults/SynapseSearchResultsCard.js +5 -5
- package/dist/components/SynapseTable/ExpandableTableDataCell.d.ts.map +1 -1
- package/dist/components/SynapseTable/ExpandableTableDataCell.js +3 -1
- package/dist/components/SynapseTable/ExpandableTableDataCell.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/SynapseTable.js +4 -4
- package/dist/components/SynapseTable/SynapseTableCell/SynapseTableCell.d.ts.map +1 -1
- package/dist/components/SynapseTable/SynapseTableCell/SynapseTableCell.js +122 -122
- package/dist/components/SynapseTable/SynapseTableCell/SynapseTableCell.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/SynapseTable/datasets/DatasetItemsEditor.js +5 -5
- package/dist/components/TableColumnSchemaEditor/ColumnModelForm.js +1 -1
- package/dist/components/TableColumnSchemaEditor/TableColumnSchemaEditor.js +1 -1
- package/dist/components/TableColumnSchemaEditor/TableColumnSchemaForm.js +1 -1
- package/dist/components/TableFeedCards/TableFeedCards.js +9 -9
- package/dist/components/TermsAndConditions/TermsAndConditionsItem.js +10 -10
- 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/TimelinePlot/TimelinePlotSpeciesSelector.js +9 -9
- package/dist/components/UserSearchBox/UserSearchBox.d.ts +23 -0
- package/dist/components/UserSearchBox/UserSearchBox.d.ts.map +1 -0
- package/dist/components/UserSearchBox/UserSearchBox.js +146 -0
- package/dist/components/UserSearchBox/UserSearchBox.js.map +1 -0
- package/dist/components/WikiMarkdownEditorButton/WikiMarkdownEditorButton.js +13 -13
- package/dist/components/WizardChoiceButton/WizardChoiceButton.js +3 -3
- package/dist/components/dataaccess/AccessHistoryDashboard.js +5 -5
- package/dist/components/dataaccess/AccessHistoryDashboard.js.map +1 -1
- package/dist/components/dataaccess/AccessRequirementDashboard.js +4 -4
- package/dist/components/dataaccess/AccessRequirementDashboard.js.map +1 -1
- package/dist/components/dataaccess/AccessSubmissionDashboard.js +1 -1
- package/dist/components/dataaccess/AccessSubmissionDashboard.js.map +1 -1
- package/dist/components/dataaccess/SubmissionPage/SubmissionPage.js +5 -5
- package/dist/components/dataaccess/UseAccessRequirementTable.js +3 -3
- package/dist/components/dataaccess/UseAccessRequirementTable.js.map +1 -1
- package/dist/components/doi/CreateOrUpdateDoiModal.js +1 -1
- package/dist/components/download_list/AddToDownloadListConfirmationAlert/AddToDownloadListConfirmationAlert.js +10 -5
- 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/entity/metadata/EntityModal.js +1 -1
- package/dist/components/entity/metadata/MetadataTable.js +1 -1
- package/dist/components/entity/page/title_bar/EntityPageTitleBar.js +1 -1
- package/dist/components/entity/page/title_bar/EntityTitleBarVersionInfo.js +1 -1
- package/dist/components/entity/page/title_bar/TitleBarProperties.js +1 -1
- package/dist/components/entity/page/title_bar/useGetEntityTitleBarProperties.d.ts.map +1 -1
- package/dist/components/entity/page/title_bar/useGetEntityTitleBarProperties.js +27 -26
- package/dist/components/entity/page/title_bar/useGetEntityTitleBarProperties.js.map +1 -1
- package/dist/components/index.js +125 -121
- package/dist/components/index.js.map +1 -1
- package/dist/components/layout/InfiniteTableLayout.js +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/styled/HoverPopover.css +1 -0
- package/dist/components/styled/HoverPopover.d.ts +28 -0
- package/dist/components/styled/HoverPopover.d.ts.map +1 -0
- package/dist/components/styled/HoverPopover.js +103 -0
- package/dist/components/styled/HoverPopover.js.map +1 -0
- package/dist/components/styled/HoverPopover.module.scss +9 -0
- package/dist/components/styled/HoverPopover.module.scss.js +10 -0
- package/dist/components/styled/HoverPopover.module.scss.js.map +1 -0
- package/dist/components/styled/index.d.ts +2 -0
- package/dist/components/styled/index.d.ts.map +1 -1
- package/dist/components/styled/index.js +11 -9
- package/dist/components/styled/index.js.map +1 -1
- package/dist/components/table/CsvPreview/CsvPreview.js +10 -5
- package/dist/components/table/CsvPreview/CsvPreview.js.map +1 -1
- package/dist/components/table/CsvPreview/CsvPreviewDialog.js +10 -5
- package/dist/components/table/CsvPreview/CsvPreviewDialog.js.map +1 -1
- package/dist/components/widgets/Range.js +1 -1
- package/dist/components/widgets/facet-nav/FacetNavPanel.d.ts.map +1 -1
- package/dist/components/widgets/facet-nav/FacetNavPanel.js +35 -32
- package/dist/components/widgets/facet-nav/FacetNavPanel.js.map +1 -1
- package/dist/components/widgets/facet-nav/PlotsContainer.d.ts +1 -1
- package/dist/components/widgets/facet-nav/PlotsContainer.d.ts.map +1 -1
- package/dist/components/widgets/facet-nav/PlotsContainer.js +69 -68
- package/dist/components/widgets/facet-nav/PlotsContainer.js.map +1 -1
- package/dist/components/widgets/facet-nav/useFacetPlots.d.ts.map +1 -1
- package/dist/components/widgets/facet-nav/useFacetPlots.js +24 -21
- package/dist/components/widgets/facet-nav/useFacetPlots.js.map +1 -1
- package/dist/components/widgets/query-filter/FacetFilterControls.js +3 -3
- package/dist/features/curator/GridPage/GridPage.js +10 -5
- package/dist/features/curator/GridPage/GridPage.js.map +1 -1
- package/dist/features/curator/GridPage/components/GridPageTitle.js +10 -5
- package/dist/features/curator/GridPage/components/GridPageTitle.js.map +1 -1
- package/dist/features/entity/metadata-task/hooks/useMetadataTaskTable.js +1 -1
- package/dist/index.js +155 -151
- package/dist/index.js.map +1 -1
- package/dist/mocks/msw/handlers/accessRequirementHandlers.js +5 -5
- package/dist/mocks/msw/handlers/projectStorageHandlers.js +5 -5
- package/dist/mocks/msw/handlers/wikiHandlers.js +1 -1
- package/dist/mocks/msw/handlers.d.ts.map +1 -1
- package/dist/mocks/msw/handlers.js +67 -59
- package/dist/mocks/msw/handlers.js.map +1 -1
- package/dist/style/base/_core.scss +0 -1
- package/dist/style/components/_all.scss +0 -2
- package/dist/style/components/_cards.scss +22 -0
- package/dist/style/components/_download-list-v2.scss +1 -1
- package/dist/style/components/_entity-badge.scss +0 -2
- package/dist/style/components/_expandable_table_data.scss +3 -3
- package/dist/style/components/_query-wrapper-plot-nav.scss +13 -0
- package/dist/style/components/facet_nav/_facet-nav-panel.scss +3 -0
- package/dist/style/components/facet_nav/_facet-nav.scss +4 -0
- package/dist/style/main.css +1 -1
- package/dist/synapse-client/SynapseClient.js +118 -118
- package/dist/synapse-client/SynapseClient.js.map +1 -1
- package/dist/synapse-queries/auth/useOIDC.js +1 -1
- package/dist/synapse-queries/auth/useTwoFactorEnrollment.js +1 -1
- package/dist/synapse-queries/entity/index.js +6 -6
- package/dist/synapse-queries/grid/useEstablishWebsocketConnection.js +1 -1
- package/dist/synapse-queries/index.js +1 -1
- package/dist/synapse-queries/user/usePersonalAccessToken.js +1 -1
- package/dist/testutils/vitest.setup.js +10 -11
- package/dist/testutils/vitest.setup.js.map +1 -1
- package/dist/theme/DefaultTheme.js +1 -1
- package/dist/theme/ThemeProvider.d.ts +2 -1
- package/dist/theme/ThemeProvider.d.ts.map +1 -1
- package/dist/theme/ThemeProvider.js +11 -10
- package/dist/theme/ThemeProvider.js.map +1 -1
- package/dist/theme/index.js +1 -1
- package/dist/theme/mergeTheme.js +1 -1
- package/dist/tsconfig.build.tsbuildinfo +1 -1
- package/dist/utils/AppUtils/AppUtils.js +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/SanitizeHtmlUtils.d.ts.map +1 -1
- package/dist/utils/functions/SanitizeHtmlUtils.js +34 -40
- package/dist/utils/functions/SanitizeHtmlUtils.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/dist/utils/functions/deepLinkingUtils.js +10 -10
- package/dist/utils/functions/deepLinkingUtils.js.map +1 -1
- package/dist/utils/hooks/index.js +6 -6
- package/dist/utils/hooks/useDetectSSOCode.js +3 -3
- package/dist/utils/hooks/useGetEntityMetadata.js +1 -1
- package/dist/utils/hooks/useNativeSearchParams.d.ts.map +1 -1
- package/dist/utils/hooks/useNativeSearchParams.js +1 -1
- package/dist/utils/hooks/useNativeSearchParams.js.map +1 -1
- package/dist/utils/hooks/useOneSageURL.d.ts.map +1 -1
- package/dist/utils/hooks/useOneSageURL.js +15 -15
- package/dist/utils/hooks/useOneSageURL.js.map +1 -1
- package/dist/utils/hooks/useSourceAppConfigs.d.ts +1 -0
- package/dist/utils/hooks/useSourceAppConfigs.d.ts.map +1 -1
- package/dist/utils/hooks/useSourceAppConfigs.js +79 -77
- package/dist/utils/hooks/useSourceAppConfigs.js.map +1 -1
- package/dist/utils/index.js +4 -4
- package/package.json +15 -16
- package/dist/_virtual/index.js +0 -6
- package/dist/_virtual/index.js.map +0 -1
- package/dist/_virtual/index2.js +0 -5
- package/dist/_virtual/index2.js.map +0 -1
- package/dist/_virtual/index3.js +0 -5
- package/dist/_virtual/index3.js.map +0 -1
- package/dist/_virtual/index4.js +0 -5
- package/dist/_virtual/index4.js.map +0 -1
- package/dist/_virtual/index5.js +0 -5
- package/dist/_virtual/index5.js.map +0 -1
- 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/components/UserSearchBox/UserSearchBoxV2.d.ts +0 -21
- package/dist/components/UserSearchBox/UserSearchBoxV2.d.ts.map +0 -1
- package/dist/components/UserSearchBox/UserSearchBoxV2.js +0 -144
- package/dist/components/UserSearchBox/UserSearchBoxV2.js.map +0 -1
- package/dist/node_modules/.pnpm/base64-js@1.5.1/node_modules/base64-js/index.js +0 -53
- package/dist/node_modules/.pnpm/base64-js@1.5.1/node_modules/base64-js/index.js.map +0 -1
- package/dist/node_modules/.pnpm/buffer@6.0.3/node_modules/buffer/index.js +0 -948
- package/dist/node_modules/.pnpm/buffer@6.0.3/node_modules/buffer/index.js.map +0 -1
- package/dist/node_modules/.pnpm/ieee754@1.2.1/node_modules/ieee754/index.js +0 -30
- package/dist/node_modules/.pnpm/ieee754@1.2.1/node_modules/ieee754/index.js.map +0 -1
- package/dist/node_modules/.pnpm/vite-plugin-node-polyfills@0.17.0_rollup@4.55.1_vite@7.3.1_@types_node@22.19.13_sass@1._2da6e8f78437c36f3eb7db51bdd4d89e/node_modules/vite-plugin-node-polyfills/shims/dist/index.js +0 -15
- package/dist/node_modules/.pnpm/vite-plugin-node-polyfills@0.17.0_rollup@4.55.1_vite@7.3.1_@types_node@22.19.13_sass@1._2da6e8f78437c36f3eb7db51bdd4d89e/node_modules/vite-plugin-node-polyfills/shims/dist/index.js.map +0 -1
- package/dist/style/components/_download-cart-page.scss +0 -204
- package/dist/style/components/_user-search-box.scss +0 -30
|
@@ -4,7 +4,7 @@ import * as R from "../../../synapse-client/SynapseClient.js";
|
|
|
4
4
|
import "@sage-bionetworks/synapse-client/generated/models/ErrorResponseCode";
|
|
5
5
|
import "@sage-bionetworks/synapse-client/generated/models/TwoFactorAuthErrorResponse";
|
|
6
6
|
import "@sage-bionetworks/synapse-client/util/SynapseClientError";
|
|
7
|
-
import { ColumnTypeEnum as
|
|
7
|
+
import { ColumnTypeEnum as y } from "@sage-bionetworks/synapse-types";
|
|
8
8
|
import "../../../utils/functions/EntityTypeUtils.js";
|
|
9
9
|
import { VALUE_NOT_SET as L, FRIENDLY_VALUE_NOT_SET as _ } from "../../../utils/SynapseConstants.js";
|
|
10
10
|
import "lodash-es";
|
|
@@ -18,9 +18,9 @@ import "@tanstack/query-core";
|
|
|
18
18
|
import "lodash-es/isEmpty";
|
|
19
19
|
import "lodash-es/isEqual";
|
|
20
20
|
import "lodash-es/xorWith";
|
|
21
|
-
import { Stack as k, InputLabel as P, Tooltip as $, Box as H, Select as
|
|
21
|
+
import { Stack as k, InputLabel as P, Tooltip as $, Box as H, Select as K, MenuItem as B } from "@mui/material";
|
|
22
22
|
import "@sage-bionetworks/synapse-client";
|
|
23
|
-
import { getCorrespondingColumnForFacet as
|
|
23
|
+
import { getCorrespondingColumnForFacet as T } from "../../../utils/functions/queryUtils.js";
|
|
24
24
|
import "../../../utils/hooks/useCookiePreferences.js";
|
|
25
25
|
import "../../../utils/hooks/useSourceAppConfigs.js";
|
|
26
26
|
import "universal-cookie";
|
|
@@ -71,28 +71,28 @@ async function oe(o, m, i, t, c) {
|
|
|
71
71
|
_
|
|
72
72
|
);
|
|
73
73
|
const b = e.map((l) => l.value).filter((l) => l !== L);
|
|
74
|
-
if (r ===
|
|
74
|
+
if (r === y.ENTITYID || r === y.ENTITYID_LIST) {
|
|
75
75
|
const l = await R.getEntityHeadersByIds(
|
|
76
76
|
b,
|
|
77
77
|
u
|
|
78
78
|
);
|
|
79
|
-
for (const
|
|
80
|
-
s.set(
|
|
81
|
-
} else if (r ===
|
|
79
|
+
for (const I of l.results)
|
|
80
|
+
s.set(I.id, I.name);
|
|
81
|
+
} else if (r === y.USERID || r === y.USERID_LIST) {
|
|
82
82
|
const l = await R.getGroupHeadersBatch(
|
|
83
83
|
b,
|
|
84
84
|
u
|
|
85
85
|
);
|
|
86
|
-
for (const
|
|
87
|
-
s.set(
|
|
86
|
+
for (const I of l.children)
|
|
87
|
+
s.set(I.ownerId, I.userName);
|
|
88
88
|
}
|
|
89
89
|
return e.map((l) => ({
|
|
90
90
|
facet: l,
|
|
91
|
-
label:
|
|
92
|
-
truncatedLabel:
|
|
91
|
+
label: A(l, !1, s),
|
|
92
|
+
truncatedLabel: A(l, !0, s),
|
|
93
93
|
count: l.count
|
|
94
94
|
}));
|
|
95
|
-
},
|
|
95
|
+
}, A = (e, r, u) => {
|
|
96
96
|
let s = u.get(e.value) ?? e.value;
|
|
97
97
|
return r && (s = X(s, te)), s;
|
|
98
98
|
}, f = await d(
|
|
@@ -101,23 +101,23 @@ async function oe(o, m, i, t, c) {
|
|
|
101
101
|
c
|
|
102
102
|
), g = f.map((e) => e.truncatedLabel), S = o.facetValues.some(
|
|
103
103
|
(e) => e.isSelected
|
|
104
|
-
) ? o.facetValues.map(
|
|
104
|
+
), x = S ? o.facetValues.map(
|
|
105
105
|
(e, r) => e.isSelected ? a[r] : a[r].replace("rgb(", "rgba(").replace(")", ", 0.25)")
|
|
106
|
-
) : a,
|
|
106
|
+
) : a, v = o.facetValues.map(
|
|
107
107
|
(e) => e.count
|
|
108
108
|
);
|
|
109
109
|
let C;
|
|
110
110
|
t === "BAR" ? C = o.facetValues.map(
|
|
111
111
|
(e) => f.find((r) => r.facet === e)?.label ?? e.value
|
|
112
|
-
) : t === "STACKED_HORIZONTAL_BAR" && (C =
|
|
113
|
-
let
|
|
114
|
-
t === "BAR" ?
|
|
112
|
+
) : t === "STACKED_HORIZONTAL_BAR" && (C = v);
|
|
113
|
+
let E;
|
|
114
|
+
t === "BAR" ? E = o.facetValues.map((e) => e.count) : t === "STACKED_HORIZONTAL_BAR" && (E = Array(C?.length).fill("Proportional"));
|
|
115
115
|
const h = {
|
|
116
|
-
values: t === "PIE" ?
|
|
116
|
+
values: t === "PIE" ? v : void 0,
|
|
117
117
|
labels: f.map((e) => e.label),
|
|
118
118
|
text: g,
|
|
119
119
|
x: C,
|
|
120
|
-
y:
|
|
120
|
+
y: E,
|
|
121
121
|
orientation: t === "STACKED_HORIZONTAL_BAR" ? "h" : "v",
|
|
122
122
|
// @ts-expect-error
|
|
123
123
|
facetEnumerationValues: o.facetValues.map(
|
|
@@ -131,9 +131,12 @@ async function oe(o, m, i, t, c) {
|
|
|
131
131
|
pull: t === "PIE" ? o.facetValues.map(
|
|
132
132
|
(e) => e.isSelected ? 0.1 : 0
|
|
133
133
|
) : void 0,
|
|
134
|
+
selectedpoints: S ? o.facetValues.map((e, r) => e.isSelected ? r : -1).filter((e) => e !== -1) : void 0,
|
|
135
|
+
selected: { marker: { opacity: 1 } },
|
|
136
|
+
unselected: { marker: { opacity: 0.25 } },
|
|
134
137
|
marker: {
|
|
135
|
-
colors: t === "PIE" ?
|
|
136
|
-
color: t === "PIE" ? void 0 :
|
|
138
|
+
colors: t === "PIE" ? x : void 0,
|
|
139
|
+
color: t === "PIE" ? void 0 : x
|
|
137
140
|
}
|
|
138
141
|
};
|
|
139
142
|
return {
|
|
@@ -188,12 +191,12 @@ function ie(o) {
|
|
|
188
191
|
index: c,
|
|
189
192
|
facetToPlot: a,
|
|
190
193
|
plotType: d,
|
|
191
|
-
onSetPlotType:
|
|
192
|
-
} = o, { accessToken: f } = V(), { data: g, isLoading:
|
|
194
|
+
onSetPlotType: A
|
|
195
|
+
} = o, { accessToken: f } = V(), { data: g, isLoading: S } = Y(), [x, v] = ee(), { getColumnDisplayName: C } = z(), [E, h] = F(!1), w = C(
|
|
193
196
|
a.columnName,
|
|
194
197
|
a.jsonPath
|
|
195
198
|
), e = M(
|
|
196
|
-
() =>
|
|
199
|
+
() => T(
|
|
197
200
|
a,
|
|
198
201
|
g?.columnModels ?? []
|
|
199
202
|
),
|
|
@@ -218,11 +221,11 @@ function ie(o) {
|
|
|
218
221
|
}), s = /* @__PURE__ */ p(N, { fullWidth: !0, children: [
|
|
219
222
|
/* @__PURE__ */ n(P, { children: "Chart Type" }),
|
|
220
223
|
/* @__PURE__ */ p(
|
|
221
|
-
|
|
224
|
+
K,
|
|
222
225
|
{
|
|
223
226
|
value: d,
|
|
224
227
|
onChange: (b) => {
|
|
225
|
-
|
|
228
|
+
A(b.target.value);
|
|
226
229
|
},
|
|
227
230
|
children: [
|
|
228
231
|
/* @__PURE__ */ n(B, { value: "BAR", children: "Bar Chart" }),
|
|
@@ -231,11 +234,11 @@ function ie(o) {
|
|
|
231
234
|
}
|
|
232
235
|
)
|
|
233
236
|
] });
|
|
234
|
-
return !g &&
|
|
237
|
+
return !g && S || !a || !e ? /* @__PURE__ */ n("div", { className: "SRC-loadingContainer SRC-centerContentColumn", children: j }) : /* @__PURE__ */ p(D, { children: [
|
|
235
238
|
/* @__PURE__ */ n(
|
|
236
239
|
Q,
|
|
237
240
|
{
|
|
238
|
-
open:
|
|
241
|
+
open: E,
|
|
239
242
|
onCancel: () => h(!1),
|
|
240
243
|
title: w ?? "",
|
|
241
244
|
content: /* @__PURE__ */ n(ie, { ...o, isModalView: !0 }),
|
|
@@ -255,7 +258,7 @@ function ie(o) {
|
|
|
255
258
|
G,
|
|
256
259
|
{
|
|
257
260
|
data: g,
|
|
258
|
-
isLoading:
|
|
261
|
+
isLoading: S,
|
|
259
262
|
title: w,
|
|
260
263
|
facetToPlot: a,
|
|
261
264
|
onHide: m,
|
|
@@ -304,20 +307,20 @@ function ie(o) {
|
|
|
304
307
|
role: "graphics-object",
|
|
305
308
|
className: "FacetNavPanel__body",
|
|
306
309
|
children: [
|
|
307
|
-
/* @__PURE__ */ n("div", { ref:
|
|
310
|
+
/* @__PURE__ */ n("div", { ref: v, children: /* @__PURE__ */ n(
|
|
308
311
|
U,
|
|
309
312
|
{
|
|
310
313
|
layout: ae,
|
|
311
314
|
data: u?.data ?? [],
|
|
312
315
|
style: ne(
|
|
313
|
-
|
|
316
|
+
x?.width,
|
|
314
317
|
d,
|
|
315
318
|
i ? 300 : 150
|
|
316
319
|
),
|
|
317
320
|
config: { displayModeBar: !1 },
|
|
318
321
|
onClick: (b) => re(b, a, t)
|
|
319
322
|
},
|
|
320
|
-
`${a.columnName}-${a.jsonPath}-${d}-${
|
|
323
|
+
`${a.columnName}-${a.jsonPath}-${d}-${x?.width}`
|
|
321
324
|
) }),
|
|
322
325
|
/* @__PURE__ */ n(
|
|
323
326
|
W,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FacetNavPanel.js","sources":["../../../../src/components/widgets/facet-nav/FacetNavPanel.tsx"],"sourcesContent":["import StyledFormControl from '@/components/styled/StyledFormControl'\nimport SynapseClient from '@/synapse-client'\nimport { SynapseConstants } from '@/utils'\nimport { useSynapseContext } from '@/utils/context/SynapseContext'\nimport { getCorrespondingColumnForFacet } from '@/utils/functions/queryUtils'\nimport { InfoOutlined } from '@mui/icons-material'\nimport {\n Box,\n InputLabel,\n MenuItem,\n Select,\n Stack,\n Tooltip,\n} from '@mui/material'\nimport {\n ColumnTypeEnum,\n FacetColumnRequest,\n FacetColumnResultValueCount,\n FacetColumnResultValues,\n} from '@sage-bionetworks/synapse-types'\nimport { useQuery } from '@tanstack/react-query'\nimport type Plotly from 'plotly.js-basic-dist'\nimport { useMemo, useState } from 'react'\nimport { getContrastColorPalette } from '../../ColorGradient/ColorGradient'\nimport { ConfirmationDialog } from '../../ConfirmationDialog/ConfirmationDialog'\nimport loadingScreen from '../../LoadingScreen/LoadingScreen'\nimport Plot from '../../Plot/Plot'\nimport PlotPanelHeader from '../../Plot/PlotPanelHeader'\nimport { useQueryVisualizationContext } from '../../QueryVisualizationWrapper'\nimport { useGetQueryMetadata } from '../../QueryWrapper/useGetQueryMetadata'\nimport { EnumFacetFilter } from '../query-filter/EnumFacetFilter/EnumFacetFilter'\nimport { FacetPlotLegendList } from './FacetPlotLegendList'\nimport { FacetWithLabel, truncate } from './FacetPlotLegendUtils'\nimport { useMeasure } from '@react-hookz/web'\n\nexport type FacetNavPanelProps = {\n applyChangesToGraphSlice: (\n facet: FacetColumnResultValues,\n value: FacetColumnResultValueCount | undefined,\n isSelected: boolean,\n ) => void\n applyChangesToFacetFilter: (facets: FacetColumnRequest[]) => void\n index: number\n facetToPlot: FacetColumnResultValues\n plotType: PlotType\n onSetPlotType: (plotType: PlotType) => void\n onHide: () => void\n isModalView: boolean\n onCloseModal?: () => void\n}\n\nconst maxLabelLength: number = 19\n\n// STACKED_HORIZONTAL_BAR corresponds to a bar chart where we just want to show the proportion (like a pie chart)\nexport type PlotType = 'PIE' | 'BAR' | 'STACKED_HORIZONTAL_BAR'\n\nconst layout: Partial<Plotly.Layout> = {\n showlegend: false,\n annotations: [],\n margin: { l: 0, r: 0, b: 0, t: 0, pad: 0 },\n yaxis: {\n visible: false,\n showgrid: false,\n },\n xaxis: {\n visible: false,\n showgrid: false,\n },\n}\n\nexport type GraphData = {\n data: Plotly.Data[]\n labels: FacetWithLabel[]\n colors: string[]\n}\n\nexport async function extractPlotDataArray(\n facetToPlot: FacetColumnResultValues,\n columnType: ColumnTypeEnum | undefined,\n index: number,\n plotType: PlotType,\n accessToken?: string,\n) {\n const colorPalette = getContrastColorPalette(\n // Use only the odd palette, using the same offset for all plots until palettes are improved.\n // See PORTALS-2916\n 'odd', // index % 2 === 0 ? 'even' : 'odd',\n 0, // Math.floor(index / 2),\n facetToPlot.facetValues.length,\n )\n\n const getLabels = async (\n facetValues: FacetColumnResultValueCount[],\n columnType?: ColumnTypeEnum,\n accessToken?: string,\n ) => {\n const map = new Map<string, string>()\n map.set(\n SynapseConstants.VALUE_NOT_SET,\n SynapseConstants.FRIENDLY_VALUE_NOT_SET,\n )\n // Filter out empties\n const filteredValues = facetValues\n .map(value => value.value)\n .filter(val => val !== SynapseConstants.VALUE_NOT_SET)\n if (\n columnType === ColumnTypeEnum.ENTITYID ||\n columnType === ColumnTypeEnum.ENTITYID_LIST\n ) {\n // TODO: Pagination\n const response = await SynapseClient.getEntityHeadersByIds(\n filteredValues,\n accessToken,\n )\n for (const header of response.results) {\n map.set(header.id, header.name)\n }\n } else if (\n columnType === ColumnTypeEnum.USERID ||\n columnType === ColumnTypeEnum.USERID_LIST\n ) {\n const response = await SynapseClient.getGroupHeadersBatch(\n filteredValues,\n accessToken,\n )\n for (const header of response.children) {\n map.set(header.ownerId, header.userName)\n }\n }\n\n return facetValues.map(facetValue => ({\n facet: facetValue,\n label: getLabel(facetValue, false, map),\n truncatedLabel: getLabel(facetValue, true, map),\n count: facetValue.count,\n }))\n }\n\n const getLabel = (\n facetValue: FacetColumnResultValueCount,\n truncateFlag: boolean,\n labelMap: Map<string, string>,\n ): string => {\n let label = labelMap.get(facetValue.value) ?? facetValue.value\n if (truncateFlag) {\n label = truncate(label, maxLabelLength)!\n }\n return label\n }\n\n const labels = await getLabels(\n facetToPlot.facetValues,\n columnType,\n accessToken,\n )\n const text = labels.map(el => el.truncatedLabel)\n\n const anyFacetsSelected = facetToPlot.facetValues.some(\n value => value.isSelected,\n )\n\n const selectionAwareColorPalette = anyFacetsSelected\n ? facetToPlot.facetValues.map((facetValue, index) =>\n facetValue.isSelected\n ? colorPalette[index]\n : colorPalette[index]\n .replace('rgb(', 'rgba(')\n .replace(')', ', 0.25)'),\n )\n : colorPalette\n\n const counts: Plotly.Datum[] = facetToPlot.facetValues.map(\n facet => facet.count,\n )\n let x: Plotly.Datum[] | Plotly.Datum[][] | Plotly.TypedArray | undefined\n\n if (plotType === 'BAR') {\n x = facetToPlot.facetValues.map(\n facet =>\n labels.find(label => label.facet === facet)?.label ?? facet.value,\n )\n } else if (plotType === 'STACKED_HORIZONTAL_BAR') {\n x = counts\n }\n\n let y: Plotly.Datum[] | Plotly.Datum[][] | Plotly.TypedArray | undefined\n if (plotType === 'BAR') {\n y = facetToPlot.facetValues.map(facet => facet.count)\n } else if (plotType === 'STACKED_HORIZONTAL_BAR') {\n y = Array(x?.length).fill('Proportional') // single value for every x value\n }\n\n const singleChartData: Plotly.Data = {\n values: plotType === 'PIE' ? counts : undefined,\n labels: labels.map(el => el.label),\n text,\n x,\n y,\n orientation: plotType === 'STACKED_HORIZONTAL_BAR' ? 'h' : 'v',\n // @ts-expect-error\n facetEnumerationValues: facetToPlot.facetValues.map(\n facetValue => facetValue.value,\n ),\n name: facetToPlot.columnName,\n textposition:\n plotType === 'STACKED_HORIZONTAL_BAR' || plotType === 'BAR'\n ? 'none'\n : 'inside',\n hovertemplate:\n plotType === 'PIE'\n ? '<b>%{text}</b><br>%{value} (%{percent})<br><extra></extra>'\n : '<b>%{text}: </b><br>%{value} <br><extra></extra>',\n textinfo: 'none',\n type: plotType === 'PIE' ? 'pie' : 'bar',\n pull:\n plotType === 'PIE'\n ? facetToPlot.facetValues.map(facetValue =>\n facetValue.isSelected ? 0.1 : 0,\n )\n : undefined,\n marker: {\n colors: plotType === 'PIE' ? selectionAwareColorPalette : undefined,\n color: plotType === 'PIE' ? undefined : selectionAwareColorPalette,\n },\n }\n const result = {\n data: [singleChartData],\n labels,\n colors:\n plotType === 'PIE'\n ? ((singleChartData as any).marker?.colors as string[])\n : ((singleChartData as any).marker?.color as string[]),\n }\n return result\n}\n\nconst applyFacetFilter = (\n event: Plotly.PlotMouseEvent,\n allFacetValues: FacetColumnResultValues,\n callbackApplyFn: FacetNavPanelProps['applyChangesToGraphSlice'],\n) => {\n if (event.points && event.points[0]) {\n const plotPointData: any = event.points[0]\n const facetValueClickedValue =\n plotPointData.data.facetEnumerationValues[plotPointData.pointNumber]\n const facetValueClicked = allFacetValues.facetValues.find(\n facet => facet.value === facetValueClickedValue,\n )\n callbackApplyFn(\n allFacetValues,\n facetValueClicked,\n !facetValueClicked!.isSelected,\n )\n }\n}\n\nexport function getPlotStyle(\n parentWidth: number | null | undefined,\n plotType: PlotType,\n maxHeight: number,\n): { width: string; height: string } {\n if (parentWidth != undefined) {\n let quotient = 1\n switch (plotType) {\n case 'BAR':\n quotient = 0.8\n break\n case 'PIE':\n quotient = 0.6\n break\n case 'STACKED_HORIZONTAL_BAR':\n quotient = 1\n break\n }\n const width = parentWidth ? parentWidth * quotient : 200\n let height = plotType === 'PIE' ? width : width / 3\n // max height of .PlotsContainer row col* is 200px, so the effective plot height max is around 150 unless it's expanded\n if (height > maxHeight) {\n height = maxHeight\n }\n return {\n width: `${width}px`,\n height: `${height}px`,\n }\n }\n //else parent width is undefined\n return {\n width: '100%',\n height: `${maxHeight}px`,\n }\n}\n\nfunction FacetNavPanel(props: FacetNavPanelProps) {\n const {\n onHide,\n isModalView,\n applyChangesToGraphSlice,\n index,\n facetToPlot,\n plotType,\n onSetPlotType,\n } = props\n const { accessToken } = useSynapseContext()\n const { data: queryMetadata, isLoading: isLoadingQueryMetadata } =\n useGetQueryMetadata()\n\n const [plotContainerMeasurements, plotContainerRef] =\n useMeasure<HTMLDivElement>()\n const { getColumnDisplayName } = useQueryVisualizationContext()\n\n const [showModal, setShowModal] = useState(false)\n\n const plotTitle = getColumnDisplayName(\n facetToPlot.columnName,\n facetToPlot.jsonPath,\n )\n\n const columnModel = useMemo(\n () =>\n getCorrespondingColumnForFacet(\n facetToPlot,\n queryMetadata?.columnModels ?? [],\n ),\n [queryMetadata?.columnModels, facetToPlot],\n )\n const columnType = columnModel?.columnType as ColumnTypeEnum\n\n const { data: plotData } = useQuery({\n queryKey: [\n 'extractPlotDataArray',\n facetToPlot,\n columnType,\n index,\n plotType,\n accessToken,\n ],\n\n queryFn: () =>\n extractPlotDataArray(\n facetToPlot,\n columnType,\n index,\n plotType,\n accessToken,\n ),\n\n enabled: !!facetToPlot,\n })\n\n /* rendering functions */\n const chartSelectionToggle = (\n <StyledFormControl fullWidth>\n <InputLabel>Chart Type</InputLabel>\n <Select\n value={plotType}\n onChange={e => {\n onSetPlotType(e.target.value as PlotType)\n }}\n >\n <MenuItem value={'BAR'}>Bar Chart</MenuItem>\n <MenuItem value={'PIE'}>Pie Chart</MenuItem>\n </Select>\n </StyledFormControl>\n )\n\n if (\n (!queryMetadata && isLoadingQueryMetadata) ||\n !facetToPlot ||\n !columnModel\n ) {\n return (\n <div className=\"SRC-loadingContainer SRC-centerContentColumn\">\n {loadingScreen}\n </div>\n )\n } else {\n return (\n <>\n <ConfirmationDialog\n open={showModal}\n onCancel={() => setShowModal(false)}\n title={plotTitle ?? ''}\n content={<FacetNavPanel {...props} isModalView={true} />}\n hasCancelButton={false}\n confirmButtonProps={{ children: 'Apply Filters' }}\n onConfirm={() => setShowModal(false)}\n maxWidth={'md'}\n />\n <div\n role=\"figure\"\n className={`FacetNavPanel${isModalView ? '--expanded' : ''}`}\n >\n {!isModalView && (\n <PlotPanelHeader\n data={queryMetadata}\n isLoading={isLoadingQueryMetadata}\n title={plotTitle}\n facetToPlot={facetToPlot}\n onHide={onHide}\n setShowModal={setShowModal}\n />\n )}\n {isModalView && (\n <Stack\n sx={{\n gap: 2,\n }}\n >\n <StyledFormControl>\n <InputLabel\n sx={{ display: 'flex', alignItems: 'center', gap: 0.5 }}\n >\n <span>Filter All Data By</span>\n <Tooltip title=\"Selecting items in this dropdown will affect all facets on the Explore page.\">\n <InfoOutlined className=\"SRC-hand-cursor SRC-secondary-text-color\" />\n </Tooltip>\n </InputLabel>\n <EnumFacetFilter\n facet={facetToPlot}\n containerAs=\"Dropdown\"\n dropdownType=\"SelectBox\"\n />\n </StyledFormControl>\n {chartSelectionToggle}\n </Stack>\n )}\n <Box\n sx={{\n display: 'grid',\n gridTemplateColumns: '50% 50%',\n alignItems: 'center',\n }}\n role=\"graphics-object\"\n className=\"FacetNavPanel__body\"\n >\n <div ref={plotContainerRef}>\n <Plot\n key={`${facetToPlot.columnName}-${facetToPlot.jsonPath}-${plotType}-${plotContainerMeasurements?.width}`}\n layout={layout}\n data={plotData?.data ?? []}\n style={getPlotStyle(\n plotContainerMeasurements?.width,\n plotType,\n isModalView ? 300 : 150,\n )}\n config={{ displayModeBar: false }}\n onClick={evt =>\n applyFacetFilter(evt, facetToPlot, applyChangesToGraphSlice)\n }\n />\n </div>\n <FacetPlotLegendList\n labels={plotData?.labels}\n colors={plotData?.colors}\n isExpanded={isModalView}\n />\n </Box>\n </div>\n </>\n )\n }\n}\n\nexport default FacetNavPanel\n"],"names":["maxLabelLength","layout","extractPlotDataArray","facetToPlot","columnType","index","plotType","accessToken","colorPalette","getContrastColorPalette","getLabels","facetValues","map","SynapseConstants.VALUE_NOT_SET","SynapseConstants.FRIENDLY_VALUE_NOT_SET","filteredValues","value","val","ColumnTypeEnum","response","SynapseClient","header","facetValue","getLabel","truncateFlag","labelMap","label","truncate","labels","text","el","selectionAwareColorPalette","counts","facet","x","y","singleChartData","applyFacetFilter","event","allFacetValues","callbackApplyFn","plotPointData","facetValueClickedValue","facetValueClicked","getPlotStyle","parentWidth","maxHeight","quotient","width","height","FacetNavPanel","props","onHide","isModalView","applyChangesToGraphSlice","onSetPlotType","useSynapseContext","queryMetadata","isLoadingQueryMetadata","useGetQueryMetadata","plotContainerMeasurements","plotContainerRef","useMeasure","getColumnDisplayName","useQueryVisualizationContext","showModal","setShowModal","useState","plotTitle","columnModel","useMemo","getCorrespondingColumnForFacet","plotData","useQuery","chartSelectionToggle","jsxs","StyledFormControl","jsx","InputLabel","Select","e","MenuItem","loadingScreen","Fragment","ConfirmationDialog","PlotPanelHeader","Stack","Tooltip","InfoOutlined","EnumFacetFilter","Box","Plot","evt","FacetPlotLegendList"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"FacetNavPanel.js","sources":["../../../../src/components/widgets/facet-nav/FacetNavPanel.tsx"],"sourcesContent":["import StyledFormControl from '@/components/styled/StyledFormControl'\nimport SynapseClient from '@/synapse-client'\nimport { SynapseConstants } from '@/utils'\nimport { useSynapseContext } from '@/utils/context/SynapseContext'\nimport { getCorrespondingColumnForFacet } from '@/utils/functions/queryUtils'\nimport { InfoOutlined } from '@mui/icons-material'\nimport {\n Box,\n InputLabel,\n MenuItem,\n Select,\n Stack,\n Tooltip,\n} from '@mui/material'\nimport {\n ColumnTypeEnum,\n FacetColumnRequest,\n FacetColumnResultValueCount,\n FacetColumnResultValues,\n} from '@sage-bionetworks/synapse-types'\nimport { useQuery } from '@tanstack/react-query'\nimport type Plotly from 'plotly.js-basic-dist'\nimport { useMemo, useState } from 'react'\nimport { getContrastColorPalette } from '../../ColorGradient/ColorGradient'\nimport { ConfirmationDialog } from '../../ConfirmationDialog/ConfirmationDialog'\nimport loadingScreen from '../../LoadingScreen/LoadingScreen'\nimport Plot from '../../Plot/Plot'\nimport PlotPanelHeader from '../../Plot/PlotPanelHeader'\nimport { useQueryVisualizationContext } from '../../QueryVisualizationWrapper'\nimport { useGetQueryMetadata } from '../../QueryWrapper/useGetQueryMetadata'\nimport { EnumFacetFilter } from '../query-filter/EnumFacetFilter/EnumFacetFilter'\nimport { FacetPlotLegendList } from './FacetPlotLegendList'\nimport { FacetWithLabel, truncate } from './FacetPlotLegendUtils'\nimport { useMeasure } from '@react-hookz/web'\n\nexport type FacetNavPanelProps = {\n applyChangesToGraphSlice: (\n facet: FacetColumnResultValues,\n value: FacetColumnResultValueCount | undefined,\n isSelected: boolean,\n ) => void\n applyChangesToFacetFilter: (facets: FacetColumnRequest[]) => void\n index: number\n facetToPlot: FacetColumnResultValues\n plotType: PlotType\n onSetPlotType: (plotType: PlotType) => void\n onHide: () => void\n isModalView: boolean\n onCloseModal?: () => void\n}\n\nconst maxLabelLength: number = 19\n\n// STACKED_HORIZONTAL_BAR corresponds to a bar chart where we just want to show the proportion (like a pie chart)\nexport type PlotType = 'PIE' | 'BAR' | 'STACKED_HORIZONTAL_BAR'\n\nconst layout: Partial<Plotly.Layout> = {\n showlegend: false,\n annotations: [],\n margin: { l: 0, r: 0, b: 0, t: 0, pad: 0 },\n yaxis: {\n visible: false,\n showgrid: false,\n },\n xaxis: {\n visible: false,\n showgrid: false,\n },\n}\n\nexport type GraphData = {\n data: Plotly.Data[]\n labels: FacetWithLabel[]\n colors: string[]\n}\n\nexport async function extractPlotDataArray(\n facetToPlot: FacetColumnResultValues,\n columnType: ColumnTypeEnum | undefined,\n index: number,\n plotType: PlotType,\n accessToken?: string,\n) {\n const colorPalette = getContrastColorPalette(\n // Use only the odd palette, using the same offset for all plots until palettes are improved.\n // See PORTALS-2916\n 'odd', // index % 2 === 0 ? 'even' : 'odd',\n 0, // Math.floor(index / 2),\n facetToPlot.facetValues.length,\n )\n\n const getLabels = async (\n facetValues: FacetColumnResultValueCount[],\n columnType?: ColumnTypeEnum,\n accessToken?: string,\n ) => {\n const map = new Map<string, string>()\n map.set(\n SynapseConstants.VALUE_NOT_SET,\n SynapseConstants.FRIENDLY_VALUE_NOT_SET,\n )\n // Filter out empties\n const filteredValues = facetValues\n .map(value => value.value)\n .filter(val => val !== SynapseConstants.VALUE_NOT_SET)\n if (\n columnType === ColumnTypeEnum.ENTITYID ||\n columnType === ColumnTypeEnum.ENTITYID_LIST\n ) {\n // TODO: Pagination\n const response = await SynapseClient.getEntityHeadersByIds(\n filteredValues,\n accessToken,\n )\n for (const header of response.results) {\n map.set(header.id, header.name)\n }\n } else if (\n columnType === ColumnTypeEnum.USERID ||\n columnType === ColumnTypeEnum.USERID_LIST\n ) {\n const response = await SynapseClient.getGroupHeadersBatch(\n filteredValues,\n accessToken,\n )\n for (const header of response.children) {\n map.set(header.ownerId, header.userName)\n }\n }\n\n return facetValues.map(facetValue => ({\n facet: facetValue,\n label: getLabel(facetValue, false, map),\n truncatedLabel: getLabel(facetValue, true, map),\n count: facetValue.count,\n }))\n }\n\n const getLabel = (\n facetValue: FacetColumnResultValueCount,\n truncateFlag: boolean,\n labelMap: Map<string, string>,\n ): string => {\n let label = labelMap.get(facetValue.value) ?? facetValue.value\n if (truncateFlag) {\n label = truncate(label, maxLabelLength)!\n }\n return label\n }\n\n const labels = await getLabels(\n facetToPlot.facetValues,\n columnType,\n accessToken,\n )\n const text = labels.map(el => el.truncatedLabel)\n\n const anyFacetsSelected = facetToPlot.facetValues.some(\n value => value.isSelected,\n )\n const selectionAwareColorPalette = anyFacetsSelected\n ? facetToPlot.facetValues.map((facetValue, index) =>\n facetValue.isSelected\n ? colorPalette[index]\n : colorPalette[index]\n .replace('rgb(', 'rgba(')\n .replace(')', ', 0.25)'),\n )\n : colorPalette\n const counts: Plotly.Datum[] = facetToPlot.facetValues.map(\n facet => facet.count,\n )\n let x: Plotly.Datum[] | Plotly.Datum[][] | Plotly.TypedArray | undefined\n\n if (plotType === 'BAR') {\n x = facetToPlot.facetValues.map(\n facet =>\n labels.find(label => label.facet === facet)?.label ?? facet.value,\n )\n } else if (plotType === 'STACKED_HORIZONTAL_BAR') {\n x = counts\n }\n\n let y: Plotly.Datum[] | Plotly.Datum[][] | Plotly.TypedArray | undefined\n if (plotType === 'BAR') {\n y = facetToPlot.facetValues.map(facet => facet.count)\n } else if (plotType === 'STACKED_HORIZONTAL_BAR') {\n y = Array(x?.length).fill('Proportional') // single value for every x value\n }\n\n const singleChartData: Plotly.Data = {\n values: plotType === 'PIE' ? counts : undefined,\n labels: labels.map(el => el.label),\n text,\n x,\n y,\n orientation: plotType === 'STACKED_HORIZONTAL_BAR' ? 'h' : 'v',\n // @ts-expect-error\n facetEnumerationValues: facetToPlot.facetValues.map(\n facetValue => facetValue.value,\n ),\n name: facetToPlot.columnName,\n textposition:\n plotType === 'STACKED_HORIZONTAL_BAR' || plotType === 'BAR'\n ? 'none'\n : 'inside',\n hovertemplate:\n plotType === 'PIE'\n ? '<b>%{text}</b><br>%{value} (%{percent})<br><extra></extra>'\n : '<b>%{text}: </b><br>%{value} <br><extra></extra>',\n textinfo: 'none',\n type: plotType === 'PIE' ? 'pie' : 'bar',\n pull:\n plotType === 'PIE'\n ? facetToPlot.facetValues.map(facetValue =>\n facetValue.isSelected ? 0.1 : 0,\n )\n : undefined,\n selectedpoints: anyFacetsSelected\n ? facetToPlot.facetValues\n .map((facetValue, index) => (facetValue.isSelected ? index : -1))\n .filter(index => index !== -1)\n : undefined,\n selected: { marker: { opacity: 1 } },\n unselected: { marker: { opacity: 0.25 } },\n\n marker: {\n colors: plotType === 'PIE' ? selectionAwareColorPalette : undefined,\n color: plotType === 'PIE' ? undefined : selectionAwareColorPalette,\n },\n }\n const result = {\n data: [singleChartData],\n labels,\n colors:\n plotType === 'PIE'\n ? ((singleChartData as any).marker?.colors as string[])\n : ((singleChartData as any).marker?.color as string[]),\n }\n return result\n}\n\nconst applyFacetFilter = (\n event: Plotly.PlotMouseEvent,\n allFacetValues: FacetColumnResultValues,\n callbackApplyFn: FacetNavPanelProps['applyChangesToGraphSlice'],\n) => {\n if (event.points && event.points[0]) {\n const plotPointData: any = event.points[0]\n const facetValueClickedValue =\n plotPointData.data.facetEnumerationValues[plotPointData.pointNumber]\n const facetValueClicked = allFacetValues.facetValues.find(\n facet => facet.value === facetValueClickedValue,\n )\n callbackApplyFn(\n allFacetValues,\n facetValueClicked,\n !facetValueClicked!.isSelected,\n )\n }\n}\n\nexport function getPlotStyle(\n parentWidth: number | null | undefined,\n plotType: PlotType,\n maxHeight: number,\n): { width: string; height: string } {\n if (parentWidth != undefined) {\n let quotient = 1\n switch (plotType) {\n case 'BAR':\n quotient = 0.8\n break\n case 'PIE':\n quotient = 0.6\n break\n case 'STACKED_HORIZONTAL_BAR':\n quotient = 1\n break\n }\n const width = parentWidth ? parentWidth * quotient : 200\n let height = plotType === 'PIE' ? width : width / 3\n // max height of .PlotsContainer row col* is 200px, so the effective plot height max is around 150 unless it's expanded\n if (height > maxHeight) {\n height = maxHeight\n }\n return {\n width: `${width}px`,\n height: `${height}px`,\n }\n }\n //else parent width is undefined\n return {\n width: '100%',\n height: `${maxHeight}px`,\n }\n}\n\nfunction FacetNavPanel(props: FacetNavPanelProps) {\n const {\n onHide,\n isModalView,\n applyChangesToGraphSlice,\n index,\n facetToPlot,\n plotType,\n onSetPlotType,\n } = props\n const { accessToken } = useSynapseContext()\n const { data: queryMetadata, isLoading: isLoadingQueryMetadata } =\n useGetQueryMetadata()\n\n const [plotContainerMeasurements, plotContainerRef] =\n useMeasure<HTMLDivElement>()\n const { getColumnDisplayName } = useQueryVisualizationContext()\n\n const [showModal, setShowModal] = useState(false)\n\n const plotTitle = getColumnDisplayName(\n facetToPlot.columnName,\n facetToPlot.jsonPath,\n )\n\n const columnModel = useMemo(\n () =>\n getCorrespondingColumnForFacet(\n facetToPlot,\n queryMetadata?.columnModels ?? [],\n ),\n [queryMetadata?.columnModels, facetToPlot],\n )\n const columnType = columnModel?.columnType as ColumnTypeEnum\n\n const { data: plotData } = useQuery({\n queryKey: [\n 'extractPlotDataArray',\n facetToPlot,\n columnType,\n index,\n plotType,\n accessToken,\n ],\n\n queryFn: () =>\n extractPlotDataArray(\n facetToPlot,\n columnType,\n index,\n plotType,\n accessToken,\n ),\n\n enabled: !!facetToPlot,\n })\n\n /* rendering functions */\n const chartSelectionToggle = (\n <StyledFormControl fullWidth>\n <InputLabel>Chart Type</InputLabel>\n <Select\n value={plotType}\n onChange={e => {\n onSetPlotType(e.target.value as PlotType)\n }}\n >\n <MenuItem value={'BAR'}>Bar Chart</MenuItem>\n <MenuItem value={'PIE'}>Pie Chart</MenuItem>\n </Select>\n </StyledFormControl>\n )\n\n if (\n (!queryMetadata && isLoadingQueryMetadata) ||\n !facetToPlot ||\n !columnModel\n ) {\n return (\n <div className=\"SRC-loadingContainer SRC-centerContentColumn\">\n {loadingScreen}\n </div>\n )\n } else {\n return (\n <>\n <ConfirmationDialog\n open={showModal}\n onCancel={() => setShowModal(false)}\n title={plotTitle ?? ''}\n content={<FacetNavPanel {...props} isModalView={true} />}\n hasCancelButton={false}\n confirmButtonProps={{ children: 'Apply Filters' }}\n onConfirm={() => setShowModal(false)}\n maxWidth={'md'}\n />\n <div\n role=\"figure\"\n className={`FacetNavPanel${isModalView ? '--expanded' : ''}`}\n >\n {!isModalView && (\n <PlotPanelHeader\n data={queryMetadata}\n isLoading={isLoadingQueryMetadata}\n title={plotTitle}\n facetToPlot={facetToPlot}\n onHide={onHide}\n setShowModal={setShowModal}\n />\n )}\n {isModalView && (\n <Stack\n sx={{\n gap: 2,\n }}\n >\n <StyledFormControl>\n <InputLabel\n sx={{ display: 'flex', alignItems: 'center', gap: 0.5 }}\n >\n <span>Filter All Data By</span>\n <Tooltip title=\"Selecting items in this dropdown will affect all facets on the Explore page.\">\n <InfoOutlined className=\"SRC-hand-cursor SRC-secondary-text-color\" />\n </Tooltip>\n </InputLabel>\n <EnumFacetFilter\n facet={facetToPlot}\n containerAs=\"Dropdown\"\n dropdownType=\"SelectBox\"\n />\n </StyledFormControl>\n {chartSelectionToggle}\n </Stack>\n )}\n <Box\n sx={{\n display: 'grid',\n gridTemplateColumns: '50% 50%',\n alignItems: 'center',\n }}\n role=\"graphics-object\"\n className=\"FacetNavPanel__body\"\n >\n <div ref={plotContainerRef}>\n <Plot\n key={`${facetToPlot.columnName}-${facetToPlot.jsonPath}-${plotType}-${plotContainerMeasurements?.width}`}\n layout={layout}\n data={plotData?.data ?? []}\n style={getPlotStyle(\n plotContainerMeasurements?.width,\n plotType,\n isModalView ? 300 : 150,\n )}\n config={{ displayModeBar: false }}\n onClick={evt =>\n applyFacetFilter(evt, facetToPlot, applyChangesToGraphSlice)\n }\n />\n </div>\n <FacetPlotLegendList\n labels={plotData?.labels}\n colors={plotData?.colors}\n isExpanded={isModalView}\n />\n </Box>\n </div>\n </>\n )\n }\n}\n\nexport default FacetNavPanel\n"],"names":["maxLabelLength","layout","extractPlotDataArray","facetToPlot","columnType","index","plotType","accessToken","colorPalette","getContrastColorPalette","getLabels","facetValues","map","SynapseConstants.VALUE_NOT_SET","SynapseConstants.FRIENDLY_VALUE_NOT_SET","filteredValues","value","val","ColumnTypeEnum","response","SynapseClient","header","facetValue","getLabel","truncateFlag","labelMap","label","truncate","labels","text","el","anyFacetsSelected","selectionAwareColorPalette","counts","facet","x","y","singleChartData","applyFacetFilter","event","allFacetValues","callbackApplyFn","plotPointData","facetValueClickedValue","facetValueClicked","getPlotStyle","parentWidth","maxHeight","quotient","width","height","FacetNavPanel","props","onHide","isModalView","applyChangesToGraphSlice","onSetPlotType","useSynapseContext","queryMetadata","isLoadingQueryMetadata","useGetQueryMetadata","plotContainerMeasurements","plotContainerRef","useMeasure","getColumnDisplayName","useQueryVisualizationContext","showModal","setShowModal","useState","plotTitle","columnModel","useMemo","getCorrespondingColumnForFacet","plotData","useQuery","chartSelectionToggle","jsxs","StyledFormControl","jsx","InputLabel","Select","e","MenuItem","loadingScreen","Fragment","ConfirmationDialog","PlotPanelHeader","Stack","Tooltip","InfoOutlined","EnumFacetFilter","Box","Plot","evt","FacetPlotLegendList"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAmDA,MAAMA,KAAyB,IAKzBC,KAAiC;AAAA,EACrC,YAAY;AAAA,EACZ,aAAa,CAAA;AAAA,EACb,QAAQ,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,KAAK,EAAA;AAAA,EACvC,OAAO;AAAA,IACL,SAAS;AAAA,IACT,UAAU;AAAA,EAAA;AAAA,EAEZ,OAAO;AAAA,IACL,SAAS;AAAA,IACT,UAAU;AAAA,EAAA;AAEd;AAQA,eAAsBC,GACpBC,GACAC,GACAC,GACAC,GACAC,GACA;AACA,QAAMC,IAAeC;AAAA;AAAA;AAAA,IAGnB;AAAA;AAAA,IACA;AAAA;AAAA,IACAN,EAAY,YAAY;AAAA,EAAA,GAGpBO,IAAY,OAChBC,GACAP,GACAG,MACG;AACH,UAAMK,wBAAU,IAAA;AAChB,IAAAA,EAAI;AAAA,MACFC;AAAAA,MACAC;AAAAA,IAAiB;AAGnB,UAAMC,IAAiBJ,EACpB,IAAI,CAAAK,MAASA,EAAM,KAAK,EACxB,OAAO,CAAAC,MAAOA,MAAQJ,CAA8B;AACvD,QACET,MAAec,EAAe,YAC9Bd,MAAec,EAAe,eAC9B;AAEA,YAAMC,IAAW,MAAMC,EAAc;AAAA,QACnCL;AAAA,QACAR;AAAAA,MAAA;AAEF,iBAAWc,KAAUF,EAAS;AAC5B,QAAAP,EAAI,IAAIS,EAAO,IAAIA,EAAO,IAAI;AAAA,IAElC,WACEjB,MAAec,EAAe,UAC9Bd,MAAec,EAAe,aAC9B;AACA,YAAMC,IAAW,MAAMC,EAAc;AAAA,QACnCL;AAAA,QACAR;AAAAA,MAAA;AAEF,iBAAWc,KAAUF,EAAS;AAC5B,QAAAP,EAAI,IAAIS,EAAO,SAASA,EAAO,QAAQ;AAAA,IAE3C;AAEA,WAAOV,EAAY,IAAI,CAAAW,OAAe;AAAA,MACpC,OAAOA;AAAA,MACP,OAAOC,EAASD,GAAY,IAAOV,CAAG;AAAA,MACtC,gBAAgBW,EAASD,GAAY,IAAMV,CAAG;AAAA,MAC9C,OAAOU,EAAW;AAAA,IAAA,EAClB;AAAA,EACJ,GAEMC,IAAW,CACfD,GACAE,GACAC,MACW;AACX,QAAIC,IAAQD,EAAS,IAAIH,EAAW,KAAK,KAAKA,EAAW;AACzD,WAAIE,MACFE,IAAQC,EAASD,GAAO1B,EAAc,IAEjC0B;AAAA,EACT,GAEME,IAAS,MAAMlB;AAAA,IACnBP,EAAY;AAAA,IACZC;AAAA,IACAG;AAAA,EAAA,GAEIsB,IAAOD,EAAO,IAAI,CAAAE,MAAMA,EAAG,cAAc,GAEzCC,IAAoB5B,EAAY,YAAY;AAAA,IAChD,OAASa,EAAM;AAAA,EAAA,GAEXgB,IAA6BD,IAC/B5B,EAAY,YAAY;AAAA,IAAI,CAACmB,GAAYjB,MACvCiB,EAAW,aACPd,EAAaH,CAAK,IAClBG,EAAaH,CAAK,EACf,QAAQ,QAAQ,OAAO,EACvB,QAAQ,KAAK,SAAS;AAAA,EAAA,IAE/BG,GACEyB,IAAyB9B,EAAY,YAAY;AAAA,IACrD,OAAS+B,EAAM;AAAA,EAAA;AAEjB,MAAIC;AAEJ,EAAI7B,MAAa,QACf6B,IAAIhC,EAAY,YAAY;AAAA,IAC1B,CAAA+B,MACEN,EAAO,KAAK,CAAAF,MAASA,EAAM,UAAUQ,CAAK,GAAG,SAASA,EAAM;AAAA,EAAA,IAEvD5B,MAAa,6BACtB6B,IAAIF;AAGN,MAAIG;AACJ,EAAI9B,MAAa,QACf8B,IAAIjC,EAAY,YAAY,IAAI,CAAA+B,MAASA,EAAM,KAAK,IAC3C5B,MAAa,6BACtB8B,IAAI,MAAMD,GAAG,MAAM,EAAE,KAAK,cAAc;AAG1C,QAAME,IAA+B;AAAA,IACnC,QAAQ/B,MAAa,QAAQ2B,IAAS;AAAA,IACtC,QAAQL,EAAO,IAAI,CAAAE,MAAMA,EAAG,KAAK;AAAA,IACjC,MAAAD;AAAA,IACA,GAAAM;AAAA,IACA,GAAAC;AAAA,IACA,aAAa9B,MAAa,2BAA2B,MAAM;AAAA;AAAA,IAE3D,wBAAwBH,EAAY,YAAY;AAAA,MAC9C,OAAcmB,EAAW;AAAA,IAAA;AAAA,IAE3B,MAAMnB,EAAY;AAAA,IAClB,cACEG,MAAa,4BAA4BA,MAAa,QAClD,SACA;AAAA,IACN,eACEA,MAAa,QACT,+DACA;AAAA,IACN,UAAU;AAAA,IACV,MAAMA,MAAa,QAAQ,QAAQ;AAAA,IACnC,MACEA,MAAa,QACTH,EAAY,YAAY;AAAA,MAAI,CAAAmB,MAC1BA,EAAW,aAAa,MAAM;AAAA,IAAA,IAEhC;AAAA,IACN,gBAAgBS,IACZ5B,EAAY,YACT,IAAI,CAACmB,GAAYjB,MAAWiB,EAAW,aAAajB,IAAQ,EAAG,EAC/D,OAAO,CAAAA,MAASA,MAAU,EAAE,IAC/B;AAAA,IACJ,UAAU,EAAE,QAAQ,EAAE,SAAS,IAAE;AAAA,IACjC,YAAY,EAAE,QAAQ,EAAE,SAAS,OAAK;AAAA,IAEtC,QAAQ;AAAA,MACN,QAAQC,MAAa,QAAQ0B,IAA6B;AAAA,MAC1D,OAAO1B,MAAa,QAAQ,SAAY0B;AAAA,IAAA;AAAA,EAC1C;AAUF,SARe;AAAA,IACb,MAAM,CAACK,CAAe;AAAA,IACtB,QAAAT;AAAA,IACA,QACEtB,MAAa,QACP+B,EAAwB,QAAQ,SAChCA,EAAwB,QAAQ;AAAA,EAAA;AAG5C;AAEA,MAAMC,KAAmB,CACvBC,GACAC,GACAC,MACG;AACH,MAAIF,EAAM,UAAUA,EAAM,OAAO,CAAC,GAAG;AACnC,UAAMG,IAAqBH,EAAM,OAAO,CAAC,GACnCI,IACJD,EAAc,KAAK,uBAAuBA,EAAc,WAAW,GAC/DE,IAAoBJ,EAAe,YAAY;AAAA,MACnD,CAAAN,MAASA,EAAM,UAAUS;AAAA,IAAA;AAE3B,IAAAF;AAAA,MACED;AAAA,MACAI;AAAA,MACA,CAACA,EAAmB;AAAA,IAAA;AAAA,EAExB;AACF;AAEO,SAASC,GACdC,GACAxC,GACAyC,GACmC;AACnC,MAAID,KAAe,MAAW;AAC5B,QAAIE,IAAW;AACf,YAAQ1C,GAAA;AAAA,MACN,KAAK;AACH,QAAA0C,IAAW;AACX;AAAA,MACF,KAAK;AACH,QAAAA,IAAW;AACX;AAAA,MACF,KAAK;AACH,QAAAA,IAAW;AACX;AAAA,IAAA;AAEJ,UAAMC,IAAQH,IAAcA,IAAcE,IAAW;AACrD,QAAIE,IAAS5C,MAAa,QAAQ2C,IAAQA,IAAQ;AAElD,WAAIC,IAASH,MACXG,IAASH,IAEJ;AAAA,MACL,OAAO,GAAGE,CAAK;AAAA,MACf,QAAQ,GAAGC,CAAM;AAAA,IAAA;AAAA,EAErB;AAEA,SAAO;AAAA,IACL,OAAO;AAAA,IACP,QAAQ,GAAGH,CAAS;AAAA,EAAA;AAExB;AAEA,SAASI,GAAcC,GAA2B;AAChD,QAAM;AAAA,IACJ,QAAAC;AAAA,IACA,aAAAC;AAAA,IACA,0BAAAC;AAAA,IACA,OAAAlD;AAAA,IACA,aAAAF;AAAA,IACA,UAAAG;AAAA,IACA,eAAAkD;AAAA,EAAA,IACEJ,GACE,EAAE,aAAA7C,EAAA,IAAgBkD,EAAA,GAClB,EAAE,MAAMC,GAAe,WAAWC,EAAA,IACtCC,EAAA,GAEI,CAACC,GAA2BC,CAAgB,IAChDC,GAAA,GACI,EAAE,sBAAAC,EAAA,IAAyBC,EAAA,GAE3B,CAACC,GAAWC,CAAY,IAAIC,EAAS,EAAK,GAE1CC,IAAYL;AAAA,IAChB7D,EAAY;AAAA,IACZA,EAAY;AAAA,EAAA,GAGRmE,IAAcC;AAAA,IAClB,MACEC;AAAA,MACErE;AAAA,MACAuD,GAAe,gBAAgB,CAAA;AAAA,IAAC;AAAA,IAEpC,CAACA,GAAe,cAAcvD,CAAW;AAAA,EAAA,GAErCC,IAAakE,GAAa,YAE1B,EAAE,MAAMG,EAAA,IAAaC,EAAS;AAAA,IAClC,UAAU;AAAA,MACR;AAAA,MACAvE;AAAA,MACAC;AAAA,MACAC;AAAA,MACAC;AAAA,MACAC;AAAA,IAAA;AAAA,IAGF,SAAS,MACPL;AAAA,MACEC;AAAA,MACAC;AAAA,MACAC;AAAA,MACAC;AAAA,MACAC;AAAA,IAAA;AAAA,IAGJ,SAAS,CAAC,CAACJ;AAAA,EAAA,CACZ,GAGKwE,IACJ,gBAAAC,EAACC,GAAA,EAAkB,WAAS,IAC1B,UAAA;AAAA,IAAA,gBAAAC,EAACC,KAAW,UAAA,aAAA,CAAU;AAAA,IACtB,gBAAAH;AAAA,MAACI;AAAA,MAAA;AAAA,QACC,OAAO1E;AAAA,QACP,UAAU,CAAA2E,MAAK;AACb,UAAAzB,EAAcyB,EAAE,OAAO,KAAiB;AAAA,QAC1C;AAAA,QAEA,UAAA;AAAA,UAAA,gBAAAH,EAACI,GAAA,EAAS,OAAO,OAAO,UAAA,aAAS;AAAA,UACjC,gBAAAJ,EAACI,GAAA,EAAS,OAAO,OAAO,UAAA,YAAA,CAAS;AAAA,QAAA;AAAA,MAAA;AAAA,IAAA;AAAA,EACnC,GACF;AAGF,SACG,CAACxB,KAAiBC,KACnB,CAACxD,KACD,CAACmE,IAGC,gBAAAQ,EAAC,OAAA,EAAI,WAAU,gDACZ,UAAAK,GACH,IAIA,gBAAAP,EAAAQ,GAAA,EACE,UAAA;AAAA,IAAA,gBAAAN;AAAA,MAACO;AAAA,MAAA;AAAA,QACC,MAAMnB;AAAA,QACN,UAAU,MAAMC,EAAa,EAAK;AAAA,QAClC,OAAOE,KAAa;AAAA,QACpB,SAAS,gBAAAS,EAAC3B,IAAA,EAAe,GAAGC,GAAO,aAAa,IAAM;AAAA,QACtD,iBAAiB;AAAA,QACjB,oBAAoB,EAAE,UAAU,gBAAA;AAAA,QAChC,WAAW,MAAMe,EAAa,EAAK;AAAA,QACnC,UAAU;AAAA,MAAA;AAAA,IAAA;AAAA,IAEZ,gBAAAS;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,MAAK;AAAA,QACL,WAAW,gBAAgBtB,IAAc,eAAe,EAAE;AAAA,QAEzD,UAAA;AAAA,UAAA,CAACA,KACA,gBAAAwB;AAAA,YAACQ;AAAA,YAAA;AAAA,cACC,MAAM5B;AAAA,cACN,WAAWC;AAAA,cACX,OAAOU;AAAA,cACP,aAAAlE;AAAA,cACA,QAAAkD;AAAA,cACA,cAAAc;AAAA,YAAA;AAAA,UAAA;AAAA,UAGHb,KACC,gBAAAsB;AAAA,YAACW;AAAA,YAAA;AAAA,cACC,IAAI;AAAA,gBACF,KAAK;AAAA,cAAA;AAAA,cAGP,UAAA;AAAA,gBAAA,gBAAAX,EAACC,GAAA,EACC,UAAA;AAAA,kBAAA,gBAAAD;AAAA,oBAACG;AAAA,oBAAA;AAAA,sBACC,IAAI,EAAE,SAAS,QAAQ,YAAY,UAAU,KAAK,IAAA;AAAA,sBAElD,UAAA;AAAA,wBAAA,gBAAAD,EAAC,UAAK,UAAA,qBAAA,CAAkB;AAAA,wBACxB,gBAAAA,EAACU,KAAQ,OAAM,gFACb,4BAACC,GAAA,EAAa,WAAU,4CAA2C,EAAA,CACrE;AAAA,sBAAA;AAAA,oBAAA;AAAA,kBAAA;AAAA,kBAEF,gBAAAX;AAAA,oBAACY;AAAA,oBAAA;AAAA,sBACC,OAAOvF;AAAA,sBACP,aAAY;AAAA,sBACZ,cAAa;AAAA,oBAAA;AAAA,kBAAA;AAAA,gBACf,GACF;AAAA,gBACCwE;AAAA,cAAA;AAAA,YAAA;AAAA,UAAA;AAAA,UAGL,gBAAAC;AAAA,YAACe;AAAA,YAAA;AAAA,cACC,IAAI;AAAA,gBACF,SAAS;AAAA,gBACT,qBAAqB;AAAA,gBACrB,YAAY;AAAA,cAAA;AAAA,cAEd,MAAK;AAAA,cACL,WAAU;AAAA,cAEV,UAAA;AAAA,gBAAA,gBAAAb,EAAC,OAAA,EAAI,KAAKhB,GACR,UAAA,gBAAAgB;AAAA,kBAACc;AAAA,kBAAA;AAAA,oBAEC,QAAA3F;AAAA,oBACA,MAAMwE,GAAU,QAAQ,CAAA;AAAA,oBACxB,OAAO5B;AAAA,sBACLgB,GAA2B;AAAA,sBAC3BvD;AAAA,sBACAgD,IAAc,MAAM;AAAA,oBAAA;AAAA,oBAEtB,QAAQ,EAAE,gBAAgB,GAAA;AAAA,oBAC1B,SAAS,CAAAuC,MACPvD,GAAiBuD,GAAK1F,GAAaoD,CAAwB;AAAA,kBAAA;AAAA,kBAVxD,GAAGpD,EAAY,UAAU,IAAIA,EAAY,QAAQ,IAAIG,CAAQ,IAAIuD,GAA2B,KAAK;AAAA,gBAAA,GAa1G;AAAA,gBACA,gBAAAiB;AAAA,kBAACgB;AAAA,kBAAA;AAAA,oBACC,QAAQrB,GAAU;AAAA,oBAClB,QAAQA,GAAU;AAAA,oBAClB,YAAYnB;AAAA,kBAAA;AAAA,gBAAA;AAAA,cACd;AAAA,YAAA;AAAA,UAAA;AAAA,QACF;AAAA,MAAA;AAAA,IAAA;AAAA,EACF,GACF;AAGN;"}
|
|
@@ -4,7 +4,7 @@ import { PlotType } from '../facet-nav/FacetNavPanel';
|
|
|
4
4
|
export type PlotsContainerProps = {
|
|
5
5
|
facetsToPlot?: string[];
|
|
6
6
|
customPlots?: QueryWrapperSynapsePlotProps[];
|
|
7
|
-
|
|
7
|
+
initialPlotTypeByFacetColumnName?: Record<string, PlotType>;
|
|
8
8
|
};
|
|
9
9
|
type CustomPlotIdentifier = {
|
|
10
10
|
title: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PlotsContainer.d.ts","sourceRoot":"","sources":["../../../../src/components/widgets/facet-nav/PlotsContainer.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,MAAM,SAAS,CAAA;AAO/C,OAAgC,EAC9B,4BAA4B,EAC7B,MAAM,mDAAmD,CAAA;AAC1D,OAAsB,EAEpB,QAAQ,EACT,MAAM,4BAA4B,CAAA;AAMnC,MAAM,MAAM,mBAAmB,GAAG;IAChC,YAAY,CAAC,EAAE,MAAM,EAAE,CAAA;IACvB,WAAW,CAAC,EAAE,4BAA4B,EAAE,CAAA;IAC5C,
|
|
1
|
+
{"version":3,"file":"PlotsContainer.d.ts","sourceRoot":"","sources":["../../../../src/components/widgets/facet-nav/PlotsContainer.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,MAAM,SAAS,CAAA;AAO/C,OAAgC,EAC9B,4BAA4B,EAC7B,MAAM,mDAAmD,CAAA;AAC1D,OAAsB,EAEpB,QAAQ,EACT,MAAM,4BAA4B,CAAA;AAMnC,MAAM,MAAM,mBAAmB,GAAG;IAChC,YAAY,CAAC,EAAE,MAAM,EAAE,CAAA;IACvB,WAAW,CAAC,EAAE,4BAA4B,EAAE,CAAA;IAC5C,gCAAgC,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAA;CAC5D,CAAA;AACD,KAAK,oBAAoB,GAAG;IAC1B,KAAK,EAAE,MAAM,CAAA;IACb,QAAQ,EAAE,IAAI,CAAA;CACf,CAAA;AACD,MAAM,MAAM,cAAc,GAAG,qBAAqB,GAAG,oBAAoB,CAAA;AAEzE,MAAM,MAAM,WAAW,GAAG;IACxB,MAAM,EAAE,cAAc,CAAA;IACtB,QAAQ,EAAE,OAAO,CAAA;IACjB,QAAQ,EAAE,QAAQ,CAAA;IAClB,KAAK,CAAC,EAAE,MAAM,CAAA;CACf,CAAA;AA+SD,MAAM,CAAC,OAAO,UAAU,0BAA0B,CAAC,KAAK,EAAE,mBAAmB,2CAO5E"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { jsx as
|
|
2
|
-
import { facetObjectMatchesDefinition as
|
|
3
|
-
import { Box as
|
|
1
|
+
import { jsx as d, Fragment as g, jsxs as C } from "react/jsx-runtime";
|
|
2
|
+
import { facetObjectMatchesDefinition as A } from "../../../utils/functions/queryUtils.js";
|
|
3
|
+
import { Box as M, Button as O } from "@mui/material";
|
|
4
4
|
import { Suspense as b, useState as v, useEffect as j, useMemo as k } from "react";
|
|
5
5
|
import "@sage-bionetworks/synapse-types";
|
|
6
6
|
import "../../../utils/PermissionLevelToAccessType.js";
|
|
@@ -30,120 +30,121 @@ import '../../../style/components/_spinner.css';/* empty css
|
|
|
30
30
|
import "react-router";
|
|
31
31
|
import "../../../utils/types/IsType.js";
|
|
32
32
|
import "../../QueryContext/QueryContext.js";
|
|
33
|
-
import { useSuspenseGetQueryMetadata as
|
|
34
|
-
import { useQueryVisualizationContext as
|
|
35
|
-
import
|
|
33
|
+
import { useSuspenseGetQueryMetadata as B } from "../../QueryWrapper/useGetQueryMetadata.js";
|
|
34
|
+
import { useQueryVisualizationContext as E } from "../../QueryVisualizationWrapper/QueryVisualizationContext.js";
|
|
35
|
+
import D from "../../QueryWrapperPlotNav/QueryWrapperSynapsePlot.js";
|
|
36
36
|
import V from "./FacetNavPanel.js";
|
|
37
37
|
import { PlotsContainerSkeleton as $ } from "./PlotsContainerSkeleton.js";
|
|
38
|
-
import
|
|
39
|
-
const f = 2,
|
|
40
|
-
function
|
|
38
|
+
import R, { getFacets as G } from "./useFacetPlots.js";
|
|
39
|
+
const f = 2, m = (o, e) => "__custom" in e && "__custom" in o ? o.title == e.title : !("__custom" in e) && !("__custom" in o) ? A(o, e) : !1;
|
|
40
|
+
function Q(o) {
|
|
41
41
|
return o === "bar" ? "BAR" : "PIE";
|
|
42
42
|
}
|
|
43
|
-
const W = (o) => "__custom" in o.plotId ? `custom-${o.plotId.title}` : `facet-${o.plotId.columnName}-${o.plotId.jsonPath}`, z = (o, e) => !!e.find((
|
|
44
|
-
...o.map((
|
|
45
|
-
plotId:
|
|
43
|
+
const W = (o) => "__custom" in o.plotId ? `custom-${o.plotId.title}` : `facet-${o.plotId.columnName}-${o.plotId.jsonPath}`, z = (o, e) => !!e.find((l) => m(l.plotId, o)), I = (o) => ({ __custom: !0, title: o.title ?? "" }), q = (o = [], e = [], l) => [
|
|
44
|
+
...o.map((r, a) => ({
|
|
45
|
+
plotId: I(r),
|
|
46
46
|
isHidden: a >= f,
|
|
47
|
-
plotType:
|
|
47
|
+
plotType: Q(r.type)
|
|
48
48
|
})),
|
|
49
|
-
...e.map((
|
|
50
|
-
plotId:
|
|
49
|
+
...e.map((r, a) => ({
|
|
50
|
+
plotId: r.facetToPlot,
|
|
51
51
|
isHidden: a + o.length >= f,
|
|
52
|
-
plotType:
|
|
52
|
+
plotType: l?.[r.facetToPlot.columnName] ?? N
|
|
53
53
|
}))
|
|
54
|
-
], K = (o, e,
|
|
55
|
-
(
|
|
56
|
-
|
|
54
|
+
], K = (o, e, l) => e.some(
|
|
55
|
+
(r) => m(
|
|
56
|
+
I(r),
|
|
57
57
|
o.plotId
|
|
58
58
|
)
|
|
59
|
-
) ||
|
|
60
|
-
(
|
|
61
|
-
),
|
|
59
|
+
) || l.some(
|
|
60
|
+
(r) => m(r.facetToPlot, o.plotId)
|
|
61
|
+
), N = "PIE", Y = [], J = [];
|
|
62
62
|
function X(o) {
|
|
63
63
|
const {
|
|
64
64
|
facetsToPlot: e = Y,
|
|
65
|
-
customPlots:
|
|
66
|
-
|
|
67
|
-
} = o, { data: a } =
|
|
68
|
-
(
|
|
69
|
-
)?.plotType ??
|
|
65
|
+
customPlots: l = J,
|
|
66
|
+
initialPlotTypeByFacetColumnName: r
|
|
67
|
+
} = o, { data: a } = B(), { showPlots: w } = E(), [p, T] = v([]), u = R(e), x = (t) => p.find(
|
|
68
|
+
(s) => m(t, s.plotId)
|
|
69
|
+
)?.plotType ?? N;
|
|
70
70
|
j(() => {
|
|
71
71
|
const t = q(
|
|
72
|
-
|
|
72
|
+
l,
|
|
73
73
|
u,
|
|
74
|
-
|
|
74
|
+
r
|
|
75
75
|
);
|
|
76
|
-
|
|
77
|
-
const
|
|
76
|
+
T((n) => {
|
|
77
|
+
const s = t.filter((y) => !z(y.plotId, n));
|
|
78
78
|
return [...n.filter(
|
|
79
|
-
(
|
|
80
|
-
), ...
|
|
79
|
+
(y) => K(y, l, u)
|
|
80
|
+
), ...s];
|
|
81
81
|
});
|
|
82
|
-
}, [
|
|
82
|
+
}, [l, u, r]);
|
|
83
83
|
const H = (t) => {
|
|
84
|
-
|
|
85
|
-
},
|
|
86
|
-
(c) =>
|
|
84
|
+
T((n) => n.map((s, c) => t ? { ...s, isHidden: !1 } : { ...s, isHidden: c >= f }));
|
|
85
|
+
}, S = (t) => p.find(
|
|
86
|
+
(c) => m(t, c.plotId) && c.isHidden === !0
|
|
87
87
|
) !== void 0, P = k(() => (
|
|
88
88
|
// if at least one item is hidden
|
|
89
|
-
|
|
90
|
-
), [
|
|
91
|
-
|
|
92
|
-
},
|
|
93
|
-
|
|
94
|
-
},
|
|
95
|
-
|
|
89
|
+
p.find((t) => t.isHidden === !0) ? "MORE" : p.length <= f ? "NONE" : "LESS"
|
|
90
|
+
), [p]), _ = (t) => {
|
|
91
|
+
h(t, "isHidden", !0);
|
|
92
|
+
}, F = (t, n) => {
|
|
93
|
+
h(t, "plotType", n);
|
|
94
|
+
}, h = (t, n, s) => {
|
|
95
|
+
T(
|
|
96
96
|
(c) => c.map(
|
|
97
|
-
(
|
|
97
|
+
(i) => m(t, i.plotId) ? { ...i, [n]: s } : i
|
|
98
98
|
)
|
|
99
99
|
);
|
|
100
|
-
},
|
|
100
|
+
}, L = (
|
|
101
101
|
// TODO: customPlots should use the color index
|
|
102
102
|
// additionally, it is unclear why this object is created
|
|
103
103
|
// We can probably just pass the index from `plotUiStateArray.map)
|
|
104
|
-
|
|
104
|
+
G(a, e).map((t, n) => ({
|
|
105
105
|
facet: { columnName: t.columnName, jsonPath: t.jsonPath },
|
|
106
106
|
colorIndex: n
|
|
107
107
|
}))
|
|
108
108
|
);
|
|
109
|
-
return /* @__PURE__ */
|
|
109
|
+
return /* @__PURE__ */ d(g, { children: p.length > 0 && /* @__PURE__ */ C(
|
|
110
110
|
"div",
|
|
111
111
|
{
|
|
112
|
-
className: `PlotsContainer ${
|
|
112
|
+
className: `PlotsContainer ${w ? "" : "hidden"} ${P === "LESS" ? "less" : ""}`,
|
|
113
113
|
children: [
|
|
114
|
-
/* @__PURE__ */
|
|
115
|
-
const n = "__custom" in t.plotId,
|
|
116
|
-
(
|
|
117
|
-
|
|
114
|
+
/* @__PURE__ */ d("div", { className: "PlotsContainer__row", role: "list", children: p.map((t) => {
|
|
115
|
+
const n = "__custom" in t.plotId, s = l.find(
|
|
116
|
+
(i) => m(
|
|
117
|
+
I(i),
|
|
118
118
|
t.plotId
|
|
119
119
|
)
|
|
120
120
|
), c = u.find(
|
|
121
|
-
(
|
|
121
|
+
(i) => m(i.facetToPlot, t.plotId)
|
|
122
122
|
);
|
|
123
123
|
return /* @__PURE__ */ C(
|
|
124
124
|
"div",
|
|
125
125
|
{
|
|
126
|
+
className: t.plotType === "BAR" ? "PlotsContainer__row__item--full-width" : void 0,
|
|
126
127
|
style: {
|
|
127
128
|
minWidth: "435px",
|
|
128
|
-
display:
|
|
129
|
+
display: S(t.plotId) ? "none" : "block"
|
|
129
130
|
},
|
|
130
131
|
children: [
|
|
131
|
-
n &&
|
|
132
|
-
|
|
132
|
+
n && s && /* @__PURE__ */ d(
|
|
133
|
+
D,
|
|
133
134
|
{
|
|
134
|
-
...
|
|
135
|
+
...s,
|
|
135
136
|
onHide: () => _(t.plotId)
|
|
136
137
|
}
|
|
137
138
|
),
|
|
138
|
-
!n && c && /* @__PURE__ */
|
|
139
|
+
!n && c && /* @__PURE__ */ d(
|
|
139
140
|
V,
|
|
140
141
|
{
|
|
141
|
-
index:
|
|
142
|
-
(
|
|
142
|
+
index: L.find(
|
|
143
|
+
(i) => m(i.facet, t.plotId)
|
|
143
144
|
)?.colorIndex,
|
|
144
145
|
onHide: () => _(t.plotId),
|
|
145
146
|
plotType: x(t.plotId),
|
|
146
|
-
onSetPlotType: (
|
|
147
|
+
onSetPlotType: (i) => F(t.plotId, i),
|
|
147
148
|
isModalView: !1,
|
|
148
149
|
...c
|
|
149
150
|
}
|
|
@@ -153,8 +154,8 @@ function X(o) {
|
|
|
153
154
|
W(t)
|
|
154
155
|
);
|
|
155
156
|
}) }),
|
|
156
|
-
P !== "NONE" && /* @__PURE__ */
|
|
157
|
-
|
|
157
|
+
P !== "NONE" && /* @__PURE__ */ d(
|
|
158
|
+
M,
|
|
158
159
|
{
|
|
159
160
|
sx: {
|
|
160
161
|
display: "flex",
|
|
@@ -163,8 +164,8 @@ function X(o) {
|
|
|
163
164
|
p: 2,
|
|
164
165
|
mt: 2
|
|
165
166
|
},
|
|
166
|
-
children: /* @__PURE__ */
|
|
167
|
-
|
|
167
|
+
children: /* @__PURE__ */ d(
|
|
168
|
+
O,
|
|
168
169
|
{
|
|
169
170
|
variant: "contained",
|
|
170
171
|
color: "secondary",
|
|
@@ -180,8 +181,8 @@ function X(o) {
|
|
|
180
181
|
) });
|
|
181
182
|
}
|
|
182
183
|
function kt(o) {
|
|
183
|
-
const { showPlots: e } =
|
|
184
|
-
return /* @__PURE__ */
|
|
184
|
+
const { showPlots: e } = E();
|
|
185
|
+
return /* @__PURE__ */ d(b, { fallback: e ? /* @__PURE__ */ d($, {}) : null, children: /* @__PURE__ */ d(X, { ...o }) });
|
|
185
186
|
}
|
|
186
187
|
export {
|
|
187
188
|
kt as default
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PlotsContainer.js","sources":["../../../../src/components/widgets/facet-nav/PlotsContainer.tsx"],"sourcesContent":["import { UniqueFacetIdentifier } from '@/utils'\nimport { facetObjectMatchesDefinition } from '@/utils/functions/queryUtils'\nimport { Box, Button } from '@mui/material'\nimport type { PlotType as PlotlyPlotType } from 'plotly.js-basic-dist'\nimport { Suspense, useEffect, useMemo, useState } from 'react'\nimport { useQueryVisualizationContext } from '../../QueryVisualizationWrapper'\nimport { useSuspenseGetQueryMetadata } from '../../QueryWrapper/useGetQueryMetadata'\nimport QueryWrapperSynapsePlot, {\n QueryWrapperSynapsePlotProps,\n} from '../../QueryWrapperPlotNav/QueryWrapperSynapsePlot'\nimport FacetNavPanel, {\n FacetNavPanelProps,\n PlotType,\n} from '../facet-nav/FacetNavPanel'\nimport { PlotsContainerSkeleton } from './PlotsContainerSkeleton'\nimport useFacetPlots, { getFacets } from './useFacetPlots'\n\nconst DEFAULT_VISIBLE_PLOTS = 2\ntype ShowMoreState = 'MORE' | 'LESS' | 'NONE'\nexport type PlotsContainerProps = {\n facetsToPlot?: string[]\n customPlots?: QueryWrapperSynapsePlotProps[]\n initialPlotType?: PlotType\n}\ntype CustomPlotIdentifier = {\n title: string\n __custom: true\n}\nexport type PlotIdentifier = UniqueFacetIdentifier | CustomPlotIdentifier\n\nexport type UiPlotState = {\n plotId: PlotIdentifier\n isHidden: boolean\n plotType: PlotType\n index?: number\n}\nconst plotMatchesDefinition = (\n definition: PlotIdentifier,\n plotId: PlotIdentifier,\n) => {\n if ('__custom' in plotId && '__custom' in definition) {\n return definition.title == plotId.title\n } else if (!('__custom' in plotId) && !('__custom' in definition)) {\n return facetObjectMatchesDefinition(definition, plotId)\n } else {\n return false\n }\n}\n\nfunction convertPlotlyPlotTypeToFacetNavPlotType(\n plotlyPlotType: PlotlyPlotType,\n): PlotType {\n if (plotlyPlotType === 'bar') {\n return 'BAR'\n } else if (plotlyPlotType === 'pie') {\n return 'PIE'\n }\n return 'PIE'\n}\n\nconst generatePlotKey = (plotUiState: UiPlotState) => {\n if ('__custom' in plotUiState.plotId) {\n // For custom plots\n return `custom-${plotUiState.plotId.title}`\n } else {\n // For facet plots\n return `facet-${plotUiState.plotId.columnName}-${plotUiState.plotId.jsonPath}`\n }\n}\n\nconst isPlotInState = (\n plotId: PlotIdentifier,\n plotUiStateArray: UiPlotState[],\n): boolean => {\n return !!plotUiStateArray.find(plot => {\n return plotMatchesDefinition(plot.plotId, plotId)\n })\n}\n\nconst getCustomPlotIdentifier = (\n customPlot: QueryWrapperSynapsePlotProps,\n): PlotIdentifier => {\n return { __custom: true, title: customPlot.title ?? '' }\n}\n\nconst getCombinedNewPlots = (\n customPlots: QueryWrapperSynapsePlotProps[] = [],\n facetNavPanelPropsArray: Pick<\n FacetNavPanelProps,\n 'applyChangesToFacetFilter' | 'applyChangesToGraphSlice' | 'facetToPlot'\n >[] = [],\n initialPlotType: PlotType = DEFAULT_PLOT_TYPE,\n): UiPlotState[] => [\n ...customPlots.map((plotProps, index) => ({\n plotId: getCustomPlotIdentifier(plotProps),\n isHidden: index >= DEFAULT_VISIBLE_PLOTS,\n plotType: convertPlotlyPlotTypeToFacetNavPlotType(plotProps.type),\n })),\n ...facetNavPanelPropsArray.map((facetPlotProps, index) => ({\n plotId: facetPlotProps.facetToPlot,\n isHidden: index + customPlots.length >= DEFAULT_VISIBLE_PLOTS,\n plotType: initialPlotType,\n })),\n]\n\n// Remove plots that are no longer in props from prevPlots\nconst isPlotStillPresent = (\n prevPlot: UiPlotState,\n customPlots: QueryWrapperSynapsePlotProps[],\n facetNavPanelProps: Pick<\n FacetNavPanelProps,\n 'applyChangesToFacetFilter' | 'applyChangesToGraphSlice' | 'facetToPlot'\n >[],\n): boolean => {\n return (\n customPlots.some(customPlot =>\n plotMatchesDefinition(\n getCustomPlotIdentifier(customPlot),\n prevPlot.plotId,\n ),\n ) ||\n facetNavPanelProps.some(facetPlot =>\n plotMatchesDefinition(facetPlot.facetToPlot, prevPlot.plotId),\n )\n )\n} // fn returns true iff the plot id is in customPlots or facetNavPanelPropsArray\n\nconst DEFAULT_PLOT_TYPE: PlotType = 'PIE'\n\nconst DEFAULT_FACETS_TO_PLOT: string[] = []\nconst DEFAULT_CUSTOM_PLOTS: QueryWrapperSynapsePlotProps[] = []\n\nfunction PlotsContainer(props: PlotsContainerProps) {\n const {\n facetsToPlot = DEFAULT_FACETS_TO_PLOT,\n customPlots = DEFAULT_CUSTOM_PLOTS,\n initialPlotType = DEFAULT_PLOT_TYPE,\n } = props\n const { data: queryMetadata } = useSuspenseGetQueryMetadata()\n const { showPlots: showPlotVisualization } = useQueryVisualizationContext()\n const [plotUiStateArray, setPlotUiStateArray] = useState<UiPlotState[]>([])\n const facetNavPanelPropsArray = useFacetPlots(facetsToPlot)\n\n const getPlotType = (plotId: PlotIdentifier): PlotType => {\n const plotType = plotUiStateArray.find(item =>\n plotMatchesDefinition(plotId, item.plotId),\n )?.plotType\n return plotType ?? DEFAULT_PLOT_TYPE\n }\n\n useEffect(() => {\n const combinedNewPlots = getCombinedNewPlots(\n customPlots,\n facetNavPanelPropsArray,\n initialPlotType,\n )\n\n // Update the state with new plots\n setPlotUiStateArray(prevPlots => {\n // Filter to only include new plots\n const newPlots = combinedNewPlots.filter(plot => {\n const inState = isPlotInState(plot.plotId, prevPlots)\n return !inState\n })\n\n const updatedPlots = prevPlots.filter(prevPlot =>\n isPlotStillPresent(prevPlot, customPlots, facetNavPanelPropsArray),\n )\n\n // Append new plots\n const combinedPlots = [...updatedPlots, ...newPlots]\n return combinedPlots\n })\n }, [customPlots, facetNavPanelPropsArray])\n\n // when 'show more/less' is clicked\n const onShowMoreClick = (shouldShowMore: boolean) => {\n setPlotUiStateArray(plotUiStateArray => {\n return plotUiStateArray.map((item, index) => {\n if (shouldShowMore) {\n // show everything\n return { ...item, isHidden: false }\n }\n // otherwise hide everything except the first few items\n return { ...item, isHidden: index >= DEFAULT_VISIBLE_PLOTS }\n })\n })\n }\n\n const isPlotHiddenInGrid = (plotId: PlotIdentifier) => {\n const itemHidden = plotUiStateArray.find(\n item =>\n plotMatchesDefinition(plotId, item.plotId) && item.isHidden === true,\n )\n const result = itemHidden !== undefined\n return result\n }\n\n const showMoreButtonState = useMemo<ShowMoreState>(() => {\n if (\n // if at least one item is hidden\n plotUiStateArray.find(item => item.isHidden === true)\n ) {\n return 'MORE'\n } else if (plotUiStateArray.length <= DEFAULT_VISIBLE_PLOTS) {\n return 'NONE'\n } else {\n return 'LESS'\n }\n }, [plotUiStateArray])\n\n // hides plot graph\n const hidePlotInGrid = (plotId: PlotIdentifier) => {\n setUiPropertyForPlot(plotId, 'isHidden', true)\n }\n\n const setPlotType = (plotId: PlotIdentifier, plotType: PlotType) => {\n setUiPropertyForPlot(plotId, 'plotType', plotType)\n }\n\n const setUiPropertyForPlot = (\n plotId: PlotIdentifier,\n propName: keyof UiPlotState,\n value: boolean | PlotType, // 'the possible values of the above type' (currently can't be specified in TS using symbols)\n ) => {\n setPlotUiStateArray(plotUiStateArray =>\n plotUiStateArray.map(item =>\n plotMatchesDefinition(plotId, item.plotId)\n ? { ...item, [propName]: value }\n : item,\n ),\n )\n }\n\n const colorTracker: { facet: PlotIdentifier; colorIndex: number }[] =\n // TODO: customPlots should use the color index\n // additionally, it is unclear why this object is created\n // We can probably just pass the index from `plotUiStateArray.map)\n getFacets(queryMetadata, facetsToPlot).map((el, index) => {\n return {\n facet: { columnName: el.columnName, jsonPath: el.jsonPath },\n colorIndex: index,\n }\n })\n\n return (\n <>\n {plotUiStateArray.length > 0 && (\n <div\n className={`PlotsContainer ${showPlotVisualization ? '' : 'hidden'} ${\n showMoreButtonState === 'LESS' ? 'less' : ''\n }`}\n >\n <div className=\"PlotsContainer__row\" role=\"list\">\n {plotUiStateArray.map(plotUiState => {\n const isCustomPlot = '__custom' in plotUiState.plotId\n const customPlotProps = customPlots.find(customPlot =>\n plotMatchesDefinition(\n getCustomPlotIdentifier(customPlot),\n plotUiState.plotId,\n ),\n )\n const facetNavPanelProps = facetNavPanelPropsArray.find(props =>\n plotMatchesDefinition(props.facetToPlot, plotUiState.plotId),\n )\n\n return (\n <div\n style={{\n minWidth: '435px',\n display: isPlotHiddenInGrid(plotUiState.plotId)\n ? 'none'\n : 'block',\n }}\n key={generatePlotKey(plotUiState)}\n >\n {isCustomPlot && customPlotProps && (\n <QueryWrapperSynapsePlot\n {...customPlotProps}\n onHide={() => hidePlotInGrid(plotUiState.plotId)}\n />\n )}\n {!isCustomPlot && facetNavPanelProps && (\n <FacetNavPanel\n index={\n colorTracker.find(el =>\n plotMatchesDefinition(el.facet, plotUiState.plotId),\n )?.colorIndex!\n }\n onHide={() => hidePlotInGrid(plotUiState.plotId)}\n plotType={getPlotType(plotUiState.plotId)}\n onSetPlotType={(plotType: PlotType) =>\n setPlotType(plotUiState.plotId, plotType)\n }\n isModalView={false}\n {...facetNavPanelProps}\n />\n )}\n </div>\n )\n })}\n </div>\n {showMoreButtonState !== 'NONE' && (\n <Box\n sx={{\n display: 'flex',\n justifyContent: 'center',\n backgroundColor: 'grey.100',\n p: 2,\n mt: 2,\n }}\n >\n <Button\n variant=\"contained\"\n color=\"secondary\"\n onClick={() => onShowMoreClick(showMoreButtonState === 'MORE')}\n sx={{ width: '150px' }}\n >\n {showMoreButtonState === 'LESS'\n ? 'Hide Charts'\n : 'View All Charts'}\n </Button>\n </Box>\n )}\n </div>\n )}\n </>\n )\n}\n\nexport default function PlotsContainerWithSuspense(props: PlotsContainerProps) {\n const { showPlots } = useQueryVisualizationContext()\n return (\n <Suspense fallback={showPlots ? <PlotsContainerSkeleton /> : null}>\n <PlotsContainer {...props} />\n </Suspense>\n )\n}\n"],"names":["DEFAULT_VISIBLE_PLOTS","plotMatchesDefinition","definition","plotId","facetObjectMatchesDefinition","convertPlotlyPlotTypeToFacetNavPlotType","plotlyPlotType","generatePlotKey","plotUiState","isPlotInState","plotUiStateArray","plot","getCustomPlotIdentifier","customPlot","getCombinedNewPlots","customPlots","facetNavPanelPropsArray","initialPlotType","DEFAULT_PLOT_TYPE","plotProps","index","facetPlotProps","isPlotStillPresent","prevPlot","facetNavPanelProps","facetPlot","DEFAULT_FACETS_TO_PLOT","DEFAULT_CUSTOM_PLOTS","PlotsContainer","props","facetsToPlot","queryMetadata","useSuspenseGetQueryMetadata","showPlotVisualization","useQueryVisualizationContext","setPlotUiStateArray","useState","useFacetPlots","getPlotType","item","useEffect","combinedNewPlots","prevPlots","newPlots","onShowMoreClick","shouldShowMore","isPlotHiddenInGrid","showMoreButtonState","useMemo","hidePlotInGrid","setUiPropertyForPlot","setPlotType","plotType","propName","value","colorTracker","getFacets","el","jsx","Fragment","jsxs","isCustomPlot","customPlotProps","QueryWrapperSynapsePlot","FacetNavPanel","Box","Button","PlotsContainerWithSuspense","showPlots","Suspense","PlotsContainerSkeleton"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"PlotsContainer.js","sources":["../../../../src/components/widgets/facet-nav/PlotsContainer.tsx"],"sourcesContent":["import { UniqueFacetIdentifier } from '@/utils'\nimport { facetObjectMatchesDefinition } from '@/utils/functions/queryUtils'\nimport { Box, Button } from '@mui/material'\nimport type { PlotType as PlotlyPlotType } from 'plotly.js-basic-dist'\nimport { Suspense, useEffect, useMemo, useState } from 'react'\nimport { useQueryVisualizationContext } from '../../QueryVisualizationWrapper'\nimport { useSuspenseGetQueryMetadata } from '../../QueryWrapper/useGetQueryMetadata'\nimport QueryWrapperSynapsePlot, {\n QueryWrapperSynapsePlotProps,\n} from '../../QueryWrapperPlotNav/QueryWrapperSynapsePlot'\nimport FacetNavPanel, {\n FacetNavPanelProps,\n PlotType,\n} from '../facet-nav/FacetNavPanel'\nimport { PlotsContainerSkeleton } from './PlotsContainerSkeleton'\nimport useFacetPlots, { getFacets } from './useFacetPlots'\n\nconst DEFAULT_VISIBLE_PLOTS = 2\ntype ShowMoreState = 'MORE' | 'LESS' | 'NONE'\nexport type PlotsContainerProps = {\n facetsToPlot?: string[]\n customPlots?: QueryWrapperSynapsePlotProps[]\n initialPlotTypeByFacetColumnName?: Record<string, PlotType>\n}\ntype CustomPlotIdentifier = {\n title: string\n __custom: true\n}\nexport type PlotIdentifier = UniqueFacetIdentifier | CustomPlotIdentifier\n\nexport type UiPlotState = {\n plotId: PlotIdentifier\n isHidden: boolean\n plotType: PlotType\n index?: number\n}\nconst plotMatchesDefinition = (\n definition: PlotIdentifier,\n plotId: PlotIdentifier,\n) => {\n if ('__custom' in plotId && '__custom' in definition) {\n return definition.title == plotId.title\n } else if (!('__custom' in plotId) && !('__custom' in definition)) {\n return facetObjectMatchesDefinition(definition, plotId)\n } else {\n return false\n }\n}\n\nfunction convertPlotlyPlotTypeToFacetNavPlotType(\n plotlyPlotType: PlotlyPlotType,\n): PlotType {\n if (plotlyPlotType === 'bar') {\n return 'BAR'\n } else if (plotlyPlotType === 'pie') {\n return 'PIE'\n }\n return 'PIE'\n}\n\nconst generatePlotKey = (plotUiState: UiPlotState) => {\n if ('__custom' in plotUiState.plotId) {\n // For custom plots\n return `custom-${plotUiState.plotId.title}`\n } else {\n // For facet plots\n return `facet-${plotUiState.plotId.columnName}-${plotUiState.plotId.jsonPath}`\n }\n}\n\nconst isPlotInState = (\n plotId: PlotIdentifier,\n plotUiStateArray: UiPlotState[],\n): boolean => {\n return !!plotUiStateArray.find(plot => {\n return plotMatchesDefinition(plot.plotId, plotId)\n })\n}\n\nconst getCustomPlotIdentifier = (\n customPlot: QueryWrapperSynapsePlotProps,\n): PlotIdentifier => {\n return { __custom: true, title: customPlot.title ?? '' }\n}\n\nconst getCombinedNewPlots = (\n customPlots: QueryWrapperSynapsePlotProps[] = [],\n facetNavPanelPropsArray: Pick<\n FacetNavPanelProps,\n 'applyChangesToFacetFilter' | 'applyChangesToGraphSlice' | 'facetToPlot'\n >[] = [],\n initialPlotTypeByFacetColumnName?: Record<string, PlotType>,\n): UiPlotState[] => [\n ...customPlots.map((plotProps, index) => ({\n plotId: getCustomPlotIdentifier(plotProps),\n isHidden: index >= DEFAULT_VISIBLE_PLOTS,\n plotType: convertPlotlyPlotTypeToFacetNavPlotType(plotProps.type),\n })),\n ...facetNavPanelPropsArray.map((facetPlotProps, index) => ({\n plotId: facetPlotProps.facetToPlot,\n isHidden: index + customPlots.length >= DEFAULT_VISIBLE_PLOTS,\n plotType:\n initialPlotTypeByFacetColumnName?.[\n facetPlotProps.facetToPlot.columnName\n ] ?? DEFAULT_PLOT_TYPE,\n })),\n]\n\n// Remove plots that are no longer in props from prevPlots\nconst isPlotStillPresent = (\n prevPlot: UiPlotState,\n customPlots: QueryWrapperSynapsePlotProps[],\n facetNavPanelProps: Pick<\n FacetNavPanelProps,\n 'applyChangesToFacetFilter' | 'applyChangesToGraphSlice' | 'facetToPlot'\n >[],\n): boolean => {\n return (\n customPlots.some(customPlot =>\n plotMatchesDefinition(\n getCustomPlotIdentifier(customPlot),\n prevPlot.plotId,\n ),\n ) ||\n facetNavPanelProps.some(facetPlot =>\n plotMatchesDefinition(facetPlot.facetToPlot, prevPlot.plotId),\n )\n )\n} // fn returns true iff the plot id is in customPlots or facetNavPanelPropsArray\n\nconst DEFAULT_PLOT_TYPE: PlotType = 'PIE'\n\nconst DEFAULT_FACETS_TO_PLOT: string[] = []\nconst DEFAULT_CUSTOM_PLOTS: QueryWrapperSynapsePlotProps[] = []\n\nfunction PlotsContainer(props: PlotsContainerProps) {\n const {\n facetsToPlot = DEFAULT_FACETS_TO_PLOT,\n customPlots = DEFAULT_CUSTOM_PLOTS,\n initialPlotTypeByFacetColumnName,\n } = props\n const { data: queryMetadata } = useSuspenseGetQueryMetadata()\n const { showPlots: showPlotVisualization } = useQueryVisualizationContext()\n const [plotUiStateArray, setPlotUiStateArray] = useState<UiPlotState[]>([])\n const facetNavPanelPropsArray = useFacetPlots(facetsToPlot)\n\n const getPlotType = (plotId: PlotIdentifier): PlotType => {\n const plotType = plotUiStateArray.find(item =>\n plotMatchesDefinition(plotId, item.plotId),\n )?.plotType\n return plotType ?? DEFAULT_PLOT_TYPE\n }\n\n useEffect(() => {\n const combinedNewPlots = getCombinedNewPlots(\n customPlots,\n facetNavPanelPropsArray,\n initialPlotTypeByFacetColumnName,\n )\n\n // Update the state with new plots\n setPlotUiStateArray(prevPlots => {\n // Filter to only include new plots\n const newPlots = combinedNewPlots.filter(plot => {\n const inState = isPlotInState(plot.plotId, prevPlots)\n return !inState\n })\n\n const updatedPlots = prevPlots.filter(prevPlot =>\n isPlotStillPresent(prevPlot, customPlots, facetNavPanelPropsArray),\n )\n\n // Append new plots\n const combinedPlots = [...updatedPlots, ...newPlots]\n return combinedPlots\n })\n }, [customPlots, facetNavPanelPropsArray, initialPlotTypeByFacetColumnName])\n\n // when 'show more/less' is clicked\n const onShowMoreClick = (shouldShowMore: boolean) => {\n setPlotUiStateArray(plotUiStateArray => {\n return plotUiStateArray.map((item, index) => {\n if (shouldShowMore) {\n // show everything\n return { ...item, isHidden: false }\n }\n // otherwise hide everything except the first few items\n return { ...item, isHidden: index >= DEFAULT_VISIBLE_PLOTS }\n })\n })\n }\n\n const isPlotHiddenInGrid = (plotId: PlotIdentifier) => {\n const itemHidden = plotUiStateArray.find(\n item =>\n plotMatchesDefinition(plotId, item.plotId) && item.isHidden === true,\n )\n const result = itemHidden !== undefined\n return result\n }\n\n const showMoreButtonState = useMemo<ShowMoreState>(() => {\n if (\n // if at least one item is hidden\n plotUiStateArray.find(item => item.isHidden === true)\n ) {\n return 'MORE'\n } else if (plotUiStateArray.length <= DEFAULT_VISIBLE_PLOTS) {\n return 'NONE'\n } else {\n return 'LESS'\n }\n }, [plotUiStateArray])\n\n // hides plot graph\n const hidePlotInGrid = (plotId: PlotIdentifier) => {\n setUiPropertyForPlot(plotId, 'isHidden', true)\n }\n\n const setPlotType = (plotId: PlotIdentifier, plotType: PlotType) => {\n setUiPropertyForPlot(plotId, 'plotType', plotType)\n }\n\n const setUiPropertyForPlot = (\n plotId: PlotIdentifier,\n propName: keyof UiPlotState,\n value: boolean | PlotType, // 'the possible values of the above type' (currently can't be specified in TS using symbols)\n ) => {\n setPlotUiStateArray(plotUiStateArray =>\n plotUiStateArray.map(item =>\n plotMatchesDefinition(plotId, item.plotId)\n ? { ...item, [propName]: value }\n : item,\n ),\n )\n }\n\n const colorTracker: { facet: PlotIdentifier; colorIndex: number }[] =\n // TODO: customPlots should use the color index\n // additionally, it is unclear why this object is created\n // We can probably just pass the index from `plotUiStateArray.map)\n getFacets(queryMetadata, facetsToPlot).map((el, index) => {\n return {\n facet: { columnName: el.columnName, jsonPath: el.jsonPath },\n colorIndex: index,\n }\n })\n\n return (\n <>\n {plotUiStateArray.length > 0 && (\n <div\n className={`PlotsContainer ${showPlotVisualization ? '' : 'hidden'} ${\n showMoreButtonState === 'LESS' ? 'less' : ''\n }`}\n >\n <div className=\"PlotsContainer__row\" role=\"list\">\n {plotUiStateArray.map(plotUiState => {\n const isCustomPlot = '__custom' in plotUiState.plotId\n const customPlotProps = customPlots.find(customPlot =>\n plotMatchesDefinition(\n getCustomPlotIdentifier(customPlot),\n plotUiState.plotId,\n ),\n )\n const facetNavPanelProps = facetNavPanelPropsArray.find(props =>\n plotMatchesDefinition(props.facetToPlot, plotUiState.plotId),\n )\n\n return (\n <div\n className={\n plotUiState.plotType === 'BAR'\n ? 'PlotsContainer__row__item--full-width'\n : undefined\n }\n style={{\n minWidth: '435px',\n display: isPlotHiddenInGrid(plotUiState.plotId)\n ? 'none'\n : 'block',\n }}\n key={generatePlotKey(plotUiState)}\n >\n {isCustomPlot && customPlotProps && (\n <QueryWrapperSynapsePlot\n {...customPlotProps}\n onHide={() => hidePlotInGrid(plotUiState.plotId)}\n />\n )}\n {!isCustomPlot && facetNavPanelProps && (\n <FacetNavPanel\n index={\n colorTracker.find(el =>\n plotMatchesDefinition(el.facet, plotUiState.plotId),\n )?.colorIndex!\n }\n onHide={() => hidePlotInGrid(plotUiState.plotId)}\n plotType={getPlotType(plotUiState.plotId)}\n onSetPlotType={(plotType: PlotType) =>\n setPlotType(plotUiState.plotId, plotType)\n }\n isModalView={false}\n {...facetNavPanelProps}\n />\n )}\n </div>\n )\n })}\n </div>\n {showMoreButtonState !== 'NONE' && (\n <Box\n sx={{\n display: 'flex',\n justifyContent: 'center',\n backgroundColor: 'grey.100',\n p: 2,\n mt: 2,\n }}\n >\n <Button\n variant=\"contained\"\n color=\"secondary\"\n onClick={() => onShowMoreClick(showMoreButtonState === 'MORE')}\n sx={{ width: '150px' }}\n >\n {showMoreButtonState === 'LESS'\n ? 'Hide Charts'\n : 'View All Charts'}\n </Button>\n </Box>\n )}\n </div>\n )}\n </>\n )\n}\n\nexport default function PlotsContainerWithSuspense(props: PlotsContainerProps) {\n const { showPlots } = useQueryVisualizationContext()\n return (\n <Suspense fallback={showPlots ? <PlotsContainerSkeleton /> : null}>\n <PlotsContainer {...props} />\n </Suspense>\n )\n}\n"],"names":["DEFAULT_VISIBLE_PLOTS","plotMatchesDefinition","definition","plotId","facetObjectMatchesDefinition","convertPlotlyPlotTypeToFacetNavPlotType","plotlyPlotType","generatePlotKey","plotUiState","isPlotInState","plotUiStateArray","plot","getCustomPlotIdentifier","customPlot","getCombinedNewPlots","customPlots","facetNavPanelPropsArray","initialPlotTypeByFacetColumnName","plotProps","index","facetPlotProps","DEFAULT_PLOT_TYPE","isPlotStillPresent","prevPlot","facetNavPanelProps","facetPlot","DEFAULT_FACETS_TO_PLOT","DEFAULT_CUSTOM_PLOTS","PlotsContainer","props","facetsToPlot","queryMetadata","useSuspenseGetQueryMetadata","showPlotVisualization","useQueryVisualizationContext","setPlotUiStateArray","useState","useFacetPlots","getPlotType","item","useEffect","combinedNewPlots","prevPlots","newPlots","onShowMoreClick","shouldShowMore","isPlotHiddenInGrid","showMoreButtonState","useMemo","hidePlotInGrid","setUiPropertyForPlot","setPlotType","plotType","propName","value","colorTracker","getFacets","el","jsx","Fragment","jsxs","isCustomPlot","customPlotProps","QueryWrapperSynapsePlot","FacetNavPanel","Box","Button","PlotsContainerWithSuspense","showPlots","Suspense","PlotsContainerSkeleton"],"mappings":"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"}
|