File size: 3,697 Bytes
4450790 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 |
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";
|