import { SERVICE as PROMPT_SERVICE } from "../common/prompt_service.js"; import { createElement } from "./utils_dom.js"; export class RgthreeProgressBar extends HTMLElement { static create() { return document.createElement(RgthreeProgressBar.NAME); } get currentNodeId() { var _a, _b; const prompt = this.currentPromptExecution; const nodeId = ((_a = prompt === null || prompt === void 0 ? void 0 : prompt.errorDetails) === null || _a === void 0 ? void 0 : _a.node_id) || ((_b = prompt === null || prompt === void 0 ? void 0 : prompt.currentlyExecuting) === null || _b === void 0 ? void 0 : _b.nodeId); return nodeId || null; } constructor() { super(); this.shadow = null; this.currentPromptExecution = null; this.onProgressUpdateBound = this.onProgressUpdate.bind(this); this.connected = false; } onProgressUpdate(e) { var _a, _b, _c, _d; if (!this.connected) return; const prompt = e.detail.prompt; this.currentPromptExecution = prompt; if (prompt === null || prompt === void 0 ? void 0 : prompt.errorDetails) { let progressText = `${(_a = prompt.errorDetails) === null || _a === void 0 ? void 0 : _a.exception_type} ${((_b = prompt.errorDetails) === null || _b === void 0 ? void 0 : _b.node_id) || ""} ${((_c = prompt.errorDetails) === null || _c === void 0 ? void 0 : _c.node_type) || ""}`; this.progressTextEl.innerText = progressText; this.progressNodesEl.classList.add("-error"); this.progressStepsEl.classList.add("-error"); return; } if (prompt === null || prompt === void 0 ? void 0 : prompt.currentlyExecuting) { this.progressNodesEl.classList.remove("-error"); this.progressStepsEl.classList.remove("-error"); const current = prompt === null || prompt === void 0 ? void 0 : prompt.currentlyExecuting; let progressText = `(${e.detail.queue}) `; if (!prompt.totalNodes) { progressText += `??%`; this.progressNodesEl.style.width = `0%`; } else { const percent = (prompt.executedNodeIds.length / prompt.totalNodes) * 100; this.progressNodesEl.style.width = `${Math.max(2, percent)}%`; progressText += `${Math.round(percent)}%`; } let nodeLabel = (_d = current.nodeLabel) === null || _d === void 0 ? void 0 : _d.trim(); let stepsLabel = ""; if (current.step != null && current.maxSteps) { const percent = (current.step / current.maxSteps) * 100; this.progressStepsEl.style.width = `${percent}%`; if (current.pass > 1 || current.maxPasses != null) { stepsLabel += `#${current.pass}`; if (current.maxPasses && current.maxPasses > 0) { stepsLabel += `/${current.maxPasses}`; } stepsLabel += ` - `; } stepsLabel += `${Math.round(percent)}%`; } if (nodeLabel || stepsLabel) { progressText += ` - ${nodeLabel || "???"}${stepsLabel ? ` (${stepsLabel})` : ""}`; } if (!stepsLabel) { this.progressStepsEl.style.width = `0%`; } this.progressTextEl.innerText = progressText; } else { if (e === null || e === void 0 ? void 0 : e.detail.queue) { this.progressTextEl.innerText = `(${e.detail.queue}) Running... in another tab`; } else { this.progressTextEl.innerText = "Idle"; } this.progressNodesEl.style.width = `0%`; this.progressStepsEl.style.width = `0%`; } } connectedCallback() { if (!this.connected) { PROMPT_SERVICE.addEventListener("progress-update", this.onProgressUpdateBound); this.connected = true; } if (this.shadow) { this.progressTextEl.innerText = "Idle"; this.progressNodesEl.style.width = `0%`; this.progressStepsEl.style.width = `0%`; return; } this.shadow = this.attachShadow({ mode: "open" }); const sheet = new CSSStyleSheet(); sheet.replaceSync(` :host { position: relative; overflow: hidden; box-sizing: border-box; background: var(--rgthree-progress-bg-color); --rgthree-progress-bg-color: rgba(23, 23, 23, 0.9); --rgthree-progress-nodes-bg-color: rgb(0, 128, 0); --rgthree-progress-steps-bg-color: rgb(0, 128, 0); --rgthree-progress-error-bg-color: rgb(128, 0, 0); --rgthree-progress-text-color: #fff; } :host * { box-sizing: inherit; } :host > div.bar { background: var(--rgthree-progress-nodes-bg-color); position: absolute; left: 0; top: 0; width: 0%; height: 50%; z-index: 1; transition: width 50ms ease-in-out; } :host > div.bar + div.bar { background: var(--rgthree-progress-steps-bg-color); top: 50%; height: 50%; z-index: 2; } :host > div.bar.-error { background: var(--rgthree-progress-error-bg-color); } :host > .overlay { position: absolute; left: 0; top: 0; width: 100%; height: 100%; z-index: 5; background: linear-gradient(to bottom, rgba(255,255,255,0.25), rgba(0,0,0,0.25)); mix-blend-mode: overlay; } :host > span { position: relative; z-index: 4; text-align: left; font-size: inherit; height: 100%; font-family: sans-serif; text-shadow: 1px 1px 0px #000; display: flex; flex-direction: row; padding: 0 6px; align-items: center; justify-content: start; color: var(--rgthree-progress-text-color); text-shadow: black 0px 0px 2px; } :host > div.bar[style*="width: 0%"]:first-child, :host > div.bar[style*="width:0%"]:first-child { height: 0%; } :host > div.bar[style*="width: 0%"]:first-child + div, :host > div.bar[style*="width:0%"]:first-child + div { bottom: 0%; } `); this.shadow.adoptedStyleSheets = [sheet]; const overlayEl = createElement(`div.overlay[part="overlay"]`, { parent: this.shadow }); this.progressNodesEl = createElement(`div.bar[part="progress-nodes"]`, { parent: this.shadow }); this.progressStepsEl = createElement(`div.bar[part="progress-steps"]`, { parent: this.shadow }); this.progressTextEl = createElement(`span[part="text"]`, { text: "Idle", parent: this.shadow }); } disconnectedCallback() { this.connected = false; PROMPT_SERVICE.removeEventListener("progress-update", this.onProgressUpdateBound); } } RgthreeProgressBar.NAME = "rgthree-progress-bar"; customElements.define(RgthreeProgressBar.NAME, RgthreeProgressBar);