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