From 3d85f7196bc7b2ebd50f348163d6ae38dc9df105 Mon Sep 17 00:00:00 2001 From: 1AhmedYasser <26207361+1AhmedYasser@users.noreply.github.com> Date: Mon, 2 Feb 2026 10:17:27 +0200 Subject: [PATCH 1/4] fix(827): Added Tab Spaces fix --- .../FormElements/FormRichText/index.tsx | 23 ++++++++++++++++++- GUI/src/components/Markdowify/index.tsx | 3 ++- GUI/src/services/service-builder.ts | 13 +++++++---- 3 files changed, 32 insertions(+), 7 deletions(-) diff --git a/GUI/src/components/FormElements/FormRichText/index.tsx b/GUI/src/components/FormElements/FormRichText/index.tsx index d686788d6..286ac1333 100644 --- a/GUI/src/components/FormElements/FormRichText/index.tsx +++ b/GUI/src/components/FormElements/FormRichText/index.tsx @@ -1,4 +1,4 @@ -import { FC, Ref } from 'react'; +import { FC, Ref, useEffect } from 'react'; import ReactQuill from 'react-quill'; import 'react-quill/dist/quill.snow.css'; import './FormRichText.scss'; @@ -19,6 +19,27 @@ const FormRichText: FC = ({ defaultValue, onChange, quill }) ], }; + useEffect(() => { + if (!quill || !('current' in quill) || !quill.current) return; + + const quillInstance = quill.current.getEditor(); + const editorElement = quillInstance.root; + + const handleTabKey = (e: KeyboardEvent) => { + if (e.key === 'Tab' && !e.shiftKey && !e.ctrlKey && !e.metaKey && !e.altKey) { + e.preventDefault(); + const selection = quillInstance.getSelection(true); + if (selection) { + quillInstance.insertText(selection.index, ' ', 'user'); + quillInstance.setSelection({ index: selection.index + 4, length: 0 }); + } + } + }; + + editorElement.addEventListener('keydown', handleTabKey, true); + return () => editorElement.removeEventListener('keydown', handleTabKey, true); + }, [quill]); + return ( match.replaceAll(' ', ' ')); } const Markdownify: React.FC = ({ message, sanitizeLinks = false }) => ( diff --git a/GUI/src/services/service-builder.ts b/GUI/src/services/service-builder.ts index 38ce27863..f328d32c5 100644 --- a/GUI/src/services/service-builder.ts +++ b/GUI/src/services/service-builder.ts @@ -578,14 +578,17 @@ function handleTextField( ], }); + const spacePlaceholder = '___SPACE___'; + const markdownMessage = htmlToMarkdown.translate( + typeof parentNode.data.message === 'string' + ? parentNode.data.message.replace('{{', '${').replace('}}', '}').replaceAll(' ', spacePlaceholder) + : '', + ).replaceAll(spacePlaceholder, ' '); + finishedFlow.set(parentStepName, { assign: { res: { - result: `${htmlToMarkdown.translate( - typeof parentNode.data.message === 'string' - ? parentNode.data.message.replace('{{', '${').replace('}}', '}') - : '', - )}`, + result: markdownMessage, }, }, next: childNode ? toSnakeCase(childNode.data.label ?? 'format_messages') : 'format_messages', From fabf3d36696b44af568f6177facd8d78c2ab76e7 Mon Sep 17 00:00:00 2001 From: 1AhmedYasser <26207361+1AhmedYasser@users.noreply.github.com> Date: Wed, 4 Feb 2026 16:39:44 +0200 Subject: [PATCH 2/4] fix(827): Fixed special characters --- GUI/src/components/Markdowify/index.tsx | 6 ++++++ GUI/src/services/service-builder.ts | 13 ++++++++----- 2 files changed, 14 insertions(+), 5 deletions(-) diff --git a/GUI/src/components/Markdowify/index.tsx b/GUI/src/components/Markdowify/index.tsx index 6849c5972..ac6efa324 100644 --- a/GUI/src/components/Markdowify/index.tsx +++ b/GUI/src/components/Markdowify/index.tsx @@ -55,6 +55,12 @@ function formatMessage(message?: string): string { return filteredMessage .replaceAll(/&#x([0-9A-Fa-f]+);/g, (_, hex: string) => String.fromCharCode(parseInt(hex, 16))) + .replaceAll('&', '&') + .replaceAll('>', '>') + .replaceAll('<', '<') + .replaceAll('"', '"') + .replaceAll(''', "'") + .replaceAll(''', "'") .replaceAll(/(^|\n)(\d{4})\.\s/g, (match, prefix, year) => { const remainingText = filteredMessage.substring(filteredMessage.indexOf(match) + match.length); const sentenceEnd = remainingText.indexOf('\n\n'); diff --git a/GUI/src/services/service-builder.ts b/GUI/src/services/service-builder.ts index b4d84ab12..f1d99ab2e 100644 --- a/GUI/src/services/service-builder.ts +++ b/GUI/src/services/service-builder.ts @@ -602,11 +602,14 @@ function handleTextField( }); const spacePlaceholder = '___SPACE___'; - const markdownMessage = htmlToMarkdown.translate( - typeof parentNode.data.message === 'string' - ? parentNode.data.message.replace('{{', '${').replace('}}', '}').replaceAll(' ', spacePlaceholder) - : '', - ).replaceAll(spacePlaceholder, ' '); + const markdownMessage = htmlToMarkdown + .translate( + typeof parentNode.data.message === 'string' + ? parentNode.data.message.replace('{{', '${').replace('}}', '}').replaceAll(' ', spacePlaceholder) + : '', + ) + .replaceAll(spacePlaceholder, ' ') + .replaceAll(/\\([-~>[\]_*#().!`=<\\])/g, String.raw`\\$1`);; finishedFlow.set(parentStepName, { assign: { From 87c6198e602469ea8936a05014615c96cff7e054 Mon Sep 17 00:00:00 2001 From: 1AhmedYasser <26207361+1AhmedYasser@users.noreply.github.com> Date: Wed, 4 Feb 2026 16:40:12 +0200 Subject: [PATCH 3/4] fix(827): Fixed format --- GUI/src/services/service-builder.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/GUI/src/services/service-builder.ts b/GUI/src/services/service-builder.ts index f1d99ab2e..f2fb42fc5 100644 --- a/GUI/src/services/service-builder.ts +++ b/GUI/src/services/service-builder.ts @@ -609,7 +609,7 @@ function handleTextField( : '', ) .replaceAll(spacePlaceholder, ' ') - .replaceAll(/\\([-~>[\]_*#().!`=<\\])/g, String.raw`\\$1`);; + .replaceAll(/\\([-~>[\]_*#().!`=<\\])/g, String.raw`\\$1`); finishedFlow.set(parentStepName, { assign: { From 58680bad9b31b49a7f4574048ef29629d621368f Mon Sep 17 00:00:00 2001 From: 1AhmedYasser <26207361+1AhmedYasser@users.noreply.github.com> Date: Thu, 5 Feb 2026 10:58:45 +0200 Subject: [PATCH 4/4] fix(827): Fixed yes/no service break --- GUI/src/services/service-builder.ts | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/GUI/src/services/service-builder.ts b/GUI/src/services/service-builder.ts index f2fb42fc5..a8df4b550 100644 --- a/GUI/src/services/service-builder.ts +++ b/GUI/src/services/service-builder.ts @@ -611,10 +611,17 @@ function handleTextField( .replaceAll(spacePlaceholder, ' ') .replaceAll(/\\([-~>[\]_*#().!`=<\\])/g, String.raw`\\$1`); + let finalMessage = markdownMessage; + const trimmedMessage = markdownMessage.trim().toLowerCase(); + + if (trimmedMessage === 'yes' || trimmedMessage === 'no') { + finalMessage = `\${"${trimmedMessage}"}`; + } + finishedFlow.set(parentStepName, { assign: { res: { - result: markdownMessage, + result: finalMessage, }, }, next: childNode ? toSnakeCase(childNode.data.label ?? 'format_messages') : 'format_messages',