synapse-react-client 4.0.9 → 4.0.10
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.d.ts +1 -0
- package/dist/SWC.index.d.ts.map +1 -1
- package/dist/SWC.index.js +2 -1
- package/dist/SWC.index.js.map +1 -1
- package/dist/aridhia-queries/aridhiaTokenExchange.js.map +1 -1
- package/dist/aridhia-queries/useGetAridhiaRequests.js.map +1 -1
- package/dist/assets/icons/TasksIcon.d.ts.map +1 -1
- package/dist/assets/icons/TasksIcon.js +6 -10
- package/dist/assets/icons/TasksIcon.js.map +1 -1
- package/dist/components/AccessRequirementAclEditor/AccessRequirementAclEditor.d.ts.map +1 -1
- package/dist/components/AccessRequirementAclEditor/AccessRequirementAclEditor.js +69 -63
- package/dist/components/AccessRequirementAclEditor/AccessRequirementAclEditor.js.map +1 -1
- package/dist/components/AccessRequirementList/AccessApprovalCheckMark.js.map +1 -1
- package/dist/components/AccessRequirementList/AccessRequirementList.js.map +1 -1
- package/dist/components/AccessRequirementList/AccessRequirementListUtils.js.map +1 -1
- package/dist/components/AccessRequirementList/ManagedACTAccessRequirementRequestFlow/DataAccessRequestAccessorsEditor.js.map +1 -1
- package/dist/components/AccessRequirementList/RequirementItem/SelfSignAccessRequirementItem.js.map +1 -1
- package/dist/components/AccessRequirementRelatedProjectsList/AccessRequirementRelatedProjectsList.js.map +1 -1
- package/dist/components/AccessTokenPage/AccessTokenCard/AccessTokenCard.js.map +1 -1
- package/dist/components/AcknowledgementsPage/StudyAcknowledgements.js.map +1 -1
- package/dist/components/AclEditor/PermissionLevelMenu.js.map +1 -1
- package/dist/components/AclEditor/ResourceAccessAndUserGroupHeader.js.map +1 -1
- package/dist/components/AclEditor/useSortResourceAccessList.js.map +1 -1
- package/dist/components/AclEditor/useUpdateAcl.js.map +1 -1
- package/dist/components/Aridhia/AridhiaAccessStatus.js.map +1 -1
- package/dist/components/Authentication/AuthenticationMethodSelection.d.ts.map +1 -1
- package/dist/components/Authentication/AuthenticationMethodSelection.js +38 -37
- package/dist/components/Authentication/AuthenticationMethodSelection.js.map +1 -1
- package/dist/components/Authentication/Constants.d.ts +1 -0
- package/dist/components/Authentication/Constants.d.ts.map +1 -1
- package/dist/components/Authentication/Constants.js +2 -2
- package/dist/components/Authentication/Constants.js.map +1 -1
- package/dist/components/Authentication/LastLoginInfo.js.map +1 -1
- package/dist/components/Authentication/RecoveryCodeForm.js.map +1 -1
- package/dist/components/Authentication/RecoveryCodeGrid.js.map +1 -1
- package/dist/components/Authentication/RegenerateBackupCodesWarning.js.map +1 -1
- package/dist/components/Authentication/Reset2FAWarning.js.map +1 -1
- package/dist/components/Authentication/StandaloneLoginForm.js +1 -1
- package/dist/components/Authentication/TwoFactorBackupCodes.js.map +1 -1
- package/dist/components/Authentication/TwoFactorEnrollmentForm.d.ts.map +1 -1
- package/dist/components/Authentication/TwoFactorEnrollmentForm.js +2 -1
- package/dist/components/Authentication/TwoFactorEnrollmentForm.js.map +1 -1
- package/dist/components/BasePortalCard/ColorfulPortalCardWithChips/ColorfulPortalCardWithChips.js.map +1 -1
- package/dist/components/CardContainer/CardContainer.js.map +1 -1
- package/dist/components/CardDeck/CardDeck.Mobile.js.map +1 -1
- package/dist/components/CardDeck/TableQueryCardDeck.js.map +1 -1
- package/dist/components/CertificationQuiz/CertificationQuiz.js.map +1 -1
- package/dist/components/ChallengeDataDownload/ChallengeDataDownload.js.map +1 -1
- package/dist/components/ChallengeSubmission/ChallengeSubmission.js.map +1 -1
- package/dist/components/ChallengeSubmission/ChallengeSubmissionStepper.js.map +1 -1
- package/dist/components/ChallengeSubmission/EvaluationQueueCurrentRoundInfo.js.map +1 -1
- package/dist/components/ChallengeSubmission/EvaluationQueueList.js.map +1 -1
- package/dist/components/ChallengeSubmission/SubmissionDirectoryList.js.map +1 -1
- package/dist/components/ChallengeTeamWizard/ChallengeTeamWizard.js.map +1 -1
- package/dist/components/ChallengeTeamWizard/CreateChallengeTeam.js.map +1 -1
- package/dist/components/ChangePassword/ChangePassword.js.map +1 -1
- package/dist/components/ChangePassword/ChangePasswordWithToken.js.map +1 -1
- package/dist/components/ChangePassword/useChangePasswordFormState.js +1 -1
- package/dist/components/ChangePassword/useChangePasswordFormState.js.map +1 -1
- package/dist/components/CitationPopover/CitationPopoverContent.js.map +1 -1
- package/dist/components/ColumnFilter/ColumnFilter.js.map +1 -1
- package/dist/components/ComponentCollapse.js.map +1 -1
- package/dist/components/CookiesNotification/CookiesNotification.js.map +1 -1
- package/dist/components/CreateProjectModal/CreateProjectModal.js.map +1 -1
- package/dist/components/CreateTableViewWizard/CreateTableViewWizardUtils.js.map +1 -1
- package/dist/components/DataGrid/DataGrid.d.ts +0 -1
- package/dist/components/DataGrid/DataGrid.d.ts.map +1 -1
- package/dist/components/DataGrid/DataGrid.js +72 -72
- package/dist/components/DataGrid/DataGrid.js.map +1 -1
- package/dist/components/DataGrid/DataGridWebSocket.d.ts +4 -0
- package/dist/components/DataGrid/DataGridWebSocket.d.ts.map +1 -1
- package/dist/components/DataGrid/DataGridWebSocket.js +9 -8
- package/dist/components/DataGrid/DataGridWebSocket.js.map +1 -1
- package/dist/components/DataGrid/SynapseGrid.d.ts.map +1 -1
- package/dist/components/DataGrid/SynapseGrid.js +326 -268
- package/dist/components/DataGrid/SynapseGrid.js.map +1 -1
- package/dist/components/DataGrid/columns/AutocompleteColumn.d.ts +2 -0
- package/dist/components/DataGrid/columns/AutocompleteColumn.d.ts.map +1 -1
- package/dist/components/DataGrid/columns/AutocompleteColumn.js +113 -67
- package/dist/components/DataGrid/columns/AutocompleteColumn.js.map +1 -1
- package/dist/components/DataGrid/columns/AutocompleteMultipleEnumColumn.d.ts +2 -1
- package/dist/components/DataGrid/columns/AutocompleteMultipleEnumColumn.d.ts.map +1 -1
- package/dist/components/DataGrid/columns/AutocompleteMultipleEnumColumn.js +126 -122
- package/dist/components/DataGrid/columns/AutocompleteMultipleEnumColumn.js.map +1 -1
- package/dist/components/DataGrid/columns/useGridAutocompleteState.d.ts +58 -0
- package/dist/components/DataGrid/columns/useGridAutocompleteState.d.ts.map +1 -0
- package/dist/components/DataGrid/columns/useGridAutocompleteState.js +52 -0
- package/dist/components/DataGrid/columns/useGridAutocompleteState.js.map +1 -0
- package/dist/components/DataGrid/components/ValidationAlert.d.ts +5 -2
- package/dist/components/DataGrid/components/ValidationAlert.d.ts.map +1 -1
- package/dist/components/DataGrid/components/ValidationAlert.js +429 -24
- package/dist/components/DataGrid/components/ValidationAlert.js.map +1 -1
- package/dist/components/DataGrid/hooks/useColumnResizeHandles.js.map +1 -1
- package/dist/components/DataGrid/hooks/useGetSchemaForGrid.js.map +1 -1
- package/dist/components/DataGrid/hooks/useGridUndoRedo.js.map +1 -1
- package/dist/components/DataGrid/hooks/useStack.js.map +1 -1
- package/dist/components/DataGrid/useCRDTModelView.js.map +1 -1
- package/dist/components/DataGrid/useDataGridWebsocket.d.ts +7 -0
- package/dist/components/DataGrid/useDataGridWebsocket.d.ts.map +1 -1
- package/dist/components/DataGrid/useDataGridWebsocket.js +16 -2
- package/dist/components/DataGrid/useDataGridWebsocket.js.map +1 -1
- package/dist/components/DataGrid/useInitializeGridConnection.js.map +1 -1
- package/dist/components/DataGrid/useMergeGridWithRecordSet.js.map +1 -1
- package/dist/components/DataGrid/useMergeGridWithSource.js.map +1 -1
- package/dist/components/DataGrid/useMergeGridWithTable.js.map +1 -1
- package/dist/components/DataGrid/utils/DataGridUtils.js.map +1 -1
- package/dist/components/DataGrid/utils/applyModelChange.js.map +1 -1
- package/dist/components/DataGrid/utils/columnFactory.js.map +1 -1
- package/dist/components/DataGrid/utils/computeReplicaSelectionModel.js.map +1 -1
- package/dist/components/DataGrid/utils/extractColumnValidationMessages.js.map +1 -1
- package/dist/components/DataGrid/utils/getCellClassName.d.ts.map +1 -1
- package/dist/components/DataGrid/utils/getCellClassName.js +8 -8
- package/dist/components/DataGrid/utils/getCellClassName.js.map +1 -1
- package/dist/components/DataGrid/utils/json-rx/JsonRx.js.map +1 -1
- package/dist/components/DataGrid/utils/modelRowsToGrid.js.map +1 -1
- package/dist/components/DataGrid/utils/parseFreeTextUsingJsonSchemaType.js.map +1 -1
- package/dist/components/DataGrid/utils/splitPatch.js.map +1 -1
- package/dist/components/DateTimePicker/DateTimePicker.js.map +1 -1
- package/dist/components/DirectDownload/DirectDownload.js.map +1 -1
- package/dist/components/DirectDownloadButton.js.map +1 -1
- package/dist/components/DownloadCart/CreatePackageV2.js.map +1 -1
- package/dist/components/DownloadCart/DownloadIneligibleForPackagingFilesFromListButton.js.map +1 -1
- package/dist/components/DownloadCart/DownloadListActionsRequired.js.map +1 -1
- package/dist/components/DownloadCart/DownloadListTable.js.map +1 -1
- package/dist/components/DownloadCart/fileNameUtils.js.map +1 -1
- package/dist/components/DraggableDialog/DraggableDialog.js.map +1 -1
- package/dist/components/DynamicForm/DynamicFormModal.js.map +1 -1
- package/dist/components/Ecosystem/TableQueryEcosystem.js.map +1 -1
- package/dist/components/EntityAclEditor/EntityAclEditor.d.ts.map +1 -1
- package/dist/components/EntityAclEditor/EntityAclEditor.js +103 -103
- package/dist/components/EntityAclEditor/EntityAclEditor.js.map +1 -1
- package/dist/components/EntityAclEditor/useNotifyNewACLUsers.js.map +1 -1
- package/dist/components/EntityBadgeIcons/EntityBadgeIcons.js.map +1 -1
- package/dist/components/EntityCitation/EntityCitation.js.map +1 -1
- package/dist/components/EntityDownloadButton/EntityDownloadButton.js.map +1 -1
- package/dist/components/EntityDownloadConfirmation/EntityDownloadConfirmation.d.ts.map +1 -1
- package/dist/components/EntityDownloadConfirmation/EntityDownloadConfirmation.js +36 -30
- package/dist/components/EntityDownloadConfirmation/EntityDownloadConfirmation.js.map +1 -1
- package/dist/components/EntityFinder/EntityFinder.js.map +1 -1
- package/dist/components/EntityFinder/VersionSelectionType.js.map +1 -1
- package/dist/components/EntityFinder/details/configurations/EntityChildrenDetails.js.map +1 -1
- package/dist/components/EntityFinder/details/configurations/FavoritesDetails.js.map +1 -1
- package/dist/components/EntityFinder/details/configurations/ProjectListDetails.js.map +1 -1
- package/dist/components/EntityFinder/details/view/DetailsView.js.map +1 -1
- package/dist/components/EntityFinder/tree/EntityTree.js.map +1 -1
- package/dist/components/EntityFinder/tree/VirtualizedTree.js.map +1 -1
- package/dist/components/EntityFinder/useEntitySelection.js.map +1 -1
- package/dist/components/EntityForm/EntityForm.js.map +1 -1
- package/dist/components/EntityHeaderTable/EntityHeaderTable.js.map +1 -1
- package/dist/components/EntityHeaderTable/Filter.js.map +1 -1
- package/dist/components/EntityHeaderTable/useEntityHeaderTableState.js.map +1 -1
- package/dist/components/EntitySubjectsSelector/EntitySubjectsSelector.js.map +1 -1
- package/dist/components/EntityTreeTable/components/IdColumnHeader.js.map +1 -1
- package/dist/components/EntityTreeTable/hooks/useEntityTreeState.js.map +1 -1
- package/dist/components/EntityTreeTable/hooks/useTableColumns.js.map +1 -1
- package/dist/components/EntityTreeTable/hooks/useTableData.js.map +1 -1
- package/dist/components/EntityTreeTable/hooks/useTreeOperationsWithDirectFetch.js.map +1 -1
- package/dist/components/EntityUpload/EntityUpload.js.map +1 -1
- package/dist/components/ExperimentalMode/ExperimentalMode.js.map +1 -1
- package/dist/components/ExternalFileHandleLink/ExternalFileHandleLink.js.map +1 -1
- package/dist/components/FeaturedDataTabs/FacetPlotsCard.js.map +1 -1
- package/dist/components/FeaturedDataTabs/QueryPerFacetPlotsCard.js.map +1 -1
- package/dist/components/FeaturedDataTabs/SingleQueryFacetPlotsCards.js.map +1 -1
- package/dist/components/FeaturedResearch/FeaturedResearch.js.map +1 -1
- package/dist/components/FeaturedToolsList/FeaturedToolsList.js.map +1 -1
- package/dist/components/FilePreview/FileHandleContentRenderer.js.map +1 -1
- package/dist/components/FilePreview/HtmlPreview/HtmlPreview.js.map +1 -1
- package/dist/components/FilePreview/PreviewRendererType.js.map +1 -1
- package/dist/components/Forum/DiscussionReply.js.map +1 -1
- package/dist/components/Forum/DiscussionSearchResult.js.map +1 -1
- package/dist/components/Forum/ForumTable.js.map +1 -1
- package/dist/components/Forum/ForumThreadEditor.js.map +1 -1
- package/dist/components/FullTextSearch/FullTextSearchUtils.js.map +1 -1
- package/dist/components/GenericCard/GenericCard.d.ts.map +1 -1
- package/dist/components/GenericCard/GenericCard.js +12 -7
- package/dist/components/GenericCard/GenericCard.js.map +1 -1
- package/dist/components/GenericCard/Linkify.js.map +1 -1
- package/dist/components/GenericCard/SynapseCardLabel.js.map +1 -1
- package/dist/components/GenericCard/TableRowGenericCard.js +105 -105
- package/dist/components/GenericCard/TableRowGenericCard.js.map +1 -1
- package/dist/components/Goals/Goals.Mobile.js.map +1 -1
- package/dist/components/Goals/Goals.js.map +1 -1
- package/dist/components/GoalsV2/GoalsV2.Mobile.js.map +1 -1
- package/dist/components/GoalsV2/GoalsV2.js.map +1 -1
- package/dist/components/GoalsV3/GoalsV3.Mobile.js.map +1 -1
- package/dist/components/GoalsV3/GoalsV3.js.map +1 -1
- package/dist/components/GoogleMap/SynapseUserMarker.js.map +1 -1
- package/dist/components/HasAccess/AccessIcon.js.map +1 -1
- package/dist/components/HasAccess/useHasAccess.js.map +1 -1
- package/dist/components/HeaderCard/HeaderCardV2.js.map +1 -1
- package/dist/components/HeaderCard.d.ts +6 -1
- package/dist/components/HeaderCard.d.ts.map +1 -1
- package/dist/components/HeaderCard.js +107 -76
- package/dist/components/HeaderCard.js.map +1 -1
- package/dist/components/HexGrid/HexGrid.js.map +1 -1
- package/dist/components/IconList.js.map +1 -1
- package/dist/components/ImageCardGridWithLinks/ImageCardGridWithLinks.js.map +1 -1
- package/dist/components/ImageFromSynapseTable.js.map +1 -1
- package/dist/components/JSONArrayEditor/useParseCsv.js.map +1 -1
- package/dist/components/JsonSchemaForm/templates/ArrayFieldDescriptionTemplate.js.map +1 -1
- package/dist/components/JsonSchemaForm/templates/ArrayFieldItemTemplate.js.map +1 -1
- package/dist/components/JsonSchemaForm/templates/BaseInputTemplate.js.map +1 -1
- package/dist/components/JsonSchemaForm/templates/FieldTemplate.js.map +1 -1
- package/dist/components/JsonSchemaForm/templates/RJSFInputLabel.js.map +1 -1
- package/dist/components/Markdown/MarkdownGithub.js.map +1 -1
- package/dist/components/Markdown/MarkdownSynapse.js.map +1 -1
- package/dist/components/Markdown/MarkdownUtils.js.map +1 -1
- package/dist/components/Markdown/SynapseWikiContext.js.map +1 -1
- package/dist/components/Markdown/UserMentionModal.js.map +1 -1
- package/dist/components/Markdown/widget/MarkdownProvenanceGraph.js.map +1 -1
- package/dist/components/MissingQueryResultsWarning/MissingQueryResultsWarning.js.map +1 -1
- package/dist/components/ModalDownload/ModalDownload.js.map +1 -1
- package/dist/components/OAuthClientAclEditor/OAuthClientAclEditor.d.ts.map +1 -1
- package/dist/components/OAuthClientAclEditor/OAuthClientAclEditor.js +45 -39
- package/dist/components/OAuthClientAclEditor/OAuthClientAclEditor.js.map +1 -1
- package/dist/components/OAuthClientManagement/OAuthManagement.js.map +1 -1
- package/dist/components/PageProgress/PageProgress.js.map +1 -1
- package/dist/components/Plot/DotPlot.js.map +1 -1
- package/dist/components/Plot/Plot.js.map +1 -1
- package/dist/components/Plot/SynapsePlot.js.map +1 -1
- package/dist/components/Plot/ThemesPlot.js.map +1 -1
- package/dist/components/Plot/UpsetPlot.js.map +1 -1
- package/dist/components/PortalAclEditor/PortalAclEditor.d.ts.map +1 -1
- package/dist/components/PortalAclEditor/PortalAclEditor.js +43 -41
- package/dist/components/PortalAclEditor/PortalAclEditor.js.map +1 -1
- package/dist/components/PortalFeaturedPartners/PortalFeaturedPartners.js.map +1 -1
- package/dist/components/PortalList/CreatePortalModal.js.map +1 -1
- package/dist/components/ProgrammaticInstructionsModal/ProgrammaticInstructionsModal.js.map +1 -1
- package/dist/components/ProgrammaticTableDownload/ProgrammaticTableDownload.js.map +1 -1
- package/dist/components/Programs/Programs.Mobile.js.map +1 -1
- package/dist/components/Programs/Programs.js.map +1 -1
- package/dist/components/ProvenanceGraph/ProvenanceExternalIcon.js.map +1 -1
- package/dist/components/ProvenanceGraph/ProvenanceGraph.js.map +1 -1
- package/dist/components/ProvenanceGraph/ProvenanceGraphUtils.js.map +1 -1
- package/dist/components/ProvenanceGraph/ProvenanceUtils.js.map +1 -1
- package/dist/components/QueryCount/QueryCount.js.map +1 -1
- package/dist/components/QueryCountButton/QueryCountButton.js.map +1 -1
- package/dist/components/QueryVisualizationWrapper/QueryVisualizationWrapper.js.map +1 -1
- package/dist/components/QueryWrapper/QueryWrapper.js.map +1 -1
- package/dist/components/QueryWrapper/TableQueryUseQueryOptions.js.map +1 -1
- package/dist/components/QueryWrapper/TableRowSelectionState.js.map +1 -1
- package/dist/components/QueryWrapper/generateEncodedPathAndQueryForSelectedFacetURL.js.map +1 -1
- package/dist/components/QueryWrapper/useGetQueryMetadata.js.map +1 -1
- package/dist/components/QueryWrapperErrorBoundary.js.map +1 -1
- package/dist/components/QueryWrapperPlotNav/QueryWrapperPlotNav.js.map +1 -1
- package/dist/components/QueryWrapperPlotNav/UseRowSet.js.map +1 -1
- package/dist/components/RecentPublicationsGrid/RecentPublicationsGrid.js.map +1 -1
- package/dist/components/ReleaseCard/ReleaseCardUtils.js.map +1 -1
- package/dist/components/ResizableContainer/hooks/useResizable.js.map +1 -1
- package/dist/components/Resources/Resources.Mobile.js.map +1 -1
- package/dist/components/Resources/Resources.js.map +1 -1
- package/dist/components/RowDataTable/RowDataTableWithQuery.js.map +1 -1
- package/dist/components/SageResourcesPopover/SageResourcesPopover.js.map +1 -1
- package/dist/components/SchemaDrivenAnnotationEditor/AnnotationEditorUtils.js.map +1 -1
- package/dist/components/SetAccessRequirementCommonFields/SetAccessRequirementCommonFields.js.map +1 -1
- package/dist/components/SetManagedAccessRequirementFields/SetManagedAccessRequirementFields.js.map +1 -1
- package/dist/components/SmartLink/SmartButton.js.map +1 -1
- package/dist/components/SmartLink/SmartLink.js.map +1 -1
- package/dist/components/SourceAppImage.js.map +1 -1
- package/dist/components/StandaloneQueryWrapper/StandaloneQueryWrapper.js.map +1 -1
- package/dist/components/StatisticsPlot.js.map +1 -1
- package/dist/components/StorybookComponentWrapper.js.map +1 -1
- package/dist/components/SubsectionRowRenderer/SubsectionRowRenderer.js.map +1 -1
- package/dist/components/SustainabilityScorecard/SustainabilityScorecard.js.map +1 -1
- package/dist/components/SynapseChat/GridAgentChat.js.map +1 -1
- package/dist/components/SynapseChat/SynapseChatInteraction.js.map +1 -1
- package/dist/components/SynapseChat/SynapseChatMessage.js.map +1 -1
- package/dist/components/SynapseChat/extractMessageFromTraceEvent.js.map +1 -1
- package/dist/components/SynapseForm/StepsSideNav.js.map +1 -1
- package/dist/components/SynapseForm/SummaryTable.js.map +1 -1
- package/dist/components/SynapseForm/SynapseForm.js +4 -2
- package/dist/components/SynapseForm/SynapseForm.js.map +1 -1
- package/dist/components/SynapseForm/SynapseFormWrapper.js.map +1 -1
- package/dist/components/SynapseHomepageV2/SynapseByTheNumbersItem.js.map +1 -1
- package/dist/components/SynapseHomepageV2/SynapseFeatureItem.js.map +1 -1
- package/dist/components/SynapseHomepageV2/SynapseHomepageChatSearch.js.map +1 -1
- package/dist/components/SynapseHomepageV2/SynapseHomepageSearch.js.map +1 -1
- package/dist/components/SynapseHomepageV2/SynapseInActionItem.js.map +1 -1
- package/dist/components/SynapseHomepageV2/SynapsePlans.js.map +1 -1
- package/dist/components/SynapseHomepageV2/SynapseTrendingProjects.js.map +1 -1
- package/dist/components/SynapseNavDrawer/SynapseNavDrawer.d.ts +8 -7
- package/dist/components/SynapseNavDrawer/SynapseNavDrawer.d.ts.map +1 -1
- package/dist/components/SynapseNavDrawer/SynapseNavDrawer.js +173 -164
- package/dist/components/SynapseNavDrawer/SynapseNavDrawer.js.map +1 -1
- package/dist/components/SynapsePortalBanners/SynapsePortalBanners.js.map +1 -1
- package/dist/components/SynapseSearchPageResults/SearchFacetPanel/SearchFacetPanel.js.map +1 -1
- package/dist/components/SynapseSearchPageResults/SearchFacetPanel/SearchFacetPanelUtils.js.map +1 -1
- package/dist/components/SynapseSearchPageResults/SynapseSearchPageResults.js.map +1 -1
- package/dist/components/SynapseTable/EntityIDColumnCopyIcon.js.map +1 -1
- package/dist/components/SynapseTable/NoContentPlaceholderType.js.map +1 -1
- package/dist/components/SynapseTable/RowSelection/RowSelectionControls.js.map +1 -1
- package/dist/components/SynapseTable/SynapseTableCell/SynapseTableCell.js.map +1 -1
- package/dist/components/SynapseTable/SynapseTableRenderers.js.map +1 -1
- package/dist/components/SynapseTable/datasets/DatasetItemsEditor.js.map +1 -1
- package/dist/components/SynapseTable/table-top/ColumnSelection.js.map +1 -1
- package/dist/components/SynapseTable/table-top/DownloadOptions.js.map +1 -1
- package/dist/components/SynapseTable/usePrefetchTableData.js.map +1 -1
- package/dist/components/TableColumnSchemaEditor/ColumnModelForm.js.map +1 -1
- package/dist/components/TableColumnSchemaEditor/ColumnModelFormFields/DefaultValueField.js.map +1 -1
- package/dist/components/TableColumnSchemaEditor/ImportTableColumnsButton.js.map +1 -1
- package/dist/components/TableColumnSchemaEditor/TableColumnSchemaEditorUtils.d.ts +1 -1
- package/dist/components/TableColumnSchemaEditor/TableColumnSchemaEditorUtils.d.ts.map +1 -1
- package/dist/components/TableColumnSchemaEditor/TableColumnSchemaEditorUtils.js.map +1 -1
- package/dist/components/TableColumnSchemaEditor/TableColumnSchemaForm.js.map +1 -1
- package/dist/components/TableColumnSchemaEditor/TableColumnSchemaFormReducer.js.map +1 -1
- package/dist/components/TableColumnSchemaEditor/Validators/ColumnModelValidator.js.map +1 -1
- package/dist/components/TableColumnSchemaEditor/Validators/DatetimeSchema.js.map +1 -1
- package/dist/components/TanStackTable/ColumnHeader.d.ts +1 -0
- package/dist/components/TanStackTable/ColumnHeader.d.ts.map +1 -1
- package/dist/components/TanStackTable/ColumnHeader.js +8 -8
- package/dist/components/TanStackTable/ColumnHeader.js.map +1 -1
- package/dist/components/TanStackTable/ColumnHeaderEnumFilter.js.map +1 -1
- package/dist/components/TanStackTable/TableBody.js.map +1 -1
- package/dist/components/TeamSubjectsSelector/TeamSubjectsSelector.js.map +1 -1
- package/dist/components/TextField/TextField.js.map +1 -1
- package/dist/components/TimelinePlot/TimelinePhase.js.map +1 -1
- package/dist/components/TimelinePlot/TimelinePlot.js.map +1 -1
- package/dist/components/TimelinePlot/TimelinePlotSpeciesSelector.js.map +1 -1
- package/dist/components/UserCard/Avatar.js.map +1 -1
- package/dist/components/UserCardList/UserCardList.js.map +1 -1
- package/dist/components/UserCardList/UserCardListGroups/UserCardListGroups.Mobile.js.map +1 -1
- package/dist/components/UserCardList/UserCardListRotate.js.map +1 -1
- package/dist/components/UserOrTeamBadge/useUserOrTeam.js.map +1 -1
- package/dist/components/UserProfileLinks/UserProjects.js.map +1 -1
- package/dist/components/UserSearchBox/UserSearchBox.js.map +1 -1
- package/dist/components/Webhook/WebhookDashboard.js.map +1 -1
- package/dist/components/WikiMarkdownEditor/WikiMarkdownEditor.js.map +1 -1
- package/dist/components/WikiMarkdownEditorButton/WikiMarkdownEditorButton.js.map +1 -1
- package/dist/components/dataaccess/AccessApprovalsTable.js.map +1 -1
- package/dist/components/dataaccess/AccessRequestSubmissionTable.js.map +1 -1
- package/dist/components/dataaccess/SubmissionPage/SubmissionPage.js.map +1 -1
- package/dist/components/dataaccess/UseAccessRequirementTable.js.map +1 -1
- package/dist/components/dataaccess/UserAccessRequestHistory/UserAccessRequestHistoryTable.js.map +1 -1
- package/dist/components/doi/CreateOrUpdateDoiModal.js.map +1 -1
- package/dist/components/entity/page/CreatedByModifiedBy.js.map +1 -1
- package/dist/components/entity/page/action_menu/EntityActionMenu.js.map +1 -1
- package/dist/components/entity/page/title_bar/useDataCiteUsage.js.map +1 -1
- package/dist/components/entity/page/title_bar/useGetMentions.js.map +1 -1
- package/dist/components/error/ErrorPage.js.map +1 -1
- package/dist/components/favorites/FavoritesPage.js.map +1 -1
- package/dist/components/file/upload/BasicFileHandleUpload.js.map +1 -1
- package/dist/components/layout/SWCHeader.d.ts +9 -0
- package/dist/components/layout/SWCHeader.d.ts.map +1 -0
- package/dist/components/layout/SWCHeader.js +19 -0
- package/dist/components/layout/SWCHeader.js.map +1 -0
- package/dist/components/layout/SWCPageLayout.d.ts +9 -0
- package/dist/components/layout/SWCPageLayout.d.ts.map +1 -0
- package/dist/components/layout/SWCPageLayout.js +14 -0
- package/dist/components/layout/SWCPageLayout.js.map +1 -0
- package/dist/components/menu/ComplexMenu.js.map +1 -1
- package/dist/components/row_renderers/utils/ChipContainer.js.map +1 -1
- package/dist/components/styled/StyledPopover.js.map +1 -1
- package/dist/components/table/CsvPreview/CsvPreview.js +2 -1
- package/dist/components/table/CsvPreview/CsvPreview.js.map +1 -1
- package/dist/components/table/CsvPreview/CsvPreviewDialog.js.map +1 -1
- package/dist/components/trash/TrashCanList.js.map +1 -1
- package/dist/components/widgets/FileHandleLink.js.map +1 -1
- package/dist/components/widgets/RangeSlider/RangeSlider.js.map +1 -1
- package/dist/components/widgets/SynapseVideo.js.map +1 -1
- package/dist/components/widgets/facet-nav/FacetNavPanel.js.map +1 -1
- package/dist/components/widgets/facet-nav/PlotsContainer.js.map +1 -1
- package/dist/components/widgets/facet-nav/SelectionCriteriaPills.js.map +1 -1
- package/dist/components/widgets/facet-nav/useFacetPlots.js.map +1 -1
- package/dist/components/widgets/query-filter/CombinedRangeFacetFilter.js.map +1 -1
- package/dist/components/widgets/query-filter/EnumFacetFilter/EnumFacetFilter.js.map +1 -1
- package/dist/components/widgets/query-filter/FacetFilterControls.js.map +1 -1
- package/dist/components/widgets/query-filter/RangeFacetFilter.js.map +1 -1
- package/dist/components/widgets/query-filter/RangeFacetFilterUI.js.map +1 -1
- package/dist/features/curator/GridPage/components/GridPageTitle.d.ts.map +1 -1
- package/dist/features/curator/GridPage/components/GridPageTitle.js +23 -30
- package/dist/features/curator/GridPage/components/GridPageTitle.js.map +1 -1
- package/dist/features/curator/dashboard/CuratorDashboard.d.ts +2 -0
- package/dist/features/curator/dashboard/CuratorDashboard.d.ts.map +1 -0
- package/dist/features/curator/dashboard/CuratorDashboard.js +45 -0
- package/dist/features/curator/dashboard/CuratorDashboard.js.map +1 -0
- package/dist/features/curator/dashboard/components/CurationTaskCard.css +1 -0
- package/dist/features/curator/dashboard/components/CurationTaskCard.d.ts +9 -0
- package/dist/features/curator/dashboard/components/CurationTaskCard.d.ts.map +1 -0
- package/dist/features/curator/dashboard/components/CurationTaskCard.js +106 -0
- package/dist/features/curator/dashboard/components/CurationTaskCard.js.map +1 -0
- package/dist/features/curator/dashboard/components/CurationTaskCard.module.js +12 -0
- package/dist/features/curator/dashboard/components/CurationTaskCard.module.js.map +1 -0
- package/dist/features/curator/dashboard/components/CurationTaskCard.module.scss +52 -0
- package/dist/features/curator/dashboard/components/NextStepButton.css +1 -0
- package/dist/features/curator/dashboard/components/NextStepButton.d.ts +14 -0
- package/dist/features/curator/dashboard/components/NextStepButton.d.ts.map +1 -0
- package/dist/features/curator/dashboard/components/NextStepButton.js +35 -0
- package/dist/features/curator/dashboard/components/NextStepButton.js.map +1 -0
- package/dist/features/curator/dashboard/components/NextStepButton.module.js +11 -0
- package/dist/features/curator/dashboard/components/NextStepButton.module.js.map +1 -0
- package/dist/features/curator/dashboard/components/NextStepButton.module.scss +57 -0
- package/dist/features/curator/dashboard/components/UserOrTeamChip.css +1 -1
- package/dist/features/curator/dashboard/components/UserOrTeamChip.module.js +1 -1
- package/dist/features/curator/dashboard/components/UserOrTeamChip.module.js.map +1 -1
- package/dist/features/curator/dashboard/components/UserOrTeamChip.module.scss +5 -5
- package/dist/features/curator/dashboard/components/shared.css +1 -0
- package/dist/features/curator/dashboard/components/shared.module.js +5 -0
- package/dist/features/curator/dashboard/components/shared.module.js.map +1 -0
- package/dist/features/curator/dashboard/components/shared.module.scss +8 -0
- package/dist/features/entity/metadata-task/components/MetadataTaskTableActionCell.d.ts +0 -2
- package/dist/features/entity/metadata-task/components/MetadataTaskTableActionCell.d.ts.map +1 -1
- package/dist/features/entity/metadata-task/components/MetadataTaskTableActionCell.js +16 -34
- package/dist/features/entity/metadata-task/components/MetadataTaskTableActionCell.js.map +1 -1
- package/dist/features/entity/metadata-task/components/MetadataTasksTableAssigneeCell.js.map +1 -1
- package/dist/features/entity/metadata-task/hooks/useGetOrCreateGridSessionForSource.js.map +1 -1
- package/dist/features/entity/metadata-task/hooks/useGridSessionForCurationTask.js.map +1 -1
- package/dist/features/entity/metadata-task/hooks/useGridSessionForCurationTask_legacy.js.map +1 -1
- package/dist/features/entity/metadata-task/hooks/useMetadataTaskTable.js +1 -1
- package/dist/features/entity/metadata-task/hooks/useMetadataTaskTable.js.map +1 -1
- package/dist/features/entity/metadata-task/hooks/useOpenCuratorButton.d.ts +10 -0
- package/dist/features/entity/metadata-task/hooks/useOpenCuratorButton.d.ts.map +1 -0
- package/dist/features/entity/metadata-task/hooks/useOpenCuratorButton.js +37 -0
- package/dist/features/entity/metadata-task/hooks/useOpenCuratorButton.js.map +1 -0
- package/dist/features/entity/metadata-task/utils/constants.d.ts +5 -0
- package/dist/features/entity/metadata-task/utils/constants.d.ts.map +1 -0
- package/dist/features/entity/metadata-task/utils/constants.js +6 -0
- package/dist/features/entity/metadata-task/utils/constants.js.map +1 -0
- package/dist/mocks/challenge/mockChallenge.js.map +1 -1
- package/dist/mocks/entity/mockDataset.js.map +1 -1
- package/dist/mocks/entity/mockDatasetCollection.js.map +1 -1
- package/dist/mocks/entity/mockFileEntity.js.map +1 -1
- package/dist/mocks/entity/mockFileView.js.map +1 -1
- package/dist/mocks/entity/mockGeneratedEntityData.js.map +1 -1
- package/dist/mocks/entity/mockProject.js.map +1 -1
- package/dist/mocks/entity/mockProjectView.js.map +1 -1
- package/dist/mocks/entity/mockRootEntity.js.map +1 -1
- package/dist/mocks/entity/mockTableEntity.js.map +1 -1
- package/dist/mocks/mockWiki.js.map +1 -1
- package/dist/mocks/msw/handlers/asyncJobHandlers.js.map +1 -1
- package/dist/mocks/msw/handlers/challengeHandlers.js.map +1 -1
- package/dist/mocks/msw/handlers/changePasswordHandlers.js.map +1 -1
- package/dist/mocks/msw/handlers/discussionHandlers.js.map +1 -1
- package/dist/mocks/msw/handlers/entityHandlers.js.map +1 -1
- package/dist/mocks/msw/handlers/fileHandlers.js.map +1 -1
- package/dist/mocks/msw/handlers/gridHandlers.js.map +1 -1
- package/dist/mocks/msw/handlers/personalAccessTokenHandlers.js.map +1 -1
- package/dist/mocks/msw/handlers/subscriptionHandlers.js.map +1 -1
- package/dist/mocks/msw/handlers/teamHandlers.js.map +1 -1
- package/dist/mocks/msw/handlers/userProfileHandlers.js.map +1 -1
- package/dist/mocks/msw/handlers/wikiHandlers.js.map +1 -1
- package/dist/mocks/provenance/mockActivity.js.map +1 -1
- package/dist/mocks/query/mockReleaseCardsTableQueryResultBundle.js.map +1 -1
- package/dist/ror-client/index.js.map +1 -1
- package/dist/style/components/_cards.scss +4 -0
- package/dist/style/components/_data-grid-extra.css +1 -1
- package/dist/style/components/_data-grid-extra.scss +2 -0
- package/dist/style/main.css +1 -1
- package/dist/synapse-client/HttpClient.js.map +1 -1
- package/dist/synapse-client/SynapseClient.js.map +1 -1
- package/dist/synapse-queries/QueryMatching.test-utils.js.map +1 -1
- package/dist/synapse-queries/auth/useTwoFactorEnrollment.js.map +1 -1
- package/dist/synapse-queries/curation/task/useCurationTask.d.ts +1 -1
- package/dist/synapse-queries/curation/task/useCurationTask.d.ts.map +1 -1
- package/dist/synapse-queries/curation/task/useCurationTask.js +1 -1
- package/dist/synapse-queries/curation/task/useCurationTask.js.map +1 -1
- package/dist/synapse-queries/dataaccess/useRestrictionInformation.js.map +1 -1
- package/dist/synapse-queries/doi/useDOI.js.map +1 -1
- package/dist/synapse-queries/download/useDownloadList.js.map +1 -1
- package/dist/synapse-queries/entity/useEntity.js.map +1 -1
- package/dist/synapse-queries/entity/useEntityBundle.js.map +1 -1
- package/dist/synapse-queries/entity/useExportTableQueryToAnalysisPlatform.js.map +1 -1
- package/dist/synapse-queries/entity/useExportToTerra.js.map +1 -1
- package/dist/synapse-queries/entity/useGetQueryResultBundle.js.map +1 -1
- package/dist/synapse-queries/entity/useSchema.js.map +1 -1
- package/dist/synapse-queries/file/UploadToS3.js.map +1 -1
- package/dist/synapse-queries/file/useDirectUploadToS3.js.map +1 -1
- package/dist/synapse-queries/file/useFiles.js.map +1 -1
- package/dist/synapse-queries/forum/useReply.js.map +1 -1
- package/dist/synapse-queries/forum/useThread.js.map +1 -1
- package/dist/synapse-queries/grid/useEstablishWebsocketConnection.d.ts +2 -0
- package/dist/synapse-queries/grid/useEstablishWebsocketConnection.d.ts.map +1 -1
- package/dist/synapse-queries/grid/useEstablishWebsocketConnection.js.map +1 -1
- package/dist/synapse-queries/grid/useExportGrid.js.map +1 -1
- package/dist/synapse-queries/grid/useGridSession.js.map +1 -1
- package/dist/synapse-queries/grid/useImportCsvIntoGrid.js.map +1 -1
- package/dist/synapse-queries/subscription/useSubscription.js.map +1 -1
- package/dist/synapse-queries/table/useGetCsvPreview.js.map +1 -1
- package/dist/synapse-queries/table/useTableUpdateTransaction.js.map +1 -1
- package/dist/synapse-queries/team/useTeamMembers.js.map +1 -1
- package/dist/synapse-queries/user/useGetUserChallenges.js.map +1 -1
- package/dist/synapse-queries/user/useUserBundle.js.map +1 -1
- package/dist/synapse-queries/user/useUserGroupHeader.js.map +1 -1
- package/dist/testutils/ReactQueryMockUtils.js.map +1 -1
- package/dist/theme/ThemeProvider.js.map +1 -1
- package/dist/tsconfig.build.tsbuildinfo +1 -1
- package/dist/utils/AppUtils/session/SynapseSessionManager.js.map +1 -1
- package/dist/utils/AppUtils/session/useSessionManager.js.map +1 -1
- package/dist/utils/PermissionLevelToAccessType.js.map +1 -1
- package/dist/utils/challenge/evaluation/EvaluationUtils.js.map +1 -1
- package/dist/utils/context/SynapseContext.js.map +1 -1
- package/dist/utils/functions/AccessControlListUtils.d.ts +4 -0
- package/dist/utils/functions/AccessControlListUtils.d.ts.map +1 -1
- package/dist/utils/functions/AccessControlListUtils.js +12 -1
- package/dist/utils/functions/AccessControlListUtils.js.map +1 -1
- package/dist/utils/functions/GridApiUtils.js.map +1 -1
- package/dist/utils/functions/QueryFilterUtils.js.map +1 -1
- package/dist/utils/functions/RealmUtils.d.ts +4 -0
- package/dist/utils/functions/RealmUtils.d.ts.map +1 -1
- package/dist/utils/functions/RealmUtils.js +9 -3
- package/dist/utils/functions/RealmUtils.js.map +1 -1
- package/dist/utils/functions/SanitizeHtmlUtils.js.map +1 -1
- package/dist/utils/functions/SanitizeHtmlUtils.test-utils.js.map +1 -1
- package/dist/utils/functions/SqlFunctions.js.map +1 -1
- package/dist/utils/functions/StringUtils.js.map +1 -1
- package/dist/utils/functions/deepLinkingUtils.js.map +1 -1
- package/dist/utils/functions/getDataFromFromStorage.js.map +1 -1
- package/dist/utils/functions/getEndpoint.js.map +1 -1
- package/dist/utils/functions/getUserData.js.map +1 -1
- package/dist/utils/functions/queryUtils.js.map +1 -1
- package/dist/utils/functions/testDownloadSpeed.js.map +1 -1
- package/dist/utils/hooks/useConfirmItems.js.map +1 -1
- package/dist/utils/hooks/useCookiePreferences.js.map +1 -1
- package/dist/utils/hooks/useCreateShortUrl.js.map +1 -1
- package/dist/utils/hooks/useDetectSSOCode.js.map +1 -1
- package/dist/utils/hooks/useDirectDownloadHandler.js.map +1 -1
- package/dist/utils/hooks/useGetGoalData.js.map +1 -1
- package/dist/utils/hooks/useGetInfoFromIds.js.map +1 -1
- package/dist/utils/hooks/useImageUrlUtils.js.map +1 -1
- package/dist/utils/hooks/useImmutableTableQuery/useImmutableTableQuery.js.map +1 -1
- package/dist/utils/hooks/useImmutableTableQuery/useTableQueryReducer.js.map +1 -1
- package/dist/utils/hooks/useIsBot.js.map +1 -1
- package/dist/utils/hooks/useListState.js.map +1 -1
- package/dist/utils/hooks/useLogin.d.ts.map +1 -1
- package/dist/utils/hooks/useLogin.js +53 -52
- package/dist/utils/hooks/useLogin.js.map +1 -1
- package/dist/utils/hooks/useMutuallyExclusiveState.js.map +1 -1
- package/dist/utils/hooks/useOverlay.js.map +1 -1
- package/dist/utils/hooks/usePreFetchResource.js.map +1 -1
- package/dist/utils/hooks/useQuerySearchParam.js.map +1 -1
- package/dist/utils/hooks/useScrollFadeTransition.js.map +1 -1
- package/dist/utils/hooks/useSet.js.map +1 -1
- package/dist/utils/hooks/useSourceAppConfigs.js.map +1 -1
- package/dist/utils/hooks/useTableImageUrl.js.map +1 -1
- package/dist/utils/hooks/useUploadFileEntity/useCreatePathsAndGetParentId.js.map +1 -1
- package/dist/utils/hooks/useUploadFileEntity/useLinkFileEntityToURL.js.map +1 -1
- package/dist/utils/hooks/useUploadFileEntity/usePrepareFileEntityUpload.js.map +1 -1
- package/dist/utils/hooks/useUploadFileEntity/useTrackFileUploads.js.map +1 -1
- package/dist/utils/hooks/useUploadFileEntity/useUploadFileEntities.js.map +1 -1
- package/dist/utils/hooks/useUploadFileEntity/useUploadFiles.js.map +1 -1
- package/dist/utils/hooks/useUploadFileEntity/willUploadsExceedStorageLimit.js.map +1 -1
- package/dist/utils/html/TargetEnum.js.map +1 -1
- package/dist/utils/jsonschema/SchemaAnnotationUtils.js.map +1 -1
- package/package.json +4 -4
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"QueryVisualizationWrapper.js","names":[],"sources":["../../../src/components/QueryVisualizationWrapper/QueryVisualizationWrapper.tsx"],"sourcesContent":["import { getDisplayValue } from '@/utils/functions/getDataFromFromStorage'\nimport { unCamelCase } from '@/utils/functions/unCamelCase'\nimport useMutuallyExclusiveState from '@/utils/hooks/useMutuallyExclusiveState'\nimport { useQuery } from '@tanstack/react-query'\nimport { ReactNode, useCallback, useEffect, useMemo, useState } from 'react'\nimport { useDeepCompareMemoize } from 'use-deep-compare-effect'\nimport { useQueryContext } from '../QueryContext'\nimport { useGetQueryMetadata } from '../QueryWrapper/useGetQueryMetadata'\nimport { NoContentPlaceholderType } from '../SynapseTable/NoContentPlaceholderType'\nimport { ExternalAnalysisPlatform } from '../SynapseTable/export/ExternalAnalysisPlatformsConstants'\nimport NoContentPlaceholderComponent from './NoContentPlaceholder'\nimport {\n QueryVisualizationContextProvider,\n QueryVisualizationContextType,\n} from './QueryVisualizationContext'\n\n// By default, show no external analysis platforms.\nconst DEFAULT_ENABLED_ANALYSIS_PLATFORMS: ExternalAnalysisPlatform[] = []\n\ntype ColumnOrFacetHelpConfig = {\n /** Text that describes the column or facet */\n helpText: string\n /** The name of the column for which the markdown applies */\n columnName: string\n /** The JSON path matching a described JSON Column facet */\n jsonPath?: string\n}\n\nexport type QueryVisualizationWrapperProps = {\n children: ReactNode | ReactNode[]\n rgbIndex?: number\n /** The singular word to use to describe a what a row represents (e.g. \"file\"). Defaults to \"result\" */\n unitDescription?: string\n /** Mapping from column name to the name that should be shown for the column */\n columnAliases?: Record<string, string>\n visibleColumnCount?: number\n hiddenColumns?: string[]\n defaultShowPlots?: boolean\n hideCopyToClipboard?: boolean\n hideSearchBarControl?: boolean\n defaultShowSearchBar?: boolean\n showLastUpdatedOn?: boolean\n /** Default is INTERACTIVE */\n noContentPlaceholderType?: NoContentPlaceholderType\n isRowSelectionVisible?: boolean\n /** The set of columns that defines a uniqueness constraint on the table for the purposes of filtering based on row selection.\n * Note that Synapse tables have no internal concept of a primary key.\n */\n rowSelectionPrimaryKey?: string[]\n /** Look for additional filters using the given key. If not provided, the entity ID will be used.\n * @deprecated - configure the filter before passing a query */\n additionalFiltersSessionStorageKey?: string\n /** Configuration to add a help popover to each corresponding column header */\n helpConfiguration?: ColumnOrFacetHelpConfig[]\n hasCustomPlots?: boolean\n /** The set of external analysis platform to which the UI will support exporting data.\n * @default [] (no platforms are enabled) */\n enabledExternalAnalysisPlatforms?: ExternalAnalysisPlatform[]\n hideVisualizationsControl?: boolean\n}\n\n/**\n * QueryVisualizationWrapper manages UI state for components that query tables in Synapse. That state can be accessed\n * or updated using QueryVisualizationContext. A QueryVisualizationWrapper must be used within a QueryWrapper.\n */\nexport function QueryVisualizationWrapper(\n props: QueryVisualizationWrapperProps,\n) {\n const {\n noContentPlaceholderType = NoContentPlaceholderType.INTERACTIVE,\n defaultShowSearchBar = false,\n defaultShowPlots = true,\n hideCopyToClipboard = false,\n hideSearchBarControl = false,\n unitDescription = 'result',\n helpConfiguration,\n hasCustomPlots = false,\n visibleColumnCount = Infinity,\n enabledExternalAnalysisPlatforms = DEFAULT_ENABLED_ANALYSIS_PLATFORMS,\n } = props\n\n const columnAliases = useMemo(\n () => props.columnAliases ?? {},\n [props.columnAliases],\n )\n\n const {\n getCurrentQueryRequest,\n hasFacetedSelectColumn,\n hasResettableFilters,\n rowDataQueryOptions,\n } = useQueryContext()\n const { data: queryMetadata } = useGetQueryMetadata()\n\n // Get the selectColumns from either query so that creating the context isn't bottlenecked by one or the other\n // Use the previous result as placeholder data so we don't reset the selectColumns unless they have actually changed.\n const { data: selectColumnsFromRowData } = useQuery({\n ...rowDataQueryOptions,\n select: data => data.responseBody?.queryResult?.queryResults.headers,\n placeholderData: prevData => prevData,\n })\n const { data: selectColumnsFromMetadata } = useGetQueryMetadata({\n select: data => data.responseBody?.selectColumns,\n placeholderData: prevData => prevData,\n })\n // We deep-compare-memoize the selectColumns so we don't reset visible columns if the reference changes, but not the contents (e.g. on page change)\n const selectColumns = useDeepCompareMemoize(\n selectColumnsFromRowData ?? selectColumnsFromMetadata ?? [],\n )\n\n const [showSqlEditor, setShowSqlEditor] = useState(false)\n const [showPlots, setShowPlots] = useState(defaultShowPlots)\n const [showCopyToClipboard, setShowCopyToClipboard] = useState(\n !hideCopyToClipboard,\n )\n const [showFacetFilter, setShowFacetFilter] = useState(true)\n\n // The search bar and download confirmation should not be shown at the same time.\n const [\n showSearchBar,\n setShowSearchBar,\n showDownloadConfirmation,\n setShowDownloadConfirmation,\n ] = useMutuallyExclusiveState(\n defaultShowSearchBar && !hideSearchBarControl,\n false,\n )\n\n const [\n isShowingExportToAnalysisPlatformModal,\n setIsShowingExportToAnalysisPlatformModal,\n ] = useState<boolean>(false)\n\n const [visibleColumns, setVisibleColumns] = useState<string[]>([])\n\n const lastQueryRequest = useMemo(\n () => getCurrentQueryRequest(),\n [getCurrentQueryRequest],\n )\n\n useEffect(() => {\n // SWC-6030: If sql changes, reset what columns are visible\n setVisibleColumns(\n selectColumns.slice(0, visibleColumnCount).map(el => el.name),\n )\n }, [selectColumns, lastQueryRequest.query.sql, visibleColumnCount])\n\n const getColumnDisplayName = useCallback(\n (columnName: string, jsonPath?: string) => {\n // SWC-5982: if force-display-original-column-names is set, then just return the string\n const forceDisplayOriginalColumnName =\n localStorage.getItem('force-display-original-column-names') === 'true'\n\n if (!columnName || (forceDisplayOriginalColumnName && !jsonPath)) {\n return columnName\n }\n if (columnAliases[columnName]) {\n return columnAliases[columnName]\n }\n if (jsonPath) {\n const columnModel = queryMetadata?.columnModels?.find(\n cm => cm.name === columnName,\n )\n if (columnModel?.jsonSubColumns) {\n const jsonSubColumn = columnModel.jsonSubColumns.find(\n jsc => jsc.jsonPath === jsonPath,\n )\n if (jsonSubColumn) {\n return jsonSubColumn.name\n }\n }\n }\n return unCamelCase(columnName)\n },\n [columnAliases, queryMetadata?.columnModels],\n )\n\n const getHelpText = useCallback(\n (columnName: string, jsonPath?: string): string | undefined => {\n if (Array.isArray(helpConfiguration)) {\n const helpConfig = helpConfiguration.find(\n config =>\n config.columnName === columnName && config.jsonPath === jsonPath,\n )\n return helpConfig?.helpText\n }\n return undefined\n },\n [helpConfiguration],\n )\n\n const NoContentPlaceholder = useCallback(\n () => (\n <NoContentPlaceholderComponent\n type={noContentPlaceholderType}\n hasResettableFilters={hasResettableFilters}\n />\n ),\n [noContentPlaceholderType, hasResettableFilters],\n )\n\n const context: QueryVisualizationContextType = useMemo(\n () => ({\n columnsToShowInTable: visibleColumns,\n setColumnsToShowInTable: setVisibleColumns,\n rgbIndex: props.rgbIndex,\n unitDescription: unitDescription,\n showLastUpdatedOn: props.showLastUpdatedOn,\n getColumnDisplayName,\n getDisplayValue,\n getHelpText,\n NoContentPlaceholder,\n isShowingExportToAnalysisPlatformModal:\n isShowingExportToAnalysisPlatformModal,\n setIsShowingExportToAnalysisPlatformModal:\n setIsShowingExportToAnalysisPlatformModal,\n showFacetFilter: hasFacetedSelectColumn ? showFacetFilter : false,\n setShowFacetFilter,\n hideSearchBarControl,\n showSearchBar,\n setShowSearchBar,\n showDownloadConfirmation,\n setShowDownloadConfirmation,\n showSqlEditor,\n setShowSqlEditor,\n showPlots: hasCustomPlots || hasFacetedSelectColumn ? showPlots : false,\n setShowPlots,\n showCopyToClipboard,\n setShowCopyToClipboard,\n enabledExternalAnalysisPlatforms,\n }),\n [\n NoContentPlaceholder,\n getColumnDisplayName,\n getHelpText,\n hasFacetedSelectColumn,\n isShowingExportToAnalysisPlatformModal,\n props.rgbIndex,\n props.showLastUpdatedOn,\n setShowDownloadConfirmation,\n setShowSearchBar,\n showCopyToClipboard,\n showDownloadConfirmation,\n showFacetFilter,\n showPlots,\n showSearchBar,\n showSqlEditor,\n unitDescription,\n visibleColumns,\n hasCustomPlots,\n enabledExternalAnalysisPlatforms,\n ],\n )\n /**\n * Render the children without any formatting\n */\n const { children } = props\n return (\n <QueryVisualizationContextProvider queryVisualizationContext={context}>\n {children}\n </QueryVisualizationContextProvider>\n )\n}\n"],"mappings":";;;;;;;;;;;;;;AAiBA,IAAM,IAAiE,EAAE;AAgDzE,SAAgB,EACd,GACA;CACA,IAAM,EACJ,8BAA2B,EAAyB,aACpD,0BAAuB,IACvB,sBAAmB,IACnB,yBAAsB,IACtB,0BAAuB,IACvB,qBAAkB,UAClB,sBACA,oBAAiB,IACjB,wBAAqB,UACrB,sCAAmC,MACjC,GAEE,IAAgB,QACd,EAAM,iBAAiB,EAAE,EAC/B,CAAC,EAAM,cAAc,CACtB,EAEK,EACJ,2BACA,2BACA,yBACA,2BACE,GAAiB,EACf,EAAE,MAAM,MAAkB,GAAqB,EAI/C,EAAE,MAAM,MAA6B,EAAS;EAClD,GAAG;EACH,SAAQ,MAAQ,EAAK,cAAc,aAAa,aAAa;EAC7D,kBAAiB,MAAY;EAC9B,CAAC,EACI,EAAE,MAAM,MAA8B,EAAoB;EAC9D,SAAQ,MAAQ,EAAK,cAAc;EACnC,kBAAiB,MAAY;EAC9B,CAAC,EAEI,IAAgB,EACpB,KAA4B,KAA6B,EAAE,CAC5D,EAEK,CAAC,GAAe,KAAoB,EAAS,GAAM,EACnD,CAAC,GAAW,KAAgB,EAAS,EAAiB,EACtD,CAAC,GAAqB,KAA0B,EACpD,CAAC,EACF,EACK,CAAC,GAAiB,KAAsB,EAAS,GAAK,EAGtD,CACJ,GACA,GACA,GACA,KACE,EACF,KAAwB,CAAC,GACzB,GACD,EAEK,CACJ,GACA,KACE,EAAkB,GAAM,EAEtB,CAAC,GAAgB,KAAqB,EAAmB,EAAE,CAAC;AAOlE,SAAgB;AAEd,IACE,EAAc,MAAM,GAAG,EAAmB,CAAC,KAAI,MAAM,EAAG,KAAK,CAC9D;IACA;EAAC;EAVqB,QACjB,GAAwB,EAC9B,CAAC,EAAuB,CACzB,CAOmC,MAAM;EAAK;EAAmB,CAAC;CAEnE,IAAM,IAAuB,GAC1B,GAAoB,MAAsB;EAEzC,IAAM,IACJ,aAAa,QAAQ,sCAAsC,KAAK;AAElE,MAAI,CAAC,KAAe,KAAkC,CAAC,EACrD,QAAO;AAET,MAAI,EAAc,GAChB,QAAO,EAAc;AAEvB,MAAI,GAAU;GACZ,IAAM,IAAc,GAAe,cAAc,MAC/C,MAAM,EAAG,SAAS,EACnB;AACD,OAAI,GAAa,gBAAgB;IAC/B,IAAM,IAAgB,EAAY,eAAe,MAC/C,MAAO,EAAI,aAAa,EACzB;AACD,QAAI,EACF,QAAO,EAAc;;;AAI3B,SAAO,EAAY,EAAW;IAEhC,CAAC,GAAe,GAAe,aAAa,CAC7C,EAEK,IAAc,GACjB,GAAoB,MAA0C;AAC7D,MAAI,MAAM,QAAQ,EAAkB,CAKlC,QAJmB,EAAkB,MACnC,MACE,EAAO,eAAe,KAAc,EAAO,aAAa,EAC3D,EACkB;IAIvB,CAAC,EAAkB,CACpB,EAEK,IAAuB,QAEzB,kBAAC,GAAD;EACE,MAAM;EACgB;EACtB,CAAA,EAEJ,CAAC,GAA0B,EAAqB,CACjD,EAEK,KAAyC,SACtC;EACL,sBAAsB;EACtB,yBAAyB;EACzB,UAAU,EAAM;EACC;EACjB,mBAAmB,EAAM;EACzB;EACA;EACA;EACA,sBAAA;EAEE;EAEA;EACF,iBAAiB,IAAyB,IAAkB;EAC5D;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,WAAW,KAAkB,IAAyB,IAAY;EAClE;EACA;EACA;EACA;EACD,GACD;EACE;EACA;EACA;EACA;EACA;EACA,EAAM;EACN,EAAM;EACN;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACD,CACF,EAIK,EAAE,iBAAa;AACrB,QACE,kBAAC,IAAD;EAAmC,2BAA2B;EAC3D;EACiC,CAAA"}
|
|
1
|
+
{"version":3,"file":"QueryVisualizationWrapper.js","names":[],"sources":["../../../src/components/QueryVisualizationWrapper/QueryVisualizationWrapper.tsx"],"sourcesContent":["import { getDisplayValue } from '@/utils/functions/getDataFromFromStorage'\nimport { unCamelCase } from '@/utils/functions/unCamelCase'\nimport useMutuallyExclusiveState from '@/utils/hooks/useMutuallyExclusiveState'\nimport { useQuery } from '@tanstack/react-query'\nimport { ReactNode, useCallback, useEffect, useMemo, useState } from 'react'\nimport { useDeepCompareMemoize } from 'use-deep-compare-effect'\nimport { useQueryContext } from '../QueryContext'\nimport { useGetQueryMetadata } from '../QueryWrapper/useGetQueryMetadata'\nimport { NoContentPlaceholderType } from '../SynapseTable/NoContentPlaceholderType'\nimport { ExternalAnalysisPlatform } from '../SynapseTable/export/ExternalAnalysisPlatformsConstants'\nimport NoContentPlaceholderComponent from './NoContentPlaceholder'\nimport {\n QueryVisualizationContextProvider,\n QueryVisualizationContextType,\n} from './QueryVisualizationContext'\n\n// By default, show no external analysis platforms.\nconst DEFAULT_ENABLED_ANALYSIS_PLATFORMS: ExternalAnalysisPlatform[] = []\n\ntype ColumnOrFacetHelpConfig = {\n /** Text that describes the column or facet */\n helpText: string\n /** The name of the column for which the markdown applies */\n columnName: string\n /** The JSON path matching a described JSON Column facet */\n jsonPath?: string\n}\n\nexport type QueryVisualizationWrapperProps = {\n children: ReactNode | ReactNode[]\n rgbIndex?: number\n /** The singular word to use to describe a what a row represents (e.g. \"file\"). Defaults to \"result\" */\n unitDescription?: string\n /** Mapping from column name to the name that should be shown for the column */\n columnAliases?: Record<string, string>\n visibleColumnCount?: number\n hiddenColumns?: string[]\n defaultShowPlots?: boolean\n hideCopyToClipboard?: boolean\n hideSearchBarControl?: boolean\n defaultShowSearchBar?: boolean\n showLastUpdatedOn?: boolean\n /** Default is INTERACTIVE */\n noContentPlaceholderType?: NoContentPlaceholderType\n isRowSelectionVisible?: boolean\n /** The set of columns that defines a uniqueness constraint on the table for the purposes of filtering based on row selection.\n * Note that Synapse tables have no internal concept of a primary key.\n */\n rowSelectionPrimaryKey?: string[]\n /** Look for additional filters using the given key. If not provided, the entity ID will be used.\n * @deprecated - configure the filter before passing a query */\n additionalFiltersSessionStorageKey?: string\n /** Configuration to add a help popover to each corresponding column header */\n helpConfiguration?: ColumnOrFacetHelpConfig[]\n hasCustomPlots?: boolean\n /** The set of external analysis platform to which the UI will support exporting data.\n * @default [] (no platforms are enabled) */\n enabledExternalAnalysisPlatforms?: ExternalAnalysisPlatform[]\n hideVisualizationsControl?: boolean\n}\n\n/**\n * QueryVisualizationWrapper manages UI state for components that query tables in Synapse. That state can be accessed\n * or updated using QueryVisualizationContext. A QueryVisualizationWrapper must be used within a QueryWrapper.\n */\nexport function QueryVisualizationWrapper(\n props: QueryVisualizationWrapperProps,\n) {\n const {\n noContentPlaceholderType = NoContentPlaceholderType.INTERACTIVE,\n defaultShowSearchBar = false,\n defaultShowPlots = true,\n hideCopyToClipboard = false,\n hideSearchBarControl = false,\n unitDescription = 'result',\n helpConfiguration,\n hasCustomPlots = false,\n visibleColumnCount = Infinity,\n enabledExternalAnalysisPlatforms = DEFAULT_ENABLED_ANALYSIS_PLATFORMS,\n } = props\n\n const columnAliases = useMemo(\n () => props.columnAliases ?? {},\n [props.columnAliases],\n )\n\n const {\n getCurrentQueryRequest,\n hasFacetedSelectColumn,\n hasResettableFilters,\n rowDataQueryOptions,\n } = useQueryContext()\n const { data: queryMetadata } = useGetQueryMetadata()\n\n // Get the selectColumns from either query so that creating the context isn't bottlenecked by one or the other\n // Use the previous result as placeholder data so we don't reset the selectColumns unless they have actually changed.\n const { data: selectColumnsFromRowData } = useQuery({\n ...rowDataQueryOptions,\n select: data => data.responseBody?.queryResult?.queryResults.headers,\n placeholderData: prevData => prevData,\n })\n const { data: selectColumnsFromMetadata } = useGetQueryMetadata({\n select: data => data.responseBody?.selectColumns,\n placeholderData: prevData => prevData,\n })\n // We deep-compare-memoize the selectColumns so we don't reset visible columns if the reference changes, but not the contents (e.g. on page change)\n const selectColumns = useDeepCompareMemoize(\n selectColumnsFromRowData ?? selectColumnsFromMetadata ?? [],\n )\n\n const [showSqlEditor, setShowSqlEditor] = useState(false)\n const [showPlots, setShowPlots] = useState(defaultShowPlots)\n const [showCopyToClipboard, setShowCopyToClipboard] = useState(\n !hideCopyToClipboard,\n )\n const [showFacetFilter, setShowFacetFilter] = useState(true)\n\n // The search bar and download confirmation should not be shown at the same time.\n const [\n showSearchBar,\n setShowSearchBar,\n showDownloadConfirmation,\n setShowDownloadConfirmation,\n ] = useMutuallyExclusiveState(\n defaultShowSearchBar && !hideSearchBarControl,\n false,\n )\n\n const [\n isShowingExportToAnalysisPlatformModal,\n setIsShowingExportToAnalysisPlatformModal,\n ] = useState<boolean>(false)\n\n const [visibleColumns, setVisibleColumns] = useState<string[]>([])\n\n const lastQueryRequest = useMemo(\n () => getCurrentQueryRequest(),\n [getCurrentQueryRequest],\n )\n\n useEffect(() => {\n // SWC-6030: If sql changes, reset what columns are visible\n setVisibleColumns(\n selectColumns.slice(0, visibleColumnCount).map(el => el.name),\n )\n }, [selectColumns, lastQueryRequest.query.sql, visibleColumnCount])\n\n const getColumnDisplayName = useCallback(\n (columnName: string, jsonPath?: string) => {\n // SWC-5982: if force-display-original-column-names is set, then just return the string\n const forceDisplayOriginalColumnName =\n localStorage.getItem('force-display-original-column-names') === 'true'\n\n if (!columnName || (forceDisplayOriginalColumnName && !jsonPath)) {\n return columnName\n }\n if (columnAliases[columnName]) {\n return columnAliases[columnName]\n }\n if (jsonPath) {\n const columnModel = queryMetadata?.columnModels?.find(\n cm => cm.name === columnName,\n )\n if (columnModel?.jsonSubColumns) {\n const jsonSubColumn = columnModel.jsonSubColumns.find(\n jsc => jsc.jsonPath === jsonPath,\n )\n if (jsonSubColumn) {\n return jsonSubColumn.name\n }\n }\n }\n return unCamelCase(columnName)\n },\n [columnAliases, queryMetadata?.columnModels],\n )\n\n const getHelpText = useCallback(\n (columnName: string, jsonPath?: string): string | undefined => {\n if (Array.isArray(helpConfiguration)) {\n const helpConfig = helpConfiguration.find(\n config =>\n config.columnName === columnName && config.jsonPath === jsonPath,\n )\n return helpConfig?.helpText\n }\n return undefined\n },\n [helpConfiguration],\n )\n\n const NoContentPlaceholder = useCallback(\n () => (\n <NoContentPlaceholderComponent\n type={noContentPlaceholderType}\n hasResettableFilters={hasResettableFilters}\n />\n ),\n [noContentPlaceholderType, hasResettableFilters],\n )\n\n const context: QueryVisualizationContextType = useMemo(\n () => ({\n columnsToShowInTable: visibleColumns,\n setColumnsToShowInTable: setVisibleColumns,\n rgbIndex: props.rgbIndex,\n unitDescription: unitDescription,\n showLastUpdatedOn: props.showLastUpdatedOn,\n getColumnDisplayName,\n getDisplayValue,\n getHelpText,\n NoContentPlaceholder,\n isShowingExportToAnalysisPlatformModal:\n isShowingExportToAnalysisPlatformModal,\n setIsShowingExportToAnalysisPlatformModal:\n setIsShowingExportToAnalysisPlatformModal,\n showFacetFilter: hasFacetedSelectColumn ? showFacetFilter : false,\n setShowFacetFilter,\n hideSearchBarControl,\n showSearchBar,\n setShowSearchBar,\n showDownloadConfirmation,\n setShowDownloadConfirmation,\n showSqlEditor,\n setShowSqlEditor,\n showPlots: hasCustomPlots || hasFacetedSelectColumn ? showPlots : false,\n setShowPlots,\n showCopyToClipboard,\n setShowCopyToClipboard,\n enabledExternalAnalysisPlatforms,\n }),\n [\n NoContentPlaceholder,\n getColumnDisplayName,\n getHelpText,\n hasFacetedSelectColumn,\n isShowingExportToAnalysisPlatformModal,\n props.rgbIndex,\n props.showLastUpdatedOn,\n setShowDownloadConfirmation,\n setShowSearchBar,\n showCopyToClipboard,\n showDownloadConfirmation,\n showFacetFilter,\n showPlots,\n showSearchBar,\n showSqlEditor,\n unitDescription,\n visibleColumns,\n hasCustomPlots,\n enabledExternalAnalysisPlatforms,\n ],\n )\n /**\n * Render the children without any formatting\n */\n const { children } = props\n return (\n <QueryVisualizationContextProvider queryVisualizationContext={context}>\n {children}\n </QueryVisualizationContextProvider>\n )\n}\n"],"mappings":";;;;;;;;;;;;;;AAiBA,IAAM,IAAiE,EAAE;AAgDzE,SAAgB,EACd,GACA;CACA,IAAM,EACJ,8BAA2B,EAAyB,aACpD,0BAAuB,IACvB,sBAAmB,IACnB,yBAAsB,IACtB,0BAAuB,IACvB,qBAAkB,UAClB,sBACA,oBAAiB,IACjB,wBAAqB,UACrB,sCAAmC,MACjC,GAEE,IAAgB,QACd,EAAM,iBAAiB,EAAE,EAC/B,CAAC,EAAM,cAAc,CACtB,EAEK,EACJ,2BACA,2BACA,yBACA,2BACE,GAAiB,EACf,EAAE,MAAM,MAAkB,GAAqB,EAI/C,EAAE,MAAM,MAA6B,EAAS;EAClD,GAAG;EACH,SAAQ,MAAQ,EAAK,cAAc,aAAa,aAAa;EAC7D,kBAAiB,MAAY;EAC9B,CAAC,EACI,EAAE,MAAM,MAA8B,EAAoB;EAC9D,SAAQ,MAAQ,EAAK,cAAc;EACnC,kBAAiB,MAAY;EAC9B,CAAC,EAEI,IAAgB,EACpB,KAA4B,KAA6B,EAAE,CAC5D,EAEK,CAAC,GAAe,KAAoB,EAAS,GAAM,EACnD,CAAC,GAAW,KAAgB,EAAS,EAAiB,EACtD,CAAC,GAAqB,KAA0B,EACpD,CAAC,EACF,EACK,CAAC,GAAiB,KAAsB,EAAS,GAAK,EAGtD,CACJ,GACA,GACA,GACA,KACE,EACF,KAAwB,CAAC,GACzB,GACD,EAEK,CACJ,GACA,KACE,EAAkB,GAAM,EAEtB,CAAC,GAAgB,KAAqB,EAAmB,EAAE,CAAC;AAOlE,SAAgB;AAEd,IACE,EAAc,MAAM,GAAG,EAAmB,CAAC,KAAI,MAAM,EAAG,KAAK,CAC9D;IACA;EAAC;EAVqB,QACjB,GAAwB,EAC9B,CAAC,EAAuB,CAQP,CAAiB,MAAM;EAAK;EAAmB,CAAC;CAEnE,IAAM,IAAuB,GAC1B,GAAoB,MAAsB;EAEzC,IAAM,IACJ,aAAa,QAAQ,sCAAsC,KAAK;AAElE,MAAI,CAAC,KAAe,KAAkC,CAAC,EACrD,QAAO;AAET,MAAI,EAAc,GAChB,QAAO,EAAc;AAEvB,MAAI,GAAU;GACZ,IAAM,IAAc,GAAe,cAAc,MAC/C,MAAM,EAAG,SAAS,EACnB;AACD,OAAI,GAAa,gBAAgB;IAC/B,IAAM,IAAgB,EAAY,eAAe,MAC/C,MAAO,EAAI,aAAa,EACzB;AACD,QAAI,EACF,QAAO,EAAc;;;AAI3B,SAAO,EAAY,EAAW;IAEhC,CAAC,GAAe,GAAe,aAAa,CAC7C,EAEK,IAAc,GACjB,GAAoB,MAA0C;AAC7D,MAAI,MAAM,QAAQ,EAAkB,CAKlC,QAJmB,EAAkB,MACnC,MACE,EAAO,eAAe,KAAc,EAAO,aAAa,EAErD,EAAY;IAIvB,CAAC,EAAkB,CACpB,EAEK,IAAuB,QAEzB,kBAAC,GAAD;EACE,MAAM;EACgB;EACtB,CAAA,EAEJ,CAAC,GAA0B,EAAqB,CACjD,EAEK,KAAyC,SACtC;EACL,sBAAsB;EACtB,yBAAyB;EACzB,UAAU,EAAM;EACC;EACjB,mBAAmB,EAAM;EACzB;EACA;EACA;EACA,sBAAA;EAEE;EAEA;EACF,iBAAiB,IAAyB,IAAkB;EAC5D;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,WAAW,KAAkB,IAAyB,IAAY;EAClE;EACA;EACA;EACA;EACD,GACD;EACE;EACA;EACA;EACA;EACA;EACA,EAAM;EACN,EAAM;EACN;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACD,CACF,EAIK,EAAE,iBAAa;AACrB,QACE,kBAAC,IAAD;EAAmC,2BAA2B;EAC3D;EACiC,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"QueryWrapper.js","names":[],"sources":["../../../src/components/QueryWrapper/QueryWrapper.tsx"],"sourcesContent":["import { LockedColumn } from '@/utils/types/LockedColumn'\nimport { hasResettableFilters as hasResettableFiltersUtil } from '@/utils/functions/queryUtils'\nimport useImmutableTableQuery from '@/utils/hooks/useImmutableTableQuery/useImmutableTableQuery'\nimport {\n QueryBundleRequest,\n QueryResultBundle,\n} from '@sage-bionetworks/synapse-types'\nimport { Provider, useSetAtom } from 'jotai'\nimport noop from 'lodash-es/noop'\nimport { PropsWithChildren, useCallback, useEffect, useMemo } from 'react'\nimport { useDeepCompareMemoize } from 'use-deep-compare-effect'\nimport { ConfirmationDialog } from '../ConfirmationDialog'\nimport {\n CombineRangeFacetConfig,\n QueryContextProvider,\n QueryContextType,\n} from '../QueryContext/QueryContext'\nimport { useTableQueryUseQueryOptions } from './TableQueryUseQueryOptions'\nimport {\n isRowSelectionUIFloatingAtom,\n isRowSelectionVisibleAtom,\n rowSelectionPrimaryKeyAtom,\n selectedRowsAtom,\n useHasSelectedRowsAtomValue,\n} from './TableRowSelectionState'\nimport useComputeRowSelectionPrimaryKey from './useComputeRowSelectionPrimaryKey'\nimport useHasFacetedSelectColumn from './useHasFacetedSelectColumn'\nimport useOnQueryDataChange from './useOnQueryDataChange'\nimport { SessionInitializedGuard } from '@/utils/AppUtils/session/SessionInitializedGuard'\n\nexport type QueryWrapperProps = PropsWithChildren<{\n initQueryRequest: QueryBundleRequest\n componentIndex?: number //used for deep linking\n shouldDeepLink?: boolean\n onQueryChange?: (newQueryJson: string) => void\n /** Called when the query result rows change */\n onQueryResultBundleChange?: (newQueryResultBundleJson: string) => void\n lockedColumn?: LockedColumn\n onViewSharingSettingsClicked?: (benefactorId: string) => void\n isRowSelectionVisible?: boolean\n /** The set of columns that defines a uniqueness constraint on the table for the purposes of filtering based on row selection.\n * Note that Synapse tables have no internal concept of a primary key.\n */\n rowSelectionPrimaryKey?: string[]\n /** By default, the row selection UI will float at the bottom of the viewport. Set to false to make it inline */\n isRowSelectionUIFloating?: boolean\n isInfinite?: boolean\n combineRangeFacetConfig?: CombineRangeFacetConfig\n /** If provided, will use the value in this column instead of the rowID for the access column, download column, etc */\n fileIdColumnName?: string\n fileNameColumnName?: string\n /** If provided, will use the value in this column instead of the row version number for the access column, download column, etc */\n fileVersionColumnName?: string\n}>\n\n/**\n * Component that manages the state of a Synapse table query. Data can be accessed via QueryContext using\n * either `useQueryContext` or `QueryContextConsumer`.\n */\nfunction QueryWrapperInternal(props: QueryWrapperProps) {\n return (\n <SessionInitializedGuard>\n <QueryWrapperInternalWithSession {...props} />\n </SessionInitializedGuard>\n )\n}\n\n/**\n * Internal component that renders after session is initialized\n */\nfunction QueryWrapperInternalWithSession(props: QueryWrapperProps) {\n const {\n initQueryRequest,\n onQueryChange,\n onQueryResultBundleChange = noop,\n lockedColumn,\n componentIndex,\n shouldDeepLink,\n onViewSharingSettingsClicked,\n isRowSelectionVisible: isRowSelectionVisibleFromProps = false,\n isRowSelectionUIFloating: isRowSelectionUIFloatingFromProps = true,\n rowSelectionPrimaryKey: rowSelectionPrimaryKeyFromProps,\n isInfinite = false,\n combineRangeFacetConfig,\n fileIdColumnName,\n fileVersionColumnName,\n fileNameColumnName,\n } = props\n\n const hasSelectedRows = useHasSelectedRowsAtomValue()\n\n const immutableTableQueryResult = useImmutableTableQuery({\n initQueryRequest,\n shouldDeepLink,\n componentIndex,\n onQueryChange,\n requireConfirmationOnChange: hasSelectedRows,\n })\n const {\n entityId = '',\n versionNumber,\n getInitQueryRequest,\n getCurrentQueryRequest,\n setQuery,\n resetQuery,\n removeSelectedFacet,\n removeValueFromSelectedFacet,\n removeQueryFilter,\n removeValueFromQueryFilter,\n onConfirmChange,\n isConfirmingChange,\n onCancelChange,\n nextQueryRequest,\n currentQueryRequest,\n addValueToSelectedFacet,\n setRangeFacetValue,\n resetDebounceTimer,\n currentPage,\n goToPage,\n pageSize,\n setPageSize,\n } = immutableTableQueryResult\n\n const lastQueryRequest = useMemo(() => {\n return getCurrentQueryRequest()\n }, [getCurrentQueryRequest])\n\n const {\n rowDataQueryOptions,\n rowDataInfiniteQueryOptions,\n queryMetadataQueryOptions,\n } = useTableQueryUseQueryOptions(lastQueryRequest, lockedColumn)\n\n const hasFacetedSelectColumn = useHasFacetedSelectColumn(\n queryMetadataQueryOptions,\n )\n\n const hasResettableFilters = useMemo(() => {\n const request = getCurrentQueryRequest()\n return hasResettableFiltersUtil(request.query, lockedColumn)\n }, [getCurrentQueryRequest, lockedColumn])\n\n const setIsRowSelectionVisible = useSetAtom(isRowSelectionVisibleAtom)\n useEffect(() => {\n setIsRowSelectionVisible(isRowSelectionVisibleFromProps)\n }, [isRowSelectionVisibleFromProps, setIsRowSelectionVisible])\n\n const setIsRowSelectionUIFloating = useSetAtom(isRowSelectionUIFloatingAtom)\n useEffect(() => {\n setIsRowSelectionUIFloating(isRowSelectionUIFloatingFromProps)\n }, [isRowSelectionUIFloatingFromProps, setIsRowSelectionUIFloating])\n\n const rowSelectionPrimaryKey = useComputeRowSelectionPrimaryKey({\n entityId,\n versionNumber,\n rowSelectionPrimaryKeyFromProps,\n queryMetadataQueryOptions,\n })\n const setRowSelectionPrimaryKey = useSetAtom(rowSelectionPrimaryKeyAtom)\n useEffect(() => {\n setRowSelectionPrimaryKey(rowSelectionPrimaryKey)\n }, [rowSelectionPrimaryKey, setRowSelectionPrimaryKey])\n\n const setSelectedRows = useSetAtom(selectedRowsAtom)\n const onChangeCallback = useCallback(\n (data: QueryResultBundle) =>\n onQueryResultBundleChange(JSON.stringify(data)),\n [onQueryResultBundleChange],\n )\n // Track changes to the query row data and propagate to callback\n useOnQueryDataChange({\n queryBundleRequest: getCurrentQueryRequest(),\n onChange: onChangeCallback,\n })\n\n const context: QueryContextType = useDeepCompareMemoize({\n isInfinite,\n entityId,\n versionNumber,\n nextQueryRequest,\n currentQueryRequest,\n getCurrentQueryRequest: getCurrentQueryRequest,\n getInitQueryRequest,\n executeQueryRequest: setQuery,\n hasFacetedSelectColumn,\n hasResettableFilters,\n removeSelectedFacet,\n removeValueFromSelectedFacet,\n resetQuery,\n removeQueryFilter,\n removeValueFromQueryFilter,\n onViewSharingSettingsClicked,\n addValueToSelectedFacet,\n combineRangeFacetConfig,\n setRangeFacetValue,\n resetDebounceTimer,\n rowDataQueryOptions,\n rowDataInfiniteQueryOptions,\n queryMetadataQueryOptions,\n currentPage,\n goToPage,\n pageSize,\n setPageSize,\n lockedColumn,\n fileIdColumnName,\n fileVersionColumnName,\n fileNameColumnName,\n })\n\n /**\n * Render the children without any formatting\n */\n const { children } = props\n return (\n <QueryContextProvider queryContext={context}>\n <ConfirmationDialog\n open={isConfirmingChange}\n title={'Change Query and Clear Selection?'}\n content={\n 'Changing the current query will cause your current selection to be lost. Are you sure you want to proceed?'\n }\n confirmButtonProps={{\n children: 'Clear Selection and Update Query',\n }}\n onConfirm={() => {\n setSelectedRows([])\n onConfirmChange()\n }}\n onCancel={() => {\n onCancelChange()\n }}\n />\n {children}\n </QueryContextProvider>\n )\n}\n\nexport function QueryWrapper(props: QueryWrapperProps) {\n // Wrap in a Jotai provider to ensure the Jotai atomic state is unique to this component tree\n // i.e. other instances of QueryWrapper will not share state with this instance\n return (\n <Provider>\n <QueryWrapperInternal {...props} />\n </Provider>\n )\n}\n"],"mappings":";;;;;;;;;;;;;;;;;AA2DA,SAAS,EAAqB,GAA0B;AACtD,QACE,kBAAC,GAAD,EAAA,UACE,kBAAC,GAAD,EAAiC,GAAI,GAAS,CAAA,EACtB,CAAA;;AAO9B,SAAS,EAAgC,GAA0B;CACjE,IAAM,EACJ,qBACA,kBACA,+BAA4B,GAC5B,iBACA,mBACA,mBACA,iCACA,uBAAuB,IAAiC,IACxD,0BAA0B,IAAoC,IAC9D,wBAAwB,GACxB,gBAAa,IACb,4BACA,qBACA,0BACA,0BACE,GAWE,EACJ,cAAW,IACX,kBACA,wBACA,2BACA,aACA,eACA,wBACA,iCACA,uBACA,+BACA,oBACA,uBACA,mBACA,qBACA,wBACA,4BACA,uBACA,uBACA,iBACA,cACA,cACA,oBA7BgC,GAAuB;EACvD;EACA;EACA;EACA;EACA,6BAPsB,GAA6B;EAQpD,CAAC,EA8BI,EACJ,yBACA,iCACA,iCACE,GARqB,QAChB,GAAwB,EAC9B,CAAC,EAAuB,CAAC,EAMuB,EAAa,EAE1D,KAAyB,EAC7B,EACD,EAEK,KAAuB,QAEpB,EADS,GAAwB,CACA,OAAO,EAAa,EAC3D,CAAC,GAAwB,EAAa,CAAC,EAEpC,IAA2B,EAAW,EAA0B;AACtE,SAAgB;AACd,IAAyB,EAA+B;IACvD,CAAC,GAAgC,EAAyB,CAAC;CAE9D,IAAM,IAA8B,EAAW,EAA6B;AAC5E,SAAgB;AACd,IAA4B,EAAkC;IAC7D,CAAC,GAAmC,EAA4B,CAAC;CAEpE,IAAM,IAAyB,EAAiC;EAC9D;EACA;EACA;EACA;EACD,CAAC,EACI,IAA4B,EAAW,EAA2B;AACxE,SAAgB;AACd,IAA0B,EAAuB;IAChD,CAAC,GAAwB,EAA0B,CAAC;CAEvD,IAAM,KAAkB,EAAW,EAAiB,EAC9C,KAAmB,GACtB,MACC,EAA0B,KAAK,UAAU,EAAK,CAAC,EACjD,CAAC,EAA0B,CAC5B;AAED,GAAqB;EACnB,oBAAoB,GAAwB;EAC5C,UAAU;EACX,CAAC;CAEF,IAAM,KAA4B,GAAsB;EACtD;EACA;EACA;EACA;EACA;EACwB;EACxB;EACA,qBAAqB;EACrB;EACA,sBAAA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACD,CAAC,EAKI,EAAE,iBAAa;AACrB,QACE,mBAAC,IAAD;EAAsB,cAAc;YAApC,CACE,kBAAC,GAAD;GACE,MAAM;GACN,OAAO;GACP,SACE;GAEF,oBAAoB,EAClB,UAAU,oCACX;GACD,iBAAiB;AAEf,IADA,GAAgB,EAAE,CAAC,EACnB,GAAiB;;GAEnB,gBAAgB;AACd,OAAgB;;GAElB,CAAA,EACD,GACoB;;;AAI3B,SAAgB,EAAa,GAA0B;AAGrD,QACE,kBAAC,GAAD,EAAA,UACE,kBAAC,GAAD,EAAsB,GAAI,GAAS,CAAA,EAC1B,CAAA"}
|
|
1
|
+
{"version":3,"file":"QueryWrapper.js","names":[],"sources":["../../../src/components/QueryWrapper/QueryWrapper.tsx"],"sourcesContent":["import { LockedColumn } from '@/utils/types/LockedColumn'\nimport { hasResettableFilters as hasResettableFiltersUtil } from '@/utils/functions/queryUtils'\nimport useImmutableTableQuery from '@/utils/hooks/useImmutableTableQuery/useImmutableTableQuery'\nimport {\n QueryBundleRequest,\n QueryResultBundle,\n} from '@sage-bionetworks/synapse-types'\nimport { Provider, useSetAtom } from 'jotai'\nimport noop from 'lodash-es/noop'\nimport { PropsWithChildren, useCallback, useEffect, useMemo } from 'react'\nimport { useDeepCompareMemoize } from 'use-deep-compare-effect'\nimport { ConfirmationDialog } from '../ConfirmationDialog'\nimport {\n CombineRangeFacetConfig,\n QueryContextProvider,\n QueryContextType,\n} from '../QueryContext/QueryContext'\nimport { useTableQueryUseQueryOptions } from './TableQueryUseQueryOptions'\nimport {\n isRowSelectionUIFloatingAtom,\n isRowSelectionVisibleAtom,\n rowSelectionPrimaryKeyAtom,\n selectedRowsAtom,\n useHasSelectedRowsAtomValue,\n} from './TableRowSelectionState'\nimport useComputeRowSelectionPrimaryKey from './useComputeRowSelectionPrimaryKey'\nimport useHasFacetedSelectColumn from './useHasFacetedSelectColumn'\nimport useOnQueryDataChange from './useOnQueryDataChange'\nimport { SessionInitializedGuard } from '@/utils/AppUtils/session/SessionInitializedGuard'\n\nexport type QueryWrapperProps = PropsWithChildren<{\n initQueryRequest: QueryBundleRequest\n componentIndex?: number //used for deep linking\n shouldDeepLink?: boolean\n onQueryChange?: (newQueryJson: string) => void\n /** Called when the query result rows change */\n onQueryResultBundleChange?: (newQueryResultBundleJson: string) => void\n lockedColumn?: LockedColumn\n onViewSharingSettingsClicked?: (benefactorId: string) => void\n isRowSelectionVisible?: boolean\n /** The set of columns that defines a uniqueness constraint on the table for the purposes of filtering based on row selection.\n * Note that Synapse tables have no internal concept of a primary key.\n */\n rowSelectionPrimaryKey?: string[]\n /** By default, the row selection UI will float at the bottom of the viewport. Set to false to make it inline */\n isRowSelectionUIFloating?: boolean\n isInfinite?: boolean\n combineRangeFacetConfig?: CombineRangeFacetConfig\n /** If provided, will use the value in this column instead of the rowID for the access column, download column, etc */\n fileIdColumnName?: string\n fileNameColumnName?: string\n /** If provided, will use the value in this column instead of the row version number for the access column, download column, etc */\n fileVersionColumnName?: string\n}>\n\n/**\n * Component that manages the state of a Synapse table query. Data can be accessed via QueryContext using\n * either `useQueryContext` or `QueryContextConsumer`.\n */\nfunction QueryWrapperInternal(props: QueryWrapperProps) {\n return (\n <SessionInitializedGuard>\n <QueryWrapperInternalWithSession {...props} />\n </SessionInitializedGuard>\n )\n}\n\n/**\n * Internal component that renders after session is initialized\n */\nfunction QueryWrapperInternalWithSession(props: QueryWrapperProps) {\n const {\n initQueryRequest,\n onQueryChange,\n onQueryResultBundleChange = noop,\n lockedColumn,\n componentIndex,\n shouldDeepLink,\n onViewSharingSettingsClicked,\n isRowSelectionVisible: isRowSelectionVisibleFromProps = false,\n isRowSelectionUIFloating: isRowSelectionUIFloatingFromProps = true,\n rowSelectionPrimaryKey: rowSelectionPrimaryKeyFromProps,\n isInfinite = false,\n combineRangeFacetConfig,\n fileIdColumnName,\n fileVersionColumnName,\n fileNameColumnName,\n } = props\n\n const hasSelectedRows = useHasSelectedRowsAtomValue()\n\n const immutableTableQueryResult = useImmutableTableQuery({\n initQueryRequest,\n shouldDeepLink,\n componentIndex,\n onQueryChange,\n requireConfirmationOnChange: hasSelectedRows,\n })\n const {\n entityId = '',\n versionNumber,\n getInitQueryRequest,\n getCurrentQueryRequest,\n setQuery,\n resetQuery,\n removeSelectedFacet,\n removeValueFromSelectedFacet,\n removeQueryFilter,\n removeValueFromQueryFilter,\n onConfirmChange,\n isConfirmingChange,\n onCancelChange,\n nextQueryRequest,\n currentQueryRequest,\n addValueToSelectedFacet,\n setRangeFacetValue,\n resetDebounceTimer,\n currentPage,\n goToPage,\n pageSize,\n setPageSize,\n } = immutableTableQueryResult\n\n const lastQueryRequest = useMemo(() => {\n return getCurrentQueryRequest()\n }, [getCurrentQueryRequest])\n\n const {\n rowDataQueryOptions,\n rowDataInfiniteQueryOptions,\n queryMetadataQueryOptions,\n } = useTableQueryUseQueryOptions(lastQueryRequest, lockedColumn)\n\n const hasFacetedSelectColumn = useHasFacetedSelectColumn(\n queryMetadataQueryOptions,\n )\n\n const hasResettableFilters = useMemo(() => {\n const request = getCurrentQueryRequest()\n return hasResettableFiltersUtil(request.query, lockedColumn)\n }, [getCurrentQueryRequest, lockedColumn])\n\n const setIsRowSelectionVisible = useSetAtom(isRowSelectionVisibleAtom)\n useEffect(() => {\n setIsRowSelectionVisible(isRowSelectionVisibleFromProps)\n }, [isRowSelectionVisibleFromProps, setIsRowSelectionVisible])\n\n const setIsRowSelectionUIFloating = useSetAtom(isRowSelectionUIFloatingAtom)\n useEffect(() => {\n setIsRowSelectionUIFloating(isRowSelectionUIFloatingFromProps)\n }, [isRowSelectionUIFloatingFromProps, setIsRowSelectionUIFloating])\n\n const rowSelectionPrimaryKey = useComputeRowSelectionPrimaryKey({\n entityId,\n versionNumber,\n rowSelectionPrimaryKeyFromProps,\n queryMetadataQueryOptions,\n })\n const setRowSelectionPrimaryKey = useSetAtom(rowSelectionPrimaryKeyAtom)\n useEffect(() => {\n setRowSelectionPrimaryKey(rowSelectionPrimaryKey)\n }, [rowSelectionPrimaryKey, setRowSelectionPrimaryKey])\n\n const setSelectedRows = useSetAtom(selectedRowsAtom)\n const onChangeCallback = useCallback(\n (data: QueryResultBundle) =>\n onQueryResultBundleChange(JSON.stringify(data)),\n [onQueryResultBundleChange],\n )\n // Track changes to the query row data and propagate to callback\n useOnQueryDataChange({\n queryBundleRequest: getCurrentQueryRequest(),\n onChange: onChangeCallback,\n })\n\n const context: QueryContextType = useDeepCompareMemoize({\n isInfinite,\n entityId,\n versionNumber,\n nextQueryRequest,\n currentQueryRequest,\n getCurrentQueryRequest: getCurrentQueryRequest,\n getInitQueryRequest,\n executeQueryRequest: setQuery,\n hasFacetedSelectColumn,\n hasResettableFilters,\n removeSelectedFacet,\n removeValueFromSelectedFacet,\n resetQuery,\n removeQueryFilter,\n removeValueFromQueryFilter,\n onViewSharingSettingsClicked,\n addValueToSelectedFacet,\n combineRangeFacetConfig,\n setRangeFacetValue,\n resetDebounceTimer,\n rowDataQueryOptions,\n rowDataInfiniteQueryOptions,\n queryMetadataQueryOptions,\n currentPage,\n goToPage,\n pageSize,\n setPageSize,\n lockedColumn,\n fileIdColumnName,\n fileVersionColumnName,\n fileNameColumnName,\n })\n\n /**\n * Render the children without any formatting\n */\n const { children } = props\n return (\n <QueryContextProvider queryContext={context}>\n <ConfirmationDialog\n open={isConfirmingChange}\n title={'Change Query and Clear Selection?'}\n content={\n 'Changing the current query will cause your current selection to be lost. Are you sure you want to proceed?'\n }\n confirmButtonProps={{\n children: 'Clear Selection and Update Query',\n }}\n onConfirm={() => {\n setSelectedRows([])\n onConfirmChange()\n }}\n onCancel={() => {\n onCancelChange()\n }}\n />\n {children}\n </QueryContextProvider>\n )\n}\n\nexport function QueryWrapper(props: QueryWrapperProps) {\n // Wrap in a Jotai provider to ensure the Jotai atomic state is unique to this component tree\n // i.e. other instances of QueryWrapper will not share state with this instance\n return (\n <Provider>\n <QueryWrapperInternal {...props} />\n </Provider>\n )\n}\n"],"mappings":";;;;;;;;;;;;;;;;;AA2DA,SAAS,EAAqB,GAA0B;AACtD,QACE,kBAAC,GAAD,EAAA,UACE,kBAAC,GAAD,EAAiC,GAAI,GAAS,CAAA,EACtB,CAAA;;AAO9B,SAAS,EAAgC,GAA0B;CACjE,IAAM,EACJ,qBACA,kBACA,+BAA4B,GAC5B,iBACA,mBACA,mBACA,iCACA,uBAAuB,IAAiC,IACxD,0BAA0B,IAAoC,IAC9D,wBAAwB,GACxB,gBAAa,IACb,4BACA,qBACA,0BACA,0BACE,GAWE,EACJ,cAAW,IACX,kBACA,wBACA,2BACA,aACA,eACA,wBACA,iCACA,uBACA,+BACA,oBACA,uBACA,mBACA,qBACA,wBACA,4BACA,uBACA,uBACA,iBACA,cACA,cACA,oBA7BgC,GAAuB;EACvD;EACA;EACA;EACA;EACA,6BAPsB,GAOO;EAC9B,CAwBG,EAME,EACJ,yBACA,iCACA,iCACE,GARqB,QAChB,GAAwB,EAC9B,CAAC,EAAuB,CAMM,EAAkB,EAAa,EAE1D,KAAyB,EAC7B,EACD,EAEK,KAAuB,QAEpB,EADS,GACgB,CAAQ,OAAO,EAAa,EAC3D,CAAC,GAAwB,EAAa,CAAC,EAEpC,IAA2B,EAAW,EAA0B;AACtE,SAAgB;AACd,IAAyB,EAA+B;IACvD,CAAC,GAAgC,EAAyB,CAAC;CAE9D,IAAM,IAA8B,EAAW,EAA6B;AAC5E,SAAgB;AACd,IAA4B,EAAkC;IAC7D,CAAC,GAAmC,EAA4B,CAAC;CAEpE,IAAM,IAAyB,EAAiC;EAC9D;EACA;EACA;EACA;EACD,CAAC,EACI,IAA4B,EAAW,EAA2B;AACxE,SAAgB;AACd,IAA0B,EAAuB;IAChD,CAAC,GAAwB,EAA0B,CAAC;CAEvD,IAAM,KAAkB,EAAW,EAAiB,EAC9C,KAAmB,GACtB,MACC,EAA0B,KAAK,UAAU,EAAK,CAAC,EACjD,CAAC,EAA0B,CAC5B;AAED,GAAqB;EACnB,oBAAoB,GAAwB;EAC5C,UAAU;EACX,CAAC;CAEF,IAAM,KAA4B,GAAsB;EACtD;EACA;EACA;EACA;EACA;EACwB;EACxB;EACA,qBAAqB;EACrB;EACA,sBAAA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACD,CAAC,EAKI,EAAE,iBAAa;AACrB,QACE,mBAAC,IAAD;EAAsB,cAAc;YAApC,CACE,kBAAC,GAAD;GACE,MAAM;GACN,OAAO;GACP,SACE;GAEF,oBAAoB,EAClB,UAAU,oCACX;GACD,iBAAiB;AAEf,IADA,GAAgB,EAAE,CAAC,EACnB,GAAiB;;GAEnB,gBAAgB;AACd,OAAgB;;GAElB,CAAA,EACD,GACoB;;;AAI3B,SAAgB,EAAa,GAA0B;AAGrD,QACE,kBAAC,GAAD,EAAA,UACE,kBAAC,GAAD,EAAsB,GAAI,GAAS,CAAA,EAC1B,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TableQueryUseQueryOptions.js","names":[],"sources":["../../../src/components/QueryWrapper/TableQueryUseQueryOptions.ts"],"sourcesContent":["import * as SynapseClient from '@/synapse-client/SynapseClient'\nimport {\n getInfiniteQueryResultBundleOptions,\n KeyFactory,\n tableQueryUseQueryDefaults,\n} from '@/synapse-queries'\nimport { useSynapseContext } from '@/utils/context/SynapseContext'\nimport {\n partitionQueryBundleRequestIntoRowsAndMetadata,\n removeLockedColumnFromFacetData,\n} from '@/utils/functions/queryUtils'\nimport { LockedColumn } from '@/utils/types/LockedColumn'\nimport { SynapseClientError } from '@sage-bionetworks/synapse-client'\nimport {\n AsynchronousJobStatus,\n QueryBundleRequest,\n QueryResultBundle,\n RowSet,\n} from '@sage-bionetworks/synapse-types'\nimport {\n InfiniteData,\n QueryKey,\n UseInfiniteQueryOptions,\n UseSuspenseQueryOptions,\n} from '@tanstack/react-query'\nimport { omit } from 'lodash-es'\nimport { useMemo } from 'react'\n\nexport type TableQueryUseQueryOptions = {\n rowDataQueryOptions: UseSuspenseQueryOptions<\n AsynchronousJobStatus<QueryBundleRequest, QueryResultBundle>,\n SynapseClientError,\n RowSet | undefined\n >\n\n rowDataInfiniteQueryOptions: UseInfiniteQueryOptions<\n AsynchronousJobStatus<QueryBundleRequest, QueryResultBundle>,\n SynapseClientError,\n InfiniteData<AsynchronousJobStatus<QueryBundleRequest, QueryResultBundle>>,\n QueryKey,\n string | number | undefined\n >\n\n queryMetadataQueryOptions: UseSuspenseQueryOptions<\n AsynchronousJobStatus<QueryBundleRequest, QueryResultBundle>,\n SynapseClientError,\n Omit<QueryResultBundle, 'queryResult'>\n >\n}\n\nexport function getTableQueryUseQueryOptions(\n queryBundleRequest: QueryBundleRequest,\n lockedColumn: LockedColumn | undefined,\n keyFactory: KeyFactory,\n accessToken: string | undefined,\n) {\n const { rowDataRequest, queryMetadataRequest } =\n partitionQueryBundleRequestIntoRowsAndMetadata(queryBundleRequest)\n const rowDataQueryOptions: TableQueryUseQueryOptions['rowDataQueryOptions'] =\n {\n ...tableQueryUseQueryDefaults,\n queryKey: keyFactory.getEntityTableQueryResultWithAsyncStatusQueryKey(\n rowDataRequest,\n false,\n ),\n queryFn: () =>\n SynapseClient.getQueryTableAsyncJobResults(rowDataRequest, accessToken),\n select: data => data.responseBody?.queryResult?.queryResults,\n }\n\n const rowDataInfiniteQueryOptions: TableQueryUseQueryOptions['rowDataInfiniteQueryOptions'] =\n {\n ...getInfiniteQueryResultBundleOptions(\n rowDataRequest,\n keyFactory,\n accessToken,\n ),\n }\n\n const queryMetadataQueryOptions: TableQueryUseQueryOptions['queryMetadataQueryOptions'] =\n {\n ...tableQueryUseQueryDefaults,\n queryKey: keyFactory.getEntityTableQueryResultWithAsyncStatusQueryKey(\n queryMetadataRequest,\n false,\n ),\n queryFn: () =>\n SynapseClient.getQueryTableAsyncJobResults(\n queryMetadataRequest,\n accessToken,\n ),\n\n select: data =>\n omit(\n removeLockedColumnFromFacetData(data.responseBody, lockedColumn),\n 'queryResults',\n ),\n }\n\n return {\n rowDataQueryOptions,\n rowDataInfiniteQueryOptions,\n queryMetadataQueryOptions,\n }\n}\n\n/**\n * Return the UseQueryOptions used to retrieve a table query's row data and query metadata.\n * @param queryBundleRequest\n * @param lockedColumn - remove a particular facet name (e.g. study) and all possible values based on the parameter\n * specified in the url this is to remove the facet from the charts, search and filter.\n */\nexport function useTableQueryUseQueryOptions(\n queryBundleRequest: QueryBundleRequest,\n lockedColumn?: LockedColumn,\n): TableQueryUseQueryOptions {\n const { keyFactory, accessToken } = useSynapseContext()\n\n return useMemo(\n () =>\n getTableQueryUseQueryOptions(\n queryBundleRequest,\n lockedColumn,\n keyFactory,\n accessToken,\n ),\n [keyFactory, accessToken, queryBundleRequest, lockedColumn],\n )\n}\n"],"mappings":";;;;;;;;AAkDA,SAAgB,EACd,GACA,GACA,GACA,GACA;CACA,IAAM,EAAE,mBAAgB,4BACtB,EAA+C,EAAmB;AA0CpE,QAAO;EACL,
|
|
1
|
+
{"version":3,"file":"TableQueryUseQueryOptions.js","names":[],"sources":["../../../src/components/QueryWrapper/TableQueryUseQueryOptions.ts"],"sourcesContent":["import * as SynapseClient from '@/synapse-client/SynapseClient'\nimport {\n getInfiniteQueryResultBundleOptions,\n KeyFactory,\n tableQueryUseQueryDefaults,\n} from '@/synapse-queries'\nimport { useSynapseContext } from '@/utils/context/SynapseContext'\nimport {\n partitionQueryBundleRequestIntoRowsAndMetadata,\n removeLockedColumnFromFacetData,\n} from '@/utils/functions/queryUtils'\nimport { LockedColumn } from '@/utils/types/LockedColumn'\nimport { SynapseClientError } from '@sage-bionetworks/synapse-client'\nimport {\n AsynchronousJobStatus,\n QueryBundleRequest,\n QueryResultBundle,\n RowSet,\n} from '@sage-bionetworks/synapse-types'\nimport {\n InfiniteData,\n QueryKey,\n UseInfiniteQueryOptions,\n UseSuspenseQueryOptions,\n} from '@tanstack/react-query'\nimport { omit } from 'lodash-es'\nimport { useMemo } from 'react'\n\nexport type TableQueryUseQueryOptions = {\n rowDataQueryOptions: UseSuspenseQueryOptions<\n AsynchronousJobStatus<QueryBundleRequest, QueryResultBundle>,\n SynapseClientError,\n RowSet | undefined\n >\n\n rowDataInfiniteQueryOptions: UseInfiniteQueryOptions<\n AsynchronousJobStatus<QueryBundleRequest, QueryResultBundle>,\n SynapseClientError,\n InfiniteData<AsynchronousJobStatus<QueryBundleRequest, QueryResultBundle>>,\n QueryKey,\n string | number | undefined\n >\n\n queryMetadataQueryOptions: UseSuspenseQueryOptions<\n AsynchronousJobStatus<QueryBundleRequest, QueryResultBundle>,\n SynapseClientError,\n Omit<QueryResultBundle, 'queryResult'>\n >\n}\n\nexport function getTableQueryUseQueryOptions(\n queryBundleRequest: QueryBundleRequest,\n lockedColumn: LockedColumn | undefined,\n keyFactory: KeyFactory,\n accessToken: string | undefined,\n) {\n const { rowDataRequest, queryMetadataRequest } =\n partitionQueryBundleRequestIntoRowsAndMetadata(queryBundleRequest)\n const rowDataQueryOptions: TableQueryUseQueryOptions['rowDataQueryOptions'] =\n {\n ...tableQueryUseQueryDefaults,\n queryKey: keyFactory.getEntityTableQueryResultWithAsyncStatusQueryKey(\n rowDataRequest,\n false,\n ),\n queryFn: () =>\n SynapseClient.getQueryTableAsyncJobResults(rowDataRequest, accessToken),\n select: data => data.responseBody?.queryResult?.queryResults,\n }\n\n const rowDataInfiniteQueryOptions: TableQueryUseQueryOptions['rowDataInfiniteQueryOptions'] =\n {\n ...getInfiniteQueryResultBundleOptions(\n rowDataRequest,\n keyFactory,\n accessToken,\n ),\n }\n\n const queryMetadataQueryOptions: TableQueryUseQueryOptions['queryMetadataQueryOptions'] =\n {\n ...tableQueryUseQueryDefaults,\n queryKey: keyFactory.getEntityTableQueryResultWithAsyncStatusQueryKey(\n queryMetadataRequest,\n false,\n ),\n queryFn: () =>\n SynapseClient.getQueryTableAsyncJobResults(\n queryMetadataRequest,\n accessToken,\n ),\n\n select: data =>\n omit(\n removeLockedColumnFromFacetData(data.responseBody, lockedColumn),\n 'queryResults',\n ),\n }\n\n return {\n rowDataQueryOptions,\n rowDataInfiniteQueryOptions,\n queryMetadataQueryOptions,\n }\n}\n\n/**\n * Return the UseQueryOptions used to retrieve a table query's row data and query metadata.\n * @param queryBundleRequest\n * @param lockedColumn - remove a particular facet name (e.g. study) and all possible values based on the parameter\n * specified in the url this is to remove the facet from the charts, search and filter.\n */\nexport function useTableQueryUseQueryOptions(\n queryBundleRequest: QueryBundleRequest,\n lockedColumn?: LockedColumn,\n): TableQueryUseQueryOptions {\n const { keyFactory, accessToken } = useSynapseContext()\n\n return useMemo(\n () =>\n getTableQueryUseQueryOptions(\n queryBundleRequest,\n lockedColumn,\n keyFactory,\n accessToken,\n ),\n [keyFactory, accessToken, queryBundleRequest, lockedColumn],\n )\n}\n"],"mappings":";;;;;;;;AAkDA,SAAgB,EACd,GACA,GACA,GACA,GACA;CACA,IAAM,EAAE,mBAAgB,4BACtB,EAA+C,EAAmB;AA0CpE,QAAO;EACL,qBAAA;GAxCE,GAAG;GACH,UAAU,EAAW,iDACnB,GACA,GACD;GACD,eACE,EAA2C,GAAgB,EAAY;GACzE,SAAQ,MAAQ,EAAK,cAAc,aAAa;GAiClD;EACA,6BAAA,EA7BE,GAAG,EACD,GACA,GACA,EACD,EAyBH;EACA,2BAAA;GArBE,GAAG;GACH,UAAU,EAAW,iDACnB,GACA,GACD;GACD,eACE,EACE,GACA,EACD;GAEH,SAAQ,MACN,EACE,EAAgC,EAAK,cAAc,EAAa,EAChE,eACD;GAML;EACD;;AASH,SAAgB,EACd,GACA,GAC2B;CAC3B,IAAM,EAAE,eAAY,mBAAgB,GAAmB;AAEvD,QAAO,QAEH,EACE,GACA,GACA,GACA,EACD,EACH;EAAC;EAAY;EAAa;EAAoB;EAAa,CAC5D"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TableRowSelectionState.js","names":[],"sources":["../../../src/components/QueryWrapper/TableRowSelectionState.ts"],"sourcesContent":["import { Row, SelectColumn } from '@sage-bionetworks/synapse-types'\nimport { atom, useAtomValue } from 'jotai'\nimport { isEqual } from 'lodash-es'\n\nexport function getRowSelectionEqualityComparator(\n row: Row,\n selectColumns?: SelectColumn[],\n rowSelectionPrimaryKey?: string[],\n): (r1: Row, r2: Row) => boolean {\n // Worst-case scenario, use deep equality to compare rows\n // This will fail from the user's perspective if any data changes in the rows since the last time the selection was updated.\n let comparator: (r1: Row, r2: Row) => boolean = isEqual\n if (rowSelectionPrimaryKey && selectColumns) {\n // If the `rowSelectionPrimaryKey` is defined, a row is selected if we have a PK match\n // Even this selection is not guaranteed to persist if data changes, e.g. if column order changes and the PK now has a different column index\n comparator = (r1: Row, r2: Row) => {\n const r1PrimaryKeyValues = rowSelectionPrimaryKey.map(\n key => r1.values[selectColumns.findIndex(cm => cm.name === key)]!,\n )\n const r2PrimaryKeyValues = rowSelectionPrimaryKey.map(\n key => r2.values[selectColumns.findIndex(cm => cm.name === key)]!,\n )\n return isEqual(r1PrimaryKeyValues, r2PrimaryKeyValues)\n }\n } else if (row.rowId) {\n // If there's a rowId, we can use that as a fallback\n comparator = (r1: Row, r2: Row) => r1.rowId === r2.rowId\n }\n\n return comparator\n}\n\n/**\n * Use Jotai atoms to manage table row selection state. We use Jotai instead of React context because subscribing to atoms\n * is more performant than subscribing to a frequently-changing context object, which causes undesirable re-renders.\n */\n\n/**\n * Whether row selection is visible for the current component\n */\nexport const isRowSelectionVisibleAtom = atom<boolean>(false)\n\n/**\n * Whether row selection UI should float or be shown inline\n */\nexport const isRowSelectionUIFloatingAtom = atom<boolean>(true)\n\n/**\n * A unique key that identifies a row. If two selected rows have the same key values, then they are considered equal and would both be selected/deselected together.\n */\nexport const rowSelectionPrimaryKeyAtom = atom<string[] | undefined>(undefined)\n/**\n * A unique key that identifies a row. If two selected rows have the same key values, then they are considered equal and would both be selected/deselected together.\n */\nexport function useRowSelectionPrimaryKeyAtomValue() {\n return useAtomValue(rowSelectionPrimaryKeyAtom)\n}\n\n/**\n * The set of selected rows\n */\nexport const selectedRowsAtom = atom<Row[]>([])\n/**\n * The set of selected rows\n */\nexport function useSelectedRowsAtomValue() {\n return useAtomValue(selectedRowsAtom)\n}\n\n/**\n * Can be used to determine if a row is selected. If a `rowSelectionPrimaryKey` is defined, then the row is selected if it has a matching PK.\n */\nexport const isRowSelectedAtom = atom(\n get => (row: Row, selectColumns: SelectColumn[]) => {\n const comparator = getRowSelectionEqualityComparator(\n row,\n selectColumns,\n get(rowSelectionPrimaryKeyAtom),\n )\n return get(selectedRowsAtom).some(selectedRow =>\n comparator(selectedRow, row),\n )\n },\n)\n\n/**\n * Whether rows are currently selected\n */\nexport const hasSelectedRowsAtom = atom(get => get(selectedRowsAtom).length > 0)\n/**\n * Whether rows are currently selected\n */\nexport function useHasSelectedRowsAtomValue() {\n return useAtomValue(hasSelectedRowsAtom)\n}\n"],"mappings":";;;AAIA,SAAgB,EACd,GACA,GACA,GAC+B;CAG/B,IAAI,IAA4C;AAkBhD,QAjBI,KAA0B,IAG5B,KAAc,GAAS,MAOd,EANoB,EAAuB,KAChD,MAAO,EAAG,OAAO,EAAc,WAAU,MAAM,EAAG,SAAS,EAAI,
|
|
1
|
+
{"version":3,"file":"TableRowSelectionState.js","names":[],"sources":["../../../src/components/QueryWrapper/TableRowSelectionState.ts"],"sourcesContent":["import { Row, SelectColumn } from '@sage-bionetworks/synapse-types'\nimport { atom, useAtomValue } from 'jotai'\nimport { isEqual } from 'lodash-es'\n\nexport function getRowSelectionEqualityComparator(\n row: Row,\n selectColumns?: SelectColumn[],\n rowSelectionPrimaryKey?: string[],\n): (r1: Row, r2: Row) => boolean {\n // Worst-case scenario, use deep equality to compare rows\n // This will fail from the user's perspective if any data changes in the rows since the last time the selection was updated.\n let comparator: (r1: Row, r2: Row) => boolean = isEqual\n if (rowSelectionPrimaryKey && selectColumns) {\n // If the `rowSelectionPrimaryKey` is defined, a row is selected if we have a PK match\n // Even this selection is not guaranteed to persist if data changes, e.g. if column order changes and the PK now has a different column index\n comparator = (r1: Row, r2: Row) => {\n const r1PrimaryKeyValues = rowSelectionPrimaryKey.map(\n key => r1.values[selectColumns.findIndex(cm => cm.name === key)]!,\n )\n const r2PrimaryKeyValues = rowSelectionPrimaryKey.map(\n key => r2.values[selectColumns.findIndex(cm => cm.name === key)]!,\n )\n return isEqual(r1PrimaryKeyValues, r2PrimaryKeyValues)\n }\n } else if (row.rowId) {\n // If there's a rowId, we can use that as a fallback\n comparator = (r1: Row, r2: Row) => r1.rowId === r2.rowId\n }\n\n return comparator\n}\n\n/**\n * Use Jotai atoms to manage table row selection state. We use Jotai instead of React context because subscribing to atoms\n * is more performant than subscribing to a frequently-changing context object, which causes undesirable re-renders.\n */\n\n/**\n * Whether row selection is visible for the current component\n */\nexport const isRowSelectionVisibleAtom = atom<boolean>(false)\n\n/**\n * Whether row selection UI should float or be shown inline\n */\nexport const isRowSelectionUIFloatingAtom = atom<boolean>(true)\n\n/**\n * A unique key that identifies a row. If two selected rows have the same key values, then they are considered equal and would both be selected/deselected together.\n */\nexport const rowSelectionPrimaryKeyAtom = atom<string[] | undefined>(undefined)\n/**\n * A unique key that identifies a row. If two selected rows have the same key values, then they are considered equal and would both be selected/deselected together.\n */\nexport function useRowSelectionPrimaryKeyAtomValue() {\n return useAtomValue(rowSelectionPrimaryKeyAtom)\n}\n\n/**\n * The set of selected rows\n */\nexport const selectedRowsAtom = atom<Row[]>([])\n/**\n * The set of selected rows\n */\nexport function useSelectedRowsAtomValue() {\n return useAtomValue(selectedRowsAtom)\n}\n\n/**\n * Can be used to determine if a row is selected. If a `rowSelectionPrimaryKey` is defined, then the row is selected if it has a matching PK.\n */\nexport const isRowSelectedAtom = atom(\n get => (row: Row, selectColumns: SelectColumn[]) => {\n const comparator = getRowSelectionEqualityComparator(\n row,\n selectColumns,\n get(rowSelectionPrimaryKeyAtom),\n )\n return get(selectedRowsAtom).some(selectedRow =>\n comparator(selectedRow, row),\n )\n },\n)\n\n/**\n * Whether rows are currently selected\n */\nexport const hasSelectedRowsAtom = atom(get => get(selectedRowsAtom).length > 0)\n/**\n * Whether rows are currently selected\n */\nexport function useHasSelectedRowsAtomValue() {\n return useAtomValue(hasSelectedRowsAtom)\n}\n"],"mappings":";;;AAIA,SAAgB,EACd,GACA,GACA,GAC+B;CAG/B,IAAI,IAA4C;AAkBhD,QAjBI,KAA0B,IAG5B,KAAc,GAAS,MAOd,EANoB,EAAuB,KAChD,MAAO,EAAG,OAAO,EAAc,WAAU,MAAM,EAAG,SAAS,EAAI,EAKlD,EAHY,EAAuB,KAChD,MAAO,EAAG,OAAO,EAAc,WAAU,MAAM,EAAG,SAAS,EAAI,EAE9B,CAAmB,GAE/C,EAAI,UAEb,KAAc,GAAS,MAAY,EAAG,UAAU,EAAG,QAG9C;;AAWT,IAAa,IAA4B,EAAc,GAAM,EAKhD,IAA+B,EAAc,GAAK,EAKlD,IAA6B,EAA2B,KAAA,EAAU;AAI/E,SAAgB,IAAqC;AACnD,QAAO,EAAa,EAA2B;;AAMjD,IAAa,IAAmB,EAAY,EAAE,CAAC;AAI/C,SAAgB,IAA2B;AACzC,QAAO,EAAa,EAAiB;;AAMvC,IAAa,IAAoB,GAC/B,OAAQ,GAAU,MAAkC;CAClD,IAAM,IAAa,EACjB,GACA,GACA,EAAI,EAA2B,CAChC;AACD,QAAO,EAAI,EAAiB,CAAC,MAAK,MAChC,EAAW,GAAa,EAAI,CAC7B;EAEJ,EAKY,IAAsB,GAAK,MAAO,EAAI,EAAiB,CAAC,SAAS,EAAE;AAIhF,SAAgB,IAA8B;AAC5C,QAAO,EAAa,EAAoB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"generateEncodedPathAndQueryForSelectedFacetURL.js","names":[],"sources":["../../../src/components/QueryWrapper/generateEncodedPathAndQueryForSelectedFacetURL.ts"],"sourcesContent":["import {\n FacetColumnValuesRequest,\n Query,\n} from '@sage-bionetworks/synapse-types'\nimport { generateCompressedQueryURL } from '../../utils/functions/deepLinkingUtils'\n\nexport type SelectedFacet = {\n facet: string\n facetValue: string\n}\n\nconst formatSelectedFacetsRequest = (\n selectedFacets: SelectedFacet[],\n): FacetColumnValuesRequest[] => {\n return selectedFacets.map(selectedFacet => {\n return {\n concreteType:\n 'org.sagebionetworks.repo.model.table.FacetColumnValuesRequest',\n columnName: selectedFacet.facet,\n facetValues: [selectedFacet.facetValue],\n }\n })\n}\n\nexport const generateEncodedPathAndQueryForSelectedFacetURL = async (\n path: string,\n sql: string,\n selectedFacets: SelectedFacet[],\n): Promise<string> => {\n const currentQuery: Query = {\n sql,\n selectedFacets: formatSelectedFacetsRequest(selectedFacets),\n }\n\n const initQuery: Query = {\n sql,\n }\n\n return generateCompressedQueryURL(path, 0, currentQuery, initQuery)\n}\n"],"mappings":";;AAWA,IAAM,KACJ,MAEO,EAAe,KAAI,OACjB;CACL,cACE;CACF,YAAY,EAAc;CAC1B,aAAa,CAAC,EAAc,WAAW;CACxC,EACD,EAGS,IAAiD,OAC5D,GACA,GACA,MAWO,EAA2B,GAAM,
|
|
1
|
+
{"version":3,"file":"generateEncodedPathAndQueryForSelectedFacetURL.js","names":[],"sources":["../../../src/components/QueryWrapper/generateEncodedPathAndQueryForSelectedFacetURL.ts"],"sourcesContent":["import {\n FacetColumnValuesRequest,\n Query,\n} from '@sage-bionetworks/synapse-types'\nimport { generateCompressedQueryURL } from '../../utils/functions/deepLinkingUtils'\n\nexport type SelectedFacet = {\n facet: string\n facetValue: string\n}\n\nconst formatSelectedFacetsRequest = (\n selectedFacets: SelectedFacet[],\n): FacetColumnValuesRequest[] => {\n return selectedFacets.map(selectedFacet => {\n return {\n concreteType:\n 'org.sagebionetworks.repo.model.table.FacetColumnValuesRequest',\n columnName: selectedFacet.facet,\n facetValues: [selectedFacet.facetValue],\n }\n })\n}\n\nexport const generateEncodedPathAndQueryForSelectedFacetURL = async (\n path: string,\n sql: string,\n selectedFacets: SelectedFacet[],\n): Promise<string> => {\n const currentQuery: Query = {\n sql,\n selectedFacets: formatSelectedFacetsRequest(selectedFacets),\n }\n\n const initQuery: Query = {\n sql,\n }\n\n return generateCompressedQueryURL(path, 0, currentQuery, initQuery)\n}\n"],"mappings":";;AAWA,IAAM,KACJ,MAEO,EAAe,KAAI,OACjB;CACL,cACE;CACF,YAAY,EAAc;CAC1B,aAAa,CAAC,EAAc,WAAW;CACxC,EACD,EAGS,IAAiD,OAC5D,GACA,GACA,MAWO,EAA2B,GAAM,GAAG;CARzC;CACA,gBAAgB,EAA4B,EAAe;CAOlB,EAAc,EAHvD,QAGuD,CAAU"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useGetQueryMetadata.js","names":[],"sources":["../../../src/components/QueryWrapper/useGetQueryMetadata.ts"],"sourcesContent":["import { SynapseClientError } from '@sage-bionetworks/synapse-client'\nimport {\n AsynchronousJobStatus,\n QueryBundleRequest,\n QueryResultBundle,\n} from '@sage-bionetworks/synapse-types'\nimport {\n useQuery,\n UseQueryOptions,\n useSuspenseQuery,\n UseSuspenseQueryOptions,\n} from '@tanstack/react-query'\nimport { useQueryContext } from '../QueryContext/index'\n\n/**\n * Get the metadata (columns, count, i.e. not row data) for the query in the current QueryContext (provided by\n * QueryWrapper)\n */\nexport function useGetQueryMetadata<\n TSelect = Omit<QueryResultBundle, 'queryResult'>,\n>(\n optionsOverrides?: Partial<\n UseQueryOptions<\n AsynchronousJobStatus<QueryBundleRequest, QueryResultBundle>,\n SynapseClientError,\n TSelect\n >\n >,\n) {\n const { queryMetadataQueryOptions } = useQueryContext()\n\n const mergedOptions = {\n ...queryMetadataQueryOptions,\n ...optionsOverrides,\n } as UseQueryOptions<\n AsynchronousJobStatus<QueryBundleRequest, QueryResultBundle>,\n SynapseClientError,\n TSelect\n >\n\n return useQuery(mergedOptions)\n}\n\n/**\n * Get the metadata (columns, count, i.e. not row data) for the query in the current QueryContext (provided by\n * QueryWrapper). Suspends the component tree if the query data is not yet loaded.\n */\nexport function useSuspenseGetQueryMetadata<\n TSelect = Omit<QueryResultBundle, 'queryResult'>,\n>(\n optionsOverrides?: Partial<\n UseSuspenseQueryOptions<\n AsynchronousJobStatus<QueryBundleRequest, QueryResultBundle>,\n SynapseClientError,\n TSelect\n >\n >,\n) {\n const { queryMetadataQueryOptions } = useQueryContext()\n\n const mergedOptions = {\n ...queryMetadataQueryOptions,\n ...optionsOverrides,\n } as UseSuspenseQueryOptions<\n AsynchronousJobStatus<QueryBundleRequest, QueryResultBundle>,\n SynapseClientError,\n TSelect\n >\n\n return useSuspenseQuery<\n AsynchronousJobStatus<QueryBundleRequest, QueryResultBundle>,\n SynapseClientError,\n TSelect\n >(mergedOptions)\n}\n"],"mappings":";;;;AAkBA,SAAgB,EAGd,GAOA;CACA,IAAM,EAAE,iCAA8B,GAAiB;AAWvD,QAAO,
|
|
1
|
+
{"version":3,"file":"useGetQueryMetadata.js","names":[],"sources":["../../../src/components/QueryWrapper/useGetQueryMetadata.ts"],"sourcesContent":["import { SynapseClientError } from '@sage-bionetworks/synapse-client'\nimport {\n AsynchronousJobStatus,\n QueryBundleRequest,\n QueryResultBundle,\n} from '@sage-bionetworks/synapse-types'\nimport {\n useQuery,\n UseQueryOptions,\n useSuspenseQuery,\n UseSuspenseQueryOptions,\n} from '@tanstack/react-query'\nimport { useQueryContext } from '../QueryContext/index'\n\n/**\n * Get the metadata (columns, count, i.e. not row data) for the query in the current QueryContext (provided by\n * QueryWrapper)\n */\nexport function useGetQueryMetadata<\n TSelect = Omit<QueryResultBundle, 'queryResult'>,\n>(\n optionsOverrides?: Partial<\n UseQueryOptions<\n AsynchronousJobStatus<QueryBundleRequest, QueryResultBundle>,\n SynapseClientError,\n TSelect\n >\n >,\n) {\n const { queryMetadataQueryOptions } = useQueryContext()\n\n const mergedOptions = {\n ...queryMetadataQueryOptions,\n ...optionsOverrides,\n } as UseQueryOptions<\n AsynchronousJobStatus<QueryBundleRequest, QueryResultBundle>,\n SynapseClientError,\n TSelect\n >\n\n return useQuery(mergedOptions)\n}\n\n/**\n * Get the metadata (columns, count, i.e. not row data) for the query in the current QueryContext (provided by\n * QueryWrapper). Suspends the component tree if the query data is not yet loaded.\n */\nexport function useSuspenseGetQueryMetadata<\n TSelect = Omit<QueryResultBundle, 'queryResult'>,\n>(\n optionsOverrides?: Partial<\n UseSuspenseQueryOptions<\n AsynchronousJobStatus<QueryBundleRequest, QueryResultBundle>,\n SynapseClientError,\n TSelect\n >\n >,\n) {\n const { queryMetadataQueryOptions } = useQueryContext()\n\n const mergedOptions = {\n ...queryMetadataQueryOptions,\n ...optionsOverrides,\n } as UseSuspenseQueryOptions<\n AsynchronousJobStatus<QueryBundleRequest, QueryResultBundle>,\n SynapseClientError,\n TSelect\n >\n\n return useSuspenseQuery<\n AsynchronousJobStatus<QueryBundleRequest, QueryResultBundle>,\n SynapseClientError,\n TSelect\n >(mergedOptions)\n}\n"],"mappings":";;;;AAkBA,SAAgB,EAGd,GAOA;CACA,IAAM,EAAE,iCAA8B,GAAiB;AAWvD,QAAO,EAAS;EARd,GAAG;EACH,GAAG;EAOW,CAAc;;AAOhC,SAAgB,EAGd,GAOA;CACA,IAAM,EAAE,iCAA8B,GAAiB;AAWvD,QAAO,EAIL;EAZA,GAAG;EACH,GAAG;EAWH,CAAc"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"QueryWrapperErrorBoundary.js","names":[],"sources":["../../src/components/QueryWrapperErrorBoundary.tsx"],"sourcesContent":["import { SynapseClientError, useSynapseContext } from '@/utils'\nimport { PropsWithChildren, useCallback, useMemo } from 'react'\nimport {\n ErrorBoundary,\n ErrorBoundaryPropsWithComponent,\n} from 'react-error-boundary'\nimport { EntityActionsRequired } from './AccessRequirement/EntityActionsRequired'\nimport { ErrorBanner } from './error/ErrorBanner'\nimport { useQueryContext } from './QueryContext/QueryContext'\nimport SqlEditor from './SynapseTable/SqlEditor'\n\n/**\n * Error boundary that automatically pulls the error from QueryContext. If 403, shows entity actions required\n */\nexport function QueryWrapperErrorBoundary({\n children,\n}: PropsWithChildren<Record<never, never>>) {\n const { getCurrentQueryRequest, onViewSharingSettingsClicked } =\n useQueryContext()\n const { entityId } = useMemo(\n () => getCurrentQueryRequest(),\n [getCurrentQueryRequest],\n )\n const { isAuthenticated } = useSynapseContext()\n\n const FallbackComponent: ErrorBoundaryPropsWithComponent['FallbackComponent'] =\n useCallback(\n props => {\n if (\n props.error instanceof SynapseClientError &&\n props.error.status === 403 &&\n isAuthenticated\n ) {\n return (\n <div className={`ErrorBannerWrapper`}>\n <EntityActionsRequired\n entityId={entityId}\n onViewSharingSettingsClicked={onViewSharingSettingsClicked}\n />\n </div>\n )\n }\n return (\n <div className={`ErrorBannerWrapper`}>\n <SqlEditor resetErrorBoundary={props.resetErrorBoundary} />\n <ErrorBanner {...props} />\n </div>\n )\n },\n [entityId, isAuthenticated, onViewSharingSettingsClicked],\n )\n\n return (\n <ErrorBoundary FallbackComponent={FallbackComponent}>\n {children}\n </ErrorBoundary>\n )\n}\n"],"mappings":";;;;;;;;;;AAcA,SAAgB,EAA0B,EACxC,eAC0C;CAC1C,IAAM,EAAE,2BAAwB,oCAC9B,GAAiB,EACb,EAAE,gBAAa,QACb,GAAwB,EAC9B,CAAC,EAAuB,CACzB,EACK,EAAE,uBAAoB,GAAmB;AA6B/C,QACE,kBAAC,GAAD;EAAkC,mBA3BlC,GACE,MAEI,EAAM,iBAAiB,KACvB,EAAM,MAAM,WAAW,OACvB,IAGE,kBAAC,OAAD;GAAK,WAAW;aACd,kBAAC,GAAD;IACY;IACoB;IAC9B,CAAA;GACE,CAAA,GAIR,kBAAC,OAAD;GAAK,WAAW;aAAhB,CACE,kBAAC,GAAD,EAAW,oBAAoB,EAAM,oBAAsB,CAAA,EAC3D,kBAAC,GAAD,EAAa,GAAI,GAAS,CAAA,CACtB;MAGV;GAAC;GAAU;GAAiB;GAA6B,
|
|
1
|
+
{"version":3,"file":"QueryWrapperErrorBoundary.js","names":[],"sources":["../../src/components/QueryWrapperErrorBoundary.tsx"],"sourcesContent":["import { SynapseClientError, useSynapseContext } from '@/utils'\nimport { PropsWithChildren, useCallback, useMemo } from 'react'\nimport {\n ErrorBoundary,\n ErrorBoundaryPropsWithComponent,\n} from 'react-error-boundary'\nimport { EntityActionsRequired } from './AccessRequirement/EntityActionsRequired'\nimport { ErrorBanner } from './error/ErrorBanner'\nimport { useQueryContext } from './QueryContext/QueryContext'\nimport SqlEditor from './SynapseTable/SqlEditor'\n\n/**\n * Error boundary that automatically pulls the error from QueryContext. If 403, shows entity actions required\n */\nexport function QueryWrapperErrorBoundary({\n children,\n}: PropsWithChildren<Record<never, never>>) {\n const { getCurrentQueryRequest, onViewSharingSettingsClicked } =\n useQueryContext()\n const { entityId } = useMemo(\n () => getCurrentQueryRequest(),\n [getCurrentQueryRequest],\n )\n const { isAuthenticated } = useSynapseContext()\n\n const FallbackComponent: ErrorBoundaryPropsWithComponent['FallbackComponent'] =\n useCallback(\n props => {\n if (\n props.error instanceof SynapseClientError &&\n props.error.status === 403 &&\n isAuthenticated\n ) {\n return (\n <div className={`ErrorBannerWrapper`}>\n <EntityActionsRequired\n entityId={entityId}\n onViewSharingSettingsClicked={onViewSharingSettingsClicked}\n />\n </div>\n )\n }\n return (\n <div className={`ErrorBannerWrapper`}>\n <SqlEditor resetErrorBoundary={props.resetErrorBoundary} />\n <ErrorBanner {...props} />\n </div>\n )\n },\n [entityId, isAuthenticated, onViewSharingSettingsClicked],\n )\n\n return (\n <ErrorBoundary FallbackComponent={FallbackComponent}>\n {children}\n </ErrorBoundary>\n )\n}\n"],"mappings":";;;;;;;;;;AAcA,SAAgB,EAA0B,EACxC,eAC0C;CAC1C,IAAM,EAAE,2BAAwB,oCAC9B,GAAiB,EACb,EAAE,gBAAa,QACb,GAAwB,EAC9B,CAAC,EAAuB,CACzB,EACK,EAAE,uBAAoB,GAAmB;AA6B/C,QACE,kBAAC,GAAD;EAAkC,mBA3BlC,GACE,MAEI,EAAM,iBAAiB,KACvB,EAAM,MAAM,WAAW,OACvB,IAGE,kBAAC,OAAD;GAAK,WAAW;aACd,kBAAC,GAAD;IACY;IACoB;IAC9B,CAAA;GACE,CAAA,GAIR,kBAAC,OAAD;GAAK,WAAW;aAAhB,CACE,kBAAC,GAAD,EAAW,oBAAoB,EAAM,oBAAsB,CAAA,EAC3D,kBAAC,GAAD,EAAa,GAAI,GAAS,CAAA,CACtB;MAGV;GAAC;GAAU;GAAiB;GAA6B,CAIzB;EAC/B;EACa,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"QueryWrapperPlotNav.js","names":[],"sources":["../../../src/components/QueryWrapperPlotNav/QueryWrapperPlotNav.tsx"],"sourcesContent":["import { QueryOrDeprecatedSearchParams } from '@/components/CardContainerLogic/CardContainerLogic'\nimport AddToDownloadListConfirmationAlert from '@/components/download_list/AddToDownloadListConfirmationAlert/AddToDownloadListConfirmationAlert'\nimport { useGetAddToDownloadListRequestForCurrentQuery } from '@/components/QueryWrapper/useGetAddToDownloadListRequestForCurrentQuery'\nimport { NoContentPlaceholderType } from '@/components/SynapseTable/NoContentPlaceholderType'\nimport { useGetEntity } from '@/synapse-queries'\nimport { SynapseConstants } from '@/utils'\nimport {\n getAdditionalFilters,\n parseEntityIdAndVersionFromSqlStatement,\n} from '@/utils/functions'\nimport { isTable } from '@/utils/functions/EntityTypeUtils'\nimport { DEFAULT_PAGE_SIZE } from '@/utils/SynapseConstants'\nimport { Box } from '@mui/material'\nimport { Query, QueryBundleRequest } from '@sage-bionetworks/synapse-types'\nimport { useQuery } from '@tanstack/react-query'\nimport { useAtomValue } from 'jotai'\nimport { Suspense, useMemo, useState } from 'react'\nimport { CardConfiguration } from '../CardContainer/CardConfiguration'\nimport { SynapseErrorBoundary } from '../error'\nimport FullTextSearch from '../FullTextSearch/FullTextSearch'\nimport ModalDownload from '../ModalDownload/ModalDownload'\nimport { QueryWrapperPlotNavCustomPlotParams } from '../Plot/SynapsePlot'\nimport { QueryContextType, useQueryContext } from '../QueryContext'\nimport {\n QueryVisualizationContextConsumer,\n QueryVisualizationWrapper,\n QueryVisualizationWrapperProps,\n} from '../QueryVisualizationWrapper'\nimport { QueryWrapper, QueryWrapperProps } from '../QueryWrapper'\nimport { isRowSelectionVisibleAtom } from '../QueryWrapper/TableRowSelectionState'\nimport { QueryWrapperErrorBoundary } from '../QueryWrapperErrorBoundary'\nimport { SynapseTableConfiguration } from '../SynapseTable'\nimport SearchV2, { SearchV2Props } from '../SynapseTable/SearchV2'\nimport SqlEditor from '../SynapseTable/SqlEditor'\nimport TopLevelControls, {\n TopLevelControlsProps,\n CustomControl,\n} from '../SynapseTable/TopLevelControls/TopLevelControls'\nimport { CustomControls } from '../SynapseTable/CustomControls/CustomControls'\nimport TotalQueryResults from '../TotalQueryResults'\nimport PlotsContainer, {\n PlotsContainerProps,\n} from '../widgets/facet-nav/PlotsContainer'\nimport FacetFilterControls, {\n FacetFilterControlsProps,\n} from '../widgets/query-filter/FacetFilterControls'\nimport { QueryWrapperSynapsePlotProps } from './QueryWrapperSynapsePlot'\nimport { RowSetView } from './RowSetView'\nimport QueryWrapperLoadingScreen from '../QueryWrapper/QueryWrapperLoadingScreen'\n\nexport const QUERY_FILTERS_EXPANDED_CSS: string = 'isShowingFacetFilters'\nexport const QUERY_FILTERS_COLLAPSED_CSS: string = 'isHidingFacetFilters'\n\nexport const HAS_SELECTED_ROWS_CSS: string = 'hasSelectedRows'\n\ntype QueryWrapperPlotNavOwnProps = {\n /** Whether the displayed results should be paginated or infinite. Default for cards is true, default for table is false */\n isInfinite?: boolean\n /** Set to true when you want the query to be saved in the URL search parameters. If you are controlling the view (such as in PortalSearch), you'll want to set this to false */\n shouldDeepLink?: boolean\n /** If onQueryChange is set, the callback will be invoked when the Query changes */\n onQueryChange?: (newQueryJson: string) => void\n /** If onQueryResultBundleChange is set, the callback will be invoked when the QueryResultBundle changes */\n onQueryResultBundleChange?: (newQueryResultBundleJson: string) => void\n /** If initQueryJson is set, it will be the Query used in the initial QueryBundleRequest */\n initQueryJson?: string\n tableConfiguration?: SynapseTableConfiguration\n cardConfiguration?: CardConfiguration\n searchConfiguration?: Omit<\n SearchV2Props,\n 'queryContext' | 'queryVisualizationContext'\n >\n facetsToPlot?: string[]\n availableFacets?: FacetFilterControlsProps['availableFacets']\n initialExpandedFacetControls?: FacetFilterControlsProps['initialExpandedFacetControls']\n customPlots?: QueryWrapperSynapsePlotProps[]\n customControls?: CustomControl[]\n defaultColumn?: string\n defaultShowSearchBox?: boolean\n lockedColumn?: QueryWrapperProps['lockedColumn']\n onViewSharingSettingsClicked?: (benefactorId: string) => void\n initialLimit?: number\n hideTopLevelControls?: boolean\n} & Omit<TopLevelControlsProps, 'entityId'> &\n Pick<QueryWrapperPlotNavCustomPlotParams, 'onCustomPlotClick'> &\n Pick<\n QueryWrapperProps,\n | 'isRowSelectionVisible'\n | 'rowSelectionPrimaryKey'\n | 'isRowSelectionUIFloating'\n | 'fileIdColumnName'\n | 'fileNameColumnName'\n | 'fileVersionColumnName'\n > &\n Pick<\n QueryVisualizationWrapperProps,\n | 'defaultShowPlots'\n | 'visibleColumnCount'\n | 'columnAliases'\n | 'rgbIndex'\n | 'showLastUpdatedOn'\n | 'noContentPlaceholderType'\n | 'unitDescription'\n | 'additionalFiltersSessionStorageKey'\n | 'helpConfiguration'\n | 'hideCopyToClipboard'\n | 'hideSearchBarControl'\n | 'hideVisualizationsControl'\n | 'enabledExternalAnalysisPlatforms'\n > &\n Pick<QueryContextType, 'combineRangeFacetConfig'>\n\nexport type QueryWrapperPlotNavProps = QueryOrDeprecatedSearchParams &\n PlotsContainerProps &\n QueryWrapperPlotNavOwnProps\n\ntype QueryWrapperPlotNavContentsProps = Pick<\n QueryWrapperPlotNavProps,\n | 'tableConfiguration'\n | 'name'\n | 'cardConfiguration'\n | 'facetsToPlot'\n | 'availableFacets'\n | 'initialExpandedFacetControls'\n | 'hideDownload'\n | 'hideQueryCount'\n | 'hideSqlEditorControl'\n | 'hideVisualizationsControl'\n | 'searchConfiguration'\n | 'enabledExternalAnalysisPlatforms'\n | 'cavaticaConnectAccountURL'\n | 'customControls'\n | 'customPlots'\n | 'fileIdColumnName'\n | 'fileNameColumnName'\n | 'fileVersionColumnName'\n | 'initialLimit'\n | 'initialPlotTypeByFacetColumnName'\n | 'hideTopLevelControls'\n> & {\n isFullTextSearchEnabled: boolean\n remount: () => void\n}\n\nfunction QueryWrapperPlotNavContents(props: QueryWrapperPlotNavContentsProps) {\n const {\n tableConfiguration,\n name,\n cardConfiguration,\n facetsToPlot,\n availableFacets,\n initialExpandedFacetControls,\n hideDownload,\n hideQueryCount,\n hideSqlEditorControl,\n hideVisualizationsControl,\n searchConfiguration,\n cavaticaConnectAccountURL,\n customControls,\n remount,\n isFullTextSearchEnabled,\n customPlots,\n initialLimit,\n initialPlotTypeByFacetColumnName,\n hideTopLevelControls,\n } = props\n const queryContext = useQueryContext()\n const [showExportMetadata, setShowExportMetadata] = useState(false)\n const { hasFacetedSelectColumn: isFaceted, queryMetadataQueryOptions } =\n queryContext\n const { isLoading: isLoadingQueryMetadata } = useQuery(\n queryMetadataQueryOptions,\n )\n\n const isRowSelectionVisible = useAtomValue(isRowSelectionVisibleAtom)\n\n const currentQueryRequest = queryContext.currentQueryRequest\n\n const hasFacetsOrFilters =\n (currentQueryRequest?.query.selectedFacets !== undefined &&\n currentQueryRequest.query.selectedFacets.length > 0) ||\n (currentQueryRequest?.query.additionalFilters !== undefined &&\n currentQueryRequest?.query.additionalFilters.length > 0)\n\n const addToDownloadListRequest =\n useGetAddToDownloadListRequestForCurrentQuery()\n\n return (\n <QueryVisualizationContextConsumer>\n {queryVisualizationContext => {\n if (queryVisualizationContext === undefined) {\n throw new Error(\n 'No queryVisualizationContext found when using QueryVisualizationContextConsumer',\n )\n }\n\n return (\n <Box\n className={`QueryWrapperPlotNav ${\n queryVisualizationContext.showFacetFilter\n ? QUERY_FILTERS_EXPANDED_CSS\n : QUERY_FILTERS_COLLAPSED_CSS\n } ${isRowSelectionVisible ? HAS_SELECTED_ROWS_CSS : ''} ${\n hideTopLevelControls ? 'isHidingTopLevelControls' : ''\n }`}\n sx={{\n '*': {\n cursor: isLoadingQueryMetadata ? 'wait' : undefined,\n },\n }}\n >\n <QueryWrapperErrorBoundary>\n {isFullTextSearchEnabled ? (\n <FullTextSearch ftsConfig={searchConfiguration?.ftsConfig} />\n ) : (\n <SearchV2\n {...searchConfiguration}\n queryContext={queryContext}\n queryVisualizationContext={queryVisualizationContext}\n />\n )}\n <SqlEditor />\n {queryVisualizationContext.showDownloadConfirmation && (\n <AddToDownloadListConfirmationAlert\n addToDownloadListRequest={addToDownloadListRequest}\n onClose={() =>\n queryVisualizationContext.setShowDownloadConfirmation(false)\n }\n />\n )}\n {!hideTopLevelControls && (\n <SynapseErrorBoundary>\n <TopLevelControls\n showColumnSelection={tableConfiguration !== undefined}\n name={name}\n hideDownload={hideDownload}\n hideQueryCount={hideQueryCount}\n hideFacetFilterControl={!isFaceted}\n hideVisualizationsControl={\n !isFaceted || hideVisualizationsControl\n }\n hideSqlEditorControl={hideSqlEditorControl}\n cavaticaConnectAccountURL={cavaticaConnectAccountURL}\n remount={remount}\n customControls={customControls}\n />\n </SynapseErrorBoundary>\n )}\n {isFaceted && (\n <>\n <FacetFilterControls\n availableFacets={availableFacets}\n initialExpandedFacetControls={initialExpandedFacetControls}\n />\n </>\n )}\n <TotalQueryResults\n frontText={''}\n endText={hasFacetsOrFilters ? 'filtered by' : ''}\n hideIfUnfiltered={true}\n />\n <CustomControls\n customControls={customControls}\n remount={remount}\n />\n <PlotsContainer\n facetsToPlot={facetsToPlot}\n customPlots={customPlots}\n initialPlotTypeByFacetColumnName={\n initialPlotTypeByFacetColumnName\n }\n />\n <RowSetView\n tableConfiguration={tableConfiguration}\n hideDownload={hideDownload}\n cardConfiguration={cardConfiguration}\n initialLimit={initialLimit}\n />\n {showExportMetadata && (\n <ModalDownload\n getLastQueryRequest={queryContext?.getCurrentQueryRequest}\n onClose={() => setShowExportMetadata(false)}\n />\n )}\n </QueryWrapperErrorBoundary>\n </Box>\n )\n }}\n </QueryVisualizationContextConsumer>\n )\n}\n\nexport default function QueryWrapperPlotNav(props: QueryWrapperPlotNavProps) {\n const {\n sql: deprecatedSql,\n tableConfiguration,\n isInfinite = !tableConfiguration,\n limit = DEFAULT_PAGE_SIZE,\n showLastUpdatedOn,\n unitDescription,\n additionalFiltersSessionStorageKey,\n helpConfiguration,\n customPlots,\n enabledExternalAnalysisPlatforms,\n } = props\n\n const sql = props.query?.sql ?? deprecatedSql ?? ''\n const { entityId, versionNumber } =\n parseEntityIdAndVersionFromSqlStatement(sql)\n\n const query: Query = useMemo(() => {\n if (props.query) {\n // use query if set\n return props.query\n } else if (props.initQueryJson) {\n // Otherwise use initQueryJson\n return JSON.parse(props.initQueryJson) as Query\n } else {\n // use the deprecated sql, searchParams, and sqlOperator\n const additionalFilters = getAdditionalFilters(\n props.searchParams,\n props.sqlOperator,\n additionalFiltersSessionStorageKey,\n )\n return {\n sql: deprecatedSql!,\n additionalFilters,\n limit: limit,\n offset: 0,\n }\n }\n }, [\n props.query,\n props.initQueryJson,\n props.searchParams,\n props.sqlOperator,\n additionalFiltersSessionStorageKey,\n deprecatedSql,\n limit,\n ])\n\n const [componentKey, setComponentKey] = useState(1)\n const remount = () => {\n setComponentKey(componentKey + 1)\n }\n\n const { data: entity } = useGetEntity(entityId, versionNumber)\n const initQueryRequest: QueryBundleRequest = {\n entityId: entityId ?? '',\n concreteType: 'org.sagebionetworks.repo.model.table.QueryBundleRequest',\n partMask:\n SynapseConstants.BUNDLE_MASK_QUERY_RESULTS |\n SynapseConstants.BUNDLE_MASK_QUERY_COUNT |\n SynapseConstants.BUNDLE_MASK_QUERY_SELECT_COLUMNS |\n SynapseConstants.BUNDLE_MASK_QUERY_MAX_ROWS_PER_PAGE |\n SynapseConstants.BUNDLE_MASK_QUERY_COLUMN_MODELS |\n SynapseConstants.BUNDLE_MASK_QUERY_FACETS |\n SynapseConstants.BUNDLE_MASK_SUM_FILES_SIZE_BYTES |\n SynapseConstants.BUNDLE_MASK_LAST_UPDATED_ON,\n query,\n }\n const isFullTextSearchEnabled =\n (entity && isTable(entity) && entity.isSearchEnabled) ?? false\n\n /**\n * Fully re-render the uncontrolled QueryWrapper component when the initial query changes. This eliminates a class of\n * bugs where our 'derived' state (the current query), which should be reset, is out of sync with props.\n *\n * See https://legacy.reactjs.org/blog/2018/06/07/you-probably-dont-need-derived-state.html#recommendation-fully-uncontrolled-component-with-a-key\n */\n const queryWrapperKey = `${JSON.stringify(initQueryRequest)}-${componentKey}`\n\n return (\n <QueryWrapper\n {...props}\n initQueryRequest={initQueryRequest}\n key={queryWrapperKey}\n isInfinite={isInfinite}\n >\n <Suspense fallback={<QueryWrapperLoadingScreen />}>\n <QueryVisualizationWrapper\n unitDescription={unitDescription}\n rgbIndex={props.rgbIndex}\n columnAliases={props.columnAliases}\n helpConfiguration={helpConfiguration}\n visibleColumnCount={props.visibleColumnCount}\n defaultShowPlots={props.defaultShowPlots}\n hideCopyToClipboard={props.hideCopyToClipboard}\n defaultShowSearchBar={\n (props.defaultShowSearchBox || isFullTextSearchEnabled) &&\n !props.hideSearchBarControl\n }\n hideSearchBarControl={props.hideSearchBarControl}\n showLastUpdatedOn={showLastUpdatedOn}\n noContentPlaceholderType={NoContentPlaceholderType.INTERACTIVE}\n hasCustomPlots={Array.isArray(customPlots) && customPlots.length > 0}\n enabledExternalAnalysisPlatforms={enabledExternalAnalysisPlatforms}\n >\n <QueryWrapperPlotNavContents\n {...props}\n isFullTextSearchEnabled={isFullTextSearchEnabled}\n remount={remount}\n />\n </QueryVisualizationWrapper>\n </Suspense>\n </QueryWrapper>\n )\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAkDA,IAAa,IAAqC,yBACrC,IAAsC,wBAEtC,IAAgC;AA2F7C,SAAS,EAA4B,GAAyC;CAC5E,IAAM,EACJ,uBACA,SACA,sBACA,iBACA,oBACA,iCACA,iBACA,mBACA,yBACA,8BACA,wBACA,8BACA,mBACA,YACA,4BACA,gBACA,kBACA,qCACA,4BACE,GACE,IAAe,GAAiB,EAChC,CAAC,GAAoB,KAAyB,EAAS,GAAM,EAC7D,EAAE,wBAAwB,GAAW,iCACzC,GACI,EAAE,WAAW,MAA2B,EAC5C,EACD,EAEK,IAAwB,EAAa,EAA0B,EAE/D,IAAsB,EAAa,qBAEnC,KACH,GAAqB,MAAM,mBAAmB,KAAA,KAC7C,EAAoB,MAAM,eAAe,SAAS,KACnD,GAAqB,MAAM,sBAAsB,KAAA,KAChD,GAAqB,MAAM,kBAAkB,SAAS,GAEpD,KACJ,GAA+C;AAEjD,QACE,kBAAC,GAAD,EAAA,WACG,MAA6B;AAC5B,MAAI,MAA8B,KAAA,EAChC,OAAU,MACR,kFACD;AAGH,SACE,kBAAC,GAAD;GACE,WAAW,uBACT,EAA0B,kBACtB,IACA,EACL,GAAG,IAAwB,IAAwB,GAAG,GACrD,IAAuB,6BAA6B;GAEtD,IAAI,EACF,KAAK,EACH,QAAQ,IAAyB,SAAS,KAAA,GAC3C,EACF;aAED,kBAAC,GAAD,EAAA,UAAA;IACG,IACC,kBAAC,GAAD,EAAgB,WAAW,GAAqB,WAAa,CAAA,GAE7D,kBAAC,GAAD;KACE,GAAI;KACU;KACa;KAC3B,CAAA;IAEJ,kBAAC,GAAD,EAAa,CAAA;IACZ,EAA0B,4BACzB,kBAAC,GAAD;KAC4B;KAC1B,eACE,EAA0B,4BAA4B,GAAM;KAE9D,CAAA;IAEH,CAAC,KACA,kBAAC,GAAD,EAAA,UACE,kBAAC,GAAD;KACE,qBAAqB,MAAuB,KAAA;KACtC;KACQ;KACE;KAChB,wBAAwB,CAAC;KACzB,2BACE,CAAC,KAAa;KAEM;KACK;KAClB;KACO;KAChB,CAAA,EACmB,CAAA;IAExB,KACC,kBAAA,GAAA,EAAA,UACE,kBAAC,GAAD;KACmB;KACa;KAC9B,CAAA,EACD,CAAA;IAEL,kBAAC,GAAD;KACE,WAAW;KACX,SAAS,KAAqB,gBAAgB;KAC9C,kBAAkB;KAClB,CAAA;IACF,kBAAC,GAAD;KACkB;KACP;KACT,CAAA;IACF,kBAAC,GAAD;KACgB;KACD;KAEX;KAEF,CAAA;IACF,kBAAC,GAAD;KACsB;KACN;KACK;KACL;KACd,CAAA;IACD,KACC,kBAAC,GAAD;KACE,qBAAqB,GAAc;KACnC,eAAe,EAAsB,GAAM;KAC3C,CAAA;IAEsB,EAAA,CAAA;GACxB,CAAA;IAGwB,CAAA;;AAIxC,SAAwB,EAAoB,GAAiC;CAC3E,IAAM,EACJ,KAAK,GACL,uBACA,gBAAa,CAAC,GACd,WAAA,IACA,sBACA,oBACA,uCACA,sBACA,gBACA,wCACE,GAGE,EAAE,aAAU,qBAChB,EAFU,EAAM,OAAO,OAAO,KAAiB,GAEH,EAExC,IAAe,QACf,EAAM,QAED,EAAM,QACJ,EAAM,gBAER,KAAK,MAAM,EAAM,cAAc,GAQ/B;EACL,KAAK;EACL,mBAPwB,EACxB,EAAM,cACN,EAAM,aACN,EACD;EAIQ;EACP,QAAQ;EACT,EAEF;EACD,EAAM;EACN,EAAM;EACN,EAAM;EACN,EAAM;EACN;EACA;EACA;EACD,CAAC,EAEI,CAAC,GAAc,KAAmB,EAAS,EAAE,EAC7C,UAAgB;AACpB,IAAgB,IAAe,EAAE;IAG7B,EAAE,MAAM,MAAW,EAAa,GAAU,EAAc,EACxD,IAAuC;EAC3C,UAAU,KAAY;EACtB,cAAc;EACd,UACE;EAQF;EACD,EACK,KACH,KAAU,EAAQ,EAAO,IAAI,EAAO,oBAAoB,IAQrD,IAAkB,GAAG,KAAK,UAAU,EAAiB,CAAC,GAAG;AAE/D,QACE,kBAAC,GAAD;EACE,GAAI;EACc;EAClB,KAAK;EACO;EA4BC,EA1Bb,kBAAC,GAAD;EAAU,UAAU,kBAAC,GAAD,EAA6B,CAAA;YAC/C,kBAAC,GAAD;GACmB;GACjB,UAAU,EAAM;GAChB,eAAe,EAAM;GACF;GACnB,oBAAoB,EAAM;GAC1B,kBAAkB,EAAM;GACxB,qBAAqB,EAAM;GAC3B,uBACG,EAAM,wBAAwB,MAC/B,CAAC,EAAM;GAET,sBAAsB,EAAM;GACT;GACnB,0BAA0B,EAAyB;GACnD,gBAAgB,MAAM,QAAQ,EAAY,IAAI,EAAY,SAAS;GACjC;aAElC,kBAAC,GAAD;IACE,GAAI;IACqB;IAChB;IACT,CAAA;GACwB,CAAA;EACnB,CAAA,CACE"}
|
|
1
|
+
{"version":3,"file":"QueryWrapperPlotNav.js","names":[],"sources":["../../../src/components/QueryWrapperPlotNav/QueryWrapperPlotNav.tsx"],"sourcesContent":["import { QueryOrDeprecatedSearchParams } from '@/components/CardContainerLogic/CardContainerLogic'\nimport AddToDownloadListConfirmationAlert from '@/components/download_list/AddToDownloadListConfirmationAlert/AddToDownloadListConfirmationAlert'\nimport { useGetAddToDownloadListRequestForCurrentQuery } from '@/components/QueryWrapper/useGetAddToDownloadListRequestForCurrentQuery'\nimport { NoContentPlaceholderType } from '@/components/SynapseTable/NoContentPlaceholderType'\nimport { useGetEntity } from '@/synapse-queries'\nimport { SynapseConstants } from '@/utils'\nimport {\n getAdditionalFilters,\n parseEntityIdAndVersionFromSqlStatement,\n} from '@/utils/functions'\nimport { isTable } from '@/utils/functions/EntityTypeUtils'\nimport { DEFAULT_PAGE_SIZE } from '@/utils/SynapseConstants'\nimport { Box } from '@mui/material'\nimport { Query, QueryBundleRequest } from '@sage-bionetworks/synapse-types'\nimport { useQuery } from '@tanstack/react-query'\nimport { useAtomValue } from 'jotai'\nimport { Suspense, useMemo, useState } from 'react'\nimport { CardConfiguration } from '../CardContainer/CardConfiguration'\nimport { SynapseErrorBoundary } from '../error'\nimport FullTextSearch from '../FullTextSearch/FullTextSearch'\nimport ModalDownload from '../ModalDownload/ModalDownload'\nimport { QueryWrapperPlotNavCustomPlotParams } from '../Plot/SynapsePlot'\nimport { QueryContextType, useQueryContext } from '../QueryContext'\nimport {\n QueryVisualizationContextConsumer,\n QueryVisualizationWrapper,\n QueryVisualizationWrapperProps,\n} from '../QueryVisualizationWrapper'\nimport { QueryWrapper, QueryWrapperProps } from '../QueryWrapper'\nimport { isRowSelectionVisibleAtom } from '../QueryWrapper/TableRowSelectionState'\nimport { QueryWrapperErrorBoundary } from '../QueryWrapperErrorBoundary'\nimport { SynapseTableConfiguration } from '../SynapseTable'\nimport SearchV2, { SearchV2Props } from '../SynapseTable/SearchV2'\nimport SqlEditor from '../SynapseTable/SqlEditor'\nimport TopLevelControls, {\n TopLevelControlsProps,\n CustomControl,\n} from '../SynapseTable/TopLevelControls/TopLevelControls'\nimport { CustomControls } from '../SynapseTable/CustomControls/CustomControls'\nimport TotalQueryResults from '../TotalQueryResults'\nimport PlotsContainer, {\n PlotsContainerProps,\n} from '../widgets/facet-nav/PlotsContainer'\nimport FacetFilterControls, {\n FacetFilterControlsProps,\n} from '../widgets/query-filter/FacetFilterControls'\nimport { QueryWrapperSynapsePlotProps } from './QueryWrapperSynapsePlot'\nimport { RowSetView } from './RowSetView'\nimport QueryWrapperLoadingScreen from '../QueryWrapper/QueryWrapperLoadingScreen'\n\nexport const QUERY_FILTERS_EXPANDED_CSS: string = 'isShowingFacetFilters'\nexport const QUERY_FILTERS_COLLAPSED_CSS: string = 'isHidingFacetFilters'\n\nexport const HAS_SELECTED_ROWS_CSS: string = 'hasSelectedRows'\n\ntype QueryWrapperPlotNavOwnProps = {\n /** Whether the displayed results should be paginated or infinite. Default for cards is true, default for table is false */\n isInfinite?: boolean\n /** Set to true when you want the query to be saved in the URL search parameters. If you are controlling the view (such as in PortalSearch), you'll want to set this to false */\n shouldDeepLink?: boolean\n /** If onQueryChange is set, the callback will be invoked when the Query changes */\n onQueryChange?: (newQueryJson: string) => void\n /** If onQueryResultBundleChange is set, the callback will be invoked when the QueryResultBundle changes */\n onQueryResultBundleChange?: (newQueryResultBundleJson: string) => void\n /** If initQueryJson is set, it will be the Query used in the initial QueryBundleRequest */\n initQueryJson?: string\n tableConfiguration?: SynapseTableConfiguration\n cardConfiguration?: CardConfiguration\n searchConfiguration?: Omit<\n SearchV2Props,\n 'queryContext' | 'queryVisualizationContext'\n >\n facetsToPlot?: string[]\n availableFacets?: FacetFilterControlsProps['availableFacets']\n initialExpandedFacetControls?: FacetFilterControlsProps['initialExpandedFacetControls']\n customPlots?: QueryWrapperSynapsePlotProps[]\n customControls?: CustomControl[]\n defaultColumn?: string\n defaultShowSearchBox?: boolean\n lockedColumn?: QueryWrapperProps['lockedColumn']\n onViewSharingSettingsClicked?: (benefactorId: string) => void\n initialLimit?: number\n hideTopLevelControls?: boolean\n} & Omit<TopLevelControlsProps, 'entityId'> &\n Pick<QueryWrapperPlotNavCustomPlotParams, 'onCustomPlotClick'> &\n Pick<\n QueryWrapperProps,\n | 'isRowSelectionVisible'\n | 'rowSelectionPrimaryKey'\n | 'isRowSelectionUIFloating'\n | 'fileIdColumnName'\n | 'fileNameColumnName'\n | 'fileVersionColumnName'\n > &\n Pick<\n QueryVisualizationWrapperProps,\n | 'defaultShowPlots'\n | 'visibleColumnCount'\n | 'columnAliases'\n | 'rgbIndex'\n | 'showLastUpdatedOn'\n | 'noContentPlaceholderType'\n | 'unitDescription'\n | 'additionalFiltersSessionStorageKey'\n | 'helpConfiguration'\n | 'hideCopyToClipboard'\n | 'hideSearchBarControl'\n | 'hideVisualizationsControl'\n | 'enabledExternalAnalysisPlatforms'\n > &\n Pick<QueryContextType, 'combineRangeFacetConfig'>\n\nexport type QueryWrapperPlotNavProps = QueryOrDeprecatedSearchParams &\n PlotsContainerProps &\n QueryWrapperPlotNavOwnProps\n\ntype QueryWrapperPlotNavContentsProps = Pick<\n QueryWrapperPlotNavProps,\n | 'tableConfiguration'\n | 'name'\n | 'cardConfiguration'\n | 'facetsToPlot'\n | 'availableFacets'\n | 'initialExpandedFacetControls'\n | 'hideDownload'\n | 'hideQueryCount'\n | 'hideSqlEditorControl'\n | 'hideVisualizationsControl'\n | 'searchConfiguration'\n | 'enabledExternalAnalysisPlatforms'\n | 'cavaticaConnectAccountURL'\n | 'customControls'\n | 'customPlots'\n | 'fileIdColumnName'\n | 'fileNameColumnName'\n | 'fileVersionColumnName'\n | 'initialLimit'\n | 'initialPlotTypeByFacetColumnName'\n | 'hideTopLevelControls'\n> & {\n isFullTextSearchEnabled: boolean\n remount: () => void\n}\n\nfunction QueryWrapperPlotNavContents(props: QueryWrapperPlotNavContentsProps) {\n const {\n tableConfiguration,\n name,\n cardConfiguration,\n facetsToPlot,\n availableFacets,\n initialExpandedFacetControls,\n hideDownload,\n hideQueryCount,\n hideSqlEditorControl,\n hideVisualizationsControl,\n searchConfiguration,\n cavaticaConnectAccountURL,\n customControls,\n remount,\n isFullTextSearchEnabled,\n customPlots,\n initialLimit,\n initialPlotTypeByFacetColumnName,\n hideTopLevelControls,\n } = props\n const queryContext = useQueryContext()\n const [showExportMetadata, setShowExportMetadata] = useState(false)\n const { hasFacetedSelectColumn: isFaceted, queryMetadataQueryOptions } =\n queryContext\n const { isLoading: isLoadingQueryMetadata } = useQuery(\n queryMetadataQueryOptions,\n )\n\n const isRowSelectionVisible = useAtomValue(isRowSelectionVisibleAtom)\n\n const currentQueryRequest = queryContext.currentQueryRequest\n\n const hasFacetsOrFilters =\n (currentQueryRequest?.query.selectedFacets !== undefined &&\n currentQueryRequest.query.selectedFacets.length > 0) ||\n (currentQueryRequest?.query.additionalFilters !== undefined &&\n currentQueryRequest?.query.additionalFilters.length > 0)\n\n const addToDownloadListRequest =\n useGetAddToDownloadListRequestForCurrentQuery()\n\n return (\n <QueryVisualizationContextConsumer>\n {queryVisualizationContext => {\n if (queryVisualizationContext === undefined) {\n throw new Error(\n 'No queryVisualizationContext found when using QueryVisualizationContextConsumer',\n )\n }\n\n return (\n <Box\n className={`QueryWrapperPlotNav ${\n queryVisualizationContext.showFacetFilter\n ? QUERY_FILTERS_EXPANDED_CSS\n : QUERY_FILTERS_COLLAPSED_CSS\n } ${isRowSelectionVisible ? HAS_SELECTED_ROWS_CSS : ''} ${\n hideTopLevelControls ? 'isHidingTopLevelControls' : ''\n }`}\n sx={{\n '*': {\n cursor: isLoadingQueryMetadata ? 'wait' : undefined,\n },\n }}\n >\n <QueryWrapperErrorBoundary>\n {isFullTextSearchEnabled ? (\n <FullTextSearch ftsConfig={searchConfiguration?.ftsConfig} />\n ) : (\n <SearchV2\n {...searchConfiguration}\n queryContext={queryContext}\n queryVisualizationContext={queryVisualizationContext}\n />\n )}\n <SqlEditor />\n {queryVisualizationContext.showDownloadConfirmation && (\n <AddToDownloadListConfirmationAlert\n addToDownloadListRequest={addToDownloadListRequest}\n onClose={() =>\n queryVisualizationContext.setShowDownloadConfirmation(false)\n }\n />\n )}\n {!hideTopLevelControls && (\n <SynapseErrorBoundary>\n <TopLevelControls\n showColumnSelection={tableConfiguration !== undefined}\n name={name}\n hideDownload={hideDownload}\n hideQueryCount={hideQueryCount}\n hideFacetFilterControl={!isFaceted}\n hideVisualizationsControl={\n !isFaceted || hideVisualizationsControl\n }\n hideSqlEditorControl={hideSqlEditorControl}\n cavaticaConnectAccountURL={cavaticaConnectAccountURL}\n remount={remount}\n customControls={customControls}\n />\n </SynapseErrorBoundary>\n )}\n {isFaceted && (\n <>\n <FacetFilterControls\n availableFacets={availableFacets}\n initialExpandedFacetControls={initialExpandedFacetControls}\n />\n </>\n )}\n <TotalQueryResults\n frontText={''}\n endText={hasFacetsOrFilters ? 'filtered by' : ''}\n hideIfUnfiltered={true}\n />\n <CustomControls\n customControls={customControls}\n remount={remount}\n />\n <PlotsContainer\n facetsToPlot={facetsToPlot}\n customPlots={customPlots}\n initialPlotTypeByFacetColumnName={\n initialPlotTypeByFacetColumnName\n }\n />\n <RowSetView\n tableConfiguration={tableConfiguration}\n hideDownload={hideDownload}\n cardConfiguration={cardConfiguration}\n initialLimit={initialLimit}\n />\n {showExportMetadata && (\n <ModalDownload\n getLastQueryRequest={queryContext?.getCurrentQueryRequest}\n onClose={() => setShowExportMetadata(false)}\n />\n )}\n </QueryWrapperErrorBoundary>\n </Box>\n )\n }}\n </QueryVisualizationContextConsumer>\n )\n}\n\nexport default function QueryWrapperPlotNav(props: QueryWrapperPlotNavProps) {\n const {\n sql: deprecatedSql,\n tableConfiguration,\n isInfinite = !tableConfiguration,\n limit = DEFAULT_PAGE_SIZE,\n showLastUpdatedOn,\n unitDescription,\n additionalFiltersSessionStorageKey,\n helpConfiguration,\n customPlots,\n enabledExternalAnalysisPlatforms,\n } = props\n\n const sql = props.query?.sql ?? deprecatedSql ?? ''\n const { entityId, versionNumber } =\n parseEntityIdAndVersionFromSqlStatement(sql)\n\n const query: Query = useMemo(() => {\n if (props.query) {\n // use query if set\n return props.query\n } else if (props.initQueryJson) {\n // Otherwise use initQueryJson\n return JSON.parse(props.initQueryJson) as Query\n } else {\n // use the deprecated sql, searchParams, and sqlOperator\n const additionalFilters = getAdditionalFilters(\n props.searchParams,\n props.sqlOperator,\n additionalFiltersSessionStorageKey,\n )\n return {\n sql: deprecatedSql!,\n additionalFilters,\n limit: limit,\n offset: 0,\n }\n }\n }, [\n props.query,\n props.initQueryJson,\n props.searchParams,\n props.sqlOperator,\n additionalFiltersSessionStorageKey,\n deprecatedSql,\n limit,\n ])\n\n const [componentKey, setComponentKey] = useState(1)\n const remount = () => {\n setComponentKey(componentKey + 1)\n }\n\n const { data: entity } = useGetEntity(entityId, versionNumber)\n const initQueryRequest: QueryBundleRequest = {\n entityId: entityId ?? '',\n concreteType: 'org.sagebionetworks.repo.model.table.QueryBundleRequest',\n partMask:\n SynapseConstants.BUNDLE_MASK_QUERY_RESULTS |\n SynapseConstants.BUNDLE_MASK_QUERY_COUNT |\n SynapseConstants.BUNDLE_MASK_QUERY_SELECT_COLUMNS |\n SynapseConstants.BUNDLE_MASK_QUERY_MAX_ROWS_PER_PAGE |\n SynapseConstants.BUNDLE_MASK_QUERY_COLUMN_MODELS |\n SynapseConstants.BUNDLE_MASK_QUERY_FACETS |\n SynapseConstants.BUNDLE_MASK_SUM_FILES_SIZE_BYTES |\n SynapseConstants.BUNDLE_MASK_LAST_UPDATED_ON,\n query,\n }\n const isFullTextSearchEnabled =\n (entity && isTable(entity) && entity.isSearchEnabled) ?? false\n\n /**\n * Fully re-render the uncontrolled QueryWrapper component when the initial query changes. This eliminates a class of\n * bugs where our 'derived' state (the current query), which should be reset, is out of sync with props.\n *\n * See https://legacy.reactjs.org/blog/2018/06/07/you-probably-dont-need-derived-state.html#recommendation-fully-uncontrolled-component-with-a-key\n */\n const queryWrapperKey = `${JSON.stringify(initQueryRequest)}-${componentKey}`\n\n return (\n <QueryWrapper\n {...props}\n initQueryRequest={initQueryRequest}\n key={queryWrapperKey}\n isInfinite={isInfinite}\n >\n <Suspense fallback={<QueryWrapperLoadingScreen />}>\n <QueryVisualizationWrapper\n unitDescription={unitDescription}\n rgbIndex={props.rgbIndex}\n columnAliases={props.columnAliases}\n helpConfiguration={helpConfiguration}\n visibleColumnCount={props.visibleColumnCount}\n defaultShowPlots={props.defaultShowPlots}\n hideCopyToClipboard={props.hideCopyToClipboard}\n defaultShowSearchBar={\n (props.defaultShowSearchBox || isFullTextSearchEnabled) &&\n !props.hideSearchBarControl\n }\n hideSearchBarControl={props.hideSearchBarControl}\n showLastUpdatedOn={showLastUpdatedOn}\n noContentPlaceholderType={NoContentPlaceholderType.INTERACTIVE}\n hasCustomPlots={Array.isArray(customPlots) && customPlots.length > 0}\n enabledExternalAnalysisPlatforms={enabledExternalAnalysisPlatforms}\n >\n <QueryWrapperPlotNavContents\n {...props}\n isFullTextSearchEnabled={isFullTextSearchEnabled}\n remount={remount}\n />\n </QueryVisualizationWrapper>\n </Suspense>\n </QueryWrapper>\n )\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAkDA,IAAa,IAAqC,yBACrC,IAAsC,wBAEtC,IAAgC;AA2F7C,SAAS,EAA4B,GAAyC;CAC5E,IAAM,EACJ,uBACA,SACA,sBACA,iBACA,oBACA,iCACA,iBACA,mBACA,yBACA,8BACA,wBACA,8BACA,mBACA,YACA,4BACA,gBACA,kBACA,qCACA,4BACE,GACE,IAAe,GAAiB,EAChC,CAAC,GAAoB,KAAyB,EAAS,GAAM,EAC7D,EAAE,wBAAwB,GAAW,iCACzC,GACI,EAAE,WAAW,MAA2B,EAC5C,EACD,EAEK,IAAwB,EAAa,EAA0B,EAE/D,IAAsB,EAAa,qBAEnC,KACH,GAAqB,MAAM,mBAAmB,KAAA,KAC7C,EAAoB,MAAM,eAAe,SAAS,KACnD,GAAqB,MAAM,sBAAsB,KAAA,KAChD,GAAqB,MAAM,kBAAkB,SAAS,GAEpD,KACJ,GAA+C;AAEjD,QACE,kBAAC,GAAD,EAAA,WACG,MAA6B;AAC5B,MAAI,MAA8B,KAAA,EAChC,OAAU,MACR,kFACD;AAGH,SACE,kBAAC,GAAD;GACE,WAAW,uBACT,EAA0B,kBACtB,IACA,EACL,GAAG,IAAwB,IAAwB,GAAG,GACrD,IAAuB,6BAA6B;GAEtD,IAAI,EACF,KAAK,EACH,QAAQ,IAAyB,SAAS,KAAA,GAC3C,EACF;aAED,kBAAC,GAAD,EAAA,UAAA;IACG,IACC,kBAAC,GAAD,EAAgB,WAAW,GAAqB,WAAa,CAAA,GAE7D,kBAAC,GAAD;KACE,GAAI;KACU;KACa;KAC3B,CAAA;IAEJ,kBAAC,GAAD,EAAa,CAAA;IACZ,EAA0B,4BACzB,kBAAC,GAAD;KAC4B;KAC1B,eACE,EAA0B,4BAA4B,GAAM;KAE9D,CAAA;IAEH,CAAC,KACA,kBAAC,GAAD,EAAA,UACE,kBAAC,GAAD;KACE,qBAAqB,MAAuB,KAAA;KACtC;KACQ;KACE;KAChB,wBAAwB,CAAC;KACzB,2BACE,CAAC,KAAa;KAEM;KACK;KAClB;KACO;KAChB,CAAA,EACmB,CAAA;IAExB,KACC,kBAAA,GAAA,EAAA,UACE,kBAAC,GAAD;KACmB;KACa;KAC9B,CAAA,EACD,CAAA;IAEL,kBAAC,GAAD;KACE,WAAW;KACX,SAAS,KAAqB,gBAAgB;KAC9C,kBAAkB;KAClB,CAAA;IACF,kBAAC,GAAD;KACkB;KACP;KACT,CAAA;IACF,kBAAC,GAAD;KACgB;KACD;KAEX;KAEF,CAAA;IACF,kBAAC,GAAD;KACsB;KACN;KACK;KACL;KACd,CAAA;IACD,KACC,kBAAC,GAAD;KACE,qBAAqB,GAAc;KACnC,eAAe,EAAsB,GAAM;KAC3C,CAAA;IAEsB,EAAA,CAAA;GACxB,CAAA;IAGwB,CAAA;;AAIxC,SAAwB,EAAoB,GAAiC;CAC3E,IAAM,EACJ,KAAK,GACL,uBACA,gBAAa,CAAC,GACd,WAAA,IACA,sBACA,oBACA,uCACA,sBACA,gBACA,wCACE,GAGE,EAAE,aAAU,qBAChB,EAFU,EAAM,OAAO,OAAO,KAAiB,GAEH,EAExC,IAAe,QACf,EAAM,QAED,EAAM,QACJ,EAAM,gBAER,KAAK,MAAM,EAAM,cAAc,GAQ/B;EACL,KAAK;EACL,mBAPwB,EACxB,EAAM,cACN,EAAM,aACN,EAIA;EACO;EACP,QAAQ;EACT,EAEF;EACD,EAAM;EACN,EAAM;EACN,EAAM;EACN,EAAM;EACN;EACA;EACA;EACD,CAAC,EAEI,CAAC,GAAc,KAAmB,EAAS,EAAE,EAC7C,UAAgB;AACpB,IAAgB,IAAe,EAAE;IAG7B,EAAE,MAAM,MAAW,EAAa,GAAU,EAAc,EACxD,IAAuC;EAC3C,UAAU,KAAY;EACtB,cAAc;EACd,UACE;EAQF;EACD,EACK,KACH,KAAU,EAAQ,EAAO,IAAI,EAAO,oBAAoB,IAQrD,IAAkB,GAAG,KAAK,UAAU,EAAiB,CAAC,GAAG;AAE/D,QACE,kBAAC,GAAD;EACE,GAAI;EACc;EAClB,KAAK;EACO;EA4BC,EA1Bb,kBAAC,GAAD;EAAU,UAAU,kBAAC,GAAD,EAA6B,CAAA;YAC/C,kBAAC,GAAD;GACmB;GACjB,UAAU,EAAM;GAChB,eAAe,EAAM;GACF;GACnB,oBAAoB,EAAM;GAC1B,kBAAkB,EAAM;GACxB,qBAAqB,EAAM;GAC3B,uBACG,EAAM,wBAAwB,MAC/B,CAAC,EAAM;GAET,sBAAsB,EAAM;GACT;GACnB,0BAA0B,EAAyB;GACnD,gBAAgB,MAAM,QAAQ,EAAY,IAAI,EAAY,SAAS;GACjC;aAElC,kBAAC,GAAD;IACE,GAAI;IACqB;IAChB;IACT,CAAA;GACwB,CAAA;EACnB,CAAA,CACE"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"UseRowSet.js","names":[],"sources":["../../../src/components/QueryWrapperPlotNav/UseRowSet.ts"],"sourcesContent":["import { queryRequestsHaveSameTotalResults } from '@/utils/functions/queryUtils'\nimport { RowSet } from '@sage-bionetworks/synapse-types'\nimport { useInfiniteQuery, useQuery } from '@tanstack/react-query'\nimport { cloneDeep } from 'lodash-es'\nimport { useMemo } from 'react'\nimport { useQueryContext } from '../QueryContext'\n\nfunction useGetInfiniteRowSet() {\n const { isInfinite, rowDataInfiniteQueryOptions } = useQueryContext()\n const infiniteQuery = useInfiniteQuery({\n ...rowDataInfiniteQueryOptions,\n enabled: isInfinite,\n })\n\n const infiniteQueryProgressMessage = useInfiniteQuery({\n ...rowDataInfiniteQueryOptions,\n select: asyncJob => asyncJob.pages[0].progressMessage,\n enabled: isInfinite,\n })\n\n const infiniteQueryRowSet: RowSet | undefined = useMemo(() => {\n const rowSet = cloneDeep(\n infiniteQuery.data?.pages[0]?.responseBody?.queryResult?.queryResults,\n )\n if (rowSet) {\n rowSet.rows =\n infiniteQuery.data?.pages.flatMap(\n page => page.responseBody?.queryResult?.queryResults.rows || [],\n ) || []\n }\n return rowSet\n }, [infiniteQuery.data?.pages])\n\n return {\n infiniteQuery,\n infiniteQueryRowSet,\n infiniteQueryProgressMessage,\n }\n}\n\nfunction useGetPaginatedRowSet() {\n const { isInfinite, rowDataQueryOptions, getCurrentQueryRequest } =\n useQueryContext()\n const paginatedQuery = useQuery({\n ...rowDataQueryOptions,\n enabled: !isInfinite,\n // Keep the previous data when fetching a new page. We will use `UseQueryResult.isPlaceholderData` to trigger a showing placeholder UI\n placeholderData: prevData => {\n if (prevData) {\n // Check that only the page/sort changed; if the filters/sql changed, then don't hold on to the old data\n if (\n queryRequestsHaveSameTotalResults(\n prevData.requestBody.query,\n getCurrentQueryRequest().query,\n )\n ) {\n return prevData\n }\n }\n return undefined\n },\n })\n const paginatedQueryProgressMessage = useQuery({\n ...rowDataQueryOptions,\n select: asyncJob => asyncJob.progressMessage,\n enabled: !isInfinite,\n // Keep the previous data when fetching a new page. We will use `isPlaceholderData` to trigger a showing placeholder UI\n placeholderData: prevData => prevData,\n })\n\n return { paginatedQuery, paginatedQueryProgressMessage }\n}\n\n/**\n * Fetches the row data for a query and returns a RowSet that can be rendered as cards or a table. Respects the value of\n * QueryContext.isInfinite.\n * @param initialLimit\n */\nexport function useRowSet(initialLimit?: number) {\n const { isInfinite } = useQueryContext()\n\n const { paginatedQuery, paginatedQueryProgressMessage } =\n useGetPaginatedRowSet()\n const { infiniteQuery, infiniteQueryRowSet, infiniteQueryProgressMessage } =\n useGetInfiniteRowSet()\n\n const rowSet = useMemo(() => {\n let rowSet: RowSet | undefined\n if (isInfinite) {\n rowSet = infiniteQueryRowSet\n } else {\n rowSet = paginatedQuery.data\n }\n if (rowSet && initialLimit != null) {\n rowSet = { ...rowSet, rows: rowSet.rows.slice(0, initialLimit) }\n }\n return rowSet\n }, [infiniteQueryRowSet, initialLimit, isInfinite, paginatedQuery.data])\n\n const progressMessage: string | undefined = isInfinite\n ? infiniteQueryProgressMessage.data\n : paginatedQueryProgressMessage.data\n\n const isLoading = isInfinite\n ? infiniteQuery.isLoading\n : paginatedQuery.isLoading\n\n const isLoadingNewPage = isInfinite\n ? infiniteQuery.isFetchingNextPage\n : paginatedQuery.isPlaceholderData\n\n return {\n rowSet,\n progressMessage,\n isLoading,\n isLoadingNewPage,\n fetchNextPageOfInfiniteData: infiniteQuery.fetchNextPage,\n hasNextPageOfInfiniteData: infiniteQuery.hasNextPage,\n }\n}\n"],"mappings":";;;;;;;AAOA,SAAS,IAAuB;CAC9B,IAAM,EAAE,eAAY,mCAAgC,GAAiB,EAC/D,IAAgB,EAAiB;EACrC,GAAG;EACH,SAAS;EACV,CAAC,EAEI,IAA+B,EAAiB;EACpD,GAAG;EACH,SAAQ,MAAY,EAAS,MAAM,GAAG;EACtC,SAAS;EACV,CAAC;AAeF,QAAO;EACL;EACA,qBAf8C,QAAc;GAC5D,IAAM,IAAS,EACb,EAAc,MAAM,MAAM,IAAI,cAAc,aAAa,aAC1D;AAOD,UANI,MACF,EAAO,OACL,EAAc,MAAM,MAAM,SACxB,MAAQ,EAAK,cAAc,aAAa,aAAa,QAAQ,EAAE,CAChE,IAAI,EAAE,GAEJ;KACN,CAAC,EAAc,MAAM,MAAM,
|
|
1
|
+
{"version":3,"file":"UseRowSet.js","names":[],"sources":["../../../src/components/QueryWrapperPlotNav/UseRowSet.ts"],"sourcesContent":["import { queryRequestsHaveSameTotalResults } from '@/utils/functions/queryUtils'\nimport { RowSet } from '@sage-bionetworks/synapse-types'\nimport { useInfiniteQuery, useQuery } from '@tanstack/react-query'\nimport { cloneDeep } from 'lodash-es'\nimport { useMemo } from 'react'\nimport { useQueryContext } from '../QueryContext'\n\nfunction useGetInfiniteRowSet() {\n const { isInfinite, rowDataInfiniteQueryOptions } = useQueryContext()\n const infiniteQuery = useInfiniteQuery({\n ...rowDataInfiniteQueryOptions,\n enabled: isInfinite,\n })\n\n const infiniteQueryProgressMessage = useInfiniteQuery({\n ...rowDataInfiniteQueryOptions,\n select: asyncJob => asyncJob.pages[0].progressMessage,\n enabled: isInfinite,\n })\n\n const infiniteQueryRowSet: RowSet | undefined = useMemo(() => {\n const rowSet = cloneDeep(\n infiniteQuery.data?.pages[0]?.responseBody?.queryResult?.queryResults,\n )\n if (rowSet) {\n rowSet.rows =\n infiniteQuery.data?.pages.flatMap(\n page => page.responseBody?.queryResult?.queryResults.rows || [],\n ) || []\n }\n return rowSet\n }, [infiniteQuery.data?.pages])\n\n return {\n infiniteQuery,\n infiniteQueryRowSet,\n infiniteQueryProgressMessage,\n }\n}\n\nfunction useGetPaginatedRowSet() {\n const { isInfinite, rowDataQueryOptions, getCurrentQueryRequest } =\n useQueryContext()\n const paginatedQuery = useQuery({\n ...rowDataQueryOptions,\n enabled: !isInfinite,\n // Keep the previous data when fetching a new page. We will use `UseQueryResult.isPlaceholderData` to trigger a showing placeholder UI\n placeholderData: prevData => {\n if (prevData) {\n // Check that only the page/sort changed; if the filters/sql changed, then don't hold on to the old data\n if (\n queryRequestsHaveSameTotalResults(\n prevData.requestBody.query,\n getCurrentQueryRequest().query,\n )\n ) {\n return prevData\n }\n }\n return undefined\n },\n })\n const paginatedQueryProgressMessage = useQuery({\n ...rowDataQueryOptions,\n select: asyncJob => asyncJob.progressMessage,\n enabled: !isInfinite,\n // Keep the previous data when fetching a new page. We will use `isPlaceholderData` to trigger a showing placeholder UI\n placeholderData: prevData => prevData,\n })\n\n return { paginatedQuery, paginatedQueryProgressMessage }\n}\n\n/**\n * Fetches the row data for a query and returns a RowSet that can be rendered as cards or a table. Respects the value of\n * QueryContext.isInfinite.\n * @param initialLimit\n */\nexport function useRowSet(initialLimit?: number) {\n const { isInfinite } = useQueryContext()\n\n const { paginatedQuery, paginatedQueryProgressMessage } =\n useGetPaginatedRowSet()\n const { infiniteQuery, infiniteQueryRowSet, infiniteQueryProgressMessage } =\n useGetInfiniteRowSet()\n\n const rowSet = useMemo(() => {\n let rowSet: RowSet | undefined\n if (isInfinite) {\n rowSet = infiniteQueryRowSet\n } else {\n rowSet = paginatedQuery.data\n }\n if (rowSet && initialLimit != null) {\n rowSet = { ...rowSet, rows: rowSet.rows.slice(0, initialLimit) }\n }\n return rowSet\n }, [infiniteQueryRowSet, initialLimit, isInfinite, paginatedQuery.data])\n\n const progressMessage: string | undefined = isInfinite\n ? infiniteQueryProgressMessage.data\n : paginatedQueryProgressMessage.data\n\n const isLoading = isInfinite\n ? infiniteQuery.isLoading\n : paginatedQuery.isLoading\n\n const isLoadingNewPage = isInfinite\n ? infiniteQuery.isFetchingNextPage\n : paginatedQuery.isPlaceholderData\n\n return {\n rowSet,\n progressMessage,\n isLoading,\n isLoadingNewPage,\n fetchNextPageOfInfiniteData: infiniteQuery.fetchNextPage,\n hasNextPageOfInfiniteData: infiniteQuery.hasNextPage,\n }\n}\n"],"mappings":";;;;;;;AAOA,SAAS,IAAuB;CAC9B,IAAM,EAAE,eAAY,mCAAgC,GAAiB,EAC/D,IAAgB,EAAiB;EACrC,GAAG;EACH,SAAS;EACV,CAAC,EAEI,IAA+B,EAAiB;EACpD,GAAG;EACH,SAAQ,MAAY,EAAS,MAAM,GAAG;EACtC,SAAS;EACV,CAAC;AAeF,QAAO;EACL;EACA,qBAf8C,QAAc;GAC5D,IAAM,IAAS,EACb,EAAc,MAAM,MAAM,IAAI,cAAc,aAAa,aAC1D;AAOD,UANI,MACF,EAAO,OACL,EAAc,MAAM,MAAM,SACxB,MAAQ,EAAK,cAAc,aAAa,aAAa,QAAQ,EAAE,CAChE,IAAI,EAAE,GAEJ;KACN,CAAC,EAAc,MAAM,MAAM,CAI5B;EACA;EACD;;AAGH,SAAS,IAAwB;CAC/B,IAAM,EAAE,eAAY,wBAAqB,8BACvC,GAAiB;AA4BnB,QAAO;EAAE,gBA3Bc,EAAS;GAC9B,GAAG;GACH,SAAS,CAAC;GAEV,kBAAiB,MAAY;AAC3B,QAAI,KAGA,EACE,EAAS,YAAY,OACrB,GAAwB,CAAC,MAC1B,CAED,QAAO;;GAKd,CASQ;EAAgB,+BARa,EAAS;GAC7C,GAAG;GACH,SAAQ,MAAY,EAAS;GAC7B,SAAS,CAAC;GAEV,kBAAiB,MAAY;GAC9B,CAEwB;EAA+B;;AAQ1D,SAAgB,EAAU,GAAuB;CAC/C,IAAM,EAAE,kBAAe,GAAiB,EAElC,EAAE,mBAAgB,qCACtB,GAAuB,EACnB,EAAE,kBAAe,wBAAqB,oCAC1C,GAAsB;AA2BxB,QAAO;EACL,QA1Ba,QAAc;GAC3B,IAAI;AASJ,UARA,AAGE,IAHE,IACO,IAEA,EAAe,MAEtB,KAAU,KAAgB,SAC5B,IAAS;IAAE,GAAG;IAAQ,MAAM,EAAO,KAAK,MAAM,GAAG,EAAa;IAAE,GAE3D;KACN;GAAC;GAAqB;GAAc;GAAY,EAAe;GAAK,CAerE;EACA,iBAd0C,IACxC,EAA6B,OAC7B,EAA8B;EAahC,WAXgB,IACd,EAAc,YACd,EAAe;EAUjB,kBARuB,IACrB,EAAc,qBACd,EAAe;EAOjB,6BAA6B,EAAc;EAC3C,2BAA2B,EAAc;EAC1C"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RecentPublicationsGrid.js","names":[],"sources":["../../../src/components/RecentPublicationsGrid/RecentPublicationsGrid.tsx"],"sourcesContent":["import React from 'react'\nimport useGetQueryResultBundle from '@/synapse-queries/entity/useGetQueryResultBundle'\nimport { formatDate } from '@/utils/functions/DateFormatter'\nimport { parseEntityIdFromSqlStatement } from '@/utils/functions/index'\nimport { getFieldIndex } from '@/utils/functions/queryUtils'\nimport { convertDoiToLink } from '@/utils/functions/RegularExpressions'\nimport {\n BUNDLE_MASK_QUERY_RESULTS,\n BUNDLE_MASK_QUERY_SELECT_COLUMNS,\n} from '@/utils/SynapseConstants'\nimport { Box, Chip, Link as MuiLink, Skeleton, Typography } from '@mui/material'\nimport Grid from '@mui/material/Grid'\nimport { QueryBundleRequest, Row } from '@sage-bionetworks/synapse-types'\nimport dayjs from 'dayjs'\nimport PortalSectionHeader from '../PortalSectionHeader'\n\nexport type RecentPublicationsGridProps = {\n sql: string\n buttonLink?: string\n buttonLinkText?: string\n summaryText?: string\n}\n\ntype PublicationCardProps = {\n pub: Row\n isLoading: boolean\n categoryColIndex: number\n titleColIndex: number\n journalColIndex: number\n publicationDateColIndex: number\n doiColIndex: number\n}\n\nconst PublicationCard = ({\n pub,\n isLoading,\n categoryColIndex: _categoryColIndex, // PORTALS-3426 - category was dropped\n titleColIndex,\n journalColIndex,\n publicationDateColIndex,\n doiColIndex,\n}: PublicationCardProps): React.ReactNode => (\n <Grid\n key={pub.rowId}\n sx={{\n height: { xs: 'auto', sm: 'initial' },\n minWidth: { xs: '280px', lg: 'initial' },\n maxWidth: { xs: '450px', lg: 'initial' },\n }}\n >\n <Box sx={{ height: '100%' }}>\n {isLoading ? (\n <Skeleton variant=\"rectangular\" height={275} width=\"100%\" />\n ) : (\n <div>\n {pub.values[journalColIndex] && (\n <Chip\n label={\n <Typography\n variant={'overline'}\n sx={{ fontSize: '14px', lineHeight: 'initial' }}\n >\n {pub.values[journalColIndex]}\n </Typography>\n }\n sx={{\n borderRadius: '3px',\n height: 'auto',\n padding: '4px 8px',\n '& .MuiChip-label': {\n padding: '0',\n display: 'block',\n whiteSpace: 'normal',\n },\n }}\n />\n )}\n <Typography\n variant=\"headline2\"\n sx={{\n color: 'grey.1000',\n fontSize: '21px',\n padding: '20px 0px',\n }}\n >\n <MuiLink\n href={convertDoiToLink(pub.values[doiColIndex] || '')}\n target=\"_blank\"\n sx={{\n color: 'inherit',\n textDecoration: 'none',\n fontWeight: 'inherit',\n '&:hover': {\n textDecoration: 'none',\n },\n }}\n >\n {pub.values[titleColIndex]}\n </MuiLink>\n </Typography>\n <Box\n sx={{\n display: 'flex',\n gap: '8px',\n flexDirection: 'column',\n }}\n >\n <Typography\n variant=\"body1\"\n sx={{\n color: 'grey.700',\n fontSize: '14px',\n lineHeight: 1.35,\n paddingBottom: { xs: 0, md: '35px' },\n }}\n >\n {pub.values[publicationDateColIndex] &&\n formatDate(\n dayjs(Number(pub.values[publicationDateColIndex])),\n 'MMMM, YYYY',\n )}\n </Typography>\n </Box>\n </div>\n )}\n </Box>\n </Grid>\n)\n\nfunction RecentPublicationsGrid(props: RecentPublicationsGridProps) {\n const { sql, buttonLink, buttonLinkText, summaryText } = props\n\n const entityId = parseEntityIdFromSqlStatement(sql)\n\n const queryBundleRequest: QueryBundleRequest = {\n partMask: BUNDLE_MASK_QUERY_SELECT_COLUMNS | BUNDLE_MASK_QUERY_RESULTS,\n concreteType: 'org.sagebionetworks.repo.model.table.QueryBundleRequest',\n entityId,\n query: {\n sql,\n },\n }\n const { data: queryResultBundle, isLoading } =\n useGetQueryResultBundle(queryBundleRequest)\n\n const dataRows = queryResultBundle?.queryResult!.queryResults.rows ?? []\n\n enum ExpectedColumns {\n CATEGORY = 'Category',\n JOURNAL = 'Journal',\n TITLE = 'Title',\n PUBLICATION_DATE = 'publicationDate',\n DOI = 'DOI',\n }\n\n const categoryColIndex = getFieldIndex(\n ExpectedColumns.CATEGORY,\n queryResultBundle,\n )\n const journalColIndex = getFieldIndex(\n ExpectedColumns.JOURNAL,\n queryResultBundle,\n )\n const titleColIndex = getFieldIndex(ExpectedColumns.TITLE, queryResultBundle)\n const publicationDateColIndex = getFieldIndex(\n ExpectedColumns.PUBLICATION_DATE,\n queryResultBundle,\n )\n const doiColIndex = getFieldIndex(ExpectedColumns.DOI, queryResultBundle)\n\n return (\n <Box\n sx={{\n display: 'grid',\n gridTemplateColumns: { xs: '1fr', md: '3fr 1fr' },\n height: { xs: 'auto', md: 'initial' },\n gap: { xs: '24px', md: '80px' },\n padding: { xs: '40px', lg: '80px' },\n }}\n >\n <Box\n sx={{\n order: { xs: 1, md: 0 },\n }}\n >\n <Box\n sx={theme => ({\n display: 'grid',\n gap: '32px',\n gridTemplateColumns: {\n xs: '1fr',\n sm: 'repeat(auto-fill, minmax(280px, 1fr))',\n lg: 'repeat(auto-fill, minmax(255px, 1fr))',\n xl: 'repeat(auto-fill, minmax(322px, 1fr))',\n },\n [theme.breakpoints.down('sm')]: {\n '& > :nth-of-type(n+4)': {\n display: 'none',\n },\n },\n })}\n >\n {dataRows.map(pub => (\n <PublicationCard\n pub={pub}\n key={pub.rowId}\n isLoading={isLoading}\n categoryColIndex={categoryColIndex}\n titleColIndex={titleColIndex}\n journalColIndex={journalColIndex}\n publicationDateColIndex={publicationDateColIndex}\n doiColIndex={doiColIndex}\n />\n ))}\n </Box>\n </Box>\n <Box sx={{ paddingBottom: '30px' }}>\n <PortalSectionHeader\n title=\"Recently Published\"\n summaryText={summaryText}\n buttonText={buttonLinkText}\n link={buttonLink}\n reverseButtonAndText\n sx={{\n h2: { fontSize: '24px', paddingTop: '30px', width: '100%' },\n '& p': { fontSize: '16px', lineHeight: '24px' },\n }}\n />\n </Box>\n </Box>\n )\n}\n\nexport default RecentPublicationsGrid\n"],"mappings":";;;;;;;;;;;;;;AAiCA,IAAM,KAAmB,EACvB,QACA,cACA,kBAAkB,GAClB,kBACA,oBACA,4BACA,qBAEA,kBAAC,GAAD;CAEE,IAAI;EACF,QAAQ;GAAE,IAAI;GAAQ,IAAI;GAAW;EACrC,UAAU;GAAE,IAAI;GAAS,IAAI;GAAW;EACxC,UAAU;GAAE,IAAI;GAAS,IAAI;GAAW;EACzC;WAED,kBAAC,GAAD;EAAK,IAAI,EAAE,QAAQ,QAAQ;YACxB,IACC,kBAAC,GAAD;GAAU,SAAQ;GAAc,QAAQ;GAAK,OAAM;GAAS,CAAA,GAE5D,kBAAC,OAAD,EAAA,UAAA;GACG,EAAI,OAAO,MACV,kBAAC,GAAD;IACE,OACE,kBAAC,GAAD;KACE,SAAS;KACT,IAAI;MAAE,UAAU;MAAQ,YAAY;MAAW;eAE9C,EAAI,OAAO;KACD,CAAA;IAEf,IAAI;KACF,cAAc;KACd,QAAQ;KACR,SAAS;KACT,oBAAoB;MAClB,SAAS;MACT,SAAS;MACT,YAAY;MACb;KACF;IACD,CAAA;GAEJ,kBAAC,GAAD;IACE,SAAQ;IACR,IAAI;KACF,OAAO;KACP,UAAU;KACV,SAAS;KACV;cAED,kBAAC,GAAD;KACE,MAAM,EAAiB,EAAI,OAAO,MAAgB,GAAG;KACrD,QAAO;KACP,IAAI;MACF,OAAO;MACP,gBAAgB;MAChB,YAAY;MACZ,WAAW,EACT,gBAAgB,QACjB;MACF;eAEA,EAAI,OAAO;KACJ,CAAA;IACC,CAAA;GACb,kBAAC,GAAD;IACE,IAAI;KACF,SAAS;KACT,KAAK;KACL,eAAe;KAChB;cAED,kBAAC,GAAD;KACE,SAAQ;KACR,IAAI;MACF,OAAO;MACP,UAAU;MACV,YAAY;MACZ,eAAe;OAAE,IAAI;OAAG,IAAI;OAAQ;MACrC;eAEA,EAAI,OAAO,MACV,EACE,EAAM,OAAO,EAAI,OAAO,GAAyB,CAAC,EAClD,aACD;KACQ,CAAA;IACT,CAAA;GACF,EAAA,CAAA;EAEJ,CAAA;CACD,EAnFA,EAAI,MAmFJ;AAGT,SAAS,EAAuB,GAAoC;CAClE,IAAM,EAAE,QAAK,eAAY,mBAAgB,mBAAgB,GAYnD,EAAE,MAAM,GAAmB,iBAC/B,
|
|
1
|
+
{"version":3,"file":"RecentPublicationsGrid.js","names":[],"sources":["../../../src/components/RecentPublicationsGrid/RecentPublicationsGrid.tsx"],"sourcesContent":["import React from 'react'\nimport useGetQueryResultBundle from '@/synapse-queries/entity/useGetQueryResultBundle'\nimport { formatDate } from '@/utils/functions/DateFormatter'\nimport { parseEntityIdFromSqlStatement } from '@/utils/functions/index'\nimport { getFieldIndex } from '@/utils/functions/queryUtils'\nimport { convertDoiToLink } from '@/utils/functions/RegularExpressions'\nimport {\n BUNDLE_MASK_QUERY_RESULTS,\n BUNDLE_MASK_QUERY_SELECT_COLUMNS,\n} from '@/utils/SynapseConstants'\nimport { Box, Chip, Link as MuiLink, Skeleton, Typography } from '@mui/material'\nimport Grid from '@mui/material/Grid'\nimport { QueryBundleRequest, Row } from '@sage-bionetworks/synapse-types'\nimport dayjs from 'dayjs'\nimport PortalSectionHeader from '../PortalSectionHeader'\n\nexport type RecentPublicationsGridProps = {\n sql: string\n buttonLink?: string\n buttonLinkText?: string\n summaryText?: string\n}\n\ntype PublicationCardProps = {\n pub: Row\n isLoading: boolean\n categoryColIndex: number\n titleColIndex: number\n journalColIndex: number\n publicationDateColIndex: number\n doiColIndex: number\n}\n\nconst PublicationCard = ({\n pub,\n isLoading,\n categoryColIndex: _categoryColIndex, // PORTALS-3426 - category was dropped\n titleColIndex,\n journalColIndex,\n publicationDateColIndex,\n doiColIndex,\n}: PublicationCardProps): React.ReactNode => (\n <Grid\n key={pub.rowId}\n sx={{\n height: { xs: 'auto', sm: 'initial' },\n minWidth: { xs: '280px', lg: 'initial' },\n maxWidth: { xs: '450px', lg: 'initial' },\n }}\n >\n <Box sx={{ height: '100%' }}>\n {isLoading ? (\n <Skeleton variant=\"rectangular\" height={275} width=\"100%\" />\n ) : (\n <div>\n {pub.values[journalColIndex] && (\n <Chip\n label={\n <Typography\n variant={'overline'}\n sx={{ fontSize: '14px', lineHeight: 'initial' }}\n >\n {pub.values[journalColIndex]}\n </Typography>\n }\n sx={{\n borderRadius: '3px',\n height: 'auto',\n padding: '4px 8px',\n '& .MuiChip-label': {\n padding: '0',\n display: 'block',\n whiteSpace: 'normal',\n },\n }}\n />\n )}\n <Typography\n variant=\"headline2\"\n sx={{\n color: 'grey.1000',\n fontSize: '21px',\n padding: '20px 0px',\n }}\n >\n <MuiLink\n href={convertDoiToLink(pub.values[doiColIndex] || '')}\n target=\"_blank\"\n sx={{\n color: 'inherit',\n textDecoration: 'none',\n fontWeight: 'inherit',\n '&:hover': {\n textDecoration: 'none',\n },\n }}\n >\n {pub.values[titleColIndex]}\n </MuiLink>\n </Typography>\n <Box\n sx={{\n display: 'flex',\n gap: '8px',\n flexDirection: 'column',\n }}\n >\n <Typography\n variant=\"body1\"\n sx={{\n color: 'grey.700',\n fontSize: '14px',\n lineHeight: 1.35,\n paddingBottom: { xs: 0, md: '35px' },\n }}\n >\n {pub.values[publicationDateColIndex] &&\n formatDate(\n dayjs(Number(pub.values[publicationDateColIndex])),\n 'MMMM, YYYY',\n )}\n </Typography>\n </Box>\n </div>\n )}\n </Box>\n </Grid>\n)\n\nfunction RecentPublicationsGrid(props: RecentPublicationsGridProps) {\n const { sql, buttonLink, buttonLinkText, summaryText } = props\n\n const entityId = parseEntityIdFromSqlStatement(sql)\n\n const queryBundleRequest: QueryBundleRequest = {\n partMask: BUNDLE_MASK_QUERY_SELECT_COLUMNS | BUNDLE_MASK_QUERY_RESULTS,\n concreteType: 'org.sagebionetworks.repo.model.table.QueryBundleRequest',\n entityId,\n query: {\n sql,\n },\n }\n const { data: queryResultBundle, isLoading } =\n useGetQueryResultBundle(queryBundleRequest)\n\n const dataRows = queryResultBundle?.queryResult!.queryResults.rows ?? []\n\n enum ExpectedColumns {\n CATEGORY = 'Category',\n JOURNAL = 'Journal',\n TITLE = 'Title',\n PUBLICATION_DATE = 'publicationDate',\n DOI = 'DOI',\n }\n\n const categoryColIndex = getFieldIndex(\n ExpectedColumns.CATEGORY,\n queryResultBundle,\n )\n const journalColIndex = getFieldIndex(\n ExpectedColumns.JOURNAL,\n queryResultBundle,\n )\n const titleColIndex = getFieldIndex(ExpectedColumns.TITLE, queryResultBundle)\n const publicationDateColIndex = getFieldIndex(\n ExpectedColumns.PUBLICATION_DATE,\n queryResultBundle,\n )\n const doiColIndex = getFieldIndex(ExpectedColumns.DOI, queryResultBundle)\n\n return (\n <Box\n sx={{\n display: 'grid',\n gridTemplateColumns: { xs: '1fr', md: '3fr 1fr' },\n height: { xs: 'auto', md: 'initial' },\n gap: { xs: '24px', md: '80px' },\n padding: { xs: '40px', lg: '80px' },\n }}\n >\n <Box\n sx={{\n order: { xs: 1, md: 0 },\n }}\n >\n <Box\n sx={theme => ({\n display: 'grid',\n gap: '32px',\n gridTemplateColumns: {\n xs: '1fr',\n sm: 'repeat(auto-fill, minmax(280px, 1fr))',\n lg: 'repeat(auto-fill, minmax(255px, 1fr))',\n xl: 'repeat(auto-fill, minmax(322px, 1fr))',\n },\n [theme.breakpoints.down('sm')]: {\n '& > :nth-of-type(n+4)': {\n display: 'none',\n },\n },\n })}\n >\n {dataRows.map(pub => (\n <PublicationCard\n pub={pub}\n key={pub.rowId}\n isLoading={isLoading}\n categoryColIndex={categoryColIndex}\n titleColIndex={titleColIndex}\n journalColIndex={journalColIndex}\n publicationDateColIndex={publicationDateColIndex}\n doiColIndex={doiColIndex}\n />\n ))}\n </Box>\n </Box>\n <Box sx={{ paddingBottom: '30px' }}>\n <PortalSectionHeader\n title=\"Recently Published\"\n summaryText={summaryText}\n buttonText={buttonLinkText}\n link={buttonLink}\n reverseButtonAndText\n sx={{\n h2: { fontSize: '24px', paddingTop: '30px', width: '100%' },\n '& p': { fontSize: '16px', lineHeight: '24px' },\n }}\n />\n </Box>\n </Box>\n )\n}\n\nexport default RecentPublicationsGrid\n"],"mappings":";;;;;;;;;;;;;;AAiCA,IAAM,KAAmB,EACvB,QACA,cACA,kBAAkB,GAClB,kBACA,oBACA,4BACA,qBAEA,kBAAC,GAAD;CAEE,IAAI;EACF,QAAQ;GAAE,IAAI;GAAQ,IAAI;GAAW;EACrC,UAAU;GAAE,IAAI;GAAS,IAAI;GAAW;EACxC,UAAU;GAAE,IAAI;GAAS,IAAI;GAAW;EACzC;WAED,kBAAC,GAAD;EAAK,IAAI,EAAE,QAAQ,QAAQ;YACxB,IACC,kBAAC,GAAD;GAAU,SAAQ;GAAc,QAAQ;GAAK,OAAM;GAAS,CAAA,GAE5D,kBAAC,OAAD,EAAA,UAAA;GACG,EAAI,OAAO,MACV,kBAAC,GAAD;IACE,OACE,kBAAC,GAAD;KACE,SAAS;KACT,IAAI;MAAE,UAAU;MAAQ,YAAY;MAAW;eAE9C,EAAI,OAAO;KACD,CAAA;IAEf,IAAI;KACF,cAAc;KACd,QAAQ;KACR,SAAS;KACT,oBAAoB;MAClB,SAAS;MACT,SAAS;MACT,YAAY;MACb;KACF;IACD,CAAA;GAEJ,kBAAC,GAAD;IACE,SAAQ;IACR,IAAI;KACF,OAAO;KACP,UAAU;KACV,SAAS;KACV;cAED,kBAAC,GAAD;KACE,MAAM,EAAiB,EAAI,OAAO,MAAgB,GAAG;KACrD,QAAO;KACP,IAAI;MACF,OAAO;MACP,gBAAgB;MAChB,YAAY;MACZ,WAAW,EACT,gBAAgB,QACjB;MACF;eAEA,EAAI,OAAO;KACJ,CAAA;IACC,CAAA;GACb,kBAAC,GAAD;IACE,IAAI;KACF,SAAS;KACT,KAAK;KACL,eAAe;KAChB;cAED,kBAAC,GAAD;KACE,SAAQ;KACR,IAAI;MACF,OAAO;MACP,UAAU;MACV,YAAY;MACZ,eAAe;OAAE,IAAI;OAAG,IAAI;OAAQ;MACrC;eAEA,EAAI,OAAO,MACV,EACE,EAAM,OAAO,EAAI,OAAO,GAAyB,CAAC,EAClD,aACD;KACQ,CAAA;IACT,CAAA;GACF,EAAA,CAAA;EAEJ,CAAA;CACD,EAnFA,EAAI,MAmFJ;AAGT,SAAS,EAAuB,GAAoC;CAClE,IAAM,EAAE,QAAK,eAAY,mBAAgB,mBAAgB,GAYnD,EAAE,MAAM,GAAmB,iBAC/B,EAAwB;EARxB,UAAA;EACA,cAAc;EACd,UALe,EAA8B,EAK7C;EACA,OAAO,EACL,QACD;EAGuB,CAAmB,EAEvC,IAAW,GAAmB,YAAa,aAAa,QAAQ,EAAE,EAEnE,IAAL,yBAAA,GAAA;SACE,EAAA,WAAW,YACX,EAAA,UAAU,WACV,EAAA,QAAQ,SACR,EAAA,mBAAmB,mBACnB,EAAA,MAAM;MACP,EAEK,IAAmB,EACvB,EAAgB,UAChB,EACD,EACK,IAAkB,EACtB,EAAgB,SAChB,EACD,EACK,IAAgB,EAAc,EAAgB,OAAO,EAAkB,EACvE,IAA0B,EAC9B,EAAgB,kBAChB,EACD,EACK,IAAc,EAAc,EAAgB,KAAK,EAAkB;AAEzE,QACE,kBAAC,GAAD;EACE,IAAI;GACF,SAAS;GACT,qBAAqB;IAAE,IAAI;IAAO,IAAI;IAAW;GACjD,QAAQ;IAAE,IAAI;IAAQ,IAAI;IAAW;GACrC,KAAK;IAAE,IAAI;IAAQ,IAAI;IAAQ;GAC/B,SAAS;IAAE,IAAI;IAAQ,IAAI;IAAQ;GACpC;YAPH,CASE,kBAAC,GAAD;GACE,IAAI,EACF,OAAO;IAAE,IAAI;IAAG,IAAI;IAAG,EACxB;aAED,kBAAC,GAAD;IACE,KAAI,OAAU;KACZ,SAAS;KACT,KAAK;KACL,qBAAqB;MACnB,IAAI;MACJ,IAAI;MACJ,IAAI;MACJ,IAAI;MACL;MACA,EAAM,YAAY,KAAK,KAAK,GAAG,EAC9B,yBAAyB,EACvB,SAAS,QACV,EACF;KACF;cAEA,EAAS,KAAI,MACZ,kBAAC,GAAD;KACO;KAEM;KACO;KACH;KACE;KACQ;KACZ;KACb,EAPK,EAAI,MAOT,CACF;IACE,CAAA;GACF,CAAA,EACN,kBAAC,GAAD;GAAK,IAAI,EAAE,eAAe,QAAQ;aAChC,kBAAC,GAAD;IACE,OAAM;IACO;IACb,YAAY;IACZ,MAAM;IACN,sBAAA;IACA,IAAI;KACF,IAAI;MAAE,UAAU;MAAQ,YAAY;MAAQ,OAAO;MAAQ;KAC3D,OAAO;MAAE,UAAU;MAAQ,YAAY;MAAQ;KAChD;IACD,CAAA;GACE,CAAA,CACF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ReleaseCardUtils.js","names":[],"sources":["../../../src/components/ReleaseCard/ReleaseCardUtils.ts"],"sourcesContent":["import { formatDate } from '@/utils/functions/DateFormatter'\nimport dayjs from 'dayjs'\nimport { generateEncodedPathAndQueryForSelectedFacetURL } from '../QueryWrapper'\nimport { SelectedFacet } from '../QueryWrapper/generateEncodedPathAndQueryForSelectedFacetURL'\nimport { ReleaseCardSchema } from './ReleaseCard'\nimport {\n ButtonToExplorePageConfig,\n ReleaseCardStat,\n ReleaseMetadataConfig,\n SelectedFacetConfig,\n StatConfig,\n} from './ReleaseCardTypes'\n\nconst MISSING_STAT_DEFAULT_VALUE = 'Unknown'\n\nconst formatNumber = (num: number) => {\n if (num < 1_000_000) return num.toLocaleString()\n const numberFormatter = new Intl.NumberFormat([], {\n minimumFractionDigits: 1,\n maximumFractionDigits: 2,\n notation: 'compact',\n localeMatcher: 'best fit',\n })\n return numberFormatter.format(num)\n}\n\nconst getValueFromData = (\n schema: ReleaseCardSchema,\n data: (string | null)[],\n columnName: string,\n) => {\n const columnIndex = schema[columnName]\n let columnValue\n if (columnIndex === undefined) {\n console.error(`Could not find column named ${columnName}`)\n columnValue = null\n } else {\n columnValue = data[columnIndex]\n }\n return columnValue\n}\n\nconst formatReleaseStats = (\n schema: ReleaseCardSchema,\n data: (string | null)[],\n statsConfig: StatConfig[],\n) => {\n return statsConfig.map(statConfig => {\n const { columnName, label } = statConfig\n const statString = getValueFromData(schema, data, columnName)\n const cardStat: ReleaseCardStat = {\n label: label,\n value: statString\n ? formatNumber(Number(statString))\n : MISSING_STAT_DEFAULT_VALUE,\n }\n return cardStat\n })\n}\n\nconst formatReleaseDate = (\n schema: ReleaseCardSchema,\n data: (string | null)[],\n releaseDateColumnName: string,\n) => {\n const releaseDateString = getValueFromData(\n schema,\n data,\n releaseDateColumnName,\n )\n const cardStat: ReleaseCardStat = {\n label: 'Date of release',\n value: releaseDateString\n ? formatDate(dayjs(Number(releaseDateString)), 'MM/DD/YYYY')\n : MISSING_STAT_DEFAULT_VALUE,\n }\n return cardStat\n}\n\nexport const formatReleaseCardData = (\n schema: ReleaseCardSchema,\n data: (string | null)[],\n releaseMetdataConfig: ReleaseMetadataConfig,\n statsConfig: StatConfig[],\n) => {\n return {\n releaseName: getValueFromData(\n schema,\n data,\n releaseMetdataConfig.releaseNameColumnName,\n ),\n releaseEntityId: getValueFromData(\n schema,\n data,\n releaseMetdataConfig.releaseEntityIdColumnName,\n ),\n releaseDate: formatReleaseDate(\n schema,\n data,\n releaseMetdataConfig.releaseDateColumnName,\n ),\n stats: formatReleaseStats(schema, data, statsConfig),\n }\n}\n\nconst getAllSelectedFacets = (\n schema: ReleaseCardSchema,\n data: (string | null)[],\n selectedFacetConfigs: SelectedFacetConfig[] | undefined,\n staticSelectedFacets: SelectedFacet[] | undefined,\n): SelectedFacet[] => {\n const allSelectedFacets: SelectedFacet[] = staticSelectedFacets\n ? [...staticSelectedFacets]\n : []\n\n if (selectedFacetConfigs) {\n selectedFacetConfigs.forEach(selectedFacetConfig => {\n const sourceDataFacetValueColumnName =\n selectedFacetConfig.sourceTableColumnName\n const facetValue = sourceDataFacetValueColumnName\n ? getValueFromData(schema, data, sourceDataFacetValueColumnName)\n : null\n if (facetValue) {\n allSelectedFacets.push({\n facet: selectedFacetConfig.destinationTableColumnName,\n facetValue: facetValue,\n })\n }\n })\n }\n\n return allSelectedFacets\n}\n\nexport const formatExplorePagePathAndQueryString = async (\n schema: ReleaseCardSchema,\n data: (string | null)[],\n btnConfig?: ButtonToExplorePageConfig,\n): Promise<string | null> => {\n if (!btnConfig) return null\n const path = getValueFromData(\n schema,\n data,\n btnConfig.sourceTablePathColumnName,\n )\n if (!path) {\n console.warn(\n `Column not found in source table or cell did not have value in source table for ${btnConfig.sourceTablePathColumnName}`,\n )\n return null\n }\n\n const {\n sourceTableSqlColumnName: sourceExploreDataSqlColumnName,\n selectedFacetConfigs,\n staticSelectedFacets,\n } = btnConfig\n\n const exploreDataSql = sourceExploreDataSqlColumnName\n ? getValueFromData(schema, data, sourceExploreDataSqlColumnName)\n : null\n const allSelectedFacets = getAllSelectedFacets(\n schema,\n data,\n selectedFacetConfigs,\n staticSelectedFacets,\n )\n const hasSelectedFacets = exploreDataSql && allSelectedFacets.length > 0\n\n return hasSelectedFacets\n ? await generateEncodedPathAndQueryForSelectedFacetURL(\n path,\n exploreDataSql,\n allSelectedFacets,\n )\n : path\n}\n"],"mappings":";;;;;AAaA,IAAM,IAA6B,WAE7B,KAAgB,MAChB,IAAM,MAAkB,EAAI,gBAAgB,
|
|
1
|
+
{"version":3,"file":"ReleaseCardUtils.js","names":[],"sources":["../../../src/components/ReleaseCard/ReleaseCardUtils.ts"],"sourcesContent":["import { formatDate } from '@/utils/functions/DateFormatter'\nimport dayjs from 'dayjs'\nimport { generateEncodedPathAndQueryForSelectedFacetURL } from '../QueryWrapper'\nimport { SelectedFacet } from '../QueryWrapper/generateEncodedPathAndQueryForSelectedFacetURL'\nimport { ReleaseCardSchema } from './ReleaseCard'\nimport {\n ButtonToExplorePageConfig,\n ReleaseCardStat,\n ReleaseMetadataConfig,\n SelectedFacetConfig,\n StatConfig,\n} from './ReleaseCardTypes'\n\nconst MISSING_STAT_DEFAULT_VALUE = 'Unknown'\n\nconst formatNumber = (num: number) => {\n if (num < 1_000_000) return num.toLocaleString()\n const numberFormatter = new Intl.NumberFormat([], {\n minimumFractionDigits: 1,\n maximumFractionDigits: 2,\n notation: 'compact',\n localeMatcher: 'best fit',\n })\n return numberFormatter.format(num)\n}\n\nconst getValueFromData = (\n schema: ReleaseCardSchema,\n data: (string | null)[],\n columnName: string,\n) => {\n const columnIndex = schema[columnName]\n let columnValue\n if (columnIndex === undefined) {\n console.error(`Could not find column named ${columnName}`)\n columnValue = null\n } else {\n columnValue = data[columnIndex]\n }\n return columnValue\n}\n\nconst formatReleaseStats = (\n schema: ReleaseCardSchema,\n data: (string | null)[],\n statsConfig: StatConfig[],\n) => {\n return statsConfig.map(statConfig => {\n const { columnName, label } = statConfig\n const statString = getValueFromData(schema, data, columnName)\n const cardStat: ReleaseCardStat = {\n label: label,\n value: statString\n ? formatNumber(Number(statString))\n : MISSING_STAT_DEFAULT_VALUE,\n }\n return cardStat\n })\n}\n\nconst formatReleaseDate = (\n schema: ReleaseCardSchema,\n data: (string | null)[],\n releaseDateColumnName: string,\n) => {\n const releaseDateString = getValueFromData(\n schema,\n data,\n releaseDateColumnName,\n )\n const cardStat: ReleaseCardStat = {\n label: 'Date of release',\n value: releaseDateString\n ? formatDate(dayjs(Number(releaseDateString)), 'MM/DD/YYYY')\n : MISSING_STAT_DEFAULT_VALUE,\n }\n return cardStat\n}\n\nexport const formatReleaseCardData = (\n schema: ReleaseCardSchema,\n data: (string | null)[],\n releaseMetdataConfig: ReleaseMetadataConfig,\n statsConfig: StatConfig[],\n) => {\n return {\n releaseName: getValueFromData(\n schema,\n data,\n releaseMetdataConfig.releaseNameColumnName,\n ),\n releaseEntityId: getValueFromData(\n schema,\n data,\n releaseMetdataConfig.releaseEntityIdColumnName,\n ),\n releaseDate: formatReleaseDate(\n schema,\n data,\n releaseMetdataConfig.releaseDateColumnName,\n ),\n stats: formatReleaseStats(schema, data, statsConfig),\n }\n}\n\nconst getAllSelectedFacets = (\n schema: ReleaseCardSchema,\n data: (string | null)[],\n selectedFacetConfigs: SelectedFacetConfig[] | undefined,\n staticSelectedFacets: SelectedFacet[] | undefined,\n): SelectedFacet[] => {\n const allSelectedFacets: SelectedFacet[] = staticSelectedFacets\n ? [...staticSelectedFacets]\n : []\n\n if (selectedFacetConfigs) {\n selectedFacetConfigs.forEach(selectedFacetConfig => {\n const sourceDataFacetValueColumnName =\n selectedFacetConfig.sourceTableColumnName\n const facetValue = sourceDataFacetValueColumnName\n ? getValueFromData(schema, data, sourceDataFacetValueColumnName)\n : null\n if (facetValue) {\n allSelectedFacets.push({\n facet: selectedFacetConfig.destinationTableColumnName,\n facetValue: facetValue,\n })\n }\n })\n }\n\n return allSelectedFacets\n}\n\nexport const formatExplorePagePathAndQueryString = async (\n schema: ReleaseCardSchema,\n data: (string | null)[],\n btnConfig?: ButtonToExplorePageConfig,\n): Promise<string | null> => {\n if (!btnConfig) return null\n const path = getValueFromData(\n schema,\n data,\n btnConfig.sourceTablePathColumnName,\n )\n if (!path) {\n console.warn(\n `Column not found in source table or cell did not have value in source table for ${btnConfig.sourceTablePathColumnName}`,\n )\n return null\n }\n\n const {\n sourceTableSqlColumnName: sourceExploreDataSqlColumnName,\n selectedFacetConfigs,\n staticSelectedFacets,\n } = btnConfig\n\n const exploreDataSql = sourceExploreDataSqlColumnName\n ? getValueFromData(schema, data, sourceExploreDataSqlColumnName)\n : null\n const allSelectedFacets = getAllSelectedFacets(\n schema,\n data,\n selectedFacetConfigs,\n staticSelectedFacets,\n )\n const hasSelectedFacets = exploreDataSql && allSelectedFacets.length > 0\n\n return hasSelectedFacets\n ? await generateEncodedPathAndQueryForSelectedFacetURL(\n path,\n exploreDataSql,\n allSelectedFacets,\n )\n : path\n}\n"],"mappings":";;;;;AAaA,IAAM,IAA6B,WAE7B,KAAgB,MAChB,IAAM,MAAkB,EAAI,gBAAgB,GAOzC,IANqB,KAAK,aAAa,EAAE,EAAE;CAChD,uBAAuB;CACvB,uBAAuB;CACvB,UAAU;CACV,eAAe;CAChB,CACM,CAAgB,OAAO,EAAI,EAG9B,KACJ,GACA,GACA,MACG;CACH,IAAM,IAAc,EAAO,IACvB;AAOJ,QANI,MAAgB,KAAA,KAClB,QAAQ,MAAM,+BAA+B,IAAa,EAC1D,IAAc,QAEd,IAAc,EAAK,IAEd;GAGH,KACJ,GACA,GACA,MAEO,EAAY,KAAI,MAAc;CACnC,IAAM,EAAE,eAAY,aAAU,GACxB,IAAa,EAAiB,GAAQ,GAAM,EAAW;AAO7D,QAAO;EALE;EACP,OAAO,IACH,EAAa,OAAO,EAAW,CAAC,GAChC;EAEC;EACP,EAGE,KACJ,GACA,GACA,MACG;CACH,IAAM,IAAoB,EACxB,GACA,GACA,EACD;AAOD,QAAO;EALL,OAAO;EACP,OAAO,IACH,EAAW,EAAM,OAAO,EAAkB,CAAC,EAAE,aAAa,GAC1D;EAEC;GAGI,KACX,GACA,GACA,GACA,OAEO;CACL,aAAa,EACX,GACA,GACA,EAAqB,sBACtB;CACD,iBAAiB,EACf,GACA,GACA,EAAqB,0BACtB;CACD,aAAa,EACX,GACA,GACA,EAAqB,sBACtB;CACD,OAAO,EAAmB,GAAQ,GAAM,EAAY;CACrD,GAGG,KACJ,GACA,GACA,GACA,MACoB;CACpB,IAAM,IAAqC,IACvC,CAAC,GAAG,EAAqB,GACzB,EAAE;AAkBN,QAhBI,KACF,EAAqB,SAAQ,MAAuB;EAClD,IAAM,IACJ,EAAoB,uBAChB,IAAa,IACf,EAAiB,GAAQ,GAAM,EAA+B,GAC9D;AACJ,EAAI,KACF,EAAkB,KAAK;GACrB,OAAO,EAAoB;GACf;GACb,CAAC;GAEJ,EAGG;GAGI,IAAsC,OACjD,GACA,GACA,MAC2B;AAC3B,KAAI,CAAC,EAAW,QAAO;CACvB,IAAM,IAAO,EACX,GACA,GACA,EAAU,0BACX;AACD,KAAI,CAAC,EAIH,QAHA,QAAQ,KACN,mFAAmF,EAAU,4BAC9F,EACM;CAGT,IAAM,EACJ,0BAA0B,GAC1B,yBACA,4BACE,GAEE,IAAiB,IACnB,EAAiB,GAAQ,GAAM,EAA+B,GAC9D,MACE,IAAoB,EACxB,GACA,GACA,GACA,EACD;AAGD,QAF0B,KAAkB,EAAkB,SAAS,IAGnE,MAAM,EACJ,GACA,GACA,EACD,GACD"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useResizable.js","names":[],"sources":["../../../../src/components/ResizableContainer/hooks/useResizable.ts"],"sourcesContent":["import { useCallback, useEffect, useRef, useState } from 'react'\n\nexport interface ResizableOptions {\n initialWidth?: number\n initialHeight?: number\n minWidth?: number\n minHeight?: number\n maxWidth?: number\n maxHeight?: number\n onResize?: (size: { width: number; height: number }) => void\n}\n\nexport interface ResizableState {\n width: number\n height: number\n isResizing: boolean\n}\n\nexport interface ResizableHandlers {\n handleResizeStart: (e: React.MouseEvent) => void\n setSize: (size: { width: number; height: number }) => void\n}\n\n/** See DraggableDialog for an example on how to use useResizable with a ResizableContainer */\nexport function useResizable(\n options: ResizableOptions = {},\n): ResizableState & ResizableHandlers {\n const {\n initialWidth = 600,\n initialHeight = 500,\n minWidth = 300,\n minHeight = 200,\n maxWidth = 1200,\n maxHeight = 800,\n onResize,\n } = options\n\n const [size, setSize] = useState({\n width: initialWidth,\n height: initialHeight,\n })\n const [isResizing, setIsResizing] = useState(false)\n const resizeStartRef = useRef<{\n x: number\n y: number\n width: number\n height: number\n } | null>(null)\n\n const handleResizeStart = useCallback(\n (e: React.MouseEvent) => {\n e.preventDefault()\n e.stopPropagation()\n setIsResizing(true)\n resizeStartRef.current = {\n x: e.clientX,\n y: e.clientY,\n width: size.width,\n height: size.height,\n }\n },\n [size],\n )\n\n const handleResizeMove = useCallback(\n (e: MouseEvent) => {\n if (!isResizing || !resizeStartRef.current) return\n\n const deltaX = e.clientX - resizeStartRef.current.x\n const deltaY = e.clientY - resizeStartRef.current.y\n\n const newWidth = Math.max(\n minWidth,\n Math.min(maxWidth, resizeStartRef.current.width + deltaX),\n )\n const newHeight = Math.max(\n minHeight,\n Math.min(maxHeight, resizeStartRef.current.height + deltaY),\n )\n\n const newSize = { width: newWidth, height: newHeight }\n setSize(newSize)\n onResize?.(newSize)\n },\n [isResizing, minWidth, maxWidth, minHeight, maxHeight, onResize],\n )\n\n const handleResizeEnd = useCallback(() => {\n setIsResizing(false)\n resizeStartRef.current = null\n }, [])\n\n useEffect(() => {\n if (isResizing) {\n document.addEventListener('mousemove', handleResizeMove)\n document.addEventListener('mouseup', handleResizeEnd)\n }\n return () => {\n document.removeEventListener('mousemove', handleResizeMove)\n document.removeEventListener('mouseup', handleResizeEnd)\n }\n }, [isResizing, handleResizeMove, handleResizeEnd])\n\n return {\n width: size.width,\n height: size.height,\n isResizing,\n handleResizeStart,\n setSize,\n }\n}\n"],"mappings":";;AAwBA,SAAgB,EACd,IAA4B,EAAE,EACM;CACpC,IAAM,EACJ,kBAAe,KACf,mBAAgB,KAChB,cAAW,KACX,eAAY,KACZ,cAAW,MACX,eAAY,KACZ,gBACE,GAEE,CAAC,GAAM,KAAW,EAAS;EAC/B,OAAO;EACP,QAAQ;EACT,CAAC,EACI,CAAC,GAAY,KAAiB,EAAS,GAAM,EAC7C,IAAiB,EAKb,KAAK,EAET,IAAoB,GACvB,MAAwB;AAIvB,EAHA,EAAE,gBAAgB,EAClB,EAAE,iBAAiB,EACnB,EAAc,GAAK,EACnB,EAAe,UAAU;GACvB,GAAG,EAAE;GACL,GAAG,EAAE;GACL,OAAO,EAAK;GACZ,QAAQ,EAAK;GACd;IAEH,CAAC,EAAK,CACP,EAEK,IAAmB,GACtB,MAAkB;AACjB,MAAI,CAAC,KAAc,CAAC,EAAe,QAAS;EAE5C,IAAM,IAAS,EAAE,UAAU,EAAe,QAAQ,GAC5C,IAAS,EAAE,UAAU,EAAe,QAAQ,GAW5C,IAAU;GAAE,OATD,KAAK,IACpB,GACA,KAAK,IAAI,GAAU,EAAe,QAAQ,QAAQ,EAAO,
|
|
1
|
+
{"version":3,"file":"useResizable.js","names":[],"sources":["../../../../src/components/ResizableContainer/hooks/useResizable.ts"],"sourcesContent":["import { useCallback, useEffect, useRef, useState } from 'react'\n\nexport interface ResizableOptions {\n initialWidth?: number\n initialHeight?: number\n minWidth?: number\n minHeight?: number\n maxWidth?: number\n maxHeight?: number\n onResize?: (size: { width: number; height: number }) => void\n}\n\nexport interface ResizableState {\n width: number\n height: number\n isResizing: boolean\n}\n\nexport interface ResizableHandlers {\n handleResizeStart: (e: React.MouseEvent) => void\n setSize: (size: { width: number; height: number }) => void\n}\n\n/** See DraggableDialog for an example on how to use useResizable with a ResizableContainer */\nexport function useResizable(\n options: ResizableOptions = {},\n): ResizableState & ResizableHandlers {\n const {\n initialWidth = 600,\n initialHeight = 500,\n minWidth = 300,\n minHeight = 200,\n maxWidth = 1200,\n maxHeight = 800,\n onResize,\n } = options\n\n const [size, setSize] = useState({\n width: initialWidth,\n height: initialHeight,\n })\n const [isResizing, setIsResizing] = useState(false)\n const resizeStartRef = useRef<{\n x: number\n y: number\n width: number\n height: number\n } | null>(null)\n\n const handleResizeStart = useCallback(\n (e: React.MouseEvent) => {\n e.preventDefault()\n e.stopPropagation()\n setIsResizing(true)\n resizeStartRef.current = {\n x: e.clientX,\n y: e.clientY,\n width: size.width,\n height: size.height,\n }\n },\n [size],\n )\n\n const handleResizeMove = useCallback(\n (e: MouseEvent) => {\n if (!isResizing || !resizeStartRef.current) return\n\n const deltaX = e.clientX - resizeStartRef.current.x\n const deltaY = e.clientY - resizeStartRef.current.y\n\n const newWidth = Math.max(\n minWidth,\n Math.min(maxWidth, resizeStartRef.current.width + deltaX),\n )\n const newHeight = Math.max(\n minHeight,\n Math.min(maxHeight, resizeStartRef.current.height + deltaY),\n )\n\n const newSize = { width: newWidth, height: newHeight }\n setSize(newSize)\n onResize?.(newSize)\n },\n [isResizing, minWidth, maxWidth, minHeight, maxHeight, onResize],\n )\n\n const handleResizeEnd = useCallback(() => {\n setIsResizing(false)\n resizeStartRef.current = null\n }, [])\n\n useEffect(() => {\n if (isResizing) {\n document.addEventListener('mousemove', handleResizeMove)\n document.addEventListener('mouseup', handleResizeEnd)\n }\n return () => {\n document.removeEventListener('mousemove', handleResizeMove)\n document.removeEventListener('mouseup', handleResizeEnd)\n }\n }, [isResizing, handleResizeMove, handleResizeEnd])\n\n return {\n width: size.width,\n height: size.height,\n isResizing,\n handleResizeStart,\n setSize,\n }\n}\n"],"mappings":";;AAwBA,SAAgB,EACd,IAA4B,EAAE,EACM;CACpC,IAAM,EACJ,kBAAe,KACf,mBAAgB,KAChB,cAAW,KACX,eAAY,KACZ,cAAW,MACX,eAAY,KACZ,gBACE,GAEE,CAAC,GAAM,KAAW,EAAS;EAC/B,OAAO;EACP,QAAQ;EACT,CAAC,EACI,CAAC,GAAY,KAAiB,EAAS,GAAM,EAC7C,IAAiB,EAKb,KAAK,EAET,IAAoB,GACvB,MAAwB;AAIvB,EAHA,EAAE,gBAAgB,EAClB,EAAE,iBAAiB,EACnB,EAAc,GAAK,EACnB,EAAe,UAAU;GACvB,GAAG,EAAE;GACL,GAAG,EAAE;GACL,OAAO,EAAK;GACZ,QAAQ,EAAK;GACd;IAEH,CAAC,EAAK,CACP,EAEK,IAAmB,GACtB,MAAkB;AACjB,MAAI,CAAC,KAAc,CAAC,EAAe,QAAS;EAE5C,IAAM,IAAS,EAAE,UAAU,EAAe,QAAQ,GAC5C,IAAS,EAAE,UAAU,EAAe,QAAQ,GAW5C,IAAU;GAAE,OATD,KAAK,IACpB,GACA,KAAK,IAAI,GAAU,EAAe,QAAQ,QAAQ,EAAO,CAOlC;GAAU,QALjB,KAAK,IACrB,GACA,KAAK,IAAI,GAAW,EAAe,QAAQ,SAAS,EAAO,CAGlB;GAAW;AAEtD,EADA,EAAQ,EAAQ,EAChB,IAAW,EAAQ;IAErB;EAAC;EAAY;EAAU;EAAU;EAAW;EAAW;EAAS,CACjE,EAEK,IAAkB,QAAkB;AAExC,EADA,EAAc,GAAM,EACpB,EAAe,UAAU;IACxB,EAAE,CAAC;AAaN,QAXA,SACM,MACF,SAAS,iBAAiB,aAAa,EAAiB,EACxD,SAAS,iBAAiB,WAAW,EAAgB,SAE1C;AAEX,EADA,SAAS,oBAAoB,aAAa,EAAiB,EAC3D,SAAS,oBAAoB,WAAW,EAAgB;KAEzD;EAAC;EAAY;EAAkB;EAAgB,CAAC,EAE5C;EACL,OAAO,EAAK;EACZ,QAAQ,EAAK;EACb;EACA;EACA;EACD"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Resources.Mobile.js","names":[],"sources":["../../../src/components/Resources/Resources.Mobile.tsx"],"sourcesContent":["import { Data } from './Resources'\nimport MarkdownSynapse from '../Markdown/MarkdownSynapse'\nimport ExpandableContent from '../home_page/ExpandableContent'\n\nexport type ResourcesMobileProps = {\n data: Data\n}\n\nexport default function ResourcesMobile({ data }: ResourcesMobileProps) {\n return (\n <div className=\"Resources_Mobile\">\n {data.map(({ name, ownerId, wikiId }) => {\n const title = <> {name} </>\n const markdown = <MarkdownSynapse ownerId={ownerId} wikiId={wikiId} />\n return <ExpandableContent key={name} title={title} content={markdown} />\n })}\n </div>\n )\n}\n"],"mappings":";;;;AAQA,SAAwB,EAAgB,EAAE,WAA8B;AACtE,QACE,kBAAC,OAAD;EAAK,WAAU;YACZ,EAAK,KAAK,EAAE,SAAM,YAAS,gBAGnB,kBAAC,GAAD;GAAqC,OAF9B,kBAAA,GAAA,EAAA,UAAA;IAAE;IAAE;IAAK;IAAI,EAAA,
|
|
1
|
+
{"version":3,"file":"Resources.Mobile.js","names":[],"sources":["../../../src/components/Resources/Resources.Mobile.tsx"],"sourcesContent":["import { Data } from './Resources'\nimport MarkdownSynapse from '../Markdown/MarkdownSynapse'\nimport ExpandableContent from '../home_page/ExpandableContent'\n\nexport type ResourcesMobileProps = {\n data: Data\n}\n\nexport default function ResourcesMobile({ data }: ResourcesMobileProps) {\n return (\n <div className=\"Resources_Mobile\">\n {data.map(({ name, ownerId, wikiId }) => {\n const title = <> {name} </>\n const markdown = <MarkdownSynapse ownerId={ownerId} wikiId={wikiId} />\n return <ExpandableContent key={name} title={title} content={markdown} />\n })}\n </div>\n )\n}\n"],"mappings":";;;;AAQA,SAAwB,EAAgB,EAAE,WAA8B;AACtE,QACE,kBAAC,OAAD;EAAK,WAAU;YACZ,EAAK,KAAK,EAAE,SAAM,YAAS,gBAGnB,kBAAC,GAAD;GAAqC,OAF9B,kBAAA,GAAA,EAAA,UAAA;IAAE;IAAE;IAAK;IAAI,EAAA,CAEiB;GAAO,SADlC,kBAAC,GAAD;IAA0B;IAAiB;IAAU,CACV;GAAY,EAAzC,EAAyC,CACxE;EACE,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Resources.js","names":[],"sources":["../../../src/components/Resources/Resources.tsx"],"sourcesContent":["import useGetQueryResultBundle from '@/synapse-queries/entity/useGetQueryResultBundle'\nimport { SynapseConstants } from '@/utils'\nimport { getFieldIndex } from '@/utils/functions/queryUtils'\nimport useShowDesktop from '@/utils/hooks/useShowDesktop'\nimport { QueryBundleRequest } from '@sage-bionetworks/synapse-types'\nimport { ErrorBanner } from '../error/ErrorBanner'\nimport ResourcesDesktop from './Resources.Desktop'\nimport ResourcesMobile from './Resources.Mobile'\n\nexport type ResourcesProps = {\n entityId: string\n}\n\nenum ExpectedColumns {\n NAME = 'Name',\n WIKI = 'Wiki',\n}\n\nexport type Data = {\n name: string\n ownerId: string\n wikiId: string\n}[]\n\nexport function Resources(props: ResourcesProps) {\n const { entityId } = props\n const showDesktop = useShowDesktop()\n\n const queryBundleRequest: QueryBundleRequest = {\n concreteType: 'org.sagebionetworks.repo.model.table.QueryBundleRequest',\n entityId,\n partMask:\n SynapseConstants.BUNDLE_MASK_QUERY_SELECT_COLUMNS |\n SynapseConstants.BUNDLE_MASK_QUERY_RESULTS,\n query: {\n sql: `SELECT Name, Wiki FROM ${entityId} ORDER BY ItemOrder`,\n },\n }\n const { data: queryResultBundle, error } =\n useGetQueryResultBundle(queryBundleRequest)\n\n const nameIndex = getFieldIndex(ExpectedColumns.NAME, queryResultBundle)\n const wikiIndex = getFieldIndex(ExpectedColumns.WIKI, queryResultBundle)\n const data: Data =\n queryResultBundle?.queryResult?.queryResults.rows.map(el => {\n const values = el.values as string[]\n if (values.some(value => value === null)) {\n console.warn('Row has null value(s) when no nulls expected')\n }\n\n const name = values[nameIndex]\n const wikiValue = values[wikiIndex] ?? ''\n const split = wikiValue.split('/')\n const ownerId = split[0]\n const wikiId = split[2]\n return {\n name,\n ownerId,\n wikiId,\n }\n }) ?? []\n return (\n <div className=\"Resources\">\n <ErrorBanner error={error} />\n {showDesktop ? (\n <ResourcesDesktop data={data} />\n ) : (\n <ResourcesMobile data={data} />\n )}\n </div>\n )\n}\n\nexport default Resources\n"],"mappings":";;;;;;;;;;AAaA,IAAK,IAAL,yBAAA,GAAA;QACE,EAAA,
|
|
1
|
+
{"version":3,"file":"Resources.js","names":[],"sources":["../../../src/components/Resources/Resources.tsx"],"sourcesContent":["import useGetQueryResultBundle from '@/synapse-queries/entity/useGetQueryResultBundle'\nimport { SynapseConstants } from '@/utils'\nimport { getFieldIndex } from '@/utils/functions/queryUtils'\nimport useShowDesktop from '@/utils/hooks/useShowDesktop'\nimport { QueryBundleRequest } from '@sage-bionetworks/synapse-types'\nimport { ErrorBanner } from '../error/ErrorBanner'\nimport ResourcesDesktop from './Resources.Desktop'\nimport ResourcesMobile from './Resources.Mobile'\n\nexport type ResourcesProps = {\n entityId: string\n}\n\nenum ExpectedColumns {\n NAME = 'Name',\n WIKI = 'Wiki',\n}\n\nexport type Data = {\n name: string\n ownerId: string\n wikiId: string\n}[]\n\nexport function Resources(props: ResourcesProps) {\n const { entityId } = props\n const showDesktop = useShowDesktop()\n\n const queryBundleRequest: QueryBundleRequest = {\n concreteType: 'org.sagebionetworks.repo.model.table.QueryBundleRequest',\n entityId,\n partMask:\n SynapseConstants.BUNDLE_MASK_QUERY_SELECT_COLUMNS |\n SynapseConstants.BUNDLE_MASK_QUERY_RESULTS,\n query: {\n sql: `SELECT Name, Wiki FROM ${entityId} ORDER BY ItemOrder`,\n },\n }\n const { data: queryResultBundle, error } =\n useGetQueryResultBundle(queryBundleRequest)\n\n const nameIndex = getFieldIndex(ExpectedColumns.NAME, queryResultBundle)\n const wikiIndex = getFieldIndex(ExpectedColumns.WIKI, queryResultBundle)\n const data: Data =\n queryResultBundle?.queryResult?.queryResults.rows.map(el => {\n const values = el.values as string[]\n if (values.some(value => value === null)) {\n console.warn('Row has null value(s) when no nulls expected')\n }\n\n const name = values[nameIndex]\n const wikiValue = values[wikiIndex] ?? ''\n const split = wikiValue.split('/')\n const ownerId = split[0]\n const wikiId = split[2]\n return {\n name,\n ownerId,\n wikiId,\n }\n }) ?? []\n return (\n <div className=\"Resources\">\n <ErrorBanner error={error} />\n {showDesktop ? (\n <ResourcesDesktop data={data} />\n ) : (\n <ResourcesMobile data={data} />\n )}\n </div>\n )\n}\n\nexport default Resources\n"],"mappings":";;;;;;;;;;AAaA,IAAK,IAAL,yBAAA,GAAA;QACE,EAAA,OAAO,QACP,EAAA,OAAO;EAFJ,KAAA,EAAA,CAGJ;AAQD,SAAgB,EAAU,GAAuB;CAC/C,IAAM,EAAE,gBAAa,GACf,IAAc,GAAgB,EAY9B,EAAE,MAAM,GAAmB,aAC/B,EAAwB;EAVxB,cAAc;EACd;EACA,UACE;EAEF,OAAO,EACL,KAAK,0BAA0B,EAAS,sBACzC;EAGuB,CAAmB,EAEvC,IAAY,EAAc,EAAgB,MAAM,EAAkB,EAClE,IAAY,EAAc,EAAgB,MAAM,EAAkB,EAClE,IACJ,GAAmB,aAAa,aAAa,KAAK,KAAI,MAAM;EAC1D,IAAM,IAAS,EAAG;AAClB,EAAI,EAAO,MAAK,MAAS,MAAU,KAAK,IACtC,QAAQ,KAAK,+CAA+C;EAG9D,IAAM,IAAO,EAAO,IAEd,KADY,EAAO,MAAc,IACf,MAAM,IAAI;AAGlC,SAAO;GACL;GACA,SAJc,EAAM;GAKpB,QAJa,EAAM;GAKpB;GACD,IAAI,EAAE;AACV,QACE,kBAAC,OAAD;EAAK,WAAU;YAAf,CACE,kBAAC,GAAD,EAAoB,UAAS,CAAA,EAE3B,EADD,IACE,IAEA,GAFD,EAAwB,SAAQ,CAED,CAE7B"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RowDataTableWithQuery.js","names":[],"sources":["../../../src/components/RowDataTable/RowDataTableWithQuery.tsx"],"sourcesContent":["import React from 'react'\nimport useGetQueryResultBundle from '@/synapse-queries/entity/useGetQueryResultBundle'\nimport { parseEntityIdFromSqlStatement } from '@/utils/functions'\nimport {\n BUNDLE_MASK_QUERY_RESULTS,\n BUNDLE_MASK_QUERY_SELECT_COLUMNS,\n} from '@/utils/SynapseConstants'\nimport { Query, QueryBundleRequest } from '@sage-bionetworks/synapse-types'\nimport { LabelLinkConfig } from '../CardContainerLogic'\nimport { SkeletonTable } from '../Skeleton'\nimport RowDataTable from './RowDataTable'\n\nexport type RowDataTableWithQueryProps = {\n /** The query used to retrieve data */\n query: Query\n /** Optional list of column names whose data should be displayed in the table. If not provided, all columns with data will be shown. */\n displayedColumns?: string[]\n /** Optional display value overrides for column names */\n columnAliases?: Record<string, string>\n /** Optional configuration for linking columns */\n columnLinks?: LabelLinkConfig\n}\n\n/**\n * For the first row returned by the query, displays a table of column names and Synapse Table row data represented as key/value pairs\n */\nconst RowDataTableWithQuery = (\n props: RowDataTableWithQueryProps,\n): React.ReactNode => {\n const { columnAliases, columnLinks, query, displayedColumns } = props\n const entityId = parseEntityIdFromSqlStatement(query.sql)\n\n const queryBundleRequest: QueryBundleRequest = {\n partMask: BUNDLE_MASK_QUERY_SELECT_COLUMNS | BUNDLE_MASK_QUERY_RESULTS,\n concreteType: 'org.sagebionetworks.repo.model.table.QueryBundleRequest',\n entityId,\n query,\n }\n\n const { data: queryResultBundle, isLoading } =\n useGetQueryResultBundle(queryBundleRequest)\n\n const rowData =\n queryResultBundle?.queryResult!.queryResults.rows[0].values ?? []\n const headers = queryResultBundle?.queryResult!.queryResults.headers ?? []\n\n if (isLoading) return <SkeletonTable numRows={6} numCols={1} />\n\n return (\n <RowDataTable\n columnAliases={columnAliases}\n columnLinks={columnLinks}\n rowData={rowData}\n headers={headers}\n displayedColumns={displayedColumns}\n />\n )\n}\n\nexport default RowDataTableWithQuery\n"],"mappings":";;;;;;;;;;AA0BA,IAAM,KACJ,MACoB;CACpB,IAAM,EAAE,kBAAe,gBAAa,UAAO,wBAAqB,GAU1D,EAAE,MAAM,GAAmB,iBAC/B,
|
|
1
|
+
{"version":3,"file":"RowDataTableWithQuery.js","names":[],"sources":["../../../src/components/RowDataTable/RowDataTableWithQuery.tsx"],"sourcesContent":["import React from 'react'\nimport useGetQueryResultBundle from '@/synapse-queries/entity/useGetQueryResultBundle'\nimport { parseEntityIdFromSqlStatement } from '@/utils/functions'\nimport {\n BUNDLE_MASK_QUERY_RESULTS,\n BUNDLE_MASK_QUERY_SELECT_COLUMNS,\n} from '@/utils/SynapseConstants'\nimport { Query, QueryBundleRequest } from '@sage-bionetworks/synapse-types'\nimport { LabelLinkConfig } from '../CardContainerLogic'\nimport { SkeletonTable } from '../Skeleton'\nimport RowDataTable from './RowDataTable'\n\nexport type RowDataTableWithQueryProps = {\n /** The query used to retrieve data */\n query: Query\n /** Optional list of column names whose data should be displayed in the table. If not provided, all columns with data will be shown. */\n displayedColumns?: string[]\n /** Optional display value overrides for column names */\n columnAliases?: Record<string, string>\n /** Optional configuration for linking columns */\n columnLinks?: LabelLinkConfig\n}\n\n/**\n * For the first row returned by the query, displays a table of column names and Synapse Table row data represented as key/value pairs\n */\nconst RowDataTableWithQuery = (\n props: RowDataTableWithQueryProps,\n): React.ReactNode => {\n const { columnAliases, columnLinks, query, displayedColumns } = props\n const entityId = parseEntityIdFromSqlStatement(query.sql)\n\n const queryBundleRequest: QueryBundleRequest = {\n partMask: BUNDLE_MASK_QUERY_SELECT_COLUMNS | BUNDLE_MASK_QUERY_RESULTS,\n concreteType: 'org.sagebionetworks.repo.model.table.QueryBundleRequest',\n entityId,\n query,\n }\n\n const { data: queryResultBundle, isLoading } =\n useGetQueryResultBundle(queryBundleRequest)\n\n const rowData =\n queryResultBundle?.queryResult!.queryResults.rows[0].values ?? []\n const headers = queryResultBundle?.queryResult!.queryResults.headers ?? []\n\n if (isLoading) return <SkeletonTable numRows={6} numCols={1} />\n\n return (\n <RowDataTable\n columnAliases={columnAliases}\n columnLinks={columnLinks}\n rowData={rowData}\n headers={headers}\n displayedColumns={displayedColumns}\n />\n )\n}\n\nexport default RowDataTableWithQuery\n"],"mappings":";;;;;;;;;;AA0BA,IAAM,KACJ,MACoB;CACpB,IAAM,EAAE,kBAAe,gBAAa,UAAO,wBAAqB,GAU1D,EAAE,MAAM,GAAmB,iBAC/B,EAAwB;EAPxB,UAAA;EACA,cAAc;EACd,UALe,EAA8B,EAAM,IAKnD;EACA;EAIwB,CAAmB,EAEvC,IACJ,GAAmB,YAAa,aAAa,KAAK,GAAG,UAAU,EAAE,EAC7D,IAAU,GAAmB,YAAa,aAAa,WAAW,EAAE;AAI1E,QAFI,IAAkB,kBAAC,GAAD;EAAe,SAAS;EAAG,SAAS;EAAK,CAAA,GAG7D,kBAAC,GAAD;EACiB;EACF;EACJ;EACA;EACS;EAClB,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SageResourcesPopover.js","names":[],"sources":["../../../src/components/SageResourcesPopover/SageResourcesPopover.tsx"],"sourcesContent":["import { useSourceAppConfigs } from '@/utils/hooks'\nimport { Box, Button, Grid, Popover, Typography, useTheme } from '@mui/material'\nimport {\n ColumnSingleValueQueryFilter,\n ColumnSingleValueFilterOperator,\n} from '@sage-bionetworks/synapse-types'\n\nexport type SageResourcesPopoverProps = {\n sourceAppConfigTableID?: string\n anchorEl: HTMLElement | null\n onClose: () => void\n resourceName?: string\n description?: string\n filterByType?: 'SynapsePortal' | 'SageSolution'\n allResourcesUrl?: string\n}\n\nexport function SageResourcesPopover({\n sourceAppConfigTableID = 'syn45291362',\n anchorEl,\n onClose,\n resourceName = 'Portals',\n description = 'Sage Bionetworks builds and supports community portals as tailored platforms for data sharing and collaboration across diverse research areas.',\n filterByType,\n allResourcesUrl,\n}: SageResourcesPopoverProps) {\n const theme = useTheme()\n const open = Boolean(anchorEl)\n const hostname = typeof window !== 'undefined' ? window.location.hostname : ''\n\n const additionalFilters: ColumnSingleValueQueryFilter[] = [\n {\n concreteType:\n 'org.sagebionetworks.repo.model.table.ColumnSingleValueQueryFilter',\n columnName: 'isPublicized',\n operator: ColumnSingleValueFilterOperator.EQUAL,\n values: ['true'],\n },\n ]\n if (filterByType) {\n additionalFilters.push({\n isDefiningCondition: false,\n concreteType:\n 'org.sagebionetworks.repo.model.table.ColumnSingleValueQueryFilter',\n columnName: 'portalType',\n operator: ColumnSingleValueFilterOperator.EQUAL,\n values: [filterByType],\n })\n }\n const sourceAppConfigs = useSourceAppConfigs(\n sourceAppConfigTableID,\n additionalFilters,\n )\n\n return (\n <Popover\n open={open}\n anchorEl={anchorEl}\n onClose={onClose}\n sx={{ width: '90%', height: '90%' }}\n anchorOrigin={{ vertical: 'bottom', horizontal: 'center' }}\n transformOrigin={{ vertical: 'top', horizontal: 'center' }}\n >\n <Grid container spacing={2} sx={{ p: '24px' }}>\n <Grid size={{ xs: 12, lg: 3 }}>\n <Box sx={{ p: theme.spacing(4), pr: '5px' }}>\n <Typography\n variant=\"headline1\"\n sx={{ fontSize: '30px', pb: '30px', fontWeight: 600 }}\n >\n {resourceName}\n </Typography>\n <Typography variant=\"body1\" sx={{ pb: '10px', fontWeight: 500 }}>\n {description}\n </Typography>\n {allResourcesUrl && (\n <Button\n type=\"button\"\n color=\"primary\"\n variant=\"contained\"\n sx={{\n p: '10px 50px',\n mt: '30px',\n height: '100%',\n '&:hover': { color: 'white' },\n }}\n href={allResourcesUrl}\n >\n See all {resourceName}\n </Button>\n )}\n </Box>\n </Grid>\n\n <Grid size={{ xs: 12, lg: 9 }}>\n <Grid container>\n {sourceAppConfigs\n ?.filter(config => {\n if (config.appURL.toLowerCase().startsWith('http')) {\n const url = new URL(config.appURL)\n return url.hostname !== hostname\n }\n return true\n })\n .map(config => (\n <Grid\n key={config.appId}\n size={{ xs: 12, sm: 6, lg: 4 }}\n className=\"sourceAppItem\"\n sx={{\n p: '30px',\n border: '1px solid #F1F3F5',\n '&:hover': {\n backgroundColor: '#d7dee433',\n cursor: 'pointer',\n },\n }}\n >\n <div\n onClick={() => {\n window.open(config.appURL, '_blank')\n onClose()\n }}\n >\n <Box\n sx={{\n pb: '10px',\n img: {\n maxHeight: '50px',\n height: '50px',\n maxWidth: '100%',\n },\n }}\n >\n {config.logo}\n </Box>\n <Typography variant=\"body1\" sx={{ fontWeight: 500 }}>\n {config.shortDescription}\n </Typography>\n </div>\n </Grid>\n ))}\n </Grid>\n </Grid>\n </Grid>\n </Popover>\n )\n}\n"],"mappings":";;;;;;AAiBA,SAAgB,EAAqB,EACnC,4BAAyB,eACzB,aACA,YACA,kBAAe,WACf,iBAAc,kJACd,iBACA,sBAC4B;CAC5B,IAAM,IAAQ,GAAU,EAClB,IAAO,EAAQ,GACf,IAAW,OAAO,SAAW,MAAc,OAAO,SAAS,WAAW,IAEtE,IAAoD,CACxD;EACE,cACE;EACF,YAAY;EACZ,UAAU,EAAgC;EAC1C,QAAQ,CAAC,OAAO;EACjB,CACF;AACD,CAAI,KACF,EAAkB,KAAK;EACrB,qBAAqB;EACrB,cACE;EACF,YAAY;EACZ,UAAU,EAAgC;EAC1C,QAAQ,CAAC,EAAa;EACvB,CAAC;CAEJ,IAAM,IAAmB,EACvB,GACA,EACD;AAED,QACE,kBAAC,GAAD;EACQ;EACI;EACD;EACT,IAAI;GAAE,OAAO;GAAO,QAAQ;GAAO;EACnC,cAAc;GAAE,UAAU;GAAU,YAAY;GAAU;EAC1D,iBAAiB;GAAE,UAAU;GAAO,YAAY;GAAU;YAE1D,kBAAC,GAAD;GAAM,WAAA;GAAU,SAAS;GAAG,IAAI,EAAE,GAAG,QAAQ;aAA7C,CACE,kBAAC,GAAD;IAAM,MAAM;KAAE,IAAI;KAAI,IAAI;KAAG;cAC3B,kBAAC,GAAD;KAAK,IAAI;MAAE,GAAG,EAAM,QAAQ,EAAE;MAAE,IAAI;MAAO;eAA3C;MACE,kBAAC,GAAD;OACE,SAAQ;OACR,IAAI;QAAE,UAAU;QAAQ,IAAI;QAAQ,YAAY;QAAK;iBAEpD;OACU,CAAA;MACb,kBAAC,GAAD;OAAY,SAAQ;OAAQ,IAAI;QAAE,IAAI;QAAQ,YAAY;QAAK;iBAC5D;OACU,CAAA;MACZ,KACC,kBAAC,GAAD;OACE,MAAK;OACL,OAAM;OACN,SAAQ;OACR,IAAI;QACF,GAAG;QACH,IAAI;QACJ,QAAQ;QACR,WAAW,EAAE,OAAO,SAAS;QAC9B;OACD,MAAM;iBAVR,CAWC,YACU,EACF;;MAEP;;IACD,CAAA,EAEP,kBAAC,GAAD;IAAM,MAAM;KAAE,IAAI;KAAI,IAAI;KAAG;cAC3B,kBAAC,GAAD;KAAM,WAAA;eACH,GACG,QAAO,MACH,EAAO,OAAO,aAAa,CAAC,WAAW,OAAO,
|
|
1
|
+
{"version":3,"file":"SageResourcesPopover.js","names":[],"sources":["../../../src/components/SageResourcesPopover/SageResourcesPopover.tsx"],"sourcesContent":["import { useSourceAppConfigs } from '@/utils/hooks'\nimport { Box, Button, Grid, Popover, Typography, useTheme } from '@mui/material'\nimport {\n ColumnSingleValueQueryFilter,\n ColumnSingleValueFilterOperator,\n} from '@sage-bionetworks/synapse-types'\n\nexport type SageResourcesPopoverProps = {\n sourceAppConfigTableID?: string\n anchorEl: HTMLElement | null\n onClose: () => void\n resourceName?: string\n description?: string\n filterByType?: 'SynapsePortal' | 'SageSolution'\n allResourcesUrl?: string\n}\n\nexport function SageResourcesPopover({\n sourceAppConfigTableID = 'syn45291362',\n anchorEl,\n onClose,\n resourceName = 'Portals',\n description = 'Sage Bionetworks builds and supports community portals as tailored platforms for data sharing and collaboration across diverse research areas.',\n filterByType,\n allResourcesUrl,\n}: SageResourcesPopoverProps) {\n const theme = useTheme()\n const open = Boolean(anchorEl)\n const hostname = typeof window !== 'undefined' ? window.location.hostname : ''\n\n const additionalFilters: ColumnSingleValueQueryFilter[] = [\n {\n concreteType:\n 'org.sagebionetworks.repo.model.table.ColumnSingleValueQueryFilter',\n columnName: 'isPublicized',\n operator: ColumnSingleValueFilterOperator.EQUAL,\n values: ['true'],\n },\n ]\n if (filterByType) {\n additionalFilters.push({\n isDefiningCondition: false,\n concreteType:\n 'org.sagebionetworks.repo.model.table.ColumnSingleValueQueryFilter',\n columnName: 'portalType',\n operator: ColumnSingleValueFilterOperator.EQUAL,\n values: [filterByType],\n })\n }\n const sourceAppConfigs = useSourceAppConfigs(\n sourceAppConfigTableID,\n additionalFilters,\n )\n\n return (\n <Popover\n open={open}\n anchorEl={anchorEl}\n onClose={onClose}\n sx={{ width: '90%', height: '90%' }}\n anchorOrigin={{ vertical: 'bottom', horizontal: 'center' }}\n transformOrigin={{ vertical: 'top', horizontal: 'center' }}\n >\n <Grid container spacing={2} sx={{ p: '24px' }}>\n <Grid size={{ xs: 12, lg: 3 }}>\n <Box sx={{ p: theme.spacing(4), pr: '5px' }}>\n <Typography\n variant=\"headline1\"\n sx={{ fontSize: '30px', pb: '30px', fontWeight: 600 }}\n >\n {resourceName}\n </Typography>\n <Typography variant=\"body1\" sx={{ pb: '10px', fontWeight: 500 }}>\n {description}\n </Typography>\n {allResourcesUrl && (\n <Button\n type=\"button\"\n color=\"primary\"\n variant=\"contained\"\n sx={{\n p: '10px 50px',\n mt: '30px',\n height: '100%',\n '&:hover': { color: 'white' },\n }}\n href={allResourcesUrl}\n >\n See all {resourceName}\n </Button>\n )}\n </Box>\n </Grid>\n\n <Grid size={{ xs: 12, lg: 9 }}>\n <Grid container>\n {sourceAppConfigs\n ?.filter(config => {\n if (config.appURL.toLowerCase().startsWith('http')) {\n const url = new URL(config.appURL)\n return url.hostname !== hostname\n }\n return true\n })\n .map(config => (\n <Grid\n key={config.appId}\n size={{ xs: 12, sm: 6, lg: 4 }}\n className=\"sourceAppItem\"\n sx={{\n p: '30px',\n border: '1px solid #F1F3F5',\n '&:hover': {\n backgroundColor: '#d7dee433',\n cursor: 'pointer',\n },\n }}\n >\n <div\n onClick={() => {\n window.open(config.appURL, '_blank')\n onClose()\n }}\n >\n <Box\n sx={{\n pb: '10px',\n img: {\n maxHeight: '50px',\n height: '50px',\n maxWidth: '100%',\n },\n }}\n >\n {config.logo}\n </Box>\n <Typography variant=\"body1\" sx={{ fontWeight: 500 }}>\n {config.shortDescription}\n </Typography>\n </div>\n </Grid>\n ))}\n </Grid>\n </Grid>\n </Grid>\n </Popover>\n )\n}\n"],"mappings":";;;;;;AAiBA,SAAgB,EAAqB,EACnC,4BAAyB,eACzB,aACA,YACA,kBAAe,WACf,iBAAc,kJACd,iBACA,sBAC4B;CAC5B,IAAM,IAAQ,GAAU,EAClB,IAAO,EAAQ,GACf,IAAW,OAAO,SAAW,MAAc,OAAO,SAAS,WAAW,IAEtE,IAAoD,CACxD;EACE,cACE;EACF,YAAY;EACZ,UAAU,EAAgC;EAC1C,QAAQ,CAAC,OAAO;EACjB,CACF;AACD,CAAI,KACF,EAAkB,KAAK;EACrB,qBAAqB;EACrB,cACE;EACF,YAAY;EACZ,UAAU,EAAgC;EAC1C,QAAQ,CAAC,EAAa;EACvB,CAAC;CAEJ,IAAM,IAAmB,EACvB,GACA,EACD;AAED,QACE,kBAAC,GAAD;EACQ;EACI;EACD;EACT,IAAI;GAAE,OAAO;GAAO,QAAQ;GAAO;EACnC,cAAc;GAAE,UAAU;GAAU,YAAY;GAAU;EAC1D,iBAAiB;GAAE,UAAU;GAAO,YAAY;GAAU;YAE1D,kBAAC,GAAD;GAAM,WAAA;GAAU,SAAS;GAAG,IAAI,EAAE,GAAG,QAAQ;aAA7C,CACE,kBAAC,GAAD;IAAM,MAAM;KAAE,IAAI;KAAI,IAAI;KAAG;cAC3B,kBAAC,GAAD;KAAK,IAAI;MAAE,GAAG,EAAM,QAAQ,EAAE;MAAE,IAAI;MAAO;eAA3C;MACE,kBAAC,GAAD;OACE,SAAQ;OACR,IAAI;QAAE,UAAU;QAAQ,IAAI;QAAQ,YAAY;QAAK;iBAEpD;OACU,CAAA;MACb,kBAAC,GAAD;OAAY,SAAQ;OAAQ,IAAI;QAAE,IAAI;QAAQ,YAAY;QAAK;iBAC5D;OACU,CAAA;MACZ,KACC,kBAAC,GAAD;OACE,MAAK;OACL,OAAM;OACN,SAAQ;OACR,IAAI;QACF,GAAG;QACH,IAAI;QACJ,QAAQ;QACR,WAAW,EAAE,OAAO,SAAS;QAC9B;OACD,MAAM;iBAVR,CAWC,YACU,EACF;;MAEP;;IACD,CAAA,EAEP,kBAAC,GAAD;IAAM,MAAM;KAAE,IAAI;KAAI,IAAI;KAAG;cAC3B,kBAAC,GAAD;KAAM,WAAA;eACH,GACG,QAAO,MACH,EAAO,OAAO,aAAa,CAAC,WAAW,OAAO,GAEzC,IADS,IAAI,EAAO,OACpB,CAAI,aAAa,IAEnB,GACP,CACD,KAAI,MACH,kBAAC,GAAD;MAEE,MAAM;OAAE,IAAI;OAAI,IAAI;OAAG,IAAI;OAAG;MAC9B,WAAU;MACV,IAAI;OACF,GAAG;OACH,QAAQ;OACR,WAAW;QACT,iBAAiB;QACjB,QAAQ;QACT;OACF;gBAED,kBAAC,OAAD;OACE,eAAe;AAEb,QADA,OAAO,KAAK,EAAO,QAAQ,SAAS,EACpC,GAAS;;iBAHb,CAME,kBAAC,GAAD;QACE,IAAI;SACF,IAAI;SACJ,KAAK;UACH,WAAW;UACX,QAAQ;UACR,UAAU;UACX;SACF;kBAEA,EAAO;QACJ,CAAA,EACN,kBAAC,GAAD;QAAY,SAAQ;QAAQ,IAAI,EAAE,YAAY,KAAK;kBAChD,EAAO;QACG,CAAA,CACT;;MACD,EAlCA,EAAO,MAkCP,CACP;KACC,CAAA;IACF,CAAA,CACF;;EACC,CAAA"}
|