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":"useGetSchemaForGrid.js","names":["useGetEntity","useGetSchema","GridSession","instanceOfEntityView","createComparator","createMerger","createShallowAllOfMerge","createDeduplicator","createIntersector","JSONSchema7","isObject","useMemo","compareSchemaDefinitions","compareSchemaValues","mergeArrayOfSchemaDefinitions","intersectJson","deduplicateJsonSchemaDef","shallowAllOfMerge","GRID_ENTITY_READONLY_PROPERTIES","addReadonlyToEntityProperties","jsonSchema","properties","updatedProperties","propertiesToMakeReadonly","forEach","prop","readOnly","useGetSchemaForGrid","session","$","_c","t0","gridJsonSchema$Id","t1","enabled","data","t2","sourceEntityId","t3","entityData","undefined","includeBaseEntitySchema","t4","select","entityJsonSchema","t5","t6","allOf"],"sources":["../../../../src/components/DataGrid/hooks/useGetSchemaForGrid.ts"],"sourcesContent":["import { useGetEntity, useGetSchema } from '@/synapse-queries/index'\nimport {\n GridSession,\n instanceOfEntityView,\n} from '@sage-bionetworks/synapse-client'\nimport {\n createComparator,\n createMerger,\n createShallowAllOfMerge,\n} from '@x0k/json-schema-merge'\nimport {\n createDeduplicator,\n createIntersector,\n} from '@x0k/json-schema-merge/lib/array'\nimport { JSONSchema7 } from 'json-schema'\nimport isObject from 'lodash-es/isObject'\nimport { useMemo } from 'react'\n\nconst { compareSchemaDefinitions, compareSchemaValues } = createComparator()\nconst { mergeArrayOfSchemaDefinitions } = createMerger({\n intersectJson: createIntersector(compareSchemaValues),\n deduplicateJsonSchemaDef: createDeduplicator(compareSchemaDefinitions),\n})\nconst shallowAllOfMerge = createShallowAllOfMerge(mergeArrayOfSchemaDefinitions)\n\nconst GRID_ENTITY_READONLY_PROPERTIES = [\n 'id',\n 'createdBy',\n 'createdOn',\n 'modifiedBy',\n 'modifiedOn',\n 'etag',\n 'concreteType',\n 'parentId',\n 'path',\n 'type',\n 'currentVersion',\n 'benefactorId',\n]\n\n/**\n * The Synapse JSON Schemas for entities do not indicate which properties should be readOnly.\n * Amend the schema to mark certain properties as readOnly so they cannot be edited in the grid.\n */\nfunction addReadonlyToEntityProperties(jsonSchema: JSONSchema7): JSONSchema7 {\n if (!jsonSchema.properties) {\n return jsonSchema\n }\n\n const updatedProperties = { ...jsonSchema.properties }\n\n // List of properties to mark as read-only\n const propertiesToMakeReadonly = GRID_ENTITY_READONLY_PROPERTIES\n\n propertiesToMakeReadonly.forEach(prop => {\n if (updatedProperties[prop]) {\n updatedProperties[prop] = {\n ...(isObject(updatedProperties[prop]) ? updatedProperties[prop] : {}),\n readOnly: true,\n }\n } else {\n updatedProperties[prop] = { readOnly: true }\n }\n })\n\n return {\n ...jsonSchema,\n properties: updatedProperties,\n }\n}\n\n/**\n * Hook to get the JSON schema for a Data Grid, merging in the base Entity schema if the source entity is an EntityView.\n * @param session - The GridSession object.\n */\nexport default function useGetSchemaForGrid(session: GridSession | null) {\n const { data: jsonSchema } = useGetSchema(session?.gridJsonSchema$Id ?? '', {\n enabled: !!session?.gridJsonSchema$Id,\n })\n\n const { data: entityData } = useGetEntity(\n session?.sourceEntityId,\n undefined,\n {\n enabled: !!session?.sourceEntityId,\n },\n )\n\n let includeBaseEntitySchema = false\n if (entityData && instanceOfEntityView(entityData)) {\n includeBaseEntitySchema = true\n }\n\n const { data: entityJsonSchema } = useGetSchema(\n 'org.sagebionetworks-repo.model.Entity',\n {\n enabled: includeBaseEntitySchema,\n select: addReadonlyToEntityProperties,\n },\n )\n\n return useMemo(() => {\n if (jsonSchema && entityJsonSchema) {\n return shallowAllOfMerge({\n allOf: [entityJsonSchema, jsonSchema],\n }) as JSONSchema7\n } else {\n return jsonSchema\n }\n }, [jsonSchema, entityJsonSchema])\n}\n"],"mappings":";;;;;;;;;AAkBA,IAAM,EAAEY,6BAA0BC,2BAAwBT,GAAkB,EACtE,EAAEU,qCAAkCT,EAAa;CACrDU,eAAeP,EAAkBK,EAAoB;CACrDG,0BAA0BT,EAAmBK,EAAwB;CACtE,CAAC,EACIK,IAAoBX,EAAwBQ,EAA8B,EAE1EI,IAAkC;CACtC;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACD;AAMD,SAASC,EAA8BC,GAAsC;AAC3E,KAAI,CAACA,EAAWC,WACd,QAAOD;CAGT,IAAME,IAAoB,EAAE,GAAGF,EAAWC,YAAY;AAgBtD,
|
|
1
|
+
{"version":3,"file":"useGetSchemaForGrid.js","names":["useGetEntity","useGetSchema","GridSession","instanceOfEntityView","createComparator","createMerger","createShallowAllOfMerge","createDeduplicator","createIntersector","JSONSchema7","isObject","useMemo","compareSchemaDefinitions","compareSchemaValues","mergeArrayOfSchemaDefinitions","intersectJson","deduplicateJsonSchemaDef","shallowAllOfMerge","GRID_ENTITY_READONLY_PROPERTIES","addReadonlyToEntityProperties","jsonSchema","properties","updatedProperties","propertiesToMakeReadonly","forEach","prop","readOnly","useGetSchemaForGrid","session","$","_c","t0","gridJsonSchema$Id","t1","enabled","data","t2","sourceEntityId","t3","entityData","undefined","includeBaseEntitySchema","t4","select","entityJsonSchema","t5","t6","allOf"],"sources":["../../../../src/components/DataGrid/hooks/useGetSchemaForGrid.ts"],"sourcesContent":["import { useGetEntity, useGetSchema } from '@/synapse-queries/index'\nimport {\n GridSession,\n instanceOfEntityView,\n} from '@sage-bionetworks/synapse-client'\nimport {\n createComparator,\n createMerger,\n createShallowAllOfMerge,\n} from '@x0k/json-schema-merge'\nimport {\n createDeduplicator,\n createIntersector,\n} from '@x0k/json-schema-merge/lib/array'\nimport { JSONSchema7 } from 'json-schema'\nimport isObject from 'lodash-es/isObject'\nimport { useMemo } from 'react'\n\nconst { compareSchemaDefinitions, compareSchemaValues } = createComparator()\nconst { mergeArrayOfSchemaDefinitions } = createMerger({\n intersectJson: createIntersector(compareSchemaValues),\n deduplicateJsonSchemaDef: createDeduplicator(compareSchemaDefinitions),\n})\nconst shallowAllOfMerge = createShallowAllOfMerge(mergeArrayOfSchemaDefinitions)\n\nconst GRID_ENTITY_READONLY_PROPERTIES = [\n 'id',\n 'createdBy',\n 'createdOn',\n 'modifiedBy',\n 'modifiedOn',\n 'etag',\n 'concreteType',\n 'parentId',\n 'path',\n 'type',\n 'currentVersion',\n 'benefactorId',\n]\n\n/**\n * The Synapse JSON Schemas for entities do not indicate which properties should be readOnly.\n * Amend the schema to mark certain properties as readOnly so they cannot be edited in the grid.\n */\nfunction addReadonlyToEntityProperties(jsonSchema: JSONSchema7): JSONSchema7 {\n if (!jsonSchema.properties) {\n return jsonSchema\n }\n\n const updatedProperties = { ...jsonSchema.properties }\n\n // List of properties to mark as read-only\n const propertiesToMakeReadonly = GRID_ENTITY_READONLY_PROPERTIES\n\n propertiesToMakeReadonly.forEach(prop => {\n if (updatedProperties[prop]) {\n updatedProperties[prop] = {\n ...(isObject(updatedProperties[prop]) ? updatedProperties[prop] : {}),\n readOnly: true,\n }\n } else {\n updatedProperties[prop] = { readOnly: true }\n }\n })\n\n return {\n ...jsonSchema,\n properties: updatedProperties,\n }\n}\n\n/**\n * Hook to get the JSON schema for a Data Grid, merging in the base Entity schema if the source entity is an EntityView.\n * @param session - The GridSession object.\n */\nexport default function useGetSchemaForGrid(session: GridSession | null) {\n const { data: jsonSchema } = useGetSchema(session?.gridJsonSchema$Id ?? '', {\n enabled: !!session?.gridJsonSchema$Id,\n })\n\n const { data: entityData } = useGetEntity(\n session?.sourceEntityId,\n undefined,\n {\n enabled: !!session?.sourceEntityId,\n },\n )\n\n let includeBaseEntitySchema = false\n if (entityData && instanceOfEntityView(entityData)) {\n includeBaseEntitySchema = true\n }\n\n const { data: entityJsonSchema } = useGetSchema(\n 'org.sagebionetworks-repo.model.Entity',\n {\n enabled: includeBaseEntitySchema,\n select: addReadonlyToEntityProperties,\n },\n )\n\n return useMemo(() => {\n if (jsonSchema && entityJsonSchema) {\n return shallowAllOfMerge({\n allOf: [entityJsonSchema, jsonSchema],\n }) as JSONSchema7\n } else {\n return jsonSchema\n }\n }, [jsonSchema, entityJsonSchema])\n}\n"],"mappings":";;;;;;;;;AAkBA,IAAM,EAAEY,6BAA0BC,2BAAwBT,GAAkB,EACtE,EAAEU,qCAAkCT,EAAa;CACrDU,eAAeP,EAAkBK,EAAoB;CACrDG,0BAA0BT,EAAmBK,EAAwB;CACtE,CAAC,EACIK,IAAoBX,EAAwBQ,EAA8B,EAE1EI,IAAkC;CACtC;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACD;AAMD,SAASC,EAA8BC,GAAsC;AAC3E,KAAI,CAACA,EAAWC,WACd,QAAOD;CAGT,IAAME,IAAoB,EAAE,GAAGF,EAAWC,YAAY;AAgBtD,QAXAE,EAAyBC,SAAQC,MAAQ;AACvC,EAAIH,EAAkBG,KACpBH,EAAkBG,KAAQ;GACxB,GAAIf,EAASY,EAAkBG,GAAM,GAAGH,EAAkBG,KAAQ,EAAE;GACpEC,UAAU;GACX,GAEDJ,EAAkBG,KAAQ,EAAEC,UAAU,IAAM;GAE9C,EAEK;EACL,GAAGN;EACHC,YAAYC;EACb;;AAOH,SAAeK,EAAAC,GAAA;CAAA,IAAAC,IAAAC,EAAA,EAAA,EAEFC,IAAA,CAAC,CAACH,GAAOI,mBAAmBC;AAAA,CAAAJ,EAAA,OAAAE,IACtCE,IAAAJ,EAAA,MAF2EI,IAAA,EAAAC,SACjEH,GACV,EAAAF,EAAA,KAAAE,GAAAF,EAAA,KAAAI;CAFD,IAAA,EAAAE,MAAAf,MAA6BnB,EAAa2B,GAAOI,qBAAP,IAAkCC,EAE1E,EAMWG,IAAA,CAAC,CAACR,GAAOS,gBAAgBC;AAAA,CAAAT,EAAA,OAAAO,IACnCE,IAAAT,EAAA,MAFDS,IAAA,EAAAJ,SACWE,GACV,EAAAP,EAAA,KAAAO,GAAAP,EAAA,KAAAS;CALH,IAAA,EAAAH,MAAAI,MAA6BvC,EAC3B4B,GAAOS,gBACPG,KAAAA,GACAF,EAGD,EAEDG,IAA8B;AAC9B,CAAIF,KAAcpC,EAAqBoC,EAAW,KAChDE,IAA0BA;CAC3B,IAAAC;AAAA,CAAAb,EAAA,OAAAY,IAOEC,IAAAb,EAAA,MAHDa,IAAA;EAAAR,SACWO;EAAuBE,QACxBxB;EACT,EAAAU,EAAA,KAAAY,GAAAZ,EAAA,KAAAa;CALH,IAAA,EAAAP,MAAAS,MAAmC3C,EACjC,yCACAyC,EAID,EAAAG;AAGC,KAAIzB,KAAAwB,GAA8B;EAAA,IAAAE;AAChCD,EADgChB,EAAA,OAAAe,KAAAf,EAAA,OAAAT,KACzB0B,IAAA7B,EAAkB,EAAA8B,OAChB,CAACH,GAAkBxB,EAAU,EACrC,CAAC,EAAAS,EAAA,KAAAe,GAAAf,EAAA,KAAAT,GAAAS,EAAA,KAAAiB,KAAAA,IAAAjB,EAAA,IAFFgB,IAAOC;OAIPD,KAAOzB;AACR,QAPIyB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useGridUndoRedo.js","names":["GridMenuButton","KeyboardArrowDownIcon","Menu","MenuItem","useCallback","useEffect","useState","DataGridRow","Operation","ModelChange","convertActionToModelChange","useStack","SingleGridAction","type","rowIndex","previousValue","newValue","CompositeGridAction","actions","GridAction","batchGridActions","MAX_UNDO_STEPS","MAX_REDO_STEPS","useGridUndoRedo","onApplyModelChange","$","_c","t0","Symbol","for","undoStack","t1","redoStack","undoAnchorEl","setUndoAnchorEl","redoAnchorEl","setRedoAnchorEl","undoOpen","Boolean","redoOpen","t2","event","currentTarget","handleUndoClick","t3","event_0","handleRedoClick","t4","handleUndoClose","t5","handleRedoClose","t6","isEmpty","lastAction","peek","lastType","sameTypeCount","i","stack","length","i_0","totalActions","size","getUndoPreview","t7","lastAction_0","sameTypeCount_0","i_1","getRedoPreview","t8","undoPreview","t9","redoPreview","t10","actionToUndo","pop","i_2","child","inverseOp","push","inverseOperation","handleUndo","t11","actionToRedo","i_3","child_0","originalOp","originalOperation","handleRedo","t12","t13","handleKeyDown","event_1","ctrlKey","key","shiftKey","metaKey","preventDefault","window","addEventListener","removeEventListener","t14","action","addToUndoStack","t15","clear","clearUndoStack","t16","clearRedoStack","t17","operations","rowValues","batch","operation","start","fromRowIndex","end","toRowIndex","i_4","newRow","oldVal","slice","newVal","forEach","newRow_0","idx","oldRow","deletedRows","row","idx_0","addOperationsToUndoStack","t18","undefined","t19","t20","t21","t22","t23","toLowerCase","t24","t25","undoUI","t26","t27","t28","t29","t30","t31","t32","t33","redoUI","t34","t35","t36","undoTotalActions","redoTotalActions"],"sources":["../../../../src/components/DataGrid/hooks/useGridUndoRedo.tsx"],"sourcesContent":["import GridMenuButton from '@/components/DataGrid/components/GridMenuButton/GridMenuButton'\nimport KeyboardArrowDownIcon from '@mui/icons-material/KeyboardArrowDown'\nimport { Menu, MenuItem } from '@mui/material'\nimport { useCallback, useEffect, useState } from 'react'\nimport { DataGridRow, Operation } from '../DataGridTypes'\nimport { ModelChange } from '../utils/applyModelChange'\nimport { convertActionToModelChange } from '../utils/convertActionToModelChange'\nimport { useStack } from './useStack'\n\n/**\n * Represents a single action in the grid that can be undone or redone\n */\nexport type SingleGridAction = {\n type: 'CREATE' | 'DELETE' | 'UPDATE'\n rowIndex: number\n previousValue?: DataGridRow\n newValue?: DataGridRow\n}\n\n/**\n * Composite action for batch undo/redo\n */\nexport type CompositeGridAction = {\n type: 'COMPOSITE'\n actions: SingleGridAction[]\n}\n\n/**\n * GridAction can be a single or composite action\n */\nexport type GridAction = SingleGridAction | CompositeGridAction\n\n/**\n * Helper to batch multiple single actions into a composite action\n */\nexport function batchGridActions(\n actions: SingleGridAction[],\n): CompositeGridAction {\n return {\n type: 'COMPOSITE',\n actions,\n }\n}\n\nconst MAX_UNDO_STEPS = 100\nconst MAX_REDO_STEPS = 100\n\n/**\n * Hook to manage undo/redo functionality for a grid backed by a CRDT model.\n *\n * @param onApplyModelChange - Function to apply model changes and commit\n */\nexport function useGridUndoRedo(\n onApplyModelChange: (change: ModelChange) => void,\n) {\n // Tracks the stack of undoable actions in LIFO order\n const undoStack = useStack<GridAction>([], MAX_UNDO_STEPS)\n const redoStack = useStack<GridAction>([], MAX_REDO_STEPS)\n\n // Separate state for undo and redo menus\n const [undoAnchorEl, setUndoAnchorEl] = useState<null | HTMLElement>(null)\n const [redoAnchorEl, setRedoAnchorEl] = useState<null | HTMLElement>(null)\n const undoOpen = Boolean(undoAnchorEl)\n const redoOpen = Boolean(redoAnchorEl)\n\n const handleUndoClick = (event: React.MouseEvent<HTMLButtonElement>) => {\n setUndoAnchorEl(event.currentTarget)\n }\n\n const handleRedoClick = (event: React.MouseEvent<HTMLButtonElement>) => {\n setRedoAnchorEl(event.currentTarget)\n }\n\n const handleUndoClose = () => setUndoAnchorEl(null)\n const handleRedoClose = () => setRedoAnchorEl(null)\n\n // Generate preview information for the undo menu\n const getUndoPreview = useCallback(() => {\n if (undoStack.isEmpty()) return null\n\n const lastAction = undoStack.peek()\n let lastType: string\n let sameTypeCount = 0\n\n if (lastAction.type === 'COMPOSITE') {\n lastType = 'COMPOSITE'\n // Count consecutive composites from the end\n for (let i = undoStack.stack.length - 1; i >= 0; i--) {\n if (undoStack.stack[i].type === 'COMPOSITE') {\n sameTypeCount++\n } else {\n break\n }\n }\n } else {\n lastType = lastAction.type\n for (let i = undoStack.stack.length - 1; i >= 0; i--) {\n if (undoStack.stack[i].type === lastType) {\n sameTypeCount++\n } else {\n break\n }\n }\n }\n\n return {\n lastType,\n sameTypeCount,\n totalActions: undoStack.size,\n }\n }, [undoStack])\n\n // Generate preview information for the redo menu\n const getRedoPreview = useCallback(() => {\n if (redoStack.isEmpty()) return null\n\n const lastAction = redoStack.peek()\n let lastType: string\n let sameTypeCount = 0\n\n if (lastAction.type === 'COMPOSITE') {\n lastType = 'COMPOSITE'\n // Always treat composite as a single atomic action for preview\n sameTypeCount = 1\n } else {\n lastType = lastAction.type\n for (let i = redoStack.stack.length - 1; i >= 0; i--) {\n if (redoStack.stack[i].type === lastType) {\n sameTypeCount++\n } else {\n break\n }\n }\n }\n\n return {\n lastType,\n sameTypeCount,\n totalActions: redoStack.size,\n }\n }, [redoStack])\n\n const undoPreview = getUndoPreview()\n const redoPreview = getRedoPreview()\n\n /**\n * Undo the most recent action\n */\n const handleUndo = useCallback(() => {\n if (undoStack.isEmpty()) return\n const actionToUndo = undoStack.pop()\n if (actionToUndo) {\n // If composite, undo all child actions in reverse order\n if (actionToUndo.type === 'COMPOSITE') {\n for (let i = actionToUndo.actions.length - 1; i >= 0; i--) {\n const child = actionToUndo.actions[i]\n const inverseOp = convertActionToModelChange(child, 'undo')\n if (inverseOp) {\n onApplyModelChange(inverseOp)\n }\n }\n // Push the composite action itself to the redo stack\n redoStack.push(actionToUndo)\n } else {\n const inverseOperation = convertActionToModelChange(\n actionToUndo,\n 'undo',\n )\n if (!inverseOperation) return\n onApplyModelChange(inverseOperation)\n // Push the single action to the redo stack\n redoStack.push(actionToUndo)\n }\n }\n handleUndoClose()\n }, [onApplyModelChange, undoStack, redoStack])\n\n /**\n * Redo the most recent undone action\n */\n const handleRedo = useCallback(() => {\n if (redoStack.isEmpty()) return\n\n const actionToRedo = redoStack.pop()\n\n if (actionToRedo) {\n // If composite, redo all child actions in order\n if (actionToRedo.type === 'COMPOSITE') {\n for (let i = 0; i < actionToRedo.actions.length; i++) {\n const child = actionToRedo.actions[i]\n const originalOp = convertActionToModelChange(child, 'redo')\n if (originalOp) {\n onApplyModelChange(originalOp)\n }\n }\n // Push the composite action itself back to the undo stack\n undoStack.push(actionToRedo)\n } else {\n const originalOperation = convertActionToModelChange(\n actionToRedo,\n 'redo',\n )\n if (!originalOperation) return\n onApplyModelChange(originalOperation)\n // Push the single action back to the undo stack\n undoStack.push(actionToRedo)\n }\n }\n handleRedoClose()\n }, [redoStack, undoStack, onApplyModelChange])\n\n // Keyboard shortcuts for both undo and redo\n useEffect(() => {\n const handleKeyDown = (event: KeyboardEvent) => {\n if (\n (event.ctrlKey && event.key === 'z' && !event.shiftKey) ||\n (event.metaKey && event.key === 'z' && !event.shiftKey)\n ) {\n event.preventDefault()\n handleUndo()\n } else if (\n (event.ctrlKey && event.key === 'y') ||\n (event.ctrlKey && event.shiftKey && event.key === 'z') ||\n (event.metaKey && event.shiftKey && event.key === 'z')\n ) {\n event.preventDefault()\n handleRedo()\n }\n }\n\n window.addEventListener('keydown', handleKeyDown)\n return () => {\n window.removeEventListener('keydown', handleKeyDown)\n }\n }, [handleUndo, handleRedo])\n\n const addToUndoStack = (action: GridAction) => {\n undoStack.push(action)\n }\n\n const clearUndoStack = () => undoStack.clear()\n\n const clearRedoStack = () => redoStack.clear()\n\n const addOperationsToUndoStack = (\n operations: Operation[],\n rowValues: DataGridRow[],\n newValue: DataGridRow[],\n ) => {\n // Clear redo stack since new changes invalidate redo history\n clearRedoStack()\n\n const batch: SingleGridAction[] = []\n\n for (const operation of operations) {\n const start = operation.fromRowIndex\n const end = operation.toRowIndex\n\n if (operation.type === 'CREATE') {\n for (let i = start; i < end; i++) {\n const newRow = newValue[i]\n batch.push({\n type: 'CREATE',\n rowIndex: i,\n newValue: newRow,\n })\n }\n }\n\n if (operation.type === 'UPDATE') {\n const oldVal = rowValues.slice(start, end)\n const newVal = newValue.slice(start, end)\n\n newVal.forEach((newRow: DataGridRow, idx: number) => {\n const oldRow = oldVal[idx]\n const rowIndex = start + idx\n batch.push({\n type: 'UPDATE',\n rowIndex,\n previousValue: oldRow,\n newValue: newRow,\n })\n })\n }\n\n if (operation.type === 'DELETE') {\n const deletedRows = rowValues.slice(start, end)\n deletedRows.forEach((row, idx) => {\n batch.push({\n type: 'DELETE',\n rowIndex: start + idx,\n previousValue: row,\n })\n })\n }\n }\n if (batch.length === 1) {\n addToUndoStack(batch[0])\n } else if (batch.length > 1) {\n addToUndoStack(batchGridActions(batch))\n }\n }\n\n const undoUI = (\n <>\n <GridMenuButton\n variant={'outlined'}\n aria-controls={undoOpen ? 'undo-menu' : undefined}\n aria-haspopup=\"true\"\n onClick={handleUndoClick}\n disabled={!undoPreview}\n endIcon={<KeyboardArrowDownIcon />}\n >\n Undo {undoPreview && `(${undoPreview.totalActions})`}\n </GridMenuButton>\n <Menu\n id=\"undo-menu\"\n anchorEl={undoAnchorEl}\n open={undoOpen}\n onClose={handleUndoClose}\n >\n {undoPreview ? (\n <MenuItem key=\"lastAction\" onClick={handleUndo}>\n Undo last {undoPreview.lastType.toLowerCase()} action\n </MenuItem>\n ) : (\n <MenuItem disabled>No actions to undo</MenuItem>\n )}\n </Menu>\n </>\n )\n\n const redoUI = (\n <>\n <GridMenuButton\n variant={'outlined'}\n aria-controls={redoOpen ? 'redo-menu' : undefined}\n aria-haspopup=\"true\"\n onClick={handleRedoClick}\n disabled={!redoPreview}\n endIcon={<KeyboardArrowDownIcon />}\n >\n Redo {redoPreview && `(${redoPreview.totalActions})`}\n </GridMenuButton>\n <Menu\n id=\"redo-menu\"\n anchorEl={redoAnchorEl}\n open={redoOpen}\n onClose={handleRedoClose}\n >\n {redoPreview ? (\n <MenuItem key=\"lastAction\" onClick={handleRedo}>\n Redo last {redoPreview.lastType.toLowerCase()} action\n </MenuItem>\n ) : (\n <MenuItem disabled>No actions to redo</MenuItem>\n )}\n </Menu>\n </>\n )\n\n return {\n // Undo\n undoPreview,\n handleUndo,\n addToUndoStack,\n clearUndoStack,\n addOperationsToUndoStack,\n undoUI,\n undoTotalActions: undoPreview ? undoPreview.totalActions : 0,\n\n // Redo\n redoPreview,\n redoUI,\n redoTotalActions: redoPreview ? redoPreview.totalActions : 0,\n handleRedo,\n clearRedoStack,\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"useGridUndoRedo.js","names":["GridMenuButton","KeyboardArrowDownIcon","Menu","MenuItem","useCallback","useEffect","useState","DataGridRow","Operation","ModelChange","convertActionToModelChange","useStack","SingleGridAction","type","rowIndex","previousValue","newValue","CompositeGridAction","actions","GridAction","batchGridActions","MAX_UNDO_STEPS","MAX_REDO_STEPS","useGridUndoRedo","onApplyModelChange","$","_c","t0","Symbol","for","undoStack","t1","redoStack","undoAnchorEl","setUndoAnchorEl","redoAnchorEl","setRedoAnchorEl","undoOpen","Boolean","redoOpen","t2","event","currentTarget","handleUndoClick","t3","event_0","handleRedoClick","t4","handleUndoClose","t5","handleRedoClose","t6","isEmpty","lastAction","peek","lastType","sameTypeCount","i","stack","length","i_0","totalActions","size","getUndoPreview","t7","lastAction_0","sameTypeCount_0","i_1","getRedoPreview","t8","undoPreview","t9","redoPreview","t10","actionToUndo","pop","i_2","child","inverseOp","push","inverseOperation","handleUndo","t11","actionToRedo","i_3","child_0","originalOp","originalOperation","handleRedo","t12","t13","handleKeyDown","event_1","ctrlKey","key","shiftKey","metaKey","preventDefault","window","addEventListener","removeEventListener","t14","action","addToUndoStack","t15","clear","clearUndoStack","t16","clearRedoStack","t17","operations","rowValues","batch","operation","start","fromRowIndex","end","toRowIndex","i_4","newRow","oldVal","slice","newVal","forEach","newRow_0","idx","oldRow","deletedRows","row","idx_0","addOperationsToUndoStack","t18","undefined","t19","t20","t21","t22","t23","toLowerCase","t24","t25","undoUI","t26","t27","t28","t29","t30","t31","t32","t33","redoUI","t34","t35","t36","undoTotalActions","redoTotalActions"],"sources":["../../../../src/components/DataGrid/hooks/useGridUndoRedo.tsx"],"sourcesContent":["import GridMenuButton from '@/components/DataGrid/components/GridMenuButton/GridMenuButton'\nimport KeyboardArrowDownIcon from '@mui/icons-material/KeyboardArrowDown'\nimport { Menu, MenuItem } from '@mui/material'\nimport { useCallback, useEffect, useState } from 'react'\nimport { DataGridRow, Operation } from '../DataGridTypes'\nimport { ModelChange } from '../utils/applyModelChange'\nimport { convertActionToModelChange } from '../utils/convertActionToModelChange'\nimport { useStack } from './useStack'\n\n/**\n * Represents a single action in the grid that can be undone or redone\n */\nexport type SingleGridAction = {\n type: 'CREATE' | 'DELETE' | 'UPDATE'\n rowIndex: number\n previousValue?: DataGridRow\n newValue?: DataGridRow\n}\n\n/**\n * Composite action for batch undo/redo\n */\nexport type CompositeGridAction = {\n type: 'COMPOSITE'\n actions: SingleGridAction[]\n}\n\n/**\n * GridAction can be a single or composite action\n */\nexport type GridAction = SingleGridAction | CompositeGridAction\n\n/**\n * Helper to batch multiple single actions into a composite action\n */\nexport function batchGridActions(\n actions: SingleGridAction[],\n): CompositeGridAction {\n return {\n type: 'COMPOSITE',\n actions,\n }\n}\n\nconst MAX_UNDO_STEPS = 100\nconst MAX_REDO_STEPS = 100\n\n/**\n * Hook to manage undo/redo functionality for a grid backed by a CRDT model.\n *\n * @param onApplyModelChange - Function to apply model changes and commit\n */\nexport function useGridUndoRedo(\n onApplyModelChange: (change: ModelChange) => void,\n) {\n // Tracks the stack of undoable actions in LIFO order\n const undoStack = useStack<GridAction>([], MAX_UNDO_STEPS)\n const redoStack = useStack<GridAction>([], MAX_REDO_STEPS)\n\n // Separate state for undo and redo menus\n const [undoAnchorEl, setUndoAnchorEl] = useState<null | HTMLElement>(null)\n const [redoAnchorEl, setRedoAnchorEl] = useState<null | HTMLElement>(null)\n const undoOpen = Boolean(undoAnchorEl)\n const redoOpen = Boolean(redoAnchorEl)\n\n const handleUndoClick = (event: React.MouseEvent<HTMLButtonElement>) => {\n setUndoAnchorEl(event.currentTarget)\n }\n\n const handleRedoClick = (event: React.MouseEvent<HTMLButtonElement>) => {\n setRedoAnchorEl(event.currentTarget)\n }\n\n const handleUndoClose = () => setUndoAnchorEl(null)\n const handleRedoClose = () => setRedoAnchorEl(null)\n\n // Generate preview information for the undo menu\n const getUndoPreview = useCallback(() => {\n if (undoStack.isEmpty()) return null\n\n const lastAction = undoStack.peek()\n let lastType: string\n let sameTypeCount = 0\n\n if (lastAction.type === 'COMPOSITE') {\n lastType = 'COMPOSITE'\n // Count consecutive composites from the end\n for (let i = undoStack.stack.length - 1; i >= 0; i--) {\n if (undoStack.stack[i].type === 'COMPOSITE') {\n sameTypeCount++\n } else {\n break\n }\n }\n } else {\n lastType = lastAction.type\n for (let i = undoStack.stack.length - 1; i >= 0; i--) {\n if (undoStack.stack[i].type === lastType) {\n sameTypeCount++\n } else {\n break\n }\n }\n }\n\n return {\n lastType,\n sameTypeCount,\n totalActions: undoStack.size,\n }\n }, [undoStack])\n\n // Generate preview information for the redo menu\n const getRedoPreview = useCallback(() => {\n if (redoStack.isEmpty()) return null\n\n const lastAction = redoStack.peek()\n let lastType: string\n let sameTypeCount = 0\n\n if (lastAction.type === 'COMPOSITE') {\n lastType = 'COMPOSITE'\n // Always treat composite as a single atomic action for preview\n sameTypeCount = 1\n } else {\n lastType = lastAction.type\n for (let i = redoStack.stack.length - 1; i >= 0; i--) {\n if (redoStack.stack[i].type === lastType) {\n sameTypeCount++\n } else {\n break\n }\n }\n }\n\n return {\n lastType,\n sameTypeCount,\n totalActions: redoStack.size,\n }\n }, [redoStack])\n\n const undoPreview = getUndoPreview()\n const redoPreview = getRedoPreview()\n\n /**\n * Undo the most recent action\n */\n const handleUndo = useCallback(() => {\n if (undoStack.isEmpty()) return\n const actionToUndo = undoStack.pop()\n if (actionToUndo) {\n // If composite, undo all child actions in reverse order\n if (actionToUndo.type === 'COMPOSITE') {\n for (let i = actionToUndo.actions.length - 1; i >= 0; i--) {\n const child = actionToUndo.actions[i]\n const inverseOp = convertActionToModelChange(child, 'undo')\n if (inverseOp) {\n onApplyModelChange(inverseOp)\n }\n }\n // Push the composite action itself to the redo stack\n redoStack.push(actionToUndo)\n } else {\n const inverseOperation = convertActionToModelChange(\n actionToUndo,\n 'undo',\n )\n if (!inverseOperation) return\n onApplyModelChange(inverseOperation)\n // Push the single action to the redo stack\n redoStack.push(actionToUndo)\n }\n }\n handleUndoClose()\n }, [onApplyModelChange, undoStack, redoStack])\n\n /**\n * Redo the most recent undone action\n */\n const handleRedo = useCallback(() => {\n if (redoStack.isEmpty()) return\n\n const actionToRedo = redoStack.pop()\n\n if (actionToRedo) {\n // If composite, redo all child actions in order\n if (actionToRedo.type === 'COMPOSITE') {\n for (let i = 0; i < actionToRedo.actions.length; i++) {\n const child = actionToRedo.actions[i]\n const originalOp = convertActionToModelChange(child, 'redo')\n if (originalOp) {\n onApplyModelChange(originalOp)\n }\n }\n // Push the composite action itself back to the undo stack\n undoStack.push(actionToRedo)\n } else {\n const originalOperation = convertActionToModelChange(\n actionToRedo,\n 'redo',\n )\n if (!originalOperation) return\n onApplyModelChange(originalOperation)\n // Push the single action back to the undo stack\n undoStack.push(actionToRedo)\n }\n }\n handleRedoClose()\n }, [redoStack, undoStack, onApplyModelChange])\n\n // Keyboard shortcuts for both undo and redo\n useEffect(() => {\n const handleKeyDown = (event: KeyboardEvent) => {\n if (\n (event.ctrlKey && event.key === 'z' && !event.shiftKey) ||\n (event.metaKey && event.key === 'z' && !event.shiftKey)\n ) {\n event.preventDefault()\n handleUndo()\n } else if (\n (event.ctrlKey && event.key === 'y') ||\n (event.ctrlKey && event.shiftKey && event.key === 'z') ||\n (event.metaKey && event.shiftKey && event.key === 'z')\n ) {\n event.preventDefault()\n handleRedo()\n }\n }\n\n window.addEventListener('keydown', handleKeyDown)\n return () => {\n window.removeEventListener('keydown', handleKeyDown)\n }\n }, [handleUndo, handleRedo])\n\n const addToUndoStack = (action: GridAction) => {\n undoStack.push(action)\n }\n\n const clearUndoStack = () => undoStack.clear()\n\n const clearRedoStack = () => redoStack.clear()\n\n const addOperationsToUndoStack = (\n operations: Operation[],\n rowValues: DataGridRow[],\n newValue: DataGridRow[],\n ) => {\n // Clear redo stack since new changes invalidate redo history\n clearRedoStack()\n\n const batch: SingleGridAction[] = []\n\n for (const operation of operations) {\n const start = operation.fromRowIndex\n const end = operation.toRowIndex\n\n if (operation.type === 'CREATE') {\n for (let i = start; i < end; i++) {\n const newRow = newValue[i]\n batch.push({\n type: 'CREATE',\n rowIndex: i,\n newValue: newRow,\n })\n }\n }\n\n if (operation.type === 'UPDATE') {\n const oldVal = rowValues.slice(start, end)\n const newVal = newValue.slice(start, end)\n\n newVal.forEach((newRow: DataGridRow, idx: number) => {\n const oldRow = oldVal[idx]\n const rowIndex = start + idx\n batch.push({\n type: 'UPDATE',\n rowIndex,\n previousValue: oldRow,\n newValue: newRow,\n })\n })\n }\n\n if (operation.type === 'DELETE') {\n const deletedRows = rowValues.slice(start, end)\n deletedRows.forEach((row, idx) => {\n batch.push({\n type: 'DELETE',\n rowIndex: start + idx,\n previousValue: row,\n })\n })\n }\n }\n if (batch.length === 1) {\n addToUndoStack(batch[0])\n } else if (batch.length > 1) {\n addToUndoStack(batchGridActions(batch))\n }\n }\n\n const undoUI = (\n <>\n <GridMenuButton\n variant={'outlined'}\n aria-controls={undoOpen ? 'undo-menu' : undefined}\n aria-haspopup=\"true\"\n onClick={handleUndoClick}\n disabled={!undoPreview}\n endIcon={<KeyboardArrowDownIcon />}\n >\n Undo {undoPreview && `(${undoPreview.totalActions})`}\n </GridMenuButton>\n <Menu\n id=\"undo-menu\"\n anchorEl={undoAnchorEl}\n open={undoOpen}\n onClose={handleUndoClose}\n >\n {undoPreview ? (\n <MenuItem key=\"lastAction\" onClick={handleUndo}>\n Undo last {undoPreview.lastType.toLowerCase()} action\n </MenuItem>\n ) : (\n <MenuItem disabled>No actions to undo</MenuItem>\n )}\n </Menu>\n </>\n )\n\n const redoUI = (\n <>\n <GridMenuButton\n variant={'outlined'}\n aria-controls={redoOpen ? 'redo-menu' : undefined}\n aria-haspopup=\"true\"\n onClick={handleRedoClick}\n disabled={!redoPreview}\n endIcon={<KeyboardArrowDownIcon />}\n >\n Redo {redoPreview && `(${redoPreview.totalActions})`}\n </GridMenuButton>\n <Menu\n id=\"redo-menu\"\n anchorEl={redoAnchorEl}\n open={redoOpen}\n onClose={handleRedoClose}\n >\n {redoPreview ? (\n <MenuItem key=\"lastAction\" onClick={handleRedo}>\n Redo last {redoPreview.lastType.toLowerCase()} action\n </MenuItem>\n ) : (\n <MenuItem disabled>No actions to redo</MenuItem>\n )}\n </Menu>\n </>\n )\n\n return {\n // Undo\n undoPreview,\n handleUndo,\n addToUndoStack,\n clearUndoStack,\n addOperationsToUndoStack,\n undoUI,\n undoTotalActions: undoPreview ? undoPreview.totalActions : 0,\n\n // Redo\n redoPreview,\n redoUI,\n redoTotalActions: redoPreview ? redoPreview.totalActions : 0,\n handleRedo,\n clearRedoStack,\n }\n}\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useStack.js","names":["useCallback","useState","useStack","t0","maxSize","$","_c","t1","undefined","stack","currentStack","setCurrentStack","t2","item","prev","newStack","length","shift","push","t3","popped","_temp","pop","t4","peek","t5","Symbol","for","clear","t6","isEmpty","t7","size","prev_0","slice"],"sources":["../../../../src/components/DataGrid/hooks/useStack.tsx"],"sourcesContent":["import { useCallback, useState } from 'react'\n\n/**\n * Hook for managing a stack data structure\n * @param stack - Initial stack items\n * @param maxSize - Optional maximum stack size. When exceeded, oldest items are removed\n */ export function useStack<T>(stack: T[] = [], maxSize?: number) {\n const [currentStack, setCurrentStack] = useState<T[]>(stack)\n\n const push = useCallback(\n (item: T) => {\n setCurrentStack(prev => {\n // Push a new item onto the top of the stack\n const newStack = [...prev, item]\n\n // Enforce maximum stack size by removing oldest element (bottom of stack)\n if (maxSize && newStack.length > maxSize) {\n newStack.shift()\n }\n\n return newStack\n })\n },\n [maxSize],\n )\n\n const pop = useCallback(() => {\n if (currentStack.length === 0) return undefined\n\n const popped = currentStack[currentStack.length - 1]\n setCurrentStack(prev => prev.slice(0, -1))\n return popped\n }, [currentStack])\n\n const peek = useCallback(() => {\n return currentStack[currentStack.length - 1]\n }, [currentStack])\n\n const clear = useCallback(() => {\n setCurrentStack([])\n }, [])\n\n const isEmpty = useCallback(() => currentStack.length === 0, [currentStack])\n\n return {\n stack: currentStack,\n push,\n pop,\n clear,\n peek,\n size: currentStack.length,\n isEmpty,\n }\n}\n"],"mappings":";;;AAMI,SAAOE,EAAAC,GAAAC,GAAA;CAAA,IAAAC,IAAAC,EAAA,GAAA,EAAAC;AAAA,CAAAF,EAAA,OAAAF,IAAoCI,IAAAF,EAAA,MAAfE,IAAAJ,MAAAK,KAAAA,IAAA,EAAe,GAAfL,GAAeE,EAAA,KAAAF,GAAAE,EAAA,KAAAE;CAC7C,IAAA,CAAAG,GAAAC,KAAwCV,
|
|
1
|
+
{"version":3,"file":"useStack.js","names":["useCallback","useState","useStack","t0","maxSize","$","_c","t1","undefined","stack","currentStack","setCurrentStack","t2","item","prev","newStack","length","shift","push","t3","popped","_temp","pop","t4","peek","t5","Symbol","for","clear","t6","isEmpty","t7","size","prev_0","slice"],"sources":["../../../../src/components/DataGrid/hooks/useStack.tsx"],"sourcesContent":["import { useCallback, useState } from 'react'\n\n/**\n * Hook for managing a stack data structure\n * @param stack - Initial stack items\n * @param maxSize - Optional maximum stack size. When exceeded, oldest items are removed\n */ export function useStack<T>(stack: T[] = [], maxSize?: number) {\n const [currentStack, setCurrentStack] = useState<T[]>(stack)\n\n const push = useCallback(\n (item: T) => {\n setCurrentStack(prev => {\n // Push a new item onto the top of the stack\n const newStack = [...prev, item]\n\n // Enforce maximum stack size by removing oldest element (bottom of stack)\n if (maxSize && newStack.length > maxSize) {\n newStack.shift()\n }\n\n return newStack\n })\n },\n [maxSize],\n )\n\n const pop = useCallback(() => {\n if (currentStack.length === 0) return undefined\n\n const popped = currentStack[currentStack.length - 1]\n setCurrentStack(prev => prev.slice(0, -1))\n return popped\n }, [currentStack])\n\n const peek = useCallback(() => {\n return currentStack[currentStack.length - 1]\n }, [currentStack])\n\n const clear = useCallback(() => {\n setCurrentStack([])\n }, [])\n\n const isEmpty = useCallback(() => currentStack.length === 0, [currentStack])\n\n return {\n stack: currentStack,\n push,\n pop,\n clear,\n peek,\n size: currentStack.length,\n isEmpty,\n }\n}\n"],"mappings":";;;AAMI,SAAOE,EAAAC,GAAAC,GAAA;CAAA,IAAAC,IAAAC,EAAA,GAAA,EAAAC;AAAA,CAAAF,EAAA,OAAAF,IAAoCI,IAAAF,EAAA,MAAfE,IAAAJ,MAAAK,KAAAA,IAAA,EAAe,GAAfL,GAAeE,EAAA,KAAAF,GAAAE,EAAA,KAAAE;CAC7C,IAAA,CAAAG,GAAAC,KAAwCV,EAAcQ,EAAM,EAAAG;AAAA,CAAAP,EAAA,OAAAD,IAezDQ,IAAAP,EAAA,MAZDO,KAAAC,MAAA;AACEF,KAAgBG,MAAA;GAEd,IAAAC,IAAiB,CAAA,GAAID,GAAMD,EAAK;AAK/B,UAFGT,KAAWW,EAAQC,SAAUZ,KAC/BW,EAAQE,OAAQ,EAGXF;IACP;IACHV,EAAA,KAAAD,GAAAC,EAAA,KAAAO;CAbH,IAAAM,IAAaN,GAeZO;AAAA,CAAAd,EAAA,OAAAK,IAQAS,IAAAd,EAAA,MANuBc,UAAA;AACtB,MAAIT,EAAYM,WAAY,EAAC;EAE7B,IAAAI,IAAeV,EAAaA,EAAYM,SAAU;AACR,SAA1CL,EAAgBU,EAA0B,EACnCD;IACRf,EAAA,KAAAK,GAAAL,EAAA,KAAAc;CAND,IAAAG,IAAYH,GAMMI;AAAA,CAAAlB,EAAA,OAAAK,IAIjBa,IAAAlB,EAAA,MAFwBkB,UAChBb,EAAaA,EAAYM,SAAU,IAC3CX,EAAA,KAAAK,GAAAL,EAAA,KAAAkB;CAFD,IAAAC,IAAaD,GAEKE;AAAA,CAAApB,EAAA,OAAAqB,OAAAC,IAAA,4BAAA,IAEQF,UAAA;AACxBd,IAAgB,EAAE,CAAC;IACpBN,EAAA,KAAAoB,KAAAA,IAAApB,EAAA;CAFD,IAAAuB,IAAcH,GAERI;AAAA,CAAAxB,EAAA,OAAAK,EAAAM,SAEqDa,IAAAxB,EAAA,OAA/BwB,UAAMnB,EAAYM,WAAY,GAACX,EAAA,KAAAK,EAAAM,QAAAX,EAAA,MAAAwB;CAA3D,IAAAC,IAAgBD,GAA4DE;AAU3E,QAV2E1B,EAAA,QAAAK,KAAAL,EAAA,QAAAyB,KAAAzB,EAAA,QAAAmB,KAAAnB,EAAA,QAAAiB,KAAAjB,EAAA,QAAAa,KAErEa,IAAA;EAAAtB,OACEC;EAAYQ;EAAAI;EAAAM;EAAAJ;EAAAQ,MAKbtB,EAAYM;EAAOc;EAE1B,EAAAzB,EAAA,MAAAK,GAAAL,EAAA,MAAAyB,GAAAzB,EAAA,MAAAmB,GAAAnB,EAAA,MAAAiB,GAAAjB,EAAA,MAAAa,GAAAb,EAAA,MAAA0B,KAAAA,IAAA1B,EAAA,KARM0B;;AAtCE,SAAAV,EAAAY,GAAA;AAAA,QAwBiBnB,EAAIoB,MAAO,GAAG,GAAG"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useCRDTModelView.js","names":["JsonNode","Model","useCallback","useMemo","useSyncExternalStore","noop","useCRDTModelView","model","$","_c","t0","bb0","_temp","api","subscribe","t1","getSnapshot"],"sources":["../../../src/components/DataGrid/useCRDTModelView.ts"],"sourcesContent":["import { JsonNode, Model } from 'json-joy/lib/json-crdt'\nimport { useCallback, useMemo, useSyncExternalStore } from 'react'\nimport noop from 'lodash-es/noop'\n\nexport function useCRDTModelView<T extends JsonNode = JsonNode>(\n model: Model<T> | null | undefined,\n) {\n const subscribe = useMemo(() => {\n if (!model) return () => noop\n return model.api.subscribe\n }, [model])\n\n const getSnapshot = useCallback(() => {\n if (!model) return null\n return model.api.getSnapshot()\n }, [model])\n\n return useSyncExternalStore(subscribe, getSnapshot)\n}\n"],"mappings":";;;;AAIA,SAAOM,EAAAC,GAAA;CAAA,IAAAC,IAAAC,EAAA,EAAA,EAAAC;AAAAC,MAAA;AAIH,MAAI,CAACJ,GAAK;AAAEG,OAAOE;AAAP,SAAAD;;AACZD,MAAOH,EAAKM,IAAIC;;CAFlB,IAAAA,IAAkBJ,GAGPK;AAKA,QALAP,EAAA,OAAAD,IAKVQ,IAAAP,EAAA,MAH+BO,UACzBR,IACEA,EAAKM,IAAIG,aAAc,GADX,MAEpBR,EAAA,KAAAD,GAAAC,EAAA,KAAAO,IAEMX,EAAqBU,
|
|
1
|
+
{"version":3,"file":"useCRDTModelView.js","names":["JsonNode","Model","useCallback","useMemo","useSyncExternalStore","noop","useCRDTModelView","model","$","_c","t0","bb0","_temp","api","subscribe","t1","getSnapshot"],"sources":["../../../src/components/DataGrid/useCRDTModelView.ts"],"sourcesContent":["import { JsonNode, Model } from 'json-joy/lib/json-crdt'\nimport { useCallback, useMemo, useSyncExternalStore } from 'react'\nimport noop from 'lodash-es/noop'\n\nexport function useCRDTModelView<T extends JsonNode = JsonNode>(\n model: Model<T> | null | undefined,\n) {\n const subscribe = useMemo(() => {\n if (!model) return () => noop\n return model.api.subscribe\n }, [model])\n\n const getSnapshot = useCallback(() => {\n if (!model) return null\n return model.api.getSnapshot()\n }, [model])\n\n return useSyncExternalStore(subscribe, getSnapshot)\n}\n"],"mappings":";;;;AAIA,SAAOM,EAAAC,GAAA;CAAA,IAAAC,IAAAC,EAAA,EAAA,EAAAC;AAAAC,MAAA;AAIH,MAAI,CAACJ,GAAK;AAAEG,OAAOE;AAAP,SAAAD;;AACZD,MAAOH,EAAKM,IAAIC;;CAFlB,IAAAA,IAAkBJ,GAGPK;AAKA,QALAP,EAAA,OAAAD,IAKVQ,IAAAP,EAAA,MAH+BO,UACzBR,IACEA,EAAKM,IAAIG,aAAc,GADX,MAEpBR,EAAA,KAAAD,GAAAC,EAAA,KAAAO,IAEMX,EAAqBU,GAAWE,EAAY;;AAb9C,SAAAJ,IAAA;AAAA,QAIsBP"}
|
|
@@ -7,6 +7,12 @@ interface WebSocketState {
|
|
|
7
7
|
* Corresponds to the `GRID_READY` action.
|
|
8
8
|
*/
|
|
9
9
|
hasCompletedInitialSync: boolean;
|
|
10
|
+
/**
|
|
11
|
+
* True while a clock-sync exchange is in progress. Set on every outgoing
|
|
12
|
+
* `synchronize-clock` and cleared on `ResponseComplete`, which the server
|
|
13
|
+
* sends once per exchange to signal "we're synchronized" — not per request.
|
|
14
|
+
*/
|
|
15
|
+
isSyncing: boolean;
|
|
10
16
|
isConnected: boolean;
|
|
11
17
|
isConnecting: boolean;
|
|
12
18
|
connectionParams: {
|
|
@@ -36,6 +42,7 @@ export declare function useDataGridWebSocket(options?: UseDataGridWebSocketOptio
|
|
|
36
42
|
isConnected: boolean;
|
|
37
43
|
websocketInstance: DataGridWebSocket | null;
|
|
38
44
|
hasCompletedInitialSync: boolean;
|
|
45
|
+
isSyncing: boolean;
|
|
39
46
|
model: import("json-joy").Model<import("json-joy").ObjNode<{
|
|
40
47
|
doc_version: import("json-joy").ConNode<string>;
|
|
41
48
|
columnNames: import("json-joy").VecNode<[import("json-joy").ConNode<string>]>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useDataGridWebsocket.d.ts","sourceRoot":"","sources":["../../../src/components/DataGrid/useDataGridWebsocket.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,qCAAqC,CAAA;AAG/D,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAA;AAKvD,UAAU,cAAc;IACtB,KAAK,EAAE,SAAS,GAAG,IAAI,CAAA;IACvB;;;OAGG;IACH,uBAAuB,EAAE,OAAO,CAAA;IAChC,WAAW,EAAE,OAAO,CAAA;IACpB,YAAY,EAAE,OAAO,CAAA;IACrB,gBAAgB,EAAE;QAChB,SAAS,EAAE,MAAM,CAAA;QACjB,SAAS,EAAE,MAAM,CAAA;KAClB,GAAG,IAAI,CAAA;IACR,iBAAiB,EAAE,iBAAiB,GAAG,IAAI,CAAA;IAC3C,mBAAmB,EAAE,MAAM,GAAG,IAAI,CAAA;IAClC,eAAe,EAAE,OAAO,CAAA;CACzB;
|
|
1
|
+
{"version":3,"file":"useDataGridWebsocket.d.ts","sourceRoot":"","sources":["../../../src/components/DataGrid/useDataGridWebsocket.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,qCAAqC,CAAA;AAG/D,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAA;AAKvD,UAAU,cAAc;IACtB,KAAK,EAAE,SAAS,GAAG,IAAI,CAAA;IACvB;;;OAGG;IACH,uBAAuB,EAAE,OAAO,CAAA;IAChC;;;;OAIG;IACH,SAAS,EAAE,OAAO,CAAA;IAClB,WAAW,EAAE,OAAO,CAAA;IACpB,YAAY,EAAE,OAAO,CAAA;IACrB,gBAAgB,EAAE;QAChB,SAAS,EAAE,MAAM,CAAA;QACjB,SAAS,EAAE,MAAM,CAAA;KAClB,GAAG,IAAI,CAAA;IACR,iBAAiB,EAAE,iBAAiB,GAAG,IAAI,CAAA;IAC3C,mBAAmB,EAAE,MAAM,GAAG,IAAI,CAAA;IAClC,eAAe,EAAE,OAAO,CAAA;CACzB;AAyGD,eAAO,MAAM,qBAAqB,EAAE,cAUnC,CAAA;AAED;;;;;;;;GAQG;AACH,MAAM,WAAW,2BAA2B;IAC1C,WAAW,CAAC,EAAE,MAAM,IAAI,CAAA;IACxB,kBAAkB,CAAC,EAAE,MAAM,IAAI,CAAA;IAC/B,qBAAqB,CAAC,EAAE,MAAM,IAAI,CAAA;CACnC;AAED,wBAAgB,oBAAoB,CAAC,OAAO,CAAC,EAAE,2BAA2B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;yBAoD1D,MAAM,aAAa,MAAM;;;;EA8IxC"}
|
|
@@ -14,6 +14,7 @@ function c(e, t) {
|
|
|
14
14
|
sessionId: t.payload.sessionId
|
|
15
15
|
},
|
|
16
16
|
hasCompletedInitialSync: n ? e.hasCompletedInitialSync : !1,
|
|
17
|
+
isSyncing: !1,
|
|
17
18
|
model: n ? e.model : null,
|
|
18
19
|
isConnected: !1,
|
|
19
20
|
isConnecting: !1,
|
|
@@ -34,12 +35,21 @@ function c(e, t) {
|
|
|
34
35
|
case "CONNECTION_CLOSED": return {
|
|
35
36
|
...e,
|
|
36
37
|
isConnected: !1,
|
|
37
|
-
isConnecting: !1
|
|
38
|
+
isConnecting: !1,
|
|
39
|
+
isSyncing: !1
|
|
38
40
|
};
|
|
39
41
|
case "GRID_READY": return {
|
|
40
42
|
...e,
|
|
41
43
|
hasCompletedInitialSync: !0
|
|
42
44
|
};
|
|
45
|
+
case "SYNC_STARTED": return {
|
|
46
|
+
...e,
|
|
47
|
+
isSyncing: !0
|
|
48
|
+
};
|
|
49
|
+
case "SYNC_ENDED": return {
|
|
50
|
+
...e,
|
|
51
|
+
isSyncing: !1
|
|
52
|
+
};
|
|
43
53
|
case "MODEL_CREATED": return {
|
|
44
54
|
...e,
|
|
45
55
|
model: t.payload
|
|
@@ -55,6 +65,7 @@ function c(e, t) {
|
|
|
55
65
|
var l = {
|
|
56
66
|
model: null,
|
|
57
67
|
hasCompletedInitialSync: !1,
|
|
68
|
+
isSyncing: !1,
|
|
58
69
|
isConnected: !1,
|
|
59
70
|
isConnecting: !1,
|
|
60
71
|
connectionParams: null,
|
|
@@ -75,7 +86,9 @@ function u(u) {
|
|
|
75
86
|
onStatusChange: (e) => f({ type: e ? "CONNECTION_OPENED" : "CONNECTION_CLOSED" }),
|
|
76
87
|
onModelCreate: C,
|
|
77
88
|
onReplicaConnected: u?.onReplicaConnected,
|
|
78
|
-
onReplicaDisconnected: u?.onReplicaDisconnected
|
|
89
|
+
onReplicaDisconnected: u?.onReplicaDisconnected,
|
|
90
|
+
onSyncStart: () => f({ type: "SYNC_STARTED" }),
|
|
91
|
+
onSyncEnd: () => f({ type: "SYNC_ENDED" })
|
|
79
92
|
}), [
|
|
80
93
|
C,
|
|
81
94
|
u?.onGridReady,
|
|
@@ -151,6 +164,7 @@ function u(u) {
|
|
|
151
164
|
isConnected: d.isConnected,
|
|
152
165
|
websocketInstance: d.websocketInstance,
|
|
153
166
|
hasCompletedInitialSync: d.hasCompletedInitialSync,
|
|
167
|
+
isSyncing: d.isSyncing,
|
|
154
168
|
model: d.model,
|
|
155
169
|
modelSnapshot: h,
|
|
156
170
|
connect: T,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useDataGridWebsocket.js","names":["GridModel","useCRDTModelView","useCallback","useEffect","useMemo","useReducer","useRef","DataGridWebSocket","useEstablishWebsocketConnection","useDocumentVisibility","WebSocketState","model","hasCompletedInitialSync","isConnected","isConnecting","connectionParams","replicaId","sessionId","websocketInstance","connectionAttemptId","connectionError","WebSocketAction","type","payload","attemptId","websocketReducer","state","action","isSameConnection","initialWebSocketState","UseDataGridWebSocketOptions","onGridReady","onReplicaConnected","onReplicaDisconnected","useDataGridWebSocket","options","dispatch","connectionAttemptCounter","activeConnectionAttemptIdRef","modelSnapshot","isDocumentVisible","mutateAsync","establishWebsocketConnection","isPending","isEstablishingWebsocketConnection","error","errorEstablishingWebsocketConnection","presignedUrl","reset","resetEstablishWebsocketConnection","clearPresignedUrl","handleModelCreate","newModel","websocketOptionsWithoutModel","onStatusChange","open","onModelCreate","connect","isDifferentConnection","current","websocketOptions","then","ws","disconnect","catch","err","console","previousConnectionParams","previous","isModelRenderable","api","getSnapshot","columnNames","columnOrder","rows","columnsReady","length","orderReady","rowsReady","hasSufficientData"],"sources":["../../../src/components/DataGrid/useDataGridWebsocket.ts"],"sourcesContent":["import { GridModel } from '@/components/DataGrid/DataGridTypes'\nimport { useCRDTModelView } from '@/components/DataGrid/useCRDTModelView'\nimport { useCallback, useEffect, useMemo, useReducer, useRef } from 'react'\nimport { DataGridWebSocket } from './DataGridWebSocket'\nimport { useEstablishWebsocketConnection } from '@/synapse-queries/grid/useEstablishWebsocketConnection'\nimport { useDocumentVisibility } from '@react-hookz/web'\n\n// State type\ninterface WebSocketState {\n model: GridModel | null\n /**\n * True if the WebSocket has finished the initial sync and can process CRDT updates.\n * Corresponds to the `GRID_READY` action.\n */\n hasCompletedInitialSync: boolean\n isConnected: boolean\n isConnecting: boolean\n connectionParams: {\n replicaId: number\n sessionId: string\n } | null\n websocketInstance: DataGridWebSocket | null\n connectionAttemptId: number | null\n connectionError: unknown\n}\n\n// Action types\ntype WebSocketAction =\n | {\n type: 'CONNECT_REQUESTED'\n payload: { replicaId: number; sessionId: string; attemptId: number }\n }\n | { type: 'CONNECTION_ESTABLISHED'; payload: DataGridWebSocket }\n | { type: 'CONNECTION_OPENED' }\n | { type: 'CONNECTION_CLOSED' }\n | { type: 'GRID_READY' }\n | { type: 'MODEL_CREATED'; payload: GridModel }\n | { type: 'CONNECTION_ERROR'; payload: unknown }\n\n// Reducer function\nfunction websocketReducer(\n state: WebSocketState,\n action: WebSocketAction,\n): WebSocketState {\n switch (action.type) {\n case 'CONNECT_REQUESTED': {\n const isSameConnection =\n state.connectionParams &&\n state.connectionParams.replicaId === action.payload.replicaId &&\n state.connectionParams.sessionId === action.payload.sessionId\n\n return {\n ...state,\n connectionParams: {\n replicaId: action.payload.replicaId,\n sessionId: action.payload.sessionId,\n },\n hasCompletedInitialSync: isSameConnection\n ? state.hasCompletedInitialSync\n : false,\n model: isSameConnection ? state.model : null,\n isConnected: false,\n isConnecting: false,\n connectionAttemptId: action.payload.attemptId,\n connectionError: null,\n }\n }\n\n case 'CONNECTION_ESTABLISHED':\n return {\n ...state,\n websocketInstance: action.payload,\n isConnecting: true,\n }\n\n case 'CONNECTION_OPENED':\n return {\n ...state,\n isConnected: true,\n isConnecting: false,\n }\n\n case 'CONNECTION_CLOSED':\n return {\n ...state,\n isConnected: false,\n isConnecting: false,\n }\n\n case 'GRID_READY':\n return {\n ...state,\n hasCompletedInitialSync: true,\n }\n\n case 'MODEL_CREATED':\n return {\n ...state,\n model: action.payload,\n }\n\n case 'CONNECTION_ERROR':\n return {\n ...state,\n connectionError: action.payload,\n isConnecting: false,\n }\n\n default:\n return state\n }\n}\n\nexport const initialWebSocketState: WebSocketState = {\n model: null,\n hasCompletedInitialSync: false,\n isConnected: false,\n isConnecting: false,\n connectionParams: null,\n websocketInstance: null,\n connectionAttemptId: null,\n connectionError: null,\n}\n\n/**\n * Custom hook to manage a DataGrid WebSocket connection.\n * Handles:\n * - Fetching presigned URLs via a mutation hook\n * - Instantiating the DataGridWebSocket\n * - Connection status tracking\n * - Reconnection on disconnect\n * - Grid model updates and snapshot tracking\n */\nexport interface UseDataGridWebSocketOptions {\n onGridReady?: () => void\n onReplicaConnected?: () => void\n onReplicaDisconnected?: () => void\n}\n\nexport function useDataGridWebSocket(options?: UseDataGridWebSocketOptions) {\n const [state, dispatch] = useReducer(websocketReducer, initialWebSocketState)\n\n const connectionAttemptCounter = useRef(0)\n const activeConnectionAttemptIdRef = useRef<number | null>(null)\n\n const modelSnapshot = useCRDTModelView(state.model)\n\n const isDocumentVisible = useDocumentVisibility()\n\n const {\n mutateAsync: establishWebsocketConnection,\n isPending: isEstablishingWebsocketConnection,\n error: errorEstablishingWebsocketConnection,\n presignedUrl,\n reset: resetEstablishWebsocketConnection,\n clearPresignedUrl,\n } = useEstablishWebsocketConnection()\n\n // Update model creation handler - only set model, don't reset to null on disconnect\n const handleModelCreate = useCallback(\n (newModel: GridModel) => {\n dispatch({ type: 'MODEL_CREATED', payload: newModel })\n },\n [dispatch],\n )\n\n // Memoize websocket options to prevent unnecessary re-renders (excluding model to avoid circular deps)\n const websocketOptionsWithoutModel = useMemo(\n () => ({\n onGridReady: () => {\n dispatch({ type: 'GRID_READY' })\n options?.onGridReady?.()\n },\n onStatusChange: (open: boolean) =>\n dispatch({ type: open ? 'CONNECTION_OPENED' : 'CONNECTION_CLOSED' }),\n onModelCreate: handleModelCreate,\n onReplicaConnected: options?.onReplicaConnected,\n onReplicaDisconnected: options?.onReplicaDisconnected,\n }),\n [\n handleModelCreate,\n options?.onGridReady,\n options?.onReplicaConnected,\n options?.onReplicaDisconnected,\n ],\n )\n\n // Initiate (or re-initiate) a connection\n const connect = useCallback(\n (replicaId: number, sessionId: string) => {\n resetEstablishWebsocketConnection()\n\n const isDifferentConnection =\n !state.connectionParams ||\n state.connectionParams.replicaId !== replicaId ||\n state.connectionParams.sessionId !== sessionId\n\n if (isDifferentConnection) {\n clearPresignedUrl()\n }\n\n connectionAttemptCounter.current += 1\n const attemptId = connectionAttemptCounter.current\n\n dispatch({\n type: 'CONNECT_REQUESTED',\n payload: { replicaId, sessionId, attemptId },\n })\n },\n [\n dispatch,\n state.connectionParams,\n resetEstablishWebsocketConnection,\n clearPresignedUrl,\n connectionAttemptCounter,\n ],\n )\n\n /**\n * Establish the WebSocket connection when conditions are met.\n * Uses the current model state at connection time for reconnections to the same session.\n * Note: Changes to `model` alone do NOT trigger reconnection - only changes to connection\n * params, visibility, or connection status will trigger a new connection attempt.\n */\n useEffect(() => {\n // Don't attempt connection if conditions aren't met\n const { connectionParams, connectionAttemptId } = state\n\n if (\n !connectionParams ||\n connectionAttemptId === null ||\n state.isConnected ||\n state.isConnecting ||\n isEstablishingWebsocketConnection ||\n errorEstablishingWebsocketConnection ||\n state.connectionError ||\n !isDocumentVisible\n ) {\n return\n }\n\n activeConnectionAttemptIdRef.current = connectionAttemptId\n\n // Use current model state for reconnections to same session\n // (model may have been created by a previous connection)\n establishWebsocketConnection({\n replicaId: connectionParams.replicaId,\n sessionId: connectionParams.sessionId,\n websocketOptions: {\n ...websocketOptionsWithoutModel,\n model: state.model, // Current model at connection time\n },\n })\n .then(ws => {\n if (activeConnectionAttemptIdRef.current !== connectionAttemptId) {\n ws.disconnect()\n return\n }\n\n dispatch({ type: 'CONNECTION_ESTABLISHED', payload: ws })\n })\n .catch(err => {\n dispatch({ type: 'CONNECTION_ERROR', payload: err })\n console.error('Failed to establish WebSocket', err)\n })\n }, [\n state,\n state.connectionParams,\n state.connectionAttemptId,\n state.isConnected,\n state.isConnecting,\n isEstablishingWebsocketConnection,\n errorEstablishingWebsocketConnection,\n isDocumentVisible,\n establishWebsocketConnection,\n websocketOptionsWithoutModel,\n ])\n\n const previousConnectionParams =\n useRef<WebSocketState['connectionParams']>(null)\n\n useEffect(() => {\n const previous = previousConnectionParams.current\n const current = state.connectionParams\n\n if (\n previous &&\n current &&\n (previous.replicaId !== current.replicaId ||\n previous.sessionId !== current.sessionId)\n ) {\n state.websocketInstance?.disconnect()\n }\n\n previousConnectionParams.current = current\n }, [state.connectionParams, state.websocketInstance])\n\n useEffect(() => {\n return () => {\n state.websocketInstance?.disconnect()\n activeConnectionAttemptIdRef.current = null\n }\n }, [state.websocketInstance])\n\n /**\n * Checks if the model snapshot contains the minimum data required for rendering (columns and rows).\n */\n function isModelRenderable(model: GridModel | null) {\n if (!model || !model.api.getSnapshot() || !modelSnapshot) {\n return false\n }\n const { columnNames, columnOrder, rows } = modelSnapshot\n const columnsReady = columnNames.length >= 1\n const orderReady = columnOrder.length >= 1\n const rowsReady = rows.length >= 0\n return columnsReady && orderReady && rowsReady\n }\n\n return {\n isConnected: state.isConnected,\n websocketInstance: state.websocketInstance,\n hasCompletedInitialSync: state.hasCompletedInitialSync,\n model: state.model,\n modelSnapshot,\n connect,\n presignedUrl,\n errorEstablishingWebsocketConnection:\n state.connectionError ?? errorEstablishingWebsocketConnection,\n hasSufficientData: isModelRenderable(state.model),\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"useDataGridWebsocket.js","names":["GridModel","useCRDTModelView","useCallback","useEffect","useMemo","useReducer","useRef","DataGridWebSocket","useEstablishWebsocketConnection","useDocumentVisibility","WebSocketState","model","hasCompletedInitialSync","isSyncing","isConnected","isConnecting","connectionParams","replicaId","sessionId","websocketInstance","connectionAttemptId","connectionError","WebSocketAction","type","payload","attemptId","websocketReducer","state","action","isSameConnection","initialWebSocketState","UseDataGridWebSocketOptions","onGridReady","onReplicaConnected","onReplicaDisconnected","useDataGridWebSocket","options","dispatch","connectionAttemptCounter","activeConnectionAttemptIdRef","modelSnapshot","isDocumentVisible","mutateAsync","establishWebsocketConnection","isPending","isEstablishingWebsocketConnection","error","errorEstablishingWebsocketConnection","presignedUrl","reset","resetEstablishWebsocketConnection","clearPresignedUrl","handleModelCreate","newModel","websocketOptionsWithoutModel","onStatusChange","open","onModelCreate","onSyncStart","onSyncEnd","connect","isDifferentConnection","current","websocketOptions","then","ws","disconnect","catch","err","console","previousConnectionParams","previous","isModelRenderable","api","getSnapshot","columnNames","columnOrder","rows","columnsReady","length","orderReady","rowsReady","hasSufficientData"],"sources":["../../../src/components/DataGrid/useDataGridWebsocket.ts"],"sourcesContent":["import { GridModel } from '@/components/DataGrid/DataGridTypes'\nimport { useCRDTModelView } from '@/components/DataGrid/useCRDTModelView'\nimport { useCallback, useEffect, useMemo, useReducer, useRef } from 'react'\nimport { DataGridWebSocket } from './DataGridWebSocket'\nimport { useEstablishWebsocketConnection } from '@/synapse-queries/grid/useEstablishWebsocketConnection'\nimport { useDocumentVisibility } from '@react-hookz/web'\n\n// State type\ninterface WebSocketState {\n model: GridModel | null\n /**\n * True if the WebSocket has finished the initial sync and can process CRDT updates.\n * Corresponds to the `GRID_READY` action.\n */\n hasCompletedInitialSync: boolean\n /**\n * True while a clock-sync exchange is in progress. Set on every outgoing\n * `synchronize-clock` and cleared on `ResponseComplete`, which the server\n * sends once per exchange to signal \"we're synchronized\" — not per request.\n */\n isSyncing: boolean\n isConnected: boolean\n isConnecting: boolean\n connectionParams: {\n replicaId: number\n sessionId: string\n } | null\n websocketInstance: DataGridWebSocket | null\n connectionAttemptId: number | null\n connectionError: unknown\n}\n\n// Action types\ntype WebSocketAction =\n | {\n type: 'CONNECT_REQUESTED'\n payload: { replicaId: number; sessionId: string; attemptId: number }\n }\n | { type: 'CONNECTION_ESTABLISHED'; payload: DataGridWebSocket }\n | { type: 'CONNECTION_OPENED' }\n | { type: 'CONNECTION_CLOSED' }\n | { type: 'GRID_READY' }\n | { type: 'SYNC_STARTED' }\n | { type: 'SYNC_ENDED' }\n | { type: 'MODEL_CREATED'; payload: GridModel }\n | { type: 'CONNECTION_ERROR'; payload: unknown }\n\n// Reducer function\nfunction websocketReducer(\n state: WebSocketState,\n action: WebSocketAction,\n): WebSocketState {\n switch (action.type) {\n case 'CONNECT_REQUESTED': {\n const isSameConnection =\n state.connectionParams &&\n state.connectionParams.replicaId === action.payload.replicaId &&\n state.connectionParams.sessionId === action.payload.sessionId\n\n return {\n ...state,\n connectionParams: {\n replicaId: action.payload.replicaId,\n sessionId: action.payload.sessionId,\n },\n hasCompletedInitialSync: isSameConnection\n ? state.hasCompletedInitialSync\n : false,\n isSyncing: false,\n model: isSameConnection ? state.model : null,\n isConnected: false,\n isConnecting: false,\n connectionAttemptId: action.payload.attemptId,\n connectionError: null,\n }\n }\n\n case 'CONNECTION_ESTABLISHED':\n return {\n ...state,\n websocketInstance: action.payload,\n isConnecting: true,\n }\n\n case 'CONNECTION_OPENED':\n return {\n ...state,\n isConnected: true,\n isConnecting: false,\n }\n\n case 'CONNECTION_CLOSED':\n return {\n ...state,\n isConnected: false,\n isConnecting: false,\n isSyncing: false,\n }\n\n case 'GRID_READY':\n return {\n ...state,\n hasCompletedInitialSync: true,\n }\n\n case 'SYNC_STARTED':\n return {\n ...state,\n isSyncing: true,\n }\n\n case 'SYNC_ENDED':\n return {\n ...state,\n isSyncing: false,\n }\n\n case 'MODEL_CREATED':\n return {\n ...state,\n model: action.payload,\n }\n\n case 'CONNECTION_ERROR':\n return {\n ...state,\n connectionError: action.payload,\n isConnecting: false,\n }\n\n default:\n return state\n }\n}\n\nexport const initialWebSocketState: WebSocketState = {\n model: null,\n hasCompletedInitialSync: false,\n isSyncing: false,\n isConnected: false,\n isConnecting: false,\n connectionParams: null,\n websocketInstance: null,\n connectionAttemptId: null,\n connectionError: null,\n}\n\n/**\n * Custom hook to manage a DataGrid WebSocket connection.\n * Handles:\n * - Fetching presigned URLs via a mutation hook\n * - Instantiating the DataGridWebSocket\n * - Connection status tracking\n * - Reconnection on disconnect\n * - Grid model updates and snapshot tracking\n */\nexport interface UseDataGridWebSocketOptions {\n onGridReady?: () => void\n onReplicaConnected?: () => void\n onReplicaDisconnected?: () => void\n}\n\nexport function useDataGridWebSocket(options?: UseDataGridWebSocketOptions) {\n const [state, dispatch] = useReducer(websocketReducer, initialWebSocketState)\n\n const connectionAttemptCounter = useRef(0)\n const activeConnectionAttemptIdRef = useRef<number | null>(null)\n\n const modelSnapshot = useCRDTModelView(state.model)\n\n const isDocumentVisible = useDocumentVisibility()\n\n const {\n mutateAsync: establishWebsocketConnection,\n isPending: isEstablishingWebsocketConnection,\n error: errorEstablishingWebsocketConnection,\n presignedUrl,\n reset: resetEstablishWebsocketConnection,\n clearPresignedUrl,\n } = useEstablishWebsocketConnection()\n\n // Update model creation handler - only set model, don't reset to null on disconnect\n const handleModelCreate = useCallback(\n (newModel: GridModel) => {\n dispatch({ type: 'MODEL_CREATED', payload: newModel })\n },\n [dispatch],\n )\n\n // Memoize websocket options to prevent unnecessary re-renders (excluding model to avoid circular deps)\n const websocketOptionsWithoutModel = useMemo(\n () => ({\n onGridReady: () => {\n dispatch({ type: 'GRID_READY' })\n options?.onGridReady?.()\n },\n onStatusChange: (open: boolean) =>\n dispatch({ type: open ? 'CONNECTION_OPENED' : 'CONNECTION_CLOSED' }),\n onModelCreate: handleModelCreate,\n onReplicaConnected: options?.onReplicaConnected,\n onReplicaDisconnected: options?.onReplicaDisconnected,\n onSyncStart: () => dispatch({ type: 'SYNC_STARTED' }),\n onSyncEnd: () => dispatch({ type: 'SYNC_ENDED' }),\n }),\n [\n handleModelCreate,\n options?.onGridReady,\n options?.onReplicaConnected,\n options?.onReplicaDisconnected,\n ],\n )\n\n // Initiate (or re-initiate) a connection\n const connect = useCallback(\n (replicaId: number, sessionId: string) => {\n resetEstablishWebsocketConnection()\n\n const isDifferentConnection =\n !state.connectionParams ||\n state.connectionParams.replicaId !== replicaId ||\n state.connectionParams.sessionId !== sessionId\n\n if (isDifferentConnection) {\n clearPresignedUrl()\n }\n\n connectionAttemptCounter.current += 1\n const attemptId = connectionAttemptCounter.current\n\n dispatch({\n type: 'CONNECT_REQUESTED',\n payload: { replicaId, sessionId, attemptId },\n })\n },\n [\n dispatch,\n state.connectionParams,\n resetEstablishWebsocketConnection,\n clearPresignedUrl,\n connectionAttemptCounter,\n ],\n )\n\n /**\n * Establish the WebSocket connection when conditions are met.\n * Uses the current model state at connection time for reconnections to the same session.\n * Note: Changes to `model` alone do NOT trigger reconnection - only changes to connection\n * params, visibility, or connection status will trigger a new connection attempt.\n */\n useEffect(() => {\n // Don't attempt connection if conditions aren't met\n const { connectionParams, connectionAttemptId } = state\n\n if (\n !connectionParams ||\n connectionAttemptId === null ||\n state.isConnected ||\n state.isConnecting ||\n isEstablishingWebsocketConnection ||\n errorEstablishingWebsocketConnection ||\n state.connectionError ||\n !isDocumentVisible\n ) {\n return\n }\n\n activeConnectionAttemptIdRef.current = connectionAttemptId\n\n // Use current model state for reconnections to same session\n // (model may have been created by a previous connection)\n establishWebsocketConnection({\n replicaId: connectionParams.replicaId,\n sessionId: connectionParams.sessionId,\n websocketOptions: {\n ...websocketOptionsWithoutModel,\n model: state.model, // Current model at connection time\n },\n })\n .then(ws => {\n if (activeConnectionAttemptIdRef.current !== connectionAttemptId) {\n ws.disconnect()\n return\n }\n\n dispatch({ type: 'CONNECTION_ESTABLISHED', payload: ws })\n })\n .catch(err => {\n dispatch({ type: 'CONNECTION_ERROR', payload: err })\n console.error('Failed to establish WebSocket', err)\n })\n }, [\n state,\n state.connectionParams,\n state.connectionAttemptId,\n state.isConnected,\n state.isConnecting,\n isEstablishingWebsocketConnection,\n errorEstablishingWebsocketConnection,\n isDocumentVisible,\n establishWebsocketConnection,\n websocketOptionsWithoutModel,\n ])\n\n const previousConnectionParams =\n useRef<WebSocketState['connectionParams']>(null)\n\n useEffect(() => {\n const previous = previousConnectionParams.current\n const current = state.connectionParams\n\n if (\n previous &&\n current &&\n (previous.replicaId !== current.replicaId ||\n previous.sessionId !== current.sessionId)\n ) {\n state.websocketInstance?.disconnect()\n }\n\n previousConnectionParams.current = current\n }, [state.connectionParams, state.websocketInstance])\n\n useEffect(() => {\n return () => {\n state.websocketInstance?.disconnect()\n activeConnectionAttemptIdRef.current = null\n }\n }, [state.websocketInstance])\n\n /**\n * Checks if the model snapshot contains the minimum data required for rendering (columns and rows).\n */\n function isModelRenderable(model: GridModel | null) {\n if (!model || !model.api.getSnapshot() || !modelSnapshot) {\n return false\n }\n const { columnNames, columnOrder, rows } = modelSnapshot\n const columnsReady = columnNames.length >= 1\n const orderReady = columnOrder.length >= 1\n const rowsReady = rows.length >= 0\n return columnsReady && orderReady && rowsReady\n }\n\n return {\n isConnected: state.isConnected,\n websocketInstance: state.websocketInstance,\n hasCompletedInitialSync: state.hasCompletedInitialSync,\n isSyncing: state.isSyncing,\n model: state.model,\n modelSnapshot,\n connect,\n presignedUrl,\n errorEstablishingWebsocketConnection:\n state.connectionError ?? errorEstablishingWebsocketConnection,\n hasSufficientData: isModelRenderable(state.model),\n }\n}\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useInitializeGridConnection.js","names":["useCreateGridReplica","useCreateGridSession","useSynapseContext","CreateGridRequest","GridReplica","GridSession","useMutation","UseMutationOptions","CreateOrGetGridSessionInput","createGridRequest","sessionId","useCreateOrGetExistingGridSession","$","_c","mutateAsync","startGridSession","synapseClient","t0","mutationFn","t1","Error","gridSessionResponse","console","log","gridSession","gridServicesClient","getRepoV1GridSessionSessionId","useInitializeGridConnection","options","createOrGetSession","createReplicaId","sessionIdArg","session","createReplicaResponse","replica","t2","error","cause"],"sources":["../../../src/components/DataGrid/useInitializeGridConnection.ts"],"sourcesContent":["import {\n useCreateGridReplica,\n useCreateGridSession,\n} from '@/synapse-queries/grid/useGridSession'\nimport { useSynapseContext } from '@/utils/context/SynapseContext'\nimport {\n CreateGridRequest,\n GridReplica,\n GridSession,\n} from '@sage-bionetworks/synapse-client'\nimport { useMutation, UseMutationOptions } from '@tanstack/react-query'\n\nexport type CreateOrGetGridSessionInput = {\n createGridRequest?: CreateGridRequest\n sessionId?: string\n}\n\n/**\n * Create a new grid session or retrieve an existing one based on the provided SQL query or session ID.\n */\nfunction useCreateOrGetExistingGridSession() {\n const { mutateAsync: startGridSession } = useCreateGridSession()\n const { synapseClient } = useSynapseContext()\n return useMutation<GridSession, unknown, CreateOrGetGridSessionInput>({\n mutationFn: async ({ createGridRequest, sessionId }) => {\n if (!(createGridRequest || sessionId)) {\n throw new Error(\n 'Must provide either a CreateGridRequest or sessionId to create or get a grid session.',\n )\n }\n\n if (createGridRequest) {\n const gridSessionResponse = await startGridSession(createGridRequest)\n console.log('Grid session started:', gridSessionResponse)\n return gridSessionResponse.gridSession!\n }\n\n // The input is a sessionId, so retrieve the session object\n console.log(`Joining existing session ID: ${sessionId}`)\n return await synapseClient.gridServicesClient.getRepoV1GridSessionSessionId(\n {\n sessionId: sessionId!,\n },\n )\n },\n })\n}\n\n/**\n * Mutation to establish a grid connection by creating or getting an existing session and creating a replica.\n *\n * @param gridSqlOrSessionId - The SQL query or session ID to use for the grid connection.\n * @param schemaId - Optional schema ID to associate with the session.\n * @param options\n */\nexport default function useInitializeGridConnection(\n options?: Omit<\n UseMutationOptions<\n { session: GridSession; replica: GridReplica },\n unknown,\n CreateOrGetGridSessionInput\n >,\n 'mutationFn'\n >,\n) {\n const { mutateAsync: createOrGetSession } =\n useCreateOrGetExistingGridSession()\n const { mutateAsync: createReplicaId } = useCreateGridReplica()\n\n return useMutation<\n { session: GridSession; replica: GridReplica },\n unknown,\n CreateOrGetGridSessionInput\n >({\n ...options,\n mutationFn: async ({ createGridRequest, sessionId: sessionIdArg }) => {\n if (!(createGridRequest || sessionIdArg)) {\n throw new Error(\n 'Must provide either a SQL query, recordSetId, or sessionId to initialize grid connection.',\n )\n }\n const session = await createOrGetSession({\n createGridRequest,\n sessionId: sessionIdArg,\n })\n const sessionId = session.sessionId!\n try {\n const createReplicaResponse = await createReplicaId(sessionId)\n console.log('Replica created:', createReplicaResponse)\n const replica = createReplicaResponse.replica!\n\n return {\n session,\n replica,\n }\n } catch (error) {\n throw new Error('Error starting session:', { cause: error })\n }\n },\n })\n}\n"],"mappings":";;;;;AAoBA,SAAAW,IAAA;CAAA,IAAAC,IAAAC,EAAA,EAAA,EACE,EAAAC,aAAAC,MAA0Cd,GAAsB,EAChE,EAAAe,qBAA0Bd,GAAmB,EAAAe;AAuB5C,QAvB4CL,EAAA,OAAAG,KAAAH,EAAA,OAAAI,KACyBC,IAAA,EAAAC,YACxD,OAAAC,MAAA;EAAO,IAAA,EAAAV,sBAAAC,iBAAAS;AACjB,MAAI,EAAEV,KAAAC,GACJ,OAAUU,MACR,wFACD;AAGH,MAAIX,GAAiB;GACnB,IAAAY,IAA4B,MAAMN,EAAiBN,EAAkB;AACZ,UAAzDa,QAAOC,IAAK,yBAAyBF,EAAoB,EAClDA,EAAmBG;;AAI4B,SAAxDF,QAAOC,IAAK,gCAAgCb,IAAY,EACjD,MAAMM,EAAaS,mBAAmBC,8BAC3C,EAAAhB,cAGF,CAAC;IAEJ,EAAAE,EAAA,KAAAG,GAAAH,EAAA,KAAAI,GAAAJ,EAAA,KAAAK,KAAAA,IAAAL,EAAA,IAtBMN,EAA+DW,EAsBpE;;AAUJ,SAAeU,EAAAC,GAAA;CAAA,IAAAhB,IAAAC,EAAA,EAAA,EAUb,EAAAC,aAAAe,MACElB,GAAmC,EACrC,EAAAG,aAAAgB,MAAyC9B,GAAsB,EAAAiB;AAAA,CAAAL,EAAA,OAAAiB,KAAAjB,EAAA,OAAAkB,KAQjDb,IAAA,OAAAE,MAAA;EAAO,IAAA,EAAAV,sBAAAC,WAAAqB,MAAAZ;AACjB,MAAI,EAAEV,KAAAsB,GACJ,OAAUX,MACR,4FACD;EAEH,IAAAY,IAAgB,MAAMH,EAAmB;GAAApB;GAAAC,WAE5BqB;GACZ,CAAC,EACFrB,IAAkBsB,EAAOtB;AACzB,MAAA;GACE,IAAAuB,IAA8B,MAAMH,EAAgBpB,EAAU;AAEhB,UAD9CY,QAAOC,IAAK,oBAAoBU,EAAsB,EAG/C;IAAAD;IAAAE,SAFSD,EAAqBC;IAKpC;WAAAC,GAAA;AAED,SAAUf,MAAM,2BAA2B,EAAAiB,
|
|
1
|
+
{"version":3,"file":"useInitializeGridConnection.js","names":["useCreateGridReplica","useCreateGridSession","useSynapseContext","CreateGridRequest","GridReplica","GridSession","useMutation","UseMutationOptions","CreateOrGetGridSessionInput","createGridRequest","sessionId","useCreateOrGetExistingGridSession","$","_c","mutateAsync","startGridSession","synapseClient","t0","mutationFn","t1","Error","gridSessionResponse","console","log","gridSession","gridServicesClient","getRepoV1GridSessionSessionId","useInitializeGridConnection","options","createOrGetSession","createReplicaId","sessionIdArg","session","createReplicaResponse","replica","t2","error","cause"],"sources":["../../../src/components/DataGrid/useInitializeGridConnection.ts"],"sourcesContent":["import {\n useCreateGridReplica,\n useCreateGridSession,\n} from '@/synapse-queries/grid/useGridSession'\nimport { useSynapseContext } from '@/utils/context/SynapseContext'\nimport {\n CreateGridRequest,\n GridReplica,\n GridSession,\n} from '@sage-bionetworks/synapse-client'\nimport { useMutation, UseMutationOptions } from '@tanstack/react-query'\n\nexport type CreateOrGetGridSessionInput = {\n createGridRequest?: CreateGridRequest\n sessionId?: string\n}\n\n/**\n * Create a new grid session or retrieve an existing one based on the provided SQL query or session ID.\n */\nfunction useCreateOrGetExistingGridSession() {\n const { mutateAsync: startGridSession } = useCreateGridSession()\n const { synapseClient } = useSynapseContext()\n return useMutation<GridSession, unknown, CreateOrGetGridSessionInput>({\n mutationFn: async ({ createGridRequest, sessionId }) => {\n if (!(createGridRequest || sessionId)) {\n throw new Error(\n 'Must provide either a CreateGridRequest or sessionId to create or get a grid session.',\n )\n }\n\n if (createGridRequest) {\n const gridSessionResponse = await startGridSession(createGridRequest)\n console.log('Grid session started:', gridSessionResponse)\n return gridSessionResponse.gridSession!\n }\n\n // The input is a sessionId, so retrieve the session object\n console.log(`Joining existing session ID: ${sessionId}`)\n return await synapseClient.gridServicesClient.getRepoV1GridSessionSessionId(\n {\n sessionId: sessionId!,\n },\n )\n },\n })\n}\n\n/**\n * Mutation to establish a grid connection by creating or getting an existing session and creating a replica.\n *\n * @param gridSqlOrSessionId - The SQL query or session ID to use for the grid connection.\n * @param schemaId - Optional schema ID to associate with the session.\n * @param options\n */\nexport default function useInitializeGridConnection(\n options?: Omit<\n UseMutationOptions<\n { session: GridSession; replica: GridReplica },\n unknown,\n CreateOrGetGridSessionInput\n >,\n 'mutationFn'\n >,\n) {\n const { mutateAsync: createOrGetSession } =\n useCreateOrGetExistingGridSession()\n const { mutateAsync: createReplicaId } = useCreateGridReplica()\n\n return useMutation<\n { session: GridSession; replica: GridReplica },\n unknown,\n CreateOrGetGridSessionInput\n >({\n ...options,\n mutationFn: async ({ createGridRequest, sessionId: sessionIdArg }) => {\n if (!(createGridRequest || sessionIdArg)) {\n throw new Error(\n 'Must provide either a SQL query, recordSetId, or sessionId to initialize grid connection.',\n )\n }\n const session = await createOrGetSession({\n createGridRequest,\n sessionId: sessionIdArg,\n })\n const sessionId = session.sessionId!\n try {\n const createReplicaResponse = await createReplicaId(sessionId)\n console.log('Replica created:', createReplicaResponse)\n const replica = createReplicaResponse.replica!\n\n return {\n session,\n replica,\n }\n } catch (error) {\n throw new Error('Error starting session:', { cause: error })\n }\n },\n })\n}\n"],"mappings":";;;;;AAoBA,SAAAW,IAAA;CAAA,IAAAC,IAAAC,EAAA,EAAA,EACE,EAAAC,aAAAC,MAA0Cd,GAAsB,EAChE,EAAAe,qBAA0Bd,GAAmB,EAAAe;AAuB5C,QAvB4CL,EAAA,OAAAG,KAAAH,EAAA,OAAAI,KACyBC,IAAA,EAAAC,YACxD,OAAAC,MAAA;EAAO,IAAA,EAAAV,sBAAAC,iBAAAS;AACjB,MAAI,EAAEV,KAAAC,GACJ,OAAUU,MACR,wFACD;AAGH,MAAIX,GAAiB;GACnB,IAAAY,IAA4B,MAAMN,EAAiBN,EAAkB;AACZ,UAAzDa,QAAOC,IAAK,yBAAyBF,EAAoB,EAClDA,EAAmBG;;AAI4B,SAAxDF,QAAOC,IAAK,gCAAgCb,IAAY,EACjD,MAAMM,EAAaS,mBAAmBC,8BAC3C,EAAAhB,cAGF,CAAC;IAEJ,EAAAE,EAAA,KAAAG,GAAAH,EAAA,KAAAI,GAAAJ,EAAA,KAAAK,KAAAA,IAAAL,EAAA,IAtBMN,EAA+DW,EAsBpE;;AAUJ,SAAeU,EAAAC,GAAA;CAAA,IAAAhB,IAAAC,EAAA,EAAA,EAUb,EAAAC,aAAAe,MACElB,GAAmC,EACrC,EAAAG,aAAAgB,MAAyC9B,GAAsB,EAAAiB;AAAA,CAAAL,EAAA,OAAAiB,KAAAjB,EAAA,OAAAkB,KAQjDb,IAAA,OAAAE,MAAA;EAAO,IAAA,EAAAV,sBAAAC,WAAAqB,MAAAZ;AACjB,MAAI,EAAEV,KAAAsB,GACJ,OAAUX,MACR,4FACD;EAEH,IAAAY,IAAgB,MAAMH,EAAmB;GAAApB;GAAAC,WAE5BqB;GACZ,CAAC,EACFrB,IAAkBsB,EAAOtB;AACzB,MAAA;GACE,IAAAuB,IAA8B,MAAMH,EAAgBpB,EAAU;AAEhB,UAD9CY,QAAOC,IAAK,oBAAoBU,EAAsB,EAG/C;IAAAD;IAAAE,SAFSD,EAAqBC;IAKpC;WAAAC,GAAA;AAED,SAAUf,MAAM,2BAA2B,EAAAiB,OAASD,GAAO,CAAC;;IAE/DxB,EAAA,KAAAiB,GAAAjB,EAAA,KAAAkB,GAAAlB,EAAA,KAAAK,KAAAA,IAAAL,EAAA;CAAA,IAAAO;AACF,QADEP,EAAA,OAAAgB,KAAAhB,EAAA,OAAAK,KAzBDE,IAAA;EAAA,GACGS;EAAOV,YACED;EAwBb,EAAAL,EAAA,KAAAgB,GAAAhB,EAAA,KAAAK,GAAAL,EAAA,KAAAO,KAAAA,IAAAP,EAAA,IA9BMN,EAILa,EA0BA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useMergeGridWithRecordSet.js","names":["useSynapseContext","GridRecordSetExportRequest","GridRecordSetExportResponse","SynapseClientError","waitForAsyncResult","useMutation","UseMutationOptions","MergeGridWithRecordSetInput","gridSessionId","useMergeGridWithRecordSet","options","$","_c","synapseClient","t0","t1","gridExportRequest","sessionId","concreteType","asyncJobId","gridServicesClient","postRepoV1GridExportRecordsetAsyncStart","gridRecordSetExportRequest","asyncJobResponse","asynchronousJobServicesClient","getRepoV1AsynchronousJobJobId","jobId","token","responseBody","mutationFn"],"sources":["../../../src/components/DataGrid/useMergeGridWithRecordSet.ts"],"sourcesContent":["import { useSynapseContext } from '@/utils'\nimport {\n GridRecordSetExportRequest,\n GridRecordSetExportResponse,\n SynapseClientError,\n waitForAsyncResult,\n} from '@sage-bionetworks/synapse-client'\nimport { useMutation, UseMutationOptions } from '@tanstack/react-query'\n\nexport type MergeGridWithRecordSetInput = {\n gridSessionId: string\n}\n\n/**\n * Query mutation hook for exporting a grid session back into a RecordSet.\n */\nexport default function useMergeGridWithRecordSet(\n options?: Omit<\n UseMutationOptions<\n GridRecordSetExportResponse,\n SynapseClientError,\n MergeGridWithRecordSetInput\n >,\n 'mutationFn'\n >,\n) {\n const { synapseClient } = useSynapseContext()\n\n return useMutation<\n GridRecordSetExportResponse,\n SynapseClientError,\n MergeGridWithRecordSetInput\n >({\n ...options,\n mutationFn: async ({ gridSessionId }) => {\n const gridExportRequest: GridRecordSetExportRequest = {\n sessionId: gridSessionId,\n concreteType:\n 'org.sagebionetworks.repo.model.grid.GridRecordSetExportRequest',\n }\n\n // Start the async export job\n const asyncJobId =\n await synapseClient.gridServicesClient.postRepoV1GridExportRecordsetAsyncStart(\n { gridRecordSetExportRequest: gridExportRequest },\n )\n\n // Poll for the async job\n const asyncJobResponse = await waitForAsyncResult(() =>\n synapseClient.asynchronousJobServicesClient.getRepoV1AsynchronousJobJobId(\n {\n jobId: asyncJobId.token!,\n },\n ),\n )\n\n return asyncJobResponse.responseBody as GridRecordSetExportResponse\n },\n })\n}\n"],"mappings":";;;;;;AAgBA,SAAeS,EAAAC,GAAA;CAAA,IAAAC,IAAAC,EAAA,EAAA,EAUb,EAAAC,qBAA0Bb,GAAmB,EAAAc;AAAA,CAAAH,EAAA,OAAAE,IA+B1CC,IAAAH,EAAA,MAvBWG,IAAA,OAAAC,MAAA;EAAO,IAAA,EAAAP,qBAAAO,GACjBC,IAAsD;GAAAC,WACzCT;GAAaU,cAEtB;GACH,EAGDC,IACE,MAAMN,EAAaO,mBAAmBC,wCACpC,EAAAC,4BAA8BN,GAChC,CAAC;AASF,
|
|
1
|
+
{"version":3,"file":"useMergeGridWithRecordSet.js","names":["useSynapseContext","GridRecordSetExportRequest","GridRecordSetExportResponse","SynapseClientError","waitForAsyncResult","useMutation","UseMutationOptions","MergeGridWithRecordSetInput","gridSessionId","useMergeGridWithRecordSet","options","$","_c","synapseClient","t0","t1","gridExportRequest","sessionId","concreteType","asyncJobId","gridServicesClient","postRepoV1GridExportRecordsetAsyncStart","gridRecordSetExportRequest","asyncJobResponse","asynchronousJobServicesClient","getRepoV1AsynchronousJobJobId","jobId","token","responseBody","mutationFn"],"sources":["../../../src/components/DataGrid/useMergeGridWithRecordSet.ts"],"sourcesContent":["import { useSynapseContext } from '@/utils'\nimport {\n GridRecordSetExportRequest,\n GridRecordSetExportResponse,\n SynapseClientError,\n waitForAsyncResult,\n} from '@sage-bionetworks/synapse-client'\nimport { useMutation, UseMutationOptions } from '@tanstack/react-query'\n\nexport type MergeGridWithRecordSetInput = {\n gridSessionId: string\n}\n\n/**\n * Query mutation hook for exporting a grid session back into a RecordSet.\n */\nexport default function useMergeGridWithRecordSet(\n options?: Omit<\n UseMutationOptions<\n GridRecordSetExportResponse,\n SynapseClientError,\n MergeGridWithRecordSetInput\n >,\n 'mutationFn'\n >,\n) {\n const { synapseClient } = useSynapseContext()\n\n return useMutation<\n GridRecordSetExportResponse,\n SynapseClientError,\n MergeGridWithRecordSetInput\n >({\n ...options,\n mutationFn: async ({ gridSessionId }) => {\n const gridExportRequest: GridRecordSetExportRequest = {\n sessionId: gridSessionId,\n concreteType:\n 'org.sagebionetworks.repo.model.grid.GridRecordSetExportRequest',\n }\n\n // Start the async export job\n const asyncJobId =\n await synapseClient.gridServicesClient.postRepoV1GridExportRecordsetAsyncStart(\n { gridRecordSetExportRequest: gridExportRequest },\n )\n\n // Poll for the async job\n const asyncJobResponse = await waitForAsyncResult(() =>\n synapseClient.asynchronousJobServicesClient.getRepoV1AsynchronousJobJobId(\n {\n jobId: asyncJobId.token!,\n },\n ),\n )\n\n return asyncJobResponse.responseBody as GridRecordSetExportResponse\n },\n })\n}\n"],"mappings":";;;;;;AAgBA,SAAeS,EAAAC,GAAA;CAAA,IAAAC,IAAAC,EAAA,EAAA,EAUb,EAAAC,qBAA0Bb,GAAmB,EAAAc;AAAA,CAAAH,EAAA,OAAAE,IA+B1CC,IAAAH,EAAA,MAvBWG,IAAA,OAAAC,MAAA;EAAO,IAAA,EAAAP,qBAAAO,GACjBC,IAAsD;GAAAC,WACzCT;GAAaU,cAEtB;GACH,EAGDC,IACE,MAAMN,EAAaO,mBAAmBC,wCACpC,EAAAC,4BAA8BN,GAChC,CAAC;AASF,UAEMO,MARwBnB,QAC7BS,EAAaW,8BAA8BC,8BACzC,EAAAC,OACSP,EAAUQ,OAErB,CACF,CAAC,EAEsBC;IACxBjB,EAAA,KAAAE,GAAAF,EAAA,KAAAG;CAAA,IAAAC;AACF,QADEJ,EAAA,OAAAD,KAAAC,EAAA,OAAAG,KAzBDC,IAAA;EAAA,GACGL;EAAOmB,YACEf;EAwBb,EAAAH,EAAA,KAAAD,GAAAC,EAAA,KAAAG,GAAAH,EAAA,KAAAI,KAAAA,IAAAJ,EAAA,IA9BMN,EAILU,EA0BA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useMergeGridWithSource.js","names":["useMergeGridWithTable","useMergeGridWithRecordSet","EntityType","GridRecordSetExportResponse","SynchronizeGridResponse","TableUpdateTransactionResponse","useMutation","UseMutationOptions","SynapseClientError","useSynchronizeGridSession","MergeGridWithSource","gridSessionId","sourceEntityId","sourceEntityType","MergeGridResult","type","data","useMergeGridWithSource","options","$","_c","mergeGridWithEntityView","mergeGridWithTable","mergeGridWithRecordSet","t0","t1","isEntityView","entityview","isRecordSet","recordset","mutateAsync","data_0","data_1","mutationFn"],"sources":["../../../src/components/DataGrid/useMergeGridWithSource.ts"],"sourcesContent":["import useMergeGridWithTable from './useMergeGridWithTable'\nimport useMergeGridWithRecordSet from './useMergeGridWithRecordSet'\nimport {\n EntityType,\n GridRecordSetExportResponse,\n SynchronizeGridResponse,\n TableUpdateTransactionResponse,\n} from '@sage-bionetworks/synapse-client'\nimport { useMutation, UseMutationOptions } from '@tanstack/react-query'\nimport { SynapseClientError } from '@sage-bionetworks/synapse-client'\nimport { useSynchronizeGridSession } from '@/synapse-queries/grid/useGridSession'\n\nexport type MergeGridWithSource = {\n gridSessionId: string\n sourceEntityId?: string\n sourceEntityType?: EntityType\n}\n\nexport type MergeGridResult =\n | { type: 'entityview'; data: SynchronizeGridResponse }\n | {\n type: 'recordset'\n data: GridRecordSetExportResponse\n }\n | {\n type: 'table'\n data: TableUpdateTransactionResponse\n }\n\n/**\n * Single entrypoint to handle merging grid edits with source Synapse data.\n * Calls the appropriate mutation based on entity type:\n * - EntityView -> useSynchronizeGridSession\n * - TableEntity -> useMergeGridWithTable\n * - RecordSet -> useMergeGridWithRecordSet\n *\n * Returns a query mutation that handles merging for tables or recordsets.\n */\nexport default function useMergeGridWithSource(\n options?: Omit<\n UseMutationOptions<\n MergeGridResult,\n SynapseClientError,\n MergeGridWithSource\n >,\n 'mutationFn'\n >,\n) {\n // SynchronizeGridSession is the best option, but currently only supports EntityViews.\n // As support for other types is added, the other hooks should be replaced.\n const mergeGridWithEntityView = useSynchronizeGridSession()\n const mergeGridWithTable = useMergeGridWithTable()\n const mergeGridWithRecordSet = useMergeGridWithRecordSet()\n\n return useMutation<MergeGridResult, SynapseClientError, MergeGridWithSource>({\n ...options,\n mutationFn: async ({ gridSessionId, sourceEntityId, sourceEntityType }) => {\n const isEntityView = sourceEntityType === EntityType.entityview\n const isRecordSet = sourceEntityType === EntityType.recordset\n\n if (isEntityView) {\n const data = await mergeGridWithEntityView.mutateAsync({\n gridSessionId,\n })\n return { type: 'entityview', data }\n } else if (isRecordSet) {\n const data = await mergeGridWithRecordSet.mutateAsync({ gridSessionId })\n return { type: 'recordset', data }\n } else {\n const data = await mergeGridWithTable.mutateAsync({\n gridSessionId,\n sourceEntityId: sourceEntityId!,\n })\n return { type: 'table', data }\n }\n },\n })\n}\n"],"mappings":";;;;;;;AAsCA,SAAeiB,EAAAC,GAAA;CAAA,IAAAC,IAAAC,EAAA,EAAA,EAYbC,IAAgCZ,GAA2B,EAC3Da,IAA2BtB,GAAuB,EAClDuB,IAA+BtB,GAA2B,EAAAuB;AAAA,CAAAL,EAAA,OAAAE,KAAAF,EAAA,OAAAI,KAAAJ,EAAA,OAAAG,KAI5CE,IAAA,OAAAC,MAAA;EAAO,IAAA,EAAAd,kBAAAC,mBAAAC,wBAAAY,GACjBC,IAAqBb,MAAqBX,EAAUyB,YACpDC,IAAoBf,MAAqBX,EAAU2B;AAc/C,SAZAH,IAIK;GAAAX,MAAQ;GAAYC,
|
|
1
|
+
{"version":3,"file":"useMergeGridWithSource.js","names":["useMergeGridWithTable","useMergeGridWithRecordSet","EntityType","GridRecordSetExportResponse","SynchronizeGridResponse","TableUpdateTransactionResponse","useMutation","UseMutationOptions","SynapseClientError","useSynchronizeGridSession","MergeGridWithSource","gridSessionId","sourceEntityId","sourceEntityType","MergeGridResult","type","data","useMergeGridWithSource","options","$","_c","mergeGridWithEntityView","mergeGridWithTable","mergeGridWithRecordSet","t0","t1","isEntityView","entityview","isRecordSet","recordset","mutateAsync","data_0","data_1","mutationFn"],"sources":["../../../src/components/DataGrid/useMergeGridWithSource.ts"],"sourcesContent":["import useMergeGridWithTable from './useMergeGridWithTable'\nimport useMergeGridWithRecordSet from './useMergeGridWithRecordSet'\nimport {\n EntityType,\n GridRecordSetExportResponse,\n SynchronizeGridResponse,\n TableUpdateTransactionResponse,\n} from '@sage-bionetworks/synapse-client'\nimport { useMutation, UseMutationOptions } from '@tanstack/react-query'\nimport { SynapseClientError } from '@sage-bionetworks/synapse-client'\nimport { useSynchronizeGridSession } from '@/synapse-queries/grid/useGridSession'\n\nexport type MergeGridWithSource = {\n gridSessionId: string\n sourceEntityId?: string\n sourceEntityType?: EntityType\n}\n\nexport type MergeGridResult =\n | { type: 'entityview'; data: SynchronizeGridResponse }\n | {\n type: 'recordset'\n data: GridRecordSetExportResponse\n }\n | {\n type: 'table'\n data: TableUpdateTransactionResponse\n }\n\n/**\n * Single entrypoint to handle merging grid edits with source Synapse data.\n * Calls the appropriate mutation based on entity type:\n * - EntityView -> useSynchronizeGridSession\n * - TableEntity -> useMergeGridWithTable\n * - RecordSet -> useMergeGridWithRecordSet\n *\n * Returns a query mutation that handles merging for tables or recordsets.\n */\nexport default function useMergeGridWithSource(\n options?: Omit<\n UseMutationOptions<\n MergeGridResult,\n SynapseClientError,\n MergeGridWithSource\n >,\n 'mutationFn'\n >,\n) {\n // SynchronizeGridSession is the best option, but currently only supports EntityViews.\n // As support for other types is added, the other hooks should be replaced.\n const mergeGridWithEntityView = useSynchronizeGridSession()\n const mergeGridWithTable = useMergeGridWithTable()\n const mergeGridWithRecordSet = useMergeGridWithRecordSet()\n\n return useMutation<MergeGridResult, SynapseClientError, MergeGridWithSource>({\n ...options,\n mutationFn: async ({ gridSessionId, sourceEntityId, sourceEntityType }) => {\n const isEntityView = sourceEntityType === EntityType.entityview\n const isRecordSet = sourceEntityType === EntityType.recordset\n\n if (isEntityView) {\n const data = await mergeGridWithEntityView.mutateAsync({\n gridSessionId,\n })\n return { type: 'entityview', data }\n } else if (isRecordSet) {\n const data = await mergeGridWithRecordSet.mutateAsync({ gridSessionId })\n return { type: 'recordset', data }\n } else {\n const data = await mergeGridWithTable.mutateAsync({\n gridSessionId,\n sourceEntityId: sourceEntityId!,\n })\n return { type: 'table', data }\n }\n },\n })\n}\n"],"mappings":";;;;;;;AAsCA,SAAeiB,EAAAC,GAAA;CAAA,IAAAC,IAAAC,EAAA,EAAA,EAYbC,IAAgCZ,GAA2B,EAC3Da,IAA2BtB,GAAuB,EAClDuB,IAA+BtB,GAA2B,EAAAuB;AAAA,CAAAL,EAAA,OAAAE,KAAAF,EAAA,OAAAI,KAAAJ,EAAA,OAAAG,KAI5CE,IAAA,OAAAC,MAAA;EAAO,IAAA,EAAAd,kBAAAC,mBAAAC,wBAAAY,GACjBC,IAAqBb,MAAqBX,EAAUyB,YACpDC,IAAoBf,MAAqBX,EAAU2B;AAc/C,SAZAH,IAIK;GAAAX,MAAQ;GAAYC,MAAAA,MAHRK,EAAuBS,YAAa,EAAAnB,kBAEtD,CAAC;GACiC,GAC1BiB,IAEF;GAAAb,MAAQ;GAAWC,MAAEA,MADTO,EAAsBO,YAAa,EAAAnB,kBAAiB,CAAC;GACtC,GAM3B;GAAAI,MAAQ;GAAOC,MAAEA,MAJLM,EAAkBQ,YAAa;IAAAnB;IAAAC;IAGjD,CAAC;GAC4B;IAEjCO,EAAA,KAAAE,GAAAF,EAAA,KAAAI,GAAAJ,EAAA,KAAAG,GAAAH,EAAA,KAAAK,KAAAA,IAAAL,EAAA;CAAA,IAAAM;AACF,QADEN,EAAA,OAAAD,KAAAC,EAAA,OAAAK,KArB0EC,IAAA;EAAA,GACxEP;EAAOe,YACET;EAoBb,EAAAL,EAAA,KAAAD,GAAAC,EAAA,KAAAK,GAAAL,EAAA,KAAAM,KAAAA,IAAAN,EAAA,IAtBMb,EAAsEmB,EAsB3E"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useMergeGridWithTable.js","names":["useExportGridAsCsv","useGetEntityQueryOptions","useTableUpdateTransaction","SynapseClientError","DownloadFromGridRequest","Entity","instanceOfTableEntity","TableUpdateTransactionRequest","TableUpdateTransactionResponse","useMutation","UseMutationOptions","useQueryClient","useMergeGridWithTable","options","$","_c","queryClient","mutateAsync","exportGridToCsv","updateTable","getEntityQueryOptions","t0","t1","gridSessionId","sourceEntityId","entity","fetchQuery","gridExportRequest","getDownloadFromGridRequestParamsForEntity","sessionId","gridExportResult","tableUpdateRequest","concreteType","entityId","changes","uploadFileHandleId","resultsFileHandleId","tableId","mutationFn","Omit","includeRowIdAndRowVersion","includeEtag"],"sources":["../../../src/components/DataGrid/useMergeGridWithTable.ts"],"sourcesContent":["import { useExportGridAsCsv } from '@/synapse-queries/grid/useExportGrid'\nimport { useGetEntityQueryOptions } from '@/synapse-queries/entity/useEntity'\nimport { useTableUpdateTransaction } from '@/synapse-queries/table/useTableUpdateTransaction'\nimport { SynapseClientError } from '@/utils/index'\nimport {\n DownloadFromGridRequest,\n Entity,\n instanceOfTableEntity,\n TableUpdateTransactionRequest,\n TableUpdateTransactionResponse,\n} from '@sage-bionetworks/synapse-client'\nimport {\n useMutation,\n UseMutationOptions,\n useQueryClient,\n} from '@tanstack/react-query'\n\n/**\n * Mutation hook that exports a grid session to CSV and applies the changes to a Synapse table.\n */\nexport default function useMergeGridWithTable(\n options?: Omit<\n UseMutationOptions<\n TableUpdateTransactionResponse,\n SynapseClientError,\n { gridSessionId: string; sourceEntityId: string }\n >,\n 'mutationFn'\n >,\n) {\n const queryClient = useQueryClient()\n const { mutateAsync: exportGridToCsv } = useExportGridAsCsv()\n const { mutateAsync: updateTable } = useTableUpdateTransaction()\n const getEntityQueryOptions = useGetEntityQueryOptions()\n return useMutation<\n TableUpdateTransactionResponse,\n SynapseClientError,\n { gridSessionId: string; sourceEntityId: string }\n >({\n ...options,\n mutationFn: async ({ gridSessionId, sourceEntityId }) => {\n // First, get the type of the source entity. The request body for the export varies based on the entity type.\n const entity = await queryClient.fetchQuery(\n getEntityQueryOptions(sourceEntityId),\n )\n\n const gridExportRequest: DownloadFromGridRequest = {\n ...getDownloadFromGridRequestParamsForEntity(entity),\n sessionId: gridSessionId,\n }\n\n const gridExportResult = await exportGridToCsv(gridExportRequest)\n\n const tableUpdateRequest: TableUpdateTransactionRequest = {\n concreteType:\n 'org.sagebionetworks.repo.model.table.TableUpdateTransactionRequest',\n entityId: sourceEntityId,\n changes: [\n {\n uploadFileHandleId: gridExportResult.resultsFileHandleId,\n tableId: sourceEntityId,\n concreteType:\n 'org.sagebionetworks.repo.model.table.UploadToTableRequest',\n },\n ],\n }\n return updateTable(tableUpdateRequest)\n },\n })\n}\n\nexport function getDownloadFromGridRequestParamsForEntity(\n entity: Entity,\n): Omit<DownloadFromGridRequest, 'sessionId'> {\n if (instanceOfTableEntity(entity)) {\n return {\n includeRowIdAndRowVersion: true,\n includeEtag: false,\n concreteType:\n 'org.sagebionetworks.repo.model.grid.DownloadFromGridRequest',\n }\n } else {\n return {\n includeRowIdAndRowVersion: true,\n includeEtag: true,\n concreteType:\n 'org.sagebionetworks.repo.model.grid.DownloadFromGridRequest',\n }\n }\n}\n"],"mappings":";;;;;;;AAoBA,SAAeY,EAAAC,GAAA;CAAA,IAAAC,IAAAC,EAAA,EAAA,EAUbC,IAAoBL,GAAgB,EACpC,EAAAM,aAAAC,MAAyClB,GAAoB,EAC7D,EAAAiB,aAAAE,MAAqCjB,GAA2B,EAChEkB,IAA8BnB,GAA0B,EAAAoB;AAAA,CAAAP,EAAA,OAAAI,KAAAJ,EAAA,OAAAM,KAAAN,EAAA,OAAAE,KAAAF,EAAA,OAAAK,KAO1CE,IAAA,OAAAC,MAAA;EAAO,IAAA,EAAAC,kBAAAC,sBAAAF;AAyBhB,SACMH,
|
|
1
|
+
{"version":3,"file":"useMergeGridWithTable.js","names":["useExportGridAsCsv","useGetEntityQueryOptions","useTableUpdateTransaction","SynapseClientError","DownloadFromGridRequest","Entity","instanceOfTableEntity","TableUpdateTransactionRequest","TableUpdateTransactionResponse","useMutation","UseMutationOptions","useQueryClient","useMergeGridWithTable","options","$","_c","queryClient","mutateAsync","exportGridToCsv","updateTable","getEntityQueryOptions","t0","t1","gridSessionId","sourceEntityId","entity","fetchQuery","gridExportRequest","getDownloadFromGridRequestParamsForEntity","sessionId","gridExportResult","tableUpdateRequest","concreteType","entityId","changes","uploadFileHandleId","resultsFileHandleId","tableId","mutationFn","Omit","includeRowIdAndRowVersion","includeEtag"],"sources":["../../../src/components/DataGrid/useMergeGridWithTable.ts"],"sourcesContent":["import { useExportGridAsCsv } from '@/synapse-queries/grid/useExportGrid'\nimport { useGetEntityQueryOptions } from '@/synapse-queries/entity/useEntity'\nimport { useTableUpdateTransaction } from '@/synapse-queries/table/useTableUpdateTransaction'\nimport { SynapseClientError } from '@/utils/index'\nimport {\n DownloadFromGridRequest,\n Entity,\n instanceOfTableEntity,\n TableUpdateTransactionRequest,\n TableUpdateTransactionResponse,\n} from '@sage-bionetworks/synapse-client'\nimport {\n useMutation,\n UseMutationOptions,\n useQueryClient,\n} from '@tanstack/react-query'\n\n/**\n * Mutation hook that exports a grid session to CSV and applies the changes to a Synapse table.\n */\nexport default function useMergeGridWithTable(\n options?: Omit<\n UseMutationOptions<\n TableUpdateTransactionResponse,\n SynapseClientError,\n { gridSessionId: string; sourceEntityId: string }\n >,\n 'mutationFn'\n >,\n) {\n const queryClient = useQueryClient()\n const { mutateAsync: exportGridToCsv } = useExportGridAsCsv()\n const { mutateAsync: updateTable } = useTableUpdateTransaction()\n const getEntityQueryOptions = useGetEntityQueryOptions()\n return useMutation<\n TableUpdateTransactionResponse,\n SynapseClientError,\n { gridSessionId: string; sourceEntityId: string }\n >({\n ...options,\n mutationFn: async ({ gridSessionId, sourceEntityId }) => {\n // First, get the type of the source entity. The request body for the export varies based on the entity type.\n const entity = await queryClient.fetchQuery(\n getEntityQueryOptions(sourceEntityId),\n )\n\n const gridExportRequest: DownloadFromGridRequest = {\n ...getDownloadFromGridRequestParamsForEntity(entity),\n sessionId: gridSessionId,\n }\n\n const gridExportResult = await exportGridToCsv(gridExportRequest)\n\n const tableUpdateRequest: TableUpdateTransactionRequest = {\n concreteType:\n 'org.sagebionetworks.repo.model.table.TableUpdateTransactionRequest',\n entityId: sourceEntityId,\n changes: [\n {\n uploadFileHandleId: gridExportResult.resultsFileHandleId,\n tableId: sourceEntityId,\n concreteType:\n 'org.sagebionetworks.repo.model.table.UploadToTableRequest',\n },\n ],\n }\n return updateTable(tableUpdateRequest)\n },\n })\n}\n\nexport function getDownloadFromGridRequestParamsForEntity(\n entity: Entity,\n): Omit<DownloadFromGridRequest, 'sessionId'> {\n if (instanceOfTableEntity(entity)) {\n return {\n includeRowIdAndRowVersion: true,\n includeEtag: false,\n concreteType:\n 'org.sagebionetworks.repo.model.grid.DownloadFromGridRequest',\n }\n } else {\n return {\n includeRowIdAndRowVersion: true,\n includeEtag: true,\n concreteType:\n 'org.sagebionetworks.repo.model.grid.DownloadFromGridRequest',\n }\n }\n}\n"],"mappings":";;;;;;;AAoBA,SAAeY,EAAAC,GAAA;CAAA,IAAAC,IAAAC,EAAA,EAAA,EAUbC,IAAoBL,GAAgB,EACpC,EAAAM,aAAAC,MAAyClB,GAAoB,EAC7D,EAAAiB,aAAAE,MAAqCjB,GAA2B,EAChEkB,IAA8BnB,GAA0B,EAAAoB;AAAA,CAAAP,EAAA,OAAAI,KAAAJ,EAAA,OAAAM,KAAAN,EAAA,OAAAE,KAAAF,EAAA,OAAAK,KAO1CE,IAAA,OAAAC,MAAA;EAAO,IAAA,EAAAC,kBAAAC,sBAAAF;AAyBhB,SACMH,EAAYY;GAbuCC,cAEtD;GAAoEC,UAC5DT;GAAcU,SACf,CACP;IAAAC,qBACsBL,MARKZ,EAAgBS;KALI,GAC9CC,EAA0CH,MAL1BT,EAAWU,WAC9BN,EAAsBI,EACxB,CAAC,CAGqD;KAAAK,WACzCN;KAGkCI,CAAkB,EAQvBS;IAAoBC,SAC/Cb;IAAcQ,cAErB;IACH,CAAA;GAGcD,CAAmB;IACvCjB,EAAA,KAAAI,GAAAJ,EAAA,KAAAM,GAAAN,EAAA,KAAAE,GAAAF,EAAA,KAAAK,GAAAL,EAAA,KAAAO,KAAAA,IAAAP,EAAA;CAAA,IAAAQ;AACF,QADER,EAAA,OAAAD,KAAAC,EAAA,OAAAO,KA7BDC,IAAA;EAAA,GACGT;EAAOyB,YACEjB;EA4Bb,EAAAP,EAAA,KAAAD,GAAAC,EAAA,KAAAO,GAAAP,EAAA,KAAAQ,KAAAA,IAAAR,EAAA,IAlCML,EAILa,EA8BA;;AAGJ,SAAgBM,EACdH,GAC4C;AAS1C,QAREnB,EAAsBmB,EAAO,GACxB;EACLe,2BAA2B;EAC3BC,aAAa;EACbT,cACE;EACH,GAEM;EACLQ,2BAA2B;EAC3BC,aAAa;EACbT,cACE;EACH"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DataGridUtils.js","names":["SYNAPSE_ENTITY_ID_REGEX","DataGridRow","Operation","QueryInput","GRID_ROW_REACT_KEY_PROPERTY","parseQueryInput","input","trimmedInput","trim","type","toUpperCase","startsWith","test","rowsAreIdentical","a","b","isDataKey","key","aKeys","Object","keys","filter","bKeys","length","aVal","bVal","isNullish","v","undefined","String","removeNoOpOperations","newValue","rowValues","operations","isNoop","operation","oldVal","slice","fromRowIndex","toRowIndex","newVal","comparisonResults","map","oldItem","idx","every","Boolean","op"],"sources":["../../../../src/components/DataGrid/utils/DataGridUtils.ts"],"sourcesContent":["import { SYNAPSE_ENTITY_ID_REGEX } from '@/utils/functions/RegularExpressions'\nimport { DataGridRow, Operation, QueryInput } from '../DataGridTypes'\n\n// We embed a value into the in row data passed to react-datasheet-grid for use as a render optimization\nexport const GRID_ROW_REACT_KEY_PROPERTY = '__rowKey'\n\n// Query Input can either be an empty string, a SQL query, or a session ID\nexport const parseQueryInput = (input: string): QueryInput => {\n const trimmedInput = input.trim()\n if (!trimmedInput) {\n return { type: 'empty', input: '' }\n } else if (trimmedInput.toUpperCase().startsWith('SELECT')) {\n return { type: 'sql', input: trimmedInput }\n } else if (SYNAPSE_ENTITY_ID_REGEX.test(trimmedInput)) {\n return { type: 'recordSetId', input: trimmedInput }\n } else if (/^[A-Za-z]\\w*=+$/.test(trimmedInput)) {\n return { type: 'sessionId', input: trimmedInput }\n }\n return { type: 'unknown', input: trimmedInput }\n}\n\nexport function rowsAreIdentical(a: DataGridRow, b: DataGridRow): boolean {\n const isDataKey = (key: string) => !key.startsWith('__')\n const aKeys = Object.keys(a).filter(isDataKey)\n const bKeys = Object.keys(b).filter(isDataKey)\n if (aKeys.length !== bKeys.length) return false\n for (const key of aKeys) {\n const aVal = a[key] as string | number | boolean | null | undefined\n const bVal = b[key] as string | number | boolean | null | undefined\n // Treat null, undefined, and empty string as equivalent\n const isNullish = (v: unknown) => v === null || v === undefined || v === ''\n if (isNullish(aVal) && isNullish(bVal)) continue\n if (String(aVal) !== String(bVal)) return false\n }\n return true\n}\n\n/**\n * Remove no-op operations created by react-datasheet-grid that would result in invalid or undesired changes to the json-joy CRDT model\n * @param newValue\n * @param rowValues\n * @param operations\n */\nexport function removeNoOpOperations(\n newValue: DataGridRow[],\n rowValues: DataGridRow[],\n operations: Operation[],\n) {\n function isNoop(operation: Operation): boolean {\n if (operation.type === 'UPDATE') {\n const oldVal = rowValues.slice(\n operation.fromRowIndex,\n operation.toRowIndex,\n )\n const newVal = newValue.slice(\n operation.fromRowIndex,\n operation.toRowIndex,\n )\n\n const comparisonResults = oldVal.map((oldItem, idx) =>\n rowsAreIdentical(oldItem, newVal[idx]),\n )\n return comparisonResults.every(Boolean)\n }\n return false\n }\n\n return operations.filter(op => !isNoop(op))\n}\n"],"mappings":";;AAIA,IAAaI,IAA8B,YAG9BC,KAAmBC,MAA8B;CAC5D,IAAMC,IAAeD,EAAME,MAAM;AAUjC,QATKD,IAEMA,EAAaG,aAAa,CAACC,WAAW,SAAS,GACjD;EAAEF,MAAM;EAAOH,OAAOC;EAAc,GAClCP,EAAwBY,KAAKL,EAAa,GAC5C;EAAEE,MAAM;EAAeH,OAAOC;EAAc,GAC1C,kBAAkBK,KAAKL,EAAa,GACtC;EAAEE,MAAM;EAAaH,OAAOC;EAAc,GAE5C;EAAEE,MAAM;EAAWH,OAAOC;EAAc,GARtC;EAAEE,MAAM;EAASH,OAAO;EAAI;;AAWvC,SAAgBO,EAAiBC,GAAgBC,GAAyB;CACxE,IAAMC,KAAaC,MAAgB,CAACA,EAAIN,WAAW,KAAK,EAClDO,IAAQC,OAAOC,KAAKN,EAAE,CAACO,OAAOL,EAAU,EACxCM,IAAQH,OAAOC,KAAKL,EAAE,CAACM,OAAOL,EAAU;AAC9C,KAAIE,EAAMK,WAAWD,EAAMC,OAAQ,QAAO;AAC1C,MAAK,IAAMN,KAAOC,GAAO;EACvB,IAAMM,IAAOV,EAAEG,IACTQ,IAAOV,EAAEE,IAETS,KAAaC,MAAeA,KAAM,QAA2BA,MAAM;AACrED,UAAUF,EAAK,IAAIE,EAAUD,EAAK,KAClCI,OAAOL,EAAK,KAAKK,OAAOJ,EAAK,CAAE,QAAO;;AAE5C,QAAO;;AAST,SAAgBK,EACdC,GACAC,GACAC,GACA;CACA,SAASC,EAAOC,GAA+B;AAC7C,MAAIA,EAAU1B,SAAS,UAAU;GAC/B,IAAM2B,IAASJ,EAAUK,MACvBF,EAAUG,cACVH,EAAUI,WACX,EACKC,IAAST,EAASM,MACtBF,EAAUG,cACVH,EAAUI,WACX;AAKD,UAH0BH,EAAOM,KAAKC,GAASC,MAC7C/B,EAAiB8B,GAASH,EAAOI,GACnC,
|
|
1
|
+
{"version":3,"file":"DataGridUtils.js","names":["SYNAPSE_ENTITY_ID_REGEX","DataGridRow","Operation","QueryInput","GRID_ROW_REACT_KEY_PROPERTY","parseQueryInput","input","trimmedInput","trim","type","toUpperCase","startsWith","test","rowsAreIdentical","a","b","isDataKey","key","aKeys","Object","keys","filter","bKeys","length","aVal","bVal","isNullish","v","undefined","String","removeNoOpOperations","newValue","rowValues","operations","isNoop","operation","oldVal","slice","fromRowIndex","toRowIndex","newVal","comparisonResults","map","oldItem","idx","every","Boolean","op"],"sources":["../../../../src/components/DataGrid/utils/DataGridUtils.ts"],"sourcesContent":["import { SYNAPSE_ENTITY_ID_REGEX } from '@/utils/functions/RegularExpressions'\nimport { DataGridRow, Operation, QueryInput } from '../DataGridTypes'\n\n// We embed a value into the in row data passed to react-datasheet-grid for use as a render optimization\nexport const GRID_ROW_REACT_KEY_PROPERTY = '__rowKey'\n\n// Query Input can either be an empty string, a SQL query, or a session ID\nexport const parseQueryInput = (input: string): QueryInput => {\n const trimmedInput = input.trim()\n if (!trimmedInput) {\n return { type: 'empty', input: '' }\n } else if (trimmedInput.toUpperCase().startsWith('SELECT')) {\n return { type: 'sql', input: trimmedInput }\n } else if (SYNAPSE_ENTITY_ID_REGEX.test(trimmedInput)) {\n return { type: 'recordSetId', input: trimmedInput }\n } else if (/^[A-Za-z]\\w*=+$/.test(trimmedInput)) {\n return { type: 'sessionId', input: trimmedInput }\n }\n return { type: 'unknown', input: trimmedInput }\n}\n\nexport function rowsAreIdentical(a: DataGridRow, b: DataGridRow): boolean {\n const isDataKey = (key: string) => !key.startsWith('__')\n const aKeys = Object.keys(a).filter(isDataKey)\n const bKeys = Object.keys(b).filter(isDataKey)\n if (aKeys.length !== bKeys.length) return false\n for (const key of aKeys) {\n const aVal = a[key] as string | number | boolean | null | undefined\n const bVal = b[key] as string | number | boolean | null | undefined\n // Treat null, undefined, and empty string as equivalent\n const isNullish = (v: unknown) => v === null || v === undefined || v === ''\n if (isNullish(aVal) && isNullish(bVal)) continue\n if (String(aVal) !== String(bVal)) return false\n }\n return true\n}\n\n/**\n * Remove no-op operations created by react-datasheet-grid that would result in invalid or undesired changes to the json-joy CRDT model\n * @param newValue\n * @param rowValues\n * @param operations\n */\nexport function removeNoOpOperations(\n newValue: DataGridRow[],\n rowValues: DataGridRow[],\n operations: Operation[],\n) {\n function isNoop(operation: Operation): boolean {\n if (operation.type === 'UPDATE') {\n const oldVal = rowValues.slice(\n operation.fromRowIndex,\n operation.toRowIndex,\n )\n const newVal = newValue.slice(\n operation.fromRowIndex,\n operation.toRowIndex,\n )\n\n const comparisonResults = oldVal.map((oldItem, idx) =>\n rowsAreIdentical(oldItem, newVal[idx]),\n )\n return comparisonResults.every(Boolean)\n }\n return false\n }\n\n return operations.filter(op => !isNoop(op))\n}\n"],"mappings":";;AAIA,IAAaI,IAA8B,YAG9BC,KAAmBC,MAA8B;CAC5D,IAAMC,IAAeD,EAAME,MAAM;AAUjC,QATKD,IAEMA,EAAaG,aAAa,CAACC,WAAW,SAAS,GACjD;EAAEF,MAAM;EAAOH,OAAOC;EAAc,GAClCP,EAAwBY,KAAKL,EAAa,GAC5C;EAAEE,MAAM;EAAeH,OAAOC;EAAc,GAC1C,kBAAkBK,KAAKL,EAAa,GACtC;EAAEE,MAAM;EAAaH,OAAOC;EAAc,GAE5C;EAAEE,MAAM;EAAWH,OAAOC;EAAc,GARtC;EAAEE,MAAM;EAASH,OAAO;EAAI;;AAWvC,SAAgBO,EAAiBC,GAAgBC,GAAyB;CACxE,IAAMC,KAAaC,MAAgB,CAACA,EAAIN,WAAW,KAAK,EAClDO,IAAQC,OAAOC,KAAKN,EAAE,CAACO,OAAOL,EAAU,EACxCM,IAAQH,OAAOC,KAAKL,EAAE,CAACM,OAAOL,EAAU;AAC9C,KAAIE,EAAMK,WAAWD,EAAMC,OAAQ,QAAO;AAC1C,MAAK,IAAMN,KAAOC,GAAO;EACvB,IAAMM,IAAOV,EAAEG,IACTQ,IAAOV,EAAEE,IAETS,KAAaC,MAAeA,KAAM,QAA2BA,MAAM;AACrED,UAAUF,EAAK,IAAIE,EAAUD,EAAK,KAClCI,OAAOL,EAAK,KAAKK,OAAOJ,EAAK,CAAE,QAAO;;AAE5C,QAAO;;AAST,SAAgBK,EACdC,GACAC,GACAC,GACA;CACA,SAASC,EAAOC,GAA+B;AAC7C,MAAIA,EAAU1B,SAAS,UAAU;GAC/B,IAAM2B,IAASJ,EAAUK,MACvBF,EAAUG,cACVH,EAAUI,WACX,EACKC,IAAST,EAASM,MACtBF,EAAUG,cACVH,EAAUI,WACX;AAKD,UAH0BH,EAAOM,KAAKC,GAASC,MAC7C/B,EAAiB8B,GAASH,EAAOI,GACnC,CACOH,CAAkBI,MAAMC,QAAQ;;AAEzC,SAAO;;AAGT,QAAOb,EAAWZ,QAAO0B,MAAM,CAACb,EAAOa,EAAG,CAAC"}
|
|
@@ -20,7 +20,7 @@ export type ModelChange = {
|
|
|
20
20
|
replicaId: string;
|
|
21
21
|
selection: ReplicaSelectionModel;
|
|
22
22
|
};
|
|
23
|
-
export declare function getDefaultValueForProperty(row: DataGridRow, property: string, schemaPropertyInfo: SchemaPropertiesMap):
|
|
23
|
+
export declare function getDefaultValueForProperty(row: DataGridRow, property: string, schemaPropertyInfo: SchemaPropertiesMap): unknown;
|
|
24
24
|
/**
|
|
25
25
|
* Applies a single change operation (create, delete, or update) to the GridModel.
|
|
26
26
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"applyModelChange.d.ts","sourceRoot":"","sources":["../../../../src/components/DataGrid/utils/applyModelChange.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,WAAW,EACX,SAAS,EACT,qBAAqB,EACtB,MAAM,qCAAqC,CAAA;AAC5C,OAAO,EAAE,mBAAmB,EAAE,MAAM,0CAA0C,CAAA;
|
|
1
|
+
{"version":3,"file":"applyModelChange.d.ts","sourceRoot":"","sources":["../../../../src/components/DataGrid/utils/applyModelChange.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,WAAW,EACX,SAAS,EACT,qBAAqB,EACtB,MAAM,qCAAqC,CAAA;AAC5C,OAAO,EAAE,mBAAmB,EAAE,MAAM,0CAA0C,CAAA;AAM9E;;GAEG;AACH,MAAM,MAAM,WAAW,GACnB;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,WAAW,CAAA;CAAE,GAC1D;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,GACpD;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,WAAW,CAAA;CAAE,GAC9D;IACE,IAAI,EAAE,eAAe,CAAA;IACrB,SAAS,EAAE,MAAM,CAAA;IACjB,SAAS,EAAE,qBAAqB,CAAA;CACjC,CAAA;AAEL,wBAAgB,0BAA0B,CACxC,GAAG,EAAE,WAAW,EAChB,QAAQ,EAAE,MAAM,EAChB,kBAAkB,EAAE,mBAAmB,WAQxC;AAED;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAC9B,KAAK,EAAE,SAAS,EAChB,MAAM,EAAE,WAAW,EACnB,kBAAkB,EAAE,mBAAmB,QAiExC"}
|
|
@@ -1,46 +1,49 @@
|
|
|
1
|
-
import e from "
|
|
2
|
-
import {
|
|
1
|
+
import { getEmptyValue as e } from "./getEmptyValue.js";
|
|
2
|
+
import { coerceModelCellValue as t } from "./schemaAwarePasteValue.js";
|
|
3
|
+
import n from "lodash-es/isEqual";
|
|
4
|
+
import { s as r } from "json-joy/lib/json-crdt-patch";
|
|
3
5
|
//#region src/components/DataGrid/utils/applyModelChange.ts
|
|
4
|
-
function n
|
|
5
|
-
let r;
|
|
6
|
-
return
|
|
6
|
+
function i(n, r, i) {
|
|
7
|
+
let a = i[r];
|
|
8
|
+
return Object.hasOwn(n, r) ? t(n[r], a) : e(a?.isRequired);
|
|
7
9
|
}
|
|
8
|
-
function
|
|
9
|
-
let
|
|
10
|
-
switch (
|
|
10
|
+
function a(e, a, o) {
|
|
11
|
+
let s = e.api.arr(["rows"]), { columnNames: c } = e.api.getSnapshot();
|
|
12
|
+
switch (a.type) {
|
|
11
13
|
case "CREATE": {
|
|
12
|
-
let e =
|
|
13
|
-
|
|
14
|
-
data:
|
|
15
|
-
metadata:
|
|
14
|
+
let e = c.map((e) => r.con(i(a.rowData, e, o)));
|
|
15
|
+
s?.ins(a.rowIndex, [r.obj({
|
|
16
|
+
data: r.vec(...e),
|
|
17
|
+
metadata: r.obj({})
|
|
16
18
|
})]);
|
|
17
19
|
break;
|
|
18
20
|
}
|
|
19
21
|
case "DELETE":
|
|
20
|
-
|
|
22
|
+
s?.del(a.rowIndex, a.count ?? 1);
|
|
21
23
|
break;
|
|
22
24
|
case "UPDATE": {
|
|
23
|
-
let
|
|
24
|
-
Object.entries(
|
|
25
|
-
if (
|
|
26
|
-
let
|
|
27
|
-
if (
|
|
28
|
-
|
|
29
|
-
|
|
25
|
+
let i = e.api.getSnapshot().rows[a.rowIndex]?.data;
|
|
26
|
+
Object.entries(a.updatedData).forEach(([s, l]) => {
|
|
27
|
+
if (s.startsWith("_")) return;
|
|
28
|
+
let u = c.indexOf(s);
|
|
29
|
+
if (u !== -1) {
|
|
30
|
+
let c = t(l, o[s]);
|
|
31
|
+
if (n(i?.[u], c)) return;
|
|
32
|
+
e.api.vec([
|
|
30
33
|
"rows",
|
|
31
|
-
String(
|
|
34
|
+
String(a.rowIndex),
|
|
32
35
|
"data"
|
|
33
|
-
])?.set([[
|
|
36
|
+
])?.set([[u, r.con(c)]]);
|
|
34
37
|
}
|
|
35
38
|
});
|
|
36
39
|
break;
|
|
37
40
|
}
|
|
38
41
|
case "SET_SELECTION":
|
|
39
|
-
|
|
42
|
+
e.api.obj().has("selection") || e.api.obj().add(["selection"], r.obj({})), e.api.obj(["selection"]).set({ [a.replicaId]: r.con(a.selection) });
|
|
40
43
|
break;
|
|
41
44
|
}
|
|
42
45
|
}
|
|
43
46
|
//#endregion
|
|
44
|
-
export {
|
|
47
|
+
export { a as applyModelChange, i as getDefaultValueForProperty };
|
|
45
48
|
|
|
46
49
|
//# sourceMappingURL=applyModelChange.js.map
|