synapse-react-client 4.0.9 → 4.0.11
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/CloudWarning.d.ts +5 -0
- package/dist/assets/icons/CloudWarning.d.ts.map +1 -0
- package/dist/assets/icons/CloudWarning.js +47 -0
- package/dist/assets/icons/CloudWarning.js.map +1 -0
- 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.d.ts.map +1 -1
- package/dist/components/ChallengeSubmission/SubmissionDirectoryList.js +143 -140
- 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 +124 -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.d.ts +1 -1
- package/dist/components/DataGrid/utils/applyModelChange.d.ts.map +1 -1
- package/dist/components/DataGrid/utils/applyModelChange.js +27 -24
- package/dist/components/DataGrid/utils/applyModelChange.js.map +1 -1
- package/dist/components/DataGrid/utils/columnFactory.d.ts +8 -0
- package/dist/components/DataGrid/utils/columnFactory.d.ts.map +1 -1
- package/dist/components/DataGrid/utils/columnFactory.js +47 -44
- 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/getEmptyValue.d.ts +2 -0
- package/dist/components/DataGrid/utils/getEmptyValue.d.ts.map +1 -0
- package/dist/components/DataGrid/utils/getEmptyValue.js +8 -0
- package/dist/components/DataGrid/utils/getEmptyValue.js.map +1 -0
- package/dist/components/DataGrid/utils/json-rx/JsonRx.js.map +1 -1
- package/dist/components/DataGrid/utils/modelColsToGrid.d.ts.map +1 -1
- package/dist/components/DataGrid/utils/modelColsToGrid.js +2 -1
- package/dist/components/DataGrid/utils/modelColsToGrid.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/schemaAwarePasteValue.d.ts +32 -0
- package/dist/components/DataGrid/utils/schemaAwarePasteValue.d.ts.map +1 -0
- package/dist/components/DataGrid/utils/schemaAwarePasteValue.js +22 -0
- package/dist/components/DataGrid/utils/schemaAwarePasteValue.js.map +1 -0
- 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.css +1 -0
- package/dist/components/DownloadCart/DownloadIneligibleForPackagingFilesFromListButton.d.ts.map +1 -1
- package/dist/components/DownloadCart/DownloadIneligibleForPackagingFilesFromListButton.js +199 -132
- package/dist/components/DownloadCart/DownloadIneligibleForPackagingFilesFromListButton.js.map +1 -1
- package/dist/components/DownloadCart/DownloadIneligibleForPackagingFilesFromListButton.module.js +22 -0
- package/dist/components/DownloadCart/DownloadIneligibleForPackagingFilesFromListButton.module.js.map +1 -0
- package/dist/components/DownloadCart/DownloadIneligibleForPackagingFilesFromListButton.module.scss +170 -0
- 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.d.ts.map +1 -1
- package/dist/components/EntityDownloadButton/EntityDownloadButton.js +1 -0
- 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/EntityViewScopeEditor/EntityViewMaskEditor.d.ts.map +1 -1
- package/dist/components/EntityViewScopeEditor/EntityViewMaskEditor.js +15 -14
- package/dist/components/EntityViewScopeEditor/EntityViewMaskEditor.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.d.ts +1 -0
- package/dist/components/Forum/DiscussionReply.d.ts.map +1 -1
- package/dist/components/Forum/DiscussionReply.js +19 -19
- package/dist/components/Forum/DiscussionReply.js.map +1 -1
- package/dist/components/Forum/DiscussionSearchResult.js.map +1 -1
- package/dist/components/Forum/DiscussionThread.d.ts +1 -0
- package/dist/components/Forum/DiscussionThread.d.ts.map +1 -1
- package/dist/components/Forum/DiscussionThread.js +73 -72
- package/dist/components/Forum/DiscussionThread.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/BioregistryRules.d.ts.map +1 -1
- package/dist/components/GenericCard/BioregistryRules.js +7 -3
- package/dist/components/GenericCard/BioregistryRules.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/IconSvg/IconSvg.d.ts.map +1 -1
- package/dist/components/IconSvg/IconSvg.js +2 -1
- package/dist/components/IconSvg/IconSvg.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.d.ts.map +1 -1
- package/dist/components/dataaccess/SubmissionPage/SubmissionPage.js +157 -148
- 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.d.ts.map +1 -1
- package/dist/components/doi/CreateOrUpdateDoiModal.js +20 -19
- 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.d.ts.map +1 -1
- package/dist/features/entity/metadata-task/components/MetadataTasksTableAssigneeCell.js +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/KeyFactory.d.ts +1 -0
- package/dist/synapse-queries/KeyFactory.d.ts.map +1 -1
- package/dist/synapse-queries/KeyFactory.js +3 -0
- package/dist/synapse-queries/KeyFactory.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.d.ts +1 -0
- package/dist/synapse-queries/forum/useThread.d.ts.map +1 -1
- package/dist/synapse-queries/forum/useThread.js +19 -12
- 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/APIConstants.d.ts +1 -0
- package/dist/utils/APIConstants.d.ts.map +1 -1
- package/dist/utils/APIConstants.js +2 -2
- package/dist/utils/APIConstants.js.map +1 -1
- package/dist/utils/AppUtils/session/ApplicationSessionManager.d.ts.map +1 -1
- package/dist/utils/AppUtils/session/ApplicationSessionManager.js +7 -4
- package/dist/utils/AppUtils/session/ApplicationSessionManager.js.map +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/EntityTypeUtils.d.ts.map +1 -1
- package/dist/utils/functions/EntityTypeUtils.js +15 -4
- package/dist/utils/functions/EntityTypeUtils.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 +5 -5
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"EntityDownloadButton.js","names":[],"sources":["../../../src/components/EntityDownloadButton/EntityDownloadButton.tsx"],"sourcesContent":["import { useGetEntity, useGetVersions } from '@/synapse-queries'\nimport {\n useAddFileToDownloadList,\n useGetAddToDownloadListStats,\n} from '@/synapse-queries/index'\nimport { useSynapseContext } from '@/utils'\nimport {\n entityTypeToFriendlyName,\n hasFilesInView,\n isContainerType,\n isDataset,\n isEntityView,\n isVersionableEntity,\n} from '@/utils/functions/EntityTypeUtils'\nimport { useDirectDownloadHandler } from '@/utils/hooks/useDirectDownloadHandler'\nimport { isFileEntity } from '@/utils/types/IsType'\nimport { DownloadOutlined as DownloadIcon } from '@mui/icons-material'\nimport { EntityType } from '@sage-bionetworks/synapse-client'\nimport {\n FileHandleAssociateType,\n QueryBundleRequest,\n} from '@sage-bionetworks/synapse-types'\nimport { RefObject, useState } from 'react'\nimport { createPortal } from 'react-dom'\nimport { displayFilesWereAddedToDownloadListSuccess } from '../download_list/DownloadConfirmationUtils'\nimport { EntityDownloadConfirmation } from '../EntityDownloadConfirmation'\nimport { DropdownMenu, DropdownMenuItem } from '../menu/DropdownMenu'\nimport { ModalDownload } from '../ModalDownload/ModalDownload'\nimport { ProgrammaticInstructionsModal } from '../ProgrammaticInstructionsModal/ProgrammaticInstructionsModal'\nimport { displayToast } from '../ToastMessage/index'\n\n// WIP\n// Per Nick Grosenbacher: For this to be reusable, I think we would also need to accept versionNumber as a prop. Where we would have the following behavior:\n// - If the version number is present, use it\n// - If the version number is null, do not use it,\n// - If the version number is undefined, then we would try to do the 'smart' thing-- get the latest version for datasets, otherwise don't use it.\n\n// Have to keep these consts outside of getProgrammaticAccessCode because\n// they are being called in ProgrammaticTableDownload.tsx\n// Python client import and login instructions\nexport const PYTHON_CLIENT_IMPORT_AND_LOGIN = `import synapseclient\nsyn = synapseclient.Synapse()\nsyn.login(authToken=\"YOUR_TOKEN_HERE\")`\n\n// R client import and login instructions\nexport const R_CLIENT_IMPORT_AND_LOGIN = `library(synapser)\nsynLogin(authToken=\"YOUR_TOKEN_HERE\")`\n\ntype ProgrammaticAccessCode = {\n cliCode: string | undefined\n rCode: string | undefined\n pythonCode: string | undefined\n}\n\n// Generate programmatic access code snippet content based on entity type\nfunction getProgrammaticAccessCode(\n type: EntityType,\n entityId: string,\n version: number | undefined,\n): ProgrammaticAccessCode {\n const id =\n type === EntityType.dataset && version ? `${entityId}.${version}` : entityId\n switch (type) {\n case EntityType.file:\n case EntityType.folder:\n case EntityType.project:\n case EntityType.link:\n return {\n cliCode: `synapse get -r ${entityId}`,\n rCode: `${R_CLIENT_IMPORT_AND_LOGIN} \\n\n# Download file\nsynGet('${entityId}')`,\n pythonCode: `${PYTHON_CLIENT_IMPORT_AND_LOGIN} \\n\n# Download file\nsyn.get('${entityId}')`,\n }\n case EntityType.dockerrepo:\n return {\n cliCode: `docker login -u <synapse username> -p <synapse password> docker.synapse.org \\n\ndocker pull docker.synapse.org/${entityId}/myrepo`,\n rCode: undefined,\n pythonCode: undefined,\n }\n case EntityType.dataset:\n case EntityType.entityview:\n case EntityType.datasetcollection:\n case EntityType.table:\n case EntityType.materializedview:\n case EntityType.submissionview:\n case EntityType.virtualtable:\n case EntityType.recordset:\n return {\n cliCode: `synapse get -q \"SELECT * FROM ${id}\"`,\n rCode: `${R_CLIENT_IMPORT_AND_LOGIN} \\n\nquery <- synTableQuery(\"SELECT * FROM ${id}\")\nread.table(query$filepath, sep=\",\")`,\n pythonCode: `${PYTHON_CLIENT_IMPORT_AND_LOGIN} \\n\nquery = syn.tableQuery(\"SELECT * FROM ${id}\")\nquery.asDataFrame()`,\n }\n default:\n throw new Error(`Unhandled EntityType: ${type}`)\n }\n}\n\nenum DownloadAction {\n downloadFile,\n addToCart,\n programmaticAccess,\n programmaticAccessDocker,\n exportTable,\n}\n\n// Function that creates menu items for download actions\nfunction getMenuItemForAction(\n entityId: string,\n entityName: string,\n entityType: EntityType,\n downloadAction: DownloadAction,\n setShowProgrammaticAccess: (show: boolean) => void,\n setShowExportMetadata: (show: boolean) => void,\n addFileToDownloadList: (params: {\n entityId: string\n entityVersionNumber: number | undefined\n }) => void,\n setShowDownloadConfirmation: (show: boolean) => void,\n versionNumber?: number,\n addToCartDisabled?: boolean,\n onDownloadFile?: () => void,\n isAuthenticated?: boolean,\n): DropdownMenuItem {\n switch (downloadAction) {\n case DownloadAction.downloadFile:\n return {\n text: 'Download File',\n onClick: () => {\n if (onDownloadFile) onDownloadFile()\n },\n tooltipText: isAuthenticated\n ? 'Download this file directly'\n : 'Sign in to download this file',\n disabled: !isAuthenticated,\n }\n case DownloadAction.addToCart:\n return {\n text: 'Add to Download List',\n disabled: addToCartDisabled,\n tooltipText: getAddToCartTooltip(entityType, !!addToCartDisabled),\n onClick: () => {\n if (\n entityType === EntityType.file ||\n entityType === EntityType.recordset\n ) {\n addFileToDownloadList({\n entityId,\n entityVersionNumber: versionNumber,\n })\n } else {\n setShowDownloadConfirmation(true)\n }\n },\n }\n case DownloadAction.programmaticAccess:\n return {\n text: 'Programmatic Access',\n onClick: () => {\n setShowProgrammaticAccess(true)\n },\n tooltipText: 'View programmatic access options',\n }\n case DownloadAction.programmaticAccessDocker:\n return {\n text: 'Programmatic Access (Docker)',\n onClick: () => {\n setShowProgrammaticAccess(true)\n },\n tooltipText: 'View programmatic options to pull Docker image',\n }\n case DownloadAction.exportTable:\n return {\n text: 'Export Table',\n onClick: () => {\n setShowExportMetadata(true)\n },\n tooltipText: 'Export table data',\n }\n }\n}\n\n/**\n * Determines the tooltip message based on the entity type and its \"add to cart\" status.\n */\nconst getAddToCartTooltip = (\n entityType: EntityType,\n isDisabled: boolean,\n): string => {\n if (!isDisabled) {\n return 'Add file(s) to your download list'\n }\n const entityFriendlyName = entityTypeToFriendlyName(entityType)\n return `This ${entityFriendlyName} has no accessible files`\n}\n\n// Function that returns DropdownMenuItem\nexport function getDownloadActionsForEntityType(\n type: EntityType,\n): DownloadAction[][] {\n switch (type) {\n case EntityType.file:\n case EntityType.recordset:\n return [\n [DownloadAction.downloadFile],\n [DownloadAction.addToCart, DownloadAction.programmaticAccess],\n ]\n case EntityType.project:\n case EntityType.folder:\n return [[DownloadAction.addToCart, DownloadAction.programmaticAccess]]\n case EntityType.dockerrepo:\n return [[DownloadAction.programmaticAccessDocker]]\n case EntityType.entityview:\n case EntityType.dataset:\n return [\n [\n DownloadAction.exportTable,\n DownloadAction.programmaticAccess,\n DownloadAction.addToCart,\n ],\n ]\n case EntityType.datasetcollection:\n case EntityType.table:\n case EntityType.materializedview:\n case EntityType.submissionview:\n case EntityType.virtualtable:\n return [[DownloadAction.exportTable, DownloadAction.programmaticAccess]]\n case EntityType.link:\n return [[DownloadAction.programmaticAccess]]\n default:\n // this will fail if a new EntityType is added and not handled\n throw new Error(`Unhandled EntityType: ${type}`)\n }\n}\n\n// get the appropriate version number for download based on entity type\n// for datasets: returns the most recent released version if any exist, undefined otherwise\n// for other entities: returns the current version number\nfunction useGetLatestVersionNumber(entityId: string, entityType: EntityType) {\n // get entity data\n const { data: entityData, isLoading: entityDataLoading } =\n useGetEntity(entityId) // No version = latest\n\n // for datasets, check if any versions exist and use the most recent one\n const mustGetVersion = entityType === EntityType.dataset\n const { data: versionsData, isLoading: versionsLoading } = useGetVersions(\n entityId,\n 0,\n 1,\n {\n enabled: mustGetVersion,\n },\n )\n\n let latestVersionNumber: number | undefined\n\n if (mustGetVersion) {\n // for datasets, check if any versions exist\n if (versionsData?.results && versionsData.results.length > 0) {\n // Use the most recent released version (first in the list, since versions are returned in descending order)\n latestVersionNumber = versionsData.results[0].versionNumber\n } else {\n // no versions exist, use undefined (will use current/draft version)\n latestVersionNumber = undefined\n }\n } else {\n // for non-datasets, use the entity's version number\n latestVersionNumber =\n entityData && isVersionableEntity(entityData)\n ? entityData.versionNumber\n : undefined\n }\n\n const isLoading = entityDataLoading || versionsLoading\n\n return { latestVersionNumber, isLoading }\n}\n\n// create default queryBundleRequest with appropriate SQL\nfunction getDefaultQueryBundleRequestForEntity(\n entityId: string,\n versionNumber: number | undefined,\n entityType: EntityType,\n): QueryBundleRequest {\n let sql: string\n\n if (entityType === EntityType.dataset) {\n // for datasets:\n // - if a version number exists (released version), use it: syn123.5\n // - if no version number (no released versions), use current/draft: syn123\n sql = versionNumber\n ? `SELECT * FROM ${entityId}.${versionNumber}`\n : `SELECT * FROM ${entityId}`\n } else {\n // For non-datasets, always use entity ID without version\n sql = `SELECT * FROM ${entityId}`\n }\n\n return {\n concreteType: 'org.sagebionetworks.repo.model.table.QueryBundleRequest',\n entityId: `${entityId}`,\n query: {\n sql: sql,\n },\n partMask: 0,\n }\n}\n\nexport function EntityDownloadButton(props: {\n entityId: string\n name: string\n entityType: EntityType\n downloadConfirmationContainer?: RefObject<HTMLElement | null>\n disabled?: boolean\n}) {\n // get the appropriate version number for the entity\n const { latestVersionNumber } = useGetLatestVersionNumber(\n props.entityId,\n props.entityType,\n )\n // create queryBundleRequest with appropriate SQL based on entity type and version\n const defaultQueryBundleRequest = getDefaultQueryBundleRequestForEntity(\n props.entityId,\n latestVersionNumber,\n props.entityType,\n )\n\n // Get context and download functionality\n const { downloadCartPageUrl, isAuthenticated } = useSynapseContext()\n const { mutate: addFileToDownloadList } = useAddFileToDownloadList({\n onSuccess: data => {\n if (data.numberOfFilesAdded > 0) {\n displayFilesWereAddedToDownloadListSuccess(downloadCartPageUrl)\n } else {\n displayToast('0 Files added to your Download List', 'info')\n }\n },\n onError: error => {\n displayToast(error.reason, 'danger')\n },\n })\n\n // state to manage programmatic access modal visibility\n const [showProgrammaticAccess, setShowProgrammaticAccess] =\n useState<boolean>(false)\n\n // state to manage download confirmation visibility and loading\n const [showDownloadConfirmation, setShowDownloadConfirmation] =\n useState<boolean>(false)\n const [downloadConfirmationLoading, setDownloadConfirmationLoading] =\n useState<boolean>(false)\n\n const handleCloseProgrammaticAccess = () => {\n setShowProgrammaticAccess(false)\n }\n\n const isFolderOrProject = isContainerType(props.entityType)\n\n const {\n data: folderOrProjectStats,\n isLoading: isLoadingFolderOrProjectStats,\n } = useGetAddToDownloadListStats(\n {\n concreteType:\n 'org.sagebionetworks.repo.model.download.AddToDownloadListStatsRequest',\n request: {\n parentId: props.entityId,\n concreteType:\n 'org.sagebionetworks.repo.model.download.AddToDownloadListRequest',\n recursive: true,\n },\n },\n {\n enabled: isFolderOrProject,\n },\n )\n\n const folderOrProjectHasNoFiles =\n isFolderOrProject &&\n (isLoadingFolderOrProjectStats || folderOrProjectStats?.fileCount === 0)\n\n const { data: entityData } = useGetEntity(props.entityId)\n\n const { downloadFile } = useDirectDownloadHandler()\n\n const fileHandleId =\n entityData && isFileEntity(entityData)\n ? entityData.dataFileHandleId\n : undefined\n\n const onDownloadFile = fileHandleId\n ? () => {\n void downloadFile({\n fileHandleId,\n associatedObjectId: props.entityId,\n associatedObjectType: FileHandleAssociateType.FileEntity,\n })\n }\n : undefined\n\n const entityViewHasNoFiles =\n entityData && isEntityView(entityData) && !hasFilesInView(entityData)\n\n const datasetHasNoFiles =\n entityData &&\n isDataset(entityData) &&\n (!entityData.items || entityData.items.length === 0)\n\n const addToCartDisabled =\n folderOrProjectHasNoFiles || entityViewHasNoFiles || datasetHasNoFiles\n\n // state to manage export metadata modal visibility\n const [showExportMetadata, setShowExportMetadata] = useState<boolean>(false)\n\n const handleCloseExportMetadata = () => {\n setShowExportMetadata(false)\n }\n\n // Create download menu items\n const downloadActions = getDownloadActionsForEntityType(props.entityType)\n const downloadMenuItems = downloadActions.map(actionGroup =>\n actionGroup.map(action =>\n getMenuItemForAction(\n props.entityId,\n props.name,\n props.entityType,\n action,\n setShowProgrammaticAccess,\n setShowExportMetadata,\n addFileToDownloadList,\n setShowDownloadConfirmation,\n latestVersionNumber,\n addToCartDisabled,\n onDownloadFile,\n isAuthenticated,\n ),\n ),\n )\n\n // Return programmatic access modal content\n const { cliCode, rCode, pythonCode } = getProgrammaticAccessCode(\n props.entityType,\n props.entityId,\n latestVersionNumber,\n )\n\n const downloadConfirmation = showDownloadConfirmation ? (\n <EntityDownloadConfirmation\n entityId={props.entityId}\n handleClose={() => setShowDownloadConfirmation(false)}\n onIsLoadingChange={setDownloadConfirmationLoading}\n />\n ) : null\n\n return (\n <>\n <DropdownMenu\n items={downloadMenuItems}\n dropdownButtonText=\"Download\"\n buttonTooltip=\"Download options for this entity\"\n buttonProps={{\n variant: 'outlined',\n startIcon: <DownloadIcon />,\n disabled: props.disabled || downloadConfirmationLoading,\n }}\n />\n {downloadConfirmation &&\n (props.downloadConfirmationContainer?.current\n ? createPortal(\n downloadConfirmation,\n props.downloadConfirmationContainer.current,\n )\n : downloadConfirmation)}\n <ProgrammaticInstructionsModal\n show={showProgrammaticAccess}\n title={`Programmatic Access: ${props.name}`}\n onClose={handleCloseProgrammaticAccess}\n pythonCode={pythonCode}\n rCode={rCode}\n cliCode={cliCode}\n helpUrl=\"https://help.synapse.org/docs/Synapse-Docker-Registry.2011037752.html#SynapseDockerRegistry-UsingDockerImagesStoredintheSynapseDockerRegistry\"\n />\n {showExportMetadata && (\n <ModalDownload\n queryBundleRequest={defaultQueryBundleRequest}\n onClose={handleCloseExportMetadata}\n />\n )}\n </>\n )\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;AAwCA,IAAa,IAAiC,iGAKjC,IAA4B;AAUzC,SAAS,EACP,GACA,GACA,GACwB;CACxB,IAAM,IACJ,MAAS,EAAW,WAAW,IAAU,GAAG,EAAS,GAAG,MAAY;AACtE,SAAQ,GAAR;EACE,KAAK,EAAW;EAChB,KAAK,EAAW;EAChB,KAAK,EAAW;EAChB,KAAK,EAAW,KACd,QAAO;GACL,SAAS,kBAAkB;GAC3B,OAAO,GAAG,EAA0B;;UAElC,EAAS;GACX,YAAY,GAAG,EAA+B;;WAE3C,EAAS;GACb;EACH,KAAK,EAAW,WACd,QAAO;GACL,SAAS;iCACgB,EAAS;GAClC,OAAO,KAAA;GACP,YAAY,KAAA;GACb;EACH,KAAK,EAAW;EAChB,KAAK,EAAW;EAChB,KAAK,EAAW;EAChB,KAAK,EAAW;EAChB,KAAK,EAAW;EAChB,KAAK,EAAW;EAChB,KAAK,EAAW;EAChB,KAAK,EAAW,UACd,QAAO;GACL,SAAS,iCAAiC,EAAG;GAC7C,OAAO,GAAG,EAA0B;wCACJ,EAAG;;GAEnC,YAAY,GAAG,EAA+B;wCACd,EAAG;;GAEpC;EACH,QACE,OAAU,MAAM,yBAAyB,IAAO;;;AAItD,IAAK,IAAL,yBAAA,GAAA;QACE,EAAA,EAAA,eAAA,KAAA,gBACA,EAAA,EAAA,YAAA,KAAA,aACA,EAAA,EAAA,qBAAA,KAAA,sBACA,EAAA,EAAA,2BAAA,KAAA,4BACA,EAAA,EAAA,cAAA,KAAA;EALG,KAAA,EAAA,CAMJ;AAGD,SAAS,EACP,GACA,GACA,GACA,GACA,GACA,GACA,GAIA,GACA,GACA,GACA,GACA,GACkB;AAClB,SAAQ,GAAR;EACE,KAAK,EAAe,aAClB,QAAO;GACL,MAAM;GACN,eAAe;AACb,IAAI,KAAgB,GAAgB;;GAEtC,aAAa,IACT,gCACA;GACJ,UAAU,CAAC;GACZ;EACH,KAAK,EAAe,UAClB,QAAO;GACL,MAAM;GACN,UAAU;GACV,aAAa,EAAoB,GAAY,CAAC,CAAC,EAAkB;GACjE,eAAe;AACb,IACE,MAAe,EAAW,QAC1B,MAAe,EAAW,YAE1B,EAAsB;KACpB;KACA,qBAAqB;KACtB,CAAC,GAEF,EAA4B,GAAK;;GAGtC;EACH,KAAK,EAAe,mBAClB,QAAO;GACL,MAAM;GACN,eAAe;AACb,MAA0B,GAAK;;GAEjC,aAAa;GACd;EACH,KAAK,EAAe,yBAClB,QAAO;GACL,MAAM;GACN,eAAe;AACb,MAA0B,GAAK;;GAEjC,aAAa;GACd;EACH,KAAK,EAAe,YAClB,QAAO;GACL,MAAM;GACN,eAAe;AACb,MAAsB,GAAK;;GAE7B,aAAa;GACd;;;AAOP,IAAM,KACJ,GACA,MAEK,IAIE,QADoB,EAAyB,EAAW,CAC7B,4BAHzB;AAOX,SAAgB,EACd,GACoB;AACpB,SAAQ,GAAR;EACE,KAAK,EAAW;EAChB,KAAK,EAAW,UACd,QAAO,CACL,CAAC,EAAe,aAAa,EAC7B,CAAC,EAAe,WAAW,EAAe,mBAAmB,CAC9D;EACH,KAAK,EAAW;EAChB,KAAK,EAAW,OACd,QAAO,CAAC,CAAC,EAAe,WAAW,EAAe,mBAAmB,CAAC;EACxE,KAAK,EAAW,WACd,QAAO,CAAC,CAAC,EAAe,yBAAyB,CAAC;EACpD,KAAK,EAAW;EAChB,KAAK,EAAW,QACd,QAAO,CACL;GACE,EAAe;GACf,EAAe;GACf,EAAe;GAChB,CACF;EACH,KAAK,EAAW;EAChB,KAAK,EAAW;EAChB,KAAK,EAAW;EAChB,KAAK,EAAW;EAChB,KAAK,EAAW,aACd,QAAO,CAAC,CAAC,EAAe,aAAa,EAAe,mBAAmB,CAAC;EAC1E,KAAK,EAAW,KACd,QAAO,CAAC,CAAC,EAAe,mBAAmB,CAAC;EAC9C,QAEE,OAAU,MAAM,yBAAyB,IAAO;;;AAOtD,SAAS,EAA0B,GAAkB,GAAwB;CAE3E,IAAM,EAAE,MAAM,GAAY,WAAW,MACnC,EAAa,EAAS,EAGlB,IAAiB,MAAe,EAAW,SAC3C,EAAE,MAAM,GAAc,WAAW,MAAoB,EACzD,GACA,GACA,GACA,EACE,SAAS,GACV,CACF,EAEG;AAqBJ,QAnBA,AAWE,IAXE,IAEE,GAAc,WAAW,EAAa,QAAQ,SAAS,IAEnC,EAAa,QAAQ,GAAG,gBAGxB,KAAA,IAKtB,KAAc,EAAoB,EAAW,GACzC,EAAW,gBACX,KAAA,GAKD;EAAE;EAAqB,WAFZ,KAAqB;EAEE;;AAI3C,SAAS,EACP,GACA,GACA,GACoB;CACpB,IAAI;AAcJ,QAZA,AASE,IATE,MAAe,EAAW,WAItB,IACF,iBAAiB,EAAS,GAAG,MAC7B,iBAAiB,KAMhB;EACL,cAAc;EACd,UAAU,GAAG;EACb,OAAO,EACA,QACN;EACD,UAAU;EACX;;AAGH,SAAgB,EAAqB,GAMlC;CAED,IAAM,EAAE,2BAAwB,EAC9B,EAAM,UACN,EAAM,WACP,EAEK,IAA4B,EAChC,EAAM,UACN,GACA,EAAM,WACP,EAGK,EAAE,wBAAqB,uBAAoB,GAAmB,EAC9D,EAAE,QAAQ,MAA0B,EAAyB;EACjE,YAAW,MAAQ;AACjB,GAAI,EAAK,qBAAqB,IAC5B,EAA2C,EAAoB,GAE/D,EAAa,uCAAuC,OAAO;;EAG/D,UAAS,MAAS;AAChB,KAAa,EAAM,QAAQ,SAAS;;EAEvC,CAAC,EAGI,CAAC,GAAwB,KAC7B,EAAkB,GAAM,EAGpB,CAAC,GAA0B,KAC/B,EAAkB,GAAM,EACpB,CAAC,GAA6B,KAClC,EAAkB,GAAM,EAEpB,UAAsC;AAC1C,IAA0B,GAAM;IAG5B,IAAoB,EAAgB,EAAM,WAAW,EAErD,EACJ,MAAM,GACN,WAAW,MACT,EACF;EACE,cACE;EACF,SAAS;GACP,UAAU,EAAM;GAChB,cACE;GACF,WAAW;GACZ;EACF,EACD,EACE,SAAS,GACV,CACF,EAEK,IACJ,MACC,KAAiC,GAAsB,cAAc,IAElE,EAAE,MAAM,MAAe,EAAa,EAAM,SAAS,EAEnD,EAAE,oBAAiB,GAA0B,EAE7C,IACJ,KAAc,EAAa,EAAW,GAClC,EAAW,mBACX,KAAA,GAEA,IAAiB,UACb;AACC,IAAa;GAChB;GACA,oBAAoB,EAAM;GAC1B,sBAAsB,EAAwB;GAC/C,CAAC;KAEJ,KAAA,GAEE,IACJ,KAAc,EAAa,EAAW,IAAI,CAAC,EAAe,EAAW,EAEjE,IACJ,KACA,EAAU,EAAW,KACpB,CAAC,EAAW,SAAS,EAAW,MAAM,WAAW,IAE9C,IACJ,KAA6B,KAAwB,GAGjD,CAAC,GAAoB,KAAyB,EAAkB,GAAM,EAEtE,WAAkC;AACtC,IAAsB,GAAM;IAKxB,KADkB,EAAgC,EAAM,WAAW,CAC/B,KAAI,MAC5C,EAAY,KAAI,MACd,EACE,EAAM,UACN,EAAM,MACN,EAAM,YACN,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,EACD,CACF,CACF,EAGK,EAAE,aAAS,WAAO,mBAAe,EACrC,EAAM,YACN,EAAM,UACN,EACD,EAEK,IAAuB,IAC3B,kBAAC,GAAD;EACE,UAAU,EAAM;EAChB,mBAAmB,EAA4B,GAAM;EACrD,mBAAmB;EACnB,CAAA,GACA;AAEJ,QACE,mBAAA,GAAA,EAAA,UAAA;EACE,kBAAC,GAAD;GACE,OAAO;GACP,oBAAmB;GACnB,eAAc;GACd,aAAa;IACX,SAAS;IACT,WAAW,kBAAC,GAAD,EAAgB,CAAA;IAC3B,UAAU,EAAM,YAAY;IAC7B;GACD,CAAA;EACD,MACE,EAAM,+BAA+B,UAClC,EACE,GACA,EAAM,8BAA8B,QACrC,GACD;EACN,kBAAC,GAAD;GACE,MAAM;GACN,OAAO,wBAAwB,EAAM;GACrC,SAAS;GACG;GACL;GACE;GACT,SAAQ;GACR,CAAA;EACD,KACC,kBAAC,GAAD;GACE,oBAAoB;GACpB,SAAS;GACT,CAAA;EAEH,EAAA,CAAA"}
|
|
1
|
+
{"version":3,"file":"EntityDownloadButton.js","names":[],"sources":["../../../src/components/EntityDownloadButton/EntityDownloadButton.tsx"],"sourcesContent":["import { useGetEntity, useGetVersions } from '@/synapse-queries'\nimport {\n useAddFileToDownloadList,\n useGetAddToDownloadListStats,\n} from '@/synapse-queries/index'\nimport { useSynapseContext } from '@/utils'\nimport {\n entityTypeToFriendlyName,\n hasFilesInView,\n isContainerType,\n isDataset,\n isEntityView,\n isVersionableEntity,\n} from '@/utils/functions/EntityTypeUtils'\nimport { useDirectDownloadHandler } from '@/utils/hooks/useDirectDownloadHandler'\nimport { isFileEntity } from '@/utils/types/IsType'\nimport { DownloadOutlined as DownloadIcon } from '@mui/icons-material'\nimport { EntityType } from '@sage-bionetworks/synapse-client'\nimport {\n FileHandleAssociateType,\n QueryBundleRequest,\n} from '@sage-bionetworks/synapse-types'\nimport { RefObject, useState } from 'react'\nimport { createPortal } from 'react-dom'\nimport { displayFilesWereAddedToDownloadListSuccess } from '../download_list/DownloadConfirmationUtils'\nimport { EntityDownloadConfirmation } from '../EntityDownloadConfirmation'\nimport { DropdownMenu, DropdownMenuItem } from '../menu/DropdownMenu'\nimport { ModalDownload } from '../ModalDownload/ModalDownload'\nimport { ProgrammaticInstructionsModal } from '../ProgrammaticInstructionsModal/ProgrammaticInstructionsModal'\nimport { displayToast } from '../ToastMessage/index'\n\n// WIP\n// Per Nick Grosenbacher: For this to be reusable, I think we would also need to accept versionNumber as a prop. Where we would have the following behavior:\n// - If the version number is present, use it\n// - If the version number is null, do not use it,\n// - If the version number is undefined, then we would try to do the 'smart' thing-- get the latest version for datasets, otherwise don't use it.\n\n// Have to keep these consts outside of getProgrammaticAccessCode because\n// they are being called in ProgrammaticTableDownload.tsx\n// Python client import and login instructions\nexport const PYTHON_CLIENT_IMPORT_AND_LOGIN = `import synapseclient\nsyn = synapseclient.Synapse()\nsyn.login(authToken=\"YOUR_TOKEN_HERE\")`\n\n// R client import and login instructions\nexport const R_CLIENT_IMPORT_AND_LOGIN = `library(synapser)\nsynLogin(authToken=\"YOUR_TOKEN_HERE\")`\n\ntype ProgrammaticAccessCode = {\n cliCode: string | undefined\n rCode: string | undefined\n pythonCode: string | undefined\n}\n\n// Generate programmatic access code snippet content based on entity type\nfunction getProgrammaticAccessCode(\n type: EntityType,\n entityId: string,\n version: number | undefined,\n): ProgrammaticAccessCode {\n const id =\n type === EntityType.dataset && version ? `${entityId}.${version}` : entityId\n switch (type) {\n case EntityType.file:\n case EntityType.folder:\n case EntityType.project:\n case EntityType.link:\n return {\n cliCode: `synapse get -r ${entityId}`,\n rCode: `${R_CLIENT_IMPORT_AND_LOGIN} \\n\n# Download file\nsynGet('${entityId}')`,\n pythonCode: `${PYTHON_CLIENT_IMPORT_AND_LOGIN} \\n\n# Download file\nsyn.get('${entityId}')`,\n }\n case EntityType.dockerrepo:\n return {\n cliCode: `docker login -u <synapse username> -p <synapse password> docker.synapse.org \\n\ndocker pull docker.synapse.org/${entityId}/myrepo`,\n rCode: undefined,\n pythonCode: undefined,\n }\n case EntityType.dataset:\n case EntityType.entityview:\n case EntityType.datasetcollection:\n case EntityType.table:\n case EntityType.materializedview:\n case EntityType.submissionview:\n case EntityType.virtualtable:\n case EntityType.recordset:\n return {\n cliCode: `synapse get -q \"SELECT * FROM ${id}\"`,\n rCode: `${R_CLIENT_IMPORT_AND_LOGIN} \\n\nquery <- synTableQuery(\"SELECT * FROM ${id}\")\nread.table(query$filepath, sep=\",\")`,\n pythonCode: `${PYTHON_CLIENT_IMPORT_AND_LOGIN} \\n\nquery = syn.tableQuery(\"SELECT * FROM ${id}\")\nquery.asDataFrame()`,\n }\n default:\n throw new Error(`Unhandled EntityType: ${type}`)\n }\n}\n\nenum DownloadAction {\n downloadFile,\n addToCart,\n programmaticAccess,\n programmaticAccessDocker,\n exportTable,\n}\n\n// Function that creates menu items for download actions\nfunction getMenuItemForAction(\n entityId: string,\n entityName: string,\n entityType: EntityType,\n downloadAction: DownloadAction,\n setShowProgrammaticAccess: (show: boolean) => void,\n setShowExportMetadata: (show: boolean) => void,\n addFileToDownloadList: (params: {\n entityId: string\n entityVersionNumber: number | undefined\n }) => void,\n setShowDownloadConfirmation: (show: boolean) => void,\n versionNumber?: number,\n addToCartDisabled?: boolean,\n onDownloadFile?: () => void,\n isAuthenticated?: boolean,\n): DropdownMenuItem {\n switch (downloadAction) {\n case DownloadAction.downloadFile:\n return {\n text: 'Download File',\n onClick: () => {\n if (onDownloadFile) onDownloadFile()\n },\n tooltipText: isAuthenticated\n ? 'Download this file directly'\n : 'Sign in to download this file',\n disabled: !isAuthenticated,\n }\n case DownloadAction.addToCart:\n return {\n text: 'Add to Download List',\n disabled: addToCartDisabled,\n tooltipText: getAddToCartTooltip(entityType, !!addToCartDisabled),\n onClick: () => {\n if (\n entityType === EntityType.file ||\n entityType === EntityType.recordset\n ) {\n addFileToDownloadList({\n entityId,\n entityVersionNumber: versionNumber,\n })\n } else {\n setShowDownloadConfirmation(true)\n }\n },\n }\n case DownloadAction.programmaticAccess:\n return {\n text: 'Programmatic Access',\n onClick: () => {\n setShowProgrammaticAccess(true)\n },\n tooltipText: 'View programmatic access options',\n }\n case DownloadAction.programmaticAccessDocker:\n return {\n text: 'Programmatic Access (Docker)',\n onClick: () => {\n setShowProgrammaticAccess(true)\n },\n tooltipText: 'View programmatic options to pull Docker image',\n }\n case DownloadAction.exportTable:\n return {\n text: 'Export Table',\n onClick: () => {\n setShowExportMetadata(true)\n },\n tooltipText: 'Export table data',\n }\n }\n}\n\n/**\n * Determines the tooltip message based on the entity type and its \"add to cart\" status.\n */\nconst getAddToCartTooltip = (\n entityType: EntityType,\n isDisabled: boolean,\n): string => {\n if (!isDisabled) {\n return 'Add file(s) to your download list'\n }\n const entityFriendlyName = entityTypeToFriendlyName(entityType)\n return `This ${entityFriendlyName} has no accessible files`\n}\n\n// Function that returns DropdownMenuItem\nexport function getDownloadActionsForEntityType(\n type: EntityType,\n): DownloadAction[][] {\n switch (type) {\n case EntityType.file:\n case EntityType.recordset:\n return [\n [DownloadAction.downloadFile],\n [DownloadAction.addToCart, DownloadAction.programmaticAccess],\n ]\n case EntityType.project:\n case EntityType.folder:\n return [[DownloadAction.addToCart, DownloadAction.programmaticAccess]]\n case EntityType.dockerrepo:\n return [[DownloadAction.programmaticAccessDocker]]\n case EntityType.entityview:\n case EntityType.dataset:\n return [\n [\n DownloadAction.exportTable,\n DownloadAction.programmaticAccess,\n DownloadAction.addToCart,\n ],\n ]\n case EntityType.datasetcollection:\n case EntityType.table:\n case EntityType.materializedview:\n case EntityType.submissionview:\n case EntityType.virtualtable:\n return [[DownloadAction.exportTable, DownloadAction.programmaticAccess]]\n case EntityType.link:\n return [[DownloadAction.programmaticAccess]]\n case EntityType.searchindex:\n return []\n default:\n // this will fail if a new EntityType is added and not handled\n throw new Error(`Unhandled EntityType: ${type}`)\n }\n}\n\n// get the appropriate version number for download based on entity type\n// for datasets: returns the most recent released version if any exist, undefined otherwise\n// for other entities: returns the current version number\nfunction useGetLatestVersionNumber(entityId: string, entityType: EntityType) {\n // get entity data\n const { data: entityData, isLoading: entityDataLoading } =\n useGetEntity(entityId) // No version = latest\n\n // for datasets, check if any versions exist and use the most recent one\n const mustGetVersion = entityType === EntityType.dataset\n const { data: versionsData, isLoading: versionsLoading } = useGetVersions(\n entityId,\n 0,\n 1,\n {\n enabled: mustGetVersion,\n },\n )\n\n let latestVersionNumber: number | undefined\n\n if (mustGetVersion) {\n // for datasets, check if any versions exist\n if (versionsData?.results && versionsData.results.length > 0) {\n // Use the most recent released version (first in the list, since versions are returned in descending order)\n latestVersionNumber = versionsData.results[0].versionNumber\n } else {\n // no versions exist, use undefined (will use current/draft version)\n latestVersionNumber = undefined\n }\n } else {\n // for non-datasets, use the entity's version number\n latestVersionNumber =\n entityData && isVersionableEntity(entityData)\n ? entityData.versionNumber\n : undefined\n }\n\n const isLoading = entityDataLoading || versionsLoading\n\n return { latestVersionNumber, isLoading }\n}\n\n// create default queryBundleRequest with appropriate SQL\nfunction getDefaultQueryBundleRequestForEntity(\n entityId: string,\n versionNumber: number | undefined,\n entityType: EntityType,\n): QueryBundleRequest {\n let sql: string\n\n if (entityType === EntityType.dataset) {\n // for datasets:\n // - if a version number exists (released version), use it: syn123.5\n // - if no version number (no released versions), use current/draft: syn123\n sql = versionNumber\n ? `SELECT * FROM ${entityId}.${versionNumber}`\n : `SELECT * FROM ${entityId}`\n } else {\n // For non-datasets, always use entity ID without version\n sql = `SELECT * FROM ${entityId}`\n }\n\n return {\n concreteType: 'org.sagebionetworks.repo.model.table.QueryBundleRequest',\n entityId: `${entityId}`,\n query: {\n sql: sql,\n },\n partMask: 0,\n }\n}\n\nexport function EntityDownloadButton(props: {\n entityId: string\n name: string\n entityType: EntityType\n downloadConfirmationContainer?: RefObject<HTMLElement | null>\n disabled?: boolean\n}) {\n // get the appropriate version number for the entity\n const { latestVersionNumber } = useGetLatestVersionNumber(\n props.entityId,\n props.entityType,\n )\n // create queryBundleRequest with appropriate SQL based on entity type and version\n const defaultQueryBundleRequest = getDefaultQueryBundleRequestForEntity(\n props.entityId,\n latestVersionNumber,\n props.entityType,\n )\n\n // Get context and download functionality\n const { downloadCartPageUrl, isAuthenticated } = useSynapseContext()\n const { mutate: addFileToDownloadList } = useAddFileToDownloadList({\n onSuccess: data => {\n if (data.numberOfFilesAdded > 0) {\n displayFilesWereAddedToDownloadListSuccess(downloadCartPageUrl)\n } else {\n displayToast('0 Files added to your Download List', 'info')\n }\n },\n onError: error => {\n displayToast(error.reason, 'danger')\n },\n })\n\n // state to manage programmatic access modal visibility\n const [showProgrammaticAccess, setShowProgrammaticAccess] =\n useState<boolean>(false)\n\n // state to manage download confirmation visibility and loading\n const [showDownloadConfirmation, setShowDownloadConfirmation] =\n useState<boolean>(false)\n const [downloadConfirmationLoading, setDownloadConfirmationLoading] =\n useState<boolean>(false)\n\n const handleCloseProgrammaticAccess = () => {\n setShowProgrammaticAccess(false)\n }\n\n const isFolderOrProject = isContainerType(props.entityType)\n\n const {\n data: folderOrProjectStats,\n isLoading: isLoadingFolderOrProjectStats,\n } = useGetAddToDownloadListStats(\n {\n concreteType:\n 'org.sagebionetworks.repo.model.download.AddToDownloadListStatsRequest',\n request: {\n parentId: props.entityId,\n concreteType:\n 'org.sagebionetworks.repo.model.download.AddToDownloadListRequest',\n recursive: true,\n },\n },\n {\n enabled: isFolderOrProject,\n },\n )\n\n const folderOrProjectHasNoFiles =\n isFolderOrProject &&\n (isLoadingFolderOrProjectStats || folderOrProjectStats?.fileCount === 0)\n\n const { data: entityData } = useGetEntity(props.entityId)\n\n const { downloadFile } = useDirectDownloadHandler()\n\n const fileHandleId =\n entityData && isFileEntity(entityData)\n ? entityData.dataFileHandleId\n : undefined\n\n const onDownloadFile = fileHandleId\n ? () => {\n void downloadFile({\n fileHandleId,\n associatedObjectId: props.entityId,\n associatedObjectType: FileHandleAssociateType.FileEntity,\n })\n }\n : undefined\n\n const entityViewHasNoFiles =\n entityData && isEntityView(entityData) && !hasFilesInView(entityData)\n\n const datasetHasNoFiles =\n entityData &&\n isDataset(entityData) &&\n (!entityData.items || entityData.items.length === 0)\n\n const addToCartDisabled =\n folderOrProjectHasNoFiles || entityViewHasNoFiles || datasetHasNoFiles\n\n // state to manage export metadata modal visibility\n const [showExportMetadata, setShowExportMetadata] = useState<boolean>(false)\n\n const handleCloseExportMetadata = () => {\n setShowExportMetadata(false)\n }\n\n // Create download menu items\n const downloadActions = getDownloadActionsForEntityType(props.entityType)\n const downloadMenuItems = downloadActions.map(actionGroup =>\n actionGroup.map(action =>\n getMenuItemForAction(\n props.entityId,\n props.name,\n props.entityType,\n action,\n setShowProgrammaticAccess,\n setShowExportMetadata,\n addFileToDownloadList,\n setShowDownloadConfirmation,\n latestVersionNumber,\n addToCartDisabled,\n onDownloadFile,\n isAuthenticated,\n ),\n ),\n )\n\n // Return programmatic access modal content\n const { cliCode, rCode, pythonCode } = getProgrammaticAccessCode(\n props.entityType,\n props.entityId,\n latestVersionNumber,\n )\n\n const downloadConfirmation = showDownloadConfirmation ? (\n <EntityDownloadConfirmation\n entityId={props.entityId}\n handleClose={() => setShowDownloadConfirmation(false)}\n onIsLoadingChange={setDownloadConfirmationLoading}\n />\n ) : null\n\n return (\n <>\n <DropdownMenu\n items={downloadMenuItems}\n dropdownButtonText=\"Download\"\n buttonTooltip=\"Download options for this entity\"\n buttonProps={{\n variant: 'outlined',\n startIcon: <DownloadIcon />,\n disabled: props.disabled || downloadConfirmationLoading,\n }}\n />\n {downloadConfirmation &&\n (props.downloadConfirmationContainer?.current\n ? createPortal(\n downloadConfirmation,\n props.downloadConfirmationContainer.current,\n )\n : downloadConfirmation)}\n <ProgrammaticInstructionsModal\n show={showProgrammaticAccess}\n title={`Programmatic Access: ${props.name}`}\n onClose={handleCloseProgrammaticAccess}\n pythonCode={pythonCode}\n rCode={rCode}\n cliCode={cliCode}\n helpUrl=\"https://help.synapse.org/docs/Synapse-Docker-Registry.2011037752.html#SynapseDockerRegistry-UsingDockerImagesStoredintheSynapseDockerRegistry\"\n />\n {showExportMetadata && (\n <ModalDownload\n queryBundleRequest={defaultQueryBundleRequest}\n onClose={handleCloseExportMetadata}\n />\n )}\n </>\n )\n}\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"EntityDownloadConfirmation.d.ts","sourceRoot":"","sources":["../../../src/components/EntityDownloadConfirmation/EntityDownloadConfirmation.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"EntityDownloadConfirmation.d.ts","sourceRoot":"","sources":["../../../src/components/EntityDownloadConfirmation/EntityDownloadConfirmation.tsx"],"names":[],"mappings":"AAcA;;;;GAIG;AACH,MAAM,MAAM,+BAA+B,GAAG;IAC5C,QAAQ,EAAE,MAAM,CAAA;IAChB,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,iBAAiB,EAAE,CAAC,SAAS,EAAE,OAAO,KAAK,IAAI,CAAA;IAC/C,WAAW,EAAE,MAAM,IAAI,CAAA;CACxB,CAAA;AAeD;;;;;;;;GAQG;AACH,wBAAgB,0BAA0B,CAAC,EACzC,QAAQ,EACR,aAAa,EACb,WAAW,EACX,iBAAiB,GAClB,EAAE,+BAA+B,kDAqEjC;AAED,eAAe,0BAA0B,CAAA"}
|
|
@@ -1,41 +1,47 @@
|
|
|
1
1
|
import { convertToEntityType as e, isContainerType as t } from "../../utils/functions/EntityTypeUtils.js";
|
|
2
|
-
import {
|
|
2
|
+
import { useSynapseContext as n } from "../../utils/context/SynapseContext.js";
|
|
3
|
+
import "../../utils/index.js";
|
|
4
|
+
import { useGetEntity as r } from "../../synapse-queries/entity/useEntity.js";
|
|
3
5
|
import "../../synapse-queries/index.js";
|
|
4
|
-
import
|
|
5
|
-
import
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
6
|
+
import { DownloadConfirmationUI as i } from "../download_list/DownloadConfirmationUI.js";
|
|
7
|
+
import a from "../download_list/AddToDownloadListConfirmationAlert/AddToDownloadListConfirmationAlert.js";
|
|
8
|
+
import { useEffect as o, useMemo as s } from "react";
|
|
9
|
+
import { jsx as c } from "react/jsx-runtime";
|
|
10
|
+
import { EntityType as l } from "@sage-bionetworks/synapse-client";
|
|
8
11
|
//#region src/components/EntityDownloadConfirmation/EntityDownloadConfirmation.tsx
|
|
9
|
-
var
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
],
|
|
15
|
-
function
|
|
16
|
-
let { data:
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
}, [
|
|
20
|
-
let
|
|
12
|
+
var u = [
|
|
13
|
+
l.project,
|
|
14
|
+
l.folder,
|
|
15
|
+
l.dataset,
|
|
16
|
+
l.datasetcollection
|
|
17
|
+
], d = [l.entityview], f = [l.dataset, l.datasetcollection];
|
|
18
|
+
function p({ entityId: l, versionNumber: p, handleClose: m, onIsLoadingChange: h }) {
|
|
19
|
+
let { isAuthenticated: g } = n(), { data: _, isLoading: v } = r(g ? l : void 0), y = _?.concreteType ? e(_.concreteType) : void 0;
|
|
20
|
+
o(() => {
|
|
21
|
+
h(v);
|
|
22
|
+
}, [v, h]);
|
|
23
|
+
let b = s(() => y ? d.includes(y) ? {
|
|
21
24
|
concreteType: "org.sagebionetworks.repo.model.download.AddToDownloadListRequest",
|
|
22
|
-
query: { sql: `select * from ${
|
|
23
|
-
} :
|
|
25
|
+
query: { sql: `select * from ${l}${p == null ? "" : `.${p}`}` }
|
|
26
|
+
} : u.includes(y) ? {
|
|
24
27
|
concreteType: "org.sagebionetworks.repo.model.download.AddToDownloadListRequest",
|
|
25
|
-
parentId:
|
|
26
|
-
useVersionNumber:
|
|
27
|
-
recursive: t(
|
|
28
|
+
parentId: l,
|
|
29
|
+
useVersionNumber: f.includes(y),
|
|
30
|
+
recursive: t(y)
|
|
28
31
|
} : null : null, [
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
+
y,
|
|
33
|
+
l,
|
|
34
|
+
p
|
|
32
35
|
]);
|
|
33
|
-
return
|
|
34
|
-
addToDownloadListRequest:
|
|
35
|
-
onClose:
|
|
36
|
-
}) }) : null
|
|
36
|
+
return b ? /* @__PURE__ */ c("div", { children: /* @__PURE__ */ c(a, {
|
|
37
|
+
addToDownloadListRequest: b,
|
|
38
|
+
onClose: m
|
|
39
|
+
}) }) : g ? null : /* @__PURE__ */ c("div", { children: /* @__PURE__ */ c(i, {
|
|
40
|
+
onAddToDownloadCart: () => {},
|
|
41
|
+
onCancel: m
|
|
42
|
+
}) });
|
|
37
43
|
}
|
|
38
44
|
//#endregion
|
|
39
|
-
export {
|
|
45
|
+
export { p as EntityDownloadConfirmation, p as default };
|
|
40
46
|
|
|
41
47
|
//# sourceMappingURL=EntityDownloadConfirmation.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"EntityDownloadConfirmation.js","names":[],"sources":["../../../src/components/EntityDownloadConfirmation/EntityDownloadConfirmation.tsx"],"sourcesContent":["import AddToDownloadListConfirmationAlert from '@/components/download_list/AddToDownloadListConfirmationAlert/AddToDownloadListConfirmationAlert'\nimport {\n convertToEntityType,\n isContainerType,\n} from '@/utils/functions/EntityTypeUtils'\nimport {\n AddToDownloadListRequest,\n EntityType,\n} from '@sage-bionetworks/synapse-client'\nimport { useEffect, useMemo } from 'react'\nimport { useGetEntity } from '../../synapse-queries/'\n\n/**\n * Props for the EntityDownloadConfirmation component.\n *\n * @property entityId - The ID of the entity to be added to the download cart.\n */\nexport type EntityDownloadConfirmationProps = {\n entityId: string\n versionNumber?: number\n onIsLoadingChange: (isLoading: boolean) => void\n handleClose: () => void\n}\n\nconst typesToAddToDownloadListWithParentId: EntityType[] = [\n EntityType.project,\n EntityType.folder,\n EntityType.dataset,\n EntityType.datasetcollection,\n]\nconst typesToAddToDownloadListWithQuery: EntityType[] = [EntityType.entityview]\n/** Users expect the specific file version included in the dataset to be added to the cart */\nconst typesWhereFileVersionNumberShouldBeUsed: EntityType[] = [\n EntityType.dataset,\n EntityType.datasetcollection,\n]\n\n/**\n * A component that allows users to add an entity to the download cart. It displays a confirmation dialog that displays\n * statistics about the set of items that will be added to the download cart.\n *\n * @param props - The properties for the component.\n * @param props.entityId - The ID of the entity to be added to the download cart.\n *\n * @returns The rendered EntityDownloadConfirmation component.\n */\nexport function EntityDownloadConfirmation({\n entityId,\n versionNumber,\n handleClose,\n onIsLoadingChange,\n}: EntityDownloadConfirmationProps) {\n const { data: entity, isLoading: isLoadingEntity } = useGetEntity(entityId)\n const entityType = entity?.concreteType\n ? convertToEntityType(entity.concreteType)\n : undefined\n\n useEffect(() => {\n onIsLoadingChange(isLoadingEntity)\n }, [isLoadingEntity, onIsLoadingChange])\n\n const addToDownloadListRequest: AddToDownloadListRequest | null =\n useMemo(() => {\n if (!entityType) {\n return null\n }\n if (typesToAddToDownloadListWithQuery.includes(entityType)) {\n return {\n concreteType:\n 'org.sagebionetworks.repo.model.download.AddToDownloadListRequest',\n query: {\n sql: `select * from ${entityId}${\n versionNumber != undefined ? `.${versionNumber}` : ''\n }`,\n },\n }\n }\n if (typesToAddToDownloadListWithParentId.includes(entityType)) {\n const useVersionNumber =\n typesWhereFileVersionNumberShouldBeUsed.includes(entityType)\n return {\n concreteType:\n 'org.sagebionetworks.repo.model.download.AddToDownloadListRequest',\n // TODO: Specify version of dataset/dataset collection (PLFM-9311)\n parentId: entityId,\n useVersionNumber,\n recursive: isContainerType(entityType),\n }\n }\n\n return null\n }, [entityType, entityId, versionNumber])\n\n if (!addToDownloadListRequest) {\n return null\n }\n\n return (\n <div>\n <AddToDownloadListConfirmationAlert\n addToDownloadListRequest={addToDownloadListRequest}\n onClose={handleClose}\n />\n </div>\n )\n}\n\nexport default EntityDownloadConfirmation\n"],"mappings":"
|
|
1
|
+
{"version":3,"file":"EntityDownloadConfirmation.js","names":[],"sources":["../../../src/components/EntityDownloadConfirmation/EntityDownloadConfirmation.tsx"],"sourcesContent":["import AddToDownloadListConfirmationAlert from '@/components/download_list/AddToDownloadListConfirmationAlert/AddToDownloadListConfirmationAlert'\nimport DownloadConfirmationUI from '@/components/download_list/DownloadConfirmationUI'\nimport {\n convertToEntityType,\n isContainerType,\n} from '@/utils/functions/EntityTypeUtils'\nimport { useSynapseContext } from '@/utils'\nimport {\n AddToDownloadListRequest,\n EntityType,\n} from '@sage-bionetworks/synapse-client'\nimport { useEffect, useMemo } from 'react'\nimport { useGetEntity } from '../../synapse-queries/'\n\n/**\n * Props for the EntityDownloadConfirmation component.\n *\n * @property entityId - The ID of the entity to be added to the download cart.\n */\nexport type EntityDownloadConfirmationProps = {\n entityId: string\n versionNumber?: number\n onIsLoadingChange: (isLoading: boolean) => void\n handleClose: () => void\n}\n\nconst typesToAddToDownloadListWithParentId: EntityType[] = [\n EntityType.project,\n EntityType.folder,\n EntityType.dataset,\n EntityType.datasetcollection,\n]\nconst typesToAddToDownloadListWithQuery: EntityType[] = [EntityType.entityview]\n/** Users expect the specific file version included in the dataset to be added to the cart */\nconst typesWhereFileVersionNumberShouldBeUsed: EntityType[] = [\n EntityType.dataset,\n EntityType.datasetcollection,\n]\n\n/**\n * A component that allows users to add an entity to the download cart. It displays a confirmation dialog that displays\n * statistics about the set of items that will be added to the download cart.\n *\n * @param props - The properties for the component.\n * @param props.entityId - The ID of the entity to be added to the download cart.\n *\n * @returns The rendered EntityDownloadConfirmation component.\n */\nexport function EntityDownloadConfirmation({\n entityId,\n versionNumber,\n handleClose,\n onIsLoadingChange,\n}: EntityDownloadConfirmationProps) {\n const { isAuthenticated } = useSynapseContext()\n const { data: entity, isLoading: isLoadingEntity } = useGetEntity(\n isAuthenticated ? entityId : undefined,\n )\n const entityType = entity?.concreteType\n ? convertToEntityType(entity.concreteType)\n : undefined\n\n useEffect(() => {\n onIsLoadingChange(isLoadingEntity)\n }, [isLoadingEntity, onIsLoadingChange])\n\n const addToDownloadListRequest: AddToDownloadListRequest | null =\n useMemo(() => {\n if (!entityType) {\n return null\n }\n if (typesToAddToDownloadListWithQuery.includes(entityType)) {\n return {\n concreteType:\n 'org.sagebionetworks.repo.model.download.AddToDownloadListRequest',\n query: {\n sql: `select * from ${entityId}${\n versionNumber != undefined ? `.${versionNumber}` : ''\n }`,\n },\n }\n }\n if (typesToAddToDownloadListWithParentId.includes(entityType)) {\n const useVersionNumber =\n typesWhereFileVersionNumberShouldBeUsed.includes(entityType)\n return {\n concreteType:\n 'org.sagebionetworks.repo.model.download.AddToDownloadListRequest',\n // TODO: Specify version of dataset/dataset collection (PLFM-9311)\n parentId: entityId,\n useVersionNumber,\n recursive: isContainerType(entityType),\n }\n }\n\n return null\n }, [entityType, entityId, versionNumber])\n\n if (!addToDownloadListRequest) {\n if (!isAuthenticated) {\n return (\n <div>\n <DownloadConfirmationUI\n onAddToDownloadCart={() => {\n \t// Only displaying UI to prompt sign-in, so no-op is OK\n }}\n onCancel={handleClose}\n />\n </div>\n )\n }\n return null\n }\n\n return (\n <div>\n <AddToDownloadListConfirmationAlert\n addToDownloadListRequest={addToDownloadListRequest}\n onClose={handleClose}\n />\n </div>\n )\n}\n\nexport default EntityDownloadConfirmation\n"],"mappings":";;;;;;;;;;;AA0BA,IAAM,IAAqD;CACzD,EAAW;CACX,EAAW;CACX,EAAW;CACX,EAAW;CACZ,EACK,IAAkD,CAAC,EAAW,WAAW,EAEzE,IAAwD,CAC5D,EAAW,SACX,EAAW,kBACZ;AAWD,SAAgB,EAA2B,EACzC,aACA,kBACA,gBACA,wBACkC;CAClC,IAAM,EAAE,uBAAoB,GAAmB,EACzC,EAAE,MAAM,GAAQ,WAAW,MAAoB,EACnD,IAAkB,IAAW,KAAA,EAC9B,EACK,IAAa,GAAQ,eACvB,EAAoB,EAAO,aAAa,GACxC,KAAA;AAEJ,SAAgB;AACd,IAAkB,EAAgB;IACjC,CAAC,GAAiB,EAAkB,CAAC;CAExC,IAAM,IACJ,QACO,IAGD,EAAkC,SAAS,EAAW,GACjD;EACL,cACE;EACF,OAAO,EACL,KAAK,iBAAiB,IACpB,KAAiB,OAAkC,KAAtB,IAAI,OAEpC;EACF,GAEC,EAAqC,SAAS,EAAW,GAGpD;EACL,cACE;EAEF,UAAU;EACV,kBANA,EAAwC,SAAS,EAMjD;EACA,WAAW,EAAgB,EAAW;EACvC,GAGI,OA1BE,MA2BR;EAAC;EAAY;EAAU;EAAc,CAAC;AAkB3C,QAhBK,IAiBH,kBAAC,OAAD,EAAA,UACE,kBAAC,GAAD;EAC4B;EAC1B,SAAS;EACT,CAAA,EACE,CAAA,GArBD,IAYE,OAVH,kBAAC,OAAD,EAAA,UACE,kBAAC,GAAD;EACE,2BAA2B;EAG3B,UAAU;EACV,CAAA,EACE,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"EntityFinder.js","names":[],"sources":["../../../src/components/EntityFinder/EntityFinder.tsx"],"sourcesContent":["import SynapseClient from '@/synapse-client'\nimport { useSynapseContext } from '@/utils/context/SynapseContext'\nimport { getEntityTypeFromHeader } from '@/utils/functions/EntityTypeUtils'\nimport { parseSynId } from '@/utils/functions/RegularExpressions'\nimport ClearIcon from '@mui/icons-material/Clear'\nimport SearchIcon from '@mui/icons-material/Search'\nimport {\n Box,\n Chip,\n IconButton,\n InputAdornment,\n Stack,\n Tab,\n Tabs,\n TextField,\n} from '@mui/material'\nimport { EntityType } from '@sage-bionetworks/synapse-client'\nimport { KeyValue, Reference } from '@sage-bionetworks/synapse-types'\nimport { Map } from 'immutable'\nimport React, { useCallback, useEffect, useMemo, useState } from 'react'\nimport { useErrorHandler } from 'react-error-boundary'\nimport { ReflexContainer, ReflexElement, ReflexSplitter } from 'react-reflex'\nimport 'react-reflex/styles.css'\nimport { SynapseErrorBoundary } from '../error/ErrorBanner'\nimport { BreadcrumbItem, Breadcrumbs, BreadcrumbsProps } from './Breadcrumbs'\nimport {\n EntityDetailsList,\n EntityDetailsListDataConfiguration,\n EntityDetailsListDataConfigurationType,\n EntityDetailsListProps,\n} from './details/EntityDetailsList'\nimport { EntityFinderHeader } from './EntityFinderHeader'\nimport { EntityTree, EntityTreeContainer, FinderScope } from './tree/EntityTree'\nimport { EntityTreeNodeType } from './tree/VirtualizedTree'\nimport { useEntitySelection } from './useEntitySelection'\nimport { VersionSelectionType } from './VersionSelectionType'\n\nconst DEFAULT_SELECTABLE_TYPES = Object.values(EntityType)\nconst TABLE_DEFAULT_VISIBLE_TYPES = Object.values(EntityType)\nconst TREE_DEFAULT_VISIBLE_TYPES = [EntityType.project, EntityType.folder]\n\nconst searchForOnlyTypesBooleanQuery = (\n entityTypes: EntityType[],\n): KeyValue[] => {\n // Boolean query terms will be combined with AND, and there's no way to OR.\n // So we will negate searching for all omitted types.\n const allTypes = Object.values(EntityType)\n const typesToOmit = allTypes.filter(type => !entityTypes.includes(type))\n return typesToOmit.map(type => ({\n key: 'node_type',\n value: type.toString(),\n not: true,\n }))\n}\n\nexport type EntityFinderProps = {\n /** Whether it is possible to select multiple entities */\n selectMultiple: boolean\n /** Callback invoked when the selection changes */\n onSelectedChange: (selected: Reference[]) => void\n /** The initial appearance of the entity finder. Possible values include \"Current Project\", \"All Projects\", \"Projects Created By Me\", \"My Favorites\" */\n initialScope: FinderScope\n /** The SynID of the 'Current Project'. If this is not a defined, then the scope cannot be \"Current Project\" */\n projectId?: string\n /** The SynID of the entity that should open by default. If this is a Syn ID, then it must be in the project specified in `projectId` */\n initialContainer: string | 'root' | null\n /** Determines if versions are selectable, and if so, how they should be shown. Default is \"TRACKED\" */\n versionSelection?: VersionSelectionType\n /** The entity types to show in the details view (right pane). Any types specified in `selectableTypes` will automatically be included. */\n visibleTypesInList?: EntityType[]\n /** The entity types that may be selected. Types in `visibleTypesInList` that are not in `selectableTypes` will appear as disabled options. Only the types in `selectableTypes` will appear in search */\n selectableTypes?: EntityType[]\n /** The types to show in the tree used to navigate. If `treeOnly` is true, any types specified in `selectableTypes` will automatically be included. */\n visibleTypesInTree?: EntityType[]\n /** Whether to show only the tree. If `true`, the tree will be used to make selections */\n treeOnly?: boolean\n /** If provided, the initial selection will be set to this list of references. The selection will be reset to this value if this object changes, so it should be memoized. */\n initialSelected?: Reference[]\n}\n\nenum EntityFinderTab {\n BROWSE,\n SELECTED,\n}\n\nexport function EntityFinder({\n initialScope,\n projectId,\n initialContainer = null,\n selectMultiple,\n onSelectedChange,\n versionSelection = VersionSelectionType.TRACKED,\n selectableTypes = DEFAULT_SELECTABLE_TYPES,\n visibleTypesInList = TABLE_DEFAULT_VISIBLE_TYPES,\n visibleTypesInTree = TREE_DEFAULT_VISIBLE_TYPES,\n treeOnly = false,\n initialSelected,\n}: EntityFinderProps): React.ReactNode {\n const { accessToken } = useSynapseContext()\n const [currentTab, setCurrentTab] = React.useState(EntityFinderTab.BROWSE)\n\n const [searchActive, setSearchActive] = useState(false)\n // The raw value of the search input box:\n const [searchInput, setSearchInput] = useState<string>('')\n // The \"parsed\" search terms, which are only calculated when Enter is pressed:\n const [searchTerms, setSearchTerms] = useState<string[]>()\n const [breadcrumbsProps, setBreadcrumbsProps] = useState<BreadcrumbsProps>({\n items: [],\n })\n const [searchByIdResults, setSearchByIdResults] = useState<\n EntityFinderHeader[]\n >([])\n const [configFromTreeView, setConfigFromTreeView] =\n useState<EntityDetailsListDataConfiguration>({\n type: EntityDetailsListDataConfigurationType.PROMPT,\n })\n\n // If a type is selectable, it should be visible in the tree/list (depending on treeOnly)\n const selectableAndVisibleTypesInTree = useMemo(\n () => [...visibleTypesInTree, ...selectableTypes],\n [visibleTypesInTree, selectableTypes],\n )\n const selectableAndVisibleTypesInList = useMemo(\n () => [...visibleTypesInList, ...selectableTypes],\n [visibleTypesInList, selectableTypes],\n )\n\n // For dual-pane, this state variable indicates which container is selected in the tree view and should be shown in the table view\n const [currentContainer, setCurrentContainer] =\n useState<EntityTreeContainer>(initialContainer)\n\n const handleError = useErrorHandler()\n\n const setBreadcrumbs = useCallback(\n (items: BreadcrumbItem[]) => {\n setBreadcrumbsProps({\n items,\n })\n },\n [setBreadcrumbsProps],\n )\n\n const { selectedEntities, toggleSelection, setSelection, setInitialVersion } =\n useEntitySelection(selectMultiple)\n\n useEffect(() => {\n if (initialSelected) {\n let map = Map<string, Reference>()\n map = map.withMutations(mutableMap => {\n initialSelected.forEach(reference => {\n mutableMap.set(reference.targetId, reference)\n })\n })\n\n setSelection(map)\n }\n }, [initialSelected, setSelection])\n\n // A snapshot of the selectedEntities used to populate the selection list, allowing deselection of entities without removing them from the list.\n const [selectedEntitiesSnapshot, setSelectedEntitiesSnapshot] =\n useState(selectedEntities)\n\n const isIdSelected = useCallback(\n (entity: EntityFinderHeader) => {\n return selectedEntities.has(entity.id)\n },\n [selectedEntities],\n )\n\n const isSelectable = useCallback(\n (entity: EntityFinderHeader) => {\n const type = getEntityTypeFromHeader(entity)\n return selectableTypes.includes(type)\n },\n [selectableTypes],\n )\n\n useEffect(() => {\n // When it changes, convert the map of selected items to a list of references and invoke the callback\n onSelectedChange(Array.from(selectedEntities.values()))\n }, [selectedEntities, onSelectedChange])\n\n useEffect(() => {\n if (searchTerms?.length === 1) {\n const searchTermReference = parseSynId(searchTerms[0])\n if (searchTermReference) {\n SynapseClient.getEntityHeaders([searchTermReference], accessToken)\n .then(response => {\n setSearchByIdResults(response.results)\n })\n .catch(e => handleError(e))\n }\n } else {\n setSearchByIdResults([])\n }\n }, [accessToken, searchTerms, handleError])\n\n const handleTabChange = (\n _event: React.SyntheticEvent,\n newValue: EntityFinderTab,\n ) => {\n setSelectedEntitiesSnapshot(selectedEntities)\n setCurrentTab(newValue)\n }\n\n const mainPanelClass = searchActive\n ? 'MainPanelSearch'\n : treeOnly\n ? 'MainPanelSinglePane'\n : 'MainPanelDualPane'\n\n const entityDetailsListProps: EntityDetailsListProps = {\n configuration: configFromTreeView,\n versionSelection: versionSelection,\n selected: selectedEntities,\n isIdSelected: isIdSelected,\n isSelectable: isSelectable,\n visibleTypes: selectableAndVisibleTypesInList,\n selectableTypes: selectableTypes,\n selectColumnType: selectMultiple ? 'checkbox' : 'none',\n toggleSelection: toggleSelection,\n setInitialVersion: setInitialVersion,\n enableSelectAll: selectMultiple,\n setCurrentContainer: setCurrentContainer,\n }\n\n return (\n <SynapseErrorBoundary>\n <div className=\"EntityFinder\">\n <Box\n sx={{\n display: 'flex',\n justifyContent: 'space-between',\n mb: 2.5,\n rowGap: 2,\n columnGap: 4,\n flexWrap: { xs: 'wrap', md: 'nowrap' },\n }}\n >\n <Tabs\n value={currentTab}\n onChange={handleTabChange}\n sx={{ flex: 'none' }}\n >\n <Tab value={EntityFinderTab.BROWSE} label={'Browse'}></Tab>\n <Tab\n value={EntityFinderTab.SELECTED}\n label={\n <Stack\n direction={'row'}\n sx={{\n gap: 0.5,\n alignItems: 'center',\n }}\n >\n <span>Selected</span>\n <Chip\n size={'small'}\n label={selectedEntities.size.toLocaleString()}\n sx={{\n backgroundColor: 'tertiary.500',\n color: 'grey.900',\n height: '21px',\n }}\n ></Chip>\n </Stack>\n }\n ></Tab>\n </Tabs>\n <TextField\n size={'small'}\n placeholder=\"Search by name, wiki content, or SynID\"\n value={searchInput}\n onChange={event => {\n setSearchInput(event.target.value)\n }}\n onKeyDown={(event: any) => {\n if (event.key === 'Enter') {\n const trimmedInput = event.target.value.trim()\n setSearchActive(!!trimmedInput)\n if (trimmedInput) {\n setSearchTerms(trimmedInput.split(/\\s+/))\n setCurrentTab(EntityFinderTab.BROWSE)\n }\n }\n }}\n sx={{\n maxWidth: { xs: '100%', md: '350px' },\n flex: '1 1 350px',\n }}\n slotProps={{\n input: {\n startAdornment: (\n <InputAdornment position=\"start\">\n <SearchIcon />\n </InputAdornment>\n ),\n endAdornment: searchTerms ? (\n <InputAdornment position=\"end\">\n <IconButton\n size={'small'}\n onClick={() => {\n setSearchInput('')\n setSearchTerms(undefined)\n setSearchActive(false)\n }}\n aria-label=\"Clear Search\"\n disabled={!searchInput && !searchActive}\n >\n <ClearIcon />\n </IconButton>\n </InputAdornment>\n ) : undefined,\n },\n }}\n />\n </Box>\n <div\n role={'tabpanel'}\n className={`EntityFinder__MainPanel ${mainPanelClass}`}\n style={{\n display: currentTab === EntityFinderTab.BROWSE ? 'block' : 'none',\n }}\n >\n {/* We have a separate Details component for search in order to preserve state in the other component between searches */}\n {searchActive && (\n <EntityDetailsList\n configuration={\n searchByIdResults && searchByIdResults.length > 0\n ? {\n type: EntityDetailsListDataConfigurationType.HEADER_LIST,\n headerList: searchByIdResults,\n }\n : {\n type: EntityDetailsListDataConfigurationType.ENTITY_SEARCH,\n query: {\n queryTerm: searchTerms,\n booleanQuery:\n searchForOnlyTypesBooleanQuery(selectableTypes),\n },\n }\n }\n versionSelection={versionSelection}\n selectColumnType={selectMultiple ? 'checkbox' : 'none'}\n selected={selectedEntities}\n isIdSelected={isIdSelected}\n isSelectable={isSelectable}\n visibleTypes={selectableTypes}\n selectableTypes={selectableTypes}\n toggleSelection={toggleSelection}\n setInitialVersion={setInitialVersion}\n enableSelectAll={selectMultiple}\n // Intentionally do not pass \"setCurrentContainer\" -- search does not use the tree so it has nothing to update\n setCurrentContainer={undefined}\n />\n )}\n {\n <div style={searchActive ? { display: 'none' } : {}}>\n {treeOnly ? (\n <div>\n <SynapseErrorBoundary>\n <EntityTree\n toggleSelection={toggleSelection}\n showDropdown={true}\n visibleTypes={selectableAndVisibleTypesInTree}\n initialScope={initialScope}\n selectedEntities={selectedEntities}\n projectId={projectId}\n initialContainer={initialContainer}\n currentContainer={currentContainer}\n setCurrentContainer={setCurrentContainer}\n showScopeAsRootNode={false}\n treeNodeType={EntityTreeNodeType.SINGLE_PANE}\n selectableTypes={selectableTypes}\n />\n </SynapseErrorBoundary>\n </div>\n ) : (\n <div className=\"EntityFinderReflexContainer\">\n <ReflexContainer orientation=\"vertical\" windowResizeAware>\n <ReflexElement\n className=\"TreeViewReflexElement\"\n flex={0.24}\n >\n <SynapseErrorBoundary>\n <EntityTree\n selectedEntities={selectedEntities}\n setDetailsViewConfiguration={setConfigFromTreeView}\n showDropdown={true}\n visibleTypes={visibleTypesInTree}\n initialScope={initialScope}\n projectId={projectId}\n initialContainer={initialContainer}\n currentContainer={currentContainer}\n setCurrentContainer={setCurrentContainer}\n treeNodeType={EntityTreeNodeType.DUAL_PANE}\n setBreadcrumbItems={setBreadcrumbs}\n selectableTypes={visibleTypesInTree}\n />\n </SynapseErrorBoundary>\n </ReflexElement>\n <ReflexSplitter></ReflexSplitter>\n <ReflexElement className=\"DetailsViewReflexElement\">\n <SynapseErrorBoundary>\n <EntityDetailsList {...entityDetailsListProps} />\n <Breadcrumbs {...breadcrumbsProps} />\n </SynapseErrorBoundary>\n </ReflexElement>\n </ReflexContainer>\n </div>\n )}\n </div>\n }\n </div>\n <div\n role={'tabpanel'}\n className={'MainPanelSelected'}\n style={{\n display: currentTab === EntityFinderTab.SELECTED ? 'block' : 'none',\n }}\n >\n <EntityDetailsList\n {...entityDetailsListProps}\n configuration={{\n type: EntityDetailsListDataConfigurationType.REFERENCE_LIST,\n referenceList: Array.from(selectedEntitiesSnapshot.values()),\n }}\n />\n </div>\n </div>\n </SynapseErrorBoundary>\n )\n}\n\nexport default EntityFinder\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"EntityFinder.js","names":[],"sources":["../../../src/components/EntityFinder/EntityFinder.tsx"],"sourcesContent":["import SynapseClient from '@/synapse-client'\nimport { useSynapseContext } from '@/utils/context/SynapseContext'\nimport { getEntityTypeFromHeader } from '@/utils/functions/EntityTypeUtils'\nimport { parseSynId } from '@/utils/functions/RegularExpressions'\nimport ClearIcon from '@mui/icons-material/Clear'\nimport SearchIcon from '@mui/icons-material/Search'\nimport {\n Box,\n Chip,\n IconButton,\n InputAdornment,\n Stack,\n Tab,\n Tabs,\n TextField,\n} from '@mui/material'\nimport { EntityType } from '@sage-bionetworks/synapse-client'\nimport { KeyValue, Reference } from '@sage-bionetworks/synapse-types'\nimport { Map } from 'immutable'\nimport React, { useCallback, useEffect, useMemo, useState } from 'react'\nimport { useErrorHandler } from 'react-error-boundary'\nimport { ReflexContainer, ReflexElement, ReflexSplitter } from 'react-reflex'\nimport 'react-reflex/styles.css'\nimport { SynapseErrorBoundary } from '../error/ErrorBanner'\nimport { BreadcrumbItem, Breadcrumbs, BreadcrumbsProps } from './Breadcrumbs'\nimport {\n EntityDetailsList,\n EntityDetailsListDataConfiguration,\n EntityDetailsListDataConfigurationType,\n EntityDetailsListProps,\n} from './details/EntityDetailsList'\nimport { EntityFinderHeader } from './EntityFinderHeader'\nimport { EntityTree, EntityTreeContainer, FinderScope } from './tree/EntityTree'\nimport { EntityTreeNodeType } from './tree/VirtualizedTree'\nimport { useEntitySelection } from './useEntitySelection'\nimport { VersionSelectionType } from './VersionSelectionType'\n\nconst DEFAULT_SELECTABLE_TYPES = Object.values(EntityType)\nconst TABLE_DEFAULT_VISIBLE_TYPES = Object.values(EntityType)\nconst TREE_DEFAULT_VISIBLE_TYPES = [EntityType.project, EntityType.folder]\n\nconst searchForOnlyTypesBooleanQuery = (\n entityTypes: EntityType[],\n): KeyValue[] => {\n // Boolean query terms will be combined with AND, and there's no way to OR.\n // So we will negate searching for all omitted types.\n const allTypes = Object.values(EntityType)\n const typesToOmit = allTypes.filter(type => !entityTypes.includes(type))\n return typesToOmit.map(type => ({\n key: 'node_type',\n value: type.toString(),\n not: true,\n }))\n}\n\nexport type EntityFinderProps = {\n /** Whether it is possible to select multiple entities */\n selectMultiple: boolean\n /** Callback invoked when the selection changes */\n onSelectedChange: (selected: Reference[]) => void\n /** The initial appearance of the entity finder. Possible values include \"Current Project\", \"All Projects\", \"Projects Created By Me\", \"My Favorites\" */\n initialScope: FinderScope\n /** The SynID of the 'Current Project'. If this is not a defined, then the scope cannot be \"Current Project\" */\n projectId?: string\n /** The SynID of the entity that should open by default. If this is a Syn ID, then it must be in the project specified in `projectId` */\n initialContainer: string | 'root' | null\n /** Determines if versions are selectable, and if so, how they should be shown. Default is \"TRACKED\" */\n versionSelection?: VersionSelectionType\n /** The entity types to show in the details view (right pane). Any types specified in `selectableTypes` will automatically be included. */\n visibleTypesInList?: EntityType[]\n /** The entity types that may be selected. Types in `visibleTypesInList` that are not in `selectableTypes` will appear as disabled options. Only the types in `selectableTypes` will appear in search */\n selectableTypes?: EntityType[]\n /** The types to show in the tree used to navigate. If `treeOnly` is true, any types specified in `selectableTypes` will automatically be included. */\n visibleTypesInTree?: EntityType[]\n /** Whether to show only the tree. If `true`, the tree will be used to make selections */\n treeOnly?: boolean\n /** If provided, the initial selection will be set to this list of references. The selection will be reset to this value if this object changes, so it should be memoized. */\n initialSelected?: Reference[]\n}\n\nenum EntityFinderTab {\n BROWSE,\n SELECTED,\n}\n\nexport function EntityFinder({\n initialScope,\n projectId,\n initialContainer = null,\n selectMultiple,\n onSelectedChange,\n versionSelection = VersionSelectionType.TRACKED,\n selectableTypes = DEFAULT_SELECTABLE_TYPES,\n visibleTypesInList = TABLE_DEFAULT_VISIBLE_TYPES,\n visibleTypesInTree = TREE_DEFAULT_VISIBLE_TYPES,\n treeOnly = false,\n initialSelected,\n}: EntityFinderProps): React.ReactNode {\n const { accessToken } = useSynapseContext()\n const [currentTab, setCurrentTab] = React.useState(EntityFinderTab.BROWSE)\n\n const [searchActive, setSearchActive] = useState(false)\n // The raw value of the search input box:\n const [searchInput, setSearchInput] = useState<string>('')\n // The \"parsed\" search terms, which are only calculated when Enter is pressed:\n const [searchTerms, setSearchTerms] = useState<string[]>()\n const [breadcrumbsProps, setBreadcrumbsProps] = useState<BreadcrumbsProps>({\n items: [],\n })\n const [searchByIdResults, setSearchByIdResults] = useState<\n EntityFinderHeader[]\n >([])\n const [configFromTreeView, setConfigFromTreeView] =\n useState<EntityDetailsListDataConfiguration>({\n type: EntityDetailsListDataConfigurationType.PROMPT,\n })\n\n // If a type is selectable, it should be visible in the tree/list (depending on treeOnly)\n const selectableAndVisibleTypesInTree = useMemo(\n () => [...visibleTypesInTree, ...selectableTypes],\n [visibleTypesInTree, selectableTypes],\n )\n const selectableAndVisibleTypesInList = useMemo(\n () => [...visibleTypesInList, ...selectableTypes],\n [visibleTypesInList, selectableTypes],\n )\n\n // For dual-pane, this state variable indicates which container is selected in the tree view and should be shown in the table view\n const [currentContainer, setCurrentContainer] =\n useState<EntityTreeContainer>(initialContainer)\n\n const handleError = useErrorHandler()\n\n const setBreadcrumbs = useCallback(\n (items: BreadcrumbItem[]) => {\n setBreadcrumbsProps({\n items,\n })\n },\n [setBreadcrumbsProps],\n )\n\n const { selectedEntities, toggleSelection, setSelection, setInitialVersion } =\n useEntitySelection(selectMultiple)\n\n useEffect(() => {\n if (initialSelected) {\n let map = Map<string, Reference>()\n map = map.withMutations(mutableMap => {\n initialSelected.forEach(reference => {\n mutableMap.set(reference.targetId, reference)\n })\n })\n\n setSelection(map)\n }\n }, [initialSelected, setSelection])\n\n // A snapshot of the selectedEntities used to populate the selection list, allowing deselection of entities without removing them from the list.\n const [selectedEntitiesSnapshot, setSelectedEntitiesSnapshot] =\n useState(selectedEntities)\n\n const isIdSelected = useCallback(\n (entity: EntityFinderHeader) => {\n return selectedEntities.has(entity.id)\n },\n [selectedEntities],\n )\n\n const isSelectable = useCallback(\n (entity: EntityFinderHeader) => {\n const type = getEntityTypeFromHeader(entity)\n return selectableTypes.includes(type)\n },\n [selectableTypes],\n )\n\n useEffect(() => {\n // When it changes, convert the map of selected items to a list of references and invoke the callback\n onSelectedChange(Array.from(selectedEntities.values()))\n }, [selectedEntities, onSelectedChange])\n\n useEffect(() => {\n if (searchTerms?.length === 1) {\n const searchTermReference = parseSynId(searchTerms[0])\n if (searchTermReference) {\n SynapseClient.getEntityHeaders([searchTermReference], accessToken)\n .then(response => {\n setSearchByIdResults(response.results)\n })\n .catch(e => handleError(e))\n }\n } else {\n setSearchByIdResults([])\n }\n }, [accessToken, searchTerms, handleError])\n\n const handleTabChange = (\n _event: React.SyntheticEvent,\n newValue: EntityFinderTab,\n ) => {\n setSelectedEntitiesSnapshot(selectedEntities)\n setCurrentTab(newValue)\n }\n\n const mainPanelClass = searchActive\n ? 'MainPanelSearch'\n : treeOnly\n ? 'MainPanelSinglePane'\n : 'MainPanelDualPane'\n\n const entityDetailsListProps: EntityDetailsListProps = {\n configuration: configFromTreeView,\n versionSelection: versionSelection,\n selected: selectedEntities,\n isIdSelected: isIdSelected,\n isSelectable: isSelectable,\n visibleTypes: selectableAndVisibleTypesInList,\n selectableTypes: selectableTypes,\n selectColumnType: selectMultiple ? 'checkbox' : 'none',\n toggleSelection: toggleSelection,\n setInitialVersion: setInitialVersion,\n enableSelectAll: selectMultiple,\n setCurrentContainer: setCurrentContainer,\n }\n\n return (\n <SynapseErrorBoundary>\n <div className=\"EntityFinder\">\n <Box\n sx={{\n display: 'flex',\n justifyContent: 'space-between',\n mb: 2.5,\n rowGap: 2,\n columnGap: 4,\n flexWrap: { xs: 'wrap', md: 'nowrap' },\n }}\n >\n <Tabs\n value={currentTab}\n onChange={handleTabChange}\n sx={{ flex: 'none' }}\n >\n <Tab value={EntityFinderTab.BROWSE} label={'Browse'}></Tab>\n <Tab\n value={EntityFinderTab.SELECTED}\n label={\n <Stack\n direction={'row'}\n sx={{\n gap: 0.5,\n alignItems: 'center',\n }}\n >\n <span>Selected</span>\n <Chip\n size={'small'}\n label={selectedEntities.size.toLocaleString()}\n sx={{\n backgroundColor: 'tertiary.500',\n color: 'grey.900',\n height: '21px',\n }}\n ></Chip>\n </Stack>\n }\n ></Tab>\n </Tabs>\n <TextField\n size={'small'}\n placeholder=\"Search by name, wiki content, or SynID\"\n value={searchInput}\n onChange={event => {\n setSearchInput(event.target.value)\n }}\n onKeyDown={(event: any) => {\n if (event.key === 'Enter') {\n const trimmedInput = event.target.value.trim()\n setSearchActive(!!trimmedInput)\n if (trimmedInput) {\n setSearchTerms(trimmedInput.split(/\\s+/))\n setCurrentTab(EntityFinderTab.BROWSE)\n }\n }\n }}\n sx={{\n maxWidth: { xs: '100%', md: '350px' },\n flex: '1 1 350px',\n }}\n slotProps={{\n input: {\n startAdornment: (\n <InputAdornment position=\"start\">\n <SearchIcon />\n </InputAdornment>\n ),\n endAdornment: searchTerms ? (\n <InputAdornment position=\"end\">\n <IconButton\n size={'small'}\n onClick={() => {\n setSearchInput('')\n setSearchTerms(undefined)\n setSearchActive(false)\n }}\n aria-label=\"Clear Search\"\n disabled={!searchInput && !searchActive}\n >\n <ClearIcon />\n </IconButton>\n </InputAdornment>\n ) : undefined,\n },\n }}\n />\n </Box>\n <div\n role={'tabpanel'}\n className={`EntityFinder__MainPanel ${mainPanelClass}`}\n style={{\n display: currentTab === EntityFinderTab.BROWSE ? 'block' : 'none',\n }}\n >\n {/* We have a separate Details component for search in order to preserve state in the other component between searches */}\n {searchActive && (\n <EntityDetailsList\n configuration={\n searchByIdResults && searchByIdResults.length > 0\n ? {\n type: EntityDetailsListDataConfigurationType.HEADER_LIST,\n headerList: searchByIdResults,\n }\n : {\n type: EntityDetailsListDataConfigurationType.ENTITY_SEARCH,\n query: {\n queryTerm: searchTerms,\n booleanQuery:\n searchForOnlyTypesBooleanQuery(selectableTypes),\n },\n }\n }\n versionSelection={versionSelection}\n selectColumnType={selectMultiple ? 'checkbox' : 'none'}\n selected={selectedEntities}\n isIdSelected={isIdSelected}\n isSelectable={isSelectable}\n visibleTypes={selectableTypes}\n selectableTypes={selectableTypes}\n toggleSelection={toggleSelection}\n setInitialVersion={setInitialVersion}\n enableSelectAll={selectMultiple}\n // Intentionally do not pass \"setCurrentContainer\" -- search does not use the tree so it has nothing to update\n setCurrentContainer={undefined}\n />\n )}\n {\n <div style={searchActive ? { display: 'none' } : {}}>\n {treeOnly ? (\n <div>\n <SynapseErrorBoundary>\n <EntityTree\n toggleSelection={toggleSelection}\n showDropdown={true}\n visibleTypes={selectableAndVisibleTypesInTree}\n initialScope={initialScope}\n selectedEntities={selectedEntities}\n projectId={projectId}\n initialContainer={initialContainer}\n currentContainer={currentContainer}\n setCurrentContainer={setCurrentContainer}\n showScopeAsRootNode={false}\n treeNodeType={EntityTreeNodeType.SINGLE_PANE}\n selectableTypes={selectableTypes}\n />\n </SynapseErrorBoundary>\n </div>\n ) : (\n <div className=\"EntityFinderReflexContainer\">\n <ReflexContainer orientation=\"vertical\" windowResizeAware>\n <ReflexElement\n className=\"TreeViewReflexElement\"\n flex={0.24}\n >\n <SynapseErrorBoundary>\n <EntityTree\n selectedEntities={selectedEntities}\n setDetailsViewConfiguration={setConfigFromTreeView}\n showDropdown={true}\n visibleTypes={visibleTypesInTree}\n initialScope={initialScope}\n projectId={projectId}\n initialContainer={initialContainer}\n currentContainer={currentContainer}\n setCurrentContainer={setCurrentContainer}\n treeNodeType={EntityTreeNodeType.DUAL_PANE}\n setBreadcrumbItems={setBreadcrumbs}\n selectableTypes={visibleTypesInTree}\n />\n </SynapseErrorBoundary>\n </ReflexElement>\n <ReflexSplitter></ReflexSplitter>\n <ReflexElement className=\"DetailsViewReflexElement\">\n <SynapseErrorBoundary>\n <EntityDetailsList {...entityDetailsListProps} />\n <Breadcrumbs {...breadcrumbsProps} />\n </SynapseErrorBoundary>\n </ReflexElement>\n </ReflexContainer>\n </div>\n )}\n </div>\n }\n </div>\n <div\n role={'tabpanel'}\n className={'MainPanelSelected'}\n style={{\n display: currentTab === EntityFinderTab.SELECTED ? 'block' : 'none',\n }}\n >\n <EntityDetailsList\n {...entityDetailsListProps}\n configuration={{\n type: EntityDetailsListDataConfigurationType.REFERENCE_LIST,\n referenceList: Array.from(selectedEntitiesSnapshot.values()),\n }}\n />\n </div>\n </div>\n </SynapseErrorBoundary>\n )\n}\n\nexport default EntityFinder\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"VersionSelectionType.js","names":[],"sources":["../../../src/components/EntityFinder/VersionSelectionType.ts"],"sourcesContent":["/**\n * Documents the possible EntityFinder version selection configurations\n */\nexport enum VersionSelectionType {\n /** Versions cannot be selected. In dual-pane mode, the version column will not be shown. */\n DISALLOWED = 'DISALLOWED',\n /** A numbered version must be selected. The current version of tables will not be shown. */\n REQUIRED = 'REQUIRED',\n /**\n * Versions can be selected, including \"Always Latest\" version for any versionable entity type.\n * This should be selected if updates to the entity will not be \"tracked\" by the use case,\n * i.e. the widget will update when the entity is updated.\n */\n TRACKED = 'TRACKED',\n /**\n * Versions can be selected. Tables and views will allow selection of the \"Current\"/\"Draft\" version.\n * This should be selected if updates to the entity will not be \"tracked\" by the use case.\n */\n UNTRACKED = 'UNTRACKED',\n}\n"],"mappings":";AAGA,IAAY,IAAL,yBAAA,GAAA;QAEL,EAAA,
|
|
1
|
+
{"version":3,"file":"VersionSelectionType.js","names":[],"sources":["../../../src/components/EntityFinder/VersionSelectionType.ts"],"sourcesContent":["/**\n * Documents the possible EntityFinder version selection configurations\n */\nexport enum VersionSelectionType {\n /** Versions cannot be selected. In dual-pane mode, the version column will not be shown. */\n DISALLOWED = 'DISALLOWED',\n /** A numbered version must be selected. The current version of tables will not be shown. */\n REQUIRED = 'REQUIRED',\n /**\n * Versions can be selected, including \"Always Latest\" version for any versionable entity type.\n * This should be selected if updates to the entity will not be \"tracked\" by the use case,\n * i.e. the widget will update when the entity is updated.\n */\n TRACKED = 'TRACKED',\n /**\n * Versions can be selected. Tables and views will allow selection of the \"Current\"/\"Draft\" version.\n * This should be selected if updates to the entity will not be \"tracked\" by the use case.\n */\n UNTRACKED = 'UNTRACKED',\n}\n"],"mappings":";AAGA,IAAY,IAAL,yBAAA,GAAA;QAEL,EAAA,aAAa,cAEb,EAAA,WAAW,YAMX,EAAA,UAAU,WAKV,EAAA,YAAY;KACb"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"EntityChildrenDetails.js","names":[],"sources":["../../../../../src/components/EntityFinder/details/configurations/EntityChildrenDetails.tsx"],"sourcesContent":["import { useGetEntityChildrenInfinite } from '@/synapse-queries/entity/useGetEntityChildren'\nimport useGetIsAllSelectedFromInfiniteList from '@/utils/hooks/useGetIsAllSelectedInfiniteList'\nimport { Direction, SortBy } from '@sage-bionetworks/synapse-types'\nimport { SortingState } from '@tanstack/react-table'\nimport { useState } from 'react'\nimport { EntityDetailsListSharedProps } from '../EntityDetailsList'\nimport { DetailsView, DetailsViewColumn } from '../view/DetailsView'\n\ntype EntityChildrenDetailsProps = EntityDetailsListSharedProps & {\n parentContainerId: string\n}\n\nconst sortableColumns = [\n DetailsViewColumn.NAME,\n DetailsViewColumn.CREATED_ON,\n DetailsViewColumn.MODIFIED_ON,\n]\n\n/**\n * Translates TanStack table's SortBy state to the SortBy used in the Synapse getEntityChildren API\n */\nfunction convertColumnToSortBy(column: DetailsViewColumn): SortBy | undefined {\n switch (column) {\n case DetailsViewColumn.NAME:\n return SortBy.NAME\n case DetailsViewColumn.CREATED_ON:\n return SortBy.CREATED_ON\n case DetailsViewColumn.MODIFIED_ON:\n return SortBy.MODIFIED_ON\n }\n\n return undefined\n}\n\nexport function EntityChildrenDetails({\n parentContainerId,\n ...sharedProps\n}: EntityChildrenDetailsProps) {\n const [sortingState, setSortingState] = useState<SortingState>([\n {\n id: DetailsViewColumn.NAME,\n desc: false,\n },\n ])\n\n const getChildrenInfiniteRequestObject = {\n parentId: parentContainerId,\n includeTotalChildCount: true,\n includeTypes: sharedProps.visibleTypes,\n sortBy: sortingState[0]\n ? convertColumnToSortBy(sortingState[0].id as DetailsViewColumn)\n : undefined,\n sortDirection: sortingState[0]\n ? sortingState[0].desc\n ? Direction.DESC\n : Direction.ASC\n : undefined,\n }\n const { data, isLoading, isFetchingNextPage, hasNextPage, fetchNextPage } =\n useGetEntityChildrenInfinite(getChildrenInfiniteRequestObject, {\n throwOnError: true,\n })\n const entities = data?.pages.flatMap(page => page.page) ?? []\n const totalEntities = data?.pages[0].totalChildCount\n\n const selectAllCheckboxState = useGetIsAllSelectedFromInfiniteList(\n entities,\n sharedProps.selected.size,\n sharedProps.isIdSelected,\n sharedProps.isSelectable,\n hasNextPage,\n fetchNextPage,\n isFetchingNextPage,\n )\n\n return (\n <DetailsView\n entities={entities}\n isLoading={isLoading}\n hasNextPage={hasNextPage}\n fetchNextPage={fetchNextPage}\n isFetchingNextPage={isFetchingNextPage}\n enableSorting={true}\n enableMultiSort={false}\n sortableColumns={sortableColumns}\n sorting={sortingState}\n onSortingChange={setSortingState}\n selectAllIsChecked={selectAllCheckboxState}\n getChildrenInfiniteRequestObject={getChildrenInfiniteRequestObject}\n totalEntities={totalEntities}\n {...sharedProps}\n />\n )\n}\n"],"mappings":";;;;;;;AAYA,IAAM,IAAkB;CACtB,EAAkB;CAClB,EAAkB;CAClB,EAAkB;CACnB;AAKD,SAAS,EAAsB,GAA+C;AAC5E,SAAQ,GAAR;EACE,KAAK,EAAkB,KACrB,QAAO,EAAO;EAChB,KAAK,EAAkB,WACrB,QAAO,EAAO;EAChB,KAAK,EAAkB,YACrB,QAAO,EAAO;;;AAMpB,SAAgB,EAAsB,EACpC,sBACA,GAAG,KAC0B;CAC7B,IAAM,CAAC,GAAc,KAAmB,EAAuB,CAC7D;EACE,IAAI,EAAkB;EACtB,MAAM;EACP,CACF,CAAC,EAEI,IAAmC;EACvC,UAAU;EACV,wBAAwB;EACxB,cAAc,EAAY;EAC1B,QAAQ,EAAa,KACjB,EAAsB,EAAa,GAAG,GAAwB,GAC9D,KAAA;EACJ,eAAe,EAAa,KACxB,EAAa,GAAG,OACd,EAAU,OACV,EAAU,MACZ,KAAA;EACL,EACK,EAAE,SAAM,cAAW,uBAAoB,gBAAa,qBACxD,EAA6B,GAAkC,EAC7D,cAAc,IACf,CAAC,EACE,IAAW,GAAM,MAAM,SAAQ,MAAQ,EAAK,KAAK,IAAI,EAAE,EACvD,IAAgB,GAAM,MAAM,GAAG;AAYrC,QACE,kBAAC,GAAD;EACY;EACC;EACE;EACE;EACK;EACpB,eAAe;EACf,iBAAiB;EACA;EACjB,SAAS;EACT,iBAAiB;EACjB,oBAtB2B,EAC7B,GACA,EAAY,SAAS,MACrB,EAAY,cACZ,EAAY,cACZ,GACA,GACA,
|
|
1
|
+
{"version":3,"file":"EntityChildrenDetails.js","names":[],"sources":["../../../../../src/components/EntityFinder/details/configurations/EntityChildrenDetails.tsx"],"sourcesContent":["import { useGetEntityChildrenInfinite } from '@/synapse-queries/entity/useGetEntityChildren'\nimport useGetIsAllSelectedFromInfiniteList from '@/utils/hooks/useGetIsAllSelectedInfiniteList'\nimport { Direction, SortBy } from '@sage-bionetworks/synapse-types'\nimport { SortingState } from '@tanstack/react-table'\nimport { useState } from 'react'\nimport { EntityDetailsListSharedProps } from '../EntityDetailsList'\nimport { DetailsView, DetailsViewColumn } from '../view/DetailsView'\n\ntype EntityChildrenDetailsProps = EntityDetailsListSharedProps & {\n parentContainerId: string\n}\n\nconst sortableColumns = [\n DetailsViewColumn.NAME,\n DetailsViewColumn.CREATED_ON,\n DetailsViewColumn.MODIFIED_ON,\n]\n\n/**\n * Translates TanStack table's SortBy state to the SortBy used in the Synapse getEntityChildren API\n */\nfunction convertColumnToSortBy(column: DetailsViewColumn): SortBy | undefined {\n switch (column) {\n case DetailsViewColumn.NAME:\n return SortBy.NAME\n case DetailsViewColumn.CREATED_ON:\n return SortBy.CREATED_ON\n case DetailsViewColumn.MODIFIED_ON:\n return SortBy.MODIFIED_ON\n }\n\n return undefined\n}\n\nexport function EntityChildrenDetails({\n parentContainerId,\n ...sharedProps\n}: EntityChildrenDetailsProps) {\n const [sortingState, setSortingState] = useState<SortingState>([\n {\n id: DetailsViewColumn.NAME,\n desc: false,\n },\n ])\n\n const getChildrenInfiniteRequestObject = {\n parentId: parentContainerId,\n includeTotalChildCount: true,\n includeTypes: sharedProps.visibleTypes,\n sortBy: sortingState[0]\n ? convertColumnToSortBy(sortingState[0].id as DetailsViewColumn)\n : undefined,\n sortDirection: sortingState[0]\n ? sortingState[0].desc\n ? Direction.DESC\n : Direction.ASC\n : undefined,\n }\n const { data, isLoading, isFetchingNextPage, hasNextPage, fetchNextPage } =\n useGetEntityChildrenInfinite(getChildrenInfiniteRequestObject, {\n throwOnError: true,\n })\n const entities = data?.pages.flatMap(page => page.page) ?? []\n const totalEntities = data?.pages[0].totalChildCount\n\n const selectAllCheckboxState = useGetIsAllSelectedFromInfiniteList(\n entities,\n sharedProps.selected.size,\n sharedProps.isIdSelected,\n sharedProps.isSelectable,\n hasNextPage,\n fetchNextPage,\n isFetchingNextPage,\n )\n\n return (\n <DetailsView\n entities={entities}\n isLoading={isLoading}\n hasNextPage={hasNextPage}\n fetchNextPage={fetchNextPage}\n isFetchingNextPage={isFetchingNextPage}\n enableSorting={true}\n enableMultiSort={false}\n sortableColumns={sortableColumns}\n sorting={sortingState}\n onSortingChange={setSortingState}\n selectAllIsChecked={selectAllCheckboxState}\n getChildrenInfiniteRequestObject={getChildrenInfiniteRequestObject}\n totalEntities={totalEntities}\n {...sharedProps}\n />\n )\n}\n"],"mappings":";;;;;;;AAYA,IAAM,IAAkB;CACtB,EAAkB;CAClB,EAAkB;CAClB,EAAkB;CACnB;AAKD,SAAS,EAAsB,GAA+C;AAC5E,SAAQ,GAAR;EACE,KAAK,EAAkB,KACrB,QAAO,EAAO;EAChB,KAAK,EAAkB,WACrB,QAAO,EAAO;EAChB,KAAK,EAAkB,YACrB,QAAO,EAAO;;;AAMpB,SAAgB,EAAsB,EACpC,sBACA,GAAG,KAC0B;CAC7B,IAAM,CAAC,GAAc,KAAmB,EAAuB,CAC7D;EACE,IAAI,EAAkB;EACtB,MAAM;EACP,CACF,CAAC,EAEI,IAAmC;EACvC,UAAU;EACV,wBAAwB;EACxB,cAAc,EAAY;EAC1B,QAAQ,EAAa,KACjB,EAAsB,EAAa,GAAG,GAAwB,GAC9D,KAAA;EACJ,eAAe,EAAa,KACxB,EAAa,GAAG,OACd,EAAU,OACV,EAAU,MACZ,KAAA;EACL,EACK,EAAE,SAAM,cAAW,uBAAoB,gBAAa,qBACxD,EAA6B,GAAkC,EAC7D,cAAc,IACf,CAAC,EACE,IAAW,GAAM,MAAM,SAAQ,MAAQ,EAAK,KAAK,IAAI,EAAE,EACvD,IAAgB,GAAM,MAAM,GAAG;AAYrC,QACE,kBAAC,GAAD;EACY;EACC;EACE;EACE;EACK;EACpB,eAAe;EACf,iBAAiB;EACA;EACjB,SAAS;EACT,iBAAiB;EACjB,oBAtB2B,EAC7B,GACA,EAAY,SAAS,MACrB,EAAY,cACZ,EAAY,cACZ,GACA,GACA,EAesB;EACc;EACnB;EACf,GAAI;EACJ,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FavoritesDetails.js","names":[],"sources":["../../../../../src/components/EntityFinder/details/configurations/FavoritesDetails.tsx"],"sourcesContent":["import { useGetFavoritesInfinite } from '@/synapse-queries/user/useFavorites'\nimport useGetIsAllSelectedFromInfiniteList from '@/utils/hooks/useGetIsAllSelectedInfiniteList'\nimport { EntityDetailsListSharedProps } from '../EntityDetailsList'\nimport { DetailsView } from '../view/DetailsView'\n\ntype FavoritesDetailsProps = EntityDetailsListSharedProps\n\nexport function FavoritesDetails({ ...sharedProps }: FavoritesDetailsProps) {\n const { data, isLoading, hasNextPage, fetchNextPage, isFetchingNextPage } =\n useGetFavoritesInfinite('NAME', 'ASC', { throwOnError: true })\n\n const entities = data?.pages.flatMap(page => page.results) ?? []\n\n const selectAllCheckboxState = useGetIsAllSelectedFromInfiniteList(\n entities,\n sharedProps.selected.size,\n sharedProps.isIdSelected,\n sharedProps.isSelectable,\n hasNextPage,\n fetchNextPage,\n isFetchingNextPage,\n )\n\n return (\n <DetailsView\n entities={entities}\n isLoading={isLoading}\n hasNextPage={hasNextPage}\n fetchNextPage={fetchNextPage}\n isFetchingNextPage={isFetchingNextPage}\n selectAllIsChecked={selectAllCheckboxState}\n {...sharedProps}\n />\n )\n}\n"],"mappings":";;;;;AAOA,SAAgB,EAAiB,EAAE,GAAG,KAAsC;CAC1E,IAAM,EAAE,SAAM,cAAW,gBAAa,kBAAe,0BACnD,EAAwB,QAAQ,OAAO,EAAE,cAAc,IAAM,CAAC,EAE1D,IAAW,GAAM,MAAM,SAAQ,MAAQ,EAAK,QAAQ,IAAI,EAAE;AAYhE,QACE,kBAAC,GAAD;EACY;EACC;EACE;EACE;EACK;EACpB,oBAjB2B,EAC7B,GACA,EAAY,SAAS,MACrB,EAAY,cACZ,EAAY,cACZ,GACA,GACA,
|
|
1
|
+
{"version":3,"file":"FavoritesDetails.js","names":[],"sources":["../../../../../src/components/EntityFinder/details/configurations/FavoritesDetails.tsx"],"sourcesContent":["import { useGetFavoritesInfinite } from '@/synapse-queries/user/useFavorites'\nimport useGetIsAllSelectedFromInfiniteList from '@/utils/hooks/useGetIsAllSelectedInfiniteList'\nimport { EntityDetailsListSharedProps } from '../EntityDetailsList'\nimport { DetailsView } from '../view/DetailsView'\n\ntype FavoritesDetailsProps = EntityDetailsListSharedProps\n\nexport function FavoritesDetails({ ...sharedProps }: FavoritesDetailsProps) {\n const { data, isLoading, hasNextPage, fetchNextPage, isFetchingNextPage } =\n useGetFavoritesInfinite('NAME', 'ASC', { throwOnError: true })\n\n const entities = data?.pages.flatMap(page => page.results) ?? []\n\n const selectAllCheckboxState = useGetIsAllSelectedFromInfiniteList(\n entities,\n sharedProps.selected.size,\n sharedProps.isIdSelected,\n sharedProps.isSelectable,\n hasNextPage,\n fetchNextPage,\n isFetchingNextPage,\n )\n\n return (\n <DetailsView\n entities={entities}\n isLoading={isLoading}\n hasNextPage={hasNextPage}\n fetchNextPage={fetchNextPage}\n isFetchingNextPage={isFetchingNextPage}\n selectAllIsChecked={selectAllCheckboxState}\n {...sharedProps}\n />\n )\n}\n"],"mappings":";;;;;AAOA,SAAgB,EAAiB,EAAE,GAAG,KAAsC;CAC1E,IAAM,EAAE,SAAM,cAAW,gBAAa,kBAAe,0BACnD,EAAwB,QAAQ,OAAO,EAAE,cAAc,IAAM,CAAC,EAE1D,IAAW,GAAM,MAAM,SAAQ,MAAQ,EAAK,QAAQ,IAAI,EAAE;AAYhE,QACE,kBAAC,GAAD;EACY;EACC;EACE;EACE;EACK;EACpB,oBAjB2B,EAC7B,GACA,EAAY,SAAS,MACrB,EAAY,cACZ,EAAY,cACZ,GACA,GACA,EAUsB;EACpB,GAAI;EACJ,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ProjectListDetails.js","names":[],"sources":["../../../../../src/components/EntityFinder/details/configurations/ProjectListDetails.tsx"],"sourcesContent":["import { useGetProjectsInfinite } from '@/synapse-queries/user/useProjects'\nimport useGetIsAllSelectedFromInfiniteList from '@/utils/hooks/useGetIsAllSelectedInfiniteList'\nimport {\n GetProjectsParameters,\n ProjectHeader,\n} from '@sage-bionetworks/synapse-types'\nimport { EntityHeaderFromProjectHeader } from '../../EntityFinderHeader'\nimport { EntityDetailsListSharedProps } from '../EntityDetailsList'\nimport { DetailsView } from '../view/DetailsView'\n\ntype ProjectListDetailsProps = EntityDetailsListSharedProps & {\n projectsParams: GetProjectsParameters\n}\n\nexport function toEntityHeader(\n projectHeader: ProjectHeader,\n): EntityHeaderFromProjectHeader {\n return {\n ...projectHeader,\n type: 'org.sagebionetworks.repo.model.Project',\n }\n}\n\nexport function ProjectListDetails({\n projectsParams,\n ...sharedProps\n}: ProjectListDetailsProps) {\n const { data, isLoading, isFetchingNextPage, hasNextPage, fetchNextPage } =\n useGetProjectsInfinite(projectsParams, { throwOnError: true })\n\n const projects =\n data?.pages.flatMap(page => page.results).map(toEntityHeader) ?? []\n\n const selectAllCheckboxState = useGetIsAllSelectedFromInfiniteList(\n projects,\n sharedProps.selected.size,\n sharedProps.isIdSelected,\n sharedProps.isSelectable,\n hasNextPage,\n fetchNextPage,\n isFetchingNextPage,\n )\n\n return (\n <DetailsView\n entities={projects}\n isLoading={isLoading}\n hasNextPage={hasNextPage}\n fetchNextPage={fetchNextPage}\n isFetchingNextPage={isFetchingNextPage}\n selectAllIsChecked={selectAllCheckboxState}\n {...sharedProps}\n />\n )\n}\n"],"mappings":";;;;;AAcA,SAAgB,EACd,GAC+B;AAC/B,QAAO;EACL,GAAG;EACH,MAAM;EACP;;AAGH,SAAgB,EAAmB,EACjC,mBACA,GAAG,KACuB;CAC1B,IAAM,EAAE,SAAM,cAAW,uBAAoB,gBAAa,qBACxD,EAAuB,GAAgB,EAAE,cAAc,IAAM,CAAC,EAE1D,IACJ,GAAM,MAAM,SAAQ,MAAQ,EAAK,QAAQ,CAAC,IAAI,EAAe,IAAI,EAAE;AAYrE,QACE,kBAAC,GAAD;EACE,UAAU;EACC;EACE;EACE;EACK;EACpB,oBAjB2B,EAC7B,GACA,EAAY,SAAS,MACrB,EAAY,cACZ,EAAY,cACZ,GACA,GACA,
|
|
1
|
+
{"version":3,"file":"ProjectListDetails.js","names":[],"sources":["../../../../../src/components/EntityFinder/details/configurations/ProjectListDetails.tsx"],"sourcesContent":["import { useGetProjectsInfinite } from '@/synapse-queries/user/useProjects'\nimport useGetIsAllSelectedFromInfiniteList from '@/utils/hooks/useGetIsAllSelectedInfiniteList'\nimport {\n GetProjectsParameters,\n ProjectHeader,\n} from '@sage-bionetworks/synapse-types'\nimport { EntityHeaderFromProjectHeader } from '../../EntityFinderHeader'\nimport { EntityDetailsListSharedProps } from '../EntityDetailsList'\nimport { DetailsView } from '../view/DetailsView'\n\ntype ProjectListDetailsProps = EntityDetailsListSharedProps & {\n projectsParams: GetProjectsParameters\n}\n\nexport function toEntityHeader(\n projectHeader: ProjectHeader,\n): EntityHeaderFromProjectHeader {\n return {\n ...projectHeader,\n type: 'org.sagebionetworks.repo.model.Project',\n }\n}\n\nexport function ProjectListDetails({\n projectsParams,\n ...sharedProps\n}: ProjectListDetailsProps) {\n const { data, isLoading, isFetchingNextPage, hasNextPage, fetchNextPage } =\n useGetProjectsInfinite(projectsParams, { throwOnError: true })\n\n const projects =\n data?.pages.flatMap(page => page.results).map(toEntityHeader) ?? []\n\n const selectAllCheckboxState = useGetIsAllSelectedFromInfiniteList(\n projects,\n sharedProps.selected.size,\n sharedProps.isIdSelected,\n sharedProps.isSelectable,\n hasNextPage,\n fetchNextPage,\n isFetchingNextPage,\n )\n\n return (\n <DetailsView\n entities={projects}\n isLoading={isLoading}\n hasNextPage={hasNextPage}\n fetchNextPage={fetchNextPage}\n isFetchingNextPage={isFetchingNextPage}\n selectAllIsChecked={selectAllCheckboxState}\n {...sharedProps}\n />\n )\n}\n"],"mappings":";;;;;AAcA,SAAgB,EACd,GAC+B;AAC/B,QAAO;EACL,GAAG;EACH,MAAM;EACP;;AAGH,SAAgB,EAAmB,EACjC,mBACA,GAAG,KACuB;CAC1B,IAAM,EAAE,SAAM,cAAW,uBAAoB,gBAAa,qBACxD,EAAuB,GAAgB,EAAE,cAAc,IAAM,CAAC,EAE1D,IACJ,GAAM,MAAM,SAAQ,MAAQ,EAAK,QAAQ,CAAC,IAAI,EAAe,IAAI,EAAE;AAYrE,QACE,kBAAC,GAAD;EACE,UAAU;EACC;EACE;EACE;EACK;EACpB,oBAjB2B,EAC7B,GACA,EAAY,SAAS,MACrB,EAAY,cACZ,EAAY,cACZ,GACA,GACA,EAUsB;EACpB,GAAI;EACJ,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DetailsView.js","names":[],"sources":["../../../../../src/components/EntityFinder/details/view/DetailsView.tsx"],"sourcesContent":["import { getEntityVersions } from '@/synapse-client/SynapseClient'\nimport { useSynapseContext } from '@/utils/context/SynapseContext'\nimport {\n getEntityTypeFromHeader,\n isContainerType,\n isTableType,\n isVersionableEntityType,\n} from '@/utils/functions/EntityTypeUtils'\nimport { TABLE_VERSION_IN_PROGRESS } from '@/utils/SynapseConstants'\nimport { Checkbox, Tooltip } from '@mui/material'\nimport { EntityType } from '@sage-bionetworks/synapse-client'\nimport {\n EntityChildrenRequest,\n EntityHeader,\n Reference,\n} from '@sage-bionetworks/synapse-types'\nimport { useQueryClient } from '@tanstack/react-query'\nimport {\n CellContext,\n createColumnHelper,\n getCoreRowModel,\n OnChangeFn,\n SortingState,\n Table,\n useReactTable,\n} from '@tanstack/react-table'\nimport { useVirtualizer } from '@tanstack/react-virtual'\nimport {\n ReactNode,\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from 'react'\nimport {\n BlockingLoader,\n SynapseSpinner,\n} from '../../../LoadingScreen/LoadingScreen'\nimport ColumnHeader from '../../../TanStackTable/ColumnHeader'\nimport StyledVirtualTanStackTable from '../../../TanStackTable/StyledVirtualTanStackTable'\nimport { EntityFinderHeader } from '../../EntityFinderHeader'\nimport { EntitySelectionMapType } from '../../useEntitySelection'\nimport { VersionSelectionType } from '../../VersionSelectionType'\nimport { EntityDetailsListSharedProps } from '../EntityDetailsList'\nimport { AddFileToDownloadListCell } from './table/AddToDownloadListCell'\nimport { CreatedOnCell } from './table/CreatedOnCell'\nimport { EntityBadgeIconsCell } from './table/EntityBadgeIconsCell'\nimport { EntityFinderCheckboxCell } from './table/EntityFinderCheckboxCell'\nimport { EntityFinderVersionCell } from './table/EntityFinderVersionCell'\nimport { EntityTypeCell } from './table/EntityTypeCell'\nimport { FileEntityDirectDownloadCell } from './table/FileEntityDirectDownloadCell'\nimport { FileEntityMD5Cell } from './table/FileEntityMD5Cell'\nimport { FileEntitySizeCell } from './table/FileEntitySizeCell'\nimport { ModifiedByCell } from './table/ModifiedByCell'\nimport { ModifiedOnCell } from './table/ModifiedOnCell'\nimport { VersionColumnHeader } from './VersionColumnHeader'\n\n/**\n * Check if a table type entity has the \"in progress\" version label.\n */\nfunction hasInProgressTableVersion(\n entityType: EntityType,\n header: EntityFinderHeader | EntityFinderTableViewRowData,\n): boolean {\n return (\n isTableType(entityType) &&\n 'versionLabel' in header &&\n header.versionLabel === TABLE_VERSION_IN_PROGRESS\n )\n}\n\n/**\n * Set of all columns that can be shown in the DetailsView\n * Note: Some of these values are used as accessors, so ensure that those columns match the accessor key in the row data\n */\nexport enum DetailsViewColumn {\n NAME = 'name',\n ENTITY_TYPE = 'entityType',\n ID = 'id',\n CREATED_ON = 'createdOn',\n MODIFIED_ON = 'modifiedOn',\n MODIFIED_BY = 'modifiedBy',\n ADD_TO_DOWNLOAD_CART = 'addToDownloadCart',\n DIRECT_DOWNLOAD = 'directDownload',\n SELECTED = 'selected',\n VERSION = 'version',\n SIZE = 'size',\n MD5 = 'md5',\n BADGES = 'badges',\n}\n\nexport type DetailsViewProps = EntityDetailsListSharedProps & {\n entities: EntityFinderHeader[]\n isLoading: boolean\n hasNextPage?: boolean\n fetchNextPage?: () => Promise<unknown>\n isFetchingNextPage?: boolean\n enableSorting?: boolean\n enableMultiSort?: boolean\n sortableColumns?: DetailsViewColumn[]\n /** The current sort of the view. */\n sorting?: SortingState\n /** If enableSorting is true, `setSort` will be invoked when the user tries to change the sort */\n onSortingChange?: OnChangeFn<SortingState>\n noResultsPlaceholder?: ReactNode\n /** We defer to the configuration component to determine this */\n selectAllIsChecked?: boolean\n /** This request object is only used to tell react-query to cancel fetching all children at once. */\n getChildrenInfiniteRequestObject?: EntityChildrenRequest\n /** The total number of entities that can be retrieved */\n totalEntities?: number\n}\n\n/**\n * Describes the shape of the data passed to the BaseTable\n */\nexport type EntityFinderTableViewRowData = EntityFinderHeader & {\n entityId: string\n versionNumber?: number\n entityType: EntityType\n isSelected: boolean\n isDisabled: boolean\n isVersionableEntity: boolean\n currentSelectedVersion?: number\n}\n\nconst columnHelper = createColumnHelper<EntityFinderTableViewRowData>()\n\nfunction NameRenderer(props: {\n context: CellContext<EntityFinderTableViewRowData, string>\n setCurrentContainer?: (containerId: string) => void\n}) {\n const { context, setCurrentContainer } = props\n const { row, getValue } = context\n const rowName = getValue()\n if (setCurrentContainer && isContainerType(row.original.entityType)) {\n return (\n <span\n role=\"link\"\n className=\"EntityFinderTableCellContainerLink\"\n onClick={e => {\n e.stopPropagation()\n setCurrentContainer(row.original.id)\n }}\n >\n <Tooltip title={rowName}>\n <span className=\"nameColumnCell\">{rowName}</span>\n </Tooltip>\n </span>\n )\n } else {\n return (\n <Tooltip title={rowName}>\n <span className=\"nameColumnCell\">{rowName}</span>\n </Tooltip>\n )\n }\n}\n\nfunction SelectAllCheckboxRenderer(props: {\n isVisible: boolean\n disabled: boolean\n checked: boolean\n onSelectAll: () => void\n}) {\n const { isVisible, disabled, checked, onSelectAll } = props\n if (!isVisible) {\n return null\n }\n\n return (\n <Checkbox\n inputProps={{ 'aria-label': 'Select All' }}\n checked={checked}\n disabled={disabled}\n onChange={() => {\n onSelectAll()\n }}\n />\n )\n}\n\nfunction getColumns(opts: {\n setCurrentContainer?: (containerId: string) => void\n isSelectAllVisible: boolean\n isSelectAllDisabled: boolean\n isSelectAllChecked: boolean\n onSelectAll: () => void\n versionSelection: VersionSelectionType\n toggleSelection: (entity: Reference | Reference[]) => void\n setInitialVersion: (entityId: string, version: number) => void\n sortableColumns?: DetailsViewColumn[]\n}) {\n const {\n setCurrentContainer,\n isSelectAllVisible,\n isSelectAllDisabled,\n isSelectAllChecked,\n onSelectAll,\n versionSelection,\n toggleSelection,\n setInitialVersion,\n sortableColumns = [],\n } = opts\n return [\n columnHelper.display({\n id: DetailsViewColumn.SELECTED,\n minSize: 50,\n maxSize: 50,\n size: 50,\n header: () => (\n <SelectAllCheckboxRenderer\n isVisible={isSelectAllVisible}\n disabled={isSelectAllDisabled}\n checked={isSelectAllChecked}\n onSelectAll={onSelectAll}\n />\n ),\n cell: EntityFinderCheckboxCell,\n }),\n\n columnHelper.accessor(DetailsViewColumn.ENTITY_TYPE, {\n minSize: 45,\n maxSize: 45,\n size: 45,\n header: () => null,\n enableResizing: false,\n cell: EntityTypeCell,\n meta: {\n textAlign: 'center',\n },\n }),\n columnHelper.accessor(DetailsViewColumn.NAME, {\n size: 300,\n enableSorting: sortableColumns.includes(DetailsViewColumn.NAME),\n // sortable: sort != null,\n // resizable: true,\n header: props => <ColumnHeader {...props} title={'Name'} />,\n cell: context => (\n <NameRenderer\n context={context}\n setCurrentContainer={setCurrentContainer}\n />\n ),\n enableColumnFilter: false,\n }),\n columnHelper.display({\n id: DetailsViewColumn.BADGES,\n minSize: 75,\n maxSize: 75,\n size: 75,\n header: () => null,\n cell: EntityBadgeIconsCell,\n }),\n columnHelper.accessor(DetailsViewColumn.ID, {\n size: 130,\n header: props => <ColumnHeader {...props} title={'ID'} />,\n minSize: 130,\n enableColumnFilter: false,\n enableSorting: sortableColumns.includes(DetailsViewColumn.ID),\n }),\n columnHelper.display({\n id: DetailsViewColumn.VERSION,\n minSize: 150,\n size: 200,\n header: () => <VersionColumnHeader versionSelection={versionSelection} />,\n cell: context => (\n <EntityFinderVersionCell\n versionSelection={versionSelection}\n toggleSelection={toggleSelection}\n setInitialVersion={setInitialVersion}\n context={context}\n />\n ),\n }),\n columnHelper.accessor(DetailsViewColumn.CREATED_ON, {\n header: props => <ColumnHeader {...props} title={'Created On'} />,\n size: 220,\n minSize: 170,\n cell: CreatedOnCell,\n enableColumnFilter: false,\n enableSorting: sortableColumns.includes(DetailsViewColumn.CREATED_ON),\n }),\n columnHelper.accessor(DetailsViewColumn.MODIFIED_ON, {\n header: props => <ColumnHeader {...props} title={'Modified On'} />,\n size: 220,\n minSize: 170,\n enableColumnFilter: false,\n cell: ModifiedOnCell,\n enableSorting: sortableColumns.includes(DetailsViewColumn.MODIFIED_ON),\n }),\n columnHelper.accessor(DetailsViewColumn.MODIFIED_BY, {\n header: props => <ColumnHeader {...props} title={'Modified By'} />,\n size: 250,\n enableResizing: true,\n cell: ModifiedByCell,\n enableColumnFilter: false,\n enableSorting: sortableColumns.includes(DetailsViewColumn.MODIFIED_BY),\n }),\n columnHelper.display({\n id: DetailsViewColumn.SIZE,\n header: props => <ColumnHeader {...props} title={'Size'} />,\n size: 120,\n minSize: 85,\n enableSorting: false,\n enableResizing: true,\n cell: FileEntitySizeCell,\n }),\n columnHelper.display({\n id: DetailsViewColumn.MD5,\n header: props => <ColumnHeader {...props} title={'MD5'} />,\n size: 200,\n enableSorting: false,\n enableResizing: true,\n cell: FileEntityMD5Cell,\n }),\n columnHelper.display({\n id: DetailsViewColumn.ADD_TO_DOWNLOAD_CART,\n header: () => null,\n size: 45,\n minSize: 45,\n enableSorting: false,\n enableResizing: false,\n cell: AddFileToDownloadListCell,\n }),\n columnHelper.display({\n id: DetailsViewColumn.DIRECT_DOWNLOAD,\n header: props => <ColumnHeader {...props} title={'Actions'} />,\n size: 75,\n minSize: 75,\n enableSorting: false,\n enableResizing: false,\n cell: FileEntityDirectDownloadCell,\n }),\n ]\n}\n\ntype DetailsViewRowAppearance = 'hidden' | 'disabled' | 'selected' | 'default'\n\nconst determineRowAppearance = (args: {\n visibleTypes: EntityType[]\n selectableTypes: EntityType[]\n selected: EntitySelectionMapType\n entity: EntityFinderHeader\n}): DetailsViewRowAppearance => {\n const { visibleTypes, selectableTypes, selected, entity } = args\n if (!visibleTypes.includes(getEntityTypeFromHeader(entity))) {\n return 'hidden'\n } else if (!selectableTypes.includes(getEntityTypeFromHeader(entity))) {\n return 'disabled'\n } else if (selected.has(entity.id)) {\n return 'selected'\n } else {\n return 'default'\n }\n}\n\nconst DEFAULT_HIDDEN_COLUMNS = [DetailsViewColumn.DIRECT_DOWNLOAD]\n\n/**\n * Displays a list of entities in a table.\n *\n * If the list of entities is paginated, the `hasNextPage` prop can be set to indicate that there is more data to load.\n * When the view is ready to load more data, the `fetchNextPage` callback will be invoked. The view is designed to handle\n * an \"infinite scroll\" pattern, so entities should not be removed from the list when loading the next page.\n */\nexport function DetailsView(props: DetailsViewProps) {\n const {\n entities,\n isLoading,\n hasNextPage,\n fetchNextPage,\n isFetchingNextPage,\n versionSelection,\n selectColumnType,\n selected,\n visibleTypes,\n selectableTypes,\n toggleSelection,\n setInitialVersion,\n enableSorting,\n enableMultiSort,\n sortableColumns,\n sorting,\n onSortingChange,\n noResultsPlaceholder,\n enableSelectAll,\n selectAllIsChecked = false,\n getChildrenInfiniteRequestObject,\n totalEntities,\n setCurrentContainer,\n hiddenColumns = DEFAULT_HIDDEN_COLUMNS,\n } = props\n const queryClient = useQueryClient()\n\n const { accessToken, keyFactory: queryClientKeyFactory } = useSynapseContext()\n\n const showSelectColumn = selectColumnType !== 'none'\n\n const [shouldSelectAll, setShouldSelectAll] = useState(false)\n const [showLoadingScreen, setShowLoadingScreen] = useState(false)\n\n const cancelQuery = () => {\n // It's likely that the user will be throttled by the Synapse backend and may be waiting a\n // noticeable amount of time for the current request, so cancel it (in addition to cancelling future requests)\n void queryClient.cancelQueries({\n queryKey: queryClientKeyFactory.getEntityChildrenQueryKey(\n getChildrenInfiniteRequestObject!,\n true,\n ),\n })\n setShowLoadingScreen(false)\n setShouldSelectAll(false)\n }\n\n useEffect(() => {\n async function handleSelectAll() {\n if (shouldSelectAll) {\n if (hasNextPage && fetchNextPage) {\n // Show the loading screen since we must fetch data (potentially a lot) to finish the task\n setShowLoadingScreen(true)\n if (!isFetchingNextPage) {\n void fetchNextPage()\n // The effect will re-run after fetch completes, and the next page (if it exists) will be fetched.\n }\n } else {\n if (selectAllIsChecked) {\n // All the items are selected, so we will deselect all\n toggleSelection(\n entities\n .filter(e => {\n // Collect just entities that are selected\n // An entity may be in the list and unselected because it isn't of a selectable type\n return selected.has(e.id)\n })\n .map(e => selected.get(e.id)!),\n )\n } else {\n // Not all the items are selected, so we will select all\n toggleSelection(\n await Promise.all(\n entities\n .filter(e => {\n // must filter just selectable types or else any entities of unselectable types will get selected\n const type = getEntityTypeFromHeader(e)\n // also exclude already-selected entities, since we don't want to toggle those\n return (\n !selected.has(e.id) &&\n selectableTypes.includes(type) &&\n visibleTypes.includes(type)\n )\n })\n .map(async e => {\n let latestVersion: number | undefined\n const entityType = getEntityTypeFromHeader(e)\n if (\n versionSelection === VersionSelectionType.REQUIRED &&\n isVersionableEntityType(entityType)\n ) {\n // If VersionSelectionType.REQUIRED, then we need to supply a version with the entity.\n // We may already have the version from the header, but only use it if it's a valid snapshot\n // (table types with \"in progress\" are not valid)\n if (\n Object.prototype.hasOwnProperty.call(\n e,\n 'versionNumber',\n ) &&\n !hasInProgressTableVersion(\n entityType,\n e as EntityHeader,\n )\n ) {\n latestVersion = (e as EntityHeader).versionNumber\n }\n if (!latestVersion) {\n // Failsafe if we didn't get the version in the header. This is rare/unlikely, since the only cases we're sure we don't get versions are:\n // - ProjectHeaders (which are versionless)\n // - Search Results (for which we don't support Select All)\n // - Table types, whose entity headers report the \"in progress\" version rather than the latest stable snapshot\n // For large lists, there's a good chance for this to trigger throttling.\n\n // Show the loading screen since we must fetch data (potentially a lot) to finish the task\n setShowLoadingScreen(true)\n\n const versionsQueryOffset = 0\n const versionsQueryLimit = 1\n const versions = await queryClient.fetchQuery({\n queryKey:\n queryClientKeyFactory.getPaginatedEntityVersionsQueryKey(\n e.id,\n versionsQueryLimit,\n versionsQueryOffset,\n ),\n queryFn: () =>\n getEntityVersions(\n e.id,\n accessToken,\n versionsQueryOffset,\n versionsQueryLimit,\n ),\n })\n // we pick the first version in the list because it is the most recent\n latestVersion = versions.results[0]?.versionNumber\n }\n }\n return {\n targetId: e.id,\n targetVersionNumber: latestVersion,\n }\n }),\n ),\n )\n }\n setShouldSelectAll(false)\n setShowLoadingScreen(false)\n }\n }\n }\n handleSelectAll()\n }, [\n accessToken,\n entities,\n fetchNextPage,\n hasNextPage,\n versionSelection,\n queryClient,\n isFetchingNextPage,\n selectAllIsChecked,\n selectableTypes,\n selected,\n shouldSelectAll,\n toggleSelection,\n visibleTypes,\n queryClientKeyFactory,\n ])\n\n const tableData = useMemo(\n () =>\n entities.reduce((entities: EntityFinderTableViewRowData[], entity) => {\n const appearance = determineRowAppearance({\n visibleTypes,\n selectableTypes,\n selected,\n entity,\n })\n if (appearance !== 'hidden') {\n // only include entities that should not be hidden\n const entityType = getEntityTypeFromHeader(entity)\n\n const currentSelectedVersion = selected.get(\n entity.id,\n )?.targetVersionNumber\n let versionNumber: number | undefined = undefined\n if ('versionNumber' in entity) {\n if (currentSelectedVersion != null) {\n // if a version is selected, the row should show that version's data\n versionNumber = currentSelectedVersion\n } else if (versionSelection === VersionSelectionType.REQUIRED) {\n // if a version is not selected, but version selection is required, the row should show the latest version's data\n // Only use EntityHeader's version if it's a valid snapshot (table types with \"in progress\" are not valid)\n if (!hasInProgressTableVersion(entityType, entity)) {\n versionNumber = entity.versionNumber\n }\n }\n // otherwise, show the current version's data (versionNumber is undefined)\n }\n\n entities.push({\n ...entity,\n entityId: entity.id,\n versionNumber: versionNumber,\n entityType: entityType,\n isSelected: appearance === 'selected',\n isDisabled: appearance === 'disabled',\n isVersionableEntity: isVersionableEntityType(entityType),\n currentSelectedVersion: currentSelectedVersion,\n })\n }\n return entities\n }, []),\n [entities, selectableTypes, selected, versionSelection, visibleTypes],\n )\n\n const isSelectAllVisible = enableSelectAll\n\n // Enabled if there's at least one visible & selectable entity, OR there's a page we haven't fetched\n const isSelectAllDisabled = !(\n hasNextPage ||\n entities.filter(\n e =>\n selectableTypes.includes(getEntityTypeFromHeader(e)) &&\n visibleTypes.includes(getEntityTypeFromHeader(e)),\n ).length > 0\n )\n\n const columns = useMemo(\n () =>\n getColumns({\n setCurrentContainer,\n isSelectAllVisible: isSelectAllVisible,\n isSelectAllDisabled: isSelectAllDisabled,\n isSelectAllChecked: selectAllIsChecked,\n onSelectAll: () => {\n setShouldSelectAll(true)\n },\n versionSelection,\n toggleSelection,\n setInitialVersion,\n sortableColumns,\n }),\n [\n isSelectAllDisabled,\n isSelectAllVisible,\n selectAllIsChecked,\n setCurrentContainer,\n setInitialVersion,\n sortableColumns,\n toggleSelection,\n versionSelection,\n ],\n )\n\n const hideColumnOverrides = useMemo(() => {\n return hiddenColumns.reduce(\n (acc: Partial<Record<DetailsViewColumn, boolean>>, column) => {\n acc[column] = false\n return acc\n },\n {},\n )\n }, [hiddenColumns])\n\n const table: Table<EntityFinderTableViewRowData> =\n useReactTable<EntityFinderTableViewRowData>({\n data: tableData,\n columns,\n getCoreRowModel: getCoreRowModel(),\n columnResizeMode: 'onChange',\n manualSorting: true,\n enableSorting,\n enableMultiSort,\n onSortingChange,\n state: {\n sorting,\n columnVisibility: {\n [DetailsViewColumn.SELECTED]: showSelectColumn,\n [DetailsViewColumn.VERSION]:\n versionSelection !== VersionSelectionType.DISALLOWED,\n [DetailsViewColumn.SIZE]: visibleTypes.includes(EntityType.file),\n [DetailsViewColumn.MD5]: visibleTypes.includes(EntityType.file),\n [DetailsViewColumn.ADD_TO_DOWNLOAD_CART]: visibleTypes.includes(\n EntityType.file,\n ),\n [DetailsViewColumn.DIRECT_DOWNLOAD]: visibleTypes.includes(\n EntityType.file,\n ),\n ...hideColumnOverrides,\n },\n },\n })\n\n const tableContainerRef = useRef<HTMLDivElement>(null)\n\n const rowVirtualizer = useVirtualizer({\n count: totalEntities ?? table.getRowModel().rows.length,\n estimateSize: () => 40, // estimate row height for accurate scrollbar dragging\n getScrollElement: () => tableContainerRef.current,\n // measure dynamic row height, except in firefox because it measures table border height incorrectly\n measureElement:\n typeof window !== 'undefined' &&\n navigator.userAgent.indexOf('Firefox') === -1\n ? element => element?.getBoundingClientRect().height\n : undefined,\n overscan: 5,\n })\n\n function onRowClick(rowData: EntityFinderTableViewRowData) {\n const { id, isDisabled, isVersionableEntity, entityType } = rowData\n let { currentSelectedVersion } = rowData\n if (!isDisabled) {\n if (\n isVersionableEntity &&\n versionSelection === VersionSelectionType.REQUIRED &&\n currentSelectedVersion == null &&\n Object.prototype.hasOwnProperty.call(rowData, 'versionNumber')\n ) {\n // Only use EntityHeader's version if it's a valid snapshot (table types with \"in progress\" are not valid)\n if (!hasInProgressTableVersion(entityType, rowData)) {\n currentSelectedVersion = rowData.versionNumber\n }\n // Note that here we aren't handling the case where the header doesn't have a version, e.g. a search result\n // That case is actually handled by the VersionRenderer, which has an effect that will toggle the selection after data is fetched.\n }\n\n toggleSelection({\n targetId: id,\n targetVersionNumber: currentSelectedVersion,\n })\n }\n }\n\n //called on scroll and possibly on mount to fetch more data as the user scrolls and reaches bottom of table\n const fetchMoreOnBottomReached = useCallback(\n (containerRefElement?: HTMLDivElement | null) => {\n if (containerRefElement) {\n const { scrollHeight, scrollTop, clientHeight } = containerRefElement\n\n //once the user has scrolled within 500px of the bottom of the table, fetch more data if we can\n if (\n scrollHeight - scrollTop - clientHeight < 500 &&\n !isFetchingNextPage &&\n hasNextPage &&\n fetchNextPage\n ) {\n void fetchNextPage()\n }\n }\n },\n [fetchNextPage, isFetchingNextPage, hasNextPage],\n )\n\n //a check on mount and after a fetch to see if the table is already scrolled to the bottom and immediately needs to fetch more data\n useEffect(() => {\n fetchMoreOnBottomReached(tableContainerRef.current)\n }, [entities, fetchMoreOnBottomReached])\n\n return (\n <div className=\"EntityFinderDetailsView\">\n <BlockingLoader\n show={showLoadingScreen}\n currentProgress={entities.length}\n totalProgress={totalEntities}\n hintText={\n totalEntities\n ? `${entities.length.toLocaleString()} of ${totalEntities?.toLocaleString()}`\n : `Fetching ${entities.length.toLocaleString()}`\n }\n headlineText={'Fetching selected items'}\n onCancel={cancelQuery}\n />\n {!isLoading && entities.length > 0 && (\n <StyledVirtualTanStackTable<EntityFinderTableViewRowData>\n styledTableContainerProps={{\n className: 'DetailsViewTable',\n ref: tableContainerRef,\n height: '100%',\n }}\n onTableContainerScroll={target =>\n fetchMoreOnBottomReached(target as HTMLDivElement)\n }\n table={table}\n rowVirtualizer={rowVirtualizer}\n slotProps={{\n Tr: ownerState => {\n const { tableRow } = ownerState\n\n return {\n className: `EntityFinderDetailsViewRow`,\n ['aria-selected']: tableRow?.original.isSelected,\n ['aria-disabled']: tableRow?.original.isDisabled,\n onClick: () => {\n if (tableRow) {\n onRowClick(tableRow.original)\n }\n },\n }\n },\n }}\n />\n )}\n {isLoading && (\n <div className=\"EntityFinderDetailsViewPlaceholder\">\n <SynapseSpinner size={30} />\n </div>\n )}\n {!isLoading && entities.length === 0 && (\n <div className=\"EntityFinderDetailsViewPlaceholder\">\n {noResultsPlaceholder || <div>Empty</div>}\n </div>\n )}\n </div>\n )\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;AA6DA,SAAS,EACP,GACA,GACS;AACT,QACE,EAAY,EAAW,IACvB,kBAAkB,KAClB,EAAO,iBAAA;;AAQX,IAAY,IAAL,yBAAA,GAAA;QACL,EAAA,OAAA,QACA,EAAA,cAAA,cACA,EAAA,KAAA,MACA,EAAA,aAAA,aACA,EAAA,cAAA,cACA,EAAA,cAAA,cACA,EAAA,uBAAA,qBACA,EAAA,kBAAA,kBACA,EAAA,WAAA,YACA,EAAA,UAAA,WACA,EAAA,OAAA,QACA,EAAA,MAAA,OACA,EAAA,SAAA;KACD,EAqCK,IAAe,GAAkD;AAEvE,SAAS,EAAa,GAGnB;CACD,IAAM,EAAE,YAAS,2BAAwB,GACnC,EAAE,QAAK,gBAAa,GACpB,IAAU,GAAU;AAiBxB,QAhBE,KAAuB,EAAgB,EAAI,SAAS,WAAW,GAE/D,kBAAC,QAAD;EACE,MAAK;EACL,WAAU;EACV,UAAS,MAAK;AAEZ,GADA,EAAE,iBAAiB,EACnB,EAAoB,EAAI,SAAS,GAAG;;YAGtC,kBAAC,GAAD;GAAS,OAAO;aACd,kBAAC,QAAD;IAAM,WAAU;cAAkB;IAAe,CAAA;GACzC,CAAA;EACL,CAAA,GAIP,kBAAC,GAAD;EAAS,OAAO;YACd,kBAAC,QAAD;GAAM,WAAU;aAAkB;GAAe,CAAA;EACzC,CAAA;;AAKhB,SAAS,EAA0B,GAKhC;CACD,IAAM,EAAE,cAAW,aAAU,YAAS,mBAAgB;AAKtD,QAJK,IAKH,kBAAC,GAAD;EACE,YAAY,EAAE,cAAc,cAAc;EACjC;EACC;EACV,gBAAgB;AACd,MAAa;;EAEf,CAAA,GAXK;;AAeX,SAAS,EAAW,GAUjB;CACD,IAAM,EACJ,wBACA,uBACA,wBACA,uBACA,gBACA,qBACA,oBACA,sBACA,qBAAkB,EAAE,KAClB;AACJ,QAAO;EACL,EAAa,QAAQ;GACnB,IAAI,EAAkB;GACtB,SAAS;GACT,SAAS;GACT,MAAM;GACN,cACE,kBAAC,GAAD;IACE,WAAW;IACX,UAAU;IACV,SAAS;IACI;IACb,CAAA;GAEJ,MAAM;GACP,CAAC;EAEF,EAAa,SAAS,EAAkB,aAAa;GACnD,SAAS;GACT,SAAS;GACT,MAAM;GACN,cAAc;GACd,gBAAgB;GAChB,MAAM;GACN,MAAM,EACJ,WAAW,UACZ;GACF,CAAC;EACF,EAAa,SAAS,EAAkB,MAAM;GAC5C,MAAM;GACN,eAAe,EAAgB,SAAS,EAAkB,KAAK;GAG/D,SAAQ,MAAS,kBAAC,GAAD;IAAc,GAAI;IAAO,OAAO;IAAU,CAAA;GAC3D,OAAM,MACJ,kBAAC,GAAD;IACW;IACY;IACrB,CAAA;GAEJ,oBAAoB;GACrB,CAAC;EACF,EAAa,QAAQ;GACnB,IAAI,EAAkB;GACtB,SAAS;GACT,SAAS;GACT,MAAM;GACN,cAAc;GACd,MAAM;GACP,CAAC;EACF,EAAa,SAAS,EAAkB,IAAI;GAC1C,MAAM;GACN,SAAQ,MAAS,kBAAC,GAAD;IAAc,GAAI;IAAO,OAAO;IAAQ,CAAA;GACzD,SAAS;GACT,oBAAoB;GACpB,eAAe,EAAgB,SAAS,EAAkB,GAAG;GAC9D,CAAC;EACF,EAAa,QAAQ;GACnB,IAAI,EAAkB;GACtB,SAAS;GACT,MAAM;GACN,cAAc,kBAAC,GAAD,EAAuC,qBAAoB,CAAA;GACzE,OAAM,MACJ,kBAAC,GAAD;IACoB;IACD;IACE;IACV;IACT,CAAA;GAEL,CAAC;EACF,EAAa,SAAS,EAAkB,YAAY;GAClD,SAAQ,MAAS,kBAAC,GAAD;IAAc,GAAI;IAAO,OAAO;IAAgB,CAAA;GACjE,MAAM;GACN,SAAS;GACT,MAAM;GACN,oBAAoB;GACpB,eAAe,EAAgB,SAAS,EAAkB,WAAW;GACtE,CAAC;EACF,EAAa,SAAS,EAAkB,aAAa;GACnD,SAAQ,MAAS,kBAAC,GAAD;IAAc,GAAI;IAAO,OAAO;IAAiB,CAAA;GAClE,MAAM;GACN,SAAS;GACT,oBAAoB;GACpB,MAAM;GACN,eAAe,EAAgB,SAAS,EAAkB,YAAY;GACvE,CAAC;EACF,EAAa,SAAS,EAAkB,aAAa;GACnD,SAAQ,MAAS,kBAAC,GAAD;IAAc,GAAI;IAAO,OAAO;IAAiB,CAAA;GAClE,MAAM;GACN,gBAAgB;GAChB,MAAM;GACN,oBAAoB;GACpB,eAAe,EAAgB,SAAS,EAAkB,YAAY;GACvE,CAAC;EACF,EAAa,QAAQ;GACnB,IAAI,EAAkB;GACtB,SAAQ,MAAS,kBAAC,GAAD;IAAc,GAAI;IAAO,OAAO;IAAU,CAAA;GAC3D,MAAM;GACN,SAAS;GACT,eAAe;GACf,gBAAgB;GAChB,MAAM;GACP,CAAC;EACF,EAAa,QAAQ;GACnB,IAAI,EAAkB;GACtB,SAAQ,MAAS,kBAAC,GAAD;IAAc,GAAI;IAAO,OAAO;IAAS,CAAA;GAC1D,MAAM;GACN,eAAe;GACf,gBAAgB;GAChB,MAAM;GACP,CAAC;EACF,EAAa,QAAQ;GACnB,IAAI,EAAkB;GACtB,cAAc;GACd,MAAM;GACN,SAAS;GACT,eAAe;GACf,gBAAgB;GAChB,MAAM;GACP,CAAC;EACF,EAAa,QAAQ;GACnB,IAAI,EAAkB;GACtB,SAAQ,MAAS,kBAAC,GAAD;IAAc,GAAI;IAAO,OAAO;IAAa,CAAA;GAC9D,MAAM;GACN,SAAS;GACT,eAAe;GACf,gBAAgB;GAChB,MAAM;GACP,CAAC;EACH;;AAKH,IAAM,MAA0B,MAKA;CAC9B,IAAM,EAAE,iBAAc,oBAAiB,aAAU,cAAW;AAQ1D,QAPG,EAAa,SAAS,EAAwB,EAAO,CAAC,GAE/C,EAAgB,SAAS,EAAwB,EAAO,CAAC,GAE1D,EAAS,IAAI,EAAO,GAAG,GACzB,aAEA,YAJA,aAFA;GAUL,KAAyB,CAAC,EAAkB,gBAAgB;AASlE,SAAgB,EAAY,GAAyB;CACnD,IAAM,EACJ,aACA,cACA,gBACA,kBACA,uBACA,qBACA,qBACA,aACA,iBACA,oBACA,oBACA,sBACA,kBACA,oBACA,oBACA,YACA,oBACA,yBACA,oBACA,wBAAqB,IACrB,qCACA,kBACA,wBACA,mBAAgB,OACd,GACE,IAAc,IAAgB,EAE9B,EAAE,gBAAa,YAAY,MAA0B,GAAmB,EAExE,IAAmB,MAAqB,QAExC,CAAC,GAAiB,KAAsB,EAAS,GAAM,EACvD,CAAC,IAAmB,KAAwB,EAAS,GAAM,EAE3D,WAAoB;AAUxB,EAPK,EAAY,cAAc,EAC7B,UAAU,EAAsB,0BAC9B,GACA,GACD,EACF,CAAC,EACF,EAAqB,GAAM,EAC3B,EAAmB,GAAM;;AAG3B,SAAgB;EACd,eAAe,IAAkB;AAC/B,GAAI,MACE,KAAe,KAEjB,EAAqB,GAAK,EACrB,KACE,GAAe,KAMpB,EAFE,IAGA,EACG,QAAO,MAGC,EAAS,IAAI,EAAE,GAAG,CACzB,CACD,KAAI,MAAK,EAAS,IAAI,EAAE,GAAG,CAAE,GAKhC,MAAM,QAAQ,IACZ,EACG,QAAO,MAAK;IAEX,IAAM,IAAO,EAAwB,EAAE;AAEvC,WACE,CAAC,EAAS,IAAI,EAAE,GAAG,IACnB,EAAgB,SAAS,EAAK,IAC9B,EAAa,SAAS,EAAK;KAE7B,CACD,IAAI,OAAM,MAAK;IACd,IAAI,GACE,IAAa,EAAwB,EAAE;AAmD7C,WAjDE,MAAqB,EAAqB,YAC1C,EAAwB,EAAW,KAMjC,OAAO,UAAU,eAAe,KAC9B,GACA,gBACD,IACD,CAAC,EACC,GACA,EACD,KAED,IAAiB,EAAmB,gBAElC,CAAC,OAQH,EAAqB,GAAK,EAoB1B,KAhBiB,MAAM,EAAY,WAAW;KAC5C,UACE,EAAsB,mCACpB,EAAE,IACF,GACA,EACD;KACH,eACE,EACE,EAAE,IACF,GACA,GACA,EACD;KACJ,CAAC,EAEuB,QAAQ,IAAI,gBAGlC;KACL,UAAU,EAAE;KACZ,qBAAqB;KACtB;KACD,CACL,CACF,EAEH,EAAmB,GAAM,EACzB,EAAqB,GAAM;;AAIjC,KAAiB;IAChB;EACD;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACD,CAAC;CAEF,IAAM,KAAY,QAEd,EAAS,QAAQ,GAA0C,MAAW;EACpE,IAAM,IAAa,GAAuB;GACxC;GACA;GACA;GACA;GACD,CAAC;AACF,MAAI,MAAe,UAAU;GAE3B,IAAM,IAAa,EAAwB,EAAO,EAE5C,IAAyB,EAAS,IACtC,EAAO,GACR,EAAE,qBACC;AAeJ,GAdI,mBAAmB,MACjB,KAA0B,OAGnB,MAAqB,EAAqB,aAG9C,EAA0B,GAAY,EAAO,KAChD,IAAgB,EAAO,kBALzB,IAAgB,IAWpB,EAAS,KAAK;IACZ,GAAG;IACH,UAAU,EAAO;IACF;IACH;IACZ,YAAY,MAAe;IAC3B,YAAY,MAAe;IAC3B,qBAAqB,EAAwB,EAAW;IAChC;IACzB,CAAC;;AAEJ,SAAO;IACN,EAAE,CAAC,EACR;EAAC;EAAU;EAAiB;EAAU;EAAkB;EAAa,CACtE,EAEK,IAAqB,GAGrB,IAAsB,EAC1B,KACA,EAAS,QACP,MACE,EAAgB,SAAS,EAAwB,EAAE,CAAC,IACpD,EAAa,SAAS,EAAwB,EAAE,CAAC,CACpD,CAAC,SAAS,IAGP,KAAU,QAEZ,EAAW;EACT;EACoB;EACC;EACrB,oBAAoB;EACpB,mBAAmB;AACjB,KAAmB,GAAK;;EAE1B;EACA;EACA;EACA;EACD,CAAC,EACJ;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACD,CACF,EAEK,KAAsB,QACnB,EAAc,QAClB,GAAkD,OACjD,EAAI,KAAU,IACP,IAET,EAAE,CACH,EACA,CAAC,EAAc,CAAC,EAEb,IACJ,GAA4C;EAC1C,MAAM;EACN;EACA,iBAAiB,IAAiB;EAClC,kBAAkB;EAClB,eAAe;EACf;EACA;EACA;EACA,OAAO;GACL;GACA,kBAAkB;KACf,EAAkB,WAAW;KAC7B,EAAkB,UACjB,MAAqB,EAAqB;KAC3C,EAAkB,OAAO,EAAa,SAAS,EAAW,KAAK;KAC/D,EAAkB,MAAM,EAAa,SAAS,EAAW,KAAK;KAC9D,EAAkB,uBAAuB,EAAa,SACrD,EAAW,KACZ;KACA,EAAkB,kBAAkB,EAAa,SAChD,EAAW,KACZ;IACD,GAAG;IACJ;GACF;EACF,CAAC,EAEE,IAAoB,GAAuB,KAAK,EAEhD,KAAiB,GAAe;EACpC,OAAO,KAAiB,EAAM,aAAa,CAAC,KAAK;EACjD,oBAAoB;EACpB,wBAAwB,EAAkB;EAE1C,gBACE,OAAO,SAAW,OAClB,UAAU,UAAU,QAAQ,UAAU,KAAK,MACvC,MAAW,GAAS,uBAAuB,CAAC,SAC5C,KAAA;EACN,UAAU;EACX,CAAC;CAEF,SAAS,GAAW,GAAuC;EACzD,IAAM,EAAE,OAAI,eAAY,wBAAqB,kBAAe,GACxD,EAAE,8BAA2B;AACjC,EAAK,MAED,KACA,MAAqB,EAAqB,YAC1C,KAA0B,QAC1B,OAAO,UAAU,eAAe,KAAK,GAAS,gBAAgB,KAGzD,EAA0B,GAAY,EAAQ,KACjD,IAAyB,EAAQ,iBAMrC,EAAgB;GACd,UAAU;GACV,qBAAqB;GACtB,CAAC;;CAKN,IAAM,IAA2B,GAC9B,MAAgD;AAC/C,MAAI,GAAqB;GACvB,IAAM,EAAE,iBAAc,cAAW,oBAAiB;AAGlD,GACE,IAAe,IAAY,IAAe,OAC1C,CAAC,KACD,KACA,KAEK,GAAe;;IAI1B;EAAC;EAAe;EAAoB;EAAY,CACjD;AAOD,QAJA,QAAgB;AACd,IAAyB,EAAkB,QAAQ;IAClD,CAAC,GAAU,EAAyB,CAAC,EAGtC,mBAAC,OAAD;EAAK,WAAU;YAAf;GACE,kBAAC,GAAD;IACE,MAAM;IACN,iBAAiB,EAAS;IAC1B,eAAe;IACf,UACE,IACI,GAAG,EAAS,OAAO,gBAAgB,CAAC,MAAM,GAAe,gBAAgB,KACzE,YAAY,EAAS,OAAO,gBAAgB;IAElD,cAAc;IACd,UAAU;IACV,CAAA;GACD,CAAC,KAAa,EAAS,SAAS,KAC/B,kBAAC,GAAD;IACE,2BAA2B;KACzB,WAAW;KACX,KAAK;KACL,QAAQ;KACT;IACD,yBAAwB,MACtB,EAAyB,EAAyB;IAE7C;IACS;IAChB,WAAW,EACT,KAAI,MAAc;KAChB,IAAM,EAAE,gBAAa;AAErB,YAAO;MACL,WAAW;MACV,iBAAkB,GAAU,SAAS;MACrC,iBAAkB,GAAU,SAAS;MACtC,eAAe;AACb,OAAI,KACF,GAAW,EAAS,SAAS;;MAGlC;OAEJ;IACD,CAAA;GAEH,KACC,kBAAC,OAAD;IAAK,WAAU;cACb,kBAAC,GAAD,EAAgB,MAAM,IAAM,CAAA;IACxB,CAAA;GAEP,CAAC,KAAa,EAAS,WAAW,KACjC,kBAAC,OAAD;IAAK,WAAU;cACZ,KAAwB,kBAAC,OAAD,EAAA,UAAK,SAAW,CAAA;IACrC,CAAA;GAEJ"}
|
|
1
|
+
{"version":3,"file":"DetailsView.js","names":[],"sources":["../../../../../src/components/EntityFinder/details/view/DetailsView.tsx"],"sourcesContent":["import { getEntityVersions } from '@/synapse-client/SynapseClient'\nimport { useSynapseContext } from '@/utils/context/SynapseContext'\nimport {\n getEntityTypeFromHeader,\n isContainerType,\n isTableType,\n isVersionableEntityType,\n} from '@/utils/functions/EntityTypeUtils'\nimport { TABLE_VERSION_IN_PROGRESS } from '@/utils/SynapseConstants'\nimport { Checkbox, Tooltip } from '@mui/material'\nimport { EntityType } from '@sage-bionetworks/synapse-client'\nimport {\n EntityChildrenRequest,\n EntityHeader,\n Reference,\n} from '@sage-bionetworks/synapse-types'\nimport { useQueryClient } from '@tanstack/react-query'\nimport {\n CellContext,\n createColumnHelper,\n getCoreRowModel,\n OnChangeFn,\n SortingState,\n Table,\n useReactTable,\n} from '@tanstack/react-table'\nimport { useVirtualizer } from '@tanstack/react-virtual'\nimport {\n ReactNode,\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from 'react'\nimport {\n BlockingLoader,\n SynapseSpinner,\n} from '../../../LoadingScreen/LoadingScreen'\nimport ColumnHeader from '../../../TanStackTable/ColumnHeader'\nimport StyledVirtualTanStackTable from '../../../TanStackTable/StyledVirtualTanStackTable'\nimport { EntityFinderHeader } from '../../EntityFinderHeader'\nimport { EntitySelectionMapType } from '../../useEntitySelection'\nimport { VersionSelectionType } from '../../VersionSelectionType'\nimport { EntityDetailsListSharedProps } from '../EntityDetailsList'\nimport { AddFileToDownloadListCell } from './table/AddToDownloadListCell'\nimport { CreatedOnCell } from './table/CreatedOnCell'\nimport { EntityBadgeIconsCell } from './table/EntityBadgeIconsCell'\nimport { EntityFinderCheckboxCell } from './table/EntityFinderCheckboxCell'\nimport { EntityFinderVersionCell } from './table/EntityFinderVersionCell'\nimport { EntityTypeCell } from './table/EntityTypeCell'\nimport { FileEntityDirectDownloadCell } from './table/FileEntityDirectDownloadCell'\nimport { FileEntityMD5Cell } from './table/FileEntityMD5Cell'\nimport { FileEntitySizeCell } from './table/FileEntitySizeCell'\nimport { ModifiedByCell } from './table/ModifiedByCell'\nimport { ModifiedOnCell } from './table/ModifiedOnCell'\nimport { VersionColumnHeader } from './VersionColumnHeader'\n\n/**\n * Check if a table type entity has the \"in progress\" version label.\n */\nfunction hasInProgressTableVersion(\n entityType: EntityType,\n header: EntityFinderHeader | EntityFinderTableViewRowData,\n): boolean {\n return (\n isTableType(entityType) &&\n 'versionLabel' in header &&\n header.versionLabel === TABLE_VERSION_IN_PROGRESS\n )\n}\n\n/**\n * Set of all columns that can be shown in the DetailsView\n * Note: Some of these values are used as accessors, so ensure that those columns match the accessor key in the row data\n */\nexport enum DetailsViewColumn {\n NAME = 'name',\n ENTITY_TYPE = 'entityType',\n ID = 'id',\n CREATED_ON = 'createdOn',\n MODIFIED_ON = 'modifiedOn',\n MODIFIED_BY = 'modifiedBy',\n ADD_TO_DOWNLOAD_CART = 'addToDownloadCart',\n DIRECT_DOWNLOAD = 'directDownload',\n SELECTED = 'selected',\n VERSION = 'version',\n SIZE = 'size',\n MD5 = 'md5',\n BADGES = 'badges',\n}\n\nexport type DetailsViewProps = EntityDetailsListSharedProps & {\n entities: EntityFinderHeader[]\n isLoading: boolean\n hasNextPage?: boolean\n fetchNextPage?: () => Promise<unknown>\n isFetchingNextPage?: boolean\n enableSorting?: boolean\n enableMultiSort?: boolean\n sortableColumns?: DetailsViewColumn[]\n /** The current sort of the view. */\n sorting?: SortingState\n /** If enableSorting is true, `setSort` will be invoked when the user tries to change the sort */\n onSortingChange?: OnChangeFn<SortingState>\n noResultsPlaceholder?: ReactNode\n /** We defer to the configuration component to determine this */\n selectAllIsChecked?: boolean\n /** This request object is only used to tell react-query to cancel fetching all children at once. */\n getChildrenInfiniteRequestObject?: EntityChildrenRequest\n /** The total number of entities that can be retrieved */\n totalEntities?: number\n}\n\n/**\n * Describes the shape of the data passed to the BaseTable\n */\nexport type EntityFinderTableViewRowData = EntityFinderHeader & {\n entityId: string\n versionNumber?: number\n entityType: EntityType\n isSelected: boolean\n isDisabled: boolean\n isVersionableEntity: boolean\n currentSelectedVersion?: number\n}\n\nconst columnHelper = createColumnHelper<EntityFinderTableViewRowData>()\n\nfunction NameRenderer(props: {\n context: CellContext<EntityFinderTableViewRowData, string>\n setCurrentContainer?: (containerId: string) => void\n}) {\n const { context, setCurrentContainer } = props\n const { row, getValue } = context\n const rowName = getValue()\n if (setCurrentContainer && isContainerType(row.original.entityType)) {\n return (\n <span\n role=\"link\"\n className=\"EntityFinderTableCellContainerLink\"\n onClick={e => {\n e.stopPropagation()\n setCurrentContainer(row.original.id)\n }}\n >\n <Tooltip title={rowName}>\n <span className=\"nameColumnCell\">{rowName}</span>\n </Tooltip>\n </span>\n )\n } else {\n return (\n <Tooltip title={rowName}>\n <span className=\"nameColumnCell\">{rowName}</span>\n </Tooltip>\n )\n }\n}\n\nfunction SelectAllCheckboxRenderer(props: {\n isVisible: boolean\n disabled: boolean\n checked: boolean\n onSelectAll: () => void\n}) {\n const { isVisible, disabled, checked, onSelectAll } = props\n if (!isVisible) {\n return null\n }\n\n return (\n <Checkbox\n inputProps={{ 'aria-label': 'Select All' }}\n checked={checked}\n disabled={disabled}\n onChange={() => {\n onSelectAll()\n }}\n />\n )\n}\n\nfunction getColumns(opts: {\n setCurrentContainer?: (containerId: string) => void\n isSelectAllVisible: boolean\n isSelectAllDisabled: boolean\n isSelectAllChecked: boolean\n onSelectAll: () => void\n versionSelection: VersionSelectionType\n toggleSelection: (entity: Reference | Reference[]) => void\n setInitialVersion: (entityId: string, version: number) => void\n sortableColumns?: DetailsViewColumn[]\n}) {\n const {\n setCurrentContainer,\n isSelectAllVisible,\n isSelectAllDisabled,\n isSelectAllChecked,\n onSelectAll,\n versionSelection,\n toggleSelection,\n setInitialVersion,\n sortableColumns = [],\n } = opts\n return [\n columnHelper.display({\n id: DetailsViewColumn.SELECTED,\n minSize: 50,\n maxSize: 50,\n size: 50,\n header: () => (\n <SelectAllCheckboxRenderer\n isVisible={isSelectAllVisible}\n disabled={isSelectAllDisabled}\n checked={isSelectAllChecked}\n onSelectAll={onSelectAll}\n />\n ),\n cell: EntityFinderCheckboxCell,\n }),\n\n columnHelper.accessor(DetailsViewColumn.ENTITY_TYPE, {\n minSize: 45,\n maxSize: 45,\n size: 45,\n header: () => null,\n enableResizing: false,\n cell: EntityTypeCell,\n meta: {\n textAlign: 'center',\n },\n }),\n columnHelper.accessor(DetailsViewColumn.NAME, {\n size: 300,\n enableSorting: sortableColumns.includes(DetailsViewColumn.NAME),\n // sortable: sort != null,\n // resizable: true,\n header: props => <ColumnHeader {...props} title={'Name'} />,\n cell: context => (\n <NameRenderer\n context={context}\n setCurrentContainer={setCurrentContainer}\n />\n ),\n enableColumnFilter: false,\n }),\n columnHelper.display({\n id: DetailsViewColumn.BADGES,\n minSize: 75,\n maxSize: 75,\n size: 75,\n header: () => null,\n cell: EntityBadgeIconsCell,\n }),\n columnHelper.accessor(DetailsViewColumn.ID, {\n size: 130,\n header: props => <ColumnHeader {...props} title={'ID'} />,\n minSize: 130,\n enableColumnFilter: false,\n enableSorting: sortableColumns.includes(DetailsViewColumn.ID),\n }),\n columnHelper.display({\n id: DetailsViewColumn.VERSION,\n minSize: 150,\n size: 200,\n header: () => <VersionColumnHeader versionSelection={versionSelection} />,\n cell: context => (\n <EntityFinderVersionCell\n versionSelection={versionSelection}\n toggleSelection={toggleSelection}\n setInitialVersion={setInitialVersion}\n context={context}\n />\n ),\n }),\n columnHelper.accessor(DetailsViewColumn.CREATED_ON, {\n header: props => <ColumnHeader {...props} title={'Created On'} />,\n size: 220,\n minSize: 170,\n cell: CreatedOnCell,\n enableColumnFilter: false,\n enableSorting: sortableColumns.includes(DetailsViewColumn.CREATED_ON),\n }),\n columnHelper.accessor(DetailsViewColumn.MODIFIED_ON, {\n header: props => <ColumnHeader {...props} title={'Modified On'} />,\n size: 220,\n minSize: 170,\n enableColumnFilter: false,\n cell: ModifiedOnCell,\n enableSorting: sortableColumns.includes(DetailsViewColumn.MODIFIED_ON),\n }),\n columnHelper.accessor(DetailsViewColumn.MODIFIED_BY, {\n header: props => <ColumnHeader {...props} title={'Modified By'} />,\n size: 250,\n enableResizing: true,\n cell: ModifiedByCell,\n enableColumnFilter: false,\n enableSorting: sortableColumns.includes(DetailsViewColumn.MODIFIED_BY),\n }),\n columnHelper.display({\n id: DetailsViewColumn.SIZE,\n header: props => <ColumnHeader {...props} title={'Size'} />,\n size: 120,\n minSize: 85,\n enableSorting: false,\n enableResizing: true,\n cell: FileEntitySizeCell,\n }),\n columnHelper.display({\n id: DetailsViewColumn.MD5,\n header: props => <ColumnHeader {...props} title={'MD5'} />,\n size: 200,\n enableSorting: false,\n enableResizing: true,\n cell: FileEntityMD5Cell,\n }),\n columnHelper.display({\n id: DetailsViewColumn.ADD_TO_DOWNLOAD_CART,\n header: () => null,\n size: 45,\n minSize: 45,\n enableSorting: false,\n enableResizing: false,\n cell: AddFileToDownloadListCell,\n }),\n columnHelper.display({\n id: DetailsViewColumn.DIRECT_DOWNLOAD,\n header: props => <ColumnHeader {...props} title={'Actions'} />,\n size: 75,\n minSize: 75,\n enableSorting: false,\n enableResizing: false,\n cell: FileEntityDirectDownloadCell,\n }),\n ]\n}\n\ntype DetailsViewRowAppearance = 'hidden' | 'disabled' | 'selected' | 'default'\n\nconst determineRowAppearance = (args: {\n visibleTypes: EntityType[]\n selectableTypes: EntityType[]\n selected: EntitySelectionMapType\n entity: EntityFinderHeader\n}): DetailsViewRowAppearance => {\n const { visibleTypes, selectableTypes, selected, entity } = args\n if (!visibleTypes.includes(getEntityTypeFromHeader(entity))) {\n return 'hidden'\n } else if (!selectableTypes.includes(getEntityTypeFromHeader(entity))) {\n return 'disabled'\n } else if (selected.has(entity.id)) {\n return 'selected'\n } else {\n return 'default'\n }\n}\n\nconst DEFAULT_HIDDEN_COLUMNS = [DetailsViewColumn.DIRECT_DOWNLOAD]\n\n/**\n * Displays a list of entities in a table.\n *\n * If the list of entities is paginated, the `hasNextPage` prop can be set to indicate that there is more data to load.\n * When the view is ready to load more data, the `fetchNextPage` callback will be invoked. The view is designed to handle\n * an \"infinite scroll\" pattern, so entities should not be removed from the list when loading the next page.\n */\nexport function DetailsView(props: DetailsViewProps) {\n const {\n entities,\n isLoading,\n hasNextPage,\n fetchNextPage,\n isFetchingNextPage,\n versionSelection,\n selectColumnType,\n selected,\n visibleTypes,\n selectableTypes,\n toggleSelection,\n setInitialVersion,\n enableSorting,\n enableMultiSort,\n sortableColumns,\n sorting,\n onSortingChange,\n noResultsPlaceholder,\n enableSelectAll,\n selectAllIsChecked = false,\n getChildrenInfiniteRequestObject,\n totalEntities,\n setCurrentContainer,\n hiddenColumns = DEFAULT_HIDDEN_COLUMNS,\n } = props\n const queryClient = useQueryClient()\n\n const { accessToken, keyFactory: queryClientKeyFactory } = useSynapseContext()\n\n const showSelectColumn = selectColumnType !== 'none'\n\n const [shouldSelectAll, setShouldSelectAll] = useState(false)\n const [showLoadingScreen, setShowLoadingScreen] = useState(false)\n\n const cancelQuery = () => {\n // It's likely that the user will be throttled by the Synapse backend and may be waiting a\n // noticeable amount of time for the current request, so cancel it (in addition to cancelling future requests)\n void queryClient.cancelQueries({\n queryKey: queryClientKeyFactory.getEntityChildrenQueryKey(\n getChildrenInfiniteRequestObject!,\n true,\n ),\n })\n setShowLoadingScreen(false)\n setShouldSelectAll(false)\n }\n\n useEffect(() => {\n async function handleSelectAll() {\n if (shouldSelectAll) {\n if (hasNextPage && fetchNextPage) {\n // Show the loading screen since we must fetch data (potentially a lot) to finish the task\n setShowLoadingScreen(true)\n if (!isFetchingNextPage) {\n void fetchNextPage()\n // The effect will re-run after fetch completes, and the next page (if it exists) will be fetched.\n }\n } else {\n if (selectAllIsChecked) {\n // All the items are selected, so we will deselect all\n toggleSelection(\n entities\n .filter(e => {\n // Collect just entities that are selected\n // An entity may be in the list and unselected because it isn't of a selectable type\n return selected.has(e.id)\n })\n .map(e => selected.get(e.id)!),\n )\n } else {\n // Not all the items are selected, so we will select all\n toggleSelection(\n await Promise.all(\n entities\n .filter(e => {\n // must filter just selectable types or else any entities of unselectable types will get selected\n const type = getEntityTypeFromHeader(e)\n // also exclude already-selected entities, since we don't want to toggle those\n return (\n !selected.has(e.id) &&\n selectableTypes.includes(type) &&\n visibleTypes.includes(type)\n )\n })\n .map(async e => {\n let latestVersion: number | undefined\n const entityType = getEntityTypeFromHeader(e)\n if (\n versionSelection === VersionSelectionType.REQUIRED &&\n isVersionableEntityType(entityType)\n ) {\n // If VersionSelectionType.REQUIRED, then we need to supply a version with the entity.\n // We may already have the version from the header, but only use it if it's a valid snapshot\n // (table types with \"in progress\" are not valid)\n if (\n Object.prototype.hasOwnProperty.call(\n e,\n 'versionNumber',\n ) &&\n !hasInProgressTableVersion(\n entityType,\n e as EntityHeader,\n )\n ) {\n latestVersion = (e as EntityHeader).versionNumber\n }\n if (!latestVersion) {\n // Failsafe if we didn't get the version in the header. This is rare/unlikely, since the only cases we're sure we don't get versions are:\n // - ProjectHeaders (which are versionless)\n // - Search Results (for which we don't support Select All)\n // - Table types, whose entity headers report the \"in progress\" version rather than the latest stable snapshot\n // For large lists, there's a good chance for this to trigger throttling.\n\n // Show the loading screen since we must fetch data (potentially a lot) to finish the task\n setShowLoadingScreen(true)\n\n const versionsQueryOffset = 0\n const versionsQueryLimit = 1\n const versions = await queryClient.fetchQuery({\n queryKey:\n queryClientKeyFactory.getPaginatedEntityVersionsQueryKey(\n e.id,\n versionsQueryLimit,\n versionsQueryOffset,\n ),\n queryFn: () =>\n getEntityVersions(\n e.id,\n accessToken,\n versionsQueryOffset,\n versionsQueryLimit,\n ),\n })\n // we pick the first version in the list because it is the most recent\n latestVersion = versions.results[0]?.versionNumber\n }\n }\n return {\n targetId: e.id,\n targetVersionNumber: latestVersion,\n }\n }),\n ),\n )\n }\n setShouldSelectAll(false)\n setShowLoadingScreen(false)\n }\n }\n }\n handleSelectAll()\n }, [\n accessToken,\n entities,\n fetchNextPage,\n hasNextPage,\n versionSelection,\n queryClient,\n isFetchingNextPage,\n selectAllIsChecked,\n selectableTypes,\n selected,\n shouldSelectAll,\n toggleSelection,\n visibleTypes,\n queryClientKeyFactory,\n ])\n\n const tableData = useMemo(\n () =>\n entities.reduce((entities: EntityFinderTableViewRowData[], entity) => {\n const appearance = determineRowAppearance({\n visibleTypes,\n selectableTypes,\n selected,\n entity,\n })\n if (appearance !== 'hidden') {\n // only include entities that should not be hidden\n const entityType = getEntityTypeFromHeader(entity)\n\n const currentSelectedVersion = selected.get(\n entity.id,\n )?.targetVersionNumber\n let versionNumber: number | undefined = undefined\n if ('versionNumber' in entity) {\n if (currentSelectedVersion != null) {\n // if a version is selected, the row should show that version's data\n versionNumber = currentSelectedVersion\n } else if (versionSelection === VersionSelectionType.REQUIRED) {\n // if a version is not selected, but version selection is required, the row should show the latest version's data\n // Only use EntityHeader's version if it's a valid snapshot (table types with \"in progress\" are not valid)\n if (!hasInProgressTableVersion(entityType, entity)) {\n versionNumber = entity.versionNumber\n }\n }\n // otherwise, show the current version's data (versionNumber is undefined)\n }\n\n entities.push({\n ...entity,\n entityId: entity.id,\n versionNumber: versionNumber,\n entityType: entityType,\n isSelected: appearance === 'selected',\n isDisabled: appearance === 'disabled',\n isVersionableEntity: isVersionableEntityType(entityType),\n currentSelectedVersion: currentSelectedVersion,\n })\n }\n return entities\n }, []),\n [entities, selectableTypes, selected, versionSelection, visibleTypes],\n )\n\n const isSelectAllVisible = enableSelectAll\n\n // Enabled if there's at least one visible & selectable entity, OR there's a page we haven't fetched\n const isSelectAllDisabled = !(\n hasNextPage ||\n entities.filter(\n e =>\n selectableTypes.includes(getEntityTypeFromHeader(e)) &&\n visibleTypes.includes(getEntityTypeFromHeader(e)),\n ).length > 0\n )\n\n const columns = useMemo(\n () =>\n getColumns({\n setCurrentContainer,\n isSelectAllVisible: isSelectAllVisible,\n isSelectAllDisabled: isSelectAllDisabled,\n isSelectAllChecked: selectAllIsChecked,\n onSelectAll: () => {\n setShouldSelectAll(true)\n },\n versionSelection,\n toggleSelection,\n setInitialVersion,\n sortableColumns,\n }),\n [\n isSelectAllDisabled,\n isSelectAllVisible,\n selectAllIsChecked,\n setCurrentContainer,\n setInitialVersion,\n sortableColumns,\n toggleSelection,\n versionSelection,\n ],\n )\n\n const hideColumnOverrides = useMemo(() => {\n return hiddenColumns.reduce(\n (acc: Partial<Record<DetailsViewColumn, boolean>>, column) => {\n acc[column] = false\n return acc\n },\n {},\n )\n }, [hiddenColumns])\n\n const table: Table<EntityFinderTableViewRowData> =\n useReactTable<EntityFinderTableViewRowData>({\n data: tableData,\n columns,\n getCoreRowModel: getCoreRowModel(),\n columnResizeMode: 'onChange',\n manualSorting: true,\n enableSorting,\n enableMultiSort,\n onSortingChange,\n state: {\n sorting,\n columnVisibility: {\n [DetailsViewColumn.SELECTED]: showSelectColumn,\n [DetailsViewColumn.VERSION]:\n versionSelection !== VersionSelectionType.DISALLOWED,\n [DetailsViewColumn.SIZE]: visibleTypes.includes(EntityType.file),\n [DetailsViewColumn.MD5]: visibleTypes.includes(EntityType.file),\n [DetailsViewColumn.ADD_TO_DOWNLOAD_CART]: visibleTypes.includes(\n EntityType.file,\n ),\n [DetailsViewColumn.DIRECT_DOWNLOAD]: visibleTypes.includes(\n EntityType.file,\n ),\n ...hideColumnOverrides,\n },\n },\n })\n\n const tableContainerRef = useRef<HTMLDivElement>(null)\n\n const rowVirtualizer = useVirtualizer({\n count: totalEntities ?? table.getRowModel().rows.length,\n estimateSize: () => 40, // estimate row height for accurate scrollbar dragging\n getScrollElement: () => tableContainerRef.current,\n // measure dynamic row height, except in firefox because it measures table border height incorrectly\n measureElement:\n typeof window !== 'undefined' &&\n navigator.userAgent.indexOf('Firefox') === -1\n ? element => element?.getBoundingClientRect().height\n : undefined,\n overscan: 5,\n })\n\n function onRowClick(rowData: EntityFinderTableViewRowData) {\n const { id, isDisabled, isVersionableEntity, entityType } = rowData\n let { currentSelectedVersion } = rowData\n if (!isDisabled) {\n if (\n isVersionableEntity &&\n versionSelection === VersionSelectionType.REQUIRED &&\n currentSelectedVersion == null &&\n Object.prototype.hasOwnProperty.call(rowData, 'versionNumber')\n ) {\n // Only use EntityHeader's version if it's a valid snapshot (table types with \"in progress\" are not valid)\n if (!hasInProgressTableVersion(entityType, rowData)) {\n currentSelectedVersion = rowData.versionNumber\n }\n // Note that here we aren't handling the case where the header doesn't have a version, e.g. a search result\n // That case is actually handled by the VersionRenderer, which has an effect that will toggle the selection after data is fetched.\n }\n\n toggleSelection({\n targetId: id,\n targetVersionNumber: currentSelectedVersion,\n })\n }\n }\n\n //called on scroll and possibly on mount to fetch more data as the user scrolls and reaches bottom of table\n const fetchMoreOnBottomReached = useCallback(\n (containerRefElement?: HTMLDivElement | null) => {\n if (containerRefElement) {\n const { scrollHeight, scrollTop, clientHeight } = containerRefElement\n\n //once the user has scrolled within 500px of the bottom of the table, fetch more data if we can\n if (\n scrollHeight - scrollTop - clientHeight < 500 &&\n !isFetchingNextPage &&\n hasNextPage &&\n fetchNextPage\n ) {\n void fetchNextPage()\n }\n }\n },\n [fetchNextPage, isFetchingNextPage, hasNextPage],\n )\n\n //a check on mount and after a fetch to see if the table is already scrolled to the bottom and immediately needs to fetch more data\n useEffect(() => {\n fetchMoreOnBottomReached(tableContainerRef.current)\n }, [entities, fetchMoreOnBottomReached])\n\n return (\n <div className=\"EntityFinderDetailsView\">\n <BlockingLoader\n show={showLoadingScreen}\n currentProgress={entities.length}\n totalProgress={totalEntities}\n hintText={\n totalEntities\n ? `${entities.length.toLocaleString()} of ${totalEntities?.toLocaleString()}`\n : `Fetching ${entities.length.toLocaleString()}`\n }\n headlineText={'Fetching selected items'}\n onCancel={cancelQuery}\n />\n {!isLoading && entities.length > 0 && (\n <StyledVirtualTanStackTable<EntityFinderTableViewRowData>\n styledTableContainerProps={{\n className: 'DetailsViewTable',\n ref: tableContainerRef,\n height: '100%',\n }}\n onTableContainerScroll={target =>\n fetchMoreOnBottomReached(target as HTMLDivElement)\n }\n table={table}\n rowVirtualizer={rowVirtualizer}\n slotProps={{\n Tr: ownerState => {\n const { tableRow } = ownerState\n\n return {\n className: `EntityFinderDetailsViewRow`,\n ['aria-selected']: tableRow?.original.isSelected,\n ['aria-disabled']: tableRow?.original.isDisabled,\n onClick: () => {\n if (tableRow) {\n onRowClick(tableRow.original)\n }\n },\n }\n },\n }}\n />\n )}\n {isLoading && (\n <div className=\"EntityFinderDetailsViewPlaceholder\">\n <SynapseSpinner size={30} />\n </div>\n )}\n {!isLoading && entities.length === 0 && (\n <div className=\"EntityFinderDetailsViewPlaceholder\">\n {noResultsPlaceholder || <div>Empty</div>}\n </div>\n )}\n </div>\n )\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;AA6DA,SAAS,EACP,GACA,GACS;AACT,QACE,EAAY,EAAW,IACvB,kBAAkB,KAClB,EAAO,iBAAA;;AAQX,IAAY,IAAL,yBAAA,GAAA;QACL,EAAA,OAAO,QACP,EAAA,cAAc,cACd,EAAA,KAAK,MACL,EAAA,aAAa,aACb,EAAA,cAAc,cACd,EAAA,cAAc,cACd,EAAA,uBAAuB,qBACvB,EAAA,kBAAkB,kBAClB,EAAA,WAAW,YACX,EAAA,UAAU,WACV,EAAA,OAAO,QACP,EAAA,MAAM,OACN,EAAA,SAAS;KACV,EAqCK,IAAe,GAAkD;AAEvE,SAAS,EAAa,GAGnB;CACD,IAAM,EAAE,YAAS,2BAAwB,GACnC,EAAE,QAAK,gBAAa,GACpB,IAAU,GAAU;AAiBxB,QAhBE,KAAuB,EAAgB,EAAI,SAAS,WAAW,GAE/D,kBAAC,QAAD;EACE,MAAK;EACL,WAAU;EACV,UAAS,MAAK;AAEZ,GADA,EAAE,iBAAiB,EACnB,EAAoB,EAAI,SAAS,GAAG;;YAGtC,kBAAC,GAAD;GAAS,OAAO;aACd,kBAAC,QAAD;IAAM,WAAU;cAAkB;IAAe,CAAA;GACzC,CAAA;EACL,CAAA,GAIP,kBAAC,GAAD;EAAS,OAAO;YACd,kBAAC,QAAD;GAAM,WAAU;aAAkB;GAAe,CAAA;EACzC,CAAA;;AAKhB,SAAS,EAA0B,GAKhC;CACD,IAAM,EAAE,cAAW,aAAU,YAAS,mBAAgB;AAKtD,QAJK,IAKH,kBAAC,GAAD;EACE,YAAY,EAAE,cAAc,cAAc;EACjC;EACC;EACV,gBAAgB;AACd,MAAa;;EAEf,CAAA,GAXK;;AAeX,SAAS,EAAW,GAUjB;CACD,IAAM,EACJ,wBACA,uBACA,wBACA,uBACA,gBACA,qBACA,oBACA,sBACA,qBAAkB,EAAE,KAClB;AACJ,QAAO;EACL,EAAa,QAAQ;GACnB,IAAI,EAAkB;GACtB,SAAS;GACT,SAAS;GACT,MAAM;GACN,cACE,kBAAC,GAAD;IACE,WAAW;IACX,UAAU;IACV,SAAS;IACI;IACb,CAAA;GAEJ,MAAM;GACP,CAAC;EAEF,EAAa,SAAS,EAAkB,aAAa;GACnD,SAAS;GACT,SAAS;GACT,MAAM;GACN,cAAc;GACd,gBAAgB;GAChB,MAAM;GACN,MAAM,EACJ,WAAW,UACZ;GACF,CAAC;EACF,EAAa,SAAS,EAAkB,MAAM;GAC5C,MAAM;GACN,eAAe,EAAgB,SAAS,EAAkB,KAAK;GAG/D,SAAQ,MAAS,kBAAC,GAAD;IAAc,GAAI;IAAO,OAAO;IAAU,CAAA;GAC3D,OAAM,MACJ,kBAAC,GAAD;IACW;IACY;IACrB,CAAA;GAEJ,oBAAoB;GACrB,CAAC;EACF,EAAa,QAAQ;GACnB,IAAI,EAAkB;GACtB,SAAS;GACT,SAAS;GACT,MAAM;GACN,cAAc;GACd,MAAM;GACP,CAAC;EACF,EAAa,SAAS,EAAkB,IAAI;GAC1C,MAAM;GACN,SAAQ,MAAS,kBAAC,GAAD;IAAc,GAAI;IAAO,OAAO;IAAQ,CAAA;GACzD,SAAS;GACT,oBAAoB;GACpB,eAAe,EAAgB,SAAS,EAAkB,GAAG;GAC9D,CAAC;EACF,EAAa,QAAQ;GACnB,IAAI,EAAkB;GACtB,SAAS;GACT,MAAM;GACN,cAAc,kBAAC,GAAD,EAAuC,qBAAoB,CAAA;GACzE,OAAM,MACJ,kBAAC,GAAD;IACoB;IACD;IACE;IACV;IACT,CAAA;GAEL,CAAC;EACF,EAAa,SAAS,EAAkB,YAAY;GAClD,SAAQ,MAAS,kBAAC,GAAD;IAAc,GAAI;IAAO,OAAO;IAAgB,CAAA;GACjE,MAAM;GACN,SAAS;GACT,MAAM;GACN,oBAAoB;GACpB,eAAe,EAAgB,SAAS,EAAkB,WAAW;GACtE,CAAC;EACF,EAAa,SAAS,EAAkB,aAAa;GACnD,SAAQ,MAAS,kBAAC,GAAD;IAAc,GAAI;IAAO,OAAO;IAAiB,CAAA;GAClE,MAAM;GACN,SAAS;GACT,oBAAoB;GACpB,MAAM;GACN,eAAe,EAAgB,SAAS,EAAkB,YAAY;GACvE,CAAC;EACF,EAAa,SAAS,EAAkB,aAAa;GACnD,SAAQ,MAAS,kBAAC,GAAD;IAAc,GAAI;IAAO,OAAO;IAAiB,CAAA;GAClE,MAAM;GACN,gBAAgB;GAChB,MAAM;GACN,oBAAoB;GACpB,eAAe,EAAgB,SAAS,EAAkB,YAAY;GACvE,CAAC;EACF,EAAa,QAAQ;GACnB,IAAI,EAAkB;GACtB,SAAQ,MAAS,kBAAC,GAAD;IAAc,GAAI;IAAO,OAAO;IAAU,CAAA;GAC3D,MAAM;GACN,SAAS;GACT,eAAe;GACf,gBAAgB;GAChB,MAAM;GACP,CAAC;EACF,EAAa,QAAQ;GACnB,IAAI,EAAkB;GACtB,SAAQ,MAAS,kBAAC,GAAD;IAAc,GAAI;IAAO,OAAO;IAAS,CAAA;GAC1D,MAAM;GACN,eAAe;GACf,gBAAgB;GAChB,MAAM;GACP,CAAC;EACF,EAAa,QAAQ;GACnB,IAAI,EAAkB;GACtB,cAAc;GACd,MAAM;GACN,SAAS;GACT,eAAe;GACf,gBAAgB;GAChB,MAAM;GACP,CAAC;EACF,EAAa,QAAQ;GACnB,IAAI,EAAkB;GACtB,SAAQ,MAAS,kBAAC,GAAD;IAAc,GAAI;IAAO,OAAO;IAAa,CAAA;GAC9D,MAAM;GACN,SAAS;GACT,eAAe;GACf,gBAAgB;GAChB,MAAM;GACP,CAAC;EACH;;AAKH,IAAM,MAA0B,MAKA;CAC9B,IAAM,EAAE,iBAAc,oBAAiB,aAAU,cAAW;AAQ1D,QAPG,EAAa,SAAS,EAAwB,EAAO,CAAC,GAE/C,EAAgB,SAAS,EAAwB,EAAO,CAAC,GAE1D,EAAS,IAAI,EAAO,GAAG,GACzB,aAEA,YAJA,aAFA;GAUL,KAAyB,CAAC,EAAkB,gBAAgB;AASlE,SAAgB,EAAY,GAAyB;CACnD,IAAM,EACJ,aACA,cACA,gBACA,kBACA,uBACA,qBACA,qBACA,aACA,iBACA,oBACA,oBACA,sBACA,kBACA,oBACA,oBACA,YACA,oBACA,yBACA,oBACA,wBAAqB,IACrB,qCACA,kBACA,wBACA,mBAAgB,OACd,GACE,IAAc,IAAgB,EAE9B,EAAE,gBAAa,YAAY,MAA0B,GAAmB,EAExE,IAAmB,MAAqB,QAExC,CAAC,GAAiB,KAAsB,EAAS,GAAM,EACvD,CAAC,IAAmB,KAAwB,EAAS,GAAM,EAE3D,WAAoB;AAUxB,EAPK,EAAY,cAAc,EAC7B,UAAU,EAAsB,0BAC9B,GACA,GACD,EACF,CAAC,EACF,EAAqB,GAAM,EAC3B,EAAmB,GAAM;;AAG3B,SAAgB;EACd,eAAe,IAAkB;AAC/B,GAAI,MACE,KAAe,KAEjB,EAAqB,GAAK,EACrB,KACE,GAAe,KAMpB,EAFE,IAGA,EACG,QAAO,MAGC,EAAS,IAAI,EAAE,GAAG,CACzB,CACD,KAAI,MAAK,EAAS,IAAI,EAAE,GAAG,CAAE,GAKhC,MAAM,QAAQ,IACZ,EACG,QAAO,MAAK;IAEX,IAAM,IAAO,EAAwB,EAAE;AAEvC,WACE,CAAC,EAAS,IAAI,EAAE,GAAG,IACnB,EAAgB,SAAS,EAAK,IAC9B,EAAa,SAAS,EAAK;KAE7B,CACD,IAAI,OAAM,MAAK;IACd,IAAI,GACE,IAAa,EAAwB,EAAE;AAmD7C,WAjDE,MAAqB,EAAqB,YAC1C,EAAwB,EAAW,KAMjC,OAAO,UAAU,eAAe,KAC9B,GACA,gBACD,IACD,CAAC,EACC,GACA,EACD,KAED,IAAiB,EAAmB,gBAElC,CAAC,OAQH,EAAqB,GAAK,EAoB1B,KAAgB,MAhBO,EAAY,WAAW;KAC5C,UACE,EAAsB,mCACpB,EAAE,IACF,GACA,EACD;KACH,eACE,EACE,EAAE,IACF,GACA,GACA,EACD;KACJ,CAAC,EAEuB,QAAQ,IAAI,gBAGlC;KACL,UAAU,EAAE;KACZ,qBAAqB;KACtB;KACD,CACL,CACF,EAEH,EAAmB,GAAM,EACzB,EAAqB,GAAM;;AAIjC,KAAiB;IAChB;EACD;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACD,CAAC;CAEF,IAAM,KAAY,QAEd,EAAS,QAAQ,GAA0C,MAAW;EACpE,IAAM,IAAa,GAAuB;GACxC;GACA;GACA;GACA;GACD,CAAC;AACF,MAAI,MAAe,UAAU;GAE3B,IAAM,IAAa,EAAwB,EAAO,EAE5C,IAAyB,EAAS,IACtC,EAAO,GACR,EAAE,qBACC;AAeJ,GAdI,mBAAmB,MACjB,KAA0B,OAGnB,MAAqB,EAAqB,aAG9C,EAA0B,GAAY,EAAO,KAChD,IAAgB,EAAO,kBALzB,IAAgB,IAWpB,EAAS,KAAK;IACZ,GAAG;IACH,UAAU,EAAO;IACF;IACH;IACZ,YAAY,MAAe;IAC3B,YAAY,MAAe;IAC3B,qBAAqB,EAAwB,EAAW;IAChC;IACzB,CAAC;;AAEJ,SAAO;IACN,EAAE,CAAC,EACR;EAAC;EAAU;EAAiB;EAAU;EAAkB;EAAa,CACtE,EAEK,IAAqB,GAGrB,IAAsB,EAC1B,KACA,EAAS,QACP,MACE,EAAgB,SAAS,EAAwB,EAAE,CAAC,IACpD,EAAa,SAAS,EAAwB,EAAE,CAAC,CACpD,CAAC,SAAS,IAGP,KAAU,QAEZ,EAAW;EACT;EACoB;EACC;EACrB,oBAAoB;EACpB,mBAAmB;AACjB,KAAmB,GAAK;;EAE1B;EACA;EACA;EACA;EACD,CAAC,EACJ;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACD,CACF,EAEK,KAAsB,QACnB,EAAc,QAClB,GAAkD,OACjD,EAAI,KAAU,IACP,IAET,EAAE,CACH,EACA,CAAC,EAAc,CAAC,EAEb,IACJ,GAA4C;EAC1C,MAAM;EACN;EACA,iBAAiB,IAAiB;EAClC,kBAAkB;EAClB,eAAe;EACf;EACA;EACA;EACA,OAAO;GACL;GACA,kBAAkB;KACf,EAAkB,WAAW;KAC7B,EAAkB,UACjB,MAAqB,EAAqB;KAC3C,EAAkB,OAAO,EAAa,SAAS,EAAW,KAAK;KAC/D,EAAkB,MAAM,EAAa,SAAS,EAAW,KAAK;KAC9D,EAAkB,uBAAuB,EAAa,SACrD,EAAW,KACZ;KACA,EAAkB,kBAAkB,EAAa,SAChD,EAAW,KACZ;IACD,GAAG;IACJ;GACF;EACF,CAAC,EAEE,IAAoB,GAAuB,KAAK,EAEhD,KAAiB,GAAe;EACpC,OAAO,KAAiB,EAAM,aAAa,CAAC,KAAK;EACjD,oBAAoB;EACpB,wBAAwB,EAAkB;EAE1C,gBACE,OAAO,SAAW,OAClB,UAAU,UAAU,QAAQ,UAAU,KAAK,MACvC,MAAW,GAAS,uBAAuB,CAAC,SAC5C,KAAA;EACN,UAAU;EACX,CAAC;CAEF,SAAS,GAAW,GAAuC;EACzD,IAAM,EAAE,OAAI,eAAY,wBAAqB,kBAAe,GACxD,EAAE,8BAA2B;AACjC,EAAK,MAED,KACA,MAAqB,EAAqB,YAC1C,KAA0B,QAC1B,OAAO,UAAU,eAAe,KAAK,GAAS,gBAAgB,KAGzD,EAA0B,GAAY,EAAQ,KACjD,IAAyB,EAAQ,iBAMrC,EAAgB;GACd,UAAU;GACV,qBAAqB;GACtB,CAAC;;CAKN,IAAM,IAA2B,GAC9B,MAAgD;AAC/C,MAAI,GAAqB;GACvB,IAAM,EAAE,iBAAc,cAAW,oBAAiB;AAGlD,GACE,IAAe,IAAY,IAAe,OAC1C,CAAC,KACD,KACA,KAEK,GAAe;;IAI1B;EAAC;EAAe;EAAoB;EAAY,CACjD;AAOD,QAJA,QAAgB;AACd,IAAyB,EAAkB,QAAQ;IAClD,CAAC,GAAU,EAAyB,CAAC,EAGtC,mBAAC,OAAD;EAAK,WAAU;YAAf;GACE,kBAAC,GAAD;IACE,MAAM;IACN,iBAAiB,EAAS;IAC1B,eAAe;IACf,UACE,IACI,GAAG,EAAS,OAAO,gBAAgB,CAAC,MAAM,GAAe,gBAAgB,KACzE,YAAY,EAAS,OAAO,gBAAgB;IAElD,cAAc;IACd,UAAU;IACV,CAAA;GACD,CAAC,KAAa,EAAS,SAAS,KAC/B,kBAAC,GAAD;IACE,2BAA2B;KACzB,WAAW;KACX,KAAK;KACL,QAAQ;KACT;IACD,yBAAwB,MACtB,EAAyB,EAAyB;IAE7C;IACS;IAChB,WAAW,EACT,KAAI,MAAc;KAChB,IAAM,EAAE,gBAAa;AAErB,YAAO;MACL,WAAW;MACV,iBAAkB,GAAU,SAAS;MACrC,iBAAkB,GAAU,SAAS;MACtC,eAAe;AACb,OAAI,KACF,GAAW,EAAS,SAAS;;MAGlC;OAEJ;IACD,CAAA;GAEH,KACC,kBAAC,OAAD;IAAK,WAAU;cACb,kBAAC,GAAD,EAAgB,MAAM,IAAM,CAAA;IACxB,CAAA;GAEP,CAAC,KAAa,EAAS,WAAW,KACjC,kBAAC,OAAD;IAAK,WAAU;cACZ,KAAwB,kBAAC,OAAD,EAAA,UAAK,SAAW,CAAA;IACrC,CAAA;GAEJ"}
|