@focus-reactive/payload-plugin-comments 1.0.0
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 +563 -0
- package/dist/collection/access/isAuth.d.ts +3 -0
- package/dist/collection/access/isAuth.d.ts.map +1 -0
- package/dist/collection/access/isAuth.js +8 -0
- package/dist/collection/access/isAuth.js.map +1 -0
- package/dist/collection/hooks/setAuthorBeforeCreate.d.ts +3 -0
- package/dist/collection/hooks/setAuthorBeforeCreate.d.ts.map +1 -0
- package/dist/collection/hooks/setAuthorBeforeCreate.js +10 -0
- package/dist/collection/hooks/setAuthorBeforeCreate.js.map +1 -0
- package/dist/collection/hooks/setTenantBeforeCreate.d.ts +3 -0
- package/dist/collection/hooks/setTenantBeforeCreate.d.ts.map +1 -0
- package/dist/collection/hooks/setTenantBeforeCreate.js +24 -0
- package/dist/collection/hooks/setTenantBeforeCreate.js.map +1 -0
- package/dist/collection/index.d.ts +4 -0
- package/dist/collection/index.d.ts.map +1 -0
- package/dist/collection/index.js +139 -0
- package/dist/collection/index.js.map +1 -0
- package/dist/components/Avatar/index.d.ts +11 -0
- package/dist/components/Avatar/index.d.ts.map +1 -0
- package/dist/components/Avatar/index.js +11 -0
- package/dist/components/Avatar/index.js.map +1 -0
- package/dist/components/CommentEditor/ActionPanel.d.ts +8 -0
- package/dist/components/CommentEditor/ActionPanel.d.ts.map +1 -0
- package/dist/components/CommentEditor/ActionPanel.js +17 -0
- package/dist/components/CommentEditor/ActionPanel.js.map +1 -0
- package/dist/components/CommentEditor/index.d.ts +23 -0
- package/dist/components/CommentEditor/index.d.ts.map +1 -0
- package/dist/components/CommentEditor/index.js +265 -0
- package/dist/components/CommentEditor/index.js.map +1 -0
- package/dist/components/CommentItem/ToolsPanel.d.ts +9 -0
- package/dist/components/CommentItem/ToolsPanel.d.ts.map +1 -0
- package/dist/components/CommentItem/ToolsPanel.js +22 -0
- package/dist/components/CommentItem/ToolsPanel.js.map +1 -0
- package/dist/components/CommentItem/index.d.ts +8 -0
- package/dist/components/CommentItem/index.d.ts.map +1 -0
- package/dist/components/CommentItem/index.js +65 -0
- package/dist/components/CommentItem/index.js.map +1 -0
- package/dist/components/CommentsDrawer/components/Header.d.ts +6 -0
- package/dist/components/CommentsDrawer/components/Header.d.ts.map +1 -0
- package/dist/components/CommentsDrawer/components/Header.js +46 -0
- package/dist/components/CommentsDrawer/components/Header.js.map +1 -0
- package/dist/components/CommentsDrawer/index.d.ts +6 -0
- package/dist/components/CommentsDrawer/index.d.ts.map +1 -0
- package/dist/components/CommentsDrawer/index.js +30 -0
- package/dist/components/CommentsDrawer/index.js.map +1 -0
- package/dist/components/CommentsHeaderButton/index.d.ts +2 -0
- package/dist/components/CommentsHeaderButton/index.d.ts.map +1 -0
- package/dist/components/CommentsHeaderButton/index.js +19 -0
- package/dist/components/CommentsHeaderButton/index.js.map +1 -0
- package/dist/components/CommentsPanel/components/CollapsibleGroup.d.ts +10 -0
- package/dist/components/CommentsPanel/components/CollapsibleGroup.d.ts.map +1 -0
- package/dist/components/CommentsPanel/components/CollapsibleGroup.js +68 -0
- package/dist/components/CommentsPanel/components/CollapsibleGroup.js.map +1 -0
- package/dist/components/CommentsPanel/components/DocumentView.d.ts +9 -0
- package/dist/components/CommentsPanel/components/DocumentView.d.ts.map +1 -0
- package/dist/components/CommentsPanel/components/DocumentView.js +28 -0
- package/dist/components/CommentsPanel/components/DocumentView.js.map +1 -0
- package/dist/components/CommentsPanel/components/FieldGroupSection.d.ts +11 -0
- package/dist/components/CommentsPanel/components/FieldGroupSection.d.ts.map +1 -0
- package/dist/components/CommentsPanel/components/FieldGroupSection.js +62 -0
- package/dist/components/CommentsPanel/components/FieldGroupSection.js.map +1 -0
- package/dist/components/CommentsPanel/components/GlobalDocumentView.d.ts +9 -0
- package/dist/components/CommentsPanel/components/GlobalDocumentView.d.ts.map +1 -0
- package/dist/components/CommentsPanel/components/GlobalDocumentView.js +20 -0
- package/dist/components/CommentsPanel/components/GlobalDocumentView.js.map +1 -0
- package/dist/components/CommentsPanel/components/GlobalView.d.ts +9 -0
- package/dist/components/CommentsPanel/components/GlobalView.d.ts.map +1 -0
- package/dist/components/CommentsPanel/components/GlobalView.js +62 -0
- package/dist/components/CommentsPanel/components/GlobalView.js.map +1 -0
- package/dist/components/CommentsPanel/constants.d.ts +3 -0
- package/dist/components/CommentsPanel/constants.d.ts.map +1 -0
- package/dist/components/CommentsPanel/constants.js +9 -0
- package/dist/components/CommentsPanel/constants.js.map +1 -0
- package/dist/components/CommentsPanel/hooks/useCollapseState.d.ts +2 -0
- package/dist/components/CommentsPanel/hooks/useCollapseState.d.ts.map +1 -0
- package/dist/components/CommentsPanel/hooks/useCollapseState.js +44 -0
- package/dist/components/CommentsPanel/hooks/useCollapseState.js.map +1 -0
- package/dist/components/CommentsPanel/hooks/useScrollToTargetFieldGroup.d.ts +2 -0
- package/dist/components/CommentsPanel/hooks/useScrollToTargetFieldGroup.d.ts.map +1 -0
- package/dist/components/CommentsPanel/hooks/useScrollToTargetFieldGroup.js +35 -0
- package/dist/components/CommentsPanel/hooks/useScrollToTargetFieldGroup.js.map +1 -0
- package/dist/components/CommentsPanel/index.d.ts +6 -0
- package/dist/components/CommentsPanel/index.d.ts.map +1 -0
- package/dist/components/CommentsPanel/index.js +32 -0
- package/dist/components/CommentsPanel/index.js.map +1 -0
- package/dist/components/CommentsPanel/types.d.ts +4 -0
- package/dist/components/CommentsPanel/types.d.ts.map +1 -0
- package/dist/components/CommentsPanel/types.js +1 -0
- package/dist/components/CommentsPanel/types.js.map +1 -0
- package/dist/components/CommentsPanel/utils/createCollapsibleGroupKey.d.ts +10 -0
- package/dist/components/CommentsPanel/utils/createCollapsibleGroupKey.d.ts.map +1 -0
- package/dist/components/CommentsPanel/utils/createCollapsibleGroupKey.js +15 -0
- package/dist/components/CommentsPanel/utils/createCollapsibleGroupKey.js.map +1 -0
- package/dist/components/CommentsPanel/utils/filterComments.d.ts +9 -0
- package/dist/components/CommentsPanel/utils/filterComments.d.ts.map +1 -0
- package/dist/components/CommentsPanel/utils/filterComments.js +17 -0
- package/dist/components/CommentsPanel/utils/filterComments.js.map +1 -0
- package/dist/components/CommentsPanel/utils/groupCommentsByFieldPath.d.ts +4 -0
- package/dist/components/CommentsPanel/utils/groupCommentsByFieldPath.d.ts.map +1 -0
- package/dist/components/CommentsPanel/utils/groupCommentsByFieldPath.js +14 -0
- package/dist/components/CommentsPanel/utils/groupCommentsByFieldPath.js.map +1 -0
- package/dist/components/CommentsPanel/utils/groupCommentsGlobally.d.ts +18 -0
- package/dist/components/CommentsPanel/utils/groupCommentsGlobally.d.ts.map +1 -0
- package/dist/components/CommentsPanel/utils/groupCommentsGlobally.js +58 -0
- package/dist/components/CommentsPanel/utils/groupCommentsGlobally.js.map +1 -0
- package/dist/components/CommentsPanel/utils/resolveEntityLabel.d.ts +3 -0
- package/dist/components/CommentsPanel/utils/resolveEntityLabel.d.ts.map +1 -0
- package/dist/components/CommentsPanel/utils/resolveEntityLabel.js +14 -0
- package/dist/components/CommentsPanel/utils/resolveEntityLabel.js.map +1 -0
- package/dist/components/CommentsPanel/utils/resolveFieldLabel.d.ts +11 -0
- package/dist/components/CommentsPanel/utils/resolveFieldLabel.d.ts.map +1 -0
- package/dist/components/CommentsPanel/utils/resolveFieldLabel.js +9 -0
- package/dist/components/CommentsPanel/utils/resolveFieldLabel.js.map +1 -0
- package/dist/components/CommentsPanel/utils/sortGroupsByCreatedAt.d.ts +4 -0
- package/dist/components/CommentsPanel/utils/sortGroupsByCreatedAt.d.ts.map +1 -0
- package/dist/components/CommentsPanel/utils/sortGroupsByCreatedAt.js +11 -0
- package/dist/components/CommentsPanel/utils/sortGroupsByCreatedAt.js.map +1 -0
- package/dist/components/FieldCommentLabel/AddCommentPopup.d.ts +8 -0
- package/dist/components/FieldCommentLabel/AddCommentPopup.d.ts.map +1 -0
- package/dist/components/FieldCommentLabel/AddCommentPopup.js +50 -0
- package/dist/components/FieldCommentLabel/AddCommentPopup.js.map +1 -0
- package/dist/components/FieldCommentLabel/hooks/useStablePath.d.ts +2 -0
- package/dist/components/FieldCommentLabel/hooks/useStablePath.d.ts.map +1 -0
- package/dist/components/FieldCommentLabel/hooks/useStablePath.js +12 -0
- package/dist/components/FieldCommentLabel/hooks/useStablePath.js.map +1 -0
- package/dist/components/FieldCommentLabel/index.d.ts +11 -0
- package/dist/components/FieldCommentLabel/index.d.ts.map +1 -0
- package/dist/components/FieldCommentLabel/index.js +64 -0
- package/dist/components/FieldCommentLabel/index.js.map +1 -0
- package/dist/components/FieldCommentLabel/types.d.ts +4 -0
- package/dist/components/FieldCommentLabel/types.d.ts.map +1 -0
- package/dist/components/FieldCommentLabel/types.js +1 -0
- package/dist/components/FieldCommentLabel/types.js.map +1 -0
- package/dist/components/FieldCommentLabel/utils/buildStablePath.d.ts +2 -0
- package/dist/components/FieldCommentLabel/utils/buildStablePath.d.ts.map +1 -0
- package/dist/components/FieldCommentLabel/utils/buildStablePath.js +19 -0
- package/dist/components/FieldCommentLabel/utils/buildStablePath.js.map +1 -0
- package/dist/components/FieldCommentLabel/utils/exludeComments.d.ts +3 -0
- package/dist/components/FieldCommentLabel/utils/exludeComments.d.ts.map +1 -0
- package/dist/components/FieldCommentLabel/utils/exludeComments.js +12 -0
- package/dist/components/FieldCommentLabel/utils/exludeComments.js.map +1 -0
- package/dist/components/FieldCommentLabel/utils/resolveLabel.d.ts +3 -0
- package/dist/components/FieldCommentLabel/utils/resolveLabel.d.ts.map +1 -0
- package/dist/components/FieldCommentLabel/utils/resolveLabel.js +9 -0
- package/dist/components/FieldCommentLabel/utils/resolveLabel.js.map +1 -0
- package/dist/components/IconButton/index.d.ts +12 -0
- package/dist/components/IconButton/index.d.ts.map +1 -0
- package/dist/components/IconButton/index.js +38 -0
- package/dist/components/IconButton/index.js.map +1 -0
- package/dist/components/MentionDropdown.d.ts +11 -0
- package/dist/components/MentionDropdown.d.ts.map +1 -0
- package/dist/components/MentionDropdown.js +53 -0
- package/dist/components/MentionDropdown.js.map +1 -0
- package/dist/components/MentionLabel/index.d.ts +7 -0
- package/dist/components/MentionLabel/index.d.ts.map +1 -0
- package/dist/components/MentionLabel/index.js +21 -0
- package/dist/components/MentionLabel/index.js.map +1 -0
- package/dist/config.d.ts +4 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +17 -0
- package/dist/config.js.map +1 -0
- package/dist/constants.d.ts +9 -0
- package/dist/constants.d.ts.map +1 -0
- package/dist/constants.js +22 -0
- package/dist/constants.js.map +1 -0
- package/dist/hooks/useRelativeDate.d.ts +2 -0
- package/dist/hooks/useRelativeDate.d.ts.map +1 -0
- package/dist/hooks/useRelativeDate.js +11 -0
- package/dist/hooks/useRelativeDate.js.map +1 -0
- package/dist/index.d.ts +5 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +7 -0
- package/dist/index.js.map +1 -0
- package/dist/plugin.d.ts +4 -0
- package/dist/plugin.d.ts.map +1 -0
- package/dist/plugin.js +60 -0
- package/dist/plugin.js.map +1 -0
- package/dist/providers/CommentsDrawerProvider/index.d.ts +14 -0
- package/dist/providers/CommentsDrawerProvider/index.d.ts.map +1 -0
- package/dist/providers/CommentsDrawerProvider/index.js +28 -0
- package/dist/providers/CommentsDrawerProvider/index.js.map +1 -0
- package/dist/providers/CommentsProvider/index.d.ts +39 -0
- package/dist/providers/CommentsProvider/index.d.ts.map +1 -0
- package/dist/providers/CommentsProvider/index.js +237 -0
- package/dist/providers/CommentsProvider/index.js.map +1 -0
- package/dist/providers/CommentsProvider/mergeDocumentTitles.d.ts +3 -0
- package/dist/providers/CommentsProvider/mergeDocumentTitles.d.ts.map +1 -0
- package/dist/providers/CommentsProvider/mergeDocumentTitles.js +10 -0
- package/dist/providers/CommentsProvider/mergeDocumentTitles.js.map +1 -0
- package/dist/providers/CommentsProviderWrapper/index.d.ts +7 -0
- package/dist/providers/CommentsProviderWrapper/index.d.ts.map +1 -0
- package/dist/providers/CommentsProviderWrapper/index.js +16 -0
- package/dist/providers/CommentsProviderWrapper/index.js.map +1 -0
- package/dist/providers/GlobalCommentsLoader/GlobalCommentsHydrator.d.ts +13 -0
- package/dist/providers/GlobalCommentsLoader/GlobalCommentsHydrator.d.ts.map +1 -0
- package/dist/providers/GlobalCommentsLoader/GlobalCommentsHydrator.js +22 -0
- package/dist/providers/GlobalCommentsLoader/GlobalCommentsHydrator.js.map +1 -0
- package/dist/providers/GlobalCommentsLoader/index.d.ts +10 -0
- package/dist/providers/GlobalCommentsLoader/index.d.ts.map +1 -0
- package/dist/providers/GlobalCommentsLoader/index.js +31 -0
- package/dist/providers/GlobalCommentsLoader/index.js.map +1 -0
- package/dist/services/createComment.d.ts +12 -0
- package/dist/services/createComment.d.ts.map +1 -0
- package/dist/services/createComment.js +83 -0
- package/dist/services/createComment.js.map +1 -0
- package/dist/services/deleteComment.d.ts +3 -0
- package/dist/services/deleteComment.d.ts.map +1 -0
- package/dist/services/deleteComment.js +34 -0
- package/dist/services/deleteComment.js.map +1 -0
- package/dist/services/fetchMentionableUsers.d.ts +3 -0
- package/dist/services/fetchMentionableUsers.d.ts.map +1 -0
- package/dist/services/fetchMentionableUsers.js +46 -0
- package/dist/services/fetchMentionableUsers.js.map +1 -0
- package/dist/services/fieldLabels/fetchFieldLabels.d.ts +3 -0
- package/dist/services/fieldLabels/fetchFieldLabels.d.ts.map +1 -0
- package/dist/services/fieldLabels/fetchFieldLabels.js +74 -0
- package/dist/services/fieldLabels/fetchFieldLabels.js.map +1 -0
- package/dist/services/fieldLabels/utils/groupFieldPathsByDocument.d.ts +5 -0
- package/dist/services/fieldLabels/utils/groupFieldPathsByDocument.d.ts.map +1 -0
- package/dist/services/fieldLabels/utils/groupFieldPathsByDocument.js +21 -0
- package/dist/services/fieldLabels/utils/groupFieldPathsByDocument.js.map +1 -0
- package/dist/services/fieldLabels/utils/resolveFieldPath.d.ts +4 -0
- package/dist/services/fieldLabels/utils/resolveFieldPath.d.ts.map +1 -0
- package/dist/services/fieldLabels/utils/resolveFieldPath.js +66 -0
- package/dist/services/fieldLabels/utils/resolveFieldPath.js.map +1 -0
- package/dist/services/fieldLabels/utils/schemaUtils.d.ts +6 -0
- package/dist/services/fieldLabels/utils/schemaUtils.d.ts.map +1 -0
- package/dist/services/fieldLabels/utils/schemaUtils.js +60 -0
- package/dist/services/fieldLabels/utils/schemaUtils.js.map +1 -0
- package/dist/services/findAllComments.d.ts +11 -0
- package/dist/services/findAllComments.d.ts.map +1 -0
- package/dist/services/findAllComments.js +47 -0
- package/dist/services/findAllComments.js.map +1 -0
- package/dist/services/getCurrentTenantId.d.ts +3 -0
- package/dist/services/getCurrentTenantId.d.ts.map +1 -0
- package/dist/services/getCurrentTenantId.js +13 -0
- package/dist/services/getCurrentTenantId.js.map +1 -0
- package/dist/services/getDocumentTitles.d.ts +3 -0
- package/dist/services/getDocumentTitles.d.ts.map +1 -0
- package/dist/services/getDocumentTitles.js +61 -0
- package/dist/services/getDocumentTitles.js.map +1 -0
- package/dist/services/getEntitiesLabels.d.ts +3 -0
- package/dist/services/getEntitiesLabels.d.ts.map +1 -0
- package/dist/services/getEntitiesLabels.js +14 -0
- package/dist/services/getEntitiesLabels.js.map +1 -0
- package/dist/services/resolveComment.d.ts +3 -0
- package/dist/services/resolveComment.d.ts.map +1 -0
- package/dist/services/resolveComment.js +41 -0
- package/dist/services/resolveComment.js.map +1 -0
- package/dist/services/sendMentionEmails.d.ts +11 -0
- package/dist/services/sendMentionEmails.d.ts.map +1 -0
- package/dist/services/sendMentionEmails.js +73 -0
- package/dist/services/sendMentionEmails.js.map +1 -0
- package/dist/services/syncAllCommentsData.d.ts +12 -0
- package/dist/services/syncAllCommentsData.d.ts.map +1 -0
- package/dist/services/syncAllCommentsData.js +48 -0
- package/dist/services/syncAllCommentsData.js.map +1 -0
- package/dist/styles.css +2 -0
- package/dist/translations/en.d.ts +5 -0
- package/dist/translations/en.d.ts.map +1 -0
- package/dist/translations/en.js +36 -0
- package/dist/translations/en.js.map +1 -0
- package/dist/translations/types.d.ts +32 -0
- package/dist/translations/types.d.ts.map +1 -0
- package/dist/translations/types.js +1 -0
- package/dist/translations/types.js.map +1 -0
- package/dist/types/base.d.ts +10 -0
- package/dist/types/base.d.ts.map +1 -0
- package/dist/types/base.js +1 -0
- package/dist/types/base.js.map +1 -0
- package/dist/types/collection.d.ts +2 -0
- package/dist/types/collection.d.ts.map +1 -0
- package/dist/types/collection.js +1 -0
- package/dist/types/collection.js.map +1 -0
- package/dist/types/comment.d.ts +23 -0
- package/dist/types/comment.d.ts.map +1 -0
- package/dist/types/comment.js +1 -0
- package/dist/types/comment.js.map +1 -0
- package/dist/types/config.d.ts +112 -0
- package/dist/types/config.d.ts.map +1 -0
- package/dist/types/config.js +1 -0
- package/dist/types/config.js.map +1 -0
- package/dist/types/entity.d.ts +15 -0
- package/dist/types/entity.d.ts.map +1 -0
- package/dist/types/entity.js +1 -0
- package/dist/types/entity.js.map +1 -0
- package/dist/types/general.d.ts +10 -0
- package/dist/types/general.d.ts.map +1 -0
- package/dist/types/general.js +1 -0
- package/dist/types/general.js.map +1 -0
- package/dist/types/index.d.ts +8 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +1 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/user.d.ts +6 -0
- package/dist/types/user.d.ts.map +1 -0
- package/dist/types/user.js +1 -0
- package/dist/types/user.js.map +1 -0
- package/dist/utils/comment/extractVisibleComments.d.ts +13 -0
- package/dist/utils/comment/extractVisibleComments.d.ts.map +1 -0
- package/dist/utils/comment/extractVisibleComments.js +17 -0
- package/dist/utils/comment/extractVisibleComments.js.map +1 -0
- package/dist/utils/comment/filterCommentsByLocale.d.ts +3 -0
- package/dist/utils/comment/filterCommentsByLocale.d.ts.map +1 -0
- package/dist/utils/comment/filterCommentsByLocale.js +12 -0
- package/dist/utils/comment/filterCommentsByLocale.js.map +1 -0
- package/dist/utils/comment/renderCommentText.d.ts +12 -0
- package/dist/utils/comment/renderCommentText.d.ts.map +1 -0
- package/dist/utils/comment/renderCommentText.js +38 -0
- package/dist/utils/comment/renderCommentText.js.map +1 -0
- package/dist/utils/comment/serializeEditor.d.ts +2 -0
- package/dist/utils/comment/serializeEditor.d.ts.map +1 -0
- package/dist/utils/comment/serializeEditor.js +30 -0
- package/dist/utils/comment/serializeEditor.js.map +1 -0
- package/dist/utils/config/injectFieldCommentComponents.d.ts +4 -0
- package/dist/utils/config/injectFieldCommentComponents.d.ts.map +1 -0
- package/dist/utils/config/injectFieldCommentComponents.js +80 -0
- package/dist/utils/config/injectFieldCommentComponents.js.map +1 -0
- package/dist/utils/config/mergeTranslations.d.ts +3 -0
- package/dist/utils/config/mergeTranslations.d.ts.map +1 -0
- package/dist/utils/config/mergeTranslations.js +29 -0
- package/dist/utils/config/mergeTranslations.js.map +1 -0
- package/dist/utils/config/normalizeCollections.d.ts +7 -0
- package/dist/utils/config/normalizeCollections.d.ts.map +1 -0
- package/dist/utils/config/normalizeCollections.js +15 -0
- package/dist/utils/config/normalizeCollections.js.map +1 -0
- package/dist/utils/config/overrideCollections.d.ts +3 -0
- package/dist/utils/config/overrideCollections.d.ts.map +1 -0
- package/dist/utils/config/overrideCollections.js +38 -0
- package/dist/utils/config/overrideCollections.js.map +1 -0
- package/dist/utils/config/overrideCommentsCollection.d.ts +4 -0
- package/dist/utils/config/overrideCommentsCollection.d.ts.map +1 -0
- package/dist/utils/config/overrideCommentsCollection.js +14 -0
- package/dist/utils/config/overrideCommentsCollection.js.map +1 -0
- package/dist/utils/config/overrideGlobals.d.ts +3 -0
- package/dist/utils/config/overrideGlobals.d.ts.map +1 -0
- package/dist/utils/config/overrideGlobals.js +8 -0
- package/dist/utils/config/overrideGlobals.js.map +1 -0
- package/dist/utils/error/getDefaultErrorMessage.d.ts +2 -0
- package/dist/utils/error/getDefaultErrorMessage.d.ts.map +1 -0
- package/dist/utils/error/getDefaultErrorMessage.js +9 -0
- package/dist/utils/error/getDefaultErrorMessage.js.map +1 -0
- package/dist/utils/general/cn.d.ts +3 -0
- package/dist/utils/general/cn.d.ts.map +1 -0
- package/dist/utils/general/cn.js +9 -0
- package/dist/utils/general/cn.js.map +1 -0
- package/dist/utils/general/formatRelativeDate.d.ts +2 -0
- package/dist/utils/general/formatRelativeDate.d.ts.map +1 -0
- package/dist/utils/general/formatRelativeDate.js +28 -0
- package/dist/utils/general/formatRelativeDate.js.map +1 -0
- package/dist/utils/general/getURL.d.ts +2 -0
- package/dist/utils/general/getURL.d.ts.map +1 -0
- package/dist/utils/general/getURL.js +13 -0
- package/dist/utils/general/getURL.js.map +1 -0
- package/dist/utils/general/getValueByPath.d.ts +4 -0
- package/dist/utils/general/getValueByPath.d.ts.map +1 -0
- package/dist/utils/general/getValueByPath.js +19 -0
- package/dist/utils/general/getValueByPath.js.map +1 -0
- package/dist/utils/mention/isSelfMention.d.ts +4 -0
- package/dist/utils/mention/isSelfMention.d.ts.map +1 -0
- package/dist/utils/mention/isSelfMention.js +7 -0
- package/dist/utils/mention/isSelfMention.js.map +1 -0
- package/dist/utils/mention/parseMentionIds.d.ts +2 -0
- package/dist/utils/mention/parseMentionIds.d.ts.map +1 -0
- package/dist/utils/mention/parseMentionIds.js +13 -0
- package/dist/utils/mention/parseMentionIds.js.map +1 -0
- package/dist/utils/mode/defineModeByPathname.d.ts +11 -0
- package/dist/utils/mode/defineModeByPathname.d.ts.map +1 -0
- package/dist/utils/mode/defineModeByPathname.js +39 -0
- package/dist/utils/mode/defineModeByPathname.js.map +1 -0
- package/dist/utils/path/detectPluginBasePath.d.ts +2 -0
- package/dist/utils/path/detectPluginBasePath.d.ts.map +1 -0
- package/dist/utils/path/detectPluginBasePath.js +8 -0
- package/dist/utils/path/detectPluginBasePath.js.map +1 -0
- package/dist/utils/path/getComponentPath.d.ts +15 -0
- package/dist/utils/path/getComponentPath.d.ts.map +1 -0
- package/dist/utils/path/getComponentPath.js +22 -0
- package/dist/utils/path/getComponentPath.js.map +1 -0
- package/dist/utils/payload/extractPayload.d.ts +3 -0
- package/dist/utils/payload/extractPayload.d.ts.map +1 -0
- package/dist/utils/payload/extractPayload.js +9 -0
- package/dist/utils/payload/extractPayload.js.map +1 -0
- package/dist/utils/user/resolveUsername.d.ts +4 -0
- package/dist/utils/user/resolveUsername.d.ts.map +1 -0
- package/dist/utils/user/resolveUsername.js +14 -0
- package/dist/utils/user/resolveUsername.js.map +1 -0
- package/package.json +113 -0
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
import { setAuthorBeforeCreate } from "./hooks/setAuthorBeforeCreate";
|
|
2
|
+
import { setTenantBeforeCreate } from "./hooks/setTenantBeforeCreate";
|
|
3
|
+
import { DEFAULT_COLLECTION_SLUG } from "../constants";
|
|
4
|
+
import { isAuth } from "./access/isAuth";
|
|
5
|
+
const baseCollection = (tenantConfig) => ({
|
|
6
|
+
slug: DEFAULT_COLLECTION_SLUG,
|
|
7
|
+
labels: {
|
|
8
|
+
singular: { en: "Comment", es: "Comentario" },
|
|
9
|
+
plural: { en: "Comments", es: "Comentarios" }
|
|
10
|
+
},
|
|
11
|
+
admin: {
|
|
12
|
+
hidden: true,
|
|
13
|
+
useAsTitle: "text",
|
|
14
|
+
defaultColumns: ["author", "collectionSlug", "status", "createdAt"]
|
|
15
|
+
},
|
|
16
|
+
access: {
|
|
17
|
+
create: isAuth,
|
|
18
|
+
read: isAuth,
|
|
19
|
+
update: isAuth,
|
|
20
|
+
delete: isAuth
|
|
21
|
+
},
|
|
22
|
+
hooks: {
|
|
23
|
+
beforeChange: [setAuthorBeforeCreate, ...tenantConfig?.enabled ? [setTenantBeforeCreate] : []]
|
|
24
|
+
},
|
|
25
|
+
timestamps: true,
|
|
26
|
+
fields: [
|
|
27
|
+
{
|
|
28
|
+
name: "documentId",
|
|
29
|
+
type: "number",
|
|
30
|
+
index: true
|
|
31
|
+
},
|
|
32
|
+
{
|
|
33
|
+
name: "collectionSlug",
|
|
34
|
+
type: "text",
|
|
35
|
+
index: true
|
|
36
|
+
},
|
|
37
|
+
{
|
|
38
|
+
name: "globalSlug",
|
|
39
|
+
type: "text",
|
|
40
|
+
index: true,
|
|
41
|
+
admin: {
|
|
42
|
+
description: "Slug of the Payload global being commented on. Null = collection document comment."
|
|
43
|
+
}
|
|
44
|
+
},
|
|
45
|
+
{
|
|
46
|
+
name: "fieldPath",
|
|
47
|
+
type: "text",
|
|
48
|
+
index: true,
|
|
49
|
+
admin: {
|
|
50
|
+
description: "Dot-notation path of the field being commented on. Null = document-level."
|
|
51
|
+
}
|
|
52
|
+
},
|
|
53
|
+
{
|
|
54
|
+
name: "locale",
|
|
55
|
+
type: "text",
|
|
56
|
+
required: false,
|
|
57
|
+
index: true,
|
|
58
|
+
admin: {
|
|
59
|
+
description: "Locale for field-level comments. Null = document-level (shown in all locales)."
|
|
60
|
+
}
|
|
61
|
+
},
|
|
62
|
+
{
|
|
63
|
+
name: "text",
|
|
64
|
+
type: "textarea",
|
|
65
|
+
required: true,
|
|
66
|
+
label: "Comment"
|
|
67
|
+
},
|
|
68
|
+
{
|
|
69
|
+
name: "mentions",
|
|
70
|
+
type: "array",
|
|
71
|
+
label: "Mentions",
|
|
72
|
+
admin: {
|
|
73
|
+
readOnly: true
|
|
74
|
+
},
|
|
75
|
+
fields: [
|
|
76
|
+
{
|
|
77
|
+
name: "user",
|
|
78
|
+
type: "relationship",
|
|
79
|
+
relationTo: "users",
|
|
80
|
+
required: true
|
|
81
|
+
}
|
|
82
|
+
]
|
|
83
|
+
},
|
|
84
|
+
{
|
|
85
|
+
name: "author",
|
|
86
|
+
type: "relationship",
|
|
87
|
+
relationTo: "users",
|
|
88
|
+
required: true,
|
|
89
|
+
label: "Author",
|
|
90
|
+
admin: {
|
|
91
|
+
position: "sidebar"
|
|
92
|
+
}
|
|
93
|
+
},
|
|
94
|
+
{
|
|
95
|
+
name: "isResolved",
|
|
96
|
+
type: "checkbox",
|
|
97
|
+
defaultValue: false,
|
|
98
|
+
label: "Resolved",
|
|
99
|
+
admin: {
|
|
100
|
+
position: "sidebar"
|
|
101
|
+
}
|
|
102
|
+
},
|
|
103
|
+
{
|
|
104
|
+
name: "resolvedBy",
|
|
105
|
+
type: "relationship",
|
|
106
|
+
relationTo: "users",
|
|
107
|
+
label: "Resolved by",
|
|
108
|
+
admin: {
|
|
109
|
+
position: "sidebar",
|
|
110
|
+
condition: (_data, siblingData) => siblingData?.status === "resolved"
|
|
111
|
+
}
|
|
112
|
+
},
|
|
113
|
+
{
|
|
114
|
+
name: "resolvedAt",
|
|
115
|
+
type: "date",
|
|
116
|
+
label: "Resolved at",
|
|
117
|
+
admin: {
|
|
118
|
+
position: "sidebar",
|
|
119
|
+
condition: (_data, siblingData) => siblingData?.status === "resolved"
|
|
120
|
+
}
|
|
121
|
+
},
|
|
122
|
+
...tenantConfig?.enabled ? [
|
|
123
|
+
{
|
|
124
|
+
name: "tenant",
|
|
125
|
+
type: "relationship",
|
|
126
|
+
relationTo: tenantConfig.collectionSlug ?? "tenants",
|
|
127
|
+
index: true,
|
|
128
|
+
label: "Tenant",
|
|
129
|
+
admin: {
|
|
130
|
+
position: "sidebar"
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
] : []
|
|
134
|
+
]
|
|
135
|
+
});
|
|
136
|
+
export {
|
|
137
|
+
baseCollection
|
|
138
|
+
};
|
|
139
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/collection/index.ts"],"sourcesContent":["import type { CollectionConfig, CollectionSlug } from \"payload\";\nimport { setAuthorBeforeCreate } from \"./hooks/setAuthorBeforeCreate\";\nimport { setTenantBeforeCreate } from \"./hooks/setTenantBeforeCreate\";\nimport { DEFAULT_COLLECTION_SLUG } from \"../constants\";\nimport type { TenantPluginConfig } from \"../types\";\nimport { isAuth } from \"./access/isAuth\";\n\nexport const baseCollection = (tenantConfig?: TenantPluginConfig): CollectionConfig => ({\n slug: DEFAULT_COLLECTION_SLUG,\n labels: {\n singular: { en: \"Comment\", es: \"Comentario\" },\n plural: { en: \"Comments\", es: \"Comentarios\" },\n },\n admin: {\n hidden: true,\n useAsTitle: \"text\",\n defaultColumns: [\"author\", \"collectionSlug\", \"status\", \"createdAt\"],\n },\n access: {\n create: isAuth,\n read: isAuth,\n update: isAuth,\n delete: isAuth,\n },\n hooks: {\n beforeChange: [setAuthorBeforeCreate, ...(tenantConfig?.enabled ? [setTenantBeforeCreate] : [])],\n },\n timestamps: true,\n fields: [\n {\n name: \"documentId\",\n type: \"number\",\n index: true,\n },\n {\n name: \"collectionSlug\",\n type: \"text\",\n index: true,\n },\n {\n name: \"globalSlug\",\n type: \"text\",\n index: true,\n admin: {\n description: \"Slug of the Payload global being commented on. Null = collection document comment.\",\n },\n },\n {\n name: \"fieldPath\",\n type: \"text\",\n index: true,\n admin: {\n description: \"Dot-notation path of the field being commented on. Null = document-level.\",\n },\n },\n {\n name: \"locale\",\n type: \"text\",\n required: false,\n index: true,\n admin: {\n description: \"Locale for field-level comments. Null = document-level (shown in all locales).\",\n },\n },\n {\n name: \"text\",\n type: \"textarea\",\n required: true,\n label: \"Comment\",\n },\n {\n name: \"mentions\",\n type: \"array\",\n label: \"Mentions\",\n admin: {\n readOnly: true,\n },\n fields: [\n {\n name: \"user\",\n type: \"relationship\",\n relationTo: \"users\",\n required: true,\n },\n ],\n },\n {\n name: \"author\",\n type: \"relationship\",\n relationTo: \"users\",\n required: true,\n label: \"Author\",\n admin: {\n position: \"sidebar\",\n },\n },\n {\n name: \"isResolved\",\n type: \"checkbox\",\n defaultValue: false,\n label: \"Resolved\",\n admin: {\n position: \"sidebar\",\n },\n },\n {\n name: \"resolvedBy\",\n type: \"relationship\",\n relationTo: \"users\",\n label: \"Resolved by\",\n admin: {\n position: \"sidebar\",\n condition: (_data, siblingData) => siblingData?.status === \"resolved\",\n },\n },\n {\n name: \"resolvedAt\",\n type: \"date\",\n label: \"Resolved at\",\n admin: {\n position: \"sidebar\",\n condition: (_data, siblingData) => siblingData?.status === \"resolved\",\n },\n },\n ...(tenantConfig?.enabled ?\n [\n {\n name: \"tenant\",\n type: \"relationship\" as const,\n relationTo: (tenantConfig.collectionSlug ?? \"tenants\") as CollectionSlug,\n index: true,\n label: \"Tenant\",\n admin: {\n position: \"sidebar\" as const,\n },\n },\n ]\n : []),\n ],\n});\n"],"mappings":"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","names":[]}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { ClientUser } from "payload";
|
|
2
|
+
import type { User } from "../../types";
|
|
3
|
+
interface Props {
|
|
4
|
+
className?: string;
|
|
5
|
+
user?: User | ClientUser | null;
|
|
6
|
+
usernameFieldPath?: string;
|
|
7
|
+
fallbackName: string;
|
|
8
|
+
}
|
|
9
|
+
export declare function Avatar({ user, usernameFieldPath, fallbackName }: Props): import("react/jsx-runtime").JSX.Element;
|
|
10
|
+
export {};
|
|
11
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/Avatar/index.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAC1C,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,aAAa,CAAC;AAGxC,UAAU,KAAK;IACb,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,IAAI,CAAC,EAAE,IAAI,GAAG,UAAU,GAAG,IAAI,CAAC;IAChC,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,wBAAgB,MAAM,CAAC,EAAE,IAAI,EAAE,iBAAiB,EAAE,YAAY,EAAE,EAAE,KAAK,2CAStE"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { jsx } from "react/jsx-runtime";
|
|
2
|
+
import { resolveUsername } from "../../utils/user/resolveUsername";
|
|
3
|
+
function Avatar({ user, usernameFieldPath, fallbackName }) {
|
|
4
|
+
const userName = resolveUsername(user, usernameFieldPath, fallbackName);
|
|
5
|
+
const userInitial = userName.charAt(0).toUpperCase();
|
|
6
|
+
return /* @__PURE__ */ jsx("div", { className: "w-9 h-9 rounded-full bg-(--theme-elevation-150) text-(--theme-text) flex items-center justify-center text-[14px] font-semibold", children: userInitial });
|
|
7
|
+
}
|
|
8
|
+
export {
|
|
9
|
+
Avatar
|
|
10
|
+
};
|
|
11
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/components/Avatar/index.tsx"],"sourcesContent":["import type { ClientUser } from \"payload\";\nimport type { User } from \"../../types\";\nimport { resolveUsername } from \"../../utils/user/resolveUsername\";\n\ninterface Props {\n className?: string;\n user?: User | ClientUser | null;\n usernameFieldPath?: string;\n fallbackName: string;\n}\n\nexport function Avatar({ user, usernameFieldPath, fallbackName }: Props) {\n const userName = resolveUsername(user, usernameFieldPath, fallbackName);\n const userInitial = userName.charAt(0).toUpperCase();\n\n return (\n <div className=\"w-9 h-9 rounded-full bg-(--theme-elevation-150) text-(--theme-text) flex items-center justify-center text-[14px] font-semibold\">\n {userInitial}\n </div>\n );\n}\n"],"mappings":"AAgBI;AAdJ,SAAS,uBAAuB;AASzB,SAAS,OAAO,EAAE,MAAM,mBAAmB,aAAa,GAAU;AACvE,QAAM,WAAW,gBAAgB,MAAM,mBAAmB,YAAY;AACtE,QAAM,cAAc,SAAS,OAAO,CAAC,EAAE,YAAY;AAEnD,SACE,oBAAC,SAAI,WAAU,kIACZ,uBACH;AAEJ;","names":[]}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
interface Props {
|
|
2
|
+
className?: string;
|
|
3
|
+
onMention: (e: React.MouseEvent) => void;
|
|
4
|
+
onAddComment: () => void;
|
|
5
|
+
}
|
|
6
|
+
export declare function ActionPanel({ className, onMention, onAddComment }: Props): import("react/jsx-runtime").JSX.Element;
|
|
7
|
+
export {};
|
|
8
|
+
//# sourceMappingURL=ActionPanel.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ActionPanel.d.ts","sourceRoot":"","sources":["../../../src/components/CommentEditor/ActionPanel.tsx"],"names":[],"mappings":"AAKA,UAAU,KAAK;IACb,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,CAAC,CAAC,EAAE,KAAK,CAAC,UAAU,KAAK,IAAI,CAAC;IACzC,YAAY,EAAE,MAAM,IAAI,CAAC;CAC1B;AAED,wBAAgB,WAAW,CAAC,EAAE,SAAS,EAAE,SAAS,EAAE,YAAY,EAAE,EAAE,KAAK,2CAgBxE"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { AtSign, SendHorizontal } from "lucide-react";
|
|
3
|
+
import { IconButton } from "../IconButton";
|
|
4
|
+
import { useTranslation } from "@payloadcms/ui";
|
|
5
|
+
import { cn } from "../../utils/general/cn";
|
|
6
|
+
function ActionPanel({ className, onMention, onAddComment }) {
|
|
7
|
+
const { t } = useTranslation();
|
|
8
|
+
return /* @__PURE__ */ jsxs("div", { className: cn("flex justify-end items-center gap-1 pt-2", className), "data-popup-prevent-close": true, children: [
|
|
9
|
+
/* @__PURE__ */ jsx(IconButton, { title: "Mention user", onClick: onMention, children: /* @__PURE__ */ jsx(AtSign, { size: 16 }) }),
|
|
10
|
+
/* @__PURE__ */ jsx("hr", { className: "w-px h-[20px] bg-(--theme-elevation-150) m-0" }),
|
|
11
|
+
/* @__PURE__ */ jsx(IconButton, { variant: "primary", title: t("comments:comment"), onClick: onAddComment, children: /* @__PURE__ */ jsx(SendHorizontal, { size: 16 }) })
|
|
12
|
+
] });
|
|
13
|
+
}
|
|
14
|
+
export {
|
|
15
|
+
ActionPanel
|
|
16
|
+
};
|
|
17
|
+
//# sourceMappingURL=ActionPanel.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/components/CommentEditor/ActionPanel.tsx"],"sourcesContent":["import { AtSign, SendHorizontal } from \"lucide-react\";\nimport { IconButton } from \"../IconButton\";\nimport { useTranslation } from \"@payloadcms/ui\";\nimport { cn } from \"../../utils/general/cn\";\n\ninterface Props {\n className?: string;\n onMention: (e: React.MouseEvent) => void;\n onAddComment: () => void;\n}\n\nexport function ActionPanel({ className, onMention, onAddComment }: Props) {\n const { t } = useTranslation();\n\n return (\n <div className={cn(\"flex justify-end items-center gap-1 pt-2\", className)} data-popup-prevent-close>\n <IconButton title=\"Mention user\" onClick={onMention}>\n <AtSign size={16} />\n </IconButton>\n\n <hr className=\"w-px h-[20px] bg-(--theme-elevation-150) m-0\" />\n\n <IconButton variant=\"primary\" title={t(\"comments:comment\" as never)} onClick={onAddComment}>\n <SendHorizontal size={16} />\n </IconButton>\n </div>\n );\n}\n"],"mappings":"AAeI,SAEI,KAFJ;AAfJ,SAAS,QAAQ,sBAAsB;AACvC,SAAS,kBAAkB;AAC3B,SAAS,sBAAsB;AAC/B,SAAS,UAAU;AAQZ,SAAS,YAAY,EAAE,WAAW,WAAW,aAAa,GAAU;AACzE,QAAM,EAAE,EAAE,IAAI,eAAe;AAE7B,SACE,qBAAC,SAAI,WAAW,GAAG,4CAA4C,SAAS,GAAG,4BAAwB,MACjG;AAAA,wBAAC,cAAW,OAAM,gBAAe,SAAS,WACxC,8BAAC,UAAO,MAAM,IAAI,GACpB;AAAA,IAEA,oBAAC,QAAG,WAAU,gDAA+C;AAAA,IAE7D,oBAAC,cAAW,SAAQ,WAAU,OAAO,EAAE,kBAA2B,GAAG,SAAS,cAC5E,8BAAC,kBAAe,MAAM,IAAI,GAC5B;AAAA,KACF;AAEJ;","names":[]}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { type RefObject } from "react";
|
|
2
|
+
export interface CommentEditorHandle {
|
|
3
|
+
getValue: () => string;
|
|
4
|
+
clear: () => void;
|
|
5
|
+
focus: () => void;
|
|
6
|
+
insertAt: () => void;
|
|
7
|
+
}
|
|
8
|
+
interface CommentEditorProps {
|
|
9
|
+
disabled?: boolean;
|
|
10
|
+
autoFocus?: boolean;
|
|
11
|
+
placeholder?: string;
|
|
12
|
+
ref?: RefObject<CommentEditorHandle | null>;
|
|
13
|
+
fieldPath?: string | null;
|
|
14
|
+
documentId?: number;
|
|
15
|
+
collectionSlug?: string;
|
|
16
|
+
globalSlug?: string;
|
|
17
|
+
onSuccessAddComment?: () => void;
|
|
18
|
+
onEnterPress?: () => void;
|
|
19
|
+
onEscapePress?: () => void;
|
|
20
|
+
}
|
|
21
|
+
export declare function CommentEditor({ disabled, autoFocus, placeholder: placeholderProp, ref, fieldPath, documentId, collectionSlug, globalSlug, onSuccessAddComment, onEnterPress, onEscapePress, }: CommentEditorProps): import("react/jsx-runtime").JSX.Element;
|
|
22
|
+
export {};
|
|
23
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/CommentEditor/index.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAyC,KAAK,SAAS,EAAmB,MAAM,OAAO,CAAC;AAc/F,MAAM,WAAW,mBAAmB;IAClC,QAAQ,EAAE,MAAM,MAAM,CAAC;IACvB,KAAK,EAAE,MAAM,IAAI,CAAC;IAClB,KAAK,EAAE,MAAM,IAAI,CAAC;IAClB,QAAQ,EAAE,MAAM,IAAI,CAAC;CACtB;AAED,UAAU,kBAAkB;IAC1B,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,GAAG,CAAC,EAAE,SAAS,CAAC,mBAAmB,GAAG,IAAI,CAAC,CAAC;IAC5C,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,mBAAmB,CAAC,EAAE,MAAM,IAAI,CAAC;IACjC,YAAY,CAAC,EAAE,MAAM,IAAI,CAAC;IAC1B,aAAa,CAAC,EAAE,MAAM,IAAI,CAAC;CAC5B;AAED,wBAAgB,aAAa,CAAC,EAC5B,QAAQ,EACR,SAAS,EACT,WAAW,EAAE,eAAe,EAC5B,GAAG,EACH,SAAS,EACT,UAAU,EACV,cAAc,EACd,UAAU,EACV,mBAAmB,EACnB,YAAY,EACZ,aAAa,GACd,EAAE,kBAAkB,2CAwRpB"}
|
|
@@ -0,0 +1,265 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { useState, useRef, useImperativeHandle, startTransition } from "react";
|
|
4
|
+
import { useAuth, useLocale, useTranslation } from "@payloadcms/ui";
|
|
5
|
+
import { useComments } from "../../providers/CommentsProvider";
|
|
6
|
+
import { MentionDropdown } from "../MentionDropdown";
|
|
7
|
+
import { MentionLabel } from "../MentionLabel";
|
|
8
|
+
import { serializeEditor } from "../../utils/comment/serializeEditor";
|
|
9
|
+
import { isSelfMention } from "../../utils/mention/isSelfMention";
|
|
10
|
+
import { createRoot } from "react-dom/client";
|
|
11
|
+
import { FALLBACK_USERNAME } from "../../constants";
|
|
12
|
+
import { resolveUsername } from "../../utils/user/resolveUsername";
|
|
13
|
+
import { ActionPanel } from "./ActionPanel";
|
|
14
|
+
import { Avatar } from "../Avatar";
|
|
15
|
+
function CommentEditor({
|
|
16
|
+
disabled,
|
|
17
|
+
autoFocus,
|
|
18
|
+
placeholder: placeholderProp,
|
|
19
|
+
ref,
|
|
20
|
+
fieldPath,
|
|
21
|
+
documentId,
|
|
22
|
+
collectionSlug,
|
|
23
|
+
globalSlug,
|
|
24
|
+
onSuccessAddComment,
|
|
25
|
+
onEnterPress,
|
|
26
|
+
onEscapePress
|
|
27
|
+
}) {
|
|
28
|
+
const { mentionUsers: users, addComment } = useComments();
|
|
29
|
+
const { code: locale } = useLocale();
|
|
30
|
+
const { user } = useAuth();
|
|
31
|
+
const [mentionQuery, setMentionQuery] = useState(null);
|
|
32
|
+
const [triggerRange, setTriggerRange] = useState(null);
|
|
33
|
+
const [filteredUsers, setFilteredUsers] = useState([]);
|
|
34
|
+
const [selectedIndex, setSelectedIndex] = useState(0);
|
|
35
|
+
const { usernameFieldPath } = useComments();
|
|
36
|
+
const { t } = useTranslation();
|
|
37
|
+
const editorRef = useRef(null);
|
|
38
|
+
const editorWrapperRef = useRef(null);
|
|
39
|
+
const unknownLabel = t("comments:unknownAuthor") ?? FALLBACK_USERNAME;
|
|
40
|
+
const currentUserId = user?.id;
|
|
41
|
+
const placeholder = placeholderProp ?? t("comments:writeComment") ?? "Add a comment";
|
|
42
|
+
const detectMention = () => {
|
|
43
|
+
const sel = window.getSelection();
|
|
44
|
+
if (!sel || !sel.rangeCount) {
|
|
45
|
+
setMentionQuery(null);
|
|
46
|
+
return;
|
|
47
|
+
}
|
|
48
|
+
const range = sel.getRangeAt(0);
|
|
49
|
+
const node = range.startContainer;
|
|
50
|
+
if (node.nodeType !== Node.TEXT_NODE) {
|
|
51
|
+
setMentionQuery(null);
|
|
52
|
+
return;
|
|
53
|
+
}
|
|
54
|
+
const text = node.textContent ?? "";
|
|
55
|
+
const offset = range.startOffset;
|
|
56
|
+
let i = offset - 1;
|
|
57
|
+
while (i >= 0 && text[i] !== " " && text[i] !== "\n") {
|
|
58
|
+
if (text[i] === "@") {
|
|
59
|
+
const query = text.slice(i + 1, offset);
|
|
60
|
+
if (query.includes(" ")) {
|
|
61
|
+
setMentionQuery(null);
|
|
62
|
+
return;
|
|
63
|
+
}
|
|
64
|
+
const atRange = document.createRange();
|
|
65
|
+
atRange.setStart(node, i);
|
|
66
|
+
atRange.setEnd(node, offset);
|
|
67
|
+
setTriggerRange(atRange.cloneRange());
|
|
68
|
+
setMentionQuery(query);
|
|
69
|
+
setFilteredUsers(
|
|
70
|
+
users.filter(
|
|
71
|
+
(u) => resolveUsername(u, usernameFieldPath, unknownLabel).toLowerCase().includes(query.toLowerCase())
|
|
72
|
+
)
|
|
73
|
+
);
|
|
74
|
+
setSelectedIndex(0);
|
|
75
|
+
return;
|
|
76
|
+
}
|
|
77
|
+
i--;
|
|
78
|
+
}
|
|
79
|
+
setMentionQuery(null);
|
|
80
|
+
};
|
|
81
|
+
const insertMention = (user2) => {
|
|
82
|
+
if (!triggerRange || !editorRef.current) return;
|
|
83
|
+
const sel = window.getSelection();
|
|
84
|
+
if (!sel) return;
|
|
85
|
+
sel.removeAllRanges();
|
|
86
|
+
sel.addRange(triggerRange);
|
|
87
|
+
sel.deleteFromDocument();
|
|
88
|
+
const { id: userId } = user2;
|
|
89
|
+
const mentionLabelContainer = document.createElement("span");
|
|
90
|
+
const mentionLabelContainerRoot = createRoot(mentionLabelContainer);
|
|
91
|
+
mentionLabelContainerRoot.render(
|
|
92
|
+
/* @__PURE__ */ jsx(
|
|
93
|
+
MentionLabel,
|
|
94
|
+
{
|
|
95
|
+
name: resolveUsername(user2, usernameFieldPath, unknownLabel),
|
|
96
|
+
isSelf: isSelfMention(currentUserId, userId)
|
|
97
|
+
}
|
|
98
|
+
)
|
|
99
|
+
);
|
|
100
|
+
mentionLabelContainer.contentEditable = "false";
|
|
101
|
+
mentionLabelContainer.dataset.mentionId = String(userId);
|
|
102
|
+
const range2 = sel.getRangeAt(0);
|
|
103
|
+
range2.insertNode(mentionLabelContainer);
|
|
104
|
+
const zws = document.createTextNode("\u200B");
|
|
105
|
+
mentionLabelContainer.after(zws);
|
|
106
|
+
const newRange = document.createRange();
|
|
107
|
+
newRange.setStartAfter(zws);
|
|
108
|
+
newRange.collapse(true);
|
|
109
|
+
sel.removeAllRanges();
|
|
110
|
+
sel.addRange(newRange);
|
|
111
|
+
setMentionQuery(null);
|
|
112
|
+
setTriggerRange(null);
|
|
113
|
+
editorRef.current?.focus();
|
|
114
|
+
};
|
|
115
|
+
const insertAt = () => {
|
|
116
|
+
const editor = editorRef.current;
|
|
117
|
+
if (!editor) return;
|
|
118
|
+
editor.focus();
|
|
119
|
+
const sel = window.getSelection();
|
|
120
|
+
if (!sel || !sel.rangeCount) {
|
|
121
|
+
const range = document.createRange();
|
|
122
|
+
range.selectNodeContents(editor);
|
|
123
|
+
range.collapse(false);
|
|
124
|
+
sel?.removeAllRanges();
|
|
125
|
+
sel?.addRange(range);
|
|
126
|
+
}
|
|
127
|
+
document.execCommand("insertText", false, "@");
|
|
128
|
+
detectMention();
|
|
129
|
+
};
|
|
130
|
+
const updateEmptyClass = () => {
|
|
131
|
+
const editor = editorRef.current;
|
|
132
|
+
if (!editor) return;
|
|
133
|
+
const isEmpty = editor.innerHTML === "" || editor.innerHTML === "<br>";
|
|
134
|
+
editor.classList.toggle("is-empty", isEmpty);
|
|
135
|
+
};
|
|
136
|
+
const getEditorValue = () => {
|
|
137
|
+
if (!editorRef.current) return "";
|
|
138
|
+
return serializeEditor(editorRef.current).trim();
|
|
139
|
+
};
|
|
140
|
+
const clearEditor = () => {
|
|
141
|
+
setMentionQuery(null);
|
|
142
|
+
setTriggerRange(null);
|
|
143
|
+
if (editorRef.current) {
|
|
144
|
+
editorRef.current.innerHTML = "";
|
|
145
|
+
editorRef.current.classList.add("is-empty");
|
|
146
|
+
}
|
|
147
|
+
};
|
|
148
|
+
const focusEditor = () => {
|
|
149
|
+
editorRef.current?.focus();
|
|
150
|
+
};
|
|
151
|
+
useImperativeHandle(ref, () => ({
|
|
152
|
+
getValue: getEditorValue,
|
|
153
|
+
clear: clearEditor,
|
|
154
|
+
focus: focusEditor,
|
|
155
|
+
insertAt
|
|
156
|
+
}));
|
|
157
|
+
const handleAddComment = () => {
|
|
158
|
+
const serialized = getEditorValue();
|
|
159
|
+
if (!serialized) return;
|
|
160
|
+
clearEditor();
|
|
161
|
+
startTransition(async () => {
|
|
162
|
+
const res = await addComment(serialized, fieldPath, documentId, collectionSlug, locale, globalSlug);
|
|
163
|
+
if (res.success) {
|
|
164
|
+
onSuccessAddComment?.();
|
|
165
|
+
}
|
|
166
|
+
});
|
|
167
|
+
};
|
|
168
|
+
const handleKeyDown = (e) => {
|
|
169
|
+
if (mentionQuery !== null) {
|
|
170
|
+
if (e.key === "ArrowDown") {
|
|
171
|
+
e.preventDefault();
|
|
172
|
+
e.stopPropagation();
|
|
173
|
+
setSelectedIndex((prev) => (prev + 1) % filteredUsers.length);
|
|
174
|
+
return;
|
|
175
|
+
}
|
|
176
|
+
if (e.key === "ArrowUp") {
|
|
177
|
+
e.preventDefault();
|
|
178
|
+
e.stopPropagation();
|
|
179
|
+
setSelectedIndex((prev) => (prev - 1 + filteredUsers.length) % filteredUsers.length);
|
|
180
|
+
return;
|
|
181
|
+
}
|
|
182
|
+
if (e.key === "Enter" && filteredUsers.length > 0) {
|
|
183
|
+
e.preventDefault();
|
|
184
|
+
const selectedUser = filteredUsers[selectedIndex];
|
|
185
|
+
if (selectedUser) insertMention(selectedUser);
|
|
186
|
+
return;
|
|
187
|
+
}
|
|
188
|
+
if (e.key === "Escape") {
|
|
189
|
+
e.stopPropagation();
|
|
190
|
+
setMentionQuery(null);
|
|
191
|
+
setTriggerRange(null);
|
|
192
|
+
return;
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
if (e.key === "Enter" && !e.shiftKey) {
|
|
196
|
+
e.preventDefault();
|
|
197
|
+
handleAddComment();
|
|
198
|
+
onEnterPress?.();
|
|
199
|
+
} else if (e.key === "Escape") {
|
|
200
|
+
onEscapePress?.();
|
|
201
|
+
}
|
|
202
|
+
};
|
|
203
|
+
const handleInput = () => {
|
|
204
|
+
detectMention();
|
|
205
|
+
updateEmptyClass();
|
|
206
|
+
};
|
|
207
|
+
return /* @__PURE__ */ jsx("div", { className: "relative", children: /* @__PURE__ */ jsxs("div", { className: "flex gap-2.5 items-start", children: [
|
|
208
|
+
/* @__PURE__ */ jsx(Avatar, { className: "shrink-0", user, usernameFieldPath, fallbackName: unknownLabel }),
|
|
209
|
+
/* @__PURE__ */ jsxs(
|
|
210
|
+
"div",
|
|
211
|
+
{
|
|
212
|
+
ref: editorWrapperRef,
|
|
213
|
+
className: "relative flex-1 group px-2.5 py-2 rounded-md border border-transparent focus-within:border-(--theme-elevation-150) bg-transparent transition-colors",
|
|
214
|
+
children: [
|
|
215
|
+
/* @__PURE__ */ jsx("div", { className: "relative", children: /* @__PURE__ */ jsx(
|
|
216
|
+
"div",
|
|
217
|
+
{
|
|
218
|
+
className: `
|
|
219
|
+
is-empty w-full min-h-5 leading-5
|
|
220
|
+
text-(--theme-text) text-[13px] outline-none box-border
|
|
221
|
+
[&.is-empty]:before:content-[attr(data-placeholder)] [&.is-empty]:before:text-(--theme-elevation-450)
|
|
222
|
+
[&.is-empty]:before:pointer-events-none [&.is-empty]:before:absolute
|
|
223
|
+
`,
|
|
224
|
+
ref: editorRef,
|
|
225
|
+
contentEditable: !disabled,
|
|
226
|
+
autoFocus,
|
|
227
|
+
role: "textbox",
|
|
228
|
+
"aria-multiline": "true",
|
|
229
|
+
"aria-label": placeholder,
|
|
230
|
+
"data-placeholder": placeholder,
|
|
231
|
+
onInput: handleInput,
|
|
232
|
+
onKeyDown: handleKeyDown
|
|
233
|
+
}
|
|
234
|
+
) }),
|
|
235
|
+
mentionQuery !== null && /* @__PURE__ */ jsx(
|
|
236
|
+
MentionDropdown,
|
|
237
|
+
{
|
|
238
|
+
users: filteredUsers,
|
|
239
|
+
selectedIndex,
|
|
240
|
+
onSelect: insertMention,
|
|
241
|
+
onClose: () => {
|
|
242
|
+
setMentionQuery(null);
|
|
243
|
+
setTriggerRange(null);
|
|
244
|
+
editorRef.current?.focus();
|
|
245
|
+
},
|
|
246
|
+
anchorRef: editorWrapperRef
|
|
247
|
+
}
|
|
248
|
+
),
|
|
249
|
+
/* @__PURE__ */ jsx(
|
|
250
|
+
ActionPanel,
|
|
251
|
+
{
|
|
252
|
+
className: "hidden group-focus-within:flex",
|
|
253
|
+
onMention: () => insertAt(),
|
|
254
|
+
onAddComment: handleAddComment
|
|
255
|
+
}
|
|
256
|
+
)
|
|
257
|
+
]
|
|
258
|
+
}
|
|
259
|
+
)
|
|
260
|
+
] }) });
|
|
261
|
+
}
|
|
262
|
+
export {
|
|
263
|
+
CommentEditor
|
|
264
|
+
};
|
|
265
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/components/CommentEditor/index.tsx"],"sourcesContent":["\"use client\";\n\nimport { useState, useRef, useImperativeHandle, type RefObject, startTransition } from \"react\";\nimport { useAuth, useLocale, useTranslation } from \"@payloadcms/ui\";\nimport { useComments } from \"../../providers/CommentsProvider\";\nimport { MentionDropdown } from \"../MentionDropdown\";\nimport { MentionLabel } from \"../MentionLabel\";\nimport { serializeEditor } from \"../../utils/comment/serializeEditor\";\nimport { isSelfMention } from \"../../utils/mention/isSelfMention\";\nimport { createRoot } from \"react-dom/client\";\nimport type { User } from \"../../types\";\nimport { FALLBACK_USERNAME } from \"../../constants\";\nimport { resolveUsername } from \"../../utils/user/resolveUsername\";\nimport { ActionPanel } from \"./ActionPanel\";\nimport { Avatar } from \"../Avatar\";\n\nexport interface CommentEditorHandle {\n getValue: () => string;\n clear: () => void;\n focus: () => void;\n insertAt: () => void;\n}\n\ninterface CommentEditorProps {\n disabled?: boolean;\n autoFocus?: boolean;\n placeholder?: string;\n ref?: RefObject<CommentEditorHandle | null>;\n fieldPath?: string | null;\n documentId?: number;\n collectionSlug?: string;\n globalSlug?: string;\n onSuccessAddComment?: () => void;\n onEnterPress?: () => void;\n onEscapePress?: () => void;\n}\n\nexport function CommentEditor({\n disabled,\n autoFocus,\n placeholder: placeholderProp,\n ref,\n fieldPath,\n documentId,\n collectionSlug,\n globalSlug,\n onSuccessAddComment,\n onEnterPress,\n onEscapePress,\n}: CommentEditorProps) {\n const { mentionUsers: users, addComment } = useComments();\n const { code: locale } = useLocale();\n const { user } = useAuth();\n\n const [mentionQuery, setMentionQuery] = useState<string | null>(null);\n const [triggerRange, setTriggerRange] = useState<Range | null>(null);\n const [filteredUsers, setFilteredUsers] = useState<User[]>([]);\n const [selectedIndex, setSelectedIndex] = useState(0);\n\n const { usernameFieldPath } = useComments();\n const { t } = useTranslation();\n\n const editorRef = useRef<HTMLDivElement>(null);\n const editorWrapperRef = useRef<HTMLDivElement>(null);\n\n const unknownLabel = t(\"comments:unknownAuthor\" as never) ?? FALLBACK_USERNAME;\n const currentUserId = user?.id;\n const placeholder = placeholderProp ?? t(\"comments:writeComment\" as never) ?? \"Add a comment\";\n\n // Methods\n const detectMention = () => {\n const sel = window.getSelection();\n\n if (!sel || !sel.rangeCount) {\n setMentionQuery(null);\n\n return;\n }\n\n const range = sel.getRangeAt(0);\n const node = range.startContainer;\n\n if (node.nodeType !== Node.TEXT_NODE) {\n setMentionQuery(null);\n\n return;\n }\n\n const text = node.textContent ?? \"\";\n const offset = range.startOffset;\n\n let i = offset - 1;\n while (i >= 0 && text[i] !== \" \" && text[i] !== \"\\n\") {\n if (text[i] === \"@\") {\n const query = text.slice(i + 1, offset);\n if (query.includes(\" \")) {\n setMentionQuery(null);\n return;\n }\n\n const atRange = document.createRange();\n atRange.setStart(node, i);\n atRange.setEnd(node, offset);\n setTriggerRange(atRange.cloneRange());\n setMentionQuery(query);\n setFilteredUsers(\n users.filter((u) =>\n resolveUsername(u, usernameFieldPath, unknownLabel).toLowerCase().includes(query.toLowerCase()),\n ),\n );\n setSelectedIndex(0);\n\n return;\n }\n\n i--;\n }\n\n setMentionQuery(null);\n };\n\n const insertMention = (user: User) => {\n if (!triggerRange || !editorRef.current) return;\n\n const sel = window.getSelection();\n if (!sel) return;\n\n sel.removeAllRanges();\n sel.addRange(triggerRange);\n sel.deleteFromDocument();\n\n const { id: userId } = user;\n\n const mentionLabelContainer = document.createElement(\"span\");\n const mentionLabelContainerRoot = createRoot(mentionLabelContainer);\n\n mentionLabelContainerRoot.render(\n <MentionLabel\n name={resolveUsername(user, usernameFieldPath, unknownLabel)}\n isSelf={isSelfMention(currentUserId, userId)}\n />,\n );\n\n mentionLabelContainer.contentEditable = \"false\";\n mentionLabelContainer.dataset.mentionId = String(userId);\n\n const range2 = sel.getRangeAt(0);\n range2.insertNode(mentionLabelContainer);\n\n const zws = document.createTextNode(\"\\u200b\");\n mentionLabelContainer.after(zws);\n\n const newRange = document.createRange();\n newRange.setStartAfter(zws);\n newRange.collapse(true);\n sel.removeAllRanges();\n sel.addRange(newRange);\n\n setMentionQuery(null);\n setTriggerRange(null);\n editorRef.current?.focus();\n };\n\n const insertAt = () => {\n const editor = editorRef.current;\n if (!editor) return;\n\n editor.focus();\n\n const sel = window.getSelection();\n if (!sel || !sel.rangeCount) {\n const range = document.createRange();\n range.selectNodeContents(editor);\n range.collapse(false);\n sel?.removeAllRanges();\n sel?.addRange(range);\n }\n\n document.execCommand(\"insertText\", false, \"@\");\n detectMention();\n };\n\n const updateEmptyClass = () => {\n const editor = editorRef.current;\n if (!editor) return;\n\n const isEmpty = editor.innerHTML === \"\" || editor.innerHTML === \"<br>\";\n\n editor.classList.toggle(\"is-empty\", isEmpty);\n };\n\n // Editor API\n const getEditorValue = () => {\n if (!editorRef.current) return \"\";\n\n return serializeEditor(editorRef.current).trim();\n };\n\n const clearEditor = () => {\n setMentionQuery(null);\n setTriggerRange(null);\n\n if (editorRef.current) {\n editorRef.current.innerHTML = \"\";\n editorRef.current.classList.add(\"is-empty\");\n }\n };\n\n const focusEditor = () => {\n editorRef.current?.focus();\n };\n\n useImperativeHandle(ref, () => ({\n getValue: getEditorValue,\n clear: clearEditor,\n focus: focusEditor,\n insertAt,\n }));\n\n // Handlers\n const handleAddComment = () => {\n const serialized = getEditorValue();\n if (!serialized) return;\n\n clearEditor();\n\n startTransition(async () => {\n const res = await addComment(serialized, fieldPath, documentId, collectionSlug, locale, globalSlug);\n\n if (res.success) {\n onSuccessAddComment?.();\n }\n });\n };\n\n const handleKeyDown = (e: React.KeyboardEvent<HTMLDivElement>) => {\n if (mentionQuery !== null) {\n if (e.key === \"ArrowDown\") {\n e.preventDefault();\n e.stopPropagation();\n setSelectedIndex((prev) => (prev + 1) % filteredUsers.length);\n return;\n }\n if (e.key === \"ArrowUp\") {\n e.preventDefault();\n e.stopPropagation();\n setSelectedIndex((prev) => (prev - 1 + filteredUsers.length) % filteredUsers.length);\n return;\n }\n if (e.key === \"Enter\" && filteredUsers.length > 0) {\n e.preventDefault();\n const selectedUser = filteredUsers[selectedIndex];\n if (selectedUser) insertMention(selectedUser);\n return;\n }\n if (e.key === \"Escape\") {\n e.stopPropagation();\n setMentionQuery(null);\n setTriggerRange(null);\n return;\n }\n }\n\n if (e.key === \"Enter\" && !e.shiftKey) {\n e.preventDefault();\n\n handleAddComment();\n onEnterPress?.();\n } else if (e.key === \"Escape\") {\n onEscapePress?.();\n }\n };\n\n const handleInput = () => {\n detectMention();\n updateEmptyClass();\n };\n\n return (\n <div className=\"relative\">\n <div className=\"flex gap-2.5 items-start\">\n <Avatar className=\"shrink-0\" user={user} usernameFieldPath={usernameFieldPath} fallbackName={unknownLabel} />\n\n <div\n ref={editorWrapperRef}\n className=\"relative flex-1 group px-2.5 py-2 rounded-md border border-transparent focus-within:border-(--theme-elevation-150) bg-transparent transition-colors\">\n <div className=\"relative\">\n <div\n className={`\n is-empty w-full min-h-5 leading-5\n text-(--theme-text) text-[13px] outline-none box-border\n [&.is-empty]:before:content-[attr(data-placeholder)] [&.is-empty]:before:text-(--theme-elevation-450)\n [&.is-empty]:before:pointer-events-none [&.is-empty]:before:absolute\n `}\n ref={editorRef}\n contentEditable={!disabled}\n autoFocus={autoFocus}\n role=\"textbox\"\n aria-multiline=\"true\"\n aria-label={placeholder}\n data-placeholder={placeholder}\n onInput={handleInput}\n onKeyDown={handleKeyDown}\n />\n </div>\n\n {mentionQuery !== null && (\n <MentionDropdown\n users={filteredUsers}\n selectedIndex={selectedIndex}\n onSelect={insertMention}\n onClose={() => {\n setMentionQuery(null);\n setTriggerRange(null);\n editorRef.current?.focus();\n }}\n anchorRef={editorWrapperRef}\n />\n )}\n\n <ActionPanel\n className=\"hidden group-focus-within:flex\"\n onMention={() => insertAt()}\n onAddComment={handleAddComment}\n />\n </div>\n </div>\n </div>\n );\n}\n"],"mappings":"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","names":["user"]}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
interface Props {
|
|
2
|
+
isResolved: boolean;
|
|
3
|
+
canDelete: boolean;
|
|
4
|
+
onResolve: () => void;
|
|
5
|
+
onDelete: () => void;
|
|
6
|
+
}
|
|
7
|
+
export declare function ToolsPanel({ isResolved, canDelete, onDelete, onResolve }: Props): import("react/jsx-runtime").JSX.Element;
|
|
8
|
+
export {};
|
|
9
|
+
//# sourceMappingURL=ToolsPanel.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ToolsPanel.d.ts","sourceRoot":"","sources":["../../../src/components/CommentItem/ToolsPanel.tsx"],"names":[],"mappings":"AAIA,UAAU,KAAK;IACb,UAAU,EAAE,OAAO,CAAC;IACpB,SAAS,EAAE,OAAO,CAAC;IACnB,SAAS,EAAE,MAAM,IAAI,CAAC;IACtB,QAAQ,EAAE,MAAM,IAAI,CAAC;CACtB;AAED,wBAAgB,UAAU,CAAC,EAAE,UAAU,EAAE,SAAS,EAAE,QAAQ,EAAE,SAAS,EAAE,EAAE,KAAK,2CAsB/E"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { CircleCheck, Trash2, Undo2 } from "lucide-react";
|
|
3
|
+
import { useTranslation } from "@payloadcms/ui";
|
|
4
|
+
import { IconButton } from "../IconButton";
|
|
5
|
+
function ToolsPanel({ isResolved, canDelete, onDelete, onResolve }) {
|
|
6
|
+
const { t } = useTranslation();
|
|
7
|
+
return /* @__PURE__ */ jsxs("div", { className: "absolute top-3 right-3 flex bg-(--theme-elevation-0) p-1 border rounded-md border-(--theme-elevation-100) opacity-0 group-hover:opacity-100 transition-opacity duration-150 pointer-events-none group-hover:pointer-events-auto", children: [
|
|
8
|
+
/* @__PURE__ */ jsx(
|
|
9
|
+
IconButton,
|
|
10
|
+
{
|
|
11
|
+
onClick: onResolve,
|
|
12
|
+
title: isResolved ? t("comments:reopen") ?? "Reopen" : t("comments:resolve") ?? "Resolve",
|
|
13
|
+
children: isResolved ? /* @__PURE__ */ jsx(Undo2, { size: 16 }) : /* @__PURE__ */ jsx(CircleCheck, { size: 16 })
|
|
14
|
+
}
|
|
15
|
+
),
|
|
16
|
+
canDelete && /* @__PURE__ */ jsx(IconButton, { onClick: onDelete, title: t("comments:delete") ?? "Delete", children: /* @__PURE__ */ jsx(Trash2, { size: 16 }) })
|
|
17
|
+
] });
|
|
18
|
+
}
|
|
19
|
+
export {
|
|
20
|
+
ToolsPanel
|
|
21
|
+
};
|
|
22
|
+
//# sourceMappingURL=ToolsPanel.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/components/CommentItem/ToolsPanel.tsx"],"sourcesContent":["import { CircleCheck, Trash2, Undo2 } from \"lucide-react\";\nimport { useTranslation } from \"@payloadcms/ui\";\nimport { IconButton } from \"../IconButton\";\n\ninterface Props {\n isResolved: boolean;\n canDelete: boolean;\n onResolve: () => void;\n onDelete: () => void;\n}\n\nexport function ToolsPanel({ isResolved, canDelete, onDelete, onResolve }: Props) {\n const { t } = useTranslation();\n\n return (\n <div className=\"absolute top-3 right-3 flex bg-(--theme-elevation-0) p-1 border rounded-md border-(--theme-elevation-100) opacity-0 group-hover:opacity-100 transition-opacity duration-150 pointer-events-none group-hover:pointer-events-auto\">\n <IconButton\n onClick={onResolve}\n title={\n isResolved ? (t(\"comments:reopen\" as never) ?? \"Reopen\") : (t(\"comments:resolve\" as never) ?? \"Resolve\")\n }>\n {isResolved ?\n <Undo2 size={16} />\n : <CircleCheck size={16} />}\n </IconButton>\n\n {canDelete && (\n <IconButton onClick={onDelete} title={t(\"comments:delete\" as never) ?? \"Delete\"}>\n <Trash2 size={16} />\n </IconButton>\n )}\n </div>\n );\n}\n"],"mappings":"AAeI,SAOM,KAPN;AAfJ,SAAS,aAAa,QAAQ,aAAa;AAC3C,SAAS,sBAAsB;AAC/B,SAAS,kBAAkB;AASpB,SAAS,WAAW,EAAE,YAAY,WAAW,UAAU,UAAU,GAAU;AAChF,QAAM,EAAE,EAAE,IAAI,eAAe;AAE7B,SACE,qBAAC,SAAI,WAAU,mOACb;AAAA;AAAA,MAAC;AAAA;AAAA,QACC,SAAS;AAAA,QACT,OACE,aAAc,EAAE,iBAA0B,KAAK,WAAa,EAAE,kBAA2B,KAAK;AAAA,QAE/F,uBACC,oBAAC,SAAM,MAAM,IAAI,IACjB,oBAAC,eAAY,MAAM,IAAI;AAAA;AAAA,IAC3B;AAAA,IAEC,aACC,oBAAC,cAAW,SAAS,UAAU,OAAO,EAAE,iBAA0B,KAAK,UACrE,8BAAC,UAAO,MAAM,IAAI,GACpB;AAAA,KAEJ;AAEJ;","names":[]}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { Comment } from "../../types";
|
|
2
|
+
interface Props {
|
|
3
|
+
comment: Comment;
|
|
4
|
+
currentUserId: number | null;
|
|
5
|
+
}
|
|
6
|
+
export declare function CommentItem({ comment, currentUserId }: Props): import("react/jsx-runtime").JSX.Element;
|
|
7
|
+
export {};
|
|
8
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/CommentItem/index.tsx"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAS3C,UAAU,KAAK;IACb,OAAO,EAAE,OAAO,CAAC;IACjB,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;CAC9B;AAED,wBAAgB,WAAW,CAAC,EAAE,OAAO,EAAE,aAAa,EAAE,EAAE,KAAK,2CA2D5D"}
|