@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,216 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import * as React from "react";
|
|
3
|
+
import { apiCall } from "@open-mercato/ui/backend/utils/apiCall";
|
|
4
|
+
import { resolveSearchMinTokenLength } from "@open-mercato/shared/lib/search/config";
|
|
5
|
+
import {
|
|
6
|
+
firstSafeDocumentsDisplayLabel,
|
|
7
|
+
sanitizeDocumentsDisplayLabel
|
|
8
|
+
} from "../../../lib/displayLabels.js";
|
|
9
|
+
const MENTION_SEARCH_MIN_LENGTH = resolveSearchMinTokenLength();
|
|
10
|
+
function isMentionSearchUnavailableStatus(status) {
|
|
11
|
+
return status === 401 || status === 403 || status === 404;
|
|
12
|
+
}
|
|
13
|
+
function readRecord(value) {
|
|
14
|
+
return value && typeof value === "object" ? value : null;
|
|
15
|
+
}
|
|
16
|
+
function readString(record, ...keys) {
|
|
17
|
+
for (const key of keys) {
|
|
18
|
+
const value = record[key];
|
|
19
|
+
if (typeof value === "string" && value.trim().length > 0) return value;
|
|
20
|
+
}
|
|
21
|
+
return null;
|
|
22
|
+
}
|
|
23
|
+
function normalizeUser(value, fallbackLabel) {
|
|
24
|
+
const record = readRecord(value);
|
|
25
|
+
if (!record) return null;
|
|
26
|
+
const id = readString(record, "id");
|
|
27
|
+
const label = firstSafeDocumentsDisplayLabel(readString(record, "label"), fallbackLabel);
|
|
28
|
+
if (!id || !label) return null;
|
|
29
|
+
const rawSecondary = sanitizeDocumentsDisplayLabel(readString(record, "secondary"));
|
|
30
|
+
return { id, label, secondary: rawSecondary && rawSecondary !== label ? rawSecondary : null };
|
|
31
|
+
}
|
|
32
|
+
function readMentionUserItems(payload, fallbackLabel) {
|
|
33
|
+
if (Array.isArray(payload)) {
|
|
34
|
+
return payload.map((item) => normalizeUser(item, fallbackLabel)).filter((user) => user !== null);
|
|
35
|
+
}
|
|
36
|
+
const record = readRecord(payload);
|
|
37
|
+
if (!record) return [];
|
|
38
|
+
for (const candidate of [record.items, record.data]) {
|
|
39
|
+
if (Array.isArray(candidate)) {
|
|
40
|
+
return candidate.map((item) => normalizeUser(item, fallbackLabel)).filter((user) => user !== null);
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
return [];
|
|
44
|
+
}
|
|
45
|
+
function buildMentionPrincipalUrl(documentId, search) {
|
|
46
|
+
const params = new URLSearchParams({
|
|
47
|
+
mode: "mention",
|
|
48
|
+
type: "user",
|
|
49
|
+
search,
|
|
50
|
+
page: "1",
|
|
51
|
+
pageSize: "8"
|
|
52
|
+
});
|
|
53
|
+
return `/api/documents/${encodeURIComponent(documentId)}/principals?${params.toString()}`;
|
|
54
|
+
}
|
|
55
|
+
function nextMentionIndex(current, direction, itemCount) {
|
|
56
|
+
if (itemCount <= 0) return -1;
|
|
57
|
+
if (current < 0) return direction === 1 ? 0 : itemCount - 1;
|
|
58
|
+
return Math.min(itemCount - 1, Math.max(0, current + direction));
|
|
59
|
+
}
|
|
60
|
+
function useMentionPicker(input) {
|
|
61
|
+
const [query, setQuery] = React.useState("");
|
|
62
|
+
const [users, setUsers] = React.useState([]);
|
|
63
|
+
const [open, setOpen] = React.useState(false);
|
|
64
|
+
const [unavailable, setUnavailable] = React.useState(false);
|
|
65
|
+
const [hasError, setHasError] = React.useState(false);
|
|
66
|
+
const [retryToken, setRetryToken] = React.useState(0);
|
|
67
|
+
const [isLoading, setIsLoading] = React.useState(false);
|
|
68
|
+
const [hasSearched, setHasSearched] = React.useState(false);
|
|
69
|
+
const [activeIndex, setActiveIndex] = React.useState(-1);
|
|
70
|
+
const [resultQuery, setResultQuery] = React.useState(null);
|
|
71
|
+
const currentQueryRef = React.useRef("");
|
|
72
|
+
const resultQueryRef = React.useRef(null);
|
|
73
|
+
const activeRequestRef = React.useRef(null);
|
|
74
|
+
const clearResults = React.useCallback(() => {
|
|
75
|
+
resultQueryRef.current = null;
|
|
76
|
+
setResultQuery(null);
|
|
77
|
+
setUsers([]);
|
|
78
|
+
setHasSearched(false);
|
|
79
|
+
setHasError(false);
|
|
80
|
+
setActiveIndex(-1);
|
|
81
|
+
}, []);
|
|
82
|
+
const onQueryChange = React.useCallback((nextQuery) => {
|
|
83
|
+
const normalizedQuery = nextQuery.trim();
|
|
84
|
+
currentQueryRef.current = normalizedQuery;
|
|
85
|
+
activeRequestRef.current?.abort();
|
|
86
|
+
activeRequestRef.current = null;
|
|
87
|
+
clearResults();
|
|
88
|
+
const shouldSearch = !input.disabled && !unavailable && normalizedQuery.length >= MENTION_SEARCH_MIN_LENGTH;
|
|
89
|
+
setOpen(shouldSearch);
|
|
90
|
+
setIsLoading(shouldSearch);
|
|
91
|
+
setQuery(nextQuery);
|
|
92
|
+
}, [clearResults, input.disabled, unavailable]);
|
|
93
|
+
React.useEffect(() => {
|
|
94
|
+
activeRequestRef.current?.abort();
|
|
95
|
+
activeRequestRef.current = null;
|
|
96
|
+
currentQueryRef.current = "";
|
|
97
|
+
setQuery("");
|
|
98
|
+
setOpen(false);
|
|
99
|
+
setUnavailable(false);
|
|
100
|
+
setIsLoading(false);
|
|
101
|
+
clearResults();
|
|
102
|
+
}, [clearResults, input.documentId]);
|
|
103
|
+
React.useEffect(() => {
|
|
104
|
+
const trimmedQuery = query.trim();
|
|
105
|
+
if (input.disabled || unavailable || trimmedQuery.length < MENTION_SEARCH_MIN_LENGTH) {
|
|
106
|
+
currentQueryRef.current = trimmedQuery;
|
|
107
|
+
setOpen(false);
|
|
108
|
+
setIsLoading(false);
|
|
109
|
+
clearResults();
|
|
110
|
+
return;
|
|
111
|
+
}
|
|
112
|
+
let cancelled = false;
|
|
113
|
+
const controller = new AbortController();
|
|
114
|
+
activeRequestRef.current = controller;
|
|
115
|
+
setOpen(true);
|
|
116
|
+
setIsLoading(true);
|
|
117
|
+
setHasSearched(false);
|
|
118
|
+
const timer = window.setTimeout(() => {
|
|
119
|
+
void apiCall(
|
|
120
|
+
buildMentionPrincipalUrl(input.documentId, trimmedQuery),
|
|
121
|
+
{
|
|
122
|
+
signal: controller.signal,
|
|
123
|
+
headers: { "x-om-forbidden-redirect": "0", "x-om-unauthorized-redirect": "0" }
|
|
124
|
+
},
|
|
125
|
+
{ fallback: { items: [] } }
|
|
126
|
+
).then((call) => {
|
|
127
|
+
if (cancelled || controller.signal.aborted || currentQueryRef.current !== trimmedQuery) return;
|
|
128
|
+
if (!call.ok) {
|
|
129
|
+
clearResults();
|
|
130
|
+
if (isMentionSearchUnavailableStatus(call.status)) {
|
|
131
|
+
setUnavailable(true);
|
|
132
|
+
setOpen(false);
|
|
133
|
+
} else {
|
|
134
|
+
setHasError(true);
|
|
135
|
+
setOpen(true);
|
|
136
|
+
}
|
|
137
|
+
return;
|
|
138
|
+
}
|
|
139
|
+
const nextUsers = readMentionUserItems(call.result, input.fallbackLabel).slice(0, 8);
|
|
140
|
+
resultQueryRef.current = trimmedQuery;
|
|
141
|
+
setResultQuery(trimmedQuery);
|
|
142
|
+
setUsers(nextUsers);
|
|
143
|
+
setHasSearched(true);
|
|
144
|
+
setActiveIndex(nextUsers.length > 0 ? 0 : -1);
|
|
145
|
+
}).catch(() => {
|
|
146
|
+
if (!cancelled && !controller.signal.aborted && currentQueryRef.current === trimmedQuery) {
|
|
147
|
+
clearResults();
|
|
148
|
+
setHasError(true);
|
|
149
|
+
setOpen(true);
|
|
150
|
+
}
|
|
151
|
+
}).finally(() => {
|
|
152
|
+
if (!cancelled && !controller.signal.aborted && currentQueryRef.current === trimmedQuery) {
|
|
153
|
+
setIsLoading(false);
|
|
154
|
+
}
|
|
155
|
+
if (activeRequestRef.current === controller) activeRequestRef.current = null;
|
|
156
|
+
});
|
|
157
|
+
}, 250);
|
|
158
|
+
return () => {
|
|
159
|
+
cancelled = true;
|
|
160
|
+
window.clearTimeout(timer);
|
|
161
|
+
controller.abort();
|
|
162
|
+
if (activeRequestRef.current === controller) activeRequestRef.current = null;
|
|
163
|
+
};
|
|
164
|
+
}, [clearResults, input.disabled, input.documentId, input.fallbackLabel, query, retryToken, unavailable]);
|
|
165
|
+
const isDisabled = input.disabled || unavailable;
|
|
166
|
+
const resultsAreCurrent = resultQuery !== null && resultQuery === query.trim() && resultQueryRef.current === resultQuery && currentQueryRef.current === resultQuery;
|
|
167
|
+
const pick = React.useCallback((user, boundQuery) => {
|
|
168
|
+
if (isDisabled || !boundQuery || resultQueryRef.current !== boundQuery || currentQueryRef.current !== boundQuery) return;
|
|
169
|
+
input.onPick({ id: user.id, name: user.label });
|
|
170
|
+
activeRequestRef.current?.abort();
|
|
171
|
+
activeRequestRef.current = null;
|
|
172
|
+
currentQueryRef.current = "";
|
|
173
|
+
setQuery("");
|
|
174
|
+
setOpen(false);
|
|
175
|
+
setIsLoading(false);
|
|
176
|
+
clearResults();
|
|
177
|
+
}, [clearResults, input.onPick, isDisabled]);
|
|
178
|
+
const retry = React.useCallback(() => {
|
|
179
|
+
const trimmedQuery = query.trim();
|
|
180
|
+
if (input.disabled || unavailable || trimmedQuery.length < MENTION_SEARCH_MIN_LENGTH) return;
|
|
181
|
+
activeRequestRef.current?.abort();
|
|
182
|
+
activeRequestRef.current = null;
|
|
183
|
+
clearResults();
|
|
184
|
+
setOpen(true);
|
|
185
|
+
setIsLoading(true);
|
|
186
|
+
setRetryToken((token) => token + 1);
|
|
187
|
+
}, [clearResults, input.disabled, query, unavailable]);
|
|
188
|
+
return {
|
|
189
|
+
query,
|
|
190
|
+
users,
|
|
191
|
+
open,
|
|
192
|
+
unavailable,
|
|
193
|
+
hasError,
|
|
194
|
+
isLoading,
|
|
195
|
+
hasSearched,
|
|
196
|
+
activeIndex,
|
|
197
|
+
resultQuery,
|
|
198
|
+
isDisabled,
|
|
199
|
+
resultsAreCurrent,
|
|
200
|
+
retry,
|
|
201
|
+
onQueryChange,
|
|
202
|
+
dismiss: () => setOpen(false),
|
|
203
|
+
moveActive: (direction) => setActiveIndex((index) => nextMentionIndex(index, direction, resultsAreCurrent ? users.length : 0)),
|
|
204
|
+
activate: (index, boundQuery) => {
|
|
205
|
+
if (boundQuery && resultQueryRef.current === boundQuery) setActiveIndex(index);
|
|
206
|
+
},
|
|
207
|
+
pick
|
|
208
|
+
};
|
|
209
|
+
}
|
|
210
|
+
export {
|
|
211
|
+
buildMentionPrincipalUrl,
|
|
212
|
+
nextMentionIndex,
|
|
213
|
+
readMentionUserItems,
|
|
214
|
+
useMentionPicker
|
|
215
|
+
};
|
|
216
|
+
//# sourceMappingURL=useMentionPicker.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../../../src/modules/documents/backend/documents/%5Bid%5D/useMentionPicker.ts"],
|
|
4
|
+
"sourcesContent": ["\"use client\"\n\nimport * as React from 'react'\nimport { apiCall } from '@open-mercato/ui/backend/utils/apiCall'\nimport { resolveSearchMinTokenLength } from '@open-mercato/shared/lib/search/config'\nimport {\n firstSafeDocumentsDisplayLabel,\n sanitizeDocumentsDisplayLabel,\n} from '../../../lib/displayLabels'\n\nexport type MentionUser = {\n id: string\n label: string\n secondary: string | null\n}\n\nconst MENTION_SEARCH_MIN_LENGTH = resolveSearchMinTokenLength()\n\nfunction isMentionSearchUnavailableStatus(status: number | undefined): boolean {\n return status === 401 || status === 403 || status === 404\n}\n\nfunction readRecord(value: unknown): Record<string, unknown> | null {\n return value && typeof value === 'object' ? value as Record<string, unknown> : null\n}\n\nfunction readString(record: Record<string, unknown>, ...keys: string[]): string | null {\n for (const key of keys) {\n const value = record[key]\n if (typeof value === 'string' && value.trim().length > 0) return value\n }\n return null\n}\n\nfunction normalizeUser(value: unknown, fallbackLabel: string): MentionUser | null {\n const record = readRecord(value)\n if (!record) return null\n const id = readString(record, 'id')\n const label = firstSafeDocumentsDisplayLabel(readString(record, 'label'), fallbackLabel)\n if (!id || !label) return null\n const rawSecondary = sanitizeDocumentsDisplayLabel(readString(record, 'secondary'))\n return { id, label, secondary: rawSecondary && rawSecondary !== label ? rawSecondary : null }\n}\n\nexport function readMentionUserItems(payload: unknown, fallbackLabel: string): MentionUser[] {\n if (Array.isArray(payload)) {\n return payload\n .map((item) => normalizeUser(item, fallbackLabel))\n .filter((user): user is MentionUser => user !== null)\n }\n const record = readRecord(payload)\n if (!record) return []\n for (const candidate of [record.items, record.data]) {\n if (Array.isArray(candidate)) {\n return candidate\n .map((item) => normalizeUser(item, fallbackLabel))\n .filter((user): user is MentionUser => user !== null)\n }\n }\n return []\n}\n\nexport function buildMentionPrincipalUrl(documentId: string, search: string): string {\n const params = new URLSearchParams({\n mode: 'mention',\n type: 'user',\n search,\n page: '1',\n pageSize: '8',\n })\n return `/api/documents/${encodeURIComponent(documentId)}/principals?${params.toString()}`\n}\n\nexport function nextMentionIndex(current: number, direction: 1 | -1, itemCount: number): number {\n if (itemCount <= 0) return -1\n if (current < 0) return direction === 1 ? 0 : itemCount - 1\n return Math.min(itemCount - 1, Math.max(0, current + direction))\n}\n\nexport function useMentionPicker(input: {\n documentId: string\n fallbackLabel: string\n onPick: (user: { id: string; name: string }) => void\n disabled: boolean\n}) {\n const [query, setQuery] = React.useState('')\n const [users, setUsers] = React.useState<MentionUser[]>([])\n const [open, setOpen] = React.useState(false)\n const [unavailable, setUnavailable] = React.useState(false)\n const [hasError, setHasError] = React.useState(false)\n const [retryToken, setRetryToken] = React.useState(0)\n const [isLoading, setIsLoading] = React.useState(false)\n const [hasSearched, setHasSearched] = React.useState(false)\n const [activeIndex, setActiveIndex] = React.useState(-1)\n const [resultQuery, setResultQuery] = React.useState<string | null>(null)\n const currentQueryRef = React.useRef('')\n const resultQueryRef = React.useRef<string | null>(null)\n const activeRequestRef = React.useRef<AbortController | null>(null)\n\n const clearResults = React.useCallback(() => {\n resultQueryRef.current = null\n setResultQuery(null)\n setUsers([])\n setHasSearched(false)\n setHasError(false)\n setActiveIndex(-1)\n }, [])\n\n const onQueryChange = React.useCallback((nextQuery: string) => {\n const normalizedQuery = nextQuery.trim()\n currentQueryRef.current = normalizedQuery\n activeRequestRef.current?.abort()\n activeRequestRef.current = null\n clearResults()\n const shouldSearch = !input.disabled\n && !unavailable\n && normalizedQuery.length >= MENTION_SEARCH_MIN_LENGTH\n setOpen(shouldSearch)\n setIsLoading(shouldSearch)\n setQuery(nextQuery)\n }, [clearResults, input.disabled, unavailable])\n\n React.useEffect(() => {\n activeRequestRef.current?.abort()\n activeRequestRef.current = null\n currentQueryRef.current = ''\n setQuery('')\n setOpen(false)\n setUnavailable(false)\n setIsLoading(false)\n clearResults()\n }, [clearResults, input.documentId])\n\n React.useEffect(() => {\n const trimmedQuery = query.trim()\n if (input.disabled || unavailable || trimmedQuery.length < MENTION_SEARCH_MIN_LENGTH) {\n currentQueryRef.current = trimmedQuery\n setOpen(false)\n setIsLoading(false)\n clearResults()\n return\n }\n\n let cancelled = false\n const controller = new AbortController()\n activeRequestRef.current = controller\n setOpen(true)\n setIsLoading(true)\n setHasSearched(false)\n const timer = window.setTimeout(() => {\n void apiCall<unknown>(\n buildMentionPrincipalUrl(input.documentId, trimmedQuery),\n {\n signal: controller.signal,\n headers: { 'x-om-forbidden-redirect': '0', 'x-om-unauthorized-redirect': '0' },\n },\n { fallback: { items: [] } },\n )\n .then((call) => {\n if (cancelled || controller.signal.aborted || currentQueryRef.current !== trimmedQuery) return\n if (!call.ok) {\n clearResults()\n if (isMentionSearchUnavailableStatus(call.status)) {\n setUnavailable(true)\n setOpen(false)\n } else {\n setHasError(true)\n setOpen(true)\n }\n return\n }\n const nextUsers = readMentionUserItems(call.result, input.fallbackLabel).slice(0, 8)\n resultQueryRef.current = trimmedQuery\n setResultQuery(trimmedQuery)\n setUsers(nextUsers)\n setHasSearched(true)\n setActiveIndex(nextUsers.length > 0 ? 0 : -1)\n })\n .catch(() => {\n if (!cancelled && !controller.signal.aborted && currentQueryRef.current === trimmedQuery) {\n clearResults()\n setHasError(true)\n setOpen(true)\n }\n })\n .finally(() => {\n if (!cancelled && !controller.signal.aborted && currentQueryRef.current === trimmedQuery) {\n setIsLoading(false)\n }\n if (activeRequestRef.current === controller) activeRequestRef.current = null\n })\n }, 250)\n\n return () => {\n cancelled = true\n window.clearTimeout(timer)\n controller.abort()\n if (activeRequestRef.current === controller) activeRequestRef.current = null\n }\n }, [clearResults, input.disabled, input.documentId, input.fallbackLabel, query, retryToken, unavailable])\n\n const isDisabled = input.disabled || unavailable\n const resultsAreCurrent = resultQuery !== null\n && resultQuery === query.trim()\n && resultQueryRef.current === resultQuery\n && currentQueryRef.current === resultQuery\n\n const pick = React.useCallback((user: MentionUser, boundQuery: string | null) => {\n if (\n isDisabled\n || !boundQuery\n || resultQueryRef.current !== boundQuery\n || currentQueryRef.current !== boundQuery\n ) return\n input.onPick({ id: user.id, name: user.label })\n activeRequestRef.current?.abort()\n activeRequestRef.current = null\n currentQueryRef.current = ''\n setQuery('')\n setOpen(false)\n setIsLoading(false)\n clearResults()\n }, [clearResults, input.onPick, isDisabled])\n\n const retry = React.useCallback(() => {\n const trimmedQuery = query.trim()\n if (input.disabled || unavailable || trimmedQuery.length < MENTION_SEARCH_MIN_LENGTH) return\n activeRequestRef.current?.abort()\n activeRequestRef.current = null\n clearResults()\n setOpen(true)\n setIsLoading(true)\n setRetryToken((token) => token + 1)\n }, [clearResults, input.disabled, query, unavailable])\n\n return {\n query,\n users,\n open,\n unavailable,\n hasError,\n isLoading,\n hasSearched,\n activeIndex,\n resultQuery,\n isDisabled,\n resultsAreCurrent,\n retry,\n onQueryChange,\n dismiss: () => setOpen(false),\n moveActive: (direction: 1 | -1) => setActiveIndex((index) => (\n nextMentionIndex(index, direction, resultsAreCurrent ? users.length : 0)\n )),\n activate: (index: number, boundQuery: string | null) => {\n if (boundQuery && resultQueryRef.current === boundQuery) setActiveIndex(index)\n },\n pick,\n }\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import {
|
|
2
|
+
firstSafeDocumentsDisplayLabel
|
|
3
|
+
} from "../../../lib/displayLabels.js";
|
|
4
|
+
import { sanitizeDocumentVersionLabel } from "../../../lib/versionLabels.js";
|
|
5
|
+
import { readRecord, readString } from "../documentUi.js";
|
|
6
|
+
function normalizeVersion(value, fallbackCreatorLabel) {
|
|
7
|
+
const record = readRecord(value);
|
|
8
|
+
if (!record) return null;
|
|
9
|
+
const id = readString(record, "id");
|
|
10
|
+
const createdAt = readString(record, "createdAt", "created_at");
|
|
11
|
+
if (!id || !createdAt) return null;
|
|
12
|
+
return {
|
|
13
|
+
id,
|
|
14
|
+
createdAt,
|
|
15
|
+
label: sanitizeDocumentVersionLabel(readString(record, "label")),
|
|
16
|
+
creatorLabel: firstSafeDocumentsDisplayLabel(
|
|
17
|
+
readString(record, "creatorLabel", "createdByLabel", "created_by_label"),
|
|
18
|
+
fallbackCreatorLabel
|
|
19
|
+
) ?? ""
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
export {
|
|
23
|
+
normalizeVersion
|
|
24
|
+
};
|
|
25
|
+
//# sourceMappingURL=versionHistoryModel.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../../../src/modules/documents/backend/documents/%5Bid%5D/versionHistoryModel.ts"],
|
|
4
|
+
"sourcesContent": ["import {\n firstSafeDocumentsDisplayLabel,\n} from '../../../lib/displayLabels'\nimport { sanitizeDocumentVersionLabel } from '../../../lib/versionLabels'\nimport { readRecord, readString } from '../documentUi'\n\nexport type DocumentVersion = {\n id: string\n label: string | null\n creatorLabel: string\n createdAt: string\n}\n\nexport function normalizeVersion(value: unknown, fallbackCreatorLabel?: string): DocumentVersion | null {\n const record = readRecord(value)\n if (!record) return null\n const id = readString(record, 'id')\n const createdAt = readString(record, 'createdAt', 'created_at')\n if (!id || !createdAt) return null\n return {\n id,\n createdAt,\n label: sanitizeDocumentVersionLabel(readString(record, 'label')),\n creatorLabel: firstSafeDocumentsDisplayLabel(\n readString(record, 'creatorLabel', 'createdByLabel', 'created_by_label'),\n fallbackCreatorLabel,\n ) ?? '',\n }\n}\n"],
|
|
5
|
+
"mappings": "AAAA;AAAA,EACE;AAAA,OACK;AACP,SAAS,oCAAoC;AAC7C,SAAS,YAAY,kBAAkB;AAShC,SAAS,iBAAiB,OAAgB,sBAAuD;AACtG,QAAM,SAAS,WAAW,KAAK;AAC/B,MAAI,CAAC,OAAQ,QAAO;AACpB,QAAM,KAAK,WAAW,QAAQ,IAAI;AAClC,QAAM,YAAY,WAAW,QAAQ,aAAa,YAAY;AAC9D,MAAI,CAAC,MAAM,CAAC,UAAW,QAAO;AAC9B,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,OAAO,6BAA6B,WAAW,QAAQ,OAAO,CAAC;AAAA,IAC/D,cAAc;AAAA,MACZ,WAAW,QAAQ,gBAAgB,kBAAkB,kBAAkB;AAAA,MACvE;AAAA,IACF,KAAK;AAAA,EACP;AACF;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
3
|
+
import * as React from "react";
|
|
4
|
+
import { Search } from "lucide-react";
|
|
5
|
+
import { Button } from "@open-mercato/ui/primitives/button";
|
|
6
|
+
import { LoadingMessage } from "@open-mercato/ui/backend/detail";
|
|
7
|
+
import {
|
|
8
|
+
Dialog,
|
|
9
|
+
DialogContent,
|
|
10
|
+
DialogDescription,
|
|
11
|
+
DialogFooter,
|
|
12
|
+
DialogHeader,
|
|
13
|
+
DialogTitle
|
|
14
|
+
} from "@open-mercato/ui/primitives/dialog";
|
|
15
|
+
import { Input } from "@open-mercato/ui/primitives/input";
|
|
16
|
+
import { Label } from "@open-mercato/ui/primitives/label";
|
|
17
|
+
import { SegmentedControl, SegmentedControlItem } from "@open-mercato/ui/primitives/segmented-control";
|
|
18
|
+
import { useT } from "@open-mercato/shared/lib/i18n/context";
|
|
19
|
+
import { sanitizeDocumentsDisplayLabel } from "../../../lib/displayLabels.js";
|
|
20
|
+
import { EntityPickerResults } from "./EntityPickerResults.js";
|
|
21
|
+
import { useEntitySearch } from "./useEntitySearch.js";
|
|
22
|
+
function EntityPicker({ open, onOpenChange, onPick, typeFilter, excludeId }) {
|
|
23
|
+
const t = useT();
|
|
24
|
+
const inputId = `documents-entity-picker-${React.useId()}`;
|
|
25
|
+
const listId = `${inputId}-results`;
|
|
26
|
+
const search = useEntitySearch(open, typeFilter, excludeId);
|
|
27
|
+
const selectItem = React.useCallback((item) => {
|
|
28
|
+
if (!search.activeEntry || !search.isResultCurrent()) return;
|
|
29
|
+
const href = search.activeEntry.resolveHref(item);
|
|
30
|
+
const label = sanitizeDocumentsDisplayLabel(item.label);
|
|
31
|
+
if (!href || !label) return;
|
|
32
|
+
const rawItem = item.rawItem ?? {};
|
|
33
|
+
const values = Object.fromEntries(search.activeEntry.tokenFields.map((field) => [
|
|
34
|
+
field.field,
|
|
35
|
+
sanitizeDocumentsDisplayLabel(field.extract(rawItem))
|
|
36
|
+
]));
|
|
37
|
+
onPick({ type: search.activeEntry.type, id: item.id, label, href, values });
|
|
38
|
+
onOpenChange(false);
|
|
39
|
+
}, [onOpenChange, onPick, search.activeEntry, search.isResultCurrent]);
|
|
40
|
+
const pickActiveItem = React.useCallback(() => {
|
|
41
|
+
const item = search.items[search.activeIndex];
|
|
42
|
+
if (item) selectItem(item);
|
|
43
|
+
}, [search.activeIndex, search.items, selectItem]);
|
|
44
|
+
const handleSearchKeyDown = React.useCallback((event) => {
|
|
45
|
+
if ((event.key === "ArrowDown" || event.key === "ArrowUp") && search.items.length === 0) {
|
|
46
|
+
event.preventDefault();
|
|
47
|
+
search.setActiveIndex(-1);
|
|
48
|
+
return;
|
|
49
|
+
}
|
|
50
|
+
if (event.key === "ArrowDown") {
|
|
51
|
+
event.preventDefault();
|
|
52
|
+
search.setActiveIndex((index) => Math.min(index + 1, search.items.length - 1));
|
|
53
|
+
return;
|
|
54
|
+
}
|
|
55
|
+
if (event.key === "ArrowUp") {
|
|
56
|
+
event.preventDefault();
|
|
57
|
+
search.setActiveIndex((index) => Math.max(index - 1, 0));
|
|
58
|
+
return;
|
|
59
|
+
}
|
|
60
|
+
if (event.key === "Enter") {
|
|
61
|
+
event.preventDefault();
|
|
62
|
+
pickActiveItem();
|
|
63
|
+
}
|
|
64
|
+
}, [pickActiveItem, search.items.length, search.setActiveIndex]);
|
|
65
|
+
if (!open) return null;
|
|
66
|
+
const hasQuery = search.searchValue.trim().length > 0;
|
|
67
|
+
return /* @__PURE__ */ jsx(Dialog, { open, onOpenChange, children: /* @__PURE__ */ jsxs(DialogContent, { size: "lg", onKeyDown: (event) => {
|
|
68
|
+
if (event.defaultPrevented) return;
|
|
69
|
+
if (event.key === "Escape") {
|
|
70
|
+
event.preventDefault();
|
|
71
|
+
onOpenChange(false);
|
|
72
|
+
return;
|
|
73
|
+
}
|
|
74
|
+
if ((event.metaKey || event.ctrlKey) && event.key === "Enter") {
|
|
75
|
+
event.preventDefault();
|
|
76
|
+
pickActiveItem();
|
|
77
|
+
return;
|
|
78
|
+
}
|
|
79
|
+
}, children: [
|
|
80
|
+
/* @__PURE__ */ jsxs(DialogHeader, { children: [
|
|
81
|
+
/* @__PURE__ */ jsx(DialogTitle, { children: t("documents.entityPicker.title") }),
|
|
82
|
+
/* @__PURE__ */ jsx(DialogDescription, { children: t("documents.entityPicker.description") })
|
|
83
|
+
] }),
|
|
84
|
+
!search.isRegistryReady ? /* @__PURE__ */ jsx("div", { role: "status", "aria-live": "polite", children: /* @__PURE__ */ jsx(LoadingMessage, { label: t("documents.entityPicker.loadingRegistry") }) }) : search.availableEntries.length > 0 ? /* @__PURE__ */ jsxs("div", { className: "space-y-4", children: [
|
|
85
|
+
/* @__PURE__ */ jsx(
|
|
86
|
+
SegmentedControl,
|
|
87
|
+
{
|
|
88
|
+
value: search.activeEntry?.type,
|
|
89
|
+
onValueChange: (value) => {
|
|
90
|
+
const entry = search.availableEntries.find((candidate) => candidate.type === value);
|
|
91
|
+
if (!entry) return;
|
|
92
|
+
search.setActiveType(entry.type);
|
|
93
|
+
search.setActiveIndex(-1);
|
|
94
|
+
},
|
|
95
|
+
"aria-label": t("documents.entityPicker.typeTabs"),
|
|
96
|
+
className: "grid h-auto w-full grid-cols-2 gap-1 rounded-xl p-1 sm:grid-cols-4",
|
|
97
|
+
children: search.availableEntries.map((entry) => /* @__PURE__ */ jsx(
|
|
98
|
+
SegmentedControlItem,
|
|
99
|
+
{
|
|
100
|
+
value: entry.type,
|
|
101
|
+
className: "h-auto min-h-7 min-w-0 whitespace-normal px-2 py-1 text-center leading-tight",
|
|
102
|
+
children: t(entry.labelKey)
|
|
103
|
+
},
|
|
104
|
+
entry.type
|
|
105
|
+
))
|
|
106
|
+
}
|
|
107
|
+
),
|
|
108
|
+
/* @__PURE__ */ jsxs("div", { className: "space-y-2", children: [
|
|
109
|
+
/* @__PURE__ */ jsx(Label, { htmlFor: inputId, children: t("documents.entityPicker.searchLabel") }),
|
|
110
|
+
/* @__PURE__ */ jsx(
|
|
111
|
+
Input,
|
|
112
|
+
{
|
|
113
|
+
id: inputId,
|
|
114
|
+
value: search.searchValue,
|
|
115
|
+
onChange: (event) => search.setSearchValue(event.target.value),
|
|
116
|
+
placeholder: t("documents.entityPicker.searchPlaceholder"),
|
|
117
|
+
leftIcon: /* @__PURE__ */ jsx(Search, {}),
|
|
118
|
+
role: "combobox",
|
|
119
|
+
"aria-expanded": hasQuery,
|
|
120
|
+
"aria-controls": listId,
|
|
121
|
+
"aria-autocomplete": "list",
|
|
122
|
+
"aria-activedescendant": search.activeIndex >= 0 && search.activeIndex < search.items.length ? `${listId}-option-${search.activeIndex}` : void 0,
|
|
123
|
+
onKeyDown: handleSearchKeyDown
|
|
124
|
+
}
|
|
125
|
+
)
|
|
126
|
+
] }),
|
|
127
|
+
/* @__PURE__ */ jsx(
|
|
128
|
+
EntityPickerResults,
|
|
129
|
+
{
|
|
130
|
+
listId,
|
|
131
|
+
items: search.items,
|
|
132
|
+
activeIndex: search.activeIndex,
|
|
133
|
+
hasQuery,
|
|
134
|
+
isLoading: search.isLoading,
|
|
135
|
+
hasSearched: search.hasSearched,
|
|
136
|
+
hasError: search.hasError,
|
|
137
|
+
prompt: t("documents.entityPicker.prompt"),
|
|
138
|
+
loadingLabel: t("documents.entityPicker.loading"),
|
|
139
|
+
emptyLabel: t("documents.entityPicker.noMatches"),
|
|
140
|
+
errorLabel: t("documents.entityPicker.error.search"),
|
|
141
|
+
retryLabel: t("documents.actions.retry"),
|
|
142
|
+
onRetry: search.retry,
|
|
143
|
+
onActiveIndexChange: search.setActiveIndex,
|
|
144
|
+
onSelect: selectItem
|
|
145
|
+
}
|
|
146
|
+
)
|
|
147
|
+
] }) : /* @__PURE__ */ jsx("div", { className: "rounded-md border border-border bg-muted/20 px-3 py-8 text-center text-sm text-muted-foreground", children: t(search.allEntries.length === 0 ? "documents.entityPicker.empty" : "documents.entityPicker.unavailable") }),
|
|
148
|
+
/* @__PURE__ */ jsx(DialogFooter, { children: /* @__PURE__ */ jsx(Button, { type: "button", variant: "outline", onClick: () => onOpenChange(false), children: t("documents.actions.cancel") }) })
|
|
149
|
+
] }) });
|
|
150
|
+
}
|
|
151
|
+
var EntityPicker_default = EntityPicker;
|
|
152
|
+
export {
|
|
153
|
+
EntityPicker,
|
|
154
|
+
EntityPicker_default as default
|
|
155
|
+
};
|
|
156
|
+
//# sourceMappingURL=EntityPicker.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../../../src/modules/documents/backend/documents/components/EntityPicker.tsx"],
|
|
4
|
+
"sourcesContent": ["\"use client\"\n\nimport * as React from 'react'\nimport { Search } from 'lucide-react'\nimport { Button } from '@open-mercato/ui/primitives/button'\nimport { LoadingMessage } from '@open-mercato/ui/backend/detail'\nimport {\n Dialog,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogTitle,\n} from '@open-mercato/ui/primitives/dialog'\nimport { Input } from '@open-mercato/ui/primitives/input'\nimport { Label } from '@open-mercato/ui/primitives/label'\nimport { SegmentedControl, SegmentedControlItem } from '@open-mercato/ui/primitives/segmented-control'\nimport { useT } from '@open-mercato/shared/lib/i18n/context'\nimport type { DocumentEntityType } from '../../../lib/entityRegistry'\nimport { sanitizeDocumentsDisplayLabel } from '../../../lib/displayLabels'\nimport { EntityPickerResults } from './EntityPickerResults'\nimport { useEntitySearch, type EntitySearchItem } from './useEntitySearch'\n\nexport type EntityPickerSelection = {\n type: DocumentEntityType\n id: string\n label: string\n href: string\n values: Record<string, string | null>\n}\nexport type EntityPickerProps = {\n open: boolean\n onOpenChange: (open: boolean) => void\n onPick: (pick: EntityPickerSelection) => void\n typeFilter?: DocumentEntityType[]\n excludeId?: string\n}\n\nexport function EntityPicker({ open, onOpenChange, onPick, typeFilter, excludeId }: EntityPickerProps) {\n const t = useT()\n const inputId = `documents-entity-picker-${React.useId()}`\n const listId = `${inputId}-results`\n const search = useEntitySearch(open, typeFilter, excludeId)\n\n const selectItem = React.useCallback((item: EntitySearchItem) => {\n if (!search.activeEntry || !search.isResultCurrent()) return\n const href = search.activeEntry.resolveHref(item)\n const label = sanitizeDocumentsDisplayLabel(item.label)\n if (!href || !label) return\n const rawItem = item.rawItem ?? {}\n const values = Object.fromEntries(search.activeEntry.tokenFields.map((field) => [\n field.field,\n sanitizeDocumentsDisplayLabel(field.extract(rawItem)),\n ]))\n onPick({ type: search.activeEntry.type, id: item.id, label, href, values })\n onOpenChange(false)\n }, [onOpenChange, onPick, search.activeEntry, search.isResultCurrent])\n\n const pickActiveItem = React.useCallback(() => {\n const item = search.items[search.activeIndex]\n if (item) selectItem(item)\n }, [search.activeIndex, search.items, selectItem])\n\n const handleSearchKeyDown = React.useCallback((event: React.KeyboardEvent<HTMLInputElement>) => {\n if ((event.key === 'ArrowDown' || event.key === 'ArrowUp') && search.items.length === 0) {\n event.preventDefault()\n search.setActiveIndex(-1)\n return\n }\n if (event.key === 'ArrowDown') {\n event.preventDefault()\n search.setActiveIndex((index) => Math.min(index + 1, search.items.length - 1))\n return\n }\n if (event.key === 'ArrowUp') {\n event.preventDefault()\n search.setActiveIndex((index) => Math.max(index - 1, 0))\n return\n }\n if (event.key === 'Enter') {\n event.preventDefault()\n pickActiveItem()\n }\n }, [pickActiveItem, search.items.length, search.setActiveIndex])\n\n if (!open) return null\n const hasQuery = search.searchValue.trim().length > 0\n return (\n <Dialog open={open} onOpenChange={onOpenChange}>\n <DialogContent size=\"lg\" onKeyDown={(event) => {\n if (event.defaultPrevented) return\n if (event.key === 'Escape') { event.preventDefault(); onOpenChange(false); return }\n if ((event.metaKey || event.ctrlKey) && event.key === 'Enter') { event.preventDefault(); pickActiveItem(); return }\n }}>\n <DialogHeader>\n <DialogTitle>{t('documents.entityPicker.title')}</DialogTitle>\n <DialogDescription>{t('documents.entityPicker.description')}</DialogDescription>\n </DialogHeader>\n {!search.isRegistryReady ? (\n <div role=\"status\" aria-live=\"polite\">\n <LoadingMessage label={t('documents.entityPicker.loadingRegistry')} />\n </div>\n ) : search.availableEntries.length > 0 ? (\n <div className=\"space-y-4\">\n <SegmentedControl\n value={search.activeEntry?.type}\n onValueChange={(value) => {\n const entry = search.availableEntries.find((candidate) => candidate.type === value)\n if (!entry) return\n search.setActiveType(entry.type)\n search.setActiveIndex(-1)\n }}\n aria-label={t('documents.entityPicker.typeTabs')}\n className=\"grid h-auto w-full grid-cols-2 gap-1 rounded-xl p-1 sm:grid-cols-4\"\n >\n {search.availableEntries.map((entry) => (\n <SegmentedControlItem\n key={entry.type}\n value={entry.type}\n className=\"h-auto min-h-7 min-w-0 whitespace-normal px-2 py-1 text-center leading-tight\"\n >\n {t(entry.labelKey)}\n </SegmentedControlItem>\n ))}\n </SegmentedControl>\n <div className=\"space-y-2\">\n <Label htmlFor={inputId}>{t('documents.entityPicker.searchLabel')}</Label>\n <Input\n id={inputId}\n value={search.searchValue}\n onChange={(event) => search.setSearchValue(event.target.value)}\n placeholder={t('documents.entityPicker.searchPlaceholder')}\n leftIcon={<Search />}\n role=\"combobox\"\n aria-expanded={hasQuery}\n aria-controls={listId}\n aria-autocomplete=\"list\"\n aria-activedescendant={search.activeIndex >= 0 && search.activeIndex < search.items.length ? `${listId}-option-${search.activeIndex}` : undefined}\n onKeyDown={handleSearchKeyDown}\n />\n </div>\n <EntityPickerResults\n listId={listId}\n items={search.items}\n activeIndex={search.activeIndex}\n hasQuery={hasQuery}\n isLoading={search.isLoading}\n hasSearched={search.hasSearched}\n hasError={search.hasError}\n prompt={t('documents.entityPicker.prompt')}\n loadingLabel={t('documents.entityPicker.loading')}\n emptyLabel={t('documents.entityPicker.noMatches')}\n errorLabel={t('documents.entityPicker.error.search')}\n retryLabel={t('documents.actions.retry')}\n onRetry={search.retry}\n onActiveIndexChange={search.setActiveIndex}\n onSelect={selectItem}\n />\n </div>\n ) : (\n <div className=\"rounded-md border border-border bg-muted/20 px-3 py-8 text-center text-sm text-muted-foreground\">\n {t(search.allEntries.length === 0 ? 'documents.entityPicker.empty' : 'documents.entityPicker.unavailable')}\n </div>\n )}\n <DialogFooter><Button type=\"button\" variant=\"outline\" onClick={() => onOpenChange(false)}>{t('documents.actions.cancel')}</Button></DialogFooter>\n </DialogContent>\n </Dialog>\n )\n}\n\nexport default EntityPicker\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { Spinner } from "@open-mercato/ui/primitives/spinner";
|
|
4
|
+
import { Button } from "@open-mercato/ui/primitives/button";
|
|
5
|
+
import { ErrorMessage } from "@open-mercato/ui/backend/detail";
|
|
6
|
+
import { cn } from "@open-mercato/shared/lib/utils";
|
|
7
|
+
function EntityPickerResults(props) {
|
|
8
|
+
return /* @__PURE__ */ jsxs("div", { id: props.listId, role: "listbox", className: "min-h-56 max-h-80 overflow-y-auto rounded-md border border-border bg-popover p-1 text-popover-foreground", children: [
|
|
9
|
+
!props.hasQuery ? /* @__PURE__ */ jsx("div", { className: "px-3 py-8 text-center text-sm text-muted-foreground", children: props.prompt }) : null,
|
|
10
|
+
props.hasQuery && props.isLoading ? /* @__PURE__ */ jsxs("div", { className: "flex items-center justify-center gap-2 px-3 py-8 text-sm text-muted-foreground", children: [
|
|
11
|
+
/* @__PURE__ */ jsx(Spinner, { className: "size-4" }),
|
|
12
|
+
/* @__PURE__ */ jsx("span", { children: props.loadingLabel })
|
|
13
|
+
] }) : null,
|
|
14
|
+
props.hasQuery && !props.isLoading && props.hasSearched && props.items.length === 0 ? /* @__PURE__ */ jsx("div", { className: "px-3 py-8 text-center text-sm text-muted-foreground", children: props.emptyLabel }) : null,
|
|
15
|
+
props.hasQuery && !props.isLoading && props.hasError ? /* @__PURE__ */ jsx(
|
|
16
|
+
ErrorMessage,
|
|
17
|
+
{
|
|
18
|
+
label: props.errorLabel,
|
|
19
|
+
action: /* @__PURE__ */ jsx(Button, { type: "button", size: "sm", variant: "outline", onClick: props.onRetry, children: props.retryLabel })
|
|
20
|
+
}
|
|
21
|
+
) : null,
|
|
22
|
+
!props.isLoading && !props.hasError && props.items.map((item, index) => /* @__PURE__ */ jsx(
|
|
23
|
+
Button,
|
|
24
|
+
{
|
|
25
|
+
id: `${props.listId}-option-${index}`,
|
|
26
|
+
type: "button",
|
|
27
|
+
variant: "ghost",
|
|
28
|
+
role: "option",
|
|
29
|
+
"aria-selected": index === props.activeIndex,
|
|
30
|
+
className: cn("h-auto w-full justify-start px-3 py-2 text-left", index === props.activeIndex ? "bg-accent text-accent-foreground" : null),
|
|
31
|
+
onMouseDown: (event) => event.preventDefault(),
|
|
32
|
+
onMouseEnter: () => props.onActiveIndexChange(index),
|
|
33
|
+
onClick: () => props.onSelect(item),
|
|
34
|
+
children: /* @__PURE__ */ jsxs("span", { className: "min-w-0", children: [
|
|
35
|
+
/* @__PURE__ */ jsx("span", { className: "block truncate text-sm font-medium", children: item.label }),
|
|
36
|
+
item.subtitle ? /* @__PURE__ */ jsx("span", { className: "block truncate text-xs text-muted-foreground", children: item.subtitle }) : null
|
|
37
|
+
] })
|
|
38
|
+
},
|
|
39
|
+
item.id
|
|
40
|
+
))
|
|
41
|
+
] });
|
|
42
|
+
}
|
|
43
|
+
export {
|
|
44
|
+
EntityPickerResults
|
|
45
|
+
};
|
|
46
|
+
//# sourceMappingURL=EntityPickerResults.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../../../src/modules/documents/backend/documents/components/EntityPickerResults.tsx"],
|
|
4
|
+
"sourcesContent": ["\"use client\"\n\nimport { Spinner } from '@open-mercato/ui/primitives/spinner'\nimport { Button } from '@open-mercato/ui/primitives/button'\nimport { ErrorMessage } from '@open-mercato/ui/backend/detail'\nimport { cn } from '@open-mercato/shared/lib/utils'\nimport type { EntitySearchItem } from './useEntitySearch'\n\ntype EntityPickerResultsProps = {\n listId: string\n items: EntitySearchItem[]\n activeIndex: number\n hasQuery: boolean\n isLoading: boolean\n hasSearched: boolean\n hasError: boolean\n prompt: string\n loadingLabel: string\n emptyLabel: string\n errorLabel: string\n retryLabel: string\n onRetry: () => void\n onActiveIndexChange: (index: number) => void\n onSelect: (item: EntitySearchItem) => void\n}\n\nexport function EntityPickerResults(props: EntityPickerResultsProps) {\n return (\n <div id={props.listId} role=\"listbox\" className=\"min-h-56 max-h-80 overflow-y-auto rounded-md border border-border bg-popover p-1 text-popover-foreground\">\n {!props.hasQuery ? <div className=\"px-3 py-8 text-center text-sm text-muted-foreground\">{props.prompt}</div> : null}\n {props.hasQuery && props.isLoading ? (\n <div className=\"flex items-center justify-center gap-2 px-3 py-8 text-sm text-muted-foreground\"><Spinner className=\"size-4\" /><span>{props.loadingLabel}</span></div>\n ) : null}\n {props.hasQuery && !props.isLoading && props.hasSearched && props.items.length === 0 ? (\n <div className=\"px-3 py-8 text-center text-sm text-muted-foreground\">{props.emptyLabel}</div>\n ) : null}\n {props.hasQuery && !props.isLoading && props.hasError ? (\n <ErrorMessage\n label={props.errorLabel}\n action={<Button type=\"button\" size=\"sm\" variant=\"outline\" onClick={props.onRetry}>{props.retryLabel}</Button>}\n />\n ) : null}\n {!props.isLoading && !props.hasError && props.items.map((item, index) => (\n <Button\n id={`${props.listId}-option-${index}`}\n key={item.id}\n type=\"button\"\n variant=\"ghost\"\n role=\"option\"\n aria-selected={index === props.activeIndex}\n className={cn('h-auto w-full justify-start px-3 py-2 text-left', index === props.activeIndex ? 'bg-accent text-accent-foreground' : null)}\n onMouseDown={(event) => event.preventDefault()}\n onMouseEnter={() => props.onActiveIndexChange(index)}\n onClick={() => props.onSelect(item)}\n >\n <span className=\"min-w-0\">\n <span className=\"block truncate text-sm font-medium\">{item.label}</span>\n {item.subtitle ? <span className=\"block truncate text-xs text-muted-foreground\">{item.subtitle}</span> : null}\n </span>\n </Button>\n ))}\n </div>\n )\n}\n"],
|
|
5
|
+
"mappings": ";AA6ByB,cAEjB,YAFiB;AA3BzB,SAAS,eAAe;AACxB,SAAS,cAAc;AACvB,SAAS,oBAAoB;AAC7B,SAAS,UAAU;AAqBZ,SAAS,oBAAoB,OAAiC;AACnE,SACE,qBAAC,SAAI,IAAI,MAAM,QAAQ,MAAK,WAAU,WAAU,4GAC7C;AAAA,KAAC,MAAM,WAAW,oBAAC,SAAI,WAAU,uDAAuD,gBAAM,QAAO,IAAS;AAAA,IAC9G,MAAM,YAAY,MAAM,YACvB,qBAAC,SAAI,WAAU,kFAAiF;AAAA,0BAAC,WAAQ,WAAU,UAAS;AAAA,MAAE,oBAAC,UAAM,gBAAM,cAAa;AAAA,OAAO,IAC7J;AAAA,IACH,MAAM,YAAY,CAAC,MAAM,aAAa,MAAM,eAAe,MAAM,MAAM,WAAW,IACjF,oBAAC,SAAI,WAAU,uDAAuD,gBAAM,YAAW,IACrF;AAAA,IACH,MAAM,YAAY,CAAC,MAAM,aAAa,MAAM,WAC3C;AAAA,MAAC;AAAA;AAAA,QACC,OAAO,MAAM;AAAA,QACb,QAAQ,oBAAC,UAAO,MAAK,UAAS,MAAK,MAAK,SAAQ,WAAU,SAAS,MAAM,SAAU,gBAAM,YAAW;AAAA;AAAA,IACtG,IACE;AAAA,IACH,CAAC,MAAM,aAAa,CAAC,MAAM,YAAY,MAAM,MAAM,IAAI,CAAC,MAAM,UAC7D;AAAA,MAAC;AAAA;AAAA,QACC,IAAI,GAAG,MAAM,MAAM,WAAW,KAAK;AAAA,QAEnC,MAAK;AAAA,QACL,SAAQ;AAAA,QACR,MAAK;AAAA,QACL,iBAAe,UAAU,MAAM;AAAA,QAC/B,WAAW,GAAG,mDAAmD,UAAU,MAAM,cAAc,qCAAqC,IAAI;AAAA,QACxI,aAAa,CAAC,UAAU,MAAM,eAAe;AAAA,QAC7C,cAAc,MAAM,MAAM,oBAAoB,KAAK;AAAA,QACnD,SAAS,MAAM,MAAM,SAAS,IAAI;AAAA,QAElC,+BAAC,UAAK,WAAU,WACd;AAAA,8BAAC,UAAK,WAAU,sCAAsC,eAAK,OAAM;AAAA,UAChE,KAAK,WAAW,oBAAC,UAAK,WAAU,gDAAgD,eAAK,UAAS,IAAU;AAAA,WAC3G;AAAA;AAAA,MAbK,KAAK;AAAA,IAcZ,CACD;AAAA,KACH;AAEJ;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|