import { ComponentBase } from '../ComponentBase'; import { DomRender, DomRenderRunConfig } from '../../DomRender'; import { RawSet } from '../../rawsets/RawSet'; import { OtherData } from '../../lifecycle/OnChangeAttrRender'; import { OnCreateRenderDataParams } from '../../lifecycle/OnCreateRenderData'; export namespace Choose { export const selector = 'dr-choose'; export type Attribute = { data: D; }; export type WhenAttribute = { test: (data?: D | null) => boolean; }; class ChildOtherWiseBase extends ComponentBase { public hidden = true; } class ChildBase extends ChildOtherWiseBase> { data?: D; } export class When extends ChildBase { constructor() { super({ onlyParentType: Choose }); } } export class OtherWise extends ChildBase { constructor() { super({ onlyParentType: Choose }); } } export class Choose extends ComponentBase> { private choose?: When | OtherWise; onCreatedThisChild(child: any, data: OnCreateRenderDataParams) { super.onCreatedThisChild(child, data); this.setChange(child); } onChangeAttrRender(name: string, value: any, other: OtherData) { super.onChangeAttrRender(name, value, other); if (this.equalsAttributeName(name, 'data')) { this.choose = undefined; const children = this.getChildren([When, OtherWise]).sort( (a, b) => (a instanceof OtherWise ? 1 : 0) - (b instanceof OtherWise ? 1 : 0) ); children.forEach(it => this.setChange(it as any)); } } private setChange(child: When | OtherWise) { child.data = this.getAttribute('data') as any; // when.hidden = true; console.log('eeeeeee?', child, child.getAttribute('test'), this.getAttribute('data')); if (!this.choose && child instanceof When && child.getAttribute('test')?.(this.getAttribute('data'))) { console.log('eeeeeee?2'); // console.log('------------', child.attribute?.test?.(this.attribute?.data)) this.choose = child; if (child.hidden) { child.hidden = false; } // console.log('--------', when) } else if (this.choose !== child) { child.hidden = true; } console.log('eeeeeee?3'); if (!this.choose && child instanceof OtherWise) { this.choose = child; if (child.hidden) { child.hidden = false; } } console.log('eeeeeee?34'); } } } export default { chooseWhen: (config?: DomRenderRunConfig) => { return RawSet.createComponentTargetElement({ name: `${Choose.selector}-when`, template: '
#innerHTML#
', objFactory: (e, o, r2, counstructorParam) => { return DomRender.run({ rootObject: new Choose.When(), config: config }); } }); }, chooseOtherWise: (config?: DomRenderRunConfig) => { return RawSet.createComponentTargetElement({ name: `${Choose.selector}-other-wise`, template: '
#innerHTML#
', objFactory: (e, o, r2, counstructorParam) => { return DomRender.run({ rootObject: new Choose.OtherWise(), config: config }); } }); }, choose: (config?: DomRenderRunConfig) => { return RawSet.createComponentTargetElement({ name: `${Choose.selector}`, template: '#innerHTML#', objFactory: (e, o, r2, counstructorParam) => { return DomRender.run({ rootObject: new Choose.Choose(...counstructorParam), config: config }); } }); } };