From 26dd6c128c55a968a0b0a39bbf80671ec665405c Mon Sep 17 00:00:00 2001 From: hjlarry Date: Thu, 29 Jan 2026 09:13:12 +0800 Subject: [PATCH] feat: mouse right click can add new comment --- .../components/workflow/comment-manager.tsx | 33 ++++++++++--- .../workflow/comment/comment-input.spec.tsx | 1 + .../workflow/comment/comment-input.tsx | 19 ++++++-- .../workflow/comment/cursor.spec.tsx | 1 + .../components/workflow/comment/cursor.tsx | 3 +- .../workflow/hooks/use-workflow-comment.ts | 19 ++++++-- web/app/components/workflow/index.tsx | 46 ++++++++++++++++++- .../components/workflow/panel-contextmenu.tsx | 23 ++++++++++ .../workflow/store/workflow/workflow-slice.ts | 8 ++++ web/i18n/ar-TN/workflow.json | 1 + web/i18n/de-DE/workflow.json | 1 + web/i18n/en-US/workflow.json | 1 + web/i18n/es-ES/workflow.json | 1 + web/i18n/fa-IR/workflow.json | 1 + web/i18n/fr-FR/workflow.json | 1 + web/i18n/hi-IN/workflow.json | 1 + web/i18n/id-ID/workflow.json | 1 + web/i18n/it-IT/workflow.json | 1 + web/i18n/ja-JP/workflow.json | 1 + web/i18n/ko-KR/workflow.json | 1 + web/i18n/pl-PL/workflow.json | 1 + web/i18n/pt-BR/workflow.json | 1 + web/i18n/ro-RO/workflow.json | 1 + web/i18n/ru-RU/workflow.json | 1 + web/i18n/sl-SI/workflow.json | 1 + web/i18n/th-TH/workflow.json | 1 + web/i18n/tr-TR/workflow.json | 1 + web/i18n/uk-UA/workflow.json | 1 + web/i18n/vi-VN/workflow.json | 1 + web/i18n/zh-Hans/workflow.json | 1 + web/i18n/zh-Hant/workflow.json | 1 + 31 files changed, 160 insertions(+), 15 deletions(-) diff --git a/web/app/components/workflow/comment-manager.tsx b/web/app/components/workflow/comment-manager.tsx index 7d5d5f1653..41175ae04d 100644 --- a/web/app/components/workflow/comment-manager.tsx +++ b/web/app/components/workflow/comment-manager.tsx @@ -7,14 +7,25 @@ const CommentManager = () => { const { handleCreateComment, handleCommentCancel } = useWorkflowComment() useEventListener('click', (e) => { - const { controlMode, mousePosition, pendingComment } = workflowStore.getState() + const { controlMode, mousePosition, pendingComment, isCommentPlacing } = workflowStore.getState() + const target = e.target as HTMLElement + const isInDropdown = target.closest('[data-mention-dropdown]') + const isInCommentInput = target.closest('[data-comment-input]') + const isOnCanvasPane = target.closest('.react-flow__pane') + + if (isCommentPlacing) { + if (!isInDropdown && !isInCommentInput && isOnCanvasPane) { + e.preventDefault() + e.stopPropagation() + workflowStore.setState({ + pendingComment: mousePosition, + isCommentPlacing: false, + }) + } + return + } if (controlMode === 'comment') { - const target = e.target as HTMLElement - const isInDropdown = target.closest('[data-mention-dropdown]') - const isInCommentInput = target.closest('[data-comment-input]') - const isOnCanvasPane = target.closest('.react-flow__pane') - // Only when clicking on the React Flow canvas pane (background), // and not inside comment input or its dropdown if (!isInDropdown && !isInCommentInput && isOnCanvasPane) { @@ -28,6 +39,16 @@ const CommentManager = () => { } }) + useEventListener('contextmenu', () => { + const { isCommentPlacing } = workflowStore.getState() + if (!isCommentPlacing) + return + workflowStore.setState({ + isCommentPlacing: false, + isCommentQuickAdd: false, + }) + }) + return null } diff --git a/web/app/components/workflow/comment/comment-input.spec.tsx b/web/app/components/workflow/comment/comment-input.spec.tsx index aa60b0c8bc..de416a86e3 100644 --- a/web/app/components/workflow/comment/comment-input.spec.tsx +++ b/web/app/components/workflow/comment/comment-input.spec.tsx @@ -9,6 +9,7 @@ type MentionInputProps = { onSubmit: (content: string, mentionedUserIds: string[]) => void placeholder?: string autoFocus?: boolean + disabled?: boolean className?: string } diff --git a/web/app/components/workflow/comment/comment-input.tsx b/web/app/components/workflow/comment/comment-input.tsx index 891471ea4d..1010531923 100644 --- a/web/app/components/workflow/comment/comment-input.tsx +++ b/web/app/components/workflow/comment/comment-input.tsx @@ -10,6 +10,8 @@ type CommentInputProps = { position: { x: number, y: number } onSubmit: (content: string, mentionedUserIds: string[]) => void onCancel: () => void + autoFocus?: boolean + disabled?: boolean onPositionChange?: (position: { pageX: number pageY: number @@ -18,7 +20,14 @@ type CommentInputProps = { }) => void } -export const CommentInput: FC = memo(({ position, onSubmit, onCancel, onPositionChange }) => { +export const CommentInput: FC = memo(({ + position, + onSubmit, + onCancel, + autoFocus = true, + disabled = false, + onPositionChange, +}) => { const [content, setContent] = useState('') const { t } = useTranslation() const { userProfile } = useAppContext() @@ -124,7 +133,10 @@ export const CommentInput: FC = memo(({ position, onSubmit, o return (
= memo(({ position, onSubmit, o onChange={setContent} onSubmit={handleMentionSubmit} placeholder={t('comments.placeholder.add', { ns: 'workflow' })} - autoFocus + autoFocus={autoFocus} + disabled={disabled} className="relative" />
diff --git a/web/app/components/workflow/comment/cursor.spec.tsx b/web/app/components/workflow/comment/cursor.spec.tsx index 74cf222c1a..f7d24dcf1d 100644 --- a/web/app/components/workflow/comment/cursor.spec.tsx +++ b/web/app/components/workflow/comment/cursor.spec.tsx @@ -5,6 +5,7 @@ import { CommentCursor } from './cursor' const mockState = { controlMode: ControlMode.Pointer, + isCommentPlacing: false, mousePosition: { elementX: 10, elementY: 20, diff --git a/web/app/components/workflow/comment/cursor.tsx b/web/app/components/workflow/comment/cursor.tsx index 9afd4f1d8b..02f09f7d92 100644 --- a/web/app/components/workflow/comment/cursor.tsx +++ b/web/app/components/workflow/comment/cursor.tsx @@ -7,8 +7,9 @@ import { ControlMode } from '../types' export const CommentCursor: FC = memo(() => { const controlMode = useStore(s => s.controlMode) const mousePosition = useStore(s => s.mousePosition) + const isCommentPlacing = useStore(s => s.isCommentPlacing) - if (controlMode !== ControlMode.Comment) + if (controlMode !== ControlMode.Comment || isCommentPlacing) return null return ( diff --git a/web/app/components/workflow/hooks/use-workflow-comment.ts b/web/app/components/workflow/hooks/use-workflow-comment.ts index d7d5db8e8d..54aed4217a 100644 --- a/web/app/components/workflow/hooks/use-workflow-comment.ts +++ b/web/app/components/workflow/hooks/use-workflow-comment.ts @@ -25,6 +25,9 @@ export const useWorkflowComment = () => { const controlMode = useStore(s => s.controlMode) const pendingComment = useStore(s => s.pendingComment) const setPendingComment = useStore(s => s.setPendingComment) + const isCommentQuickAdd = useStore(s => s.isCommentQuickAdd) + const setCommentQuickAdd = useStore(s => s.setCommentQuickAdd) + const isCommentPlacing = useStore(s => s.isCommentPlacing) const setActiveCommentId = useStore(s => s.setActiveCommentId) const activeCommentId = useStore(s => s.activeCommentId) const comments = useStore(s => s.comments) @@ -204,21 +207,29 @@ export const useWorkflowComment = () => { collaborationManager.emitCommentsUpdate(appId) setPendingComment(null) + setCommentQuickAdd(false) } catch (error) { console.error('Failed to create comment:', error) setPendingComment(null) + setCommentQuickAdd(false) } - }, [appId, pendingComment, setPendingComment, reactflow, comments, setComments, userProfile, setCommentDetailCache, mentionableUsers]) + }, [appId, pendingComment, setPendingComment, setCommentQuickAdd, reactflow, comments, setComments, userProfile, setCommentDetailCache, mentionableUsers]) const handleCommentCancel = useCallback(() => { setPendingComment(null) - }, [setPendingComment]) + setCommentQuickAdd(false) + }, [setPendingComment, setCommentQuickAdd]) useEffect(() => { - if (controlMode !== ControlMode.Comment) + if (controlMode !== ControlMode.Comment && !isCommentQuickAdd) setPendingComment(null) - }, [controlMode, setPendingComment]) + }, [controlMode, isCommentQuickAdd, setPendingComment]) + + useEffect(() => { + if (!pendingComment && !isCommentPlacing && isCommentQuickAdd) + setCommentQuickAdd(false) + }, [isCommentPlacing, isCommentQuickAdd, pendingComment, setCommentQuickAdd]) const handleCommentIconClick = useCallback(async (comment: WorkflowCommentList) => { setPendingComment(null) diff --git a/web/app/components/workflow/index.tsx b/web/app/components/workflow/index.tsx index 2b9c2ebb21..e0056fabd5 100644 --- a/web/app/components/workflow/index.tsx +++ b/web/app/components/workflow/index.tsx @@ -174,6 +174,37 @@ export type WorkflowProps = { myUserId?: string | null onlineUsers?: OnlineUser[] } + +const CommentPlacementPreview = memo(({ + onSubmit, + onCancel, +}: { + onSubmit: (content: string, mentionedUserIds: string[]) => void + onCancel: () => void +}) => { + const isCommentPlacing = useStore(s => s.isCommentPlacing) + const pendingComment = useStore(s => s.pendingComment) + const mousePosition = useStore(s => s.mousePosition) + + if (!isCommentPlacing || pendingComment) + return null + + return ( + + ) +}) + +CommentPlacementPreview.displayName = 'CommentPlacementPreview' + export const Workflow: FC = memo(({ nodes: originalNodes, edges: originalEdges, @@ -288,8 +319,11 @@ export const Workflow: FC = memo(({ const showUserCursors = useStore(s => s.showUserCursors) const showResolvedComments = useStore(s => s.showResolvedComments) const isCommentPreviewHovering = useStore(s => s.isCommentPreviewHovering) + const isCommentPlacing = useStore(s => s.isCommentPlacing) + const setCommentPlacing = useStore(s => s.setCommentPlacing) + const setCommentQuickAdd = useStore(s => s.setCommentQuickAdd) const setPendingCommentState = useStore(s => s.setPendingComment) - const isCommentInputActive = Boolean(pendingComment) + const isCommentInputActive = Boolean(pendingComment) || isCommentPlacing const { t } = useTranslation() const visibleComments = useMemo(() => { if (showResolvedComments) @@ -345,6 +379,12 @@ export const Workflow: FC = memo(({ setPendingCommentState(position) }, [setPendingCommentState]) + const handleCommentPlacementCancel = useCallback(() => { + setPendingCommentState(null) + setCommentPlacing(false) + setCommentQuickAdd(false) + }, [setCommentPlacing, setCommentQuickAdd, setPendingCommentState]) + const { handleRefreshWorkflowDraft } = useWorkflowRefreshDraft() const handleSyncWorkflowDraftWhenPageClose = useCallback(() => { if (document.visibilityState === 'hidden') { @@ -611,6 +651,10 @@ export const Workflow: FC = memo(({ {controlMode === ControlMode.Comment && isMouseOverCanvas && ( )} + {pendingComment && ( { const panelMenu = useStore(s => s.panelMenu) const clipboardElements = useStore(s => s.clipboardElements) const setShowImportDSLModal = useStore(s => s.setShowImportDSLModal) + const pendingComment = useStore(s => s.pendingComment) + const setCommentPlacing = useStore(s => s.setCommentPlacing) + const setCommentQuickAdd = useStore(s => s.setCommentQuickAdd) const { handleNodesPaste } = useNodesInteractions() const { handlePaneContextmenuCancel, handleNodeContextmenuCancel } = usePanelInteractions() const { handleStartWorkflowRun } = useWorkflowStartRun() const { handleAddNote } = useOperator() + const { isCommentModeAvailable } = useWorkflowMoveMode() const { exportCheck } = useDSL() useEffect(() => { @@ -79,6 +84,24 @@ const PanelContextmenu = () => { > {t('nodes.note.addNote', { ns: 'workflow' })} + {isCommentModeAvailable && ( +
{ + e.stopPropagation() + if (pendingComment) + return + setCommentQuickAdd(true) + setCommentPlacing(true) + handlePaneContextmenuCancel() + }} + > + {t('comments.actions.addComment', { ns: 'workflow' })} +
+ )}
{ diff --git a/web/app/components/workflow/store/workflow/workflow-slice.ts b/web/app/components/workflow/store/workflow/workflow-slice.ts index d498eef100..fa2341b349 100644 --- a/web/app/components/workflow/store/workflow/workflow-slice.ts +++ b/web/app/components/workflow/store/workflow/workflow-slice.ts @@ -43,6 +43,10 @@ export type WorkflowSliceShape = { setControlMode: (controlMode: WorkflowSliceShape['controlMode']) => void pendingComment: MousePosition | null setPendingComment: (pendingComment: WorkflowSliceShape['pendingComment']) => void + isCommentPlacing: boolean + setCommentPlacing: (isCommentPlacing: boolean) => void + isCommentQuickAdd: boolean + setCommentQuickAdd: (isCommentQuickAdd: boolean) => void isCommentPreviewHovering: boolean setCommentPreviewHovering: (hovering: boolean) => void mousePosition: { pageX: number, pageY: number, elementX: number, elementY: number } @@ -89,6 +93,10 @@ export const createWorkflowSlice: StateCreator = set => ({ }, pendingComment: null, setPendingComment: pendingComment => set(() => ({ pendingComment })), + isCommentPlacing: false, + setCommentPlacing: isCommentPlacing => set(() => ({ isCommentPlacing })), + isCommentQuickAdd: false, + setCommentQuickAdd: isCommentQuickAdd => set(() => ({ isCommentQuickAdd })), mousePosition: { pageX: 0, pageY: 0, elementX: 0, elementY: 0 }, setMousePosition: mousePosition => set(() => ({ mousePosition })), isCommentPreviewHovering: false, diff --git a/web/i18n/ar-TN/workflow.json b/web/i18n/ar-TN/workflow.json index fc1832a528..4b43251f31 100644 --- a/web/i18n/ar-TN/workflow.json +++ b/web/i18n/ar-TN/workflow.json @@ -105,6 +105,7 @@ "chatVariable.panelTitle": "متغيرات المحادثة", "chatVariable.storedContent": "المحتوى المخزن", "chatVariable.updatedAt": "تم التحديث في ", + "comments.actions.addComment": "أضف تعليقًا", "comments.actions.deleteReply": "حذف الرد", "comments.actions.editReply": "تعديل الرد", "comments.aria.closeComment": "إغلاق التعليق", diff --git a/web/i18n/de-DE/workflow.json b/web/i18n/de-DE/workflow.json index edcd6de494..376b865dbf 100644 --- a/web/i18n/de-DE/workflow.json +++ b/web/i18n/de-DE/workflow.json @@ -105,6 +105,7 @@ "chatVariable.panelTitle": "Gesprächsvariablen", "chatVariable.storedContent": "Gespeicherter Inhalt", "chatVariable.updatedAt": "Aktualisiert am ", + "comments.actions.addComment": "Kommentar hinzufügen", "comments.actions.deleteReply": "Antwort löschen", "comments.actions.editReply": "Antwort bearbeiten", "comments.aria.closeComment": "Kommentar schließen", diff --git a/web/i18n/en-US/workflow.json b/web/i18n/en-US/workflow.json index 27783c4362..706ed86b6f 100644 --- a/web/i18n/en-US/workflow.json +++ b/web/i18n/en-US/workflow.json @@ -109,6 +109,7 @@ "chatVariable.panelTitle": "Conversation Variables", "chatVariable.storedContent": "Stored content", "chatVariable.updatedAt": "Updated at ", + "comments.actions.addComment": "Add Comment", "comments.actions.deleteReply": "Delete reply", "comments.actions.editReply": "Edit reply", "comments.aria.closeComment": "Close comment", diff --git a/web/i18n/es-ES/workflow.json b/web/i18n/es-ES/workflow.json index 8056db3372..b72d831c73 100644 --- a/web/i18n/es-ES/workflow.json +++ b/web/i18n/es-ES/workflow.json @@ -105,6 +105,7 @@ "chatVariable.panelTitle": "Variables de Conversación", "chatVariable.storedContent": "Contenido almacenado", "chatVariable.updatedAt": "Actualizado el ", + "comments.actions.addComment": "Añadir comentario", "comments.actions.deleteReply": "Eliminar respuesta", "comments.actions.editReply": "Editar respuesta", "comments.aria.closeComment": "Cerrar comentario", diff --git a/web/i18n/fa-IR/workflow.json b/web/i18n/fa-IR/workflow.json index 71d1ccf2fd..67fde815ee 100644 --- a/web/i18n/fa-IR/workflow.json +++ b/web/i18n/fa-IR/workflow.json @@ -105,6 +105,7 @@ "chatVariable.panelTitle": "متغیرهای مکالمه", "chatVariable.storedContent": "محتوای ذخیره شده", "chatVariable.updatedAt": "به‌روزرسانی شده در ", + "comments.actions.addComment": "افزودن نظر", "comments.actions.deleteReply": "حذف پاسخ", "comments.actions.editReply": "ویرایش پاسخ", "comments.aria.closeComment": "بستن دیدگاه", diff --git a/web/i18n/fr-FR/workflow.json b/web/i18n/fr-FR/workflow.json index ae84ca68a1..8eb8e667c7 100644 --- a/web/i18n/fr-FR/workflow.json +++ b/web/i18n/fr-FR/workflow.json @@ -105,6 +105,7 @@ "chatVariable.panelTitle": "Variables de Conversation", "chatVariable.storedContent": "Contenu stocké", "chatVariable.updatedAt": "Mis à jour le ", + "comments.actions.addComment": "Ajouter un commentaire", "comments.actions.deleteReply": "Supprimer la réponse", "comments.actions.editReply": "Modifier la réponse", "comments.aria.closeComment": "Fermer le commentaire", diff --git a/web/i18n/hi-IN/workflow.json b/web/i18n/hi-IN/workflow.json index 86505941ac..b7a31276e6 100644 --- a/web/i18n/hi-IN/workflow.json +++ b/web/i18n/hi-IN/workflow.json @@ -105,6 +105,7 @@ "chatVariable.panelTitle": "वार्तालाप चर", "chatVariable.storedContent": "संग्रहीत सामग्री", "chatVariable.updatedAt": "अपडेट किया गया ", + "comments.actions.addComment": "टिप्पणी जोड़ें", "comments.actions.deleteReply": "जवाब हटाएं", "comments.actions.editReply": "जवाब संपादित करें", "comments.aria.closeComment": "टिप्पणी बंद करें", diff --git a/web/i18n/id-ID/workflow.json b/web/i18n/id-ID/workflow.json index 24b4050dad..6b2d478911 100644 --- a/web/i18n/id-ID/workflow.json +++ b/web/i18n/id-ID/workflow.json @@ -105,6 +105,7 @@ "chatVariable.panelTitle": "Variabel Percakapan", "chatVariable.storedContent": "Konten yang disimpan", "chatVariable.updatedAt": "Diperbarui pada", + "comments.actions.addComment": "Tambahkan komentar", "comments.actions.deleteReply": "Hapus balasan", "comments.actions.editReply": "Edit balasan", "comments.aria.closeComment": "Tutup komentar", diff --git a/web/i18n/it-IT/workflow.json b/web/i18n/it-IT/workflow.json index d0fafb15cf..eb39908750 100644 --- a/web/i18n/it-IT/workflow.json +++ b/web/i18n/it-IT/workflow.json @@ -105,6 +105,7 @@ "chatVariable.panelTitle": "Variabili di Conversazione", "chatVariable.storedContent": "Contenuto memorizzato", "chatVariable.updatedAt": "Aggiornato il ", + "comments.actions.addComment": "Aggiungi commento", "comments.actions.deleteReply": "Elimina risposta", "comments.actions.editReply": "Modifica risposta", "comments.aria.closeComment": "Chiudi commento", diff --git a/web/i18n/ja-JP/workflow.json b/web/i18n/ja-JP/workflow.json index 6849c74678..93fbdbfd90 100644 --- a/web/i18n/ja-JP/workflow.json +++ b/web/i18n/ja-JP/workflow.json @@ -105,6 +105,7 @@ "chatVariable.panelTitle": "会話変数", "chatVariable.storedContent": "保存内容", "chatVariable.updatedAt": "最終更新:", + "comments.actions.addComment": "コメントを追加", "comments.actions.deleteReply": "返信を削除", "comments.actions.editReply": "返信を編集", "comments.aria.closeComment": "コメントを閉じる", diff --git a/web/i18n/ko-KR/workflow.json b/web/i18n/ko-KR/workflow.json index 78305f33c1..0b7b4f7c30 100644 --- a/web/i18n/ko-KR/workflow.json +++ b/web/i18n/ko-KR/workflow.json @@ -105,6 +105,7 @@ "chatVariable.panelTitle": "대화 변수", "chatVariable.storedContent": "저장된 내용", "chatVariable.updatedAt": "업데이트 시간: ", + "comments.actions.addComment": "댓글 추가", "comments.actions.deleteReply": "답글 삭제", "comments.actions.editReply": "답글 편집", "comments.aria.closeComment": "댓글 닫기", diff --git a/web/i18n/pl-PL/workflow.json b/web/i18n/pl-PL/workflow.json index 7ed1ae3910..40d70e1a0d 100644 --- a/web/i18n/pl-PL/workflow.json +++ b/web/i18n/pl-PL/workflow.json @@ -105,6 +105,7 @@ "chatVariable.panelTitle": "Zmienne Konwersacji", "chatVariable.storedContent": "Przechowywana zawartość", "chatVariable.updatedAt": "Zaktualizowano ", + "comments.actions.addComment": "Dodaj komentarz", "comments.actions.deleteReply": "Delete reply", "comments.actions.editReply": "Edit reply", "comments.aria.closeComment": "Close comment", diff --git a/web/i18n/pt-BR/workflow.json b/web/i18n/pt-BR/workflow.json index 9c28cef6c0..fd505ae6ab 100644 --- a/web/i18n/pt-BR/workflow.json +++ b/web/i18n/pt-BR/workflow.json @@ -105,6 +105,7 @@ "chatVariable.panelTitle": "Variáveis de Conversação", "chatVariable.storedContent": "Conteúdo armazenado", "chatVariable.updatedAt": "Atualizado em ", + "comments.actions.addComment": "Adicionar comentário", "comments.actions.deleteReply": "Delete reply", "comments.actions.editReply": "Edit reply", "comments.aria.closeComment": "Close comment", diff --git a/web/i18n/ro-RO/workflow.json b/web/i18n/ro-RO/workflow.json index 252bb43737..ad5eb0e2a9 100644 --- a/web/i18n/ro-RO/workflow.json +++ b/web/i18n/ro-RO/workflow.json @@ -105,6 +105,7 @@ "chatVariable.panelTitle": "Variabile de Conversație", "chatVariable.storedContent": "Conținut stocat", "chatVariable.updatedAt": "Actualizat la ", + "comments.actions.addComment": "Adaugă comentariu", "comments.actions.deleteReply": "Delete reply", "comments.actions.editReply": "Edit reply", "comments.aria.closeComment": "Close comment", diff --git a/web/i18n/ru-RU/workflow.json b/web/i18n/ru-RU/workflow.json index e72b449b4a..1aaf092040 100644 --- a/web/i18n/ru-RU/workflow.json +++ b/web/i18n/ru-RU/workflow.json @@ -105,6 +105,7 @@ "chatVariable.panelTitle": "Переменные разговора", "chatVariable.storedContent": "Сохраненный контент", "chatVariable.updatedAt": "Обновлено в ", + "comments.actions.addComment": "Добавить комментарий", "comments.actions.deleteReply": "Delete reply", "comments.actions.editReply": "Edit reply", "comments.aria.closeComment": "Close comment", diff --git a/web/i18n/sl-SI/workflow.json b/web/i18n/sl-SI/workflow.json index 156ccfae21..f9e2305bd3 100644 --- a/web/i18n/sl-SI/workflow.json +++ b/web/i18n/sl-SI/workflow.json @@ -105,6 +105,7 @@ "chatVariable.panelTitle": "Pogovor Spremenljivke", "chatVariable.storedContent": "Shranjena vsebina", "chatVariable.updatedAt": "Posodobljeno ob", + "comments.actions.addComment": "Dodaj komentar", "comments.actions.deleteReply": "Delete reply", "comments.actions.editReply": "Edit reply", "comments.aria.closeComment": "Close comment", diff --git a/web/i18n/th-TH/workflow.json b/web/i18n/th-TH/workflow.json index 02a341f2d1..5fb38aa5a6 100644 --- a/web/i18n/th-TH/workflow.json +++ b/web/i18n/th-TH/workflow.json @@ -105,6 +105,7 @@ "chatVariable.panelTitle": "ตัวแปรการสนทนา", "chatVariable.storedContent": "เนื้อหาที่เก็บไว้", "chatVariable.updatedAt": "อัพเดทเมื่อ", + "comments.actions.addComment": "เพิ่มความคิดเห็น", "comments.actions.deleteReply": "Delete reply", "comments.actions.editReply": "Edit reply", "comments.aria.closeComment": "Close comment", diff --git a/web/i18n/tr-TR/workflow.json b/web/i18n/tr-TR/workflow.json index eb6e697264..1d8fdd8705 100644 --- a/web/i18n/tr-TR/workflow.json +++ b/web/i18n/tr-TR/workflow.json @@ -105,6 +105,7 @@ "chatVariable.panelTitle": "Konuşma Değişkenleri", "chatVariable.storedContent": "Depolanan içerik", "chatVariable.updatedAt": "Güncellenme zamanı: ", + "comments.actions.addComment": "Yorum ekle", "comments.actions.deleteReply": "Delete reply", "comments.actions.editReply": "Edit reply", "comments.aria.closeComment": "Close comment", diff --git a/web/i18n/uk-UA/workflow.json b/web/i18n/uk-UA/workflow.json index bf2a7bb8c1..16ef13068f 100644 --- a/web/i18n/uk-UA/workflow.json +++ b/web/i18n/uk-UA/workflow.json @@ -105,6 +105,7 @@ "chatVariable.panelTitle": "Змінні розмови", "chatVariable.storedContent": "Збережений вміст", "chatVariable.updatedAt": "Оновлено ", + "comments.actions.addComment": "Додати коментар", "comments.actions.deleteReply": "Delete reply", "comments.actions.editReply": "Edit reply", "comments.aria.closeComment": "Close comment", diff --git a/web/i18n/vi-VN/workflow.json b/web/i18n/vi-VN/workflow.json index 27b06278e4..aa17a025fa 100644 --- a/web/i18n/vi-VN/workflow.json +++ b/web/i18n/vi-VN/workflow.json @@ -105,6 +105,7 @@ "chatVariable.panelTitle": "Biến Hội Thoại", "chatVariable.storedContent": "Nội dung đã lưu", "chatVariable.updatedAt": "Cập nhật lúc ", + "comments.actions.addComment": "Thêm bình luận", "comments.actions.deleteReply": "Delete reply", "comments.actions.editReply": "Edit reply", "comments.aria.closeComment": "Close comment", diff --git a/web/i18n/zh-Hans/workflow.json b/web/i18n/zh-Hans/workflow.json index 9736dbd804..5401b3762e 100644 --- a/web/i18n/zh-Hans/workflow.json +++ b/web/i18n/zh-Hans/workflow.json @@ -107,6 +107,7 @@ "chatVariable.panelTitle": "会话变量", "chatVariable.storedContent": "存储内容", "chatVariable.updatedAt": "更新时间 ", + "comments.actions.addComment": "添加评论", "comments.actions.deleteReply": "删除回复", "comments.actions.editReply": "编辑回复", "comments.aria.closeComment": "关闭评论", diff --git a/web/i18n/zh-Hant/workflow.json b/web/i18n/zh-Hant/workflow.json index 056786a277..0f9053eb2d 100644 --- a/web/i18n/zh-Hant/workflow.json +++ b/web/i18n/zh-Hant/workflow.json @@ -105,6 +105,7 @@ "chatVariable.panelTitle": "對話變數", "chatVariable.storedContent": "已儲存內容", "chatVariable.updatedAt": "更新於 ", + "comments.actions.addComment": "新增評論", "comments.actions.deleteReply": "刪除回覆", "comments.actions.editReply": "編輯回覆", "comments.aria.closeComment": "關閉評論",