@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,134 @@
|
|
|
1
|
+
import type { DocumentCapabilities } from '../../lib/capabilities'
|
|
2
|
+
|
|
3
|
+
export type { DocumentCapabilities } from '../../lib/capabilities'
|
|
4
|
+
|
|
5
|
+
export type DocumentTier = 'owner' | 'editor' | 'commenter' | 'viewer'
|
|
6
|
+
|
|
7
|
+
export type DocumentDetail = {
|
|
8
|
+
id: string
|
|
9
|
+
title: string
|
|
10
|
+
tier: DocumentTier
|
|
11
|
+
updatedAt: string | null
|
|
12
|
+
archivedAt: string | null
|
|
13
|
+
isFavorite: boolean
|
|
14
|
+
isWatching: boolean
|
|
15
|
+
capabilities: DocumentCapabilities
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
export type DocumentContent = {
|
|
19
|
+
contentHtml: string
|
|
20
|
+
updatedAt: string | null
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
export function readRecord(value: unknown): Record<string, unknown> | null {
|
|
24
|
+
return value && typeof value === 'object' && !Array.isArray(value)
|
|
25
|
+
? value as Record<string, unknown>
|
|
26
|
+
: null
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
export function readString(record: Record<string, unknown>, ...keys: string[]): string | null {
|
|
30
|
+
for (const key of keys) {
|
|
31
|
+
const value = record[key]
|
|
32
|
+
if (typeof value === 'string' && value.trim().length > 0) return value
|
|
33
|
+
}
|
|
34
|
+
return null
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
export function readBoolean(record: Record<string, unknown>, ...keys: string[]): boolean | null {
|
|
38
|
+
for (const key of keys) {
|
|
39
|
+
const value = record[key]
|
|
40
|
+
if (typeof value === 'boolean') return value
|
|
41
|
+
}
|
|
42
|
+
return null
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
export function readNumber(record: Record<string, unknown>, ...keys: string[]): number | null {
|
|
46
|
+
for (const key of keys) {
|
|
47
|
+
const value = record[key]
|
|
48
|
+
if (typeof value === 'number' && Number.isFinite(value)) return value
|
|
49
|
+
}
|
|
50
|
+
return null
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
export function readArrayPayload(payload: unknown, ...keys: string[]): unknown[] {
|
|
54
|
+
if (Array.isArray(payload)) return payload
|
|
55
|
+
const record = readRecord(payload)
|
|
56
|
+
if (!record) return []
|
|
57
|
+
for (const key of keys) {
|
|
58
|
+
const value = record[key]
|
|
59
|
+
if (Array.isArray(value)) return value
|
|
60
|
+
}
|
|
61
|
+
return []
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
export function unwrapRecord(payload: unknown, ...keys: string[]): Record<string, unknown> | null {
|
|
65
|
+
const root = readRecord(payload)
|
|
66
|
+
if (!root) return null
|
|
67
|
+
for (const key of keys) {
|
|
68
|
+
const nested = readRecord(root[key])
|
|
69
|
+
if (nested) return nested
|
|
70
|
+
}
|
|
71
|
+
return root
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
function readTier(value: string | null): DocumentTier {
|
|
75
|
+
if (value === 'owner' || value === 'editor' || value === 'commenter') return value
|
|
76
|
+
return 'viewer'
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
function readCapabilities(record: Record<string, unknown>, tier: DocumentTier): DocumentCapabilities {
|
|
80
|
+
const capabilities = readRecord(record.capabilities)
|
|
81
|
+
const legacyCanShare = readBoolean(record, 'canShare', 'can_share') ?? tier === 'owner'
|
|
82
|
+
const legacyCanEdit = tier === 'owner' || tier === 'editor'
|
|
83
|
+
const legacyCanComment = tier !== 'viewer'
|
|
84
|
+
return {
|
|
85
|
+
canView: capabilities ? readBoolean(capabilities, 'canView', 'can_view') ?? true : true,
|
|
86
|
+
canComment: capabilities ? readBoolean(capabilities, 'canComment', 'can_comment') ?? legacyCanComment : legacyCanComment,
|
|
87
|
+
canEdit: capabilities ? readBoolean(capabilities, 'canEdit', 'can_edit') ?? legacyCanEdit : legacyCanEdit,
|
|
88
|
+
canShare: capabilities ? readBoolean(capabilities, 'canShare', 'can_share') ?? legacyCanShare : legacyCanShare,
|
|
89
|
+
canDelete: capabilities ? readBoolean(capabilities, 'canDelete', 'can_delete') ?? false : false,
|
|
90
|
+
canCreate: capabilities ? readBoolean(capabilities, 'canCreate', 'can_create') ?? false : false,
|
|
91
|
+
canManageTemplates: capabilities
|
|
92
|
+
? readBoolean(capabilities, 'canManageTemplates', 'can_manage_templates') ?? false
|
|
93
|
+
: false,
|
|
94
|
+
canArchive: capabilities
|
|
95
|
+
? readBoolean(capabilities, 'canArchive', 'can_archive') ?? false
|
|
96
|
+
: false,
|
|
97
|
+
canDuplicate: capabilities
|
|
98
|
+
? readBoolean(capabilities, 'canDuplicate', 'can_duplicate') ?? false
|
|
99
|
+
: false,
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
export function normalizeDocumentDetail(payload: unknown): DocumentDetail | null {
|
|
104
|
+
const record = unwrapRecord(payload, 'document', 'item', 'data')
|
|
105
|
+
if (!record) return null
|
|
106
|
+
const id = readString(record, 'id')
|
|
107
|
+
const title = readString(record, 'title')
|
|
108
|
+
if (!id || !title) return null
|
|
109
|
+
const tier = readTier(readString(record, 'tier', 'permission', 'effectiveTier', 'effective_tier'))
|
|
110
|
+
return {
|
|
111
|
+
id,
|
|
112
|
+
title,
|
|
113
|
+
tier,
|
|
114
|
+
updatedAt: readString(record, 'updatedAt', 'updated_at'),
|
|
115
|
+
archivedAt: readString(record, 'archivedAt', 'archived_at'),
|
|
116
|
+
isFavorite: readBoolean(record, 'isFavorite', 'is_favorite') ?? false,
|
|
117
|
+
isWatching: readBoolean(record, 'isWatching', 'is_watching') ?? false,
|
|
118
|
+
capabilities: readCapabilities(record, tier),
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
export function normalizeDocumentContent(payload: unknown): DocumentContent {
|
|
123
|
+
const record = unwrapRecord(payload, 'content', 'item', 'data')
|
|
124
|
+
return {
|
|
125
|
+
contentHtml: record ? readString(record, 'contentHtml', 'content_html') ?? '' : '',
|
|
126
|
+
updatedAt: record ? readString(record, 'updatedAt', 'updated_at') : null,
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
export function formatDateTime(value: string | null | undefined, fallback: string): string {
|
|
131
|
+
if (!value) return fallback
|
|
132
|
+
const date = new Date(value)
|
|
133
|
+
return Number.isNaN(date.getTime()) ? fallback : date.toLocaleString()
|
|
134
|
+
}
|
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
import { readArrayPayload, readBoolean, readNumber, readRecord, readString, type DocumentCapabilities } from './documentUi'
|
|
2
|
+
import { firstSafeDocumentsDisplayLabel } from '../../lib/displayLabels'
|
|
3
|
+
|
|
4
|
+
export type DocumentRow = {
|
|
5
|
+
id: string
|
|
6
|
+
title: string
|
|
7
|
+
folderId: string | null
|
|
8
|
+
folderName: string | null
|
|
9
|
+
ownerLabel: string
|
|
10
|
+
sharedWithCount: number
|
|
11
|
+
updatedAt: string | null
|
|
12
|
+
archivedAt: string | null
|
|
13
|
+
isFavorite: boolean
|
|
14
|
+
capabilities: DocumentCapabilities
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
export type FolderRow = {
|
|
18
|
+
id: string
|
|
19
|
+
name: string
|
|
20
|
+
parentFolderId: string | null
|
|
21
|
+
updatedAt: string | null
|
|
22
|
+
canEdit: boolean
|
|
23
|
+
visibility: 'owned' | 'contains-visible' | 'ancestor'
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
export type FolderNode = FolderRow & { children: FolderNode[] }
|
|
27
|
+
export type CollectionCapabilities = {
|
|
28
|
+
canCreateDocument: boolean
|
|
29
|
+
canCreateFolder: boolean
|
|
30
|
+
canLinkDocuments: boolean
|
|
31
|
+
canInstantiateTemplate: boolean
|
|
32
|
+
canManageTemplates: boolean
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
export const EMPTY_COLLECTION_CAPABILITIES: CollectionCapabilities = {
|
|
36
|
+
canCreateDocument: false,
|
|
37
|
+
canCreateFolder: false,
|
|
38
|
+
canLinkDocuments: false,
|
|
39
|
+
canInstantiateTemplate: false,
|
|
40
|
+
canManageTemplates: false,
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
function readCapabilities(record: Record<string, unknown>): DocumentCapabilities {
|
|
44
|
+
const capabilities = readRecord(record.capabilities) ?? {}
|
|
45
|
+
return {
|
|
46
|
+
canView: readBoolean(capabilities, 'canView', 'can_view') ?? true,
|
|
47
|
+
canComment: readBoolean(capabilities, 'canComment', 'can_comment') ?? false,
|
|
48
|
+
canEdit: readBoolean(capabilities, 'canEdit', 'can_edit') ?? false,
|
|
49
|
+
canShare: readBoolean(capabilities, 'canShare', 'can_share') ?? false,
|
|
50
|
+
canDelete: readBoolean(capabilities, 'canDelete', 'can_delete') ?? false,
|
|
51
|
+
canCreate: readBoolean(capabilities, 'canCreate', 'can_create') ?? false,
|
|
52
|
+
canManageTemplates: readBoolean(capabilities, 'canManageTemplates', 'can_manage_templates') ?? false,
|
|
53
|
+
canArchive: readBoolean(capabilities, 'canArchive', 'can_archive') ?? false,
|
|
54
|
+
canDuplicate: readBoolean(capabilities, 'canDuplicate', 'can_duplicate') ?? false,
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
export function normalizeFolders(payload: unknown): FolderRow[] {
|
|
59
|
+
return readArrayPayload(payload, 'items', 'data', 'folders').flatMap((value) => {
|
|
60
|
+
const record = readRecord(value)
|
|
61
|
+
const id = record ? readString(record, 'id') : null
|
|
62
|
+
const name = record ? readString(record, 'name') : null
|
|
63
|
+
if (!record || !id || !name) return []
|
|
64
|
+
const visibility = readString(record, 'visibility')
|
|
65
|
+
return [{
|
|
66
|
+
id, name,
|
|
67
|
+
parentFolderId: readString(record, 'parentFolderId', 'parent_folder_id'),
|
|
68
|
+
updatedAt: readString(record, 'updatedAt', 'updated_at'),
|
|
69
|
+
canEdit: readBoolean(record, 'canEdit', 'can_edit') ?? false,
|
|
70
|
+
visibility: visibility === 'contains-visible' || visibility === 'ancestor' ? visibility : 'owned',
|
|
71
|
+
}]
|
|
72
|
+
})
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
export function normalizeDocuments(payload: unknown, folders: FolderRow[], unknownOwner: string): DocumentRow[] {
|
|
76
|
+
const folderMap = new Map(folders.map((folder) => [folder.id, folder]))
|
|
77
|
+
return readArrayPayload(payload, 'items', 'data', 'documents').flatMap((value) => {
|
|
78
|
+
const record = readRecord(value)
|
|
79
|
+
const id = record ? readString(record, 'id') : null
|
|
80
|
+
const title = record ? readString(record, 'title') : null
|
|
81
|
+
if (!record || !id || !title) return []
|
|
82
|
+
const folderId = readString(record, 'folderId', 'folder_id')
|
|
83
|
+
return [{
|
|
84
|
+
id, title, folderId,
|
|
85
|
+
folderName: readString(record, 'folderName', 'folder_name') ?? (folderId ? folderMap.get(folderId)?.name ?? null : null),
|
|
86
|
+
ownerLabel: firstSafeDocumentsDisplayLabel(
|
|
87
|
+
readString(
|
|
88
|
+
record,
|
|
89
|
+
'ownerLabel',
|
|
90
|
+
'owner_label',
|
|
91
|
+
'ownerName',
|
|
92
|
+
'owner_name',
|
|
93
|
+
'ownerEmail',
|
|
94
|
+
'owner_email',
|
|
95
|
+
),
|
|
96
|
+
unknownOwner,
|
|
97
|
+
) ?? '',
|
|
98
|
+
sharedWithCount: readNumber(
|
|
99
|
+
record,
|
|
100
|
+
'sharedWithCount',
|
|
101
|
+
'shared_with_count',
|
|
102
|
+
'shareCount',
|
|
103
|
+
'share_count',
|
|
104
|
+
) ?? 0,
|
|
105
|
+
updatedAt: readString(record, 'updatedAt', 'updated_at'),
|
|
106
|
+
archivedAt: readString(record, 'archivedAt', 'archived_at'),
|
|
107
|
+
isFavorite: readBoolean(record, 'isFavorite', 'is_favorite') ?? false,
|
|
108
|
+
capabilities: readCapabilities(record),
|
|
109
|
+
}]
|
|
110
|
+
})
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
export function normalizeCollectionCapabilities(payload: unknown): CollectionCapabilities {
|
|
114
|
+
const root = readRecord(payload)
|
|
115
|
+
const capabilities = readRecord(root?.collectionCapabilities ?? root?.collection_capabilities)
|
|
116
|
+
if (!capabilities) return EMPTY_COLLECTION_CAPABILITIES
|
|
117
|
+
return {
|
|
118
|
+
canCreateDocument: readBoolean(capabilities, 'canCreateDocument', 'can_create_document') ?? false,
|
|
119
|
+
canCreateFolder: readBoolean(capabilities, 'canCreateFolder', 'can_create_folder') ?? false,
|
|
120
|
+
canLinkDocuments: readBoolean(capabilities, 'canLinkDocuments', 'can_link_documents') ?? false,
|
|
121
|
+
canInstantiateTemplate: readBoolean(capabilities, 'canInstantiateTemplate', 'can_instantiate_template') ?? false,
|
|
122
|
+
canManageTemplates: readBoolean(capabilities, 'canManageTemplates', 'can_manage_templates') ?? false,
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
export function canWriteToFolder(selectedFolderId: string | null, folder: FolderRow | null): boolean {
|
|
127
|
+
return selectedFolderId === null || folder?.canEdit === true
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
export function buildFolderTree(folders: FolderRow[]): FolderNode[] {
|
|
131
|
+
const nodes = new Map(folders.map((folder) => [folder.id, { ...folder, children: [] as FolderNode[] }]))
|
|
132
|
+
const roots: FolderNode[] = []
|
|
133
|
+
for (const node of nodes.values()) {
|
|
134
|
+
const parent = node.parentFolderId ? nodes.get(node.parentFolderId) : null
|
|
135
|
+
if (parent) parent.children.push(node)
|
|
136
|
+
else roots.push(node)
|
|
137
|
+
}
|
|
138
|
+
const sort = (items: FolderNode[]) => items
|
|
139
|
+
.sort((first, second) => first.name.localeCompare(
|
|
140
|
+
second.name,
|
|
141
|
+
undefined,
|
|
142
|
+
{ sensitivity: 'base' },
|
|
143
|
+
))
|
|
144
|
+
.forEach((item) => sort(item.children))
|
|
145
|
+
sort(roots)
|
|
146
|
+
return roots
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
export function hasActiveTemplate(payload: unknown): boolean {
|
|
150
|
+
return readArrayPayload(payload, 'items', 'data', 'templates').some((value) => {
|
|
151
|
+
const record = readRecord(value)
|
|
152
|
+
return record ? readBoolean(record, 'isActive', 'is_active') !== false : false
|
|
153
|
+
})
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
export function readCreatedId(payload: unknown): string | null {
|
|
157
|
+
const root = readRecord(payload)
|
|
158
|
+
if (!root) return null
|
|
159
|
+
return readString(root, 'id')
|
|
160
|
+
?? readString(readRecord(root.document) ?? {}, 'id')
|
|
161
|
+
?? readString(readRecord(root.item) ?? {}, 'id')
|
|
162
|
+
?? readString(readRecord(root.data) ?? {}, 'id')
|
|
163
|
+
}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import React from 'react'
|
|
2
|
+
|
|
3
|
+
// Page metadata must stay a plain serializable element tree — a lucide component
|
|
4
|
+
// reference does not survive metadata serialization and drops the sidebar icon.
|
|
5
|
+
const documentsIcon = React.createElement('svg', { width: 16, height: 16, viewBox: '0 0 24 24', fill: 'none', stroke: 'currentColor', strokeWidth: 2 },
|
|
6
|
+
React.createElement('path', { d: 'M15 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V7Z' }),
|
|
7
|
+
React.createElement('path', { d: 'M14 2v4a2 2 0 0 0 2 2h4' }),
|
|
8
|
+
React.createElement('path', { d: 'M10 9H8' }),
|
|
9
|
+
React.createElement('path', { d: 'M16 13H8' }),
|
|
10
|
+
React.createElement('path', { d: 'M16 17H8' }),
|
|
11
|
+
)
|
|
12
|
+
|
|
13
|
+
export const metadata = {
|
|
14
|
+
requireAuth: true,
|
|
15
|
+
requireFeatures: ['documents.view'],
|
|
16
|
+
pageTitle: 'Documents',
|
|
17
|
+
pageTitleKey: 'documents.nav.documents',
|
|
18
|
+
pageGroup: 'Documents',
|
|
19
|
+
pageGroupKey: 'documents.nav.group',
|
|
20
|
+
pagePriority: 40,
|
|
21
|
+
pageOrder: 100,
|
|
22
|
+
icon: documentsIcon,
|
|
23
|
+
breadcrumb: [{ label: 'Documents', labelKey: 'documents.nav.documents' }],
|
|
24
|
+
}
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
"use client"
|
|
2
|
+
|
|
3
|
+
import * as React from 'react'
|
|
4
|
+
import dynamic from 'next/dynamic'
|
|
5
|
+
import { Page, PageBody } from '@open-mercato/ui/backend/Page'
|
|
6
|
+
import { ErrorMessage, LoadingMessage } from '@open-mercato/ui/backend/detail'
|
|
7
|
+
import { Button } from '@open-mercato/ui/primitives/button'
|
|
8
|
+
import { Dialog, DialogContent, DialogDescription, DialogHeader, DialogTitle } from '@open-mercato/ui/primitives/dialog'
|
|
9
|
+
import { useT } from '@open-mercato/shared/lib/i18n/context'
|
|
10
|
+
import type { TemplateRow } from '../components/templateUi'
|
|
11
|
+
import { TemplatesTable } from './TemplatesTable'
|
|
12
|
+
import { useTemplatesPage } from './useTemplatesPage'
|
|
13
|
+
|
|
14
|
+
function TemplateEditorDialogLoading({ error, retry }: { error?: Error | null; retry?: () => void }) {
|
|
15
|
+
const t = useT()
|
|
16
|
+
// `next/dynamic` never forwards the caller's `onOpenChange` to a loading
|
|
17
|
+
// shell, so own the dismissal here. Without it a chunk that fails for good
|
|
18
|
+
// (a deploy invalidated it) traps the user in a modal Escape cannot close.
|
|
19
|
+
const [open, setOpen] = React.useState(true)
|
|
20
|
+
if (!open) return null
|
|
21
|
+
return (
|
|
22
|
+
<Dialog open onOpenChange={(next) => { if (!next) setOpen(false) }}>
|
|
23
|
+
<DialogContent size="xl" dismissible={Boolean(error)}>
|
|
24
|
+
<DialogHeader>
|
|
25
|
+
<DialogTitle>{t('documents.templates.actions.manage')}</DialogTitle>
|
|
26
|
+
<DialogDescription>{t('documents.templates.preview.loading')}</DialogDescription>
|
|
27
|
+
</DialogHeader>
|
|
28
|
+
{error ? (
|
|
29
|
+
<ErrorMessage
|
|
30
|
+
label={t('documents.templates.error.load')}
|
|
31
|
+
action={<Button type="button" size="sm" variant="outline" onClick={retry}>{t('documents.actions.retry')}</Button>}
|
|
32
|
+
/>
|
|
33
|
+
) : (
|
|
34
|
+
<div role="status" aria-live="polite"><LoadingMessage label={t('documents.templates.preview.loading')} /></div>
|
|
35
|
+
)}
|
|
36
|
+
</DialogContent>
|
|
37
|
+
</Dialog>
|
|
38
|
+
)
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
const TemplateEditorDialog = dynamic(
|
|
42
|
+
() => import('../components/TemplateEditorDialog').then((module) => module.TemplateEditorDialog),
|
|
43
|
+
{ ssr: false, loading: TemplateEditorDialogLoading },
|
|
44
|
+
)
|
|
45
|
+
|
|
46
|
+
export function TemplatesPageClient() {
|
|
47
|
+
const t = useT()
|
|
48
|
+
const templates = useTemplatesPage()
|
|
49
|
+
const [editing, setEditing] = React.useState<TemplateRow | null>(null)
|
|
50
|
+
const [editorOpen, setEditorOpen] = React.useState(false)
|
|
51
|
+
const openEditor = React.useCallback((template: TemplateRow | null) => {
|
|
52
|
+
setEditing(template)
|
|
53
|
+
setEditorOpen(true)
|
|
54
|
+
}, [])
|
|
55
|
+
return (
|
|
56
|
+
<Page>
|
|
57
|
+
<PageBody>
|
|
58
|
+
{templates.loadError ? (
|
|
59
|
+
<ErrorMessage
|
|
60
|
+
label={templates.loadError}
|
|
61
|
+
action={<Button type="button" size="sm" variant="outline" onClick={templates.refresh}>{t('documents.actions.retry')}</Button>}
|
|
62
|
+
/>
|
|
63
|
+
) : (
|
|
64
|
+
<TemplatesTable
|
|
65
|
+
rows={templates.rows}
|
|
66
|
+
page={templates.page}
|
|
67
|
+
pageSize={templates.pageSize}
|
|
68
|
+
total={templates.total}
|
|
69
|
+
totalPages={templates.totalPages}
|
|
70
|
+
search={templates.search}
|
|
71
|
+
isLoading={templates.isLoading}
|
|
72
|
+
canManageTemplates={templates.canManageTemplates}
|
|
73
|
+
onSearchChange={templates.setSearch}
|
|
74
|
+
onPageChange={templates.setPage}
|
|
75
|
+
onPageSizeChange={templates.setPageSize}
|
|
76
|
+
onRefresh={templates.refresh}
|
|
77
|
+
onEdit={openEditor}
|
|
78
|
+
onDelete={(template) => void templates.deleteTemplate(template)}
|
|
79
|
+
/>
|
|
80
|
+
)}
|
|
81
|
+
{templates.canManageTemplates && editorOpen ? <TemplateEditorDialog
|
|
82
|
+
open
|
|
83
|
+
template={editing}
|
|
84
|
+
onOpenChange={(open) => { setEditorOpen(open); if (!open) setEditing(null) }}
|
|
85
|
+
onSaved={templates.refreshFromFirstPage}
|
|
86
|
+
/> : null}
|
|
87
|
+
{templates.ConfirmDialogElement}
|
|
88
|
+
</PageBody>
|
|
89
|
+
</Page>
|
|
90
|
+
)
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
export default TemplatesPageClient
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
"use client"
|
|
2
|
+
|
|
3
|
+
import * as React from 'react'
|
|
4
|
+
import type { LegacyColumnDef as ColumnDef } from '@tanstack/react-table/legacy'
|
|
5
|
+
import { DataTable } from '@open-mercato/ui/backend/DataTable'
|
|
6
|
+
import { RowActions } from '@open-mercato/ui/backend/RowActions'
|
|
7
|
+
import { Button } from '@open-mercato/ui/primitives/button'
|
|
8
|
+
import { StatusBadge } from '@open-mercato/ui/primitives/status-badge'
|
|
9
|
+
import { useT } from '@open-mercato/shared/lib/i18n/context'
|
|
10
|
+
import { DOCUMENTS_ENTITY_IDS } from '../../../lib/constants'
|
|
11
|
+
import { getEntityRegistryEntry } from '../../../lib/entityRegistry'
|
|
12
|
+
import { formatDateTime } from '../documentUi'
|
|
13
|
+
import type { TemplateRow } from '../components/templateUi'
|
|
14
|
+
|
|
15
|
+
export function TemplatesTable({ rows, page, pageSize, total, totalPages, search, isLoading, canManageTemplates, onSearchChange, onPageChange, onPageSizeChange, onRefresh, onEdit, onDelete }: {
|
|
16
|
+
rows: TemplateRow[]
|
|
17
|
+
page: number
|
|
18
|
+
pageSize: number
|
|
19
|
+
total: number
|
|
20
|
+
totalPages: number
|
|
21
|
+
search: string
|
|
22
|
+
isLoading: boolean
|
|
23
|
+
canManageTemplates: boolean
|
|
24
|
+
onSearchChange: (search: string) => void
|
|
25
|
+
onPageChange: (page: number) => void
|
|
26
|
+
onPageSizeChange: (pageSize: number) => void
|
|
27
|
+
onRefresh: () => void
|
|
28
|
+
onEdit: (template: TemplateRow | null) => void
|
|
29
|
+
onDelete: (template: TemplateRow) => void
|
|
30
|
+
}) {
|
|
31
|
+
const t = useT()
|
|
32
|
+
const columns = React.useMemo<ColumnDef<TemplateRow>[]>(() => [
|
|
33
|
+
{ accessorKey: 'name', header: t('documents.templates.columns.name'), meta: { alwaysVisible: true, maxWidth: '240px', truncate: true }, cell: ({ row }) => <span className="font-medium">{row.original.name}</span> },
|
|
34
|
+
{ accessorKey: 'description', header: t('documents.templates.columns.description'), meta: { maxWidth: '320px', truncate: true }, cell: ({ row }) => row.original.description ?? <span className="text-muted-foreground">{t('documents.templates.list.noDescription')}</span> },
|
|
35
|
+
{ id: 'slots', header: t('documents.templates.columns.slots'), meta: { maxWidth: '260px', truncate: true }, cell: ({ row }) => row.original.contextSlots.length > 0 ? row.original.contextSlots.map((slot) => t(getEntityRegistryEntry(slot.entityType)?.labelKey ?? 'documents.relatedRecords.restricted')).join(', ') : t('documents.templates.slots.none') },
|
|
36
|
+
{ accessorKey: 'isActive', header: t('documents.templates.columns.active'), cell: ({ row }) => <StatusBadge variant={row.original.isActive ? 'success' : 'neutral'} dot>{t(row.original.isActive ? 'documents.templates.status.active' : 'documents.templates.status.inactive')}</StatusBadge> },
|
|
37
|
+
{ accessorKey: 'updatedAt', header: t('documents.columns.updatedAt'), meta: { maxWidth: '180px' }, cell: ({ row }) => formatDateTime(row.original.updatedAt, t('documents.list.noValue')) },
|
|
38
|
+
], [t])
|
|
39
|
+
return (
|
|
40
|
+
<DataTable<TemplateRow>
|
|
41
|
+
title={t('documents.templates.list.title')}
|
|
42
|
+
actions={canManageTemplates ? <Button type="button" onClick={() => onEdit(null)}>{t('documents.templates.actions.new')}</Button> : undefined}
|
|
43
|
+
refreshButton={{ label: t('documents.actions.refresh'), onRefresh, isRefreshing: isLoading }}
|
|
44
|
+
columns={columns}
|
|
45
|
+
data={rows}
|
|
46
|
+
isLoading={isLoading}
|
|
47
|
+
searchValue={search}
|
|
48
|
+
onSearchChange={onSearchChange}
|
|
49
|
+
searchPlaceholder={t('documents.templates.list.searchPlaceholder')}
|
|
50
|
+
emptyState={t('documents.templates.list.empty')}
|
|
51
|
+
entityId={DOCUMENTS_ENTITY_IDS.documentTemplate}
|
|
52
|
+
extensionTableId="documents.templates.list"
|
|
53
|
+
onRowClick={canManageTemplates ? onEdit : undefined}
|
|
54
|
+
rowClickActionIds={canManageTemplates ? ['edit'] : []}
|
|
55
|
+
stickyActionsColumn
|
|
56
|
+
pagination={{
|
|
57
|
+
page,
|
|
58
|
+
pageSize,
|
|
59
|
+
total,
|
|
60
|
+
totalPages,
|
|
61
|
+
onPageChange,
|
|
62
|
+
onPageSizeChange,
|
|
63
|
+
pageSizeOptions: [25, 50, 100],
|
|
64
|
+
}}
|
|
65
|
+
rowActions={canManageTemplates ? (row) => <RowActions items={[
|
|
66
|
+
{ id: 'edit', label: t('documents.actions.edit'), onSelect: () => onEdit(row) },
|
|
67
|
+
{ id: 'delete', label: t('documents.actions.delete'), destructive: true, onSelect: () => onDelete(row) },
|
|
68
|
+
]} /> : undefined}
|
|
69
|
+
/>
|
|
70
|
+
)
|
|
71
|
+
}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import React from 'react'
|
|
2
|
+
|
|
3
|
+
// Page metadata must stay a plain serializable element tree — a lucide component
|
|
4
|
+
// reference does not survive metadata serialization and drops the sidebar icon.
|
|
5
|
+
const documentsTemplatesIcon = React.createElement('svg', { width: 16, height: 16, viewBox: '0 0 24 24', fill: 'none', stroke: 'currentColor', strokeWidth: 2 },
|
|
6
|
+
React.createElement('path', { d: 'M15 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V7Z' }),
|
|
7
|
+
React.createElement('path', { d: 'M14 2v4a2 2 0 0 0 2 2h4' }),
|
|
8
|
+
React.createElement('path', { d: 'M14 13H8' }),
|
|
9
|
+
React.createElement('path', { d: 'M14 17H8' }),
|
|
10
|
+
React.createElement('path', { d: 'M10 9H8' }),
|
|
11
|
+
)
|
|
12
|
+
|
|
13
|
+
export const metadata = {
|
|
14
|
+
requireAuth: true,
|
|
15
|
+
// The template list API stays on `documents.view` because the
|
|
16
|
+
// new-from-template dialog needs it, but this page is the management
|
|
17
|
+
// surface: every action on it, and the single-template read behind its
|
|
18
|
+
// editor, require `documents.templates.manage`. Gate the page (and the nav
|
|
19
|
+
// entry it registers) on the same feature instead of advertising a dead end.
|
|
20
|
+
requireFeatures: ['documents.templates.manage'],
|
|
21
|
+
pageTitle: 'Document templates',
|
|
22
|
+
pageTitleKey: 'documents.nav.templates',
|
|
23
|
+
pageGroup: 'Documents',
|
|
24
|
+
pageGroupKey: 'documents.nav.group',
|
|
25
|
+
pagePriority: 40,
|
|
26
|
+
pageOrder: 110,
|
|
27
|
+
icon: documentsTemplatesIcon,
|
|
28
|
+
breadcrumb: [
|
|
29
|
+
{ label: 'Documents', labelKey: 'documents.nav.documents' },
|
|
30
|
+
{ label: 'Document templates', labelKey: 'documents.nav.templates' },
|
|
31
|
+
],
|
|
32
|
+
}
|