feat: add async demo support and enhance template resolution
- Introduced async demo functionality in the README, allowing for asynchronous data preparation before rendering components. - Updated WccDashboard, WccProperties, and WccSidebar to support Promise-based template factories. - Implemented resolveTemplateFactory to handle both synchronous and asynchronous template results. - Added tests for resolveTemplateFactory to ensure correct behavior for both sync and async templates. - Updated pnpm workspace configuration.
This commit is contained in:
@@ -1,4 +1,6 @@
|
||||
import { DeesElement, property, html, customElement, type TemplateResult, queryAsync, render, domtools } from '@design.estate/dees-element';
|
||||
import { resolveTemplateFactory } from './wcctools.helpers.js';
|
||||
import type { TTemplateFactory } from './wcctools.helpers.js';
|
||||
|
||||
import * as plugins from '../wcctools.plugins.js';
|
||||
|
||||
@@ -21,7 +23,7 @@ export class WccDashboard extends DeesElement {
|
||||
public selectedItemName: string;
|
||||
|
||||
@property()
|
||||
public selectedItem: (() => TemplateResult) | DeesElement;
|
||||
public selectedItem: TTemplateFactory | DeesElement;
|
||||
|
||||
@property()
|
||||
public selectedViewport: plugins.deesDomtools.breakpoints.TViewport = 'desktop';
|
||||
@@ -33,7 +35,7 @@ export class WccDashboard extends DeesElement {
|
||||
public isFullscreen: boolean = false;
|
||||
|
||||
@property()
|
||||
public pages: { [key: string]: () => TemplateResult } = {};
|
||||
public pages: Record<string, TTemplateFactory> = {};
|
||||
|
||||
@property()
|
||||
public elements: { [key: string]: DeesElement } = {};
|
||||
@@ -50,7 +52,7 @@ export class WccDashboard extends DeesElement {
|
||||
|
||||
constructor(
|
||||
elementsArg?: { [key: string]: DeesElement },
|
||||
pagesArg?: { [key: string]: () => TemplateResult }
|
||||
pagesArg?: Record<string, TTemplateFactory>
|
||||
) {
|
||||
super();
|
||||
if (elementsArg) {
|
||||
@@ -201,7 +203,9 @@ export class WccDashboard extends DeesElement {
|
||||
if (typeof this.selectedItem === 'function') {
|
||||
console.log('slotting page.');
|
||||
const viewport = await wccFrame.getViewportElement();
|
||||
render(this.selectedItem(), viewport);
|
||||
const pageFactory = this.selectedItem as TTemplateFactory;
|
||||
const pageTemplate = await resolveTemplateFactory(pageFactory);
|
||||
render(pageTemplate, viewport);
|
||||
console.log('rendered page.');
|
||||
} else {
|
||||
console.error('The selected item looks strange:');
|
||||
@@ -222,7 +226,8 @@ export class WccDashboard extends DeesElement {
|
||||
}
|
||||
this.setWarning(null);
|
||||
const viewport = await wccFrame.getViewportElement();
|
||||
render(anonItem.demo(), viewport);;
|
||||
const demoTemplate = await resolveTemplateFactory(() => anonItem.demo());
|
||||
render(demoTemplate, viewport);
|
||||
}
|
||||
}
|
||||
|
||||
|
@@ -1,5 +1,6 @@
|
||||
import { DeesElement, property, html, customElement, type TemplateResult, state } from '@design.estate/dees-element';
|
||||
import { WccDashboard } from './wcc-dashboard.js';
|
||||
import type { TTemplateFactory } from './wcctools.helpers.js';
|
||||
|
||||
export type TPropertyType = 'String' | 'Number' | 'Boolean' | 'Object' | 'Enum' | 'Array';
|
||||
|
||||
@@ -20,7 +21,7 @@ export class WccProperties extends DeesElement {
|
||||
public dashboardRef: WccDashboard;
|
||||
|
||||
@property()
|
||||
public selectedItem: (() => TemplateResult) | DeesElement;
|
||||
public selectedItem: TTemplateFactory | DeesElement;
|
||||
|
||||
@property()
|
||||
public selectedViewport: TEnvironment = 'native';
|
||||
|
@@ -1,13 +1,14 @@
|
||||
import * as plugins from '../wcctools.plugins.js';
|
||||
import { DeesElement, property, html, customElement, type TemplateResult } from '@design.estate/dees-element';
|
||||
import { WccDashboard } from './wcc-dashboard.js';
|
||||
import type { TTemplateFactory } from './wcctools.helpers.js';
|
||||
|
||||
export type TElementType = 'element' | 'page';
|
||||
|
||||
@customElement('wcc-sidebar')
|
||||
export class WccSidebar extends DeesElement {
|
||||
@property({ attribute: false })
|
||||
public selectedItem: DeesElement | (() => TemplateResult);
|
||||
public selectedItem: DeesElement | TTemplateFactory;
|
||||
|
||||
@property({ attribute: false })
|
||||
public selectedType: TElementType;
|
||||
@@ -202,7 +203,7 @@ export class WccSidebar extends DeesElement {
|
||||
`;
|
||||
}
|
||||
|
||||
public selectItem(typeArg: TElementType, itemNameArg: string, itemArg: (() => TemplateResult) | DeesElement) {
|
||||
public selectItem(typeArg: TElementType, itemNameArg: string, itemArg: TTemplateFactory | DeesElement) {
|
||||
console.log('selected item');
|
||||
console.log(itemNameArg);
|
||||
console.log(itemArg);
|
||||
|
9
ts_web/elements/wcctools.helpers.ts
Normal file
9
ts_web/elements/wcctools.helpers.ts
Normal file
@@ -0,0 +1,9 @@
|
||||
import type { TemplateResult } from 'lit';
|
||||
|
||||
export type TTemplateFactory = () => TemplateResult | Promise<TemplateResult>;
|
||||
|
||||
export const resolveTemplateFactory = async (
|
||||
factoryArg: TTemplateFactory
|
||||
): Promise<TemplateResult> => {
|
||||
return await Promise.resolve(factoryArg());
|
||||
};
|
Reference in New Issue
Block a user