|
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); |
|
|