import { LitElement, property, html, customElement, TemplateResult, queryAsync } from 'lit-element'; import * as plugins from '../wcctools.plugins'; // wcc tools import './wcc-frame'; import './wcc-sidebar'; import './wcc-properties'; import { TTheme } from './wcc-properties'; import { TElementType } from './wcc-sidebar'; import { breakpoints } from '@designestate/dees-domtools'; import { WccFrame } from './wcc-frame'; @customElement('wcc-dashboard') export class WccDashboard extends LitElement { public domtools: plugins.deesDomtools.DomTools; @property() public selectedType: TElementType; @property() public selectedItemName: string; @property() public selectedItem: (() => TemplateResult) | LitElement; @property() public selectedViewport: plugins.deesDomtools.breakpoints.TViewport = 'desktop'; @property() public selectedTheme: TTheme = 'dark'; @property() public pages: { [key: string]: () => TemplateResult } = {}; @property() public elements: { [key: string]: LitElement } = {}; @property() public warning: string = null; @queryAsync('wcc-frame') public wccFrame: Promise; constructor( elementsArg?: { [key: string]: LitElement }, pagesArg?: { [key: string]: () => TemplateResult } ) { super(); if (elementsArg) { this.elements = elementsArg; console.log('got elements:'); console.log(this.elements); } if (pagesArg) { this.pages = pagesArg; } } public render(): TemplateResult { return html` { this.selectedType = eventArg.detail; }} @selectedItemName=${(eventArg) => { this.selectedItemName = eventArg.detail; }} @selectedItem=${(eventArg) => { this.selectedItem = eventArg.detail; }} > { this.selectedViewport = eventArg.detail; this.scheduleUpdate(); }} @selectedTheme=${(eventArg) => { this.selectedTheme = eventArg.detail; }} > ${(() => { if (this.selectedType === 'page' && this.selectedItem) { if (typeof this.selectedItem === 'function') { return this.selectedItem(); } else { console.error('The selected item looks strange:'); console.log(this.selectedItem); } } else if (this.selectedType === 'element' && this.selectedItem) { // console.log(this.selectedItem); const anonItem: any = this.selectedItem; if (!anonItem.demo) { this.setWarning(`component ${anonItem.name} does not expose a demo property.`); return; } if (!(typeof anonItem.demo === 'function')) { this.setWarning( `component ${anonItem.name} has demo property, but it is not of type function` ); return; } this.setWarning(null); return html`${anonItem.demo()}`; } })()} `; } public setWarning(warningTextArg: string) { if (this.warning !== warningTextArg) { console.log(warningTextArg); this.warning = warningTextArg; setTimeout(() => { this.scheduleUpdate(); }, 0); } } public async firstUpdated() { this.domtools = await plugins.deesDomtools.DomTools.setupDomTools(); this.domtools.router.on( '/wcctools-route/:itemType/:itemName/:viewport/:theme', async (routeInfo) => { this.selectedType = routeInfo.params.itemType as TElementType; this.selectedItemName = routeInfo.params.itemName; this.selectedViewport = routeInfo.params.viewport as breakpoints.TViewport; this.selectedTheme = routeInfo.params.theme as TTheme; if (routeInfo.params.itemType === 'element') { this.selectedItem = this.elements[routeInfo.params.itemName]; } else if (routeInfo.params.itemType === 'page') { this.selectedItem = this.pages[routeInfo.params.itemName]; } const domtoolsInstance = await plugins.deesDomtools.elementBasic.setup(); this.selectedTheme === 'bright' ? domtoolsInstance.themeManager.goBright() : domtoolsInstance.themeManager.goDark(); } ); } private updating = false; public async updated() { if (this.updating) { return; } this.domtools = await plugins.deesDomtools.DomTools.setupDomTools(); await this.domtools.router._handleRouteState(); this.updating = true; const storeElement = this.selectedItem; setTimeout(async () => { this.selectedItem = null; setTimeout(async () => { this.selectedItem = storeElement; setTimeout(() => { this.updating = false; }, 0); }); }, 0); } public buildUrl() { this.domtools.router.pushUrl( `/wcctools-route/${this.selectedType}/${this.selectedItemName}/${this.selectedViewport}/${this.selectedTheme}` ); } }