@open-mercato/documents 0.6.8-develop.7016.1.4ed7b1e49d
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/README.md +88 -0
- package/build.mjs +23 -0
- package/dist/index.js +5 -0
- package/dist/index.js.map +7 -0
- package/dist/modules/documents/acl.js +15 -0
- package/dist/modules/documents/acl.js.map +7 -0
- package/dist/modules/documents/api/[id]/archive/route.js +116 -0
- package/dist/modules/documents/api/[id]/archive/route.js.map +7 -0
- package/dist/modules/documents/api/[id]/attachments/[attachmentId]/route.js +155 -0
- package/dist/modules/documents/api/[id]/attachments/[attachmentId]/route.js.map +7 -0
- package/dist/modules/documents/api/[id]/attachments/route.js +153 -0
- package/dist/modules/documents/api/[id]/attachments/route.js.map +7 -0
- package/dist/modules/documents/api/[id]/collab-token/route.js +180 -0
- package/dist/modules/documents/api/[id]/collab-token/route.js.map +7 -0
- package/dist/modules/documents/api/[id]/comments/access-check/route.js +86 -0
- package/dist/modules/documents/api/[id]/comments/access-check/route.js.map +7 -0
- package/dist/modules/documents/api/[id]/comments/route.js +387 -0
- package/dist/modules/documents/api/[id]/comments/route.js.map +7 -0
- package/dist/modules/documents/api/[id]/content/route.js +143 -0
- package/dist/modules/documents/api/[id]/content/route.js.map +7 -0
- package/dist/modules/documents/api/[id]/duplicate/route.js +200 -0
- package/dist/modules/documents/api/[id]/duplicate/route.js.map +7 -0
- package/dist/modules/documents/api/[id]/export/route.js +421 -0
- package/dist/modules/documents/api/[id]/export/route.js.map +7 -0
- package/dist/modules/documents/api/[id]/favorite/route.js +96 -0
- package/dist/modules/documents/api/[id]/favorite/route.js.map +7 -0
- package/dist/modules/documents/api/[id]/links/[linkId]/route.js +85 -0
- package/dist/modules/documents/api/[id]/links/[linkId]/route.js.map +7 -0
- package/dist/modules/documents/api/[id]/links/route.js +257 -0
- package/dist/modules/documents/api/[id]/links/route.js.map +7 -0
- package/dist/modules/documents/api/[id]/principals/route.js +299 -0
- package/dist/modules/documents/api/[id]/principals/route.js.map +7 -0
- package/dist/modules/documents/api/[id]/route.js +246 -0
- package/dist/modules/documents/api/[id]/route.js.map +7 -0
- package/dist/modules/documents/api/[id]/shares/route.js +335 -0
- package/dist/modules/documents/api/[id]/shares/route.js.map +7 -0
- package/dist/modules/documents/api/[id]/unarchive/route.js +39 -0
- package/dist/modules/documents/api/[id]/unarchive/route.js.map +7 -0
- package/dist/modules/documents/api/[id]/versions/[versionId]/restore/route.js +133 -0
- package/dist/modules/documents/api/[id]/versions/[versionId]/restore/route.js.map +7 -0
- package/dist/modules/documents/api/[id]/versions/[versionId]/route.js +93 -0
- package/dist/modules/documents/api/[id]/versions/[versionId]/route.js.map +7 -0
- package/dist/modules/documents/api/[id]/versions/route.js +193 -0
- package/dist/modules/documents/api/[id]/versions/route.js.map +7 -0
- package/dist/modules/documents/api/[id]/watch/route.js +97 -0
- package/dist/modules/documents/api/[id]/watch/route.js.map +7 -0
- package/dist/modules/documents/api/_commands.js +34 -0
- package/dist/modules/documents/api/_commands.js.map +7 -0
- package/dist/modules/documents/api/_shared.js +490 -0
- package/dist/modules/documents/api/_shared.js.map +7 -0
- package/dist/modules/documents/api/folders/route.js +256 -0
- package/dist/modules/documents/api/folders/route.js.map +7 -0
- package/dist/modules/documents/api/instantiate/route.js +108 -0
- package/dist/modules/documents/api/instantiate/route.js.map +7 -0
- package/dist/modules/documents/api/route.js +322 -0
- package/dist/modules/documents/api/route.js.map +7 -0
- package/dist/modules/documents/api/templates/[templateId]/preview/route.js +94 -0
- package/dist/modules/documents/api/templates/[templateId]/preview/route.js.map +7 -0
- package/dist/modules/documents/api/templates/[templateId]/route.js +82 -0
- package/dist/modules/documents/api/templates/[templateId]/route.js.map +7 -0
- package/dist/modules/documents/api/templates/route.js +344 -0
- package/dist/modules/documents/api/templates/route.js.map +7 -0
- package/dist/modules/documents/backend/documents/DocumentsPageClient.js +160 -0
- package/dist/modules/documents/backend/documents/DocumentsPageClient.js.map +7 -0
- package/dist/modules/documents/backend/documents/DocumentsTable.js +143 -0
- package/dist/modules/documents/backend/documents/DocumentsTable.js.map +7 -0
- package/dist/modules/documents/backend/documents/FolderDialog.js +55 -0
- package/dist/modules/documents/backend/documents/FolderDialog.js.map +7 -0
- package/dist/modules/documents/backend/documents/FolderTree.js +40 -0
- package/dist/modules/documents/backend/documents/FolderTree.js.map +7 -0
- package/dist/modules/documents/backend/documents/MoveDocumentDialog.js +64 -0
- package/dist/modules/documents/backend/documents/MoveDocumentDialog.js.map +7 -0
- package/dist/modules/documents/backend/documents/[id]/CommentAnchorNavigation.js +77 -0
- package/dist/modules/documents/backend/documents/[id]/CommentAnchorNavigation.js.map +7 -0
- package/dist/modules/documents/backend/documents/[id]/CommentComposer.js +126 -0
- package/dist/modules/documents/backend/documents/[id]/CommentComposer.js.map +7 -0
- package/dist/modules/documents/backend/documents/[id]/CommentThreadList.js +88 -0
- package/dist/modules/documents/backend/documents/[id]/CommentThreadList.js.map +7 -0
- package/dist/modules/documents/backend/documents/[id]/CommentsRail.js +123 -0
- package/dist/modules/documents/backend/documents/[id]/CommentsRail.js.map +7 -0
- package/dist/modules/documents/backend/documents/[id]/DocumentCanvas.js +91 -0
- package/dist/modules/documents/backend/documents/[id]/DocumentCanvas.js.map +7 -0
- package/dist/modules/documents/backend/documents/[id]/DocumentEditorErrorBoundary.js +27 -0
- package/dist/modules/documents/backend/documents/[id]/DocumentEditorErrorBoundary.js.map +7 -0
- package/dist/modules/documents/backend/documents/[id]/DocumentEditorIsland.js +50 -0
- package/dist/modules/documents/backend/documents/[id]/DocumentEditorIsland.js.map +7 -0
- package/dist/modules/documents/backend/documents/[id]/DocumentEditorSurface.js +168 -0
- package/dist/modules/documents/backend/documents/[id]/DocumentEditorSurface.js.map +7 -0
- package/dist/modules/documents/backend/documents/[id]/DocumentNavigator.js +129 -0
- package/dist/modules/documents/backend/documents/[id]/DocumentNavigator.js.map +7 -0
- package/dist/modules/documents/backend/documents/[id]/DocumentPageClient.js +429 -0
- package/dist/modules/documents/backend/documents/[id]/DocumentPageClient.js.map +7 -0
- package/dist/modules/documents/backend/documents/[id]/EditorColorTools.js +68 -0
- package/dist/modules/documents/backend/documents/[id]/EditorColorTools.js.map +7 -0
- package/dist/modules/documents/backend/documents/[id]/EditorStatusPresence.js +69 -0
- package/dist/modules/documents/backend/documents/[id]/EditorStatusPresence.js.map +7 -0
- package/dist/modules/documents/backend/documents/[id]/EditorToolbar.js +151 -0
- package/dist/modules/documents/backend/documents/[id]/EditorToolbar.js.map +7 -0
- package/dist/modules/documents/backend/documents/[id]/ExportMenu.js +121 -0
- package/dist/modules/documents/backend/documents/[id]/ExportMenu.js.map +7 -0
- package/dist/modules/documents/backend/documents/[id]/MentionPicker.js +114 -0
- package/dist/modules/documents/backend/documents/[id]/MentionPicker.js.map +7 -0
- package/dist/modules/documents/backend/documents/[id]/OutlinePane.js +70 -0
- package/dist/modules/documents/backend/documents/[id]/OutlinePane.js.map +7 -0
- package/dist/modules/documents/backend/documents/[id]/RecordFieldsDialog.js +157 -0
- package/dist/modules/documents/backend/documents/[id]/RecordFieldsDialog.js.map +7 -0
- package/dist/modules/documents/backend/documents/[id]/RelatedRecordsPanel.js +266 -0
- package/dist/modules/documents/backend/documents/[id]/RelatedRecordsPanel.js.map +7 -0
- package/dist/modules/documents/backend/documents/[id]/VersionHistoryPanel.js +227 -0
- package/dist/modules/documents/backend/documents/[id]/VersionHistoryPanel.js.map +7 -0
- package/dist/modules/documents/backend/documents/[id]/VersionPreviewDialog.js +157 -0
- package/dist/modules/documents/backend/documents/[id]/VersionPreviewDialog.js.map +7 -0
- package/dist/modules/documents/backend/documents/[id]/commentTypes.js +150 -0
- package/dist/modules/documents/backend/documents/[id]/commentTypes.js.map +7 -0
- package/dist/modules/documents/backend/documents/[id]/componentCapabilities.js +13 -0
- package/dist/modules/documents/backend/documents/[id]/componentCapabilities.js.map +7 -0
- package/dist/modules/documents/backend/documents/[id]/documentPagination.js +295 -0
- package/dist/modules/documents/backend/documents/[id]/documentPagination.js.map +7 -0
- package/dist/modules/documents/backend/documents/[id]/editorPresenceStyles.js +81 -0
- package/dist/modules/documents/backend/documents/[id]/editorPresenceStyles.js.map +7 -0
- package/dist/modules/documents/backend/documents/[id]/editorTypes.js +52 -0
- package/dist/modules/documents/backend/documents/[id]/editorTypes.js.map +7 -0
- package/dist/modules/documents/backend/documents/[id]/page.js +10 -0
- package/dist/modules/documents/backend/documents/[id]/page.js.map +7 -0
- package/dist/modules/documents/backend/documents/[id]/page.meta.js +16 -0
- package/dist/modules/documents/backend/documents/[id]/page.meta.js.map +7 -0
- package/dist/modules/documents/backend/documents/[id]/relatedRecordModel.js +38 -0
- package/dist/modules/documents/backend/documents/[id]/relatedRecordModel.js.map +7 -0
- package/dist/modules/documents/backend/documents/[id]/restoreVersion.js +33 -0
- package/dist/modules/documents/backend/documents/[id]/restoreVersion.js.map +7 -0
- package/dist/modules/documents/backend/documents/[id]/useDocumentCollaboration.js +392 -0
- package/dist/modules/documents/backend/documents/[id]/useDocumentCollaboration.js.map +7 -0
- package/dist/modules/documents/backend/documents/[id]/useDocumentComments.js +253 -0
- package/dist/modules/documents/backend/documents/[id]/useDocumentComments.js.map +7 -0
- package/dist/modules/documents/backend/documents/[id]/useDocumentEditor.js +149 -0
- package/dist/modules/documents/backend/documents/[id]/useDocumentEditor.js.map +7 -0
- package/dist/modules/documents/backend/documents/[id]/useDocumentTitle.js +82 -0
- package/dist/modules/documents/backend/documents/[id]/useDocumentTitle.js.map +7 -0
- package/dist/modules/documents/backend/documents/[id]/useEditorInsertions.js +144 -0
- package/dist/modules/documents/backend/documents/[id]/useEditorInsertions.js.map +7 -0
- package/dist/modules/documents/backend/documents/[id]/useFallbackContentPersistence.js +237 -0
- package/dist/modules/documents/backend/documents/[id]/useFallbackContentPersistence.js.map +7 -0
- package/dist/modules/documents/backend/documents/[id]/useMentionPicker.js +216 -0
- package/dist/modules/documents/backend/documents/[id]/useMentionPicker.js.map +7 -0
- package/dist/modules/documents/backend/documents/[id]/versionHistoryModel.js +25 -0
- package/dist/modules/documents/backend/documents/[id]/versionHistoryModel.js.map +7 -0
- package/dist/modules/documents/backend/documents/components/EntityPicker.js +156 -0
- package/dist/modules/documents/backend/documents/components/EntityPicker.js.map +7 -0
- package/dist/modules/documents/backend/documents/components/EntityPickerResults.js +46 -0
- package/dist/modules/documents/backend/documents/components/EntityPickerResults.js.map +7 -0
- package/dist/modules/documents/backend/documents/components/NewFromTemplateDialog.js +127 -0
- package/dist/modules/documents/backend/documents/components/NewFromTemplateDialog.js.map +7 -0
- package/dist/modules/documents/backend/documents/components/PrincipalPicker.js +84 -0
- package/dist/modules/documents/backend/documents/components/PrincipalPicker.js.map +7 -0
- package/dist/modules/documents/backend/documents/components/ShareDialog.js +77 -0
- package/dist/modules/documents/backend/documents/components/ShareDialog.js.map +7 -0
- package/dist/modules/documents/backend/documents/components/ShareDialogAddForm.js +93 -0
- package/dist/modules/documents/backend/documents/components/ShareDialogAddForm.js.map +7 -0
- package/dist/modules/documents/backend/documents/components/ShareDialogList.js +82 -0
- package/dist/modules/documents/backend/documents/components/ShareDialogList.js.map +7 -0
- package/dist/modules/documents/backend/documents/components/TemplateBodyEditor.js +96 -0
- package/dist/modules/documents/backend/documents/components/TemplateBodyEditor.js.map +7 -0
- package/dist/modules/documents/backend/documents/components/TemplateEditorDialog.js +169 -0
- package/dist/modules/documents/backend/documents/components/TemplateEditorDialog.js.map +7 -0
- package/dist/modules/documents/backend/documents/components/TemplatePreview.js +38 -0
- package/dist/modules/documents/backend/documents/components/TemplatePreview.js.map +7 -0
- package/dist/modules/documents/backend/documents/components/TemplateSlotFields.js +69 -0
- package/dist/modules/documents/backend/documents/components/TemplateSlotFields.js.map +7 -0
- package/dist/modules/documents/backend/documents/components/TemplateSlotsEditor.js +71 -0
- package/dist/modules/documents/backend/documents/components/TemplateSlotsEditor.js.map +7 -0
- package/dist/modules/documents/backend/documents/components/principalPickerModel.js +63 -0
- package/dist/modules/documents/backend/documents/components/principalPickerModel.js.map +7 -0
- package/dist/modules/documents/backend/documents/components/shareDialogModel.js +68 -0
- package/dist/modules/documents/backend/documents/components/shareDialogModel.js.map +7 -0
- package/dist/modules/documents/backend/documents/components/templateUi.js +89 -0
- package/dist/modules/documents/backend/documents/components/templateUi.js.map +7 -0
- package/dist/modules/documents/backend/documents/components/useAvailableEntityRegistry.js +30 -0
- package/dist/modules/documents/backend/documents/components/useAvailableEntityRegistry.js.map +7 -0
- package/dist/modules/documents/backend/documents/components/useEntitySearch.js +191 -0
- package/dist/modules/documents/backend/documents/components/useEntitySearch.js.map +7 -0
- package/dist/modules/documents/backend/documents/components/usePrincipalPicker.js +221 -0
- package/dist/modules/documents/backend/documents/components/usePrincipalPicker.js.map +7 -0
- package/dist/modules/documents/backend/documents/components/useShareDialog.js +236 -0
- package/dist/modules/documents/backend/documents/components/useShareDialog.js.map +7 -0
- package/dist/modules/documents/backend/documents/components/useTemplateDetail.js +49 -0
- package/dist/modules/documents/backend/documents/components/useTemplateDetail.js.map +7 -0
- package/dist/modules/documents/backend/documents/components/useTemplateInstantiation.js +234 -0
- package/dist/modules/documents/backend/documents/components/useTemplateInstantiation.js.map +7 -0
- package/dist/modules/documents/backend/documents/documentUi.js +106 -0
- package/dist/modules/documents/backend/documents/documentUi.js.map +7 -0
- package/dist/modules/documents/backend/documents/documentsListTypes.js +132 -0
- package/dist/modules/documents/backend/documents/documentsListTypes.js.map +7 -0
- package/dist/modules/documents/backend/documents/page.js +9 -0
- package/dist/modules/documents/backend/documents/page.js.map +7 -0
- package/dist/modules/documents/backend/documents/page.meta.js +26 -0
- package/dist/modules/documents/backend/documents/page.meta.js.map +7 -0
- package/dist/modules/documents/backend/documents/templates/TemplatesPageClient.js +91 -0
- package/dist/modules/documents/backend/documents/templates/TemplatesPageClient.js.map +7 -0
- package/dist/modules/documents/backend/documents/templates/TemplatesTable.js +58 -0
- package/dist/modules/documents/backend/documents/templates/TemplatesTable.js.map +7 -0
- package/dist/modules/documents/backend/documents/templates/page.js +9 -0
- package/dist/modules/documents/backend/documents/templates/page.js.map +7 -0
- package/dist/modules/documents/backend/documents/templates/page.meta.js +34 -0
- package/dist/modules/documents/backend/documents/templates/page.meta.js.map +7 -0
- package/dist/modules/documents/backend/documents/templates/useTemplatesPage.js +139 -0
- package/dist/modules/documents/backend/documents/templates/useTemplatesPage.js.map +7 -0
- package/dist/modules/documents/backend/documents/useDocumentsList.js +314 -0
- package/dist/modules/documents/backend/documents/useDocumentsList.js.map +7 -0
- package/dist/modules/documents/ce.js +8 -0
- package/dist/modules/documents/ce.js.map +7 -0
- package/dist/modules/documents/commands/aggregate.js +99 -0
- package/dist/modules/documents/commands/aggregate.js.map +7 -0
- package/dist/modules/documents/commands/attachments.js +252 -0
- package/dist/modules/documents/commands/attachments.js.map +7 -0
- package/dist/modules/documents/commands/comments.js +782 -0
- package/dist/modules/documents/commands/comments.js.map +7 -0
- package/dist/modules/documents/commands/content.js +238 -0
- package/dist/modules/documents/commands/content.js.map +7 -0
- package/dist/modules/documents/commands/document-crud.js +505 -0
- package/dist/modules/documents/commands/document-crud.js.map +7 -0
- package/dist/modules/documents/commands/documents.js +473 -0
- package/dist/modules/documents/commands/documents.js.map +7 -0
- package/dist/modules/documents/commands/duplicate.js +640 -0
- package/dist/modules/documents/commands/duplicate.js.map +7 -0
- package/dist/modules/documents/commands/favorites.js +150 -0
- package/dist/modules/documents/commands/favorites.js.map +7 -0
- package/dist/modules/documents/commands/folders.js +420 -0
- package/dist/modules/documents/commands/folders.js.map +7 -0
- package/dist/modules/documents/commands/index.js +64 -0
- package/dist/modules/documents/commands/index.js.map +7 -0
- package/dist/modules/documents/commands/interceptors.js +300 -0
- package/dist/modules/documents/commands/interceptors.js.map +7 -0
- package/dist/modules/documents/commands/lifecycle.js +249 -0
- package/dist/modules/documents/commands/lifecycle.js.map +7 -0
- package/dist/modules/documents/commands/links.js +410 -0
- package/dist/modules/documents/commands/links.js.map +7 -0
- package/dist/modules/documents/commands/mutation-helpers.js +42 -0
- package/dist/modules/documents/commands/mutation-helpers.js.map +7 -0
- package/dist/modules/documents/commands/projection-types.js +1 -0
- package/dist/modules/documents/commands/projection-types.js.map +7 -0
- package/dist/modules/documents/commands/shared.js +143 -0
- package/dist/modules/documents/commands/shared.js.map +7 -0
- package/dist/modules/documents/commands/shares.js +527 -0
- package/dist/modules/documents/commands/shares.js.map +7 -0
- package/dist/modules/documents/commands/side-effects.js +103 -0
- package/dist/modules/documents/commands/side-effects.js.map +7 -0
- package/dist/modules/documents/commands/templates.js +461 -0
- package/dist/modules/documents/commands/templates.js.map +7 -0
- package/dist/modules/documents/commands/versions.js +432 -0
- package/dist/modules/documents/commands/versions.js.map +7 -0
- package/dist/modules/documents/commands/watchers.js +164 -0
- package/dist/modules/documents/commands/watchers.js.map +7 -0
- package/dist/modules/documents/data/entities.js +653 -0
- package/dist/modules/documents/data/entities.js.map +7 -0
- package/dist/modules/documents/data/extensions.js +44 -0
- package/dist/modules/documents/data/extensions.js.map +7 -0
- package/dist/modules/documents/data/validators.js +219 -0
- package/dist/modules/documents/data/validators.js.map +7 -0
- package/dist/modules/documents/di.js +35 -0
- package/dist/modules/documents/di.js.map +7 -0
- package/dist/modules/documents/encryption.js +12 -0
- package/dist/modules/documents/encryption.js.map +7 -0
- package/dist/modules/documents/events.js +27 -0
- package/dist/modules/documents/events.js.map +7 -0
- package/dist/modules/documents/index.js +19 -0
- package/dist/modules/documents/index.js.map +7 -0
- package/dist/modules/documents/lib/attachmentServicePort.js +30 -0
- package/dist/modules/documents/lib/attachmentServicePort.js.map +7 -0
- package/dist/modules/documents/lib/capabilities.js +32 -0
- package/dist/modules/documents/lib/capabilities.js.map +7 -0
- package/dist/modules/documents/lib/collabCloseEvents.js +17 -0
- package/dist/modules/documents/lib/collabCloseEvents.js.map +7 -0
- package/dist/modules/documents/lib/collabEndpoint.js +22 -0
- package/dist/modules/documents/lib/collabEndpoint.js.map +7 -0
- package/dist/modules/documents/lib/collabMaterializer.js +107 -0
- package/dist/modules/documents/lib/collabMaterializer.js.map +7 -0
- package/dist/modules/documents/lib/collabToken.js +120 -0
- package/dist/modules/documents/lib/collabToken.js.map +7 -0
- package/dist/modules/documents/lib/collaborationAwareness.js +68 -0
- package/dist/modules/documents/lib/collaborationAwareness.js.map +7 -0
- package/dist/modules/documents/lib/commentAnchors.js +15 -0
- package/dist/modules/documents/lib/commentAnchors.js.map +7 -0
- package/dist/modules/documents/lib/constants.js +25 -0
- package/dist/modules/documents/lib/constants.js.map +7 -0
- package/dist/modules/documents/lib/contentService.js +248 -0
- package/dist/modules/documents/lib/contentService.js.map +7 -0
- package/dist/modules/documents/lib/displayLabels.js +23 -0
- package/dist/modules/documents/lib/displayLabels.js.map +7 -0
- package/dist/modules/documents/lib/docxRenderer.js +601 -0
- package/dist/modules/documents/lib/docxRenderer.js.map +7 -0
- package/dist/modules/documents/lib/duplicateContent.js +22 -0
- package/dist/modules/documents/lib/duplicateContent.js.map +7 -0
- package/dist/modules/documents/lib/editorConfig.js +287 -0
- package/dist/modules/documents/lib/editorConfig.js.map +7 -0
- package/dist/modules/documents/lib/entityLinks.js +148 -0
- package/dist/modules/documents/lib/entityLinks.js.map +7 -0
- package/dist/modules/documents/lib/entityRegistry.js +258 -0
- package/dist/modules/documents/lib/entityRegistry.js.map +7 -0
- package/dist/modules/documents/lib/entityRegistry.server.js +189 -0
- package/dist/modules/documents/lib/entityRegistry.server.js.map +7 -0
- package/dist/modules/documents/lib/entityRegistryAvailability.server.js +9 -0
- package/dist/modules/documents/lib/entityRegistryAvailability.server.js.map +7 -0
- package/dist/modules/documents/lib/entitySuggestion.js +50 -0
- package/dist/modules/documents/lib/entitySuggestion.js.map +7 -0
- package/dist/modules/documents/lib/favorites.js +22 -0
- package/dist/modules/documents/lib/favorites.js.map +7 -0
- package/dist/modules/documents/lib/folderHierarchySerialization.js +19 -0
- package/dist/modules/documents/lib/folderHierarchySerialization.js.map +7 -0
- package/dist/modules/documents/lib/historyLimits.js +100 -0
- package/dist/modules/documents/lib/historyLimits.js.map +7 -0
- package/dist/modules/documents/lib/historyPolicy.js +14 -0
- package/dist/modules/documents/lib/historyPolicy.js.map +7 -0
- package/dist/modules/documents/lib/organizationAccess.js +17 -0
- package/dist/modules/documents/lib/organizationAccess.js.map +7 -0
- package/dist/modules/documents/lib/pdfHtml.js +62 -0
- package/dist/modules/documents/lib/pdfHtml.js.map +7 -0
- package/dist/modules/documents/lib/pdfRenderer.js +284 -0
- package/dist/modules/documents/lib/pdfRenderer.js.map +7 -0
- package/dist/modules/documents/lib/permissions.js +222 -0
- package/dist/modules/documents/lib/permissions.js.map +7 -0
- package/dist/modules/documents/lib/platformServices.js +35 -0
- package/dist/modules/documents/lib/platformServices.js.map +7 -0
- package/dist/modules/documents/lib/recordFieldInsertion.js +58 -0
- package/dist/modules/documents/lib/recordFieldInsertion.js.map +7 -0
- package/dist/modules/documents/lib/requestBody.js +80 -0
- package/dist/modules/documents/lib/requestBody.js.map +7 -0
- package/dist/modules/documents/lib/resourceLimits.js +62 -0
- package/dist/modules/documents/lib/resourceLimits.js.map +7 -0
- package/dist/modules/documents/lib/shareCounts.js +25 -0
- package/dist/modules/documents/lib/shareCounts.js.map +7 -0
- package/dist/modules/documents/lib/templateFill.js +84 -0
- package/dist/modules/documents/lib/templateFill.js.map +7 -0
- package/dist/modules/documents/lib/templateInstantiation.js +147 -0
- package/dist/modules/documents/lib/templateInstantiation.js.map +7 -0
- package/dist/modules/documents/lib/templatePreviewDigest.js +82 -0
- package/dist/modules/documents/lib/templatePreviewDigest.js.map +7 -0
- package/dist/modules/documents/lib/templateSeeds.js +201 -0
- package/dist/modules/documents/lib/templateSeeds.js.map +7 -0
- package/dist/modules/documents/lib/userLabels.js +37 -0
- package/dist/modules/documents/lib/userLabels.js.map +7 -0
- package/dist/modules/documents/lib/versionContent.js +131 -0
- package/dist/modules/documents/lib/versionContent.js.map +7 -0
- package/dist/modules/documents/lib/versionLabels.js +12 -0
- package/dist/modules/documents/lib/versionLabels.js.map +7 -0
- package/dist/modules/documents/lib/versioning.js +14 -0
- package/dist/modules/documents/lib/versioning.js.map +7 -0
- package/dist/modules/documents/lib/visibility.js +422 -0
- package/dist/modules/documents/lib/visibility.js.map +7 -0
- package/dist/modules/documents/lib/watchers.js +106 -0
- package/dist/modules/documents/lib/watchers.js.map +7 -0
- package/dist/modules/documents/migrations/Migration20260708163836_documents.js +44 -0
- package/dist/modules/documents/migrations/Migration20260708163836_documents.js.map +7 -0
- package/dist/modules/documents/migrations/Migration20260709164720_documents.js +17 -0
- package/dist/modules/documents/migrations/Migration20260709164720_documents.js.map +7 -0
- package/dist/modules/documents/migrations/Migration20260710002318_documents.js +32 -0
- package/dist/modules/documents/migrations/Migration20260710002318_documents.js.map +7 -0
- package/dist/modules/documents/migrations/Migration20260710071003_documents.js +13 -0
- package/dist/modules/documents/migrations/Migration20260710071003_documents.js.map +7 -0
- package/dist/modules/documents/migrations/Migration20260712120000_documents.js +13 -0
- package/dist/modules/documents/migrations/Migration20260712120000_documents.js.map +7 -0
- package/dist/modules/documents/migrations/Migration20260712183000_documents.js +14 -0
- package/dist/modules/documents/migrations/Migration20260712183000_documents.js.map +7 -0
- package/dist/modules/documents/migrations/Migration20260713092156_documents.js +29 -0
- package/dist/modules/documents/migrations/Migration20260713092156_documents.js.map +7 -0
- package/dist/modules/documents/migrations/Migration20260717000000_documents.js +37 -0
- package/dist/modules/documents/migrations/Migration20260717000000_documents.js.map +7 -0
- package/dist/modules/documents/notifications.js +47 -0
- package/dist/modules/documents/notifications.js.map +7 -0
- package/dist/modules/documents/search.js +101 -0
- package/dist/modules/documents/search.js.map +7 -0
- package/dist/modules/documents/setup.js +19 -0
- package/dist/modules/documents/setup.js.map +7 -0
- package/dist/modules/documents/widgets/injection/related-documents/LinkDocumentDialog.js +214 -0
- package/dist/modules/documents/widgets/injection/related-documents/LinkDocumentDialog.js.map +7 -0
- package/dist/modules/documents/widgets/injection/related-documents/context.js +84 -0
- package/dist/modules/documents/widgets/injection/related-documents/context.js.map +7 -0
- package/dist/modules/documents/widgets/injection/related-documents/useRelatedDocuments.js +98 -0
- package/dist/modules/documents/widgets/injection/related-documents/useRelatedDocuments.js.map +7 -0
- package/dist/modules/documents/widgets/injection/related-documents/widget.client.js +83 -0
- package/dist/modules/documents/widgets/injection/related-documents/widget.client.js.map +7 -0
- package/dist/modules/documents/widgets/injection/related-documents/widget.js +19 -0
- package/dist/modules/documents/widgets/injection/related-documents/widget.js.map +7 -0
- package/dist/modules/documents/widgets/injection-table.js +21 -0
- package/dist/modules/documents/widgets/injection-table.js.map +7 -0
- package/dist/server/documents-collab-server.js +2260 -0
- package/dist/server/documents-collab-server.js.map +7 -0
- package/generated/entities/document/index.ts +12 -0
- package/generated/entities/document_attachment/index.ts +9 -0
- package/generated/entities/document_comment/index.ts +14 -0
- package/generated/entities/document_content/index.ts +11 -0
- package/generated/entities/document_entity_link/index.ts +19 -0
- package/generated/entities/document_favorite/index.ts +7 -0
- package/generated/entities/document_folder/index.ts +9 -0
- package/generated/entities/document_share/index.ts +11 -0
- package/generated/entities/document_template/index.ts +13 -0
- package/generated/entities/document_version/index.ts +9 -0
- package/generated/entities/document_watcher/index.ts +7 -0
- package/generated/entities.ids.generated.ts +21 -0
- package/generated/entity-fields-registry.ts +151 -0
- package/jest.config.cjs +34 -0
- package/package.json +149 -0
- package/server/documents-collab-server.ts +3416 -0
- package/src/index.ts +1 -0
- package/src/modules/documents/acl.ts +11 -0
- package/src/modules/documents/api/[id]/archive/route.ts +132 -0
- package/src/modules/documents/api/[id]/attachments/[attachmentId]/route.ts +166 -0
- package/src/modules/documents/api/[id]/attachments/route.ts +173 -0
- package/src/modules/documents/api/[id]/collab-token/route.ts +203 -0
- package/src/modules/documents/api/[id]/comments/access-check/route.ts +96 -0
- package/src/modules/documents/api/[id]/comments/route.ts +442 -0
- package/src/modules/documents/api/[id]/content/route.ts +156 -0
- package/src/modules/documents/api/[id]/duplicate/route.ts +231 -0
- package/src/modules/documents/api/[id]/export/route.ts +535 -0
- package/src/modules/documents/api/[id]/favorite/route.ts +110 -0
- package/src/modules/documents/api/[id]/links/[linkId]/route.ts +92 -0
- package/src/modules/documents/api/[id]/links/route.ts +301 -0
- package/src/modules/documents/api/[id]/principals/route.ts +375 -0
- package/src/modules/documents/api/[id]/route.ts +267 -0
- package/src/modules/documents/api/[id]/shares/route.ts +372 -0
- package/src/modules/documents/api/[id]/unarchive/route.ts +42 -0
- package/src/modules/documents/api/[id]/versions/[versionId]/restore/route.ts +152 -0
- package/src/modules/documents/api/[id]/versions/[versionId]/route.ts +100 -0
- package/src/modules/documents/api/[id]/versions/route.ts +207 -0
- package/src/modules/documents/api/[id]/watch/route.ts +111 -0
- package/src/modules/documents/api/_commands.ts +53 -0
- package/src/modules/documents/api/_shared.ts +676 -0
- package/src/modules/documents/api/folders/route.ts +287 -0
- package/src/modules/documents/api/instantiate/route.ts +114 -0
- package/src/modules/documents/api/route.ts +362 -0
- package/src/modules/documents/api/templates/[templateId]/preview/route.ts +97 -0
- package/src/modules/documents/api/templates/[templateId]/route.ts +92 -0
- package/src/modules/documents/api/templates/route.ts +370 -0
- package/src/modules/documents/backend/documents/DocumentsPageClient.tsx +150 -0
- package/src/modules/documents/backend/documents/DocumentsTable.tsx +168 -0
- package/src/modules/documents/backend/documents/FolderDialog.tsx +62 -0
- package/src/modules/documents/backend/documents/FolderTree.tsx +72 -0
- package/src/modules/documents/backend/documents/MoveDocumentDialog.tsx +70 -0
- package/src/modules/documents/backend/documents/[id]/CommentAnchorNavigation.ts +88 -0
- package/src/modules/documents/backend/documents/[id]/CommentComposer.tsx +136 -0
- package/src/modules/documents/backend/documents/[id]/CommentThreadList.tsx +131 -0
- package/src/modules/documents/backend/documents/[id]/CommentsRail.tsx +138 -0
- package/src/modules/documents/backend/documents/[id]/DocumentCanvas.tsx +111 -0
- package/src/modules/documents/backend/documents/[id]/DocumentEditorErrorBoundary.tsx +39 -0
- package/src/modules/documents/backend/documents/[id]/DocumentEditorIsland.tsx +50 -0
- package/src/modules/documents/backend/documents/[id]/DocumentEditorSurface.tsx +162 -0
- package/src/modules/documents/backend/documents/[id]/DocumentNavigator.tsx +129 -0
- package/src/modules/documents/backend/documents/[id]/DocumentPageClient.tsx +463 -0
- package/src/modules/documents/backend/documents/[id]/EditorColorTools.tsx +71 -0
- package/src/modules/documents/backend/documents/[id]/EditorStatusPresence.tsx +78 -0
- package/src/modules/documents/backend/documents/[id]/EditorToolbar.tsx +108 -0
- package/src/modules/documents/backend/documents/[id]/ExportMenu.tsx +144 -0
- package/src/modules/documents/backend/documents/[id]/MentionPicker.tsx +137 -0
- package/src/modules/documents/backend/documents/[id]/OutlinePane.tsx +98 -0
- package/src/modules/documents/backend/documents/[id]/RecordFieldsDialog.tsx +185 -0
- package/src/modules/documents/backend/documents/[id]/RelatedRecordsPanel.tsx +320 -0
- package/src/modules/documents/backend/documents/[id]/VersionHistoryPanel.tsx +244 -0
- package/src/modules/documents/backend/documents/[id]/VersionPreviewDialog.tsx +197 -0
- package/src/modules/documents/backend/documents/[id]/commentTypes.ts +192 -0
- package/src/modules/documents/backend/documents/[id]/componentCapabilities.ts +17 -0
- package/src/modules/documents/backend/documents/[id]/documentPagination.ts +352 -0
- package/src/modules/documents/backend/documents/[id]/editorPresenceStyles.ts +77 -0
- package/src/modules/documents/backend/documents/[id]/editorTypes.ts +84 -0
- package/src/modules/documents/backend/documents/[id]/page.meta.ts +12 -0
- package/src/modules/documents/backend/documents/[id]/page.tsx +6 -0
- package/src/modules/documents/backend/documents/[id]/relatedRecordModel.ts +49 -0
- package/src/modules/documents/backend/documents/[id]/restoreVersion.ts +49 -0
- package/src/modules/documents/backend/documents/[id]/useDocumentCollaboration.ts +458 -0
- package/src/modules/documents/backend/documents/[id]/useDocumentComments.ts +286 -0
- package/src/modules/documents/backend/documents/[id]/useDocumentEditor.ts +157 -0
- package/src/modules/documents/backend/documents/[id]/useDocumentTitle.ts +77 -0
- package/src/modules/documents/backend/documents/[id]/useEditorInsertions.ts +147 -0
- package/src/modules/documents/backend/documents/[id]/useFallbackContentPersistence.ts +277 -0
- package/src/modules/documents/backend/documents/[id]/useMentionPicker.ts +259 -0
- package/src/modules/documents/backend/documents/[id]/versionHistoryModel.ts +29 -0
- package/src/modules/documents/backend/documents/components/EntityPicker.tsx +171 -0
- package/src/modules/documents/backend/documents/components/EntityPickerResults.tsx +64 -0
- package/src/modules/documents/backend/documents/components/NewFromTemplateDialog.tsx +136 -0
- package/src/modules/documents/backend/documents/components/PrincipalPicker.tsx +90 -0
- package/src/modules/documents/backend/documents/components/ShareDialog.tsx +88 -0
- package/src/modules/documents/backend/documents/components/ShareDialogAddForm.tsx +113 -0
- package/src/modules/documents/backend/documents/components/ShareDialogList.tsx +117 -0
- package/src/modules/documents/backend/documents/components/TemplateBodyEditor.tsx +96 -0
- package/src/modules/documents/backend/documents/components/TemplateEditorDialog.tsx +171 -0
- package/src/modules/documents/backend/documents/components/TemplatePreview.tsx +43 -0
- package/src/modules/documents/backend/documents/components/TemplateSlotFields.tsx +72 -0
- package/src/modules/documents/backend/documents/components/TemplateSlotsEditor.tsx +72 -0
- package/src/modules/documents/backend/documents/components/principalPickerModel.ts +86 -0
- package/src/modules/documents/backend/documents/components/shareDialogModel.ts +94 -0
- package/src/modules/documents/backend/documents/components/templateUi.ts +128 -0
- package/src/modules/documents/backend/documents/components/useAvailableEntityRegistry.ts +43 -0
- package/src/modules/documents/backend/documents/components/useEntitySearch.ts +197 -0
- package/src/modules/documents/backend/documents/components/usePrincipalPicker.ts +165 -0
- package/src/modules/documents/backend/documents/components/useShareDialog.ts +267 -0
- package/src/modules/documents/backend/documents/components/useTemplateDetail.ts +54 -0
- package/src/modules/documents/backend/documents/components/useTemplateInstantiation.ts +252 -0
- package/src/modules/documents/backend/documents/documentUi.ts +134 -0
- package/src/modules/documents/backend/documents/documentsListTypes.ts +163 -0
- package/src/modules/documents/backend/documents/page.meta.ts +24 -0
- package/src/modules/documents/backend/documents/page.tsx +5 -0
- package/src/modules/documents/backend/documents/templates/TemplatesPageClient.tsx +93 -0
- package/src/modules/documents/backend/documents/templates/TemplatesTable.tsx +71 -0
- package/src/modules/documents/backend/documents/templates/page.meta.ts +32 -0
- package/src/modules/documents/backend/documents/templates/page.tsx +5 -0
- package/src/modules/documents/backend/documents/templates/useTemplatesPage.tsx +148 -0
- package/src/modules/documents/backend/documents/useDocumentsList.tsx +305 -0
- package/src/modules/documents/ce.ts +6 -0
- package/src/modules/documents/commands/aggregate.ts +128 -0
- package/src/modules/documents/commands/attachments.ts +309 -0
- package/src/modules/documents/commands/comments.ts +966 -0
- package/src/modules/documents/commands/content.ts +294 -0
- package/src/modules/documents/commands/document-crud.ts +609 -0
- package/src/modules/documents/commands/documents.ts +581 -0
- package/src/modules/documents/commands/duplicate.ts +772 -0
- package/src/modules/documents/commands/favorites.ts +171 -0
- package/src/modules/documents/commands/folders.ts +506 -0
- package/src/modules/documents/commands/index.ts +33 -0
- package/src/modules/documents/commands/interceptors.ts +402 -0
- package/src/modules/documents/commands/lifecycle.ts +333 -0
- package/src/modules/documents/commands/links.ts +486 -0
- package/src/modules/documents/commands/mutation-helpers.ts +48 -0
- package/src/modules/documents/commands/projection-types.ts +77 -0
- package/src/modules/documents/commands/shared.ts +219 -0
- package/src/modules/documents/commands/shares.ts +612 -0
- package/src/modules/documents/commands/side-effects.ts +130 -0
- package/src/modules/documents/commands/templates.ts +522 -0
- package/src/modules/documents/commands/versions.ts +537 -0
- package/src/modules/documents/commands/watchers.ts +181 -0
- package/src/modules/documents/data/entities.ts +631 -0
- package/src/modules/documents/data/extensions.ts +42 -0
- package/src/modules/documents/data/validators.ts +248 -0
- package/src/modules/documents/di.ts +33 -0
- package/src/modules/documents/encryption.ts +14 -0
- package/src/modules/documents/events.ts +23 -0
- package/src/modules/documents/i18n/.hardcoded-allowlist.json +9 -0
- package/src/modules/documents/i18n/de.json +522 -0
- package/src/modules/documents/i18n/en.json +522 -0
- package/src/modules/documents/i18n/es.json +522 -0
- package/src/modules/documents/i18n/ko.json +522 -0
- package/src/modules/documents/i18n/pl.json +522 -0
- package/src/modules/documents/index.ts +17 -0
- package/src/modules/documents/lib/attachmentServicePort.ts +94 -0
- package/src/modules/documents/lib/capabilities.ts +57 -0
- package/src/modules/documents/lib/collabCloseEvents.ts +26 -0
- package/src/modules/documents/lib/collabEndpoint.ts +43 -0
- package/src/modules/documents/lib/collabMaterializer.ts +140 -0
- package/src/modules/documents/lib/collabToken.ts +170 -0
- package/src/modules/documents/lib/collaborationAwareness.ts +102 -0
- package/src/modules/documents/lib/commentAnchors.ts +19 -0
- package/src/modules/documents/lib/constants.ts +39 -0
- package/src/modules/documents/lib/contentService.ts +340 -0
- package/src/modules/documents/lib/displayLabels.ts +31 -0
- package/src/modules/documents/lib/docxRenderer.ts +685 -0
- package/src/modules/documents/lib/duplicateContent.ts +32 -0
- package/src/modules/documents/lib/editorConfig.ts +371 -0
- package/src/modules/documents/lib/entityLinks.ts +250 -0
- package/src/modules/documents/lib/entityRegistry.server.ts +267 -0
- package/src/modules/documents/lib/entityRegistry.ts +345 -0
- package/src/modules/documents/lib/entityRegistryAvailability.server.ts +19 -0
- package/src/modules/documents/lib/entitySuggestion.ts +61 -0
- package/src/modules/documents/lib/favorites.ts +35 -0
- package/src/modules/documents/lib/folderHierarchySerialization.ts +34 -0
- package/src/modules/documents/lib/historyLimits.ts +154 -0
- package/src/modules/documents/lib/historyPolicy.ts +7 -0
- package/src/modules/documents/lib/organizationAccess.ts +44 -0
- package/src/modules/documents/lib/pdfHtml.ts +65 -0
- package/src/modules/documents/lib/pdfRenderer.ts +367 -0
- package/src/modules/documents/lib/permissions.ts +299 -0
- package/src/modules/documents/lib/platformServices.ts +70 -0
- package/src/modules/documents/lib/recordFieldInsertion.ts +72 -0
- package/src/modules/documents/lib/requestBody.ts +97 -0
- package/src/modules/documents/lib/resourceLimits.ts +94 -0
- package/src/modules/documents/lib/shareCounts.ts +44 -0
- package/src/modules/documents/lib/templateFill.ts +138 -0
- package/src/modules/documents/lib/templateInstantiation.ts +206 -0
- package/src/modules/documents/lib/templatePreviewDigest.ts +122 -0
- package/src/modules/documents/lib/templateSeeds.ts +248 -0
- package/src/modules/documents/lib/userLabels.ts +58 -0
- package/src/modules/documents/lib/versionContent.ts +163 -0
- package/src/modules/documents/lib/versionLabels.ts +9 -0
- package/src/modules/documents/lib/versioning.ts +29 -0
- package/src/modules/documents/lib/visibility.ts +610 -0
- package/src/modules/documents/lib/watchers.ts +129 -0
- package/src/modules/documents/migrations/.snapshot-open-mercato.json +2892 -0
- package/src/modules/documents/migrations/Migration20260708163836_documents.ts +50 -0
- package/src/modules/documents/migrations/Migration20260709164720_documents.ts +19 -0
- package/src/modules/documents/migrations/Migration20260710002318_documents.ts +35 -0
- package/src/modules/documents/migrations/Migration20260710071003_documents.ts +13 -0
- package/src/modules/documents/migrations/Migration20260712120000_documents.ts +13 -0
- package/src/modules/documents/migrations/Migration20260712183000_documents.ts +12 -0
- package/src/modules/documents/migrations/Migration20260713092156_documents.ts +43 -0
- package/src/modules/documents/migrations/Migration20260717000000_documents.ts +40 -0
- package/src/modules/documents/notifications.ts +45 -0
- package/src/modules/documents/search.ts +118 -0
- package/src/modules/documents/setup.ts +19 -0
- package/src/modules/documents/widgets/injection/related-documents/LinkDocumentDialog.tsx +224 -0
- package/src/modules/documents/widgets/injection/related-documents/context.ts +101 -0
- package/src/modules/documents/widgets/injection/related-documents/useRelatedDocuments.ts +112 -0
- package/src/modules/documents/widgets/injection/related-documents/widget.client.tsx +76 -0
- package/src/modules/documents/widgets/injection/related-documents/widget.ts +19 -0
- package/src/modules/documents/widgets/injection-table.ts +20 -0
- package/tsconfig.json +9 -0
- package/watch.mjs +6 -0
|
@@ -0,0 +1,352 @@
|
|
|
1
|
+
import { Extension } from '@tiptap/core'
|
|
2
|
+
import type { Node as ProseMirrorNode } from '@tiptap/pm/model'
|
|
3
|
+
import { Plugin, PluginKey, type EditorState, type Transaction } from '@tiptap/pm/state'
|
|
4
|
+
import { Decoration, DecorationSet, type EditorView } from '@tiptap/pm/view'
|
|
5
|
+
|
|
6
|
+
export const A4_PAGE_WIDTH_MM = 210
|
|
7
|
+
export const A4_PAGE_HEIGHT_MM = 297
|
|
8
|
+
export const DOCUMENT_PAGE_HORIZONTAL_MARGIN_MM = 20
|
|
9
|
+
export const DOCUMENT_PAGE_VERTICAL_MARGIN_MM = 22
|
|
10
|
+
export const DOCUMENT_PAGE_GUTTER_PX = 24
|
|
11
|
+
|
|
12
|
+
const CSS_PIXELS_PER_MM = 96 / 25.4
|
|
13
|
+
const PAGE_CONTENT_HEIGHT_PX = (
|
|
14
|
+
A4_PAGE_HEIGHT_MM - (DOCUMENT_PAGE_VERTICAL_MARGIN_MM * 2)
|
|
15
|
+
) * CSS_PIXELS_PER_MM
|
|
16
|
+
const PAGE_VERTICAL_MARGIN_PX = DOCUMENT_PAGE_VERTICAL_MARGIN_MM * CSS_PIXELS_PER_MM
|
|
17
|
+
const PAGE_BREAK_EPSILON_PX = 0.5
|
|
18
|
+
export const DOCUMENT_PAGINATION_UPDATE_DELAY_MS = 120
|
|
19
|
+
|
|
20
|
+
export type PaginationBlockMeasurement = {
|
|
21
|
+
position: number
|
|
22
|
+
top: number
|
|
23
|
+
bottom: number
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
export type DocumentPageBreak = {
|
|
27
|
+
position: number
|
|
28
|
+
remainingContentHeight: number
|
|
29
|
+
totalHeight: number
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
type PaginationPluginState = {
|
|
33
|
+
breaks: DocumentPageBreak[]
|
|
34
|
+
decorations: DecorationSet
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
type PaginationMeta = {
|
|
38
|
+
breaks: DocumentPageBreak[]
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
export const DOCUMENT_PAGINATION_PLUGIN_KEY = new PluginKey<PaginationPluginState>('documentsPagination')
|
|
42
|
+
|
|
43
|
+
function nextPageBreak(
|
|
44
|
+
position: number,
|
|
45
|
+
remainingContentHeight: number,
|
|
46
|
+
pageMarginHeight: number,
|
|
47
|
+
pageGutterHeight: number,
|
|
48
|
+
): DocumentPageBreak {
|
|
49
|
+
const safeRemaining = Math.max(0, remainingContentHeight)
|
|
50
|
+
return {
|
|
51
|
+
position,
|
|
52
|
+
remainingContentHeight: safeRemaining,
|
|
53
|
+
totalHeight: safeRemaining + (pageMarginHeight * 2) + pageGutterHeight,
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
export function calculateDocumentPageBreaks(
|
|
58
|
+
blocks: PaginationBlockMeasurement[],
|
|
59
|
+
options: {
|
|
60
|
+
pageContentHeight?: number
|
|
61
|
+
firstPageUsedHeight?: number
|
|
62
|
+
pageMarginHeight?: number
|
|
63
|
+
pageGutterHeight?: number
|
|
64
|
+
} = {},
|
|
65
|
+
): DocumentPageBreak[] {
|
|
66
|
+
const pageContentHeight = Math.max(1, options.pageContentHeight ?? PAGE_CONTENT_HEIGHT_PX)
|
|
67
|
+
const firstPageUsedHeight = Math.max(0, options.firstPageUsedHeight ?? 0)
|
|
68
|
+
const pageMarginHeight = Math.max(0, options.pageMarginHeight ?? PAGE_VERTICAL_MARGIN_PX)
|
|
69
|
+
const pageGutterHeight = Math.max(0, options.pageGutterHeight ?? DOCUMENT_PAGE_GUTTER_PX)
|
|
70
|
+
const breaks: DocumentPageBreak[] = []
|
|
71
|
+
let pageStart = -Math.min(firstPageUsedHeight, pageContentHeight)
|
|
72
|
+
let pageBottom = pageStart + pageContentHeight
|
|
73
|
+
|
|
74
|
+
for (const block of blocks) {
|
|
75
|
+
const top = Math.max(0, block.top)
|
|
76
|
+
const bottom = Math.max(top, block.bottom)
|
|
77
|
+
const height = bottom - top
|
|
78
|
+
if (bottom <= pageBottom + PAGE_BREAK_EPSILON_PX) continue
|
|
79
|
+
|
|
80
|
+
const hasEarlierContentOnPage = top > pageStart + PAGE_BREAK_EPSILON_PX
|
|
81
|
+
if (height > pageContentHeight) {
|
|
82
|
+
if (hasEarlierContentOnPage) {
|
|
83
|
+
breaks.push(nextPageBreak(
|
|
84
|
+
block.position,
|
|
85
|
+
pageBottom - top,
|
|
86
|
+
pageMarginHeight,
|
|
87
|
+
pageGutterHeight,
|
|
88
|
+
))
|
|
89
|
+
pageStart = top
|
|
90
|
+
pageBottom = pageStart + pageContentHeight
|
|
91
|
+
}
|
|
92
|
+
while (bottom > pageBottom + PAGE_BREAK_EPSILON_PX) {
|
|
93
|
+
pageStart = pageBottom
|
|
94
|
+
pageBottom = pageStart + pageContentHeight
|
|
95
|
+
}
|
|
96
|
+
continue
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
breaks.push(nextPageBreak(
|
|
100
|
+
block.position,
|
|
101
|
+
pageBottom - top,
|
|
102
|
+
pageMarginHeight,
|
|
103
|
+
pageGutterHeight,
|
|
104
|
+
))
|
|
105
|
+
pageStart = top
|
|
106
|
+
pageBottom = pageStart + pageContentHeight
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
return breaks
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
function createPageBreakDom(pageBreak: DocumentPageBreak, pageNumber: number): HTMLElement {
|
|
113
|
+
const root = document.createElement('div')
|
|
114
|
+
root.className = 'om-doc-page-break'
|
|
115
|
+
root.contentEditable = 'false'
|
|
116
|
+
root.setAttribute('aria-hidden', 'true')
|
|
117
|
+
root.setAttribute('data-document-page-break', '')
|
|
118
|
+
|
|
119
|
+
const pageEnd = document.createElement('div')
|
|
120
|
+
pageEnd.className = 'om-doc-page-end'
|
|
121
|
+
pageEnd.style.height = `${pageBreak.remainingContentHeight + PAGE_VERTICAL_MARGIN_PX}px`
|
|
122
|
+
const pageNumberLabel = document.createElement('span')
|
|
123
|
+
pageNumberLabel.className = 'om-doc-page-number'
|
|
124
|
+
pageNumberLabel.textContent = String(pageNumber)
|
|
125
|
+
pageEnd.append(pageNumberLabel)
|
|
126
|
+
const gutter = document.createElement('div')
|
|
127
|
+
gutter.className = 'om-doc-page-gutter'
|
|
128
|
+
gutter.style.height = `${DOCUMENT_PAGE_GUTTER_PX}px`
|
|
129
|
+
const pageStart = document.createElement('div')
|
|
130
|
+
pageStart.className = 'om-doc-page-start'
|
|
131
|
+
pageStart.setAttribute('data-document-page-start', '')
|
|
132
|
+
pageStart.style.height = `${PAGE_VERTICAL_MARGIN_PX}px`
|
|
133
|
+
root.append(pageEnd, gutter, pageStart)
|
|
134
|
+
return root
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
function createDecorations(doc: ProseMirrorNode, breaks: DocumentPageBreak[]): DecorationSet {
|
|
138
|
+
return DecorationSet.create(doc, breaks.map((pageBreak, index) => Decoration.widget(
|
|
139
|
+
pageBreak.position,
|
|
140
|
+
() => createPageBreakDom(pageBreak, index + 1),
|
|
141
|
+
{
|
|
142
|
+
key: [
|
|
143
|
+
'document-page-break',
|
|
144
|
+
pageBreak.position,
|
|
145
|
+
index + 1,
|
|
146
|
+
pageBreak.remainingContentHeight,
|
|
147
|
+
].join(':'),
|
|
148
|
+
side: -1,
|
|
149
|
+
ignoreSelection: true,
|
|
150
|
+
},
|
|
151
|
+
)))
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
function readPaginationMeta(transaction: Transaction): PaginationMeta | null {
|
|
155
|
+
const meta = transaction.getMeta(DOCUMENT_PAGINATION_PLUGIN_KEY) as PaginationMeta | undefined
|
|
156
|
+
return meta && Array.isArray(meta.breaks) ? meta : null
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
function paginationStateApply(
|
|
160
|
+
transaction: Transaction,
|
|
161
|
+
current: PaginationPluginState,
|
|
162
|
+
_oldState: EditorState,
|
|
163
|
+
newState: EditorState,
|
|
164
|
+
): PaginationPluginState {
|
|
165
|
+
const meta = readPaginationMeta(transaction)
|
|
166
|
+
if (meta) {
|
|
167
|
+
return {
|
|
168
|
+
breaks: meta.breaks,
|
|
169
|
+
decorations: createDecorations(newState.doc, meta.breaks),
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
if (!transaction.docChanged) return current
|
|
173
|
+
const mappedBreaks = current.breaks.map((pageBreak) => ({
|
|
174
|
+
...pageBreak,
|
|
175
|
+
position: transaction.mapping.map(pageBreak.position, -1),
|
|
176
|
+
}))
|
|
177
|
+
return {
|
|
178
|
+
breaks: mappedBreaks,
|
|
179
|
+
decorations: current.decorations.map(transaction.mapping, transaction.doc),
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
function breaksEqual(left: DocumentPageBreak[], right: DocumentPageBreak[]): boolean {
|
|
184
|
+
return left.length === right.length && left.every((value, index) => {
|
|
185
|
+
const candidate = right[index]
|
|
186
|
+
return candidate !== undefined
|
|
187
|
+
&& value.position === candidate.position
|
|
188
|
+
&& Math.abs(value.remainingContentHeight - candidate.remainingContentHeight) < PAGE_BREAK_EPSILON_PX
|
|
189
|
+
&& Math.abs(value.totalHeight - candidate.totalHeight) < PAGE_BREAK_EPSILON_PX
|
|
190
|
+
})
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
function measureTopLevelBlocks(view: EditorView, currentBreaks: DocumentPageBreak[]): PaginationBlockMeasurement[] {
|
|
194
|
+
const rootRect = view.dom.getBoundingClientRect()
|
|
195
|
+
const paper = view.dom.closest<HTMLElement>('.om-doc-paper')
|
|
196
|
+
const paperWidthCssPx = A4_PAGE_WIDTH_MM * CSS_PIXELS_PER_MM
|
|
197
|
+
const scale = paper ? Math.max(0.01, paper.getBoundingClientRect().width / paperWidthCssPx) : 1
|
|
198
|
+
const blocks: PaginationBlockMeasurement[] = []
|
|
199
|
+
let breakIndex = 0
|
|
200
|
+
let insertedHeight = 0
|
|
201
|
+
|
|
202
|
+
view.state.doc.forEach((_node, position) => {
|
|
203
|
+
const nodeDom = view.nodeDOM(position)
|
|
204
|
+
if (!(nodeDom instanceof HTMLElement)) return
|
|
205
|
+
const rect = nodeDom.getBoundingClientRect()
|
|
206
|
+
while (breakIndex < currentBreaks.length) {
|
|
207
|
+
const pageBreak = currentBreaks[breakIndex]
|
|
208
|
+
if (!pageBreak || pageBreak.position > position) break
|
|
209
|
+
insertedHeight += pageBreak.totalHeight
|
|
210
|
+
breakIndex += 1
|
|
211
|
+
}
|
|
212
|
+
blocks.push({
|
|
213
|
+
position,
|
|
214
|
+
top: ((rect.top - rootRect.top) / scale) - insertedHeight,
|
|
215
|
+
bottom: ((rect.bottom - rootRect.top) / scale) - insertedHeight,
|
|
216
|
+
})
|
|
217
|
+
})
|
|
218
|
+
return blocks
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
function firstPageUsedHeight(view: EditorView): number {
|
|
222
|
+
const paper = view.dom.closest<HTMLElement>('.om-doc-paper')
|
|
223
|
+
if (!paper) return 0
|
|
224
|
+
const paperRect = paper.getBoundingClientRect()
|
|
225
|
+
const paperWidthCssPx = A4_PAGE_WIDTH_MM * CSS_PIXELS_PER_MM
|
|
226
|
+
const scale = Math.max(0.01, paperRect.width / paperWidthCssPx)
|
|
227
|
+
const paddingTop = Number.parseFloat(getComputedStyle(paper).paddingTop) || PAGE_VERTICAL_MARGIN_PX
|
|
228
|
+
return Math.max(0, ((view.dom.getBoundingClientRect().top - paperRect.top) / scale) - paddingTop)
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
export function createDocumentPaginationPlugin(): Plugin<PaginationPluginState> {
|
|
232
|
+
return new Plugin<PaginationPluginState>({
|
|
233
|
+
key: DOCUMENT_PAGINATION_PLUGIN_KEY,
|
|
234
|
+
state: {
|
|
235
|
+
init: () => ({ breaks: [], decorations: DecorationSet.empty }),
|
|
236
|
+
apply: paginationStateApply,
|
|
237
|
+
},
|
|
238
|
+
props: {
|
|
239
|
+
decorations: (state) => DOCUMENT_PAGINATION_PLUGIN_KEY.getState(state)?.decorations ?? null,
|
|
240
|
+
},
|
|
241
|
+
view: (view) => {
|
|
242
|
+
let frame: number | null = null
|
|
243
|
+
let updateTimer: number | null = null
|
|
244
|
+
let destroyed = false
|
|
245
|
+
const recompute = () => {
|
|
246
|
+
frame = null
|
|
247
|
+
if (destroyed) return
|
|
248
|
+
const current = DOCUMENT_PAGINATION_PLUGIN_KEY.getState(view.state)?.breaks ?? []
|
|
249
|
+
const next = calculateDocumentPageBreaks(measureTopLevelBlocks(view, current), {
|
|
250
|
+
firstPageUsedHeight: firstPageUsedHeight(view),
|
|
251
|
+
})
|
|
252
|
+
if (breaksEqual(current, next)) return
|
|
253
|
+
view.dispatch(
|
|
254
|
+
view.state.tr
|
|
255
|
+
.setMeta(DOCUMENT_PAGINATION_PLUGIN_KEY, { breaks: next } satisfies PaginationMeta)
|
|
256
|
+
.setMeta('addToHistory', false),
|
|
257
|
+
)
|
|
258
|
+
}
|
|
259
|
+
const schedule = () => {
|
|
260
|
+
if (destroyed || frame !== null) return
|
|
261
|
+
if (updateTimer !== null) {
|
|
262
|
+
window.clearTimeout(updateTimer)
|
|
263
|
+
updateTimer = null
|
|
264
|
+
}
|
|
265
|
+
frame = requestAnimationFrame(recompute)
|
|
266
|
+
}
|
|
267
|
+
const scheduleDocumentUpdate = () => {
|
|
268
|
+
if (destroyed) return
|
|
269
|
+
if (updateTimer !== null) window.clearTimeout(updateTimer)
|
|
270
|
+
updateTimer = window.setTimeout(() => {
|
|
271
|
+
updateTimer = null
|
|
272
|
+
schedule()
|
|
273
|
+
}, DOCUMENT_PAGINATION_UPDATE_DELAY_MS)
|
|
274
|
+
}
|
|
275
|
+
const resizeObserver = typeof ResizeObserver === 'undefined'
|
|
276
|
+
? null
|
|
277
|
+
: new ResizeObserver(schedule)
|
|
278
|
+
resizeObserver?.observe(view.dom)
|
|
279
|
+
const paper = view.dom.closest<HTMLElement>('.om-doc-paper')
|
|
280
|
+
if (paper) resizeObserver?.observe(paper)
|
|
281
|
+
view.dom.addEventListener('load', schedule, true)
|
|
282
|
+
window.addEventListener('resize', schedule)
|
|
283
|
+
schedule()
|
|
284
|
+
|
|
285
|
+
return {
|
|
286
|
+
update: (_nextView, previousState) => {
|
|
287
|
+
if (previousState.doc === view.state.doc) return
|
|
288
|
+
scheduleDocumentUpdate()
|
|
289
|
+
},
|
|
290
|
+
destroy: () => {
|
|
291
|
+
destroyed = true
|
|
292
|
+
if (frame !== null) cancelAnimationFrame(frame)
|
|
293
|
+
if (updateTimer !== null) window.clearTimeout(updateTimer)
|
|
294
|
+
resizeObserver?.disconnect()
|
|
295
|
+
view.dom.removeEventListener('load', schedule, true)
|
|
296
|
+
window.removeEventListener('resize', schedule)
|
|
297
|
+
},
|
|
298
|
+
}
|
|
299
|
+
},
|
|
300
|
+
})
|
|
301
|
+
}
|
|
302
|
+
|
|
303
|
+
export const DocumentPagination = Extension.create({
|
|
304
|
+
name: 'documentPagination',
|
|
305
|
+
addProseMirrorPlugins() {
|
|
306
|
+
return [createDocumentPaginationPlugin()]
|
|
307
|
+
},
|
|
308
|
+
})
|
|
309
|
+
|
|
310
|
+
export const DOCUMENT_PAGINATION_STYLES = `
|
|
311
|
+
.om-doc-paper {
|
|
312
|
+
box-sizing: border-box;
|
|
313
|
+
width: ${A4_PAGE_WIDTH_MM}mm;
|
|
314
|
+
min-width: ${A4_PAGE_WIDTH_MM}mm;
|
|
315
|
+
max-width: ${A4_PAGE_WIDTH_MM}mm;
|
|
316
|
+
min-height: ${A4_PAGE_HEIGHT_MM}mm;
|
|
317
|
+
padding: ${DOCUMENT_PAGE_VERTICAL_MARGIN_MM}mm ${DOCUMENT_PAGE_HORIZONTAL_MARGIN_MM}mm;
|
|
318
|
+
}
|
|
319
|
+
.om-doc-canvas {
|
|
320
|
+
overflow-x: auto;
|
|
321
|
+
scrollbar-gutter: stable;
|
|
322
|
+
overscroll-behavior-inline: contain;
|
|
323
|
+
}
|
|
324
|
+
.om-doc-paper .om-doc-page-break {
|
|
325
|
+
display: block;
|
|
326
|
+
width: ${A4_PAGE_WIDTH_MM}mm;
|
|
327
|
+
margin-left: -${DOCUMENT_PAGE_HORIZONTAL_MARGIN_MM}mm;
|
|
328
|
+
pointer-events: none;
|
|
329
|
+
user-select: none;
|
|
330
|
+
}
|
|
331
|
+
.om-doc-paper .om-doc-page-end,
|
|
332
|
+
.om-doc-paper .om-doc-page-start {
|
|
333
|
+
background: var(--card);
|
|
334
|
+
}
|
|
335
|
+
.om-doc-paper .om-doc-page-end {
|
|
336
|
+
position: relative;
|
|
337
|
+
}
|
|
338
|
+
.om-doc-paper .om-doc-page-number {
|
|
339
|
+
position: absolute;
|
|
340
|
+
right: ${DOCUMENT_PAGE_HORIZONTAL_MARGIN_MM}mm;
|
|
341
|
+
bottom: 6mm;
|
|
342
|
+
color: var(--muted-foreground);
|
|
343
|
+
font-size: 0.75rem;
|
|
344
|
+
line-height: 1rem;
|
|
345
|
+
}
|
|
346
|
+
.om-doc-paper .om-doc-page-gutter {
|
|
347
|
+
border-top: 1px solid var(--border);
|
|
348
|
+
border-bottom: 1px solid var(--border);
|
|
349
|
+
background: var(--muted);
|
|
350
|
+
box-shadow: inset 0 1px 2px color-mix(in oklab, var(--foreground) 8%, transparent);
|
|
351
|
+
}
|
|
352
|
+
`
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
export const EDITOR_PRESENCE_STYLES = `
|
|
2
|
+
.om-doc-collab .collaboration-carets__caret {
|
|
3
|
+
position: relative;
|
|
4
|
+
margin-left: -1px;
|
|
5
|
+
margin-right: -1px;
|
|
6
|
+
border-left-width: 2px;
|
|
7
|
+
border-left-style: solid;
|
|
8
|
+
border-right-width: 0;
|
|
9
|
+
box-sizing: border-box;
|
|
10
|
+
cursor: help;
|
|
11
|
+
pointer-events: auto;
|
|
12
|
+
}
|
|
13
|
+
.om-doc-collab .collaboration-carets__caret::before {
|
|
14
|
+
position: absolute;
|
|
15
|
+
top: -0.4em;
|
|
16
|
+
bottom: -0.4em;
|
|
17
|
+
left: -7px;
|
|
18
|
+
width: 14px;
|
|
19
|
+
content: '';
|
|
20
|
+
}
|
|
21
|
+
.om-doc-collab .collaboration-carets__label {
|
|
22
|
+
position: absolute;
|
|
23
|
+
top: -1.55em;
|
|
24
|
+
left: -2px;
|
|
25
|
+
max-width: 180px;
|
|
26
|
+
overflow: hidden;
|
|
27
|
+
border-radius: var(--radius-sm, 0.25rem);
|
|
28
|
+
padding: 1px 6px;
|
|
29
|
+
color: var(--primary-foreground);
|
|
30
|
+
font-size: var(--font-size-overline);
|
|
31
|
+
font-weight: 600;
|
|
32
|
+
line-height: var(--font-size-overline--line-height);
|
|
33
|
+
opacity: 0;
|
|
34
|
+
pointer-events: none;
|
|
35
|
+
text-overflow: ellipsis;
|
|
36
|
+
user-select: none;
|
|
37
|
+
white-space: nowrap;
|
|
38
|
+
animation: om-doc-caret-flag 2.6s ease forwards;
|
|
39
|
+
}
|
|
40
|
+
.om-doc-collab .collaboration-carets__caret:hover .collaboration-carets__label,
|
|
41
|
+
.om-doc-collab .collaboration-carets__caret:focus .collaboration-carets__label,
|
|
42
|
+
.om-doc-collab .collaboration-carets__caret:focus-visible .collaboration-carets__label {
|
|
43
|
+
animation: none;
|
|
44
|
+
opacity: 1;
|
|
45
|
+
}
|
|
46
|
+
.om-doc-collab .collaboration-carets__caret:focus-visible {
|
|
47
|
+
outline: 2px solid var(--ring);
|
|
48
|
+
outline-offset: 2px;
|
|
49
|
+
}
|
|
50
|
+
.om-doc-preview .collaboration-carets__caret,
|
|
51
|
+
.om-doc-preview .ProseMirror-yjs-selection {
|
|
52
|
+
display: none;
|
|
53
|
+
}
|
|
54
|
+
.ProseMirror .om-entity-ref {
|
|
55
|
+
display: inline-flex;
|
|
56
|
+
align-items: center;
|
|
57
|
+
max-width: 100%;
|
|
58
|
+
border: 1px solid color-mix(in oklab, var(--primary) 24%, transparent);
|
|
59
|
+
border-radius: var(--radius-sm, 0.25rem);
|
|
60
|
+
background: color-mix(in oklab, var(--primary) 12%, transparent);
|
|
61
|
+
color: var(--primary);
|
|
62
|
+
cursor: default;
|
|
63
|
+
font-weight: 500;
|
|
64
|
+
line-height: 1.6;
|
|
65
|
+
padding: 0 0.375em;
|
|
66
|
+
vertical-align: baseline;
|
|
67
|
+
white-space: nowrap;
|
|
68
|
+
}
|
|
69
|
+
@keyframes om-doc-caret-flag {
|
|
70
|
+
0% { opacity: 0; transform: translateY(3px); }
|
|
71
|
+
8%, 52% { opacity: 1; transform: translateY(0); }
|
|
72
|
+
100% { opacity: 0; transform: translateY(0); }
|
|
73
|
+
}
|
|
74
|
+
@media (prefers-reduced-motion: reduce) {
|
|
75
|
+
.om-doc-collab .collaboration-carets__label { animation: none; opacity: 1; }
|
|
76
|
+
}
|
|
77
|
+
`
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
import type { Editor } from '@tiptap/core'
|
|
2
|
+
import type { HocuspocusProvider } from '@hocuspocus/provider'
|
|
3
|
+
import type * as Y from 'yjs'
|
|
4
|
+
import { cn } from '@open-mercato/shared/lib/utils'
|
|
5
|
+
import type { CommentAnchor } from './CommentAnchorNavigation'
|
|
6
|
+
|
|
7
|
+
export type CollabTokenUser = { id: string; name: string; color: string }
|
|
8
|
+
export type CollabResources = { ydoc: Y.Doc; provider: HocuspocusProvider; user: CollabTokenUser }
|
|
9
|
+
export type PresenceUser = { key: string; name: string; color: string }
|
|
10
|
+
export type ConnectionStatus = 'connecting' | 'connected' | 'reconnecting' | 'offline'
|
|
11
|
+
export type EditorSelectionRange = { from: number; to: number }
|
|
12
|
+
export type EditorWordCount = { words: number; characters: number }
|
|
13
|
+
export type EditorMode = 'edit' | 'preview'
|
|
14
|
+
|
|
15
|
+
export type DocumentEditorIslandProps = {
|
|
16
|
+
documentId: string
|
|
17
|
+
title: string
|
|
18
|
+
initialContentHtml: string
|
|
19
|
+
contentUpdatedAt?: string | null
|
|
20
|
+
documentUpdatedAt?: string | null
|
|
21
|
+
readOnly: boolean
|
|
22
|
+
onEditorReady?: (editor: Editor | null) => void
|
|
23
|
+
onComment?: (anchor: CommentAnchor) => void
|
|
24
|
+
onContentConflict?: () => void
|
|
25
|
+
onTitleChange?: (title: string, updatedAt: string | null) => void
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
export type CollabState =
|
|
29
|
+
| { mode: 'connecting' }
|
|
30
|
+
| { mode: 'fallback'; readOnly: boolean }
|
|
31
|
+
| { mode: 'collab'; resources: CollabResources; connectionStatus: ConnectionStatus; presenceUsers: PresenceUser[]; serverReadOnly: boolean }
|
|
32
|
+
|
|
33
|
+
export function resolveEditorMode(readOnly: boolean, serverReadOnly: boolean, requested: EditorMode): EditorMode {
|
|
34
|
+
return readOnly || serverReadOnly ? 'preview' : requested
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
export function canCreateSelectionComment(input: {
|
|
38
|
+
permissionReadOnly: boolean
|
|
39
|
+
mode: EditorMode
|
|
40
|
+
transport: 'collab' | 'fallback'
|
|
41
|
+
hasCommentHandler: boolean
|
|
42
|
+
}): boolean {
|
|
43
|
+
if (!input.hasCommentHandler || input.transport !== 'collab') return false
|
|
44
|
+
const effectiveReadOnly = input.permissionReadOnly || input.mode === 'preview'
|
|
45
|
+
return !effectiveReadOnly || input.permissionReadOnly
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
export function readRecord(value: unknown): Record<string, unknown> | null {
|
|
49
|
+
return value && typeof value === 'object' && !Array.isArray(value) ? value as Record<string, unknown> : null
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
export function readString(record: Record<string, unknown>, ...keys: string[]): string | null {
|
|
53
|
+
for (const key of keys) {
|
|
54
|
+
const value = record[key]
|
|
55
|
+
if (typeof value === 'string' && value.trim()) return value
|
|
56
|
+
}
|
|
57
|
+
return null
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
export function readNumber(record: Record<string, unknown>, ...keys: string[]): number | null {
|
|
61
|
+
for (const key of keys) {
|
|
62
|
+
const value = record[key]
|
|
63
|
+
if (typeof value === 'number' && Number.isFinite(value)) return value
|
|
64
|
+
}
|
|
65
|
+
return null
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
export const DOCUMENT_EDITOR_CONTENT_CLASS = cn(
|
|
69
|
+
'max-w-none text-foreground',
|
|
70
|
+
'[&_.ProseMirror]:min-h-96 [&_.ProseMirror]:focus-visible:outline-none',
|
|
71
|
+
'[&_.ProseMirror>*:first-child]:mt-0 [&_.ProseMirror>*:last-child]:mb-0',
|
|
72
|
+
'[&_h1]:mb-4 [&_h1]:mt-8 [&_h1]:text-3xl [&_h1]:font-bold [&_h1]:leading-tight',
|
|
73
|
+
'[&_h2]:mb-3 [&_h2]:mt-7 [&_h2]:text-2xl [&_h2]:font-semibold [&_h2]:leading-tight',
|
|
74
|
+
'[&_h3]:mb-2 [&_h3]:mt-6 [&_h3]:text-xl [&_h3]:font-semibold',
|
|
75
|
+
'[&_p]:my-4 [&_p]:leading-7 [&_ul]:my-4 [&_ul]:list-disc [&_ul]:pl-6',
|
|
76
|
+
'[&_ol]:my-4 [&_ol]:list-decimal [&_ol]:pl-6 [&_li]:my-1',
|
|
77
|
+
'[&_blockquote]:my-6 [&_blockquote]:border-l-4 [&_blockquote]:border-border [&_blockquote]:pl-4 [&_blockquote]:italic',
|
|
78
|
+
'[&_pre]:my-6 [&_pre]:overflow-x-auto [&_pre]:rounded-md [&_pre]:bg-muted [&_pre]:p-4 [&_pre]:font-mono [&_pre]:text-sm',
|
|
79
|
+
'[&_a]:text-primary [&_a]:underline [&_a]:underline-offset-4',
|
|
80
|
+
'[&_img]:my-6 [&_img]:h-auto [&_img]:max-w-full [&_img]:rounded-md',
|
|
81
|
+
'[&_table]:my-6 [&_table]:w-full [&_table]:border-collapse',
|
|
82
|
+
'[&_td]:border [&_td]:border-border [&_td]:px-3 [&_td]:py-2',
|
|
83
|
+
'[&_th]:border [&_th]:border-border [&_th]:bg-muted [&_th]:px-3 [&_th]:py-2 [&_th]:text-left',
|
|
84
|
+
)
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export const metadata = {
|
|
2
|
+
requireAuth: true,
|
|
3
|
+
requireFeatures: ['documents.view'],
|
|
4
|
+
pageTitle: 'Document',
|
|
5
|
+
pageTitleKey: 'documents.nav.document',
|
|
6
|
+
pageGroup: 'Documents',
|
|
7
|
+
pageGroupKey: 'documents.nav.group',
|
|
8
|
+
breadcrumb: [
|
|
9
|
+
{ label: 'Documents', labelKey: 'documents.nav.documents', href: '/backend/documents' },
|
|
10
|
+
{ label: 'Document', labelKey: 'documents.nav.document' },
|
|
11
|
+
],
|
|
12
|
+
}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import {
|
|
2
|
+
firstSafeDocumentsDisplayLabel,
|
|
3
|
+
sanitizeDocumentsDisplayLabel,
|
|
4
|
+
} from '../../../lib/displayLabels'
|
|
5
|
+
import {
|
|
6
|
+
getEntityTokenFieldNames,
|
|
7
|
+
type DocumentEntityType,
|
|
8
|
+
} from '../../../lib/entityRegistry'
|
|
9
|
+
import { readBoolean, readRecord, readString } from '../documentUi'
|
|
10
|
+
|
|
11
|
+
export type RelatedRecord = {
|
|
12
|
+
id: string
|
|
13
|
+
entityType: DocumentEntityType
|
|
14
|
+
label: string
|
|
15
|
+
href: string | null
|
|
16
|
+
canOpen: boolean
|
|
17
|
+
source: 'chip' | 'template' | 'related-panel'
|
|
18
|
+
updatedAt: string
|
|
19
|
+
values: Record<string, string | null>
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
export function normalizeRelatedRecord(value: unknown, fallbackLabel: string): RelatedRecord | null {
|
|
23
|
+
const record = readRecord(value)
|
|
24
|
+
if (!record) return null
|
|
25
|
+
const id = readString(record, 'id')
|
|
26
|
+
const entityType = readString(record, 'entityType', 'entity_type') as DocumentEntityType | null
|
|
27
|
+
const label = firstSafeDocumentsDisplayLabel(readString(record, 'label'), fallbackLabel)
|
|
28
|
+
const updatedAt = readString(record, 'updatedAt', 'updated_at')
|
|
29
|
+
const source = readString(record, 'source') as RelatedRecord['source'] | null
|
|
30
|
+
if (!id || !entityType || !label || !updatedAt || !source) return null
|
|
31
|
+
const canOpen = readBoolean(record, 'canOpen', 'can_open') ?? false
|
|
32
|
+
const rawValues = canOpen ? readRecord(record.values) : null
|
|
33
|
+
const values = rawValues
|
|
34
|
+
? Object.fromEntries(Array.from(getEntityTokenFieldNames(entityType), (field) => [
|
|
35
|
+
field,
|
|
36
|
+
sanitizeDocumentsDisplayLabel(rawValues[field]),
|
|
37
|
+
]))
|
|
38
|
+
: {}
|
|
39
|
+
return {
|
|
40
|
+
id,
|
|
41
|
+
entityType,
|
|
42
|
+
label,
|
|
43
|
+
updatedAt,
|
|
44
|
+
source,
|
|
45
|
+
href: readString(record, 'href'),
|
|
46
|
+
canOpen,
|
|
47
|
+
values,
|
|
48
|
+
}
|
|
49
|
+
}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import {
|
|
2
|
+
apiCallOrThrow,
|
|
3
|
+
withScopedApiRequestHeaders,
|
|
4
|
+
} from '@open-mercato/ui/backend/utils/apiCall'
|
|
5
|
+
import { buildOptimisticLockHeader } from '@open-mercato/ui/backend/utils/optimisticLock'
|
|
6
|
+
import { normalizeDocumentContent } from '../documentUi'
|
|
7
|
+
|
|
8
|
+
type RestoreVersionWithCurrentContentTokenInput = {
|
|
9
|
+
documentId: string
|
|
10
|
+
versionId: string
|
|
11
|
+
errorMessage: string
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* Restore a version against the content row's CURRENT optimistic-lock token.
|
|
16
|
+
*
|
|
17
|
+
* The token observed when the page loaded is unusable here: every keystroke
|
|
18
|
+
* the caller made since (materialized by the collaboration sidecar, or saved
|
|
19
|
+
* by the single-user autosave) advanced `updated_at`, so restoring after any
|
|
20
|
+
* edit answered a spurious 409, and a document opened before its content row
|
|
21
|
+
* existed had no token at all. Reading the token immediately before the
|
|
22
|
+
* restore keeps the lock meaningful for the concurrent-write race it exists
|
|
23
|
+
* for, while the server-side pre-restore snapshot preserves whatever
|
|
24
|
+
* collaborators wrote in between.
|
|
25
|
+
*/
|
|
26
|
+
export async function restoreVersionWithCurrentContentToken({
|
|
27
|
+
documentId,
|
|
28
|
+
versionId,
|
|
29
|
+
errorMessage,
|
|
30
|
+
}: RestoreVersionWithCurrentContentTokenInput) {
|
|
31
|
+
const contentCall = await apiCallOrThrow<unknown>(
|
|
32
|
+
`/api/documents/${encodeURIComponent(documentId)}/content`,
|
|
33
|
+
undefined,
|
|
34
|
+
{ errorMessage },
|
|
35
|
+
)
|
|
36
|
+
const contentUpdatedAt = normalizeDocumentContent(contentCall.result).updatedAt
|
|
37
|
+
if (!contentUpdatedAt || !Number.isFinite(Date.parse(contentUpdatedAt))) {
|
|
38
|
+
throw new Error(errorMessage)
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
return withScopedApiRequestHeaders(
|
|
42
|
+
buildOptimisticLockHeader(contentUpdatedAt),
|
|
43
|
+
() => apiCallOrThrow(
|
|
44
|
+
`/api/documents/${encodeURIComponent(documentId)}/versions/${encodeURIComponent(versionId)}/restore`,
|
|
45
|
+
{ method: 'POST' },
|
|
46
|
+
{ errorMessage },
|
|
47
|
+
),
|
|
48
|
+
)
|
|
49
|
+
}
|