Files
sn0w12-ComfyUI-Sn0w-Scripts/web/textbox.js
T

65 lines
2.8 KiB
JavaScript

import { SettingUtils } from './sn0w.js';
import { app } from "../../../scripts/app.js";
import { api } from '../../scripts/api.js';
import { ComfyWidgets } from "../../../scripts/widgets.js";
app.registerExtension({
name: "sn0w.Textbox",
async beforeRegisterNodeDef(nodeType, nodeData, app) {
if (nodeData.name === "Copy/Paste Textbox") {
// Get textbox text
nodeType.prototype.getTextboxText = function() {
const textbox = this.inputEl ? this.inputEl.value : '';
return textbox;
};
nodeType.prototype.populate = function() {
// Adding a multiline text widget and storing a reference to the input element
let textWidget = ComfyWidgets["STRING"](this, "text", ["STRING", { default: "hello", multiline: true }], app).widget;
this.inputEl = textWidget.inputEl || textWidget.querySelector('input, textarea');
// Implement copy functionality with proper callback
this.addWidget("button", "Copy", "Copy", () => {
navigator.clipboard.writeText(this.getTextboxText());
}, { serialize: false });
// Implement paste functionality with proper callback handling asynchronous operation
this.addWidget("button", "Paste", "Paste", () => {
navigator.clipboard.readText().then(text => {
this.inputEl.value = text;
}).catch(error => {
console.error('Failed to read clipboard contents:', error);
});
}, { serialize: false });
};
nodeType.prototype.onNodeCreated = function () {
this.populate();
// Bind the getTextboxText to this instance
this.getTextboxText = this.getTextboxText.bind(this);
api.addEventListener('textbox', (event) => {
const data = event.detail
const outputText = this.getTextboxText();
if (this.id == data.id) {
api.fetchApi(`${SettingUtils.API_PREFIX}/textbox_string`, {
method: "POST",
headers: {
"Content-Type": "application/json",
},
body: JSON.stringify(
{
node_id: data.id,
outputs: {
output: outputText
}
}
),
})
}
})
}
}
},
});