Spaces:
Build error
Build error
| // @ts-check | |
| import { ComfyButton } from "../components/button.js"; | |
| import { $el } from "../../ui.js"; | |
| import { api } from "../../api.js"; | |
| import { ComfyPopup } from "../components/popup.js"; | |
| export class ComfyViewListButton { | |
| get open() { | |
| return this.popup.open; | |
| } | |
| set open(open) { | |
| this.popup.open = open; | |
| } | |
| constructor(app, { button, list, mode }) { | |
| this.app = app; | |
| this.button = button; | |
| this.element = $el("div.comfyui-button-wrapper", this.button.element); | |
| this.popup = new ComfyPopup({ | |
| target: this.element, | |
| container: this.element, | |
| horizontal: "right", | |
| }); | |
| this.list = new (list ?? ComfyViewList)(app, mode, this.popup); | |
| this.popup.children = [this.list.element]; | |
| this.popup.addEventListener("open", () => { | |
| this.list.update(); | |
| }); | |
| this.popup.addEventListener("close", () => { | |
| this.list.close(); | |
| }); | |
| this.button.withPopup(this.popup); | |
| api.addEventListener("status", () => { | |
| if (this.popup.open) { | |
| this.popup.update(); | |
| } | |
| }); | |
| } | |
| } | |
| export class ComfyViewList { | |
| popup; | |
| constructor(app, mode, popup) { | |
| this.app = app; | |
| this.mode = mode; | |
| this.popup = popup; | |
| this.type = mode.toLowerCase(); | |
| this.items = $el(`div.comfyui-${this.type}-items.comfyui-view-list-items`); | |
| this.clear = new ComfyButton({ | |
| icon: "cancel", | |
| content: "Clear", | |
| action: async () => { | |
| this.showSpinner(false); | |
| await api.clearItems(this.type); | |
| await this.update(); | |
| }, | |
| }); | |
| this.refresh = new ComfyButton({ | |
| icon: "refresh", | |
| content: "Refresh", | |
| action: async () => { | |
| await this.update(false); | |
| }, | |
| }); | |
| this.element = $el(`div.comfyui-${this.type}-popup.comfyui-view-list-popup`, [ | |
| $el("h3", mode), | |
| $el("header", [this.clear.element, this.refresh.element]), | |
| this.items, | |
| ]); | |
| api.addEventListener("status", () => { | |
| if (this.popup.open) { | |
| this.update(); | |
| } | |
| }); | |
| } | |
| async close() { | |
| this.items.replaceChildren(); | |
| } | |
| async update(resize = true) { | |
| this.showSpinner(resize); | |
| const res = await this.loadItems(); | |
| let any = false; | |
| const names = Object.keys(res); | |
| const sections = names | |
| .map((section) => { | |
| const items = res[section]; | |
| if (items?.length) { | |
| any = true; | |
| } else { | |
| return; | |
| } | |
| const rows = []; | |
| if (names.length > 1) { | |
| rows.push($el("h5", section)); | |
| } | |
| rows.push(...items.flatMap((item) => this.createRow(item, section))); | |
| return $el("section", rows); | |
| }) | |
| .filter(Boolean); | |
| if (any) { | |
| this.items.replaceChildren(...sections); | |
| } else { | |
| this.items.replaceChildren($el("h5", "None")); | |
| } | |
| this.popup.update(); | |
| this.clear.enabled = this.refresh.enabled = true; | |
| this.element.style.removeProperty("height"); | |
| } | |
| showSpinner(resize = true) { | |
| // if (!this.spinner) { | |
| // this.spinner = createSpinner(); | |
| // } | |
| // if (!resize) { | |
| // this.element.style.height = this.element.clientHeight + "px"; | |
| // } | |
| // this.clear.enabled = this.refresh.enabled = false; | |
| // this.items.replaceChildren( | |
| // $el( | |
| // "div", | |
| // { | |
| // style: { | |
| // fontSize: "18px", | |
| // }, | |
| // }, | |
| // this.spinner | |
| // ) | |
| // ); | |
| // this.popup.update(); | |
| } | |
| async loadItems() { | |
| return await api.getItems(this.type); | |
| } | |
| getRow(item, section) { | |
| return { | |
| text: item.prompt[0] + "", | |
| actions: [ | |
| { | |
| text: "Load", | |
| action: async () => { | |
| try { | |
| await this.app.loadGraphData(item.prompt[3].extra_pnginfo.workflow); | |
| if (item.outputs) { | |
| this.app.nodeOutputs = item.outputs; | |
| } | |
| } catch (error) { | |
| alert("Error loading workflow: " + error.message); | |
| console.error(error); | |
| } | |
| }, | |
| }, | |
| { | |
| text: "Delete", | |
| action: async () => { | |
| try { | |
| await api.deleteItem(this.type, item.prompt[1]); | |
| this.update(); | |
| } catch (error) {} | |
| }, | |
| }, | |
| ], | |
| }; | |
| } | |
| createRow = (item, section) => { | |
| const row = this.getRow(item, section); | |
| return [ | |
| $el("span", row.text), | |
| ...row.actions.map( | |
| (a) => | |
| new ComfyButton({ | |
| content: a.text, | |
| action: async (e, btn) => { | |
| btn.enabled = false; | |
| try { | |
| await a.action(); | |
| } catch (error) { | |
| throw error; | |
| } finally { | |
| btn.enabled = true; | |
| } | |
| }, | |
| }).element | |
| ), | |
| ]; | |
| }; | |
| } | |