|
import { $el } from "../../common/utils_dom.js"; |
|
const CSS_STYLE_SHEETS = new Map(); |
|
const HTML_TEMPLATE_FILES = new Map(); |
|
async function getStyleSheet(name) { |
|
if (!CSS_STYLE_SHEETS.has(name)) { |
|
try { |
|
const response = await fetch(`rgthree/common/components/${name.replace("rgthree-", "").replace(/\-/g, "_")}.css`); |
|
const text = await response.text(); |
|
CSS_STYLE_SHEETS.set(name, text); |
|
} |
|
catch (e) { |
|
alert("Error loading rgthree custom component css."); |
|
} |
|
} |
|
return CSS_STYLE_SHEETS.get(name); |
|
} |
|
async function getTemplateMarkup(name) { |
|
if (!HTML_TEMPLATE_FILES.has(name)) { |
|
try { |
|
const response = await fetch(`rgthree/common/components/${name.replace("rgthree-", "").replace(/\-/g, "_")}.html`); |
|
const text = await response.text(); |
|
HTML_TEMPLATE_FILES.set(name, text); |
|
} |
|
catch (e) { |
|
} |
|
} |
|
return HTML_TEMPLATE_FILES.get(name); |
|
} |
|
export class RgthreeCustomElement extends HTMLElement { |
|
constructor() { |
|
super(...arguments); |
|
this.connected = false; |
|
this.templates = new Map(); |
|
} |
|
static create() { |
|
if (this.name === "rgthree-override") { |
|
throw new Error("Must override component NAME"); |
|
} |
|
if (!customElements.get(this.name)) { |
|
customElements.define(this.NAME, this); |
|
} |
|
return document.createElement(this.NAME); |
|
} |
|
onFirstConnected() { |
|
} |
|
; |
|
onReconnected() { |
|
} |
|
; |
|
onConnected() { |
|
} |
|
; |
|
onDisconnected() { |
|
} |
|
; |
|
async connectedCallback() { |
|
const elementName = this.constructor.NAME; |
|
const wasConnected = this.connected; |
|
if (!wasConnected) { |
|
this.connected = true; |
|
} |
|
if (!this.shadow) { |
|
const [stylesheet, markup] = await Promise.all([ |
|
getStyleSheet(elementName), |
|
getTemplateMarkup(elementName), |
|
]); |
|
if (markup) { |
|
const temp = $el('div'); |
|
const templatesMarkup = markup.match(/<template[^]*?<\/template>/gm) || []; |
|
for (const markup of templatesMarkup) { |
|
temp.innerHTML = markup; |
|
const template = temp.children[0]; |
|
if (!(template instanceof HTMLTemplateElement)) { |
|
throw new Error('Not a template element.'); |
|
} |
|
const id = template.getAttribute('id'); |
|
if (!id) { |
|
throw new Error('Not template id.'); |
|
} |
|
this.templates.set(id, template); |
|
} |
|
} |
|
this.shadow = this.attachShadow({ mode: "open" }); |
|
const sheet = new CSSStyleSheet(); |
|
sheet.replaceSync(stylesheet); |
|
this.shadow.adoptedStyleSheets = [sheet]; |
|
let template; |
|
if (this.templates.has(elementName)) { |
|
template = this.templates.get(elementName); |
|
} |
|
else if (this.templates.has(elementName.replace('rgthree-', ''))) { |
|
template = this.templates.get(elementName.replace('rgthree-', '')); |
|
} |
|
if (template) { |
|
this.shadow.appendChild(template.content.cloneNode(true)); |
|
} |
|
this.onFirstConnected(); |
|
} |
|
else { |
|
this.onReconnected(); |
|
} |
|
this.onConnected(); |
|
} |
|
disconnectedCallback() { |
|
this.connected = false; |
|
this.onDisconnected(); |
|
} |
|
} |
|
RgthreeCustomElement.NAME = "rgthree-override"; |
|
|