'use strict';
/*
* Compatibility Checks
*/
if (!window.customElements) {
console.warn('Custom Elements API is not available. Thus, interactivity is not available');
}
/*
* Custom Elements
*/
const slotTemplate = document.createElement('template');
slotTemplate.innerHTML = `
`;
// Icons
const iconSolidTrashTemplate = document.querySelector('#icon-solid-trash');
class IconSolidTrashElement extends HTMLElement {
constructor() {
super();
this.attachShadow({ mode: 'open' });
this.shadowRoot.appendChild(iconSolidTrashTemplate.content.cloneNode(true));
}
}
const iconSolidPlusTemplate = document.querySelector('#icon-solid-plus');
class IconSolidPlusElement extends HTMLElement {
constructor() {
super();
this.attachShadow({ mode: 'open' });
this.shadowRoot.appendChild(iconSolidPlusTemplate.content.cloneNode(true));
}
}
// Zone
const zoneTemplate = document.createElement('template');
zoneTemplate.innerHTML = `
`;
class ZoneElement extends HTMLElement {
constructor() {
super();
this.attachShadow({ mode: 'open' });
this.shadowRoot.appendChild(zoneTemplate.content.cloneNode(true));
}
}
// ZoneName
const zoneNameTemplate = document.createElement('template');
zoneNameTemplate.innerHTML = `
`;
class ZoneNameElement extends HTMLElement {
constructor() {
super();
this.attachShadow({ mode: 'open' });
this.shadowRoot.appendChild(zoneNameTemplate.content.cloneNode(true));
}
}
// ZoneOffset
const zoneOffsetTemplate = document.createElement('template');
zoneOffsetTemplate.innerHTML = `
`;
class ZoneOffsetElement extends HTMLElement {
constructor() {
super();
this.attachShadow({ mode: 'open' });
this.shadowRoot.appendChild(zoneOffsetTemplate.content.cloneNode(true));
}
}
// Date
class DateElement extends HTMLElement {
constructor() {
super();
this.attachShadow({ mode: 'open' });
this.shadowRoot.appendChild(slotTemplate.content.cloneNode(true));
}
}
// Time
class TimeElement extends HTMLElement {
constructor() {
super();
this.attachShadow({ mode: 'open' });
this.shadowRoot.appendChild(slotTemplate.content.cloneNode(true));
}
}
// SearchList
const zoneSearchTemplate = document.createElement('template');
zoneSearchTemplate.innerHTML = `
`;
class ZoneSearchElement extends HTMLElement {
constructor() {
super();
this.attachShadow({ mode: 'open' });
this.shadowRoot.appendChild(zoneSearchTemplate.content.cloneNode(true));
this.shadowRoot.querySelector('input[type=search]').addEventListener('input', this.input.bind(this));
}
input() {
const text = this.shadowRoot.querySelector('input[type=search]').value;
const e = new CustomEvent('searchinput', { detail: { text } });
this.dispatchEvent(e);
}
show(results) {
const resultsElement = this.shadowRoot.querySelector('#results');
const template = this.shadowRoot.querySelector('#result-template').content;
resultsElement.innerHTML = '';
for (const result of results) {
const resultElement = template.cloneNode(true);
resultElement.querySelector('d-zonename').innerText = result.n;
resultElement.querySelector('d-zoneoffset').innerText = '+to:do';
resultElement.querySelector('.add').dataset.id = result.id;
resultElement.querySelector('.add').addEventListener('click', (e) => {
this.resultClick(result);
});
resultsElement.appendChild(resultElement);
}
}
resultClick(zone) {
console.debug(zone.id);
}
}
// ZoneAdd
const zoneAddTemplate = document.createElement('template');
zoneAddTemplate.innerHTML = `
`;
class ZoneAddElement extends HTMLElement {
constructor() {
super();
this.attachShadow({ mode: 'open' });
this.shadowRoot.appendChild(zoneAddTemplate.content.cloneNode(true));
this.searchElement = this.shadowRoot.querySelector('d-zoneadd-search');
window.s = this.searchElement;
this.searchElement.show([
{ n: 'St. John\'s, Newfoundland and Labrador, CA', id: 'St_John\'s-Newfoundland_and_Labrador-CA' },
{ n: 'Singapore, SG', id: 'Singapore-SG' },
]);
this.searchElement.addEventListener('searchinput', this.input.bind(this));
}
input({ detail: { text } }) {
console.debug(text);
}
}
// Definitions
window.customElements.define('icon-solid-trash', IconSolidTrashElement);
window.customElements.define('icon-solid-plus', IconSolidPlusElement);
window.customElements.define('d-zone', ZoneElement);
window.customElements.define('d-zonename', ZoneNameElement);
window.customElements.define('d-zoneoffset', ZoneOffsetElement);
window.customElements.define('d-date', DateElement);
window.customElements.define('d-time', TimeElement);
// TODO: Instead of relying on , render using attributes
window.customElements.define('d-zoneadd-search', ZoneSearchElement);
window.customElements.define('d-zoneadd', ZoneAddElement);