import { html, css, LitElement, PropertyValues } from "lit"; import { customElement, property, state, query } from "lit/decorators.js"; import { repeat } from "lit/directives/repeat.js"; import "@shoelace-style/shoelace/dist/themes/light.css"; import { SlSelect, SlOption, SlDivider, SlIcon, SlInput, } from "@shoelace-style/shoelace"; import Drawflow, { DrawflowNode } from "drawflow"; import helpOctagon from "@tabler/icons/outline/help-octagon.svg"; import textSize from "@tabler/icons/outline/text-size.svg"; import file from "@tabler/icons/outline/file.svg"; import squares from "@tabler/icons/outline/squares.svg"; import number123 from "@tabler/icons/outline/number-123.svg"; import checkbox from "@tabler/icons/outline/checkbox.svg"; import blockquote from "@tabler/icons/outline/blockquote.svg"; import highlight from "@tabler/icons/outline/highlight.svg"; import microphone from "@tabler/icons/outline/microphone.svg"; import packages from "@tabler/icons/outline/packages.svg"; import { WebWriterGamebookPage } from "../../gamebook/gamebook-components/gamebook-containers/gamebook-page/webwriter-gamebook-page"; import { WebWriterGamebookPopup } from "../../gamebook/gamebook-components/gamebook-containers/gamebook-popup/webwriter-gamebook-popup"; @customElement("webwriter-quiz-select") export class WebWriterQuizSelect extends LitElement { @property({ type: Object }) accessor container; @property({ type: Object }) accessor options = []; @property({ type: String }) accessor value; @state() accessor searchTerm = ""; @query("sl-input") accessor searchElement!: SlInput; @query("sl-select") accessor selectElement!: SlSelect; static styles = css` .nodeSelect { width: 100%; } sl-select::part(listbox) { width: 250px; height: 250px; } .node-option-visible { display: block; } .node-option-hidden { display: none; } .message { display: inline-block; margin: 10px 20px; /* Adjust margin for padding around the small element */ padding: 10px; /* Optional: for internal padding */ border-radius: 8px; /* Soft round corners */ background-color: #f9f9f9; /* Light background for better readability */ color: #333; /* Text color */ font-size: 14px; /* Adjust the size of the text */ line-height: 1.5; /* Make sure the text is well spaced */ } .icon-header { display: flex; align-items: center; gap: 7px; } `; /* */ // Move the option gathering logic to firstUpdated lifecycle method firstUpdated() { const containersSlot = this.container?.shadowRoot.querySelector("slot"); const assignedElements = containersSlot.assignedElements(); // Filter nodes with class "ww-widget" and add them to this.options let wwWidgetElements = assignedElements.filter((el) => el.classList.contains("ww-widget") ); wwWidgetElements = wwWidgetElements.filter( (el) => el.tagName.toLowerCase().includes("webwriter-quiz") || el.tagName.toLowerCase().includes("webwriter-task") ); this.options = [...this.options, ...wwWidgetElements]; } render() { return html` ${this.container instanceof WebWriterGamebookPage ? html` ${this.container ?.pageTitle}` : this.container instanceof WebWriterGamebookPopup ? html`${this.container ?.pageTitle}` : null} ${this.options.length === 0 ? html`No quiz element found.
Download the quiz WebWriter Quiz Widget over packages
` : html`${repeat( this.options, (element) => (element as HTMLElement).id, // or use another unique identifier (element) => html` ${(element as HTMLElement).tagName .toLowerCase() .includes("webwriter-task") ? html`${(element as HTMLElement).children[1].tagName .replace("WEBWRITER-", "") .toLowerCase() .replace(/^./, (str) => str.toUpperCase())} ${(element as HTMLElement).children[1]?.tagName .toLowerCase() .includes("order") ? html`

(${element.children[0].textContent + "..."})

` : (element as HTMLElement).children[1].tagName .toLowerCase() .includes("choice") ? html`

(${element.children[0].textContent + "..."})

` : (element as HTMLElement).children[1].tagName .toLowerCase() .includes("text") ? html`

(${element.children[0].textContent + "..."})

` : (element as HTMLElement).children[1].tagName .toLowerCase() .includes("mark") ? html`

(${element.children[0].textContent + "..."})

` : (element as HTMLElement).children[1].tagName .toLowerCase() .includes("speech") ? html`

(${element.children[0].textContent + "..."})

` : null} ` : (element as HTMLElement).tagName .toLowerCase() .includes("webwriter-quiz") ? html` ${(element as HTMLElement).tagName .replace("WEBWRITER-", "") .toLowerCase() .replace(/^./, (str) => str.toUpperCase())} ${element.tagName.toLowerCase().includes("quiz") ? html`` : null} ` : null}
` )}`}
`; } private _handleElementSelect(event: Event) { if ( event.target instanceof HTMLElement && event.target.tagName.toLowerCase() === "sl-select" ) { const selectedValue = (event.target as SlSelect).value; // If it's not an array, just assign it as-is this.value = selectedValue; } } } // ${(element as HTMLElement).children[1]?.tagName // .toLowerCase() // .includes("order") // ? html` ` // : (element as HTMLElement).children[1].tagName // .toLowerCase() // .includes("choice") // ? html`` // : (element as HTMLElement).children[1].tagName // .toLowerCase() // .includes("text") // ? html`` // : (element as HTMLElement).children[1].tagName // .toLowerCase() // .includes("mark") // ? html`` // : (element as HTMLElement).children[1].tagName // .toLowerCase() // .includes("speech") // ? html`` // : null}