From e378be6575af2cd716c0e8b286a52dd57fc3777e Mon Sep 17 00:00:00 2001 From: relhamdi Date: Mon, 15 Jun 2026 10:44:17 +0200 Subject: [PATCH] Add new PromptAddOrReplace node --- src/nodes/prompt_add_or_replace.py | 58 ++++++++++++++++++++++++++++++ web/prompt_add_or_replace.js | 50 ++++++++++++++++++++++++++ 2 files changed, 108 insertions(+) create mode 100644 src/nodes/prompt_add_or_replace.py create mode 100644 web/prompt_add_or_replace.js diff --git a/src/nodes/prompt_add_or_replace.py b/src/nodes/prompt_add_or_replace.py new file mode 100644 index 0000000..9d6d84d --- /dev/null +++ b/src/nodes/prompt_add_or_replace.py @@ -0,0 +1,58 @@ +from ..config import EMPTY_VALUE, NODE_CATEGORY +from ..utils import clean_prompt + + +class PromptAddOrReplace: + """ + Adds or replaces the input string with the selected option. + """ + + CATEGORY = NODE_CATEGORY + + @classmethod + def INPUT_TYPES(cls): + return { + "required": { + "join": ("STRING", {"default": ", "}), + "mode_toggle": ( + "BOOLEAN", + {"default": True, "label_on": "Add", "label_off": "Replace"}, + ), + "options": ("STRING", {"multiline": True, "default": ""}), + "selected": ("STRING", {"default": ""}), + }, + "optional": { + "input": ("STRING", {"forceInput": True}), + }, + } + + RETURN_TYPES = ("STRING",) + RETURN_NAMES = ("text",) + FUNCTION = "process" + + def process(self, join, mode_toggle, options, selected, input=""): + v = selected.strip() + if v == EMPTY_VALUE: + v = "" + inp = input.strip() if input else "" + + # If mode_toggle, mode = append, else replace + if mode_toggle: + if not v: + return (inp,) + if not inp: + return (v,) + return (clean_prompt(inp + join + v),) + else: + if not v: + return ("",) + return (v,) + + +NODE_CLASS_MAPPINGS = { + "PromptAddOrReplace": PromptAddOrReplace, +} + +NODE_DISPLAY_NAME_MAPPINGS = { + "PromptAddOrReplace": "Prompt Add or Replace", +} diff --git a/web/prompt_add_or_replace.js b/web/prompt_add_or_replace.js new file mode 100644 index 0000000..c1bc7f8 --- /dev/null +++ b/web/prompt_add_or_replace.js @@ -0,0 +1,50 @@ +import { COLORS } from "./constants.js"; +import { attachInlineSelector } from "./inline_selector.js"; +import { + drawGroupBorder, + findWidget, + hideWidget, + registerNode, + waitForWidget, +} from "./utils.js"; + +// --- Constants --- + +const NODE_NAME = "PromptAddOrReplace"; + +// --- Attach --- + +const attachAddOrReplace = (node) => { + const optionsWidget = findWidget(node, "options"); + const selectedWidget = findWidget(node, "selected"); + const modeToggleWidget = findWidget(node, "mode_toggle"); + + if (!optionsWidget || !selectedWidget || !modeToggleWidget) return; + + hideWidget(selectedWidget); + + // Inline selector + attachInlineSelector(node, optionsWidget, selectedWidget, { + placeholder: "options", + }); + + // Border around toggle + const original = node.onDrawForeground; + node.onDrawForeground = function (ctx) { + if (original) original.call(this, ctx); + drawGroupBorder( + ctx, + node, + "mode_toggle", + "mode_toggle", + COLORS.toggle_on, + COLORS.toggle_off, + ); + }; +}; + +// --- Registration --- + +registerNode(NODE_NAME, (node) => + waitForWidget(node, "options", attachAddOrReplace), +);