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":"useTableColumns.js","names":[],"sources":["../../../../src/components/EntityTreeTable/hooks/useTableColumns.ts"],"sourcesContent":["import { useMemo } from 'react'\nimport { ColumnDef } from '@tanstack/react-table'\nimport { useTheme, useMediaQuery } from '@mui/material'\nimport { EntityBundleRow } from '../EntityTreeTable'\nimport { NameCell } from '../components/EntityNameCell'\nimport { IdCell } from '../components/IdCell'\nimport { IdColumnHeader } from '../components/IdColumnHeader'\nimport { ModifiedOnCell } from '../../EntityFinder/details/view/table/ModifiedOnCell'\nimport { ModifiedByCell } from '../../EntityFinder/details/view/table/ModifiedByCell'\nimport { CreatedOnCell } from '../../EntityFinder/details/view/table/CreatedOnCell'\nimport { FileEntitySizeCell } from '../../EntityFinder/details/view/table/FileEntitySizeCell'\nimport { FileEntityMD5Cell } from '../../EntityFinder/details/view/table/FileEntityMD5Cell'\nimport { AddFileToDownloadListCell } from '../../EntityFinder/details/view/table/AddToDownloadListCell'\nimport {\n NameColumnHeader,\n CreatedOnColumnHeader,\n ModifiedOnColumnHeader,\n} from '../components/ColumnHeaders'\nimport { EntityBadgeIconsCell } from '../components/EntityBadgeIconsCell'\n\nexport const useTableColumns = (enableSorting: boolean) => {\n // Responsive design hooks\n const theme = useTheme()\n const isXtraLarge = useMediaQuery(theme.breakpoints.up('xl'))\n const isMediumAndUp = useMediaQuery(theme.breakpoints.up('md'))\n\n // Table columns\n const columns = useMemo<ColumnDef<EntityBundleRow>[]>(() => {\n const baseColumns: ColumnDef<EntityBundleRow>[] = [\n {\n accessorKey: 'entityHeader.name',\n id: 'name',\n header: NameColumnHeader,\n cell: NameCell,\n enableSorting: enableSorting,\n size: 450, // Default width for Name column\n },\n ]\n if (isMediumAndUp) {\n baseColumns.push({\n id: 'badges',\n header: '',\n cell: EntityBadgeIconsCell,\n enableSorting: false,\n size: 120, // Default width for Badges column\n })\n baseColumns.push({\n id: 'id',\n header: IdColumnHeader,\n cell: IdCell,\n enableSorting: false,\n })\n }\n if (isXtraLarge) {\n baseColumns.push({\n accessorKey: 'entityHeader.createdOn',\n id: 'createdOn',\n header: CreatedOnColumnHeader,\n cell: CreatedOnCell,\n enableSorting: enableSorting,\n })\n }\n\n if (isMediumAndUp) {\n baseColumns.push({\n accessorKey: 'entityHeader.modifiedOn',\n id: 'modifiedOn',\n header: ModifiedOnColumnHeader,\n cell: ModifiedOnCell,\n enableSorting: enableSorting,\n })\n }\n\n if (isXtraLarge) {\n baseColumns.push({\n id: 'modifiedBy',\n header: 'Modified By',\n cell: ModifiedByCell,\n enableSorting: false,\n })\n }\n\n if (isMediumAndUp) {\n baseColumns.push({\n id: 'size',\n header: 'Size',\n cell: FileEntitySizeCell,\n enableSorting: false,\n })\n }\n if (isXtraLarge) {\n baseColumns.push({\n id: 'md5',\n header: 'MD5',\n cell: FileEntityMD5Cell,\n enableSorting: false,\n })\n }\n\n baseColumns.push({\n id: 'download',\n header: 'Download',\n cell: AddFileToDownloadListCell,\n enableSorting: false,\n size: 90,\n })\n\n return baseColumns\n }, [enableSorting, isXtraLarge, isMediumAndUp])\n\n return columns\n}\n"],"mappings":";;;;;;;;;;;;;;AAoBA,IAAa,KAAmB,MAA2B;CAEzD,IAAM,IAAQ,GAAU,EAClB,IAAc,EAAc,EAAM,YAAY,GAAG,KAAK,CAAC,EACvD,IAAgB,EAAc,EAAM,YAAY,GAAG,KAAK,CAAC;AAsF/D,QAnFgB,QAA4C;EAC1D,IAAM,IAA4C,CAChD;GACE,aAAa;GACb,IAAI;GACJ,QAAQ;GACR,MAAM;GACS;GACf,MAAM;GACP,CACF;AAsED,SArEI,MACF,EAAY,KAAK;GACf,IAAI;GACJ,QAAQ;GACR,MAAM;GACN,eAAe;GACf,MAAM;GACP,CAAC,EACF,EAAY,KAAK;GACf,IAAI;GACJ,QAAQ;GACR,MAAM;GACN,eAAe;GAChB,CAAC,GAEA,KACF,EAAY,KAAK;GACf,aAAa;GACb,IAAI;GACJ,QAAQ;GACR,MAAM;GACS;GAChB,CAAC,EAGA,KACF,EAAY,KAAK;GACf,aAAa;GACb,IAAI;GACJ,QAAQ;GACR,MAAM;GACS;GAChB,CAAC,EAGA,KACF,EAAY,KAAK;GACf,IAAI;GACJ,QAAQ;GACR,MAAM;GACN,eAAe;GAChB,CAAC,EAGA,KACF,EAAY,KAAK;GACf,IAAI;GACJ,QAAQ;GACR,MAAM;GACN,eAAe;GAChB,CAAC,EAEA,KACF,EAAY,KAAK;GACf,IAAI;GACJ,QAAQ;GACR,MAAM;GACN,eAAe;GAChB,CAAC,EAGJ,EAAY,KAAK;GACf,IAAI;GACJ,QAAQ;GACR,MAAM;GACN,eAAe;GACf,MAAM;GACP,CAAC,EAEK;IACN;EAAC;EAAe;EAAa;EAAc,
|
|
1
|
+
{"version":3,"file":"useTableColumns.js","names":[],"sources":["../../../../src/components/EntityTreeTable/hooks/useTableColumns.ts"],"sourcesContent":["import { useMemo } from 'react'\nimport { ColumnDef } from '@tanstack/react-table'\nimport { useTheme, useMediaQuery } from '@mui/material'\nimport { EntityBundleRow } from '../EntityTreeTable'\nimport { NameCell } from '../components/EntityNameCell'\nimport { IdCell } from '../components/IdCell'\nimport { IdColumnHeader } from '../components/IdColumnHeader'\nimport { ModifiedOnCell } from '../../EntityFinder/details/view/table/ModifiedOnCell'\nimport { ModifiedByCell } from '../../EntityFinder/details/view/table/ModifiedByCell'\nimport { CreatedOnCell } from '../../EntityFinder/details/view/table/CreatedOnCell'\nimport { FileEntitySizeCell } from '../../EntityFinder/details/view/table/FileEntitySizeCell'\nimport { FileEntityMD5Cell } from '../../EntityFinder/details/view/table/FileEntityMD5Cell'\nimport { AddFileToDownloadListCell } from '../../EntityFinder/details/view/table/AddToDownloadListCell'\nimport {\n NameColumnHeader,\n CreatedOnColumnHeader,\n ModifiedOnColumnHeader,\n} from '../components/ColumnHeaders'\nimport { EntityBadgeIconsCell } from '../components/EntityBadgeIconsCell'\n\nexport const useTableColumns = (enableSorting: boolean) => {\n // Responsive design hooks\n const theme = useTheme()\n const isXtraLarge = useMediaQuery(theme.breakpoints.up('xl'))\n const isMediumAndUp = useMediaQuery(theme.breakpoints.up('md'))\n\n // Table columns\n const columns = useMemo<ColumnDef<EntityBundleRow>[]>(() => {\n const baseColumns: ColumnDef<EntityBundleRow>[] = [\n {\n accessorKey: 'entityHeader.name',\n id: 'name',\n header: NameColumnHeader,\n cell: NameCell,\n enableSorting: enableSorting,\n size: 450, // Default width for Name column\n },\n ]\n if (isMediumAndUp) {\n baseColumns.push({\n id: 'badges',\n header: '',\n cell: EntityBadgeIconsCell,\n enableSorting: false,\n size: 120, // Default width for Badges column\n })\n baseColumns.push({\n id: 'id',\n header: IdColumnHeader,\n cell: IdCell,\n enableSorting: false,\n })\n }\n if (isXtraLarge) {\n baseColumns.push({\n accessorKey: 'entityHeader.createdOn',\n id: 'createdOn',\n header: CreatedOnColumnHeader,\n cell: CreatedOnCell,\n enableSorting: enableSorting,\n })\n }\n\n if (isMediumAndUp) {\n baseColumns.push({\n accessorKey: 'entityHeader.modifiedOn',\n id: 'modifiedOn',\n header: ModifiedOnColumnHeader,\n cell: ModifiedOnCell,\n enableSorting: enableSorting,\n })\n }\n\n if (isXtraLarge) {\n baseColumns.push({\n id: 'modifiedBy',\n header: 'Modified By',\n cell: ModifiedByCell,\n enableSorting: false,\n })\n }\n\n if (isMediumAndUp) {\n baseColumns.push({\n id: 'size',\n header: 'Size',\n cell: FileEntitySizeCell,\n enableSorting: false,\n })\n }\n if (isXtraLarge) {\n baseColumns.push({\n id: 'md5',\n header: 'MD5',\n cell: FileEntityMD5Cell,\n enableSorting: false,\n })\n }\n\n baseColumns.push({\n id: 'download',\n header: 'Download',\n cell: AddFileToDownloadListCell,\n enableSorting: false,\n size: 90,\n })\n\n return baseColumns\n }, [enableSorting, isXtraLarge, isMediumAndUp])\n\n return columns\n}\n"],"mappings":";;;;;;;;;;;;;;AAoBA,IAAa,KAAmB,MAA2B;CAEzD,IAAM,IAAQ,GAAU,EAClB,IAAc,EAAc,EAAM,YAAY,GAAG,KAAK,CAAC,EACvD,IAAgB,EAAc,EAAM,YAAY,GAAG,KAAK,CAAC;AAsF/D,QAnFgB,QAA4C;EAC1D,IAAM,IAA4C,CAChD;GACE,aAAa;GACb,IAAI;GACJ,QAAQ;GACR,MAAM;GACS;GACf,MAAM;GACP,CACF;AAsED,SArEI,MACF,EAAY,KAAK;GACf,IAAI;GACJ,QAAQ;GACR,MAAM;GACN,eAAe;GACf,MAAM;GACP,CAAC,EACF,EAAY,KAAK;GACf,IAAI;GACJ,QAAQ;GACR,MAAM;GACN,eAAe;GAChB,CAAC,GAEA,KACF,EAAY,KAAK;GACf,aAAa;GACb,IAAI;GACJ,QAAQ;GACR,MAAM;GACS;GAChB,CAAC,EAGA,KACF,EAAY,KAAK;GACf,aAAa;GACb,IAAI;GACJ,QAAQ;GACR,MAAM;GACS;GAChB,CAAC,EAGA,KACF,EAAY,KAAK;GACf,IAAI;GACJ,QAAQ;GACR,MAAM;GACN,eAAe;GAChB,CAAC,EAGA,KACF,EAAY,KAAK;GACf,IAAI;GACJ,QAAQ;GACR,MAAM;GACN,eAAe;GAChB,CAAC,EAEA,KACF,EAAY,KAAK;GACf,IAAI;GACJ,QAAQ;GACR,MAAM;GACN,eAAe;GAChB,CAAC,EAGJ,EAAY,KAAK;GACf,IAAI;GACJ,QAAQ;GACR,MAAM;GACN,eAAe;GACf,MAAM;GACP,CAAC,EAEK;IACN;EAAC;EAAe;EAAa;EAAc,CAEvC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useTableData.js","names":[],"sources":["../../../../src/components/EntityTreeTable/hooks/useTableData.ts"],"sourcesContent":["import { useMemo } from 'react'\nimport { EntityBundleRow } from '../EntityTreeTable'\nimport { TreeNode } from './useEntityTreeState'\n\nexport const useTableData = (\n tree: Record<string, TreeNode>,\n rootId: string,\n showRootNode: boolean,\n expanded: Record<string, boolean>,\n nextPageTokens: Record<string, string | undefined>,\n flattenTree: (nodeId: string, visited?: Set<string>) => EntityBundleRow[],\n) => {\n const rows: EntityBundleRow[] = useMemo(() => {\n const rootNode = tree[rootId]\n if (!rootNode) return []\n\n if (showRootNode) {\n return flattenTree(rootId, new Set<string>())\n } else {\n // If root node is not shown, start with its children\n const rows: EntityBundleRow[] = []\n if (expanded[rootId] && rootNode.children) {\n rootNode.children.forEach(child => {\n const childRows = flattenTree(\n child.entityHeader.id,\n new Set<string>(),\n )\n rows.push(...childRows)\n })\n // If there is a next page token for the root, add a synthetic 'Load more' row\n const nextToken = nextPageTokens[rootId]\n if (nextToken) {\n rows.push({\n entityId: '', // Empty placeholder for load more rows\n entityHeader: rootNode.entityHeader,\n depth: 0,\n isLeaf: true,\n parentId: rootId,\n versionNumber: rootNode.entityHeader.versionNumber,\n isLoadMore: true,\n pageToken: nextToken,\n })\n }\n }\n return rows\n }\n }, [tree, rootId, flattenTree, showRootNode, expanded, nextPageTokens])\n\n return rows\n}\n"],"mappings":";;AAIA,IAAa,KACX,GACA,GACA,GACA,GACA,GACA,MAEgC,QAAc;CAC5C,IAAM,IAAW,EAAK;AACtB,KAAI,CAAC,EAAU,QAAO,EAAE;AAExB,KAAI,EACF,QAAO,EAAY,mBAAQ,IAAI,KAAa,CAAC;CACxC;EAEL,IAAM,IAA0B,EAAE;AAClC,MAAI,EAAS,MAAW,EAAS,UAAU;AACzC,KAAS,SAAS,SAAQ,MAAS;IACjC,IAAM,IAAY,EAChB,EAAM,aAAa,oBACnB,IAAI,KAAa,CAClB;AACD,MAAK,KAAK,GAAG,EAAU;KACvB;GAEF,IAAM,IAAY,EAAe;AACjC,GAAI,KACF,EAAK,KAAK;IACR,UAAU;IACV,cAAc,EAAS;IACvB,OAAO;IACP,QAAQ;IACR,UAAU;IACV,eAAe,EAAS,aAAa;IACrC,YAAY;IACZ,WAAW;IACZ,CAAC;;AAGN,SAAO;;GAER;CAAC;CAAM;CAAQ;CAAa;CAAc;CAAU;CAAe,
|
|
1
|
+
{"version":3,"file":"useTableData.js","names":[],"sources":["../../../../src/components/EntityTreeTable/hooks/useTableData.ts"],"sourcesContent":["import { useMemo } from 'react'\nimport { EntityBundleRow } from '../EntityTreeTable'\nimport { TreeNode } from './useEntityTreeState'\n\nexport const useTableData = (\n tree: Record<string, TreeNode>,\n rootId: string,\n showRootNode: boolean,\n expanded: Record<string, boolean>,\n nextPageTokens: Record<string, string | undefined>,\n flattenTree: (nodeId: string, visited?: Set<string>) => EntityBundleRow[],\n) => {\n const rows: EntityBundleRow[] = useMemo(() => {\n const rootNode = tree[rootId]\n if (!rootNode) return []\n\n if (showRootNode) {\n return flattenTree(rootId, new Set<string>())\n } else {\n // If root node is not shown, start with its children\n const rows: EntityBundleRow[] = []\n if (expanded[rootId] && rootNode.children) {\n rootNode.children.forEach(child => {\n const childRows = flattenTree(\n child.entityHeader.id,\n new Set<string>(),\n )\n rows.push(...childRows)\n })\n // If there is a next page token for the root, add a synthetic 'Load more' row\n const nextToken = nextPageTokens[rootId]\n if (nextToken) {\n rows.push({\n entityId: '', // Empty placeholder for load more rows\n entityHeader: rootNode.entityHeader,\n depth: 0,\n isLeaf: true,\n parentId: rootId,\n versionNumber: rootNode.entityHeader.versionNumber,\n isLoadMore: true,\n pageToken: nextToken,\n })\n }\n }\n return rows\n }\n }, [tree, rootId, flattenTree, showRootNode, expanded, nextPageTokens])\n\n return rows\n}\n"],"mappings":";;AAIA,IAAa,KACX,GACA,GACA,GACA,GACA,GACA,MAEgC,QAAc;CAC5C,IAAM,IAAW,EAAK;AACtB,KAAI,CAAC,EAAU,QAAO,EAAE;AAExB,KAAI,EACF,QAAO,EAAY,mBAAQ,IAAI,KAAa,CAAC;CACxC;EAEL,IAAM,IAA0B,EAAE;AAClC,MAAI,EAAS,MAAW,EAAS,UAAU;AACzC,KAAS,SAAS,SAAQ,MAAS;IACjC,IAAM,IAAY,EAChB,EAAM,aAAa,oBACnB,IAAI,KAAa,CAClB;AACD,MAAK,KAAK,GAAG,EAAU;KACvB;GAEF,IAAM,IAAY,EAAe;AACjC,GAAI,KACF,EAAK,KAAK;IACR,UAAU;IACV,cAAc,EAAS;IACvB,OAAO;IACP,QAAQ;IACR,UAAU;IACV,eAAe,EAAS,aAAa;IACrC,YAAY;IACZ,WAAW;IACZ,CAAC;;AAGN,SAAO;;GAER;CAAC;CAAM;CAAQ;CAAa;CAAc;CAAU;CAAe,CAE/D"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useTreeOperationsWithDirectFetch.js","names":[],"sources":["../../../../src/components/EntityTreeTable/hooks/useTreeOperationsWithDirectFetch.ts"],"sourcesContent":["import { useCallback } from 'react'\nimport { EntityBundleRow } from '../EntityTreeTable'\nimport { TreeNode } from './useEntityTreeState'\nimport { useQueryClient } from '@tanstack/react-query'\nimport { useSynapseContext } from '@/utils/context/SynapseContext'\nimport SynapseClient from '@/synapse-client'\nimport { EntityType } from '@sage-bionetworks/synapse-client'\nimport {\n EntityHeader,\n SortBy,\n Direction,\n} from '@sage-bionetworks/synapse-types'\nimport {\n convertToEntityType,\n isContainerType,\n} from '@/utils/functions/EntityTypeUtils'\nimport { omit } from 'lodash-es'\n\nconst includeTypes: EntityType[] = [\n EntityType.folder,\n EntityType.file,\n EntityType.link,\n EntityType.recordset,\n]\n\nexport const useTreeOperationsWithDirectFetch = (\n expanded: Record<string, boolean>,\n setExpanded: (value: React.SetStateAction<Record<string, boolean>>) => void,\n tree: Record<string, TreeNode>,\n setTree: (value: React.SetStateAction<Record<string, TreeNode>>) => void,\n loadedChildren: Set<string>,\n setLoadedChildren: (value: React.SetStateAction<Set<string>>) => void,\n loadingIds: Set<string>,\n setLoadingIds: (value: React.SetStateAction<Set<string>>) => void,\n setNextPageTokens: (\n value: React.SetStateAction<Record<string, string | undefined>>,\n ) => void,\n setLoadingPageTokens: (\n value: React.SetStateAction<Record<string, string | undefined>>,\n ) => void,\n loadingPageTokens: Record<string, string | undefined>,\n nextPageTokens: Record<string, string | undefined>,\n sortBy?: SortBy,\n sortDirection?: Direction,\n) => {\n const queryClient = useQueryClient()\n const { accessToken, keyFactory } = useSynapseContext()\n\n // Helper function to convert EntityHeaders to TreeNodes\n const createTreeNodes = useCallback(\n (\n entityHeaders: EntityHeader[],\n parentId: string,\n parentDepth: number,\n ): TreeNode[] => {\n return entityHeaders.map((eh: EntityHeader) => ({\n entityHeader: eh,\n parentId,\n depth: parentDepth + 1,\n isLeaf: !isContainerType(convertToEntityType(eh.type)),\n }))\n },\n [],\n )\n\n // Helper function to clean up loading state on error\n const cleanupLoadingState = useCallback(\n (entityId: string, pageToken?: string) => {\n setLoadingIds(prev => {\n const next = new Set(prev)\n next.delete(entityId)\n return next\n })\n\n if (pageToken !== undefined) {\n setLoadingPageTokens(prev => {\n return omit(prev, [entityId])\n })\n }\n },\n [setLoadingIds, setLoadingPageTokens],\n )\n\n // Helper function to fetch entity children\n const fetchEntityChildren = useCallback(\n async (entityId: string, pageToken?: string) => {\n const entityChildrenRequest = {\n parentId: entityId,\n includeTypes,\n ...(pageToken && { nextPageToken: pageToken }),\n sortBy,\n sortDirection,\n }\n\n return await queryClient.fetchQuery({\n queryKey: keyFactory.getEntityChildrenQueryKey(\n entityChildrenRequest,\n false,\n ),\n queryFn: () =>\n SynapseClient.getEntityChildren(entityChildrenRequest, accessToken),\n })\n },\n [queryClient, keyFactory, accessToken, sortBy, sortDirection],\n )\n\n // Callback to handle when children are loaded - moved before handleToggleExpanded to fix dependency order\n const handleChildrenLoaded = useCallback(\n (entityId: string, children: TreeNode[], nextPageToken?: string) => {\n setTree(prev => {\n const node = prev[entityId]\n if (node) {\n // Set correct depth for child nodes\n const childNodesWithDepth = children.map(child => ({\n ...child,\n depth: node.depth + 1,\n }))\n\n const mergedChildren = [\n ...(node.children || []),\n ...childNodesWithDepth,\n ]\n\n // Merge children into the tree mapping while preserving existing\n // subtree entries for those children (so expanding deeper nodes\n // isn't lost when siblings are added).\n const mergedChildEntries = Object.fromEntries(\n mergedChildren.map(child => {\n const existing = prev[child.entityHeader.id]\n const merged = {\n ...existing,\n ...child,\n depth: child.depth,\n parentId: child.parentId,\n isLeaf: child.isLeaf,\n }\n\n return [child.entityHeader.id, merged]\n }),\n )\n\n return {\n ...prev,\n [entityId]: {\n ...node,\n children: mergedChildren,\n },\n ...mergedChildEntries,\n }\n }\n return prev\n })\n\n // store nextPageToken for this parent (if any)\n setNextPageTokens(prev => ({ ...prev, [entityId]: nextPageToken }))\n // clear the loading page token entry for this parent since the\n // requested page has completed (this prevents any remaining loading state)\n setLoadingPageTokens(prev => {\n return omit(prev, [entityId])\n })\n\n setLoadingIds(prev => {\n const next = new Set(prev)\n next.delete(entityId)\n return next\n })\n\n // mark as loaded only if there is no next page token (i.e., fully loaded)\n if (!nextPageToken) {\n setLoadedChildren(prev => new Set(prev).add(entityId))\n }\n },\n [\n loadingPageTokens,\n setTree,\n setNextPageTokens,\n setLoadingPageTokens,\n setLoadingIds,\n setLoadedChildren,\n ],\n )\n\n // Handler for expanding nodes - handles fetching children\n const handleToggleExpanded = useCallback(\n async (entityId: string) => {\n const isCurrentlyExpanded = expanded[entityId]\n\n setExpanded(prev => ({\n ...prev,\n [entityId]: !prev[entityId],\n }))\n\n // If expanding and children haven't been loaded yet, fetch them directly\n if (\n !isCurrentlyExpanded &&\n !loadedChildren.has(entityId) &&\n !loadingIds.has(entityId)\n ) {\n const node = tree[entityId]\n if (node && !node.isLeaf) {\n setLoadingIds(prev => new Set(prev).add(entityId))\n\n try {\n const children = await fetchEntityChildren(entityId)\n const childNodes = createTreeNodes(\n children.page,\n entityId,\n node.depth,\n )\n handleChildrenLoaded(entityId, childNodes, children.nextPageToken)\n } catch (error) {\n console.error(\n 'Failed to fetch children for entity:',\n entityId,\n error,\n )\n cleanupLoadingState(entityId)\n }\n }\n }\n },\n [\n expanded,\n loadedChildren,\n tree,\n setExpanded,\n setLoadingIds,\n fetchEntityChildren,\n createTreeNodes,\n handleChildrenLoaded,\n cleanupLoadingState,\n ],\n )\n\n const loadMoreChildren = useCallback(\n async (entityId: string, pageToken?: string) => {\n // set which page token is being requested for this parent and mark loading\n setLoadingPageTokens(prev => ({ ...prev, [entityId]: pageToken }))\n setLoadingIds(prev => new Set(prev).add(entityId))\n\n try {\n const children = await fetchEntityChildren(entityId, pageToken)\n const node = tree[entityId]\n const childNodes = createTreeNodes(\n children.page,\n entityId,\n node ? node.depth : -1,\n )\n handleChildrenLoaded(entityId, childNodes, children.nextPageToken)\n } catch (error) {\n console.error(\n 'Failed to load more children for entity:',\n entityId,\n error,\n )\n cleanupLoadingState(entityId, pageToken)\n }\n },\n [\n setLoadingPageTokens,\n setLoadingIds,\n fetchEntityChildren,\n createTreeNodes,\n tree,\n handleChildrenLoaded,\n cleanupLoadingState,\n ],\n )\n\n // Flatten tree for table rows. Track visited node ids to avoid cycles and\n // duplicate rows when the same entity appears multiple times in the\n // traversal (links, cycles, or bad/multiple parent relationships).\n const flattenTree = useCallback(\n (nodeId: string, visited = new Set<string>()): EntityBundleRow[] => {\n // Prevent revisiting the same node and producing duplicate rows\n if (visited.has(nodeId)) return []\n visited.add(nodeId)\n\n const node = tree[nodeId]\n if (!node) return []\n\n const rows: EntityBundleRow[] = [\n {\n entityId: node.entityHeader.id,\n entityHeader: node.entityHeader,\n depth: node.depth,\n isLeaf: node.isLeaf,\n parentId: node.parentId,\n versionNumber: node.entityHeader.versionNumber,\n },\n ]\n\n if (expanded[node.entityHeader.id] && node.children) {\n node.children.forEach(child => {\n rows.push(...flattenTree(child.entityHeader.id, visited))\n })\n // If there is a next page token for this node, add a synthetic 'Load more' row\n const nextToken = nextPageTokens[node.entityHeader.id]\n\n if (nextToken) {\n rows.push({\n entityId: '', // Empty placeholder for load more rows\n entityHeader: node.entityHeader,\n depth: node.depth + 1,\n isLeaf: true,\n parentId: node.entityHeader.id,\n versionNumber: node.entityHeader.versionNumber,\n isLoadMore: true,\n pageToken: nextToken,\n })\n }\n }\n return rows\n },\n [expanded, tree, nextPageTokens],\n )\n\n return {\n handleToggleExpanded,\n handleChildrenLoaded,\n loadMoreChildren,\n flattenTree,\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"useTreeOperationsWithDirectFetch.js","names":[],"sources":["../../../../src/components/EntityTreeTable/hooks/useTreeOperationsWithDirectFetch.ts"],"sourcesContent":["import { useCallback } from 'react'\nimport { EntityBundleRow } from '../EntityTreeTable'\nimport { TreeNode } from './useEntityTreeState'\nimport { useQueryClient } from '@tanstack/react-query'\nimport { useSynapseContext } from '@/utils/context/SynapseContext'\nimport SynapseClient from '@/synapse-client'\nimport { EntityType } from '@sage-bionetworks/synapse-client'\nimport {\n EntityHeader,\n SortBy,\n Direction,\n} from '@sage-bionetworks/synapse-types'\nimport {\n convertToEntityType,\n isContainerType,\n} from '@/utils/functions/EntityTypeUtils'\nimport { omit } from 'lodash-es'\n\nconst includeTypes: EntityType[] = [\n EntityType.folder,\n EntityType.file,\n EntityType.link,\n EntityType.recordset,\n]\n\nexport const useTreeOperationsWithDirectFetch = (\n expanded: Record<string, boolean>,\n setExpanded: (value: React.SetStateAction<Record<string, boolean>>) => void,\n tree: Record<string, TreeNode>,\n setTree: (value: React.SetStateAction<Record<string, TreeNode>>) => void,\n loadedChildren: Set<string>,\n setLoadedChildren: (value: React.SetStateAction<Set<string>>) => void,\n loadingIds: Set<string>,\n setLoadingIds: (value: React.SetStateAction<Set<string>>) => void,\n setNextPageTokens: (\n value: React.SetStateAction<Record<string, string | undefined>>,\n ) => void,\n setLoadingPageTokens: (\n value: React.SetStateAction<Record<string, string | undefined>>,\n ) => void,\n loadingPageTokens: Record<string, string | undefined>,\n nextPageTokens: Record<string, string | undefined>,\n sortBy?: SortBy,\n sortDirection?: Direction,\n) => {\n const queryClient = useQueryClient()\n const { accessToken, keyFactory } = useSynapseContext()\n\n // Helper function to convert EntityHeaders to TreeNodes\n const createTreeNodes = useCallback(\n (\n entityHeaders: EntityHeader[],\n parentId: string,\n parentDepth: number,\n ): TreeNode[] => {\n return entityHeaders.map((eh: EntityHeader) => ({\n entityHeader: eh,\n parentId,\n depth: parentDepth + 1,\n isLeaf: !isContainerType(convertToEntityType(eh.type)),\n }))\n },\n [],\n )\n\n // Helper function to clean up loading state on error\n const cleanupLoadingState = useCallback(\n (entityId: string, pageToken?: string) => {\n setLoadingIds(prev => {\n const next = new Set(prev)\n next.delete(entityId)\n return next\n })\n\n if (pageToken !== undefined) {\n setLoadingPageTokens(prev => {\n return omit(prev, [entityId])\n })\n }\n },\n [setLoadingIds, setLoadingPageTokens],\n )\n\n // Helper function to fetch entity children\n const fetchEntityChildren = useCallback(\n async (entityId: string, pageToken?: string) => {\n const entityChildrenRequest = {\n parentId: entityId,\n includeTypes,\n ...(pageToken && { nextPageToken: pageToken }),\n sortBy,\n sortDirection,\n }\n\n return await queryClient.fetchQuery({\n queryKey: keyFactory.getEntityChildrenQueryKey(\n entityChildrenRequest,\n false,\n ),\n queryFn: () =>\n SynapseClient.getEntityChildren(entityChildrenRequest, accessToken),\n })\n },\n [queryClient, keyFactory, accessToken, sortBy, sortDirection],\n )\n\n // Callback to handle when children are loaded - moved before handleToggleExpanded to fix dependency order\n const handleChildrenLoaded = useCallback(\n (entityId: string, children: TreeNode[], nextPageToken?: string) => {\n setTree(prev => {\n const node = prev[entityId]\n if (node) {\n // Set correct depth for child nodes\n const childNodesWithDepth = children.map(child => ({\n ...child,\n depth: node.depth + 1,\n }))\n\n const mergedChildren = [\n ...(node.children || []),\n ...childNodesWithDepth,\n ]\n\n // Merge children into the tree mapping while preserving existing\n // subtree entries for those children (so expanding deeper nodes\n // isn't lost when siblings are added).\n const mergedChildEntries = Object.fromEntries(\n mergedChildren.map(child => {\n const existing = prev[child.entityHeader.id]\n const merged = {\n ...existing,\n ...child,\n depth: child.depth,\n parentId: child.parentId,\n isLeaf: child.isLeaf,\n }\n\n return [child.entityHeader.id, merged]\n }),\n )\n\n return {\n ...prev,\n [entityId]: {\n ...node,\n children: mergedChildren,\n },\n ...mergedChildEntries,\n }\n }\n return prev\n })\n\n // store nextPageToken for this parent (if any)\n setNextPageTokens(prev => ({ ...prev, [entityId]: nextPageToken }))\n // clear the loading page token entry for this parent since the\n // requested page has completed (this prevents any remaining loading state)\n setLoadingPageTokens(prev => {\n return omit(prev, [entityId])\n })\n\n setLoadingIds(prev => {\n const next = new Set(prev)\n next.delete(entityId)\n return next\n })\n\n // mark as loaded only if there is no next page token (i.e., fully loaded)\n if (!nextPageToken) {\n setLoadedChildren(prev => new Set(prev).add(entityId))\n }\n },\n [\n loadingPageTokens,\n setTree,\n setNextPageTokens,\n setLoadingPageTokens,\n setLoadingIds,\n setLoadedChildren,\n ],\n )\n\n // Handler for expanding nodes - handles fetching children\n const handleToggleExpanded = useCallback(\n async (entityId: string) => {\n const isCurrentlyExpanded = expanded[entityId]\n\n setExpanded(prev => ({\n ...prev,\n [entityId]: !prev[entityId],\n }))\n\n // If expanding and children haven't been loaded yet, fetch them directly\n if (\n !isCurrentlyExpanded &&\n !loadedChildren.has(entityId) &&\n !loadingIds.has(entityId)\n ) {\n const node = tree[entityId]\n if (node && !node.isLeaf) {\n setLoadingIds(prev => new Set(prev).add(entityId))\n\n try {\n const children = await fetchEntityChildren(entityId)\n const childNodes = createTreeNodes(\n children.page,\n entityId,\n node.depth,\n )\n handleChildrenLoaded(entityId, childNodes, children.nextPageToken)\n } catch (error) {\n console.error(\n 'Failed to fetch children for entity:',\n entityId,\n error,\n )\n cleanupLoadingState(entityId)\n }\n }\n }\n },\n [\n expanded,\n loadedChildren,\n tree,\n setExpanded,\n setLoadingIds,\n fetchEntityChildren,\n createTreeNodes,\n handleChildrenLoaded,\n cleanupLoadingState,\n ],\n )\n\n const loadMoreChildren = useCallback(\n async (entityId: string, pageToken?: string) => {\n // set which page token is being requested for this parent and mark loading\n setLoadingPageTokens(prev => ({ ...prev, [entityId]: pageToken }))\n setLoadingIds(prev => new Set(prev).add(entityId))\n\n try {\n const children = await fetchEntityChildren(entityId, pageToken)\n const node = tree[entityId]\n const childNodes = createTreeNodes(\n children.page,\n entityId,\n node ? node.depth : -1,\n )\n handleChildrenLoaded(entityId, childNodes, children.nextPageToken)\n } catch (error) {\n console.error(\n 'Failed to load more children for entity:',\n entityId,\n error,\n )\n cleanupLoadingState(entityId, pageToken)\n }\n },\n [\n setLoadingPageTokens,\n setLoadingIds,\n fetchEntityChildren,\n createTreeNodes,\n tree,\n handleChildrenLoaded,\n cleanupLoadingState,\n ],\n )\n\n // Flatten tree for table rows. Track visited node ids to avoid cycles and\n // duplicate rows when the same entity appears multiple times in the\n // traversal (links, cycles, or bad/multiple parent relationships).\n const flattenTree = useCallback(\n (nodeId: string, visited = new Set<string>()): EntityBundleRow[] => {\n // Prevent revisiting the same node and producing duplicate rows\n if (visited.has(nodeId)) return []\n visited.add(nodeId)\n\n const node = tree[nodeId]\n if (!node) return []\n\n const rows: EntityBundleRow[] = [\n {\n entityId: node.entityHeader.id,\n entityHeader: node.entityHeader,\n depth: node.depth,\n isLeaf: node.isLeaf,\n parentId: node.parentId,\n versionNumber: node.entityHeader.versionNumber,\n },\n ]\n\n if (expanded[node.entityHeader.id] && node.children) {\n node.children.forEach(child => {\n rows.push(...flattenTree(child.entityHeader.id, visited))\n })\n // If there is a next page token for this node, add a synthetic 'Load more' row\n const nextToken = nextPageTokens[node.entityHeader.id]\n\n if (nextToken) {\n rows.push({\n entityId: '', // Empty placeholder for load more rows\n entityHeader: node.entityHeader,\n depth: node.depth + 1,\n isLeaf: true,\n parentId: node.entityHeader.id,\n versionNumber: node.entityHeader.versionNumber,\n isLoadMore: true,\n pageToken: nextToken,\n })\n }\n }\n return rows\n },\n [expanded, tree, nextPageTokens],\n )\n\n return {\n handleToggleExpanded,\n handleChildrenLoaded,\n loadMoreChildren,\n flattenTree,\n }\n}\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"EntityUpload.js","names":[],"sources":["../../../src/components/EntityUpload/EntityUpload.tsx"],"sourcesContent":["import MultiFileUploadProgress from '@/components/file/upload/MultiFileUploadProgress'\nimport UploadFilePanel from '@/components/file/upload/UploadFilePanel'\nimport { SYNAPSE_STORAGE_LOCATION_ID } from '@/synapse-client/index'\nimport { useGetDefaultUploadDestination, useGetEntity } from '@/synapse-queries'\nimport { getUploadDestinationString } from '@/utils/functions/FileHandleUtils'\nimport {\n EntityUploaderState,\n useUploadFileEntities,\n} from '@/utils/hooks/useUploadFileEntity/useUploadFileEntities'\nimport { Typography } from '@mui/material'\nimport { noop } from 'lodash-es'\nimport {\n ForwardedRef,\n forwardRef,\n useEffect,\n useImperativeHandle,\n useState,\n} from 'react'\nimport FullWidthAlert from '../FullWidthAlert/FullWidthAlert'\nimport { displayToast } from '../ToastMessage/ToastMessage'\nimport { EntityUploadPromptDialog } from './EntityUploadPromptDialog'\nimport { ExternalObjectStoreCredentialsForm } from './ExternalObjectStoreCredentialsForm'\nimport { ProjectStorageLimitAlert } from './ProjectStorageLimitAlert'\n\nexport type EntityUploadProps = {\n /** The ID of the entity to upload to. If this is a container, file(s) will be added as children. If this is a\n * FileEntity, then a file may be uploaded as a new version */\n entityId: string\n /** Callback that is invoked when the state of the uploader changes */\n onStateChange?: (state: EntityUploaderState) => void\n /** Callback that is invoked when component is ready to upload */\n onUploadReady?: () => void\n}\n\nexport type EntityUploadHandle = {\n /** Programmatically add files to the upload (e.g. on drag & drop) */\n handleUploads: (fileList: ArrayLike<File>) => void\n}\n\nexport const EntityUpload = forwardRef(function EntityUpload(\n props: EntityUploadProps,\n ref: ForwardedRef<EntityUploadHandle>,\n) {\n const { entityId, onStateChange = noop, onUploadReady = noop } = props\n\n const { data: entity, isLoading: isLoadingEntity } = useGetEntity(entityId)\n\n const isFileEntity =\n entity?.concreteType === 'org.sagebionetworks.repo.model.FileEntity'\n\n const { data: uploadDestination, isLoading: isLoadingUploadDestination } =\n useGetDefaultUploadDestination(entityId)\n const isLoading = isLoadingEntity || isLoadingUploadDestination\n\n const [accessKey, setAccessKey] = useState('')\n const [secretKey, setSecretKey] = useState('')\n\n const [didUploadsExceedStorageLimit, setDidUploadsExceedStorageLimit] =\n useState(false)\n\n const {\n initiateUpload,\n state,\n uploadProgress,\n activePrompts,\n isPrecheckingUpload,\n isUploadReady,\n } = useUploadFileEntities(entityId, accessKey, secretKey, () =>\n setDidUploadsExceedStorageLimit(true),\n )\n\n useEffect(() => {\n onStateChange(state)\n }, [state, onStateChange])\n\n useEffect(() => {\n if (isUploadReady) {\n onUploadReady()\n }\n }, [isUploadReady, onUploadReady])\n\n function uploadFileList(fileList: ArrayLike<File>) {\n if (uploadDestination?.projectStorageLocationUsage?.isOverLimit) {\n displayToast(\n 'Cannot upload files because the storage limit has been exceeded.',\n 'danger',\n )\n return\n }\n const args = Array.from(fileList).map(file => {\n if (isFileEntity) {\n return { file, existingEntityId: entityId }\n }\n return {\n file,\n rootContainerId: entityId,\n }\n })\n initiateUpload(args)\n }\n\n useImperativeHandle(ref, () => ({\n handleUploads: uploadFileList,\n }))\n\n const showLoading = isPrecheckingUpload || isLoading\n const loadingText = isPrecheckingUpload\n ? 'Preparing files for upload...'\n : 'Loading...'\n\n return (\n <div>\n <EntityUploadPromptDialog activePrompts={activePrompts} />\n {uploadDestination?.projectStorageLocationUsage && (\n <ProjectStorageLimitAlert\n usage={uploadDestination.projectStorageLocationUsage}\n didUploadsExceedLimit={didUploadsExceedStorageLimit}\n />\n )}\n <ExternalObjectStoreCredentialsForm\n uploadDestination={uploadDestination}\n accessKey={accessKey}\n setAccessKey={setAccessKey}\n secretKey={secretKey}\n setSecretKey={setSecretKey}\n />\n <UploadFilePanel\n onUploadFileList={uploadFileList}\n allowMultipleFiles={!isFileEntity}\n isLoading={showLoading}\n loadingText={loadingText}\n disabled={uploadDestination?.projectStorageLocationUsage?.isOverLimit}\n message={\n <>\n <Typography variant={'smallText1'}>\n All uploaded files will be stored in\n {uploadDestination?.storageLocationId ===\n SYNAPSE_STORAGE_LOCATION_ID && ' Synapse storage'}\n {uploadDestination &&\n uploadDestination?.storageLocationId !==\n SYNAPSE_STORAGE_LOCATION_ID && (\n <>\n :<br />\n {getUploadDestinationString(uploadDestination)}\n </>\n )}\n </Typography>\n {uploadDestination && uploadDestination.banner && (\n <FullWidthAlert\n sx={{\n textAlign: 'left',\n }}\n isGlobal={false}\n title={'Storage Location Message'}\n description={uploadDestination.banner}\n variant={'info'}\n />\n )}\n </>\n }\n />\n <MultiFileUploadProgress\n uploaderState={state}\n uploadProgress={uploadProgress}\n />\n </div>\n )\n})\n"],"mappings":";;;;;;;;;;;;;;;;;;;AAuCA,IAAa,IAAe,EAAW,SACrC,GACA,GACA;CACA,IAAM,EAAE,aAAU,mBAAgB,GAAM,mBAAgB,MAAS,GAE3D,EAAE,MAAM,GAAQ,WAAW,MAAoB,EAAa,EAAS,EAErE,IACJ,GAAQ,iBAAiB,6CAErB,EAAE,MAAM,GAAmB,WAAW,MAC1C,EAA+B,EAAS,EACpC,IAAY,KAAmB,GAE/B,CAAC,GAAW,KAAgB,EAAS,GAAG,EACxC,CAAC,GAAW,KAAgB,EAAS,GAAG,EAExC,CAAC,GAA8B,KACnC,EAAS,GAAM,EAEX,EACJ,mBACA,UACA,mBACA,kBACA,wBACA,qBACE,EAAsB,GAAU,GAAW,SAC7C,EAAgC,GAAK,CACtC;AAMD,CAJA,QAAgB;AACd,IAAc,EAAM;IACnB,CAAC,GAAO,EAAc,CAAC,EAE1B,QAAgB;AACd,EAAI,KACF,GAAe;IAEhB,CAAC,GAAe,EAAc,CAAC;CAElC,SAAS,EAAe,GAA2B;AACjD,MAAI,GAAmB,6BAA6B,aAAa;AAC/D,KACE,oEACA,SACD;AACD;;AAWF,IATa,MAAM,KAAK,EAAS,CAAC,KAAI,MAChC,IACK;GAAE;GAAM,kBAAkB;GAAU,GAEtC;GACL;GACA,iBAAiB;GAClB,
|
|
1
|
+
{"version":3,"file":"EntityUpload.js","names":[],"sources":["../../../src/components/EntityUpload/EntityUpload.tsx"],"sourcesContent":["import MultiFileUploadProgress from '@/components/file/upload/MultiFileUploadProgress'\nimport UploadFilePanel from '@/components/file/upload/UploadFilePanel'\nimport { SYNAPSE_STORAGE_LOCATION_ID } from '@/synapse-client/index'\nimport { useGetDefaultUploadDestination, useGetEntity } from '@/synapse-queries'\nimport { getUploadDestinationString } from '@/utils/functions/FileHandleUtils'\nimport {\n EntityUploaderState,\n useUploadFileEntities,\n} from '@/utils/hooks/useUploadFileEntity/useUploadFileEntities'\nimport { Typography } from '@mui/material'\nimport { noop } from 'lodash-es'\nimport {\n ForwardedRef,\n forwardRef,\n useEffect,\n useImperativeHandle,\n useState,\n} from 'react'\nimport FullWidthAlert from '../FullWidthAlert/FullWidthAlert'\nimport { displayToast } from '../ToastMessage/ToastMessage'\nimport { EntityUploadPromptDialog } from './EntityUploadPromptDialog'\nimport { ExternalObjectStoreCredentialsForm } from './ExternalObjectStoreCredentialsForm'\nimport { ProjectStorageLimitAlert } from './ProjectStorageLimitAlert'\n\nexport type EntityUploadProps = {\n /** The ID of the entity to upload to. If this is a container, file(s) will be added as children. If this is a\n * FileEntity, then a file may be uploaded as a new version */\n entityId: string\n /** Callback that is invoked when the state of the uploader changes */\n onStateChange?: (state: EntityUploaderState) => void\n /** Callback that is invoked when component is ready to upload */\n onUploadReady?: () => void\n}\n\nexport type EntityUploadHandle = {\n /** Programmatically add files to the upload (e.g. on drag & drop) */\n handleUploads: (fileList: ArrayLike<File>) => void\n}\n\nexport const EntityUpload = forwardRef(function EntityUpload(\n props: EntityUploadProps,\n ref: ForwardedRef<EntityUploadHandle>,\n) {\n const { entityId, onStateChange = noop, onUploadReady = noop } = props\n\n const { data: entity, isLoading: isLoadingEntity } = useGetEntity(entityId)\n\n const isFileEntity =\n entity?.concreteType === 'org.sagebionetworks.repo.model.FileEntity'\n\n const { data: uploadDestination, isLoading: isLoadingUploadDestination } =\n useGetDefaultUploadDestination(entityId)\n const isLoading = isLoadingEntity || isLoadingUploadDestination\n\n const [accessKey, setAccessKey] = useState('')\n const [secretKey, setSecretKey] = useState('')\n\n const [didUploadsExceedStorageLimit, setDidUploadsExceedStorageLimit] =\n useState(false)\n\n const {\n initiateUpload,\n state,\n uploadProgress,\n activePrompts,\n isPrecheckingUpload,\n isUploadReady,\n } = useUploadFileEntities(entityId, accessKey, secretKey, () =>\n setDidUploadsExceedStorageLimit(true),\n )\n\n useEffect(() => {\n onStateChange(state)\n }, [state, onStateChange])\n\n useEffect(() => {\n if (isUploadReady) {\n onUploadReady()\n }\n }, [isUploadReady, onUploadReady])\n\n function uploadFileList(fileList: ArrayLike<File>) {\n if (uploadDestination?.projectStorageLocationUsage?.isOverLimit) {\n displayToast(\n 'Cannot upload files because the storage limit has been exceeded.',\n 'danger',\n )\n return\n }\n const args = Array.from(fileList).map(file => {\n if (isFileEntity) {\n return { file, existingEntityId: entityId }\n }\n return {\n file,\n rootContainerId: entityId,\n }\n })\n initiateUpload(args)\n }\n\n useImperativeHandle(ref, () => ({\n handleUploads: uploadFileList,\n }))\n\n const showLoading = isPrecheckingUpload || isLoading\n const loadingText = isPrecheckingUpload\n ? 'Preparing files for upload...'\n : 'Loading...'\n\n return (\n <div>\n <EntityUploadPromptDialog activePrompts={activePrompts} />\n {uploadDestination?.projectStorageLocationUsage && (\n <ProjectStorageLimitAlert\n usage={uploadDestination.projectStorageLocationUsage}\n didUploadsExceedLimit={didUploadsExceedStorageLimit}\n />\n )}\n <ExternalObjectStoreCredentialsForm\n uploadDestination={uploadDestination}\n accessKey={accessKey}\n setAccessKey={setAccessKey}\n secretKey={secretKey}\n setSecretKey={setSecretKey}\n />\n <UploadFilePanel\n onUploadFileList={uploadFileList}\n allowMultipleFiles={!isFileEntity}\n isLoading={showLoading}\n loadingText={loadingText}\n disabled={uploadDestination?.projectStorageLocationUsage?.isOverLimit}\n message={\n <>\n <Typography variant={'smallText1'}>\n All uploaded files will be stored in\n {uploadDestination?.storageLocationId ===\n SYNAPSE_STORAGE_LOCATION_ID && ' Synapse storage'}\n {uploadDestination &&\n uploadDestination?.storageLocationId !==\n SYNAPSE_STORAGE_LOCATION_ID && (\n <>\n :<br />\n {getUploadDestinationString(uploadDestination)}\n </>\n )}\n </Typography>\n {uploadDestination && uploadDestination.banner && (\n <FullWidthAlert\n sx={{\n textAlign: 'left',\n }}\n isGlobal={false}\n title={'Storage Location Message'}\n description={uploadDestination.banner}\n variant={'info'}\n />\n )}\n </>\n }\n />\n <MultiFileUploadProgress\n uploaderState={state}\n uploadProgress={uploadProgress}\n />\n </div>\n )\n})\n"],"mappings":";;;;;;;;;;;;;;;;;;;AAuCA,IAAa,IAAe,EAAW,SACrC,GACA,GACA;CACA,IAAM,EAAE,aAAU,mBAAgB,GAAM,mBAAgB,MAAS,GAE3D,EAAE,MAAM,GAAQ,WAAW,MAAoB,EAAa,EAAS,EAErE,IACJ,GAAQ,iBAAiB,6CAErB,EAAE,MAAM,GAAmB,WAAW,MAC1C,EAA+B,EAAS,EACpC,IAAY,KAAmB,GAE/B,CAAC,GAAW,KAAgB,EAAS,GAAG,EACxC,CAAC,GAAW,KAAgB,EAAS,GAAG,EAExC,CAAC,GAA8B,KACnC,EAAS,GAAM,EAEX,EACJ,mBACA,UACA,mBACA,kBACA,wBACA,qBACE,EAAsB,GAAU,GAAW,SAC7C,EAAgC,GAAK,CACtC;AAMD,CAJA,QAAgB;AACd,IAAc,EAAM;IACnB,CAAC,GAAO,EAAc,CAAC,EAE1B,QAAgB;AACd,EAAI,KACF,GAAe;IAEhB,CAAC,GAAe,EAAc,CAAC;CAElC,SAAS,EAAe,GAA2B;AACjD,MAAI,GAAmB,6BAA6B,aAAa;AAC/D,KACE,oEACA,SACD;AACD;;AAWF,IATa,MAAM,KAAK,EAAS,CAAC,KAAI,MAChC,IACK;GAAE;GAAM,kBAAkB;GAAU,GAEtC;GACL;GACA,iBAAiB;GAClB,CAEY,CAAK;;AAGtB,GAAoB,UAAY,EAC9B,eAAe,GAChB,EAAE;CAEH,IAAM,IAAc,KAAuB,GACrC,IAAc,IAChB,kCACA;AAEJ,QACE,kBAAC,OAAD,EAAA,UAAA;EACE,kBAAC,GAAD,EAAyC,kBAAiB,CAAA;EACzD,GAAmB,+BAClB,kBAAC,GAAD;GACE,OAAO,EAAkB;GACzB,uBAAuB;GACvB,CAAA;EAEJ,kBAAC,GAAD;GACqB;GACR;GACG;GACH;GACG;GACd,CAAA;EACF,kBAAC,GAAD;GACE,kBAAkB;GAClB,oBAAoB,CAAC;GACrB,WAAW;GACE;GACb,UAAU,GAAmB,6BAA6B;GAC1D,SACE,kBAAA,GAAA,EAAA,UAAA,CACE,kBAAC,GAAD;IAAY,SAAS;cAArB;KAAmC;KAEhC,GAAmB,sBAAA,KACa;KAChC,KACC,GAAmB,sBAAA,KAEjB,kBAAA,GAAA,EAAA,UAAA;MAAE;MACC,kBAAC,MAAD,EAAM,CAAA;MACN,EAA2B,EAAkB;MAC7C,EAAA,CAAA;KAEI;OACZ,KAAqB,EAAkB,UACtC,kBAAC,GAAD;IACE,IAAI,EACF,WAAW,QACZ;IACD,UAAU;IACV,OAAO;IACP,aAAa,EAAkB;IAC/B,SAAS;IACT,CAAA,CAEH,EAAA,CAAA;GAEL,CAAA;EACF,kBAAC,GAAD;GACE,eAAe;GACC;GAChB,CAAA;EACE,EAAA,CAAA;EAER"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"EntityViewMaskEditor.d.ts","sourceRoot":"","sources":["../../../src/components/EntityViewScopeEditor/EntityViewMaskEditor.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"EntityViewMaskEditor.d.ts","sourceRoot":"","sources":["../../../src/components/EntityViewScopeEditor/EntityViewMaskEditor.tsx"],"names":[],"mappings":"AAeA,MAAM,MAAM,yBAAyB,GAAG;IACtC,KAAK,EAAE,MAAM,CAAA;IACb,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAA;IAChC,QAAQ,CAAC,EAAE,OAAO,CAAA;CACnB,CAAA;AAUD,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,WAShD;AAED,MAAM,CAAC,OAAO,UAAU,oBAAoB,CAAC,KAAK,EAAE,yBAAyB,2CA0C5E"}
|
|
@@ -1,20 +1,21 @@
|
|
|
1
1
|
import { Alert as e, Checkbox as t, FormControlLabel as n, FormGroup as r, Typography as i } from "@mui/material";
|
|
2
2
|
import { Fragment as a, jsx as o, jsxs as s } from "react/jsx-runtime";
|
|
3
|
-
import { ENTITY_VIEW_TYPE_MASK_DATASET as c,
|
|
3
|
+
import { ENTITY_VIEW_TYPE_MASK_DATASET as c, ENTITY_VIEW_TYPE_MASK_DOCKER as l, ENTITY_VIEW_TYPE_MASK_FILE as u, ENTITY_VIEW_TYPE_MASK_FOLDER as d, ENTITY_VIEW_TYPE_MASK_TABLE as f } from "@sage-bionetworks/synapse-types";
|
|
4
4
|
//#region src/components/EntityViewScopeEditor/EntityViewMaskEditor.tsx
|
|
5
|
-
var
|
|
6
|
-
["Files",
|
|
7
|
-
["Folders",
|
|
8
|
-
["Tables",
|
|
9
|
-
["Datasets", c]
|
|
5
|
+
var p = [
|
|
6
|
+
["Files", u],
|
|
7
|
+
["Folders", d],
|
|
8
|
+
["Tables", f],
|
|
9
|
+
["Datasets", c],
|
|
10
|
+
["Docker Repositories", l]
|
|
10
11
|
];
|
|
11
|
-
function
|
|
12
|
-
return
|
|
12
|
+
function m(e) {
|
|
13
|
+
return p.forEach(([, t]) => {
|
|
13
14
|
(e & t) !== 0 && (e -= t);
|
|
14
15
|
}), e === 0;
|
|
15
16
|
}
|
|
16
|
-
function
|
|
17
|
-
let { value: l, onChange: u, disabled: d = !1 } = c,
|
|
17
|
+
function h(c) {
|
|
18
|
+
let { value: l, onChange: u, disabled: d = !1 } = c, f = !m(l);
|
|
18
19
|
return /* @__PURE__ */ s(a, { children: [
|
|
19
20
|
/* @__PURE__ */ o(i, {
|
|
20
21
|
variant: "body1",
|
|
@@ -27,17 +28,17 @@ function m(c) {
|
|
|
27
28
|
}),
|
|
28
29
|
/* @__PURE__ */ o(r, {
|
|
29
30
|
sx: { gap: 1 },
|
|
30
|
-
children:
|
|
31
|
+
children: p.map(([e, r]) => /* @__PURE__ */ o(n, {
|
|
31
32
|
control: /* @__PURE__ */ o(t, {}),
|
|
32
33
|
label: e,
|
|
33
34
|
checked: (l & r) > 0,
|
|
34
|
-
disabled:
|
|
35
|
+
disabled: f || d,
|
|
35
36
|
onChange: () => {
|
|
36
37
|
u(l ^ r);
|
|
37
38
|
}
|
|
38
39
|
}, e))
|
|
39
40
|
}),
|
|
40
|
-
|
|
41
|
+
f && /* @__PURE__ */ o(e, {
|
|
41
42
|
severity: "warning",
|
|
42
43
|
sx: { my: 2.25 },
|
|
43
44
|
children: "A custom mask is in use. Changes cannot be made in the UI."
|
|
@@ -45,6 +46,6 @@ function m(c) {
|
|
|
45
46
|
] });
|
|
46
47
|
}
|
|
47
48
|
//#endregion
|
|
48
|
-
export {
|
|
49
|
+
export { h as default, m as isMaskSupportedInUI };
|
|
49
50
|
|
|
50
51
|
//# sourceMappingURL=EntityViewMaskEditor.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"EntityViewMaskEditor.js","names":[],"sources":["../../../src/components/EntityViewScopeEditor/EntityViewMaskEditor.tsx"],"sourcesContent":["import {\n Alert,\n Checkbox,\n FormControlLabel,\n FormGroup,\n Typography,\n} from '@mui/material'\nimport {\n ENTITY_VIEW_TYPE_MASK_DATASET,\n ENTITY_VIEW_TYPE_MASK_FILE,\n ENTITY_VIEW_TYPE_MASK_FOLDER,\n ENTITY_VIEW_TYPE_MASK_TABLE,\n} from '@sage-bionetworks/synapse-types'\n\nexport type EntityViewMaskEditorProps = {\n value: number\n onChange: (mask: number) => void\n disabled?: boolean\n}\n\nconst maskLabelPairs: [string, number][] = [\n ['Files', ENTITY_VIEW_TYPE_MASK_FILE],\n ['Folders', ENTITY_VIEW_TYPE_MASK_FOLDER],\n ['Tables', ENTITY_VIEW_TYPE_MASK_TABLE],\n ['Datasets', ENTITY_VIEW_TYPE_MASK_DATASET],\n]\n\nexport function isMaskSupportedInUI(value: number) {\n maskLabelPairs.forEach(([, mask]) => {\n // Remove each supported bit\n if ((value & mask) !== 0) {\n value = value - mask\n }\n })\n // If value is not zero, then some unsupported bit remains\n return value === 0\n}\n\nexport default function EntityViewMaskEditor(props: EntityViewMaskEditorProps) {\n const { value, onChange, disabled = false } = props\n\n const customMaskInUse = !isMaskSupportedInUI(value)\n\n return (\n <>\n <Typography\n variant={'body1'}\n sx={{\n mt: 2.5,\n mb: 1.25,\n fontWeight: 700,\n }}\n >\n Include in View\n </Typography>\n <FormGroup sx={{ gap: 1 }}>\n {maskLabelPairs.map(([label, mask]) => (\n <FormControlLabel\n control={<Checkbox />}\n key={label}\n label={label}\n checked={\n // Checked if the mask bit is set\n (value & mask) > 0\n }\n disabled={customMaskInUse || disabled}\n onChange={() => {\n // Toggle the clicked mask value with XOR\n onChange(value ^ mask)\n }}\n />\n ))}\n </FormGroup>\n {customMaskInUse && (\n <Alert severity={'warning'} sx={{ my: 2.25 }}>\n A custom mask is in use. Changes cannot be made in the UI.\n </Alert>\n )}\n </>\n )\n}\n"],"mappings":";;;;
|
|
1
|
+
{"version":3,"file":"EntityViewMaskEditor.js","names":[],"sources":["../../../src/components/EntityViewScopeEditor/EntityViewMaskEditor.tsx"],"sourcesContent":["import {\n Alert,\n Checkbox,\n FormControlLabel,\n FormGroup,\n Typography,\n} from '@mui/material'\nimport {\n ENTITY_VIEW_TYPE_MASK_DATASET,\n ENTITY_VIEW_TYPE_MASK_FILE,\n ENTITY_VIEW_TYPE_MASK_FOLDER,\n ENTITY_VIEW_TYPE_MASK_TABLE,\n ENTITY_VIEW_TYPE_MASK_DOCKER,\n} from '@sage-bionetworks/synapse-types'\n\nexport type EntityViewMaskEditorProps = {\n value: number\n onChange: (mask: number) => void\n disabled?: boolean\n}\n\nconst maskLabelPairs: [string, number][] = [\n ['Files', ENTITY_VIEW_TYPE_MASK_FILE],\n ['Folders', ENTITY_VIEW_TYPE_MASK_FOLDER],\n ['Tables', ENTITY_VIEW_TYPE_MASK_TABLE],\n ['Datasets', ENTITY_VIEW_TYPE_MASK_DATASET],\n ['Docker Repositories', ENTITY_VIEW_TYPE_MASK_DOCKER],\n]\n\nexport function isMaskSupportedInUI(value: number) {\n maskLabelPairs.forEach(([, mask]) => {\n // Remove each supported bit\n if ((value & mask) !== 0) {\n value = value - mask\n }\n })\n // If value is not zero, then some unsupported bit remains\n return value === 0\n}\n\nexport default function EntityViewMaskEditor(props: EntityViewMaskEditorProps) {\n const { value, onChange, disabled = false } = props\n\n const customMaskInUse = !isMaskSupportedInUI(value)\n\n return (\n <>\n <Typography\n variant={'body1'}\n sx={{\n mt: 2.5,\n mb: 1.25,\n fontWeight: 700,\n }}\n >\n Include in View\n </Typography>\n <FormGroup sx={{ gap: 1 }}>\n {maskLabelPairs.map(([label, mask]) => (\n <FormControlLabel\n control={<Checkbox />}\n key={label}\n label={label}\n checked={\n // Checked if the mask bit is set\n (value & mask) > 0\n }\n disabled={customMaskInUse || disabled}\n onChange={() => {\n // Toggle the clicked mask value with XOR\n onChange(value ^ mask)\n }}\n />\n ))}\n </FormGroup>\n {customMaskInUse && (\n <Alert severity={'warning'} sx={{ my: 2.25 }}>\n A custom mask is in use. Changes cannot be made in the UI.\n </Alert>\n )}\n </>\n )\n}\n"],"mappings":";;;;AAqBA,IAAM,IAAqC;CACzC,CAAC,SAAS,EAA2B;CACrC,CAAC,WAAW,EAA6B;CACzC,CAAC,UAAU,EAA4B;CACvC,CAAC,YAAY,EAA8B;CAC3C,CAAC,uBAAuB,EAA6B;CACtD;AAED,SAAgB,EAAoB,GAAe;AAQjD,QAPA,EAAe,SAAS,GAAG,OAAU;AAEnC,GAAK,IAAQ,OAAU,MACrB,KAAgB;GAElB,EAEK,MAAU;;AAGnB,SAAwB,EAAqB,GAAkC;CAC7E,IAAM,EAAE,UAAO,aAAU,cAAW,OAAU,GAExC,IAAkB,CAAC,EAAoB,EAAM;AAEnD,QACE,kBAAA,GAAA,EAAA,UAAA;EACE,kBAAC,GAAD;GACE,SAAS;GACT,IAAI;IACF,IAAI;IACJ,IAAI;IACJ,YAAY;IACb;aACF;GAEY,CAAA;EACb,kBAAC,GAAD;GAAW,IAAI,EAAE,KAAK,GAAG;aACtB,EAAe,KAAK,CAAC,GAAO,OAC3B,kBAAC,GAAD;IACE,SAAS,kBAAC,GAAD,EAAY,CAAA;IAEd;IACP,UAEG,IAAQ,KAAQ;IAEnB,UAAU,KAAmB;IAC7B,gBAAgB;AAEd,OAAS,IAAQ,EAAK;;IAExB,EAXK,EAWL,CACF;GACQ,CAAA;EACX,KACC,kBAAC,GAAD;GAAO,UAAU;GAAW,IAAI,EAAE,IAAI,MAAM;aAAE;GAEtC,CAAA;EAET,EAAA,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ExperimentalMode.js","names":[],"sources":["../../../src/components/ExperimentalMode/ExperimentalMode.tsx"],"sourcesContent":["import { isInSynapseExperimentalMode } from '@/synapse-client/SynapseClient'\nimport { EXPERIMENTAL_MODE_COOKIE } from '@/utils/SynapseConstants'\nimport { InfoOutlined } from '@mui/icons-material'\nimport { Box, IconButton, Tooltip, Typography, useTheme } from '@mui/material'\nimport { useEffect, useState } from 'react'\nimport Switch from 'react-switch'\nimport UniversalCookies from 'universal-cookie'\n\nconst EXPERIMENTAL_MODE_SWITCH_ID = 'experimental-mode'\nconst experimentalModeText =\n 'This mode gives you early access to features that are still in development. Please note that we do not guarantee an absence of errors, and that the data created using these features may be lost during product upgrade.'\n\nexport type ExperimentalModeProps = {\n onExperimentalModeToggle?: (newValue: boolean) => void\n}\nfunction ExperimentalMode({ onExperimentalModeToggle }: ExperimentalModeProps) {\n const [isExperimentalModeOn, setIsExperimentalModeOn] =\n useState<boolean>(false)\n let mounted = true\n const theme = useTheme()\n useEffect(() => {\n if (mounted) {\n if (isInSynapseExperimentalMode()) {\n setIsExperimentalModeOn(true)\n }\n }\n return () => {\n mounted = false\n }\n }, [])\n\n const getExperimentalModeCookieOptions = () => {\n const hostname = window.location.hostname.toLowerCase()\n return {\n path: '/',\n domain: hostname.endsWith('.synapse.org') ? 'synapse.org' : undefined,\n }\n }\n\n const createExperimentalModeCookie = () => {\n const cookies = new UniversalCookies()\n cookies.set(\n EXPERIMENTAL_MODE_COOKIE,\n 'true',\n getExperimentalModeCookieOptions(),\n )\n setIsExperimentalModeOn(true)\n if (onExperimentalModeToggle) {\n onExperimentalModeToggle(true)\n }\n }\n\n const deleteExperimentalModeCookie = () => {\n const cookies = new UniversalCookies()\n cookies.remove(EXPERIMENTAL_MODE_COOKIE, getExperimentalModeCookieOptions())\n setIsExperimentalModeOn(false)\n if (onExperimentalModeToggle) {\n onExperimentalModeToggle(false)\n }\n }\n\n return (\n <Box sx={{ display: 'flex', alignItems: 'center' }}>\n <Typography\n component={'label'}\n variant=\"body1\"\n htmlFor={EXPERIMENTAL_MODE_SWITCH_ID}\n >\n Experimental Mode\n </Typography>\n <Tooltip title={experimentalModeText} arrow placement=\"top\">\n <IconButton\n aria-label=\"info\"\n color=\"inherit\"\n sx={{ '&:hover': { backgroundColor: 'transparent' } }}\n >\n <InfoOutlined sx={{ verticalAlign: 'middle' }} />\n </IconButton>\n </Tooltip>\n <Switch\n id={EXPERIMENTAL_MODE_SWITCH_ID}\n width={35}\n height={20}\n onColor={theme.palette.secondary.main}\n checkedIcon={false}\n uncheckedIcon={false}\n checked={isExperimentalModeOn}\n onChange={\n isExperimentalModeOn\n ? deleteExperimentalModeCookie\n : createExperimentalModeCookie\n }\n />\n </Box>\n )\n}\n\nexport default ExperimentalMode\n"],"mappings":";;;;;;;;;AAQA,IAAM,IAA8B,qBAC9B,IACJ;AAKF,SAAS,EAAiB,EAAE,+BAAmD;CAC7E,IAAM,CAAC,GAAsB,KAC3B,EAAkB,GAAM,EACtB,IAAU,IACR,IAAQ,GAAU;AACxB,UACM,KACE,GAA6B,IAC/B,EAAwB,GAAK,QAGpB;AACX,MAAU;KAEX,EAAE,CAAC;CAEN,IAAM,WAEG;EACL,MAAM;EACN,QAHe,OAAO,SAAS,SAAS,
|
|
1
|
+
{"version":3,"file":"ExperimentalMode.js","names":[],"sources":["../../../src/components/ExperimentalMode/ExperimentalMode.tsx"],"sourcesContent":["import { isInSynapseExperimentalMode } from '@/synapse-client/SynapseClient'\nimport { EXPERIMENTAL_MODE_COOKIE } from '@/utils/SynapseConstants'\nimport { InfoOutlined } from '@mui/icons-material'\nimport { Box, IconButton, Tooltip, Typography, useTheme } from '@mui/material'\nimport { useEffect, useState } from 'react'\nimport Switch from 'react-switch'\nimport UniversalCookies from 'universal-cookie'\n\nconst EXPERIMENTAL_MODE_SWITCH_ID = 'experimental-mode'\nconst experimentalModeText =\n 'This mode gives you early access to features that are still in development. Please note that we do not guarantee an absence of errors, and that the data created using these features may be lost during product upgrade.'\n\nexport type ExperimentalModeProps = {\n onExperimentalModeToggle?: (newValue: boolean) => void\n}\nfunction ExperimentalMode({ onExperimentalModeToggle }: ExperimentalModeProps) {\n const [isExperimentalModeOn, setIsExperimentalModeOn] =\n useState<boolean>(false)\n let mounted = true\n const theme = useTheme()\n useEffect(() => {\n if (mounted) {\n if (isInSynapseExperimentalMode()) {\n setIsExperimentalModeOn(true)\n }\n }\n return () => {\n mounted = false\n }\n }, [])\n\n const getExperimentalModeCookieOptions = () => {\n const hostname = window.location.hostname.toLowerCase()\n return {\n path: '/',\n domain: hostname.endsWith('.synapse.org') ? 'synapse.org' : undefined,\n }\n }\n\n const createExperimentalModeCookie = () => {\n const cookies = new UniversalCookies()\n cookies.set(\n EXPERIMENTAL_MODE_COOKIE,\n 'true',\n getExperimentalModeCookieOptions(),\n )\n setIsExperimentalModeOn(true)\n if (onExperimentalModeToggle) {\n onExperimentalModeToggle(true)\n }\n }\n\n const deleteExperimentalModeCookie = () => {\n const cookies = new UniversalCookies()\n cookies.remove(EXPERIMENTAL_MODE_COOKIE, getExperimentalModeCookieOptions())\n setIsExperimentalModeOn(false)\n if (onExperimentalModeToggle) {\n onExperimentalModeToggle(false)\n }\n }\n\n return (\n <Box sx={{ display: 'flex', alignItems: 'center' }}>\n <Typography\n component={'label'}\n variant=\"body1\"\n htmlFor={EXPERIMENTAL_MODE_SWITCH_ID}\n >\n Experimental Mode\n </Typography>\n <Tooltip title={experimentalModeText} arrow placement=\"top\">\n <IconButton\n aria-label=\"info\"\n color=\"inherit\"\n sx={{ '&:hover': { backgroundColor: 'transparent' } }}\n >\n <InfoOutlined sx={{ verticalAlign: 'middle' }} />\n </IconButton>\n </Tooltip>\n <Switch\n id={EXPERIMENTAL_MODE_SWITCH_ID}\n width={35}\n height={20}\n onColor={theme.palette.secondary.main}\n checkedIcon={false}\n uncheckedIcon={false}\n checked={isExperimentalModeOn}\n onChange={\n isExperimentalModeOn\n ? deleteExperimentalModeCookie\n : createExperimentalModeCookie\n }\n />\n </Box>\n )\n}\n\nexport default ExperimentalMode\n"],"mappings":";;;;;;;;;AAQA,IAAM,IAA8B,qBAC9B,IACJ;AAKF,SAAS,EAAiB,EAAE,+BAAmD;CAC7E,IAAM,CAAC,GAAsB,KAC3B,EAAkB,GAAM,EACtB,IAAU,IACR,IAAQ,GAAU;AACxB,UACM,KACE,GAA6B,IAC/B,EAAwB,GAAK,QAGpB;AACX,MAAU;KAEX,EAAE,CAAC;CAEN,IAAM,WAEG;EACL,MAAM;EACN,QAHe,OAAO,SAAS,SAAS,aAGhC,CAAS,SAAS,eAAe,GAAG,gBAAgB,KAAA;EAC7D;AAyBH,QACE,kBAAC,GAAD;EAAK,IAAI;GAAE,SAAS;GAAQ,YAAY;GAAU;YAAlD;GACE,kBAAC,GAAD;IACE,WAAW;IACX,SAAQ;IACR,SAAS;cACV;IAEY,CAAA;GACb,kBAAC,GAAD;IAAS,OAAO;IAAsB,OAAA;IAAM,WAAU;cACpD,kBAAC,GAAD;KACE,cAAW;KACX,OAAM;KACN,IAAI,EAAE,WAAW,EAAE,iBAAiB,eAAe,EAAE;eAErD,kBAAC,GAAD,EAAc,IAAI,EAAE,eAAe,UAAU,EAAI,CAAA;KACtC,CAAA;IACL,CAAA;GACV,kBAAC,GAAD;IACE,IAAI;IACJ,OAAO;IACP,QAAQ;IACR,SAAS,EAAM,QAAQ,UAAU;IACjC,aAAa;IACb,eAAe;IACf,SAAS;IACT,UACE,UApCmC;AAIzC,KAFA,IADoB,GACpB,CAAQ,OAAO,GAA0B,GAAkC,CAAC,EAC5E,EAAwB,GAAM,EAC1B,KACF,EAAyB,GAAM;cAlBQ;AAQzC,KANA,IADoB,GACpB,CAAQ,IACN,GACA,QACA,GAAkC,CACnC,EACD,EAAwB,GAAK,EACzB,KACF,EAAyB,GAAK;;IA4C5B,CAAA;GACE"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ExternalFileHandleLink.js","names":[],"sources":["../../../src/components/ExternalFileHandleLink/ExternalFileHandleLink.tsx"],"sourcesContent":["import React from 'react'\nimport SynapseClient from '@/synapse-client'\nimport { useSynapseContext } from '@/utils/context/SynapseContext'\nimport { isExternalFileHandle, isFileEntity } from '@/utils/types/IsType'\nimport { OpenInNewTwoTone } from '@mui/icons-material'\nimport {\n BatchFileRequest,\n ExternalFileHandle,\n FileEntity,\n FileHandleAssociateType,\n} from '@sage-bionetworks/synapse-types'\nimport { useEffect, useState } from 'react'\n\nexport type ExternalFileHandleLinkProps = {\n synId: string\n className?: string\n}\n\nexport const ExternalFileHandleLink = (\n props: ExternalFileHandleLinkProps,\n): React.ReactNode => {\n const { accessToken } = useSynapseContext()\n const { synId, className } = props\n const [data, setData] = useState<\n | { fileEntity: FileEntity; externalFileHandle: ExternalFileHandle }\n | undefined\n >(undefined)\n useEffect(() => {\n const getEntity = async () => {\n try {\n const fileEntity = await SynapseClient.getEntity<FileEntity>(\n accessToken,\n synId,\n )\n if (!isFileEntity(fileEntity)) {\n throw new Error(`File Entity expected but found ${fileEntity}`)\n }\n const batchFileRequest: BatchFileRequest = {\n requestedFiles: [\n {\n associateObjectId: synId,\n associateObjectType: FileHandleAssociateType.FileEntity,\n fileHandleId: fileEntity.dataFileHandleId,\n },\n ],\n includeFileHandles: true,\n includePreSignedURLs: false,\n includePreviewPreSignedURLs: false,\n }\n const file = await SynapseClient.getFiles(batchFileRequest, accessToken)\n const externalFileHandle = file.requestedFiles[0].fileHandle\n if (externalFileHandle && isExternalFileHandle(externalFileHandle)) {\n setData({\n externalFileHandle,\n fileEntity,\n })\n } else {\n throw new Error(\n `Not an external file handle: ${externalFileHandle?.id}`,\n )\n }\n } catch (e) {\n console.error('Error on getting external file handle = ', e)\n }\n }\n getEntity()\n }, [synId, accessToken])\n\n const externalFileHandle = data?.externalFileHandle\n const fileEntity = data?.fileEntity\n\n return externalFileHandle ? (\n <a\n href={externalFileHandle.externalURL}\n className={className}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n <span>\n {fileEntity?.name}\n <OpenInNewTwoTone style={{ marginLeft: 5 }} />\n </span>\n </a>\n ) : (\n <></>\n )\n}\n"],"mappings":";;;;;;;;AAkBA,IAAa,KACX,MACoB;CACpB,IAAM,EAAE,mBAAgB,GAAmB,EACrC,EAAE,UAAO,iBAAc,GACvB,CAAC,GAAM,KAAW,EAGtB,KAAA,EAAU;AACZ,SAAgB;AAsCd,
|
|
1
|
+
{"version":3,"file":"ExternalFileHandleLink.js","names":[],"sources":["../../../src/components/ExternalFileHandleLink/ExternalFileHandleLink.tsx"],"sourcesContent":["import React from 'react'\nimport SynapseClient from '@/synapse-client'\nimport { useSynapseContext } from '@/utils/context/SynapseContext'\nimport { isExternalFileHandle, isFileEntity } from '@/utils/types/IsType'\nimport { OpenInNewTwoTone } from '@mui/icons-material'\nimport {\n BatchFileRequest,\n ExternalFileHandle,\n FileEntity,\n FileHandleAssociateType,\n} from '@sage-bionetworks/synapse-types'\nimport { useEffect, useState } from 'react'\n\nexport type ExternalFileHandleLinkProps = {\n synId: string\n className?: string\n}\n\nexport const ExternalFileHandleLink = (\n props: ExternalFileHandleLinkProps,\n): React.ReactNode => {\n const { accessToken } = useSynapseContext()\n const { synId, className } = props\n const [data, setData] = useState<\n | { fileEntity: FileEntity; externalFileHandle: ExternalFileHandle }\n | undefined\n >(undefined)\n useEffect(() => {\n const getEntity = async () => {\n try {\n const fileEntity = await SynapseClient.getEntity<FileEntity>(\n accessToken,\n synId,\n )\n if (!isFileEntity(fileEntity)) {\n throw new Error(`File Entity expected but found ${fileEntity}`)\n }\n const batchFileRequest: BatchFileRequest = {\n requestedFiles: [\n {\n associateObjectId: synId,\n associateObjectType: FileHandleAssociateType.FileEntity,\n fileHandleId: fileEntity.dataFileHandleId,\n },\n ],\n includeFileHandles: true,\n includePreSignedURLs: false,\n includePreviewPreSignedURLs: false,\n }\n const file = await SynapseClient.getFiles(batchFileRequest, accessToken)\n const externalFileHandle = file.requestedFiles[0].fileHandle\n if (externalFileHandle && isExternalFileHandle(externalFileHandle)) {\n setData({\n externalFileHandle,\n fileEntity,\n })\n } else {\n throw new Error(\n `Not an external file handle: ${externalFileHandle?.id}`,\n )\n }\n } catch (e) {\n console.error('Error on getting external file handle = ', e)\n }\n }\n getEntity()\n }, [synId, accessToken])\n\n const externalFileHandle = data?.externalFileHandle\n const fileEntity = data?.fileEntity\n\n return externalFileHandle ? (\n <a\n href={externalFileHandle.externalURL}\n className={className}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n <span>\n {fileEntity?.name}\n <OpenInNewTwoTone style={{ marginLeft: 5 }} />\n </span>\n </a>\n ) : (\n <></>\n )\n}\n"],"mappings":";;;;;;;;AAkBA,IAAa,KACX,MACoB;CACpB,IAAM,EAAE,mBAAgB,GAAmB,EACrC,EAAE,UAAO,iBAAc,GACvB,CAAC,GAAM,KAAW,EAGtB,KAAA,EAAU;AACZ,SAAgB;AAsCd,eArC8B;AAC5B,OAAI;IACF,IAAM,IAAa,MAAM,EAAc,UACrC,GACA,EACD;AACD,QAAI,CAAC,EAAa,EAAW,CAC3B,OAAU,MAAM,kCAAkC,IAAa;IAEjE,IAAM,IAAqC;KACzC,gBAAgB,CACd;MACE,mBAAmB;MACnB,qBAAqB,EAAwB;MAC7C,cAAc,EAAW;MAC1B,CACF;KACD,oBAAoB;KACpB,sBAAsB;KACtB,6BAA6B;KAC9B,EAEK,KAAqB,MADR,EAAc,SAAS,GAAkB,EAAY,EACxC,eAAe,GAAG;AAClD,QAAI,KAAsB,EAAqB,EAAmB,CAChE,GAAQ;KACN;KACA;KACD,CAAC;QAEF,OAAU,MACR,gCAAgC,GAAoB,KACrD;YAEI,GAAG;AACV,YAAQ,MAAM,4CAA4C,EAAE;;MAGrD;IACV,CAAC,GAAO,EAAY,CAAC;CAExB,IAAM,IAAqB,GAAM,oBAC3B,IAAa,GAAM;AAEzB,QAAO,IACL,kBAAC,KAAD;EACE,MAAM,EAAmB;EACd;EACX,QAAO;EACP,KAAI;YAEJ,kBAAC,QAAD,EAAA,UAAA,CACG,GAAY,MACb,kBAAC,GAAD,EAAkB,OAAO,EAAE,YAAY,GAAG,EAAI,CAAA,CACzC,EAAA,CAAA;EACL,CAAA,GAEJ,kBAAA,GAAA,EAAK,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FacetPlotsCard.js","names":[],"sources":["../../../src/components/FeaturedDataTabs/FacetPlotsCard.tsx"],"sourcesContent":["import { useSynapseContext } from '@/utils/context/SynapseContext'\nimport {\n Box,\n Button,\n Divider,\n Paper,\n Skeleton,\n Typography,\n} from '@mui/material'\nimport {\n ColumnTypeEnum,\n FacetColumnResult,\n FacetColumnResultValueCount,\n FacetColumnResultValues,\n} from '@sage-bionetworks/synapse-types'\nimport { useSuspenseQuery } from '@tanstack/react-query'\nimport { times } from 'lodash-es'\nimport Plotly from 'plotly.js-basic-dist'\nimport { Fragment, Suspense, useMemo } from 'react'\nimport Plot from '../Plot/Plot'\nimport { useQueryVisualizationContext } from '../QueryVisualizationWrapper'\nimport { useSuspenseGetQueryMetadata } from '../QueryWrapper/useGetQueryMetadata'\nimport { ShowMore } from '../row_renderers/utils'\nimport { SkeletonParagraph, SkeletonTable } from '../Skeleton'\nimport {\n extractPlotDataArray,\n getPlotStyle,\n PlotType,\n} from '../widgets/facet-nav/FacetNavPanel'\nimport { FacetPlotLegendTable } from '../widgets/facet-nav/FacetPlotLegendTable'\nimport { getFacets } from '../widgets/facet-nav/useFacetPlots'\nimport {\n FACET_PLOTS_CARD_CLASSNAME,\n FACET_PLOTS_CARD_PLOT_CONTAINER_CLASSNAME,\n FACET_PLOTS_CARD_TITLE_CONTAINER_CLASSNAME,\n FacetPlotsCardPlotContainer,\n FacetPlotsCardTitleContainer,\n} from './FacetPlotsCardGrid'\nimport { useMeasure } from '@react-hookz/web'\n\nexport type FacetPlotsCardProps = {\n title?: string\n description?: string\n facetsToPlot?: string[]\n detailsPagePath?: string\n plotType?: PlotType\n}\n\nconst layout: Partial<Plotly.Layout> = {\n showlegend: false,\n annotations: [],\n margin: { l: 0, r: 0, b: 0, t: 0, pad: 0 },\n yaxis: {\n visible: false,\n showgrid: false,\n },\n xaxis: {\n visible: false,\n showgrid: false,\n },\n}\n\nfunction LoadingCard(props: { numPlots: number }) {\n const { numPlots } = props\n return (\n <Paper className={FACET_PLOTS_CARD_CLASSNAME}>\n <FacetPlotsCardTitleContainer\n className={FACET_PLOTS_CARD_TITLE_CONTAINER_CLASSNAME}\n >\n <Skeleton width={'60%'} height={'24px'} />\n\n <SkeletonParagraph numRows={5} />\n\n <Skeleton width={'40%'}>\n <Button variant={'contained'}>Explore</Button>\n </Skeleton>\n </FacetPlotsCardTitleContainer>\n {times(numPlots).map(index => (\n <FacetPlotsCardPlotContainer\n key={index}\n className={FACET_PLOTS_CARD_PLOT_CONTAINER_CLASSNAME}\n sx={{\n py: 3,\n gridRow: `plot${index}`,\n }}\n >\n <Skeleton width={'100%'} height={'300px'} />\n <SkeletonTable numRows={4} numCols={2} />\n </FacetPlotsCardPlotContainer>\n ))}\n </Paper>\n )\n}\n\nfunction FacetPlotsCard(props: FacetPlotsCardProps) {\n const {\n title,\n description,\n facetsToPlot,\n detailsPagePath,\n plotType = 'PIE',\n } = props\n const { accessToken } = useSynapseContext()\n const { data: queryMetadata } = useSuspenseGetQueryMetadata()\n const { getColumnDisplayName } = useQueryVisualizationContext()\n const [plotContainerMeasurements, plotContainerRef] = useMeasure()\n\n const facetDataArray = useMemo(() => {\n if (!facetsToPlot) {\n return []\n }\n\n return getFacets(queryMetadata, facetsToPlot)\n }, [facetsToPlot, queryMetadata])\n\n const currentLayout: Partial<Plotly.Layout> = useMemo(() => {\n return {\n ...layout,\n barmode: plotType === 'STACKED_HORIZONTAL_BAR' ? 'stack' : undefined,\n }\n }, [plotType])\n const maxPlotHeight = plotType === 'STACKED_HORIZONTAL_BAR' ? 50 : 150\n const { data: facetPlotDataArray } = useSuspenseQuery({\n queryKey: ['facetPlotDataArray', facetsToPlot, facetDataArray],\n queryFn: async () => {\n if (!facetsToPlot) {\n return []\n }\n\n const getColumnType = (\n facetToPlot: FacetColumnResult,\n ): ColumnTypeEnum | undefined =>\n queryMetadata.columnModels!.find(\n columnModel => columnModel.name === facetToPlot.columnName,\n )?.columnType as ColumnTypeEnum\n\n return Promise.all(\n facetDataArray.map(async (item, index) => {\n const plotData = await extractPlotDataArray(\n item as FacetColumnResultValues,\n getColumnType(item),\n index + 1, //individual plot rgbIndex\n plotType,\n accessToken,\n )\n return plotData\n }),\n )\n },\n })\n\n const selectedFacetValue = useMemo(() => {\n if (!facetsToPlot) {\n return ''\n }\n\n // If we are showing a facet selection based card, then set the selectedFacetValue. For example, facet column \"study\" with value \"ROSMAP\"\n const selectedFacet: FacetColumnResultValueCount | undefined = queryMetadata\n ?.facets!.map(item => {\n const facetValues: FacetColumnResultValueCount[] = (\n item as FacetColumnResultValues\n ).facetValues\n if (facetValues) {\n const filteredFacetValues: FacetColumnResultValueCount[] =\n facetValues.filter(facetValue => {\n return facetValue.isSelected\n })\n return filteredFacetValues.length > 0\n ? filteredFacetValues[0]\n : undefined\n } else {\n return undefined\n }\n })\n .filter(x => x !== undefined)[0]\n\n if (selectedFacet && selectedFacet.value) {\n return selectedFacet?.value\n }\n return ''\n }, [facetsToPlot, queryMetadata?.facets])\n\n const isShowingMultiplePlots = facetPlotDataArray.length > 1\n const cardTitle =\n title ??\n (isShowingMultiplePlots\n ? selectedFacetValue\n : getColumnDisplayName(facetDataArray[0].columnName))\n return (\n <Paper className={FACET_PLOTS_CARD_CLASSNAME} sx={{ overflow: 'hidden' }}>\n <FacetPlotsCardTitleContainer\n className={FACET_PLOTS_CARD_TITLE_CONTAINER_CLASSNAME}\n >\n <Typography variant={'headline1'}>{cardTitle}</Typography>\n {description && (\n <Typography variant={'body1'} sx={{ color: 'grey.700', my: 2 }}>\n <ShowMore summary={description} maxCharacterCount={200} />\n </Typography>\n )}\n\n {detailsPagePath && selectedFacetValue && (\n <Box sx={{ my: 2 }}>\n <Button\n variant={'contained'}\n href={detailsPagePath}\n color={'secondary'}\n sx={theme => ({\n [theme.breakpoints.down('sm')]: { width: '100%' },\n })}\n >\n Explore {selectedFacetValue}\n </Button>\n </Box>\n )}\n </FacetPlotsCardTitleContainer>\n\n {/* create a plot for every facet to be plotted */}\n {facetPlotDataArray.map((plotData, index) => {\n return (\n <Fragment key={index}>\n <FacetPlotsCardPlotContainer\n className={FACET_PLOTS_CARD_PLOT_CONTAINER_CLASSNAME}\n sx={{\n pt: index === 0 ? 5 : 0,\n gridRow: `plot${index}`,\n }}\n key={index}\n >\n {index != 0 && <Divider sx={{ mt: 2, mb: 4 }} />}\n <Box sx={{ minHeight: '130px' }}>\n <Box\n ref={plotContainerRef}\n sx={{\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'center',\n }}\n >\n <Plot\n key={`${facetsToPlot![index]}-${\n plotContainerMeasurements?.width\n }`}\n layout={currentLayout}\n data={plotData?.data ?? []}\n style={getPlotStyle(\n plotContainerMeasurements?.width,\n plotType,\n maxPlotHeight,\n )}\n config={{ displayModeBar: false }}\n />\n </Box>\n <Box sx={{ mt: 4, width: '100%' }}>\n <FacetPlotLegendTable\n facetName={getColumnDisplayName(\n facetDataArray[index].columnName,\n )}\n labels={plotData?.labels}\n colors={plotData?.colors}\n isExpanded={false}\n linkToFullQuery={detailsPagePath}\n />\n </Box>\n </Box>\n </FacetPlotsCardPlotContainer>\n </Fragment>\n )\n })}\n </Paper>\n )\n}\n\nexport default function FacetPlotsCardWithSuspense(props: FacetPlotsCardProps) {\n return (\n <Suspense\n fallback={<LoadingCard numPlots={(props.facetsToPlot ?? []).length} />}\n >\n <FacetPlotsCard {...props} />\n </Suspense>\n )\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"FacetPlotsCard.js","names":[],"sources":["../../../src/components/FeaturedDataTabs/FacetPlotsCard.tsx"],"sourcesContent":["import { useSynapseContext } from '@/utils/context/SynapseContext'\nimport {\n Box,\n Button,\n Divider,\n Paper,\n Skeleton,\n Typography,\n} from '@mui/material'\nimport {\n ColumnTypeEnum,\n FacetColumnResult,\n FacetColumnResultValueCount,\n FacetColumnResultValues,\n} from '@sage-bionetworks/synapse-types'\nimport { useSuspenseQuery } from '@tanstack/react-query'\nimport { times } from 'lodash-es'\nimport Plotly from 'plotly.js-basic-dist'\nimport { Fragment, Suspense, useMemo } from 'react'\nimport Plot from '../Plot/Plot'\nimport { useQueryVisualizationContext } from '../QueryVisualizationWrapper'\nimport { useSuspenseGetQueryMetadata } from '../QueryWrapper/useGetQueryMetadata'\nimport { ShowMore } from '../row_renderers/utils'\nimport { SkeletonParagraph, SkeletonTable } from '../Skeleton'\nimport {\n extractPlotDataArray,\n getPlotStyle,\n PlotType,\n} from '../widgets/facet-nav/FacetNavPanel'\nimport { FacetPlotLegendTable } from '../widgets/facet-nav/FacetPlotLegendTable'\nimport { getFacets } from '../widgets/facet-nav/useFacetPlots'\nimport {\n FACET_PLOTS_CARD_CLASSNAME,\n FACET_PLOTS_CARD_PLOT_CONTAINER_CLASSNAME,\n FACET_PLOTS_CARD_TITLE_CONTAINER_CLASSNAME,\n FacetPlotsCardPlotContainer,\n FacetPlotsCardTitleContainer,\n} from './FacetPlotsCardGrid'\nimport { useMeasure } from '@react-hookz/web'\n\nexport type FacetPlotsCardProps = {\n title?: string\n description?: string\n facetsToPlot?: string[]\n detailsPagePath?: string\n plotType?: PlotType\n}\n\nconst layout: Partial<Plotly.Layout> = {\n showlegend: false,\n annotations: [],\n margin: { l: 0, r: 0, b: 0, t: 0, pad: 0 },\n yaxis: {\n visible: false,\n showgrid: false,\n },\n xaxis: {\n visible: false,\n showgrid: false,\n },\n}\n\nfunction LoadingCard(props: { numPlots: number }) {\n const { numPlots } = props\n return (\n <Paper className={FACET_PLOTS_CARD_CLASSNAME}>\n <FacetPlotsCardTitleContainer\n className={FACET_PLOTS_CARD_TITLE_CONTAINER_CLASSNAME}\n >\n <Skeleton width={'60%'} height={'24px'} />\n\n <SkeletonParagraph numRows={5} />\n\n <Skeleton width={'40%'}>\n <Button variant={'contained'}>Explore</Button>\n </Skeleton>\n </FacetPlotsCardTitleContainer>\n {times(numPlots).map(index => (\n <FacetPlotsCardPlotContainer\n key={index}\n className={FACET_PLOTS_CARD_PLOT_CONTAINER_CLASSNAME}\n sx={{\n py: 3,\n gridRow: `plot${index}`,\n }}\n >\n <Skeleton width={'100%'} height={'300px'} />\n <SkeletonTable numRows={4} numCols={2} />\n </FacetPlotsCardPlotContainer>\n ))}\n </Paper>\n )\n}\n\nfunction FacetPlotsCard(props: FacetPlotsCardProps) {\n const {\n title,\n description,\n facetsToPlot,\n detailsPagePath,\n plotType = 'PIE',\n } = props\n const { accessToken } = useSynapseContext()\n const { data: queryMetadata } = useSuspenseGetQueryMetadata()\n const { getColumnDisplayName } = useQueryVisualizationContext()\n const [plotContainerMeasurements, plotContainerRef] = useMeasure()\n\n const facetDataArray = useMemo(() => {\n if (!facetsToPlot) {\n return []\n }\n\n return getFacets(queryMetadata, facetsToPlot)\n }, [facetsToPlot, queryMetadata])\n\n const currentLayout: Partial<Plotly.Layout> = useMemo(() => {\n return {\n ...layout,\n barmode: plotType === 'STACKED_HORIZONTAL_BAR' ? 'stack' : undefined,\n }\n }, [plotType])\n const maxPlotHeight = plotType === 'STACKED_HORIZONTAL_BAR' ? 50 : 150\n const { data: facetPlotDataArray } = useSuspenseQuery({\n queryKey: ['facetPlotDataArray', facetsToPlot, facetDataArray],\n queryFn: async () => {\n if (!facetsToPlot) {\n return []\n }\n\n const getColumnType = (\n facetToPlot: FacetColumnResult,\n ): ColumnTypeEnum | undefined =>\n queryMetadata.columnModels!.find(\n columnModel => columnModel.name === facetToPlot.columnName,\n )?.columnType as ColumnTypeEnum\n\n return Promise.all(\n facetDataArray.map(async (item, index) => {\n const plotData = await extractPlotDataArray(\n item as FacetColumnResultValues,\n getColumnType(item),\n index + 1, //individual plot rgbIndex\n plotType,\n accessToken,\n )\n return plotData\n }),\n )\n },\n })\n\n const selectedFacetValue = useMemo(() => {\n if (!facetsToPlot) {\n return ''\n }\n\n // If we are showing a facet selection based card, then set the selectedFacetValue. For example, facet column \"study\" with value \"ROSMAP\"\n const selectedFacet: FacetColumnResultValueCount | undefined = queryMetadata\n ?.facets!.map(item => {\n const facetValues: FacetColumnResultValueCount[] = (\n item as FacetColumnResultValues\n ).facetValues\n if (facetValues) {\n const filteredFacetValues: FacetColumnResultValueCount[] =\n facetValues.filter(facetValue => {\n return facetValue.isSelected\n })\n return filteredFacetValues.length > 0\n ? filteredFacetValues[0]\n : undefined\n } else {\n return undefined\n }\n })\n .filter(x => x !== undefined)[0]\n\n if (selectedFacet && selectedFacet.value) {\n return selectedFacet?.value\n }\n return ''\n }, [facetsToPlot, queryMetadata?.facets])\n\n const isShowingMultiplePlots = facetPlotDataArray.length > 1\n const cardTitle =\n title ??\n (isShowingMultiplePlots\n ? selectedFacetValue\n : getColumnDisplayName(facetDataArray[0].columnName))\n return (\n <Paper className={FACET_PLOTS_CARD_CLASSNAME} sx={{ overflow: 'hidden' }}>\n <FacetPlotsCardTitleContainer\n className={FACET_PLOTS_CARD_TITLE_CONTAINER_CLASSNAME}\n >\n <Typography variant={'headline1'}>{cardTitle}</Typography>\n {description && (\n <Typography variant={'body1'} sx={{ color: 'grey.700', my: 2 }}>\n <ShowMore summary={description} maxCharacterCount={200} />\n </Typography>\n )}\n\n {detailsPagePath && selectedFacetValue && (\n <Box sx={{ my: 2 }}>\n <Button\n variant={'contained'}\n href={detailsPagePath}\n color={'secondary'}\n sx={theme => ({\n [theme.breakpoints.down('sm')]: { width: '100%' },\n })}\n >\n Explore {selectedFacetValue}\n </Button>\n </Box>\n )}\n </FacetPlotsCardTitleContainer>\n\n {/* create a plot for every facet to be plotted */}\n {facetPlotDataArray.map((plotData, index) => {\n return (\n <Fragment key={index}>\n <FacetPlotsCardPlotContainer\n className={FACET_PLOTS_CARD_PLOT_CONTAINER_CLASSNAME}\n sx={{\n pt: index === 0 ? 5 : 0,\n gridRow: `plot${index}`,\n }}\n key={index}\n >\n {index != 0 && <Divider sx={{ mt: 2, mb: 4 }} />}\n <Box sx={{ minHeight: '130px' }}>\n <Box\n ref={plotContainerRef}\n sx={{\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'center',\n }}\n >\n <Plot\n key={`${facetsToPlot![index]}-${\n plotContainerMeasurements?.width\n }`}\n layout={currentLayout}\n data={plotData?.data ?? []}\n style={getPlotStyle(\n plotContainerMeasurements?.width,\n plotType,\n maxPlotHeight,\n )}\n config={{ displayModeBar: false }}\n />\n </Box>\n <Box sx={{ mt: 4, width: '100%' }}>\n <FacetPlotLegendTable\n facetName={getColumnDisplayName(\n facetDataArray[index].columnName,\n )}\n labels={plotData?.labels}\n colors={plotData?.colors}\n isExpanded={false}\n linkToFullQuery={detailsPagePath}\n />\n </Box>\n </Box>\n </FacetPlotsCardPlotContainer>\n </Fragment>\n )\n })}\n </Paper>\n )\n}\n\nexport default function FacetPlotsCardWithSuspense(props: FacetPlotsCardProps) {\n return (\n <Suspense\n fallback={<LoadingCard numPlots={(props.facetsToPlot ?? []).length} />}\n >\n <FacetPlotsCard {...props} />\n </Suspense>\n )\n}\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"QueryPerFacetPlotsCard.js","names":[],"sources":["../../../src/components/FeaturedDataTabs/QueryPerFacetPlotsCard.tsx"],"sourcesContent":["import { SynapseConstants } from '@/utils'\nimport { parseEntityIdFromSqlStatement } from '@/utils/functions'\nimport { DEFAULT_PAGE_SIZE } from '@/utils/SynapseConstants'\nimport { QueryBundleRequest } from '@sage-bionetworks/synapse-types'\nimport {\n QueryVisualizationContextType,\n QueryVisualizationWrapper,\n} from '../QueryVisualizationWrapper'\nimport { QueryWrapper } from '../QueryWrapper'\nimport { QueryWrapperErrorBoundary } from '../QueryWrapperErrorBoundary'\nimport FacetPlotsCard, { FacetPlotsCardProps } from './FacetPlotsCard'\n\nexport type QueryPerFacetPlotsCardProps = {\n title?: string\n description?: string\n rgbIndex?: number\n facetsToPlot?: string[]\n selectFacetColumnName: string\n selectFacetColumnValue: string\n sql?: string\n detailsPagePath: string\n} & Pick<QueryVisualizationContextType, 'unitDescription'> &\n Pick<FacetPlotsCardProps, 'plotType'>\n\nfunction getQueryRequest(\n sql: string,\n selectFacetColumnName: string,\n selectFacetColumnValue: string,\n): QueryBundleRequest {\n const entityId = parseEntityIdFromSqlStatement(sql)\n return {\n entityId,\n concreteType: 'org.sagebionetworks.repo.model.table.QueryBundleRequest',\n partMask:\n SynapseConstants.BUNDLE_MASK_QUERY_COLUMN_MODELS |\n SynapseConstants.BUNDLE_MASK_QUERY_FACETS,\n query: {\n sql,\n offset: 0,\n limit: DEFAULT_PAGE_SIZE,\n selectedFacets: [\n {\n columnName: selectFacetColumnName,\n facetValues: [selectFacetColumnValue],\n concreteType:\n 'org.sagebionetworks.repo.model.table.FacetColumnValuesRequest',\n },\n ],\n },\n }\n}\nfunction QueryPerFacetPlotsCard(props: QueryPerFacetPlotsCardProps) {\n const {\n title,\n description,\n sql,\n facetsToPlot,\n rgbIndex,\n selectFacetColumnName,\n selectFacetColumnValue,\n detailsPagePath,\n plotType,\n ...rest\n } = props\n const initQueryRequest: QueryBundleRequest = getQueryRequest(\n sql!,\n selectFacetColumnName,\n selectFacetColumnValue,\n )\n\n /**\n * Fully re-render the uncontrolled QueryWrapper component when the initial query changes. This eliminates a class of\n * bugs where our 'derived' state (the current query), which should be reset, is out of sync with props.\n *\n * See https://legacy.reactjs.org/blog/2018/06/07/you-probably-dont-need-derived-state.html#recommendation-fully-uncontrolled-component-with-a-key\n */\n const queryWrapperKey = JSON.stringify(initQueryRequest)\n return (\n <QueryWrapper\n {...rest}\n initQueryRequest={initQueryRequest}\n key={queryWrapperKey}\n >\n <QueryVisualizationWrapper rgbIndex={rgbIndex} {...rest}>\n <QueryWrapperErrorBoundary>\n <FacetPlotsCard\n title={title}\n description={description}\n facetsToPlot={facetsToPlot}\n detailsPagePath={detailsPagePath}\n plotType={plotType}\n />\n </QueryWrapperErrorBoundary>\n </QueryVisualizationWrapper>\n </QueryWrapper>\n )\n}\n\nexport default QueryPerFacetPlotsCard\n"],"mappings":";;;;;;;;;;;;;AAwBA,SAAS,EACP,GACA,GACA,GACoB;AAEpB,QAAO;EACL,UAFe,EAA8B,
|
|
1
|
+
{"version":3,"file":"QueryPerFacetPlotsCard.js","names":[],"sources":["../../../src/components/FeaturedDataTabs/QueryPerFacetPlotsCard.tsx"],"sourcesContent":["import { SynapseConstants } from '@/utils'\nimport { parseEntityIdFromSqlStatement } from '@/utils/functions'\nimport { DEFAULT_PAGE_SIZE } from '@/utils/SynapseConstants'\nimport { QueryBundleRequest } from '@sage-bionetworks/synapse-types'\nimport {\n QueryVisualizationContextType,\n QueryVisualizationWrapper,\n} from '../QueryVisualizationWrapper'\nimport { QueryWrapper } from '../QueryWrapper'\nimport { QueryWrapperErrorBoundary } from '../QueryWrapperErrorBoundary'\nimport FacetPlotsCard, { FacetPlotsCardProps } from './FacetPlotsCard'\n\nexport type QueryPerFacetPlotsCardProps = {\n title?: string\n description?: string\n rgbIndex?: number\n facetsToPlot?: string[]\n selectFacetColumnName: string\n selectFacetColumnValue: string\n sql?: string\n detailsPagePath: string\n} & Pick<QueryVisualizationContextType, 'unitDescription'> &\n Pick<FacetPlotsCardProps, 'plotType'>\n\nfunction getQueryRequest(\n sql: string,\n selectFacetColumnName: string,\n selectFacetColumnValue: string,\n): QueryBundleRequest {\n const entityId = parseEntityIdFromSqlStatement(sql)\n return {\n entityId,\n concreteType: 'org.sagebionetworks.repo.model.table.QueryBundleRequest',\n partMask:\n SynapseConstants.BUNDLE_MASK_QUERY_COLUMN_MODELS |\n SynapseConstants.BUNDLE_MASK_QUERY_FACETS,\n query: {\n sql,\n offset: 0,\n limit: DEFAULT_PAGE_SIZE,\n selectedFacets: [\n {\n columnName: selectFacetColumnName,\n facetValues: [selectFacetColumnValue],\n concreteType:\n 'org.sagebionetworks.repo.model.table.FacetColumnValuesRequest',\n },\n ],\n },\n }\n}\nfunction QueryPerFacetPlotsCard(props: QueryPerFacetPlotsCardProps) {\n const {\n title,\n description,\n sql,\n facetsToPlot,\n rgbIndex,\n selectFacetColumnName,\n selectFacetColumnValue,\n detailsPagePath,\n plotType,\n ...rest\n } = props\n const initQueryRequest: QueryBundleRequest = getQueryRequest(\n sql!,\n selectFacetColumnName,\n selectFacetColumnValue,\n )\n\n /**\n * Fully re-render the uncontrolled QueryWrapper component when the initial query changes. This eliminates a class of\n * bugs where our 'derived' state (the current query), which should be reset, is out of sync with props.\n *\n * See https://legacy.reactjs.org/blog/2018/06/07/you-probably-dont-need-derived-state.html#recommendation-fully-uncontrolled-component-with-a-key\n */\n const queryWrapperKey = JSON.stringify(initQueryRequest)\n return (\n <QueryWrapper\n {...rest}\n initQueryRequest={initQueryRequest}\n key={queryWrapperKey}\n >\n <QueryVisualizationWrapper rgbIndex={rgbIndex} {...rest}>\n <QueryWrapperErrorBoundary>\n <FacetPlotsCard\n title={title}\n description={description}\n facetsToPlot={facetsToPlot}\n detailsPagePath={detailsPagePath}\n plotType={plotType}\n />\n </QueryWrapperErrorBoundary>\n </QueryVisualizationWrapper>\n </QueryWrapper>\n )\n}\n\nexport default QueryPerFacetPlotsCard\n"],"mappings":";;;;;;;;;;;;;AAwBA,SAAS,EACP,GACA,GACA,GACoB;AAEpB,QAAO;EACL,UAFe,EAA8B,EAE7C;EACA,cAAc;EACd,UACE;EAEF,OAAO;GACL;GACA,QAAQ;GACR,OAAA;GACA,gBAAgB,CACd;IACE,YAAY;IACZ,aAAa,CAAC,EAAuB;IACrC,cACE;IACH,CACF;GACF;EACF;;AAEH,SAAS,EAAuB,GAAoC;CAClE,IAAM,EACJ,UACA,gBACA,QACA,iBACA,aACA,0BACA,2BACA,oBACA,aACA,GAAG,MACD,GACE,IAAuC,EAC3C,GACA,GACA,EACD,EAQK,IAAkB,KAAK,UAAU,EAAiB;AACxD,QACE,kBAAC,GAAD;EACE,GAAI;EACc;EAClB,KAAK;EAaQ,EAXb,kBAAC,GAAD;EAAqC;EAAU,GAAI;YACjD,kBAAC,GAAD,EAAA,UACE,kBAAC,GAAD;GACS;GACM;GACC;GACG;GACP;GACV,CAAA,EACwB,CAAA;EACF,CAAA,CACf"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SingleQueryFacetPlotsCards.js","names":[],"sources":["../../../src/components/FeaturedDataTabs/SingleQueryFacetPlotsCards.tsx"],"sourcesContent":["import { SynapseConstants } from '@/utils'\nimport { parseEntityIdFromSqlStatement } from '@/utils/functions'\nimport { QueryBundleRequest } from '@sage-bionetworks/synapse-types'\nimport { chunk } from 'lodash-es'\nimport {\n QueryVisualizationContextType,\n QueryVisualizationWrapper,\n} from '../QueryVisualizationWrapper'\nimport { QueryWrapper } from '../QueryWrapper'\nimport { QueryWrapperErrorBoundary } from '../QueryWrapperErrorBoundary'\nimport FacetPlotsCard, { FacetPlotsCardProps } from './FacetPlotsCard'\nimport { FacetPlotsCardGridContainer } from './FacetPlotsCardGrid'\nimport { CARDS_PER_ROW } from './FeaturedDataTabsUtils'\n\nexport type SingleQueryFacetPlotsCardsProps = {\n rgbIndex?: number\n facetsToPlot?: string[]\n columnAliases?: Record<string, string>\n sql?: string\n} & Pick<QueryVisualizationContextType, 'unitDescription'> &\n Pick<FacetPlotsCardProps, 'plotType'>\n\nfunction getQueryRequest(sql: string): QueryBundleRequest {\n const entityId = parseEntityIdFromSqlStatement(sql)\n return {\n entityId,\n concreteType: 'org.sagebionetworks.repo.model.table.QueryBundleRequest',\n partMask:\n SynapseConstants.BUNDLE_MASK_QUERY_COLUMN_MODELS |\n SynapseConstants.BUNDLE_MASK_QUERY_FACETS,\n query: {\n sql,\n offset: 0,\n limit: 1,\n },\n }\n}\n\nfunction SingleQueryFacetPlotsCards(props: SingleQueryFacetPlotsCardsProps) {\n const {\n sql,\n facetsToPlot,\n rgbIndex,\n columnAliases,\n unitDescription,\n plotType,\n } = props\n const initQueryRequest: QueryBundleRequest = getQueryRequest(sql!)\n\n /**\n * Fully re-render the uncontrolled QueryWrapper component when the initial query changes. This eliminates a class of\n * bugs where our 'derived' state (the current query), which should be reset, is out of sync with props.\n *\n * See https://legacy.reactjs.org/blog/2018/06/07/you-probably-dont-need-derived-state.html#recommendation-fully-uncontrolled-component-with-a-key\n */\n const queryWrapperKey = JSON.stringify(initQueryRequest)\n\n return (\n <QueryWrapper initQueryRequest={initQueryRequest} key={queryWrapperKey}>\n <QueryVisualizationWrapper\n rgbIndex={rgbIndex}\n columnAliases={columnAliases}\n unitDescription={unitDescription}\n >\n <QueryWrapperErrorBoundary>\n {chunk(facetsToPlot, CARDS_PER_ROW).map((facets, rowIndex) => {\n return (\n <FacetPlotsCardGridContainer\n key={rowIndex}\n className={`FeaturedDataPlots__queryPerCard`}\n sx={{\n my: 4,\n }}\n >\n {facets?.map(facetName => {\n return (\n <FacetPlotsCard\n key={facetName}\n facetsToPlot={[facetName]}\n plotType={plotType}\n />\n )\n })}\n </FacetPlotsCardGridContainer>\n )\n })}\n </QueryWrapperErrorBoundary>\n </QueryVisualizationWrapper>\n </QueryWrapper>\n )\n}\n\nexport default SingleQueryFacetPlotsCards\n"],"mappings":";;;;;;;;;;;;;;;AAsBA,SAAS,EAAgB,GAAiC;AAExD,QAAO;EACL,UAFe,EAA8B,
|
|
1
|
+
{"version":3,"file":"SingleQueryFacetPlotsCards.js","names":[],"sources":["../../../src/components/FeaturedDataTabs/SingleQueryFacetPlotsCards.tsx"],"sourcesContent":["import { SynapseConstants } from '@/utils'\nimport { parseEntityIdFromSqlStatement } from '@/utils/functions'\nimport { QueryBundleRequest } from '@sage-bionetworks/synapse-types'\nimport { chunk } from 'lodash-es'\nimport {\n QueryVisualizationContextType,\n QueryVisualizationWrapper,\n} from '../QueryVisualizationWrapper'\nimport { QueryWrapper } from '../QueryWrapper'\nimport { QueryWrapperErrorBoundary } from '../QueryWrapperErrorBoundary'\nimport FacetPlotsCard, { FacetPlotsCardProps } from './FacetPlotsCard'\nimport { FacetPlotsCardGridContainer } from './FacetPlotsCardGrid'\nimport { CARDS_PER_ROW } from './FeaturedDataTabsUtils'\n\nexport type SingleQueryFacetPlotsCardsProps = {\n rgbIndex?: number\n facetsToPlot?: string[]\n columnAliases?: Record<string, string>\n sql?: string\n} & Pick<QueryVisualizationContextType, 'unitDescription'> &\n Pick<FacetPlotsCardProps, 'plotType'>\n\nfunction getQueryRequest(sql: string): QueryBundleRequest {\n const entityId = parseEntityIdFromSqlStatement(sql)\n return {\n entityId,\n concreteType: 'org.sagebionetworks.repo.model.table.QueryBundleRequest',\n partMask:\n SynapseConstants.BUNDLE_MASK_QUERY_COLUMN_MODELS |\n SynapseConstants.BUNDLE_MASK_QUERY_FACETS,\n query: {\n sql,\n offset: 0,\n limit: 1,\n },\n }\n}\n\nfunction SingleQueryFacetPlotsCards(props: SingleQueryFacetPlotsCardsProps) {\n const {\n sql,\n facetsToPlot,\n rgbIndex,\n columnAliases,\n unitDescription,\n plotType,\n } = props\n const initQueryRequest: QueryBundleRequest = getQueryRequest(sql!)\n\n /**\n * Fully re-render the uncontrolled QueryWrapper component when the initial query changes. This eliminates a class of\n * bugs where our 'derived' state (the current query), which should be reset, is out of sync with props.\n *\n * See https://legacy.reactjs.org/blog/2018/06/07/you-probably-dont-need-derived-state.html#recommendation-fully-uncontrolled-component-with-a-key\n */\n const queryWrapperKey = JSON.stringify(initQueryRequest)\n\n return (\n <QueryWrapper initQueryRequest={initQueryRequest} key={queryWrapperKey}>\n <QueryVisualizationWrapper\n rgbIndex={rgbIndex}\n columnAliases={columnAliases}\n unitDescription={unitDescription}\n >\n <QueryWrapperErrorBoundary>\n {chunk(facetsToPlot, CARDS_PER_ROW).map((facets, rowIndex) => {\n return (\n <FacetPlotsCardGridContainer\n key={rowIndex}\n className={`FeaturedDataPlots__queryPerCard`}\n sx={{\n my: 4,\n }}\n >\n {facets?.map(facetName => {\n return (\n <FacetPlotsCard\n key={facetName}\n facetsToPlot={[facetName]}\n plotType={plotType}\n />\n )\n })}\n </FacetPlotsCardGridContainer>\n )\n })}\n </QueryWrapperErrorBoundary>\n </QueryVisualizationWrapper>\n </QueryWrapper>\n )\n}\n\nexport default SingleQueryFacetPlotsCards\n"],"mappings":";;;;;;;;;;;;;;;AAsBA,SAAS,EAAgB,GAAiC;AAExD,QAAO;EACL,UAFe,EAA8B,EAE7C;EACA,cAAc;EACd,UACE;EAEF,OAAO;GACL;GACA,QAAQ;GACR,OAAO;GACR;EACF;;AAGH,SAAS,EAA2B,GAAwC;CAC1E,IAAM,EACJ,QACA,iBACA,aACA,kBACA,oBACA,gBACE,GACE,IAAuC,EAAgB,EAAK,EAQ5D,IAAkB,KAAK,UAAU,EAAiB;AAExD,QACE,kBAAC,GAAD;EAAgC;YAC9B,kBAAC,GAAD;GACY;GACK;GACE;aAEjB,kBAAC,GAAD,EAAA,UACG,EAAM,GAAA,EAA4B,CAAC,KAAK,GAAQ,MAE7C,kBAAC,GAAD;IAEE,WAAW;IACX,IAAI,EACF,IAAI,GACL;cAEA,GAAQ,KAAI,MAET,kBAAC,GAAD;KAEE,cAAc,CAAC,EAAU;KACf;KACV,EAHK,EAGL,CAEJ;IAC0B,EAfvB,EAeuB,CAEhC,EACwB,CAAA;GACF,CAAA;EACf,EA9BwC,EA8BxC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FeaturedResearch.js","names":[],"sources":["../../../src/components/FeaturedResearch/FeaturedResearch.tsx"],"sourcesContent":["import React from 'react'\nimport useGetQueryResultBundle from '@/synapse-queries/entity/useGetQueryResultBundle'\nimport { formatDate } from '@/utils/functions/DateFormatter'\nimport { getFieldIndex } from '@/utils/functions/queryUtils'\nimport { parseEntityIdFromSqlStatement } from '@/utils/functions/SqlFunctions'\nimport { useImageUrl } from '@/utils/hooks/useImageUrlUtils'\nimport * as SynapseConstants from '@/utils/SynapseConstants'\nimport {\n Box,\n CardMedia,\n Fade,\n Link,\n Skeleton,\n Stack,\n Typography,\n} from '@mui/material'\nimport { QueryBundleRequest, Row } from '@sage-bionetworks/synapse-types'\nimport dayjs from 'dayjs'\nimport { useInView } from 'react-intersection-observer'\nimport PortalSectionHeader from '../PortalSectionHeader'\n\nconst transitionTimeoutMs = 400\n\nexport type FeaturedResearchProps = {\n sql: string\n}\n\nexport type FeaturedResearchCardProps = {\n research: Row\n entityId: string\n isLoading: boolean\n publicationDateColIndex: number\n titleColIndex: number\n descriptionColIndex: number\n linkColIndex: number\n imageColIndex: number\n}\n\nconst FeaturedResearchCard = ({\n research,\n entityId,\n publicationDateColIndex,\n titleColIndex,\n linkColIndex,\n imageColIndex,\n isLoading,\n}: FeaturedResearchCardProps): React.ReactNode => {\n const fileId = research.values[imageColIndex] ?? ''\n const url = useImageUrl(fileId ?? '', entityId)\n if (isLoading) {\n return <Skeleton variant=\"rectangular\" height={142} width=\"100%\" />\n }\n return (\n <Box\n sx={{\n display: 'flex',\n gap: '30px',\n borderBottom: '1px solid',\n padding: '24px 0',\n borderColor: 'grey.300',\n flexDirection: {\n xs: 'column',\n sm: 'row',\n },\n }}\n >\n <Stack\n useFlexGap\n sx={{\n gap: '10px',\n }}\n >\n <Typography\n variant=\"headline2\"\n sx={{\n color: 'gray.1000',\n fontSize: '21px',\n }}\n >\n <Link\n href={research.values[linkColIndex] ?? ''}\n target=\"_blank\"\n sx={{\n color: 'grey.1000',\n textDecoration: 'none',\n '&:hover': {\n textDecoration: 'none',\n },\n }}\n >\n {research.values[titleColIndex]}\n </Link>\n </Typography>\n <Typography\n sx={{\n lineHeight: 'normal',\n color: 'grey.600',\n }}\n >\n {research.values[publicationDateColIndex] &&\n formatDate(\n dayjs(Number(research.values[publicationDateColIndex])),\n 'MMMM, YYYY',\n )}\n </Typography>\n </Stack>\n <CardMedia\n component=\"img\"\n image={url}\n aria-hidden=\"true\"\n sx={{\n flexShrink: 0,\n width: '140px',\n height: '93.8px',\n borderRadius: '6px',\n objectFit: 'cover',\n marginLeft: { xs: 'initial', sm: 'auto' },\n }}\n />\n </Box>\n )\n}\n\nconst FeaturedResearchTopCard = ({\n research,\n entityId,\n titleColIndex,\n descriptionColIndex,\n linkColIndex,\n imageColIndex,\n isLoading,\n}: FeaturedResearchCardProps): React.ReactNode => {\n const [ref, inView] = useInView({ threshold: 0.3, triggerOnce: true })\n const fileId = research.values[imageColIndex] ?? ''\n const url = useImageUrl(fileId || '', entityId)\n if (isLoading) {\n return (\n <Skeleton\n variant=\"rectangular\"\n width=\"100%\"\n sx={{\n height: { xs: '250px', sm: '500px', md: '600px', lg: '800px' },\n }}\n />\n )\n }\n return (\n <Box ref={ref}>\n <Fade in={inView} timeout={transitionTimeoutMs}>\n <CardMedia\n component=\"img\"\n image={url}\n aria-hidden=\"true\"\n sx={{\n objectFit: 'cover',\n borderRadius: '10px',\n marginBottom: '30px',\n }}\n />\n </Fade>\n <Stack\n useFlexGap\n sx={{\n gap: '16px',\n }}\n >\n <Typography\n variant=\"headline2\"\n sx={{ color: 'grey.1000', fontSize: { xs: '24px', md: '36px' } }}\n >\n <Link\n href={research.values[linkColIndex] ?? ''}\n target=\"_blank\"\n sx={{\n color: 'grey.1000',\n textDecoration: 'none',\n '&:hover': {\n textDecoration: 'none',\n },\n }}\n >\n {research.values[titleColIndex]}\n </Link>\n </Typography>\n <Typography\n sx={{\n fontSize: '18px',\n lineHeight: '22.4px',\n }}\n >\n {research.values[descriptionColIndex] ?? ''}\n </Typography>\n <Link href={research.values[linkColIndex] ?? ''} target={'_blank'}>\n Read more\n </Link>\n </Stack>\n </Box>\n )\n}\n\nfunction FeaturedResearch(props: FeaturedResearchProps) {\n const { sql } = props\n\n const entityId = parseEntityIdFromSqlStatement(sql)\n\n const queryBundleRequest: QueryBundleRequest = {\n partMask:\n SynapseConstants.BUNDLE_MASK_QUERY_SELECT_COLUMNS |\n SynapseConstants.BUNDLE_MASK_QUERY_RESULTS,\n concreteType: 'org.sagebionetworks.repo.model.table.QueryBundleRequest',\n entityId,\n query: {\n sql,\n },\n }\n const { data: queryResultBundle, isLoading } =\n useGetQueryResultBundle(queryBundleRequest)\n\n const dataRows = queryResultBundle?.queryResult!.queryResults.rows ?? []\n\n enum ExpectedColumns {\n TITLE = 'title',\n DESCRIPTION = 'description',\n PUBLICATION_DATE = 'publicationDate',\n IMAGE = 'image',\n LINK = 'link',\n }\n\n const titleColIndex = getFieldIndex(ExpectedColumns.TITLE, queryResultBundle)\n const descriptionColIndex = getFieldIndex(\n ExpectedColumns.DESCRIPTION,\n queryResultBundle,\n )\n const publicationDateColIndex = getFieldIndex(\n ExpectedColumns.PUBLICATION_DATE,\n queryResultBundle,\n )\n const imageColIndex = getFieldIndex(ExpectedColumns.IMAGE, queryResultBundle)\n const linkColIndex = getFieldIndex(ExpectedColumns.LINK, queryResultBundle)\n\n const topCard = dataRows[0]\n const remainingCards = dataRows.slice(1)\n\n const featuredResearchHeader = (\n <PortalSectionHeader\n title=\"Featured Research\"\n sx={{\n h2: { fontSize: '24px', paddingBottom: 0, width: '100%' },\n }}\n />\n )\n\n return (\n <Box\n sx={{\n display: 'grid',\n gridTemplateColumns: { xs: '1fr', md: '1fr 1fr' },\n gap: { xs: '30px', md: '40px' },\n padding: { xs: '40px', lg: '80px' },\n }}\n >\n <Box sx={{ display: { md: 'none' } }}>{featuredResearchHeader}</Box>\n <Box>\n {topCard && (\n <FeaturedResearchTopCard\n entityId={entityId}\n research={topCard}\n titleColIndex={titleColIndex}\n isLoading={isLoading}\n descriptionColIndex={descriptionColIndex}\n publicationDateColIndex={publicationDateColIndex}\n imageColIndex={imageColIndex}\n linkColIndex={linkColIndex}\n />\n )}\n </Box>\n <Stack>\n <Box sx={{ display: { xs: 'none', md: 'block' } }}>\n {featuredResearchHeader}\n </Box>\n <Stack\n sx={{\n gap: '16px',\n }}\n >\n {remainingCards.map((research, index) => (\n <FeaturedResearchCard\n entityId={entityId}\n research={research}\n key={index}\n isLoading={isLoading}\n titleColIndex={titleColIndex}\n descriptionColIndex={descriptionColIndex}\n publicationDateColIndex={publicationDateColIndex}\n imageColIndex={imageColIndex}\n linkColIndex={linkColIndex}\n />\n ))}\n </Stack>\n </Stack>\n </Box>\n )\n}\n\nexport default FeaturedResearch\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"FeaturedResearch.js","names":[],"sources":["../../../src/components/FeaturedResearch/FeaturedResearch.tsx"],"sourcesContent":["import React from 'react'\nimport useGetQueryResultBundle from '@/synapse-queries/entity/useGetQueryResultBundle'\nimport { formatDate } from '@/utils/functions/DateFormatter'\nimport { getFieldIndex } from '@/utils/functions/queryUtils'\nimport { parseEntityIdFromSqlStatement } from '@/utils/functions/SqlFunctions'\nimport { useImageUrl } from '@/utils/hooks/useImageUrlUtils'\nimport * as SynapseConstants from '@/utils/SynapseConstants'\nimport {\n Box,\n CardMedia,\n Fade,\n Link,\n Skeleton,\n Stack,\n Typography,\n} from '@mui/material'\nimport { QueryBundleRequest, Row } from '@sage-bionetworks/synapse-types'\nimport dayjs from 'dayjs'\nimport { useInView } from 'react-intersection-observer'\nimport PortalSectionHeader from '../PortalSectionHeader'\n\nconst transitionTimeoutMs = 400\n\nexport type FeaturedResearchProps = {\n sql: string\n}\n\nexport type FeaturedResearchCardProps = {\n research: Row\n entityId: string\n isLoading: boolean\n publicationDateColIndex: number\n titleColIndex: number\n descriptionColIndex: number\n linkColIndex: number\n imageColIndex: number\n}\n\nconst FeaturedResearchCard = ({\n research,\n entityId,\n publicationDateColIndex,\n titleColIndex,\n linkColIndex,\n imageColIndex,\n isLoading,\n}: FeaturedResearchCardProps): React.ReactNode => {\n const fileId = research.values[imageColIndex] ?? ''\n const url = useImageUrl(fileId ?? '', entityId)\n if (isLoading) {\n return <Skeleton variant=\"rectangular\" height={142} width=\"100%\" />\n }\n return (\n <Box\n sx={{\n display: 'flex',\n gap: '30px',\n borderBottom: '1px solid',\n padding: '24px 0',\n borderColor: 'grey.300',\n flexDirection: {\n xs: 'column',\n sm: 'row',\n },\n }}\n >\n <Stack\n useFlexGap\n sx={{\n gap: '10px',\n }}\n >\n <Typography\n variant=\"headline2\"\n sx={{\n color: 'gray.1000',\n fontSize: '21px',\n }}\n >\n <Link\n href={research.values[linkColIndex] ?? ''}\n target=\"_blank\"\n sx={{\n color: 'grey.1000',\n textDecoration: 'none',\n '&:hover': {\n textDecoration: 'none',\n },\n }}\n >\n {research.values[titleColIndex]}\n </Link>\n </Typography>\n <Typography\n sx={{\n lineHeight: 'normal',\n color: 'grey.600',\n }}\n >\n {research.values[publicationDateColIndex] &&\n formatDate(\n dayjs(Number(research.values[publicationDateColIndex])),\n 'MMMM, YYYY',\n )}\n </Typography>\n </Stack>\n <CardMedia\n component=\"img\"\n image={url}\n aria-hidden=\"true\"\n sx={{\n flexShrink: 0,\n width: '140px',\n height: '93.8px',\n borderRadius: '6px',\n objectFit: 'cover',\n marginLeft: { xs: 'initial', sm: 'auto' },\n }}\n />\n </Box>\n )\n}\n\nconst FeaturedResearchTopCard = ({\n research,\n entityId,\n titleColIndex,\n descriptionColIndex,\n linkColIndex,\n imageColIndex,\n isLoading,\n}: FeaturedResearchCardProps): React.ReactNode => {\n const [ref, inView] = useInView({ threshold: 0.3, triggerOnce: true })\n const fileId = research.values[imageColIndex] ?? ''\n const url = useImageUrl(fileId || '', entityId)\n if (isLoading) {\n return (\n <Skeleton\n variant=\"rectangular\"\n width=\"100%\"\n sx={{\n height: { xs: '250px', sm: '500px', md: '600px', lg: '800px' },\n }}\n />\n )\n }\n return (\n <Box ref={ref}>\n <Fade in={inView} timeout={transitionTimeoutMs}>\n <CardMedia\n component=\"img\"\n image={url}\n aria-hidden=\"true\"\n sx={{\n objectFit: 'cover',\n borderRadius: '10px',\n marginBottom: '30px',\n }}\n />\n </Fade>\n <Stack\n useFlexGap\n sx={{\n gap: '16px',\n }}\n >\n <Typography\n variant=\"headline2\"\n sx={{ color: 'grey.1000', fontSize: { xs: '24px', md: '36px' } }}\n >\n <Link\n href={research.values[linkColIndex] ?? ''}\n target=\"_blank\"\n sx={{\n color: 'grey.1000',\n textDecoration: 'none',\n '&:hover': {\n textDecoration: 'none',\n },\n }}\n >\n {research.values[titleColIndex]}\n </Link>\n </Typography>\n <Typography\n sx={{\n fontSize: '18px',\n lineHeight: '22.4px',\n }}\n >\n {research.values[descriptionColIndex] ?? ''}\n </Typography>\n <Link href={research.values[linkColIndex] ?? ''} target={'_blank'}>\n Read more\n </Link>\n </Stack>\n </Box>\n )\n}\n\nfunction FeaturedResearch(props: FeaturedResearchProps) {\n const { sql } = props\n\n const entityId = parseEntityIdFromSqlStatement(sql)\n\n const queryBundleRequest: QueryBundleRequest = {\n partMask:\n SynapseConstants.BUNDLE_MASK_QUERY_SELECT_COLUMNS |\n SynapseConstants.BUNDLE_MASK_QUERY_RESULTS,\n concreteType: 'org.sagebionetworks.repo.model.table.QueryBundleRequest',\n entityId,\n query: {\n sql,\n },\n }\n const { data: queryResultBundle, isLoading } =\n useGetQueryResultBundle(queryBundleRequest)\n\n const dataRows = queryResultBundle?.queryResult!.queryResults.rows ?? []\n\n enum ExpectedColumns {\n TITLE = 'title',\n DESCRIPTION = 'description',\n PUBLICATION_DATE = 'publicationDate',\n IMAGE = 'image',\n LINK = 'link',\n }\n\n const titleColIndex = getFieldIndex(ExpectedColumns.TITLE, queryResultBundle)\n const descriptionColIndex = getFieldIndex(\n ExpectedColumns.DESCRIPTION,\n queryResultBundle,\n )\n const publicationDateColIndex = getFieldIndex(\n ExpectedColumns.PUBLICATION_DATE,\n queryResultBundle,\n )\n const imageColIndex = getFieldIndex(ExpectedColumns.IMAGE, queryResultBundle)\n const linkColIndex = getFieldIndex(ExpectedColumns.LINK, queryResultBundle)\n\n const topCard = dataRows[0]\n const remainingCards = dataRows.slice(1)\n\n const featuredResearchHeader = (\n <PortalSectionHeader\n title=\"Featured Research\"\n sx={{\n h2: { fontSize: '24px', paddingBottom: 0, width: '100%' },\n }}\n />\n )\n\n return (\n <Box\n sx={{\n display: 'grid',\n gridTemplateColumns: { xs: '1fr', md: '1fr 1fr' },\n gap: { xs: '30px', md: '40px' },\n padding: { xs: '40px', lg: '80px' },\n }}\n >\n <Box sx={{ display: { md: 'none' } }}>{featuredResearchHeader}</Box>\n <Box>\n {topCard && (\n <FeaturedResearchTopCard\n entityId={entityId}\n research={topCard}\n titleColIndex={titleColIndex}\n isLoading={isLoading}\n descriptionColIndex={descriptionColIndex}\n publicationDateColIndex={publicationDateColIndex}\n imageColIndex={imageColIndex}\n linkColIndex={linkColIndex}\n />\n )}\n </Box>\n <Stack>\n <Box sx={{ display: { xs: 'none', md: 'block' } }}>\n {featuredResearchHeader}\n </Box>\n <Stack\n sx={{\n gap: '16px',\n }}\n >\n {remainingCards.map((research, index) => (\n <FeaturedResearchCard\n entityId={entityId}\n research={research}\n key={index}\n isLoading={isLoading}\n titleColIndex={titleColIndex}\n descriptionColIndex={descriptionColIndex}\n publicationDateColIndex={publicationDateColIndex}\n imageColIndex={imageColIndex}\n linkColIndex={linkColIndex}\n />\n ))}\n </Stack>\n </Stack>\n </Box>\n )\n}\n\nexport default FeaturedResearch\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FeaturedToolsList.js","names":[],"sources":["../../../src/components/FeaturedToolsList/FeaturedToolsList.tsx"],"sourcesContent":["import useGetQueryResultBundle from '@/synapse-queries/entity/useGetQueryResultBundle'\nimport { SynapseConstants } from '@/utils'\nimport { useSynapseContext } from '@/utils/context/SynapseContext'\nimport { getFieldIndex } from '@/utils/functions/queryUtils'\nimport { QueryBundleRequest } from '@sage-bionetworks/synapse-types'\nimport { useEffect, useState } from 'react'\nimport { ErrorBanner } from '../error/ErrorBanner'\nimport { FeaturedToolCard } from './FeaturedToolCard'\n\nexport type FeaturedToolsListProps = {\n entityId: string\n idColumnName: string\n nameColumnName: string\n descriptionColumnName: string\n typeColumnName: string\n dateColumnName?: string\n filterClause: string\n} & ( // for the link, either the toolDetailPageURL or the toolURLColumnName must be set\n | {\n toolDetailPageURL: string\n toolURLColumnName?: never\n }\n | {\n toolDetailPageURL?: never\n toolURLColumnName: string\n }\n)\n\ntype ToolData = {\n id: string\n name: string\n description: string\n type: string\n date?: string\n url?: string //set if URL is in toolURLColumnName, dynamic if pointing to a detail page\n}\n\n/**\n * Display a set of FeaturedToolCards (driven by a Table/View). Driven by the following annotations/column names:\n * 'id', 'name', 'type', and 'description'.\n */\nexport function FeaturedToolsList({\n entityId,\n toolDetailPageURL,\n toolURLColumnName,\n idColumnName = 'id',\n nameColumnName = 'name',\n descriptionColumnName = 'description',\n typeColumnName = 'type',\n dateColumnName,\n filterClause,\n}: FeaturedToolsListProps) {\n const sql = `SELECT * FROM ${entityId} ${filterClause} LIMIT 3`\n const queryBundleRequest: QueryBundleRequest = {\n concreteType: 'org.sagebionetworks.repo.model.table.QueryBundleRequest',\n entityId,\n partMask:\n SynapseConstants.BUNDLE_MASK_QUERY_SELECT_COLUMNS |\n SynapseConstants.BUNDLE_MASK_QUERY_RESULTS,\n query: {\n sql,\n },\n }\n\n const { accessToken } = useSynapseContext()\n const [tools, setTools] = useState<ToolData[]>([])\n const [error, setError] = useState<Error>()\n const { data: queryResultBundle, error: queryError } =\n useGetQueryResultBundle(queryBundleRequest)\n\n useEffect(() => {\n const getData = () => {\n try {\n const idIndex = getFieldIndex(idColumnName, queryResultBundle)\n const nameColumnIndex = getFieldIndex(nameColumnName, queryResultBundle)\n const typeColumnIndex = getFieldIndex(typeColumnName, queryResultBundle)\n const descriptionColumnIndex = getFieldIndex(\n descriptionColumnName,\n queryResultBundle,\n )\n const dateColumnIndex = getFieldIndex(dateColumnName, queryResultBundle)\n const toolURLColumnIndex = getFieldIndex(\n toolURLColumnName,\n queryResultBundle,\n )\n const tools: ToolData[] =\n queryResultBundle?.queryResult!.queryResults.rows.map(row => {\n if (row.values.some(value => value === null)) {\n console.warn('Row has null value(s)')\n }\n // Cast to string, assuming there are no null values\n const values = row.values as string[]\n return {\n name: values[nameColumnIndex],\n description: values[descriptionColumnIndex],\n type: values[typeColumnIndex],\n id: values[idIndex],\n date: dateColumnName ? values[dateColumnIndex] : undefined,\n url: toolURLColumnName ? values[toolURLColumnIndex] : undefined,\n }\n }) ?? []\n if (queryError) {\n throw queryError\n }\n if (tools.length === 0) {\n // wait for data to load\n return\n }\n\n setTools(tools)\n } catch (error) {\n console.error(error)\n setError(error)\n }\n }\n getData()\n }, [\n entityId,\n accessToken,\n queryResultBundle,\n queryError,\n idColumnName,\n nameColumnName,\n typeColumnName,\n descriptionColumnName,\n dateColumnName,\n ])\n return error ? (\n <ErrorBanner error={error}></ErrorBanner>\n ) : (\n <div className=\"FeaturedToolList\">\n {tools.map(tool => {\n return (\n <FeaturedToolCard\n key={tool.id}\n name={tool.name}\n type={tool.type}\n description={tool.description}\n id={tool.id}\n date={tool.date}\n toolDetailPageURL={toolDetailPageURL}\n url={tool.url}\n />\n )\n })}\n </div>\n )\n}\n\nexport default FeaturedToolsList\n"],"mappings":";;;;;;;;;;AAyCA,SAAgB,EAAkB,EAChC,aACA,sBACA,sBACA,kBAAe,MACf,oBAAiB,QACjB,2BAAwB,eACxB,oBAAiB,QACjB,mBACA,mBACyB;CAEzB,IAAM,IAAyC;EAC7C,cAAc;EACd;EACA,UACE;EAEF,OAAO,EACL,
|
|
1
|
+
{"version":3,"file":"FeaturedToolsList.js","names":[],"sources":["../../../src/components/FeaturedToolsList/FeaturedToolsList.tsx"],"sourcesContent":["import useGetQueryResultBundle from '@/synapse-queries/entity/useGetQueryResultBundle'\nimport { SynapseConstants } from '@/utils'\nimport { useSynapseContext } from '@/utils/context/SynapseContext'\nimport { getFieldIndex } from '@/utils/functions/queryUtils'\nimport { QueryBundleRequest } from '@sage-bionetworks/synapse-types'\nimport { useEffect, useState } from 'react'\nimport { ErrorBanner } from '../error/ErrorBanner'\nimport { FeaturedToolCard } from './FeaturedToolCard'\n\nexport type FeaturedToolsListProps = {\n entityId: string\n idColumnName: string\n nameColumnName: string\n descriptionColumnName: string\n typeColumnName: string\n dateColumnName?: string\n filterClause: string\n} & ( // for the link, either the toolDetailPageURL or the toolURLColumnName must be set\n | {\n toolDetailPageURL: string\n toolURLColumnName?: never\n }\n | {\n toolDetailPageURL?: never\n toolURLColumnName: string\n }\n)\n\ntype ToolData = {\n id: string\n name: string\n description: string\n type: string\n date?: string\n url?: string //set if URL is in toolURLColumnName, dynamic if pointing to a detail page\n}\n\n/**\n * Display a set of FeaturedToolCards (driven by a Table/View). Driven by the following annotations/column names:\n * 'id', 'name', 'type', and 'description'.\n */\nexport function FeaturedToolsList({\n entityId,\n toolDetailPageURL,\n toolURLColumnName,\n idColumnName = 'id',\n nameColumnName = 'name',\n descriptionColumnName = 'description',\n typeColumnName = 'type',\n dateColumnName,\n filterClause,\n}: FeaturedToolsListProps) {\n const sql = `SELECT * FROM ${entityId} ${filterClause} LIMIT 3`\n const queryBundleRequest: QueryBundleRequest = {\n concreteType: 'org.sagebionetworks.repo.model.table.QueryBundleRequest',\n entityId,\n partMask:\n SynapseConstants.BUNDLE_MASK_QUERY_SELECT_COLUMNS |\n SynapseConstants.BUNDLE_MASK_QUERY_RESULTS,\n query: {\n sql,\n },\n }\n\n const { accessToken } = useSynapseContext()\n const [tools, setTools] = useState<ToolData[]>([])\n const [error, setError] = useState<Error>()\n const { data: queryResultBundle, error: queryError } =\n useGetQueryResultBundle(queryBundleRequest)\n\n useEffect(() => {\n const getData = () => {\n try {\n const idIndex = getFieldIndex(idColumnName, queryResultBundle)\n const nameColumnIndex = getFieldIndex(nameColumnName, queryResultBundle)\n const typeColumnIndex = getFieldIndex(typeColumnName, queryResultBundle)\n const descriptionColumnIndex = getFieldIndex(\n descriptionColumnName,\n queryResultBundle,\n )\n const dateColumnIndex = getFieldIndex(dateColumnName, queryResultBundle)\n const toolURLColumnIndex = getFieldIndex(\n toolURLColumnName,\n queryResultBundle,\n )\n const tools: ToolData[] =\n queryResultBundle?.queryResult!.queryResults.rows.map(row => {\n if (row.values.some(value => value === null)) {\n console.warn('Row has null value(s)')\n }\n // Cast to string, assuming there are no null values\n const values = row.values as string[]\n return {\n name: values[nameColumnIndex],\n description: values[descriptionColumnIndex],\n type: values[typeColumnIndex],\n id: values[idIndex],\n date: dateColumnName ? values[dateColumnIndex] : undefined,\n url: toolURLColumnName ? values[toolURLColumnIndex] : undefined,\n }\n }) ?? []\n if (queryError) {\n throw queryError\n }\n if (tools.length === 0) {\n // wait for data to load\n return\n }\n\n setTools(tools)\n } catch (error) {\n console.error(error)\n setError(error)\n }\n }\n getData()\n }, [\n entityId,\n accessToken,\n queryResultBundle,\n queryError,\n idColumnName,\n nameColumnName,\n typeColumnName,\n descriptionColumnName,\n dateColumnName,\n ])\n return error ? (\n <ErrorBanner error={error}></ErrorBanner>\n ) : (\n <div className=\"FeaturedToolList\">\n {tools.map(tool => {\n return (\n <FeaturedToolCard\n key={tool.id}\n name={tool.name}\n type={tool.type}\n description={tool.description}\n id={tool.id}\n date={tool.date}\n toolDetailPageURL={toolDetailPageURL}\n url={tool.url}\n />\n )\n })}\n </div>\n )\n}\n\nexport default FeaturedToolsList\n"],"mappings":";;;;;;;;;;AAyCA,SAAgB,EAAkB,EAChC,aACA,sBACA,sBACA,kBAAe,MACf,oBAAiB,QACjB,2BAAwB,eACxB,oBAAiB,QACjB,mBACA,mBACyB;CAEzB,IAAM,IAAyC;EAC7C,cAAc;EACd;EACA,UACE;EAEF,OAAO,EACL,sBARyB,EAAS,GAAG,EAAa,WASnD;EACF,EAEK,EAAE,mBAAgB,GAAmB,EACrC,CAAC,GAAO,KAAY,EAAqB,EAAE,CAAC,EAC5C,CAAC,GAAO,KAAY,GAAiB,EACrC,EAAE,MAAM,GAAmB,OAAO,MACtC,EAAwB,EAAmB;AA2D7C,QAzDA,QAAgB;AA6Cd,SA5CsB;AACpB,OAAI;IACF,IAAM,IAAU,EAAc,GAAc,EAAkB,EACxD,IAAkB,EAAc,GAAgB,EAAkB,EAClE,IAAkB,EAAc,GAAgB,EAAkB,EAClE,IAAyB,EAC7B,GACA,EACD,EACK,IAAkB,EAAc,GAAgB,EAAkB,EAClE,IAAqB,EACzB,GACA,EACD,EACK,IACJ,GAAmB,YAAa,aAAa,KAAK,KAAI,MAAO;AAC3D,KAAI,EAAI,OAAO,MAAK,MAAS,MAAU,KAAK,IAC1C,QAAQ,KAAK,wBAAwB;KAGvC,IAAM,IAAS,EAAI;AACnB,YAAO;MACL,MAAM,EAAO;MACb,aAAa,EAAO;MACpB,MAAM,EAAO;MACb,IAAI,EAAO;MACX,MAAM,IAAiB,EAAO,KAAmB,KAAA;MACjD,KAAK,IAAoB,EAAO,KAAsB,KAAA;MACvD;MACD,IAAI,EAAE;AACV,QAAI,EACF,OAAM;AAER,QAAI,EAAM,WAAW,EAEnB;AAGF,MAAS,EAAM;YACR,GAAO;AAEd,IADA,QAAQ,MAAM,EAAM,EACpB,EAAS,EAAM;;MAGV;IACR;EACD;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACD,CAAC,EACK,IACL,kBAAC,GAAD,EAAoB,UAAqB,CAAA,GAEzC,kBAAC,OAAD;EAAK,WAAU;YACZ,EAAM,KAAI,MAEP,kBAAC,GAAD;GAEE,MAAM,EAAK;GACX,MAAM,EAAK;GACX,aAAa,EAAK;GAClB,IAAI,EAAK;GACT,MAAM,EAAK;GACQ;GACnB,KAAK,EAAK;GACV,EARK,EAAK,GAQV,CAEJ;EACE,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FileHandleContentRenderer.js","names":[],"sources":["../../../src/components/FilePreview/FileHandleContentRenderer.tsx"],"sourcesContent":["import { useGetPresignedUrlContent } from '@/synapse-queries/file/useFiles'\nimport { MB } from '@/utils/SynapseConstants'\nimport {\n BatchFileRequest,\n FileHandle,\n FileHandleAssociation,\n} from '@sage-bionetworks/synapse-types'\nimport { SynapseSpinner } from '../LoadingScreen/LoadingScreen'\nimport HtmlPreview from './HtmlPreview/HtmlPreview'\nimport PdfPreview from './PdfPreview'\nimport { PreviewRendererType } from './PreviewRendererType'\n\nconst MAX_FILE_SIZE = 30 * MB\n\nexport type FileHandleContentRendererProps = {\n /** The file handle whose contents should be downloaded and rendered */\n fileHandle: FileHandle\n /** The association between the file handle and an object which will give the user permission to access the file data */\n fileHandleAssociation: FileHandleAssociation\n /** Informs how to render the file data */\n previewType: PreviewRendererType\n}\n\n/**\n * Fetches the content for and renders the contents of a file handle.\n * @param props\n * @returns\n */\nexport default function FileHandleContentRenderer(\n props: FileHandleContentRendererProps,\n) {\n const { fileHandle, fileHandleAssociation, previewType } = props\n\n const batchFileRequest: BatchFileRequest = {\n requestedFiles: [fileHandleAssociation],\n includePreSignedURLs: true,\n includeFileHandles: false,\n includePreviewPreSignedURLs: false,\n }\n\n const { data: content, isLoading } = useGetPresignedUrlContent(\n fileHandle,\n batchFileRequest,\n MAX_FILE_SIZE,\n { throwOnError: true },\n )\n\n if (isLoading) {\n return <SynapseSpinner />\n }\n if (previewType === PreviewRendererType.HTML) {\n return (\n <HtmlPreview rawHtml={content!} createdByUserId={fileHandle.createdBy} />\n )\n } else if (previewType === PreviewRendererType.PDF) {\n return (\n <PdfPreview\n fileHandle={fileHandle}\n fileHandleAssociation={fileHandleAssociation}\n />\n )\n } else {\n if (previewType !== PreviewRendererType.NONE) {\n console.warn(\n `Rendering a preview of type ${previewType} is not supported in Portals`,\n )\n }\n return <></>\n }\n}\n"],"mappings":";;;;;;;;AAYA,IAAM,IAAgB,KAAK;AAgB3B,SAAwB,EACtB,GACA;CACA,IAAM,EAAE,eAAY,0BAAuB,mBAAgB,GASrD,EAAE,MAAM,GAAS,iBAAc,EACnC,
|
|
1
|
+
{"version":3,"file":"FileHandleContentRenderer.js","names":[],"sources":["../../../src/components/FilePreview/FileHandleContentRenderer.tsx"],"sourcesContent":["import { useGetPresignedUrlContent } from '@/synapse-queries/file/useFiles'\nimport { MB } from '@/utils/SynapseConstants'\nimport {\n BatchFileRequest,\n FileHandle,\n FileHandleAssociation,\n} from '@sage-bionetworks/synapse-types'\nimport { SynapseSpinner } from '../LoadingScreen/LoadingScreen'\nimport HtmlPreview from './HtmlPreview/HtmlPreview'\nimport PdfPreview from './PdfPreview'\nimport { PreviewRendererType } from './PreviewRendererType'\n\nconst MAX_FILE_SIZE = 30 * MB\n\nexport type FileHandleContentRendererProps = {\n /** The file handle whose contents should be downloaded and rendered */\n fileHandle: FileHandle\n /** The association between the file handle and an object which will give the user permission to access the file data */\n fileHandleAssociation: FileHandleAssociation\n /** Informs how to render the file data */\n previewType: PreviewRendererType\n}\n\n/**\n * Fetches the content for and renders the contents of a file handle.\n * @param props\n * @returns\n */\nexport default function FileHandleContentRenderer(\n props: FileHandleContentRendererProps,\n) {\n const { fileHandle, fileHandleAssociation, previewType } = props\n\n const batchFileRequest: BatchFileRequest = {\n requestedFiles: [fileHandleAssociation],\n includePreSignedURLs: true,\n includeFileHandles: false,\n includePreviewPreSignedURLs: false,\n }\n\n const { data: content, isLoading } = useGetPresignedUrlContent(\n fileHandle,\n batchFileRequest,\n MAX_FILE_SIZE,\n { throwOnError: true },\n )\n\n if (isLoading) {\n return <SynapseSpinner />\n }\n if (previewType === PreviewRendererType.HTML) {\n return (\n <HtmlPreview rawHtml={content!} createdByUserId={fileHandle.createdBy} />\n )\n } else if (previewType === PreviewRendererType.PDF) {\n return (\n <PdfPreview\n fileHandle={fileHandle}\n fileHandleAssociation={fileHandleAssociation}\n />\n )\n } else {\n if (previewType !== PreviewRendererType.NONE) {\n console.warn(\n `Rendering a preview of type ${previewType} is not supported in Portals`,\n )\n }\n return <></>\n }\n}\n"],"mappings":";;;;;;;;AAYA,IAAM,IAAgB,KAAK;AAgB3B,SAAwB,EACtB,GACA;CACA,IAAM,EAAE,eAAY,0BAAuB,mBAAgB,GASrD,EAAE,MAAM,GAAS,iBAAc,EACnC,GACA;EARA,gBAAgB,CAAC,EAAsB;EACvC,sBAAsB;EACtB,oBAAoB;EACpB,6BAA6B;EAK7B,EACA,GACA,EAAE,cAAc,IAAM,CACvB;AAsBC,QApBE,IACK,kBAAC,GAAD,EAAkB,CAAA,GAEvB,MAAgB,EAAoB,OAEpC,kBAAC,GAAD;EAAa,SAAS;EAAU,iBAAiB,EAAW;EAAa,CAAA,GAElE,MAAgB,EAAoB,MAE3C,kBAAC,GAAD;EACc;EACW;EACvB,CAAA,IAGA,MAAgB,EAAoB,QACtC,QAAQ,KACN,+BAA+B,EAAY,8BAC5C,EAEI,kBAAA,GAAA,EAAK,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"HtmlPreview.js","names":[],"sources":["../../../../src/components/FilePreview/HtmlPreview/HtmlPreview.tsx"],"sourcesContent":["import { useGetIsUserMemberOfTeam } from '@/synapse-queries/team/useTeamMembers'\nimport { sanitize } from '@/utils/functions/SanitizeHtmlUtils'\nimport { TRUSTED_HTML_USERS_TEAM_ID } from '@/utils/SynapseConstants'\nimport { Alert } from '@mui/material'\nimport { useEffect, useMemo, useRef, useState } from 'react'\nimport { SynapseSpinner } from '../../LoadingScreen/LoadingScreen'\n\n/**\n * @param options\n * @returns HTML that is cleaned if it is not trusted. undefined if `isLoading` is true.\n */\nfunction useCleanHtml(options: {\n rawHtml: string\n isLoading: boolean\n isTrusted: boolean\n}): string | undefined {\n const { rawHtml, isLoading, isTrusted } = options\n return useMemo(() => {\n if (isLoading) {\n return undefined\n }\n if (isTrusted) {\n return rawHtml\n } else {\n return sanitize(rawHtml)\n }\n }, [isLoading, isTrusted, rawHtml])\n}\n\nexport type HtmlPreviewProps = {\n createdByUserId: string\n rawHtml: string\n}\n\n/**\n * Renders raw HTML. Uses file handle data to determine if the content should be sanitized.\n * @param props\n * @returns\n */\nexport default function HtmlPreview(props: HtmlPreviewProps) {\n const { createdByUserId, rawHtml } = props\n const frameEl = useRef(null)\n const [frameHeight, setFrameHeight] = useState(100)\n\n const { data: teamMembership, isLoading } = useGetIsUserMemberOfTeam(\n TRUSTED_HTML_USERS_TEAM_ID,\n createdByUserId,\n )\n const updateHeight = () => {\n if (frameEl?.current && frameEl?.current['contentWindow']) {\n let newHeightPx: number =\n frameEl.current['contentWindow']['document']['body']['scrollHeight']\n if (newHeightPx < 450) {\n newHeightPx = 450\n }\n if (!frameHeight || Math.abs(newHeightPx - frameHeight) > 70) {\n setFrameHeight(newHeightPx + 50)\n }\n }\n }\n useEffect(() => {\n setInterval(() => {\n updateHeight()\n }, 500)\n }, [rawHtml])\n const htmlIsCreatedByTrustedUser = !!teamMembership\n\n const cleanHtml = useCleanHtml({\n rawHtml,\n isLoading,\n isTrusted: htmlIsCreatedByTrustedUser,\n })\n\n if (isLoading) {\n return <SynapseSpinner />\n }\n\n return (\n <>\n {rawHtml !== cleanHtml && (\n <Alert severity=\"info\" sx={{ marginBottom: '20px' }}>\n Limited rendering only.\n </Alert>\n )}\n <iframe\n ref={frameEl}\n srcDoc={cleanHtml}\n height={`${frameHeight}px`}\n style={{ border: 0, width: '100%' }}\n />\n </>\n )\n}\n\nexport const EXPORTED_FOR_UNIT_TESTING = {\n useCleanHtml,\n}\n"],"mappings":";;;;;;;;AAWA,SAAS,EAAa,GAIC;CACrB,IAAM,EAAE,YAAS,cAAW,iBAAc;AAC1C,QAAO,QAAc;AACf,SAMF,QAHE,IACK,IAEA,EAAS,EAAQ;IAEzB;EAAC;EAAW;EAAW;EAAQ,CAAC;;AAarC,SAAwB,EAAY,GAAyB;CAC3D,IAAM,EAAE,oBAAiB,eAAY,GAC/B,IAAU,EAAO,KAAK,EACtB,CAAC,GAAa,KAAkB,EAAS,IAAI,EAE7C,EAAE,MAAM,GAAgB,iBAAc,EAC1C,GACA,EACD,EACK,UAAqB;AACzB,MAAI,GAAS,WAAW,GAAS,QAAQ,eAAkB;GACzD,IAAI,IACF,EAAQ,QAAQ,cAAiB,SAAY,KAAQ;AAIvD,GAHI,IAAc,QAChB,IAAc,OAEZ,CAAC,KAAe,KAAK,IAAI,IAAc,EAAY,GAAG,OACxD,EAAe,IAAc,GAAG;;;AAItC,SAAgB;AACd,oBAAkB;AAChB,MAAc;KACb,IAAI;IACN,CAAC,EAAQ,CAAC;CAGb,IAAM,IAAY,EAAa;EAC7B;EACA;EACA,
|
|
1
|
+
{"version":3,"file":"HtmlPreview.js","names":[],"sources":["../../../../src/components/FilePreview/HtmlPreview/HtmlPreview.tsx"],"sourcesContent":["import { useGetIsUserMemberOfTeam } from '@/synapse-queries/team/useTeamMembers'\nimport { sanitize } from '@/utils/functions/SanitizeHtmlUtils'\nimport { TRUSTED_HTML_USERS_TEAM_ID } from '@/utils/SynapseConstants'\nimport { Alert } from '@mui/material'\nimport { useEffect, useMemo, useRef, useState } from 'react'\nimport { SynapseSpinner } from '../../LoadingScreen/LoadingScreen'\n\n/**\n * @param options\n * @returns HTML that is cleaned if it is not trusted. undefined if `isLoading` is true.\n */\nfunction useCleanHtml(options: {\n rawHtml: string\n isLoading: boolean\n isTrusted: boolean\n}): string | undefined {\n const { rawHtml, isLoading, isTrusted } = options\n return useMemo(() => {\n if (isLoading) {\n return undefined\n }\n if (isTrusted) {\n return rawHtml\n } else {\n return sanitize(rawHtml)\n }\n }, [isLoading, isTrusted, rawHtml])\n}\n\nexport type HtmlPreviewProps = {\n createdByUserId: string\n rawHtml: string\n}\n\n/**\n * Renders raw HTML. Uses file handle data to determine if the content should be sanitized.\n * @param props\n * @returns\n */\nexport default function HtmlPreview(props: HtmlPreviewProps) {\n const { createdByUserId, rawHtml } = props\n const frameEl = useRef(null)\n const [frameHeight, setFrameHeight] = useState(100)\n\n const { data: teamMembership, isLoading } = useGetIsUserMemberOfTeam(\n TRUSTED_HTML_USERS_TEAM_ID,\n createdByUserId,\n )\n const updateHeight = () => {\n if (frameEl?.current && frameEl?.current['contentWindow']) {\n let newHeightPx: number =\n frameEl.current['contentWindow']['document']['body']['scrollHeight']\n if (newHeightPx < 450) {\n newHeightPx = 450\n }\n if (!frameHeight || Math.abs(newHeightPx - frameHeight) > 70) {\n setFrameHeight(newHeightPx + 50)\n }\n }\n }\n useEffect(() => {\n setInterval(() => {\n updateHeight()\n }, 500)\n }, [rawHtml])\n const htmlIsCreatedByTrustedUser = !!teamMembership\n\n const cleanHtml = useCleanHtml({\n rawHtml,\n isLoading,\n isTrusted: htmlIsCreatedByTrustedUser,\n })\n\n if (isLoading) {\n return <SynapseSpinner />\n }\n\n return (\n <>\n {rawHtml !== cleanHtml && (\n <Alert severity=\"info\" sx={{ marginBottom: '20px' }}>\n Limited rendering only.\n </Alert>\n )}\n <iframe\n ref={frameEl}\n srcDoc={cleanHtml}\n height={`${frameHeight}px`}\n style={{ border: 0, width: '100%' }}\n />\n </>\n )\n}\n\nexport const EXPORTED_FOR_UNIT_TESTING = {\n useCleanHtml,\n}\n"],"mappings":";;;;;;;;AAWA,SAAS,EAAa,GAIC;CACrB,IAAM,EAAE,YAAS,cAAW,iBAAc;AAC1C,QAAO,QAAc;AACf,SAMF,QAHE,IACK,IAEA,EAAS,EAAQ;IAEzB;EAAC;EAAW;EAAW;EAAQ,CAAC;;AAarC,SAAwB,EAAY,GAAyB;CAC3D,IAAM,EAAE,oBAAiB,eAAY,GAC/B,IAAU,EAAO,KAAK,EACtB,CAAC,GAAa,KAAkB,EAAS,IAAI,EAE7C,EAAE,MAAM,GAAgB,iBAAc,EAC1C,GACA,EACD,EACK,UAAqB;AACzB,MAAI,GAAS,WAAW,GAAS,QAAQ,eAAkB;GACzD,IAAI,IACF,EAAQ,QAAQ,cAAiB,SAAY,KAAQ;AAIvD,GAHI,IAAc,QAChB,IAAc,OAEZ,CAAC,KAAe,KAAK,IAAI,IAAc,EAAY,GAAG,OACxD,EAAe,IAAc,GAAG;;;AAItC,SAAgB;AACd,oBAAkB;AAChB,MAAc;KACb,IAAI;IACN,CAAC,EAAQ,CAAC;CAGb,IAAM,IAAY,EAAa;EAC7B;EACA;EACA,WAAW,CALuB,CAAC;EAMpC,CAAC;AAMF,QAJI,IACK,kBAAC,GAAD,EAAkB,CAAA,GAIzB,kBAAA,GAAA,EAAA,UAAA,CACG,MAAY,KACX,kBAAC,GAAD;EAAO,UAAS;EAAO,IAAI,EAAE,cAAc,QAAQ;YAAE;EAE7C,CAAA,EAEV,kBAAC,UAAD;EACE,KAAK;EACL,QAAQ;EACR,QAAQ,GAAG,EAAY;EACvB,OAAO;GAAE,QAAQ;GAAG,OAAO;GAAQ;EACnC,CAAA,CACD,EAAA,CAAA;;AAIP,IAAa,IAA4B,EACvC,iBACD"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PreviewRendererType.js","names":[],"sources":["../../../src/components/FilePreview/PreviewRendererType.ts"],"sourcesContent":["// Note: The PreviewRendererType is copied from SWC's PreviewWidget.PreviewFileType\n// Not all of these are supported by SRC, but we do need to support all of them for preview widget feature parity\n\n/**\n * Types of files that can be previewed. The PreviewFileType of a file handle can be determined based on its MIME type.\n * Each value corresponds to a particular renderer.\n */\nexport enum PreviewRendererType {\n PLAINTEXT = 'PLAINTEXT',\n CODE = 'CODE',\n ZIP = 'ZIP',\n CSV = 'CSV',\n IMAGE = 'IMAGE',\n NONE = 'NONE',\n TAB = 'TAB',\n HTML = 'HTML',\n PDF = 'PDF',\n IPYNB = 'IPYNB',\n VIDEO = 'VIDEO',\n MARKDOWN = 'MARKDOWN',\n TIFF = 'TIFF',\n}\n"],"mappings":";AAOA,IAAY,IAAL,yBAAA,GAAA;QACL,EAAA,
|
|
1
|
+
{"version":3,"file":"PreviewRendererType.js","names":[],"sources":["../../../src/components/FilePreview/PreviewRendererType.ts"],"sourcesContent":["// Note: The PreviewRendererType is copied from SWC's PreviewWidget.PreviewFileType\n// Not all of these are supported by SRC, but we do need to support all of them for preview widget feature parity\n\n/**\n * Types of files that can be previewed. The PreviewFileType of a file handle can be determined based on its MIME type.\n * Each value corresponds to a particular renderer.\n */\nexport enum PreviewRendererType {\n PLAINTEXT = 'PLAINTEXT',\n CODE = 'CODE',\n ZIP = 'ZIP',\n CSV = 'CSV',\n IMAGE = 'IMAGE',\n NONE = 'NONE',\n TAB = 'TAB',\n HTML = 'HTML',\n PDF = 'PDF',\n IPYNB = 'IPYNB',\n VIDEO = 'VIDEO',\n MARKDOWN = 'MARKDOWN',\n TIFF = 'TIFF',\n}\n"],"mappings":";AAOA,IAAY,IAAL,yBAAA,GAAA;QACL,EAAA,YAAY,aACZ,EAAA,OAAO,QACP,EAAA,MAAM,OACN,EAAA,MAAM,OACN,EAAA,QAAQ,SACR,EAAA,OAAO,QACP,EAAA,MAAM,OACN,EAAA,OAAO,QACP,EAAA,MAAM,OACN,EAAA,QAAQ,SACR,EAAA,QAAQ,SACR,EAAA,WAAW,YACX,EAAA,OAAO;KACR"}
|
|
@@ -2,6 +2,7 @@ import { DiscussionReplyBundle } from '@sage-bionetworks/synapse-types';
|
|
|
2
2
|
export type DiscussionReplyProps = {
|
|
3
3
|
reply: DiscussionReplyBundle;
|
|
4
4
|
isReplyAuthorModerator?: boolean;
|
|
5
|
+
isForumModerator?: boolean;
|
|
5
6
|
onClickLink?: () => void;
|
|
6
7
|
};
|
|
7
8
|
export declare function DiscussionReply(props: DiscussionReplyProps): import("react/jsx-runtime").JSX.Element;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DiscussionReply.d.ts","sourceRoot":"","sources":["../../../src/components/Forum/DiscussionReply.tsx"],"names":[],"mappings":"AAGA,OAAO,EACL,qBAAqB,EAEtB,MAAM,iCAAiC,CAAA;AAcxC,MAAM,MAAM,oBAAoB,GAAG;IACjC,KAAK,EAAE,qBAAqB,CAAA;IAC5B,sBAAsB,CAAC,EAAE,OAAO,CAAA;IAChC,WAAW,CAAC,EAAE,MAAM,IAAI,CAAA;CACzB,CAAA;AAUD,wBAAgB,eAAe,CAAC,KAAK,EAAE,oBAAoB,
|
|
1
|
+
{"version":3,"file":"DiscussionReply.d.ts","sourceRoot":"","sources":["../../../src/components/Forum/DiscussionReply.tsx"],"names":[],"mappings":"AAGA,OAAO,EACL,qBAAqB,EAEtB,MAAM,iCAAiC,CAAA;AAcxC,MAAM,MAAM,oBAAoB,GAAG;IACjC,KAAK,EAAE,qBAAqB,CAAA;IAC5B,sBAAsB,CAAC,EAAE,OAAO,CAAA;IAChC,gBAAgB,CAAC,EAAE,OAAO,CAAA;IAC1B,WAAW,CAAC,EAAE,MAAM,IAAI,CAAA;CACzB,CAAA;AAUD,wBAAgB,eAAe,CAAC,KAAK,EAAE,oBAAoB,2CA8H1D"}
|