From 84138cd46e7eac0840410f95d57a8d63cb4c6336 Mon Sep 17 00:00:00 2001 From: Vito Sansevero Date: Mon, 4 Aug 2025 13:21:49 -0700 Subject: [PATCH] feat: complete rewrite of XYZ Plot Controller UI using custom HTML interface - Replace problematic widget-based UI with full HTML interface - Fix overlapping buttons and spacing issues - Add proper multi-select dialogs with search functionality - Implement Select All/Clear All buttons in dialogs - Hide original widgets to prevent conflicts - Add visual grouping for X/Y/Z axes - Improve responsive layout and styling - Maintain sync with underlying widget values --- ss.png | Bin 0 -> 46987 bytes ss2.png | Bin 0 -> 74548 bytes web/xyz_plot_controller.js | 877 +++++++++++++++++---------------- web/xyz_plot_controller_old.js | 626 +++++++++++++++++++++++ 4 files changed, 1083 insertions(+), 420 deletions(-) create mode 100644 ss.png create mode 100644 ss2.png create mode 100644 web/xyz_plot_controller_old.js diff --git a/ss.png b/ss.png new file mode 100644 index 0000000000000000000000000000000000000000..f4d0db072122fd0f8726fede85dfbb0070478446 GIT binary patch literal 46987 zcmb4rWmFu|mTn-pJ0w_eYa}GNySuvwclQ86f(8POySuxmAy{yCcemj1ihJ+On^|vW zy>)*8>-0I*RY&&T-}miZd{>m0Kt+0w^ybYQR4GYOVcKz^t%JP(q?gqDqdZ zuEaO@o!*Zp?fN%@7_hyJDlnqDw1lR}H5_#=i6;e?m;SzJ{8Umusco@S8dfj8dX1ej zKCSHXX6}0bzU1>Oek-B*rpt!?68*}n{azWM}=r%Y9){?LF$#GPaq+G>u+;JVJxcDimY<)2r5 zNTUW*tHhQB_8JFdW@b(v%)Q9RekKrJF6Ljtkumdu?tF3t*ObCp@134Z6=i!iwX6_l zJ57IF9)PIn>E(})t?F%`qQNV~2Y`BOT=-HPdl%F)uM+;csiA3HmtCGpYote%x_Umg zToD#f{s=E+dXP(C1heKx;o-EXOKGs#7q|U#6#lV0jp;W|ulTL-i{qkn-k*&LqIAbx)3>V3d(9OFFBQ72oA)JMX zQKbqaw2Ket&j&k6>gUIustgRGlIIAZm%uNqWT`&qEAV86gu_CIf-DcN- z2tu+9_fP}IltA?f7tW~@j4a8cXPt~ce@tn=j_Yc?q<=JILJaICh

C-`U|s>o-zU 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�`Ec9gAc?IQ=*;17~3f=O#TXg1`#RKTV zzy#1el`l(o#E<1R{xi6>ki(P-z~g2$t!nDop5H;zhozL--+w0%U;QQC^Xb3aVmTw= zgkU*ClQJ=@0?;@X{JeSd<_m-7Z}p5FAKH0Vq})P7Erwyli>QZV|2k; ztzkHU|5^SgFWtT1@2M?9*KF!pl?jpQAlwdg-yFSpc0!;h?AJ@X+SB!t-V|sfJSz!k z0#2aBfTcjBnpWdl-HTFi0<*Z^vwvh(5dKt=kv8ZvqmHebq6GJ+uLdVI7aO;R6|$`J z6aGfpck~*^?U+%QT(bs^Yzu1T--hGyMe;=*=aqr3_H!`_S_SkEz35bgid9*Q-aqP! z%-U;^V$r1jcwQ*J%#2!`y4<5}>r32V@afEDJ_tCX>TO>CQBV@Q3tAq3H{JaMC0(M$ z+h7>H3iC65#oD+3; z$&^)3dFqZEl|iniXA=3h2eq~&{i1Fl`qlY#5rkF0Tv!OD*|d86oMIq9??bKPBbiR| z_FY!RLydrRo0_fko~L^mr8`_sxuQ`QQB%T(`}ZQM?189Ld)wG%qR(LF5R!?g0ARoU_5 zO`Qx=89MBK)ug)%E^ep07e7udNOvPI6I)&|(7t<6VJPd-+&?D#gw+>7{Grz`ag%$p zk&7DQD06uwdEN@K)iIQMXOxP4WK&%Gy8Eh|wnLNk!knA=SaYjLFw-e2`OY{kpp?EJ+=0Y7iqxR89FUwWy;4 zulwx&27T6(%~AbwdkGUXe6vGW(l!bny+~e9K+mtArfJlPoVzxmnEysD4(&g~M^t5} zbJPGYnQx&ci8Lm^i>NdDOgdY}Io893nO_gSxtMy9G}-WDuc~rFapx;E%P2TEL15j- z+V&cLZuE{X8r(wA?;$qlt7tLh>aLi z_+(w1-8R-o8^TYa3Y$bF_x$%V5w>B2Ug4SUqK8&RRH+f;zX_b&QkSuooU(8aItrtAJ>Z)(4QkBee}bIkpgg?A{%vh%4i;b!U^VOsTG z343q050Z?U6nN80N`352Vhs8r{M$S~WzeDn$FSlXgGJn;uthI>)(Z8j*iuLVUd^*{ Za?9+G#W$T#Jg2}Pq_P^KQ0e)b{{u*zPTl|j literal 0 HcmV?d00001 diff --git a/ss2.png b/ss2.png new file mode 100644 index 0000000000000000000000000000000000000000..79bcc5c4f8757cb2e468d5cc079f07716e9c35e7 GIT binary patch literal 74548 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 { - console.log("[XYZ Plot Controller] Setting up enhanced UI..."); - if (!this.setupComplete) { - setupEnhancedUI(this); - this.setupComplete = true; - } - }, 100); - }; - - // Handle widget changes - const onWidgetChange = nodeType.prototype.onWidgetChange; - nodeType.prototype.onWidgetChange = function(name, value, oldValue, widget) { - if (onWidgetChange) { - onWidgetChange.call(this, name, value, oldValue, widget); - } - - // Handle axis type changes - if (name.endsWith('_axis_type')) { - const axisPrefix = name.split('_')[0]; - const valueWidgetName = `${axisPrefix}_values`; - console.log(`[XYZ Plot Controller] Axis type changed: ${name} = ${value}`); - updateValueWidget(this, valueWidgetName, value); - } - - // Update total count for any value change - if (name.includes('_values') || name.includes('_axis_type')) { - updateImageCount(this); - } - }; - } - } -}); - -// Parameter information -const parameterInfo = { - none: { description: "No parameter selected" }, +// Parameter definitions +const PARAM_INFO = { + none: { + description: "No parameter selected", + hasOptions: false + }, model: { description: "Checkpoint/Model files", - example: "Click 'Select Models' to choose multiple checkpoints", - hasOptions: true + hasOptions: true, + inputNames: ['ckpt_name', 'checkpoint', 'model_name', 'unet_name'] }, vae: { description: "VAE models", - example: "Click 'Select Vaes' to choose VAEs\n'Automatic' uses the model's built-in VAE", - hasOptions: true + hasOptions: true, + inputNames: ['vae_name', 'vae'], + addDefault: "Automatic" }, lora: { description: "LoRA models", - example: "Click 'Select Loras' to choose LoRAs\n'None' disables LoRA", - hasOptions: true + hasOptions: true, + inputNames: ['lora_name', 'lora'], + addDefault: "None" }, sampler: { description: "Sampling algorithms", - example: "Click 'Select Samplers' to choose sampling methods", - hasOptions: true + hasOptions: true, + inputNames: ['sampler_name', 'sampler'] }, scheduler: { description: "Noise schedulers", - example: "Click 'Select Schedulers' to choose scheduler types", - hasOptions: true + hasOptions: true, + inputNames: ['scheduler', 'scheduler_name'] }, cfg_scale: { - description: "CFG Scale (Classifier-Free Guidance)", - example: "Examples:\n5, 7.5, 10, 12.5\n5:15:2.5 (range from 5 to 15, step 2.5)" + description: "CFG Scale values", + example: "Examples: 5, 7.5, 10\nRange: 5:15:2.5" }, steps: { - description: "Denoising steps", - example: "Examples:\n20, 30, 40, 50\n10:50:10 (range)" - }, - clip_skip: { - description: "CLIP layers to skip", - example: "Common values: 1, 2\nSDXL typically uses 1 or 2" + description: "Sampling steps", + example: "Examples: 20, 30, 40\nRange: 10:50:10" }, seed: { - description: "Random seed", - example: "Examples:\n42, 123, 456\n0:1000:100 (range)" + description: "Random seeds", + example: "Examples: 42, 123, 456\nRange: 0:1000:100" }, denoise: { description: "Denoising strength", - example: "Examples:\n0.3, 0.5, 0.7, 1.0\n0.2:1.0:0.2 (range)" + example: "Examples: 0.3, 0.5, 0.7\nRange: 0.2:1.0:0.2" }, flux_guidance: { description: "Flux guidance strength", - example: "Examples:\n1.0, 2.0, 3.5, 5.0\n1:5:0.5 (range)" + example: "Examples: 1.0, 3.5, 5.0\nRange: 1:5:0.5" }, prompt: { - description: "Text prompts (one per line)", - example: "Enter different prompts, one per line:\n\na beautiful sunset\na mystical forest\na futuristic city" + description: "Text prompts", + example: "Enter one prompt per line:\n\na beautiful sunset\na mystical forest" } }; -// Generic function to find options from any node type -async function findOptionsForParameter(paramType) { +// Get options for parameter types +async function getParameterOptions(paramType) { + if (!PARAM_INFO[paramType]?.hasOptions) return []; + try { - console.log(`[XYZ Plot Controller] Finding options for ${paramType}`); const resp = await fetch('/object_info'); const data = await resp.json(); - // Map parameter types to common input names - const parameterMappings = { - model: ['ckpt_name', 'checkpoint', 'model_name', 'unet_name'], - vae: ['vae_name', 'vae'], - lora: ['lora_name', 'lora'], - sampler: ['sampler_name', 'sampler'], - scheduler: ['scheduler', 'scheduler_name'], - // Add more mappings as needed - }; - - const possibleNames = parameterMappings[paramType] || [paramType]; + const inputNames = PARAM_INFO[paramType].inputNames || [paramType]; let allOptions = []; - // Search through all nodes for matching inputs + // Search through all nodes for (const [nodeName, nodeData] of Object.entries(data)) { if (nodeData.input?.required) { for (const [inputName, inputDef] of Object.entries(nodeData.input.required)) { - // Check if this input name matches what we're looking for - if (possibleNames.includes(inputName)) { - // Check if it's a list (array as first element) - if (Array.isArray(inputDef[0])) { - console.log(`[XYZ Plot Controller] Found ${paramType} options in ${nodeName}.${inputName}`); - allOptions = [...new Set([...allOptions, ...inputDef[0]])]; - } + if (inputNames.includes(inputName) && Array.isArray(inputDef[0])) { + allOptions = [...new Set([...allOptions, ...inputDef[0]])]; } } } } - console.log(`[XYZ Plot Controller] Total ${paramType} options found:`, allOptions.length); + // Add default option if specified + if (PARAM_INFO[paramType].addDefault) { + allOptions.unshift(PARAM_INFO[paramType].addDefault); + } + return allOptions; } catch (e) { - console.error(`[XYZ Plot Controller] Error finding options for ${paramType}:`, e); + console.error(`Error fetching ${paramType} options:`, e); return []; } } -function createParameterHelpers() { - return { - model: { - getOptions: async () => { - const options = await findOptionsForParameter('model'); - return options.length > 0 ? options : []; - } - }, - vae: { - getOptions: async () => { - const options = await findOptionsForParameter('vae'); - // Add "Automatic" as first option for VAEs - return ["Automatic", ...options]; - } - }, - lora: { - getOptions: async () => { - const options = await findOptionsForParameter('lora'); - // Add "None" as first option for LoRAs - return ["None", ...options]; - } - }, - sampler: { - getOptions: async () => { - const options = await findOptionsForParameter('sampler'); - return options.length > 0 ? options : - ["euler", "euler_ancestral", "heun", "dpm_2", "dpm_2_ancestral", - "lms", "dpm_fast", "dpm_adaptive", "dpmpp_2s_ancestral", - "dpmpp_sde", "dpmpp_2m", "dpmpp_2m_sde", "ddim", "uni_pc"]; - } - }, - scheduler: { - getOptions: async () => { - const options = await findOptionsForParameter('scheduler'); - return options.length > 0 ? options : - ["normal", "karras", "exponential", "sgm_uniform", "simple", "ddim_uniform"]; - } - } - }; -} - -function setupEnhancedUI(node) { - console.log("[XYZ Plot Controller] setupEnhancedUI called for node:", node); - - // Add custom UI container - const container = document.createElement("div"); - container.style.cssText = ` - padding: 10px; - background: #1e1e1e; - border-radius: 6px; - margin: 10px 5px; - border: 1px solid #333; - `; - - // Add info display - const infoDiv = document.createElement("div"); - infoDiv.id = "xyz-info-display"; - infoDiv.style.cssText = ` - background: #2a2a2a; - padding: 8px; - border-radius: 4px; - margin-bottom: 10px; - font-size: 12px; - color: #ccc; - display: none; - `; - container.appendChild(infoDiv); - - // Add total count display - const countDiv = document.createElement("div"); - countDiv.id = "xyz-count-display"; - countDiv.style.cssText = ` - background: #2a2a2a; - padding: 8px; - border-radius: 4px; - text-align: center; - font-weight: bold; - color: #4ecdc4; - `; - countDiv.textContent = "Total Images: 0"; - container.appendChild(countDiv); - - console.log("[XYZ Plot Controller] Adding DOM widget..."); - - // Add widget - try { - node.addDOMWidget("xyz_ui", "div", container); - console.log("[XYZ Plot Controller] DOM widget added successfully"); - } catch (error) { - console.error("[XYZ Plot Controller] Error adding DOM widget:", error); - } - - // Setup axis handlers - ['x', 'y', 'z'].forEach(axis => { - const typeWidget = node.widgets.find(w => w.name === `${axis}_axis_type`); - const valueWidget = node.widgets.find(w => w.name === `${axis}_values`); - - console.log(`[XYZ Plot Controller] Setting up ${axis} axis - type: ${typeWidget?.value}`); - - if (typeWidget && valueWidget) { - // Initial setup - if (typeWidget.value && typeWidget.value !== 'none') { - updateValueWidget(node, `${axis}_values`, typeWidget.value); - } - - // Force widget callback setup - if (!typeWidget._xyz_initialized) { - typeWidget._xyz_initialized = true; - const originalCallback = typeWidget.callback; - typeWidget.callback = function(value) { - console.log(`[XYZ Plot Controller] ${axis}_axis_type changed to: ${value}`); - updateValueWidget(node, `${axis}_values`, value); - updateImageCount(node); - if (originalCallback) { - originalCallback.call(this, value); - } - }; - } - } - }); - - // Initial count update - updateImageCount(node); -} - -function updateValueWidget(node, widgetName, paramType) { - console.log(`[XYZ Plot Controller] updateValueWidget called: ${widgetName} -> ${paramType}`); - - const widget = node.widgets.find(w => w.name === widgetName); - if (!widget) { - console.error(`[XYZ Plot Controller] Widget ${widgetName} not found`); - return; - } - - // Always remove existing custom elements first - const existingDiv = node.element?.querySelector(`#${widgetName}-custom`); - if (existingDiv) { - console.log(`[XYZ Plot Controller] Removing existing button for ${widgetName}`); - existingDiv.remove(); - } - - const info = parameterInfo[paramType]; - if (!info || paramType === 'none') { - // Hide info display if no parameter selected - const infoDiv = node.element?.querySelector('#xyz-info-display'); - if (infoDiv) { - infoDiv.style.display = 'none'; - } - return; - } - - // Update info display - const infoDiv = node.element?.querySelector('#xyz-info-display'); - if (infoDiv) { - infoDiv.style.display = 'block'; - infoDiv.innerHTML = ` -

- ${paramType.toUpperCase()} -
-
${info.description}
- ${info.example || ''} - `; - } - - // Add select button for options-based parameters - if (info.hasOptions && node.parameterHelpers[paramType]) { - console.log(`[XYZ Plot Controller] Creating select button for ${paramType}`); - - // Create new button - let customDiv = document.createElement("div"); - customDiv.id = `${widgetName}-custom`; - customDiv.style.cssText = ` - margin-top: 5px; - margin-bottom: 15px; - padding-bottom: 10px; - `; - - const selectBtn = document.createElement("button"); - // Better pluralization - const buttonLabels = { - model: "Select Models", - vae: "Select VAEs", - lora: "Select LoRAs", - sampler: "Select Samplers", - scheduler: "Select Schedulers" - }; - selectBtn.textContent = `📁 ${buttonLabels[paramType] || `Select ${paramType}s`}`; - selectBtn.style.cssText = ` - padding: 6px 12px; - background: #4a90e2; - color: white; - border: none; - border-radius: 4px; - cursor: pointer; - font-size: 12px; - width: 100%; - box-shadow: 0 2px 4px rgba(0,0,0,0.2); - transition: all 0.2s; - `; - - selectBtn.onmouseenter = () => { - selectBtn.style.background = "#357abd"; - selectBtn.style.transform = "translateY(-1px)"; - selectBtn.style.boxShadow = "0 3px 6px rgba(0,0,0,0.3)"; - }; - - selectBtn.onmouseleave = () => { - selectBtn.style.background = "#4a90e2"; - selectBtn.style.transform = "translateY(0)"; - selectBtn.style.boxShadow = "0 2px 4px rgba(0,0,0,0.2)"; - }; - - selectBtn.onclick = async (e) => { - e.preventDefault(); - e.stopPropagation(); - console.log(`[XYZ Plot Controller] Getting ${paramType} options...`); - const options = await node.parameterHelpers[paramType].getOptions(); - console.log(`[XYZ Plot Controller] Got ${options.length} ${paramType} options:`, options); - showSelectDialog(options, widget, paramType); - }; - - customDiv.appendChild(selectBtn); - - // Insert after widget - const widgetElement = widget.inputEl || widget.element; - console.log(`[XYZ Plot Controller] Widget element for ${widgetName}:`, widgetElement); - console.log(`[XYZ Plot Controller] Widget parent:`, widgetElement?.parentElement); - - if (widgetElement && widgetElement.parentElement) { - widgetElement.parentElement.appendChild(customDiv); - console.log(`[XYZ Plot Controller] Button added for ${paramType}`); - - // Trigger node resize - if (node.computeSize) { - node.computeSize(); - } - node.setDirtyCanvas(true, true); - } else { - console.error(`[XYZ Plot Controller] Could not find widget element for ${widgetName}`); - } - } - - // Add validation for numeric types - if (['cfg_scale', 'steps', 'clip_skip', 'seed', 'denoise', 'flux_guidance'].includes(paramType)) { - if (widget.inputEl) { - widget.inputEl.addEventListener('input', () => { - const value = widget.inputEl.value.trim(); - let isValid = true; - - if (value) { - const rangePattern = /^\d+(\.\d+)?:\d+(\.\d+)?(:\d+(\.\d+)?)?$/; - const listPattern = /^[\d\.\s,]+$/; - isValid = rangePattern.test(value) || listPattern.test(value); - } - - widget.inputEl.style.borderColor = isValid ? "#4ecdc4" : "#ff6b6b"; - }); - } - } -} - -function showSelectDialog(options, widget, paramType) { - console.log(`[XYZ Plot Controller] showSelectDialog called with ${options.length} options for ${paramType}`); - +// Create multi-select dialog +function showMultiSelectDialog(options, currentValues, paramType, onApply) { // Create overlay const overlay = document.createElement("div"); overlay.style.cssText = ` @@ -446,6 +119,7 @@ function showSelectDialog(options, widget, paramType) { border-radius: 8px; padding: 20px; max-width: 500px; + width: 90%; max-height: 70vh; overflow: hidden; display: flex; @@ -455,17 +129,25 @@ function showSelectDialog(options, widget, paramType) { // Title const title = document.createElement("h3"); - const titleLabels = { - model: "Select Models", - vae: "Select VAEs", - lora: "Select LoRAs", - sampler: "Select Samplers", - scheduler: "Select Schedulers" - }; - title.textContent = titleLabels[paramType] || `Select ${paramType} values`; + title.textContent = `Select ${paramType.charAt(0).toUpperCase() + paramType.slice(1)}s`; title.style.cssText = "margin: 0 0 15px 0; color: #4ecdc4; font-size: 16px;"; dialog.appendChild(title); + // Search box + const searchBox = document.createElement("input"); + searchBox.type = "text"; + searchBox.placeholder = "Search..."; + searchBox.style.cssText = ` + padding: 8px; + margin-bottom: 10px; + background: #2a2a2a; + border: 1px solid #444; + border-radius: 4px; + color: #fff; + font-size: 14px; + `; + dialog.appendChild(searchBox); + // Options container const optionsContainer = document.createElement("div"); optionsContainer.style.cssText = ` @@ -478,16 +160,15 @@ function showSelectDialog(options, widget, paramType) { max-height: 400px; `; - // Get current values - const currentValues = widget.value.split(',').map(v => v.trim()).filter(v => v); + const checkboxes = []; + const labels = []; // Create checkboxes - const checkboxes = []; options.forEach(option => { const label = document.createElement("label"); label.style.cssText = ` display: block; - padding: 8px 10px; + padding: 8px; cursor: pointer; color: #ddd; transition: background 0.2s; @@ -509,20 +190,25 @@ function showSelectDialog(options, widget, paramType) { label.appendChild(checkbox); label.appendChild(document.createTextNode(option)); - // Hover effect - label.onmouseenter = () => { - label.style.background = "rgba(78, 205, 196, 0.1)"; - }; - label.onmouseleave = () => { - label.style.background = "transparent"; - }; + label.onmouseenter = () => label.style.background = "rgba(78, 205, 196, 0.1)"; + label.onmouseleave = () => label.style.background = "transparent"; checkboxes.push(checkbox); + labels.push(label); optionsContainer.appendChild(label); }); dialog.appendChild(optionsContainer); + // Search functionality + searchBox.oninput = () => { + const searchTerm = searchBox.value.toLowerCase(); + labels.forEach((label, i) => { + const text = options[i].toLowerCase(); + label.style.display = text.includes(searchTerm) ? "block" : "none"; + }); + }; + // Buttons const buttonContainer = document.createElement("div"); buttonContainer.style.cssText = ` @@ -532,6 +218,38 @@ function showSelectDialog(options, widget, paramType) { justify-content: flex-end; `; + const selectAllBtn = document.createElement("button"); + selectAllBtn.textContent = "Select All"; + selectAllBtn.style.cssText = ` + padding: 8px 15px; + background: #666; + color: white; + border: none; + border-radius: 4px; + cursor: pointer; + `; + selectAllBtn.onclick = () => { + checkboxes.forEach(cb => { + if (cb.parentElement.style.display !== "none") { + cb.checked = true; + } + }); + }; + + const clearBtn = document.createElement("button"); + clearBtn.textContent = "Clear All"; + clearBtn.style.cssText = ` + padding: 8px 15px; + background: #666; + color: white; + border: none; + border-radius: 4px; + cursor: pointer; + `; + clearBtn.onclick = () => { + checkboxes.forEach(cb => cb.checked = false); + }; + const cancelBtn = document.createElement("button"); cancelBtn.textContent = "Cancel"; cancelBtn.style.cssText = ` @@ -558,11 +276,12 @@ function showSelectDialog(options, widget, paramType) { const selected = checkboxes .filter(cb => cb.checked) .map(cb => cb.value); - widget.value = selected.join(", "); - widget.callback?.(widget.value); + onApply(selected); document.body.removeChild(overlay); }; + buttonContainer.appendChild(selectAllBtn); + buttonContainer.appendChild(clearBtn); buttonContainer.appendChild(cancelBtn); buttonContainer.appendChild(applyBtn); dialog.appendChild(buttonContainer); @@ -570,22 +289,280 @@ function showSelectDialog(options, widget, paramType) { overlay.appendChild(dialog); document.body.appendChild(overlay); - console.log("[XYZ Plot Controller] Dialog added to document body"); + // Focus search box + searchBox.focus(); } -function updateImageCount(node) { - const countDiv = node.element?.querySelector('#xyz-count-display'); - if (!countDiv) return; - - let xCount = 1, yCount = 1, zCount = 1; - - ['x', 'y', 'z'].forEach(axis => { - const typeWidget = node.widgets.find(w => w.name === `${axis}_axis_type`); - const valueWidget = node.widgets.find(w => w.name === `${axis}_values`); +// Create the enhanced UI +function createEnhancedUI(node) { + const container = document.createElement("div"); + container.className = "xyz-controller-ui"; + container.innerHTML = ` + - if (typeWidget?.value && typeWidget.value !== 'none' && valueWidget?.value) { - const values = valueWidget.value.trim(); - if (values) { + +
+
X AXIS
+
+ Parameter: + +
+ + + +
+ + +
+
Y AXIS
+
+ Parameter: + +
+ + + +
+ + +
+
Z AXIS (Optional)
+
+ Parameter: + +
+ + + +
+ + +
Total Images: 0
+ `; + + // Setup event handlers + function setupAxisHandlers(axis) { + const typeSelect = container.querySelector(`#${axis}_axis_type`); + const valuesTextarea = container.querySelector(`#${axis}_values`); + const selectBtn = container.querySelector(`#${axis}_select_btn`); + const infoBox = container.querySelector(`#${axis}_info`); + + typeSelect.addEventListener('change', async () => { + const paramType = typeSelect.value; + const info = PARAM_INFO[paramType]; + + // Update widget values + const typeWidget = node.widgets.find(w => w.name === `${axis}_axis_type`); + if (typeWidget) { + typeWidget.value = paramType; + typeWidget.callback?.(paramType); + } + + if (!info || paramType === 'none') { + selectBtn.style.display = 'none'; + infoBox.style.display = 'none'; + valuesTextarea.placeholder = 'Values will appear here...'; + return; + } + + // Show info + infoBox.style.display = 'block'; + infoBox.innerHTML = ` + ${info.description} + ${info.example ? `
${info.example}
` : ''} + `; + + // Show/hide select button + if (info.hasOptions) { + selectBtn.style.display = 'block'; + selectBtn.textContent = `📁 Select ${paramType.charAt(0).toUpperCase() + paramType.slice(1)}s`; + valuesTextarea.placeholder = 'Click the button above to select values...'; + } else { + selectBtn.style.display = 'none'; + valuesTextarea.placeholder = 'Enter values...'; + } + + updateTotalCount(); + }); + + selectBtn.addEventListener('click', async () => { + const paramType = typeSelect.value; + const options = await getParameterOptions(paramType); + const currentValues = valuesTextarea.value.split(',').map(v => v.trim()).filter(v => v); + + showMultiSelectDialog(options, currentValues, paramType, (selected) => { + valuesTextarea.value = selected.join(', '); + const valueWidget = node.widgets.find(w => w.name === `${axis}_values`); + if (valueWidget) { + valueWidget.value = valuesTextarea.value; + valueWidget.callback?.(valuesTextarea.value); + } + updateTotalCount(); + }); + }); + + valuesTextarea.addEventListener('input', () => { + const valueWidget = node.widgets.find(w => w.name === `${axis}_values`); + if (valueWidget) { + valueWidget.value = valuesTextarea.value; + valueWidget.callback?.(valuesTextarea.value); + } + updateTotalCount(); + }); + } + + function updateTotalCount() { + let xCount = 1, yCount = 1, zCount = 1; + + ['x', 'y', 'z'].forEach(axis => { + const typeSelect = container.querySelector(`#${axis}_axis_type`); + const valuesTextarea = container.querySelector(`#${axis}_values`); + + if (typeSelect.value !== 'none' && valuesTextarea.value.trim()) { + const values = valuesTextarea.value.trim(); + // Check for range syntax if (values.includes(':')) { const parts = values.split(':'); @@ -606,21 +583,81 @@ function updateImageCount(node) { else if (axis === 'z') zCount = count; } } + }); + + const total = xCount * yCount * zCount; + const totalDiv = container.querySelector('#xyz_total_count'); + totalDiv.textContent = `Total Images: ${total}`; + + totalDiv.className = 'xyz-total-count'; + if (total > 100) { + totalDiv.className += ' danger'; + totalDiv.textContent += ' ⚠️'; + } else if (total > 50) { + totalDiv.className += ' warning'; } - }); - - const total = xCount * yCount * zCount; - countDiv.textContent = `Total Images: ${total}`; - - // Update color based on count - if (total > 100) { - countDiv.style.color = "#ff6b6b"; - countDiv.textContent += " ⚠️"; - } else if (total > 50) { - countDiv.style.color = "#ffaa00"; - } else { - countDiv.style.color = "#4ecdc4"; } + + // Initialize handlers + ['x', 'y', 'z'].forEach(axis => setupAxisHandlers(axis)); + + // Sync with existing widget values + function syncFromWidgets() { + ['x', 'y', 'z'].forEach(axis => { + const typeWidget = node.widgets.find(w => w.name === `${axis}_axis_type`); + const valueWidget = node.widgets.find(w => w.name === `${axis}_values`); + + if (typeWidget) { + const typeSelect = container.querySelector(`#${axis}_axis_type`); + typeSelect.value = typeWidget.value; + typeSelect.dispatchEvent(new Event('change')); + } + + if (valueWidget) { + const valuesTextarea = container.querySelector(`#${axis}_values`); + valuesTextarea.value = valueWidget.value; + } + }); + updateTotalCount(); + } + + setTimeout(syncFromWidgets, 100); + + return container; } -console.log("[XYZ Plot Controller] Extension module loaded successfully"); \ No newline at end of file +app.registerExtension({ + name: "ComfyAssets.XYZPlotControllerV2", + + async beforeRegisterNodeDef(nodeType, nodeData, app) { + if (nodeData.name === "XYZPlotController") { + const onNodeCreated = nodeType.prototype.onNodeCreated; + + nodeType.prototype.onNodeCreated = function() { + if (onNodeCreated) { + onNodeCreated.apply(this, arguments); + } + + // Hide all original widgets + this.widgets.forEach(w => { + if (w.element) { + w.element.style.display = 'none'; + } + if (w.inputEl) { + w.inputEl.style.display = 'none'; + } + }); + + // Create custom UI + const ui = createEnhancedUI(this); + this.addDOMWidget("xyz_enhanced_ui", "div", ui, { + serialize: false, + hideOnZoom: false + }); + + // Set node size + this.size = [400, 850]; + }; + } + } +}); \ No newline at end of file diff --git a/web/xyz_plot_controller_old.js b/web/xyz_plot_controller_old.js new file mode 100644 index 0000000..bcfa5b0 --- /dev/null +++ b/web/xyz_plot_controller_old.js @@ -0,0 +1,626 @@ +import { app } from "../../scripts/app.js"; + +console.log("[XYZ Plot Controller] Extension loading..."); + +app.registerExtension({ + name: "ComfyAssets.XYZPlotController", + + async beforeRegisterNodeDef(nodeType, nodeData, app) { + console.log("[XYZ Plot Controller] beforeRegisterNodeDef called for:", nodeData.name); + + if (nodeData.name === "XYZPlotController") { + console.log("[XYZ Plot Controller] Configuring XYZPlotController node..."); + const onNodeCreated = nodeType.prototype.onNodeCreated; + + nodeType.prototype.onNodeCreated = function() { + console.log("[XYZ Plot Controller] onNodeCreated called"); + + if (onNodeCreated) { + onNodeCreated.apply(this, arguments); + } + + // Store reference to node + this.parameterHelpers = createParameterHelpers(); + this.setupComplete = false; + + // Setup UI after a delay to ensure widgets are ready + setTimeout(() => { + console.log("[XYZ Plot Controller] Setting up enhanced UI..."); + if (!this.setupComplete) { + setupEnhancedUI(this); + this.setupComplete = true; + } + }, 100); + }; + + // Handle widget changes + const onWidgetChange = nodeType.prototype.onWidgetChange; + nodeType.prototype.onWidgetChange = function(name, value, oldValue, widget) { + if (onWidgetChange) { + onWidgetChange.call(this, name, value, oldValue, widget); + } + + // Handle axis type changes + if (name.endsWith('_axis_type')) { + const axisPrefix = name.split('_')[0]; + const valueWidgetName = `${axisPrefix}_values`; + console.log(`[XYZ Plot Controller] Axis type changed: ${name} = ${value}`); + updateValueWidget(this, valueWidgetName, value); + } + + // Update total count for any value change + if (name.includes('_values') || name.includes('_axis_type')) { + updateImageCount(this); + } + }; + } + } +}); + +// Parameter information +const parameterInfo = { + none: { description: "No parameter selected" }, + model: { + description: "Checkpoint/Model files", + example: "Click 'Select Models' to choose multiple checkpoints", + hasOptions: true + }, + vae: { + description: "VAE models", + example: "Click 'Select Vaes' to choose VAEs\n'Automatic' uses the model's built-in VAE", + hasOptions: true + }, + lora: { + description: "LoRA models", + example: "Click 'Select Loras' to choose LoRAs\n'None' disables LoRA", + hasOptions: true + }, + sampler: { + description: "Sampling algorithms", + example: "Click 'Select Samplers' to choose sampling methods", + hasOptions: true + }, + scheduler: { + description: "Noise schedulers", + example: "Click 'Select Schedulers' to choose scheduler types", + hasOptions: true + }, + cfg_scale: { + description: "CFG Scale (Classifier-Free Guidance)", + example: "Examples:\n5, 7.5, 10, 12.5\n5:15:2.5 (range from 5 to 15, step 2.5)" + }, + steps: { + description: "Denoising steps", + example: "Examples:\n20, 30, 40, 50\n10:50:10 (range)" + }, + clip_skip: { + description: "CLIP layers to skip", + example: "Common values: 1, 2\nSDXL typically uses 1 or 2" + }, + seed: { + description: "Random seed", + example: "Examples:\n42, 123, 456\n0:1000:100 (range)" + }, + denoise: { + description: "Denoising strength", + example: "Examples:\n0.3, 0.5, 0.7, 1.0\n0.2:1.0:0.2 (range)" + }, + flux_guidance: { + description: "Flux guidance strength", + example: "Examples:\n1.0, 2.0, 3.5, 5.0\n1:5:0.5 (range)" + }, + prompt: { + description: "Text prompts (one per line)", + example: "Enter different prompts, one per line:\n\na beautiful sunset\na mystical forest\na futuristic city" + } +}; + +// Generic function to find options from any node type +async function findOptionsForParameter(paramType) { + try { + console.log(`[XYZ Plot Controller] Finding options for ${paramType}`); + const resp = await fetch('/object_info'); + const data = await resp.json(); + + // Map parameter types to common input names + const parameterMappings = { + model: ['ckpt_name', 'checkpoint', 'model_name', 'unet_name'], + vae: ['vae_name', 'vae'], + lora: ['lora_name', 'lora'], + sampler: ['sampler_name', 'sampler'], + scheduler: ['scheduler', 'scheduler_name'], + // Add more mappings as needed + }; + + const possibleNames = parameterMappings[paramType] || [paramType]; + let allOptions = []; + + // Search through all nodes for matching inputs + for (const [nodeName, nodeData] of Object.entries(data)) { + if (nodeData.input?.required) { + for (const [inputName, inputDef] of Object.entries(nodeData.input.required)) { + // Check if this input name matches what we're looking for + if (possibleNames.includes(inputName)) { + // Check if it's a list (array as first element) + if (Array.isArray(inputDef[0])) { + console.log(`[XYZ Plot Controller] Found ${paramType} options in ${nodeName}.${inputName}`); + allOptions = [...new Set([...allOptions, ...inputDef[0]])]; + } + } + } + } + } + + console.log(`[XYZ Plot Controller] Total ${paramType} options found:`, allOptions.length); + return allOptions; + } catch (e) { + console.error(`[XYZ Plot Controller] Error finding options for ${paramType}:`, e); + return []; + } +} + +function createParameterHelpers() { + return { + model: { + getOptions: async () => { + const options = await findOptionsForParameter('model'); + return options.length > 0 ? options : []; + } + }, + vae: { + getOptions: async () => { + const options = await findOptionsForParameter('vae'); + // Add "Automatic" as first option for VAEs + return ["Automatic", ...options]; + } + }, + lora: { + getOptions: async () => { + const options = await findOptionsForParameter('lora'); + // Add "None" as first option for LoRAs + return ["None", ...options]; + } + }, + sampler: { + getOptions: async () => { + const options = await findOptionsForParameter('sampler'); + return options.length > 0 ? options : + ["euler", "euler_ancestral", "heun", "dpm_2", "dpm_2_ancestral", + "lms", "dpm_fast", "dpm_adaptive", "dpmpp_2s_ancestral", + "dpmpp_sde", "dpmpp_2m", "dpmpp_2m_sde", "ddim", "uni_pc"]; + } + }, + scheduler: { + getOptions: async () => { + const options = await findOptionsForParameter('scheduler'); + return options.length > 0 ? options : + ["normal", "karras", "exponential", "sgm_uniform", "simple", "ddim_uniform"]; + } + } + }; +} + +function setupEnhancedUI(node) { + console.log("[XYZ Plot Controller] setupEnhancedUI called for node:", node); + + // Add custom UI container + const container = document.createElement("div"); + container.style.cssText = ` + padding: 10px; + background: #1e1e1e; + border-radius: 6px; + margin: 10px 5px; + border: 1px solid #333; + `; + + // Add info display + const infoDiv = document.createElement("div"); + infoDiv.id = "xyz-info-display"; + infoDiv.style.cssText = ` + background: #2a2a2a; + padding: 8px; + border-radius: 4px; + margin-bottom: 10px; + font-size: 12px; + color: #ccc; + display: none; + `; + container.appendChild(infoDiv); + + // Add total count display + const countDiv = document.createElement("div"); + countDiv.id = "xyz-count-display"; + countDiv.style.cssText = ` + background: #2a2a2a; + padding: 8px; + border-radius: 4px; + text-align: center; + font-weight: bold; + color: #4ecdc4; + `; + countDiv.textContent = "Total Images: 0"; + container.appendChild(countDiv); + + console.log("[XYZ Plot Controller] Adding DOM widget..."); + + // Add widget + try { + node.addDOMWidget("xyz_ui", "div", container); + console.log("[XYZ Plot Controller] DOM widget added successfully"); + } catch (error) { + console.error("[XYZ Plot Controller] Error adding DOM widget:", error); + } + + // Setup axis handlers + ['x', 'y', 'z'].forEach(axis => { + const typeWidget = node.widgets.find(w => w.name === `${axis}_axis_type`); + const valueWidget = node.widgets.find(w => w.name === `${axis}_values`); + + console.log(`[XYZ Plot Controller] Setting up ${axis} axis - type: ${typeWidget?.value}`); + + if (typeWidget && valueWidget) { + // Initial setup + if (typeWidget.value && typeWidget.value !== 'none') { + updateValueWidget(node, `${axis}_values`, typeWidget.value); + } + + // Force widget callback setup + if (!typeWidget._xyz_initialized) { + typeWidget._xyz_initialized = true; + const originalCallback = typeWidget.callback; + typeWidget.callback = function(value) { + console.log(`[XYZ Plot Controller] ${axis}_axis_type changed to: ${value}`); + updateValueWidget(node, `${axis}_values`, value); + updateImageCount(node); + if (originalCallback) { + originalCallback.call(this, value); + } + }; + } + } + }); + + // Initial count update + updateImageCount(node); +} + +function updateValueWidget(node, widgetName, paramType) { + console.log(`[XYZ Plot Controller] updateValueWidget called: ${widgetName} -> ${paramType}`); + + const widget = node.widgets.find(w => w.name === widgetName); + if (!widget) { + console.error(`[XYZ Plot Controller] Widget ${widgetName} not found`); + return; + } + + // Always remove existing custom elements first + const existingDiv = node.element?.querySelector(`#${widgetName}-custom`); + if (existingDiv) { + console.log(`[XYZ Plot Controller] Removing existing button for ${widgetName}`); + existingDiv.remove(); + } + + const info = parameterInfo[paramType]; + if (!info || paramType === 'none') { + // Hide info display if no parameter selected + const infoDiv = node.element?.querySelector('#xyz-info-display'); + if (infoDiv) { + infoDiv.style.display = 'none'; + } + return; + } + + // Update info display + const infoDiv = node.element?.querySelector('#xyz-info-display'); + if (infoDiv) { + infoDiv.style.display = 'block'; + infoDiv.innerHTML = ` +
+ ${paramType.toUpperCase()} +
+
${info.description}
+ ${info.example || ''} + `; + } + + // Add select button for options-based parameters + if (info.hasOptions && node.parameterHelpers[paramType]) { + console.log(`[XYZ Plot Controller] Creating select button for ${paramType}`); + + // Create new button + let customDiv = document.createElement("div"); + customDiv.id = `${widgetName}-custom`; + customDiv.style.cssText = ` + margin-top: 5px; + margin-bottom: 15px; + padding-bottom: 10px; + `; + + const selectBtn = document.createElement("button"); + // Better pluralization + const buttonLabels = { + model: "Select Models", + vae: "Select VAEs", + lora: "Select LoRAs", + sampler: "Select Samplers", + scheduler: "Select Schedulers" + }; + selectBtn.textContent = `📁 ${buttonLabels[paramType] || `Select ${paramType}s`}`; + selectBtn.style.cssText = ` + padding: 6px 12px; + background: #4a90e2; + color: white; + border: none; + border-radius: 4px; + cursor: pointer; + font-size: 12px; + width: 100%; + box-shadow: 0 2px 4px rgba(0,0,0,0.2); + transition: all 0.2s; + `; + + selectBtn.onmouseenter = () => { + selectBtn.style.background = "#357abd"; + selectBtn.style.transform = "translateY(-1px)"; + selectBtn.style.boxShadow = "0 3px 6px rgba(0,0,0,0.3)"; + }; + + selectBtn.onmouseleave = () => { + selectBtn.style.background = "#4a90e2"; + selectBtn.style.transform = "translateY(0)"; + selectBtn.style.boxShadow = "0 2px 4px rgba(0,0,0,0.2)"; + }; + + selectBtn.onclick = async (e) => { + e.preventDefault(); + e.stopPropagation(); + console.log(`[XYZ Plot Controller] Getting ${paramType} options...`); + const options = await node.parameterHelpers[paramType].getOptions(); + console.log(`[XYZ Plot Controller] Got ${options.length} ${paramType} options:`, options); + showSelectDialog(options, widget, paramType); + }; + + customDiv.appendChild(selectBtn); + + // Insert after widget + const widgetElement = widget.inputEl || widget.element; + console.log(`[XYZ Plot Controller] Widget element for ${widgetName}:`, widgetElement); + console.log(`[XYZ Plot Controller] Widget parent:`, widgetElement?.parentElement); + + if (widgetElement && widgetElement.parentElement) { + widgetElement.parentElement.appendChild(customDiv); + console.log(`[XYZ Plot Controller] Button added for ${paramType}`); + + // Trigger node resize + if (node.computeSize) { + node.computeSize(); + } + node.setDirtyCanvas(true, true); + } else { + console.error(`[XYZ Plot Controller] Could not find widget element for ${widgetName}`); + } + } + + // Add validation for numeric types + if (['cfg_scale', 'steps', 'clip_skip', 'seed', 'denoise', 'flux_guidance'].includes(paramType)) { + if (widget.inputEl) { + widget.inputEl.addEventListener('input', () => { + const value = widget.inputEl.value.trim(); + let isValid = true; + + if (value) { + const rangePattern = /^\d+(\.\d+)?:\d+(\.\d+)?(:\d+(\.\d+)?)?$/; + const listPattern = /^[\d\.\s,]+$/; + isValid = rangePattern.test(value) || listPattern.test(value); + } + + widget.inputEl.style.borderColor = isValid ? "#4ecdc4" : "#ff6b6b"; + }); + } + } +} + +function showSelectDialog(options, widget, paramType) { + console.log(`[XYZ Plot Controller] showSelectDialog called with ${options.length} options for ${paramType}`); + + // Create overlay + const overlay = document.createElement("div"); + overlay.style.cssText = ` + position: fixed; + top: 0; + left: 0; + right: 0; + bottom: 0; + background: rgba(0, 0, 0, 0.7); + z-index: 10000; + display: flex; + align-items: center; + justify-content: center; + `; + + // Create dialog + const dialog = document.createElement("div"); + dialog.style.cssText = ` + background: #1e1e1e; + border: 2px solid #444; + border-radius: 8px; + padding: 20px; + max-width: 500px; + max-height: 70vh; + overflow: hidden; + display: flex; + flex-direction: column; + box-shadow: 0 10px 30px rgba(0,0,0,0.5); + `; + + // Title + const title = document.createElement("h3"); + const titleLabels = { + model: "Select Models", + vae: "Select VAEs", + lora: "Select LoRAs", + sampler: "Select Samplers", + scheduler: "Select Schedulers" + }; + title.textContent = titleLabels[paramType] || `Select ${paramType} values`; + title.style.cssText = "margin: 0 0 15px 0; color: #4ecdc4; font-size: 16px;"; + dialog.appendChild(title); + + // Options container + const optionsContainer = document.createElement("div"); + optionsContainer.style.cssText = ` + flex: 1; + overflow-y: auto; + border: 1px solid #444; + border-radius: 4px; + padding: 10px; + background: #2a2a2a; + max-height: 400px; + `; + + // Get current values + const currentValues = widget.value.split(',').map(v => v.trim()).filter(v => v); + + // Create checkboxes + const checkboxes = []; + options.forEach(option => { + const label = document.createElement("label"); + label.style.cssText = ` + display: block; + padding: 8px 10px; + cursor: pointer; + color: #ddd; + transition: background 0.2s; + border-radius: 4px; + margin-bottom: 2px; + `; + + const checkbox = document.createElement("input"); + checkbox.type = "checkbox"; + checkbox.value = option; + checkbox.checked = currentValues.includes(option); + checkbox.style.cssText = ` + margin-right: 10px; + width: 16px; + height: 16px; + cursor: pointer; + `; + + label.appendChild(checkbox); + label.appendChild(document.createTextNode(option)); + + // Hover effect + label.onmouseenter = () => { + label.style.background = "rgba(78, 205, 196, 0.1)"; + }; + label.onmouseleave = () => { + label.style.background = "transparent"; + }; + + checkboxes.push(checkbox); + optionsContainer.appendChild(label); + }); + + dialog.appendChild(optionsContainer); + + // Buttons + const buttonContainer = document.createElement("div"); + buttonContainer.style.cssText = ` + margin-top: 15px; + display: flex; + gap: 10px; + justify-content: flex-end; + `; + + const cancelBtn = document.createElement("button"); + cancelBtn.textContent = "Cancel"; + cancelBtn.style.cssText = ` + padding: 8px 15px; + background: #666; + color: white; + border: none; + border-radius: 4px; + cursor: pointer; + `; + cancelBtn.onclick = () => document.body.removeChild(overlay); + + const applyBtn = document.createElement("button"); + applyBtn.textContent = "Apply"; + applyBtn.style.cssText = ` + padding: 8px 15px; + background: #4a90e2; + color: white; + border: none; + border-radius: 4px; + cursor: pointer; + `; + applyBtn.onclick = () => { + const selected = checkboxes + .filter(cb => cb.checked) + .map(cb => cb.value); + widget.value = selected.join(", "); + widget.callback?.(widget.value); + document.body.removeChild(overlay); + }; + + buttonContainer.appendChild(cancelBtn); + buttonContainer.appendChild(applyBtn); + dialog.appendChild(buttonContainer); + + overlay.appendChild(dialog); + document.body.appendChild(overlay); + + console.log("[XYZ Plot Controller] Dialog added to document body"); +} + +function updateImageCount(node) { + const countDiv = node.element?.querySelector('#xyz-count-display'); + if (!countDiv) return; + + let xCount = 1, yCount = 1, zCount = 1; + + ['x', 'y', 'z'].forEach(axis => { + const typeWidget = node.widgets.find(w => w.name === `${axis}_axis_type`); + const valueWidget = node.widgets.find(w => w.name === `${axis}_values`); + + if (typeWidget?.value && typeWidget.value !== 'none' && valueWidget?.value) { + const values = valueWidget.value.trim(); + if (values) { + // Check for range syntax + if (values.includes(':')) { + const parts = values.split(':'); + if (parts.length >= 2) { + const start = parseFloat(parts[0]); + const stop = parseFloat(parts[1]); + const step = parts[2] ? parseFloat(parts[2]) : 1; + const count = Math.floor((stop - start) / step) + 1; + if (axis === 'x') xCount = count; + else if (axis === 'y') yCount = count; + else if (axis === 'z') zCount = count; + } + } else { + // Count comma-separated values + const count = values.split(',').filter(v => v.trim()).length; + if (axis === 'x') xCount = count; + else if (axis === 'y') yCount = count; + else if (axis === 'z') zCount = count; + } + } + } + }); + + const total = xCount * yCount * zCount; + countDiv.textContent = `Total Images: ${total}`; + + // Update color based on count + if (total > 100) { + countDiv.style.color = "#ff6b6b"; + countDiv.textContent += " ⚠️"; + } else if (total > 50) { + countDiv.style.color = "#ffaa00"; + } else { + countDiv.style.color = "#4ecdc4"; + } +} + +console.log("[XYZ Plot Controller] Extension module loaded successfully"); \ No newline at end of file