1- interface WidgetDefinition {
2- type : string ;
1+ type TextWidget = {
2+ type : "title" | "heading" | "text" ;
3+ text : string ;
4+ } ;
5+
6+ type ImageWidget = {
7+ type : "image" ;
8+ file : string ;
9+ width ?: number ;
10+ height ?: number ;
11+ } ;
12+
13+ type NumberWidget = {
14+ type : "number" | "value" ;
315 text : string ;
4- default : string | undefined ;
516 value : {
6- type : string ;
7- default : number ;
8- range : [ number , number ] ;
17+ type : "int" | "percent" | "float" ;
18+ default ?: number ;
19+ range ?: [ number , number ] ;
20+ step ?: number ;
21+ suffix ?: string ;
22+ decimals ?: number ;
923 } ;
10- }
24+ method : string ;
25+ slots : string | string [ ] ;
26+ } ;
27+
28+ type SliderWidget = {
29+ type : "slider" ;
30+ value : {
31+ type : "int" | "percent" | "float" ;
32+ default ?: number ;
33+ range ?: [ number , number ] ;
34+ step ?: number ;
35+ } ;
36+ method : string ;
37+ slots : string | string [ ] ;
38+ } ;
39+
40+ type SwitchWidget = {
41+ type : "switch" ;
42+ text : string ;
43+ method ?: string ;
44+ slots : string | string [ ] ;
45+ default ?: "enabled" | "disabled" ;
46+ enabled_text ?: string ;
47+ disabled_text ?: string ;
48+ } ;
49+
50+ type WidgetDefinition = TextWidget | ImageWidget | NumberWidget | SliderWidget | SwitchWidget ;
1151
1252interface ConfigDefinition {
1353 meta : object ;
@@ -33,57 +73,51 @@ export class ConfigClass {
3373 }
3474
3575 public get_widgets_html ( ) {
36- let html_widgets : DocumentFragment [ ] = [ ] ;
37-
38- let i = 0 ;
39- this . widgets . forEach ( ( element ) => {
40- const type = element . type ;
41-
42- if ( ! ( type in typeTemplateMap ) ) {
43- console . error ( "No template found for type" , type ) ;
44- return ;
45- }
46-
47- let template = document . getElementById ( typeTemplateMap [ type ] ) as HTMLTemplateElement ;
48-
49- // Create the thing
50- let clone = template . content . cloneNode ( true ) as DocumentFragment ;
51- ( clone . querySelector ( ".widget-text" ) as HTMLElement ) . innerText = element . text ;
52-
53- if ( type == "switch" ) {
54- // if (element.default == "disabled") {
55- // (clone.querySelector(".widget-switch-input") as HTMLInputElement).checked = false;
56- // }
57- // else if (element.default == "enabled") {
58- // (clone.querySelector(".widget-switch-input") as HTMLInputElement).checked = true;
59- // }
60- } else if ( type == "slider" || type == "number" || type == "value" ) {
61- ( clone . querySelector ( ".widget-input" ) as HTMLInputElement ) . valueAsNumber =
62- element . value . default ;
63- if ( element . value . range )
64- ( clone . querySelector ( ".widget-input" ) as HTMLInputElement ) . min =
65- element . value . range [ 0 ] . toString ( ) ;
66- if ( element . value . range )
67- ( clone . querySelector ( ".widget-input" ) as HTMLInputElement ) . max =
68- element . value . range [ 1 ] . toString ( ) ;
69-
70- if ( element . value . type ) {
71- if ( element . value . type == "percent" ) {
72- ( clone . querySelector ( ".widget-text" ) as HTMLElement ) . innerText += " (%)" ;
76+ let html_widgets = this . widgets
77+ . map ( ( element , index ) => {
78+ const type = element . type ;
79+
80+ if ( ! ( type in typeTemplateMap ) ) {
81+ console . error ( "No template found for type" , type ) ;
82+ return ;
83+ }
84+
85+ let template = document . getElementById ( typeTemplateMap [ type ] ) as HTMLTemplateElement ;
86+
87+ // Create the thing
88+ let clone = template . content . cloneNode ( true ) as DocumentFragment ;
89+ if ( "text" in element )
90+ ( clone . querySelector ( ".widget-text" ) as HTMLElement ) . innerText = element . text ;
91+
92+ if ( type == "switch" ) {
93+ ( clone . querySelector ( ".widget-switch-input" ) as HTMLInputElement ) . checked = ! (
94+ element . default === "disabled"
95+ ) ;
96+ } else if ( type == "slider" || type == "number" || type == "value" ) {
97+ const inputElement = clone . querySelector ( ".widget-input" ) as HTMLInputElement ;
98+
99+ if ( element . value . default ) inputElement . valueAsNumber = element . value . default ;
100+ if ( element . value . range ) inputElement . min = element . value . range [ 0 ] . toString ( ) ;
101+ if ( element . value . range ) inputElement . max = element . value . range [ 1 ] . toString ( ) ;
102+
103+ if ( element . value . type ) {
104+ if ( element . value . type == "percent" ) {
105+ ( clone . querySelector ( ".widget-text" ) as HTMLElement ) . innerText += " (%)" ;
106+ }
73107 }
108+ } else if ( type == "image" ) {
109+ ( clone . querySelector ( ".widget-image" ) as HTMLImageElement ) . src = "" ;
74110 }
75- }
76-
77- // Set input ID
78- if ( type != "text" && type != "image" && type != "title" && type != "heading" ) {
79- ( clone . querySelector ( ".widget-input" ) as HTMLInputElement ) . id =
80- "widget-input-" + i . toString ( ) ;
81- }
82-
83- // Push to array
84- html_widgets . push ( clone ) ;
85- i += 1 ;
86- } ) ;
111+
112+ // Set input ID
113+ if ( type != "text" && type != "image" && type != "title" && type != "heading" ) {
114+ ( clone . querySelector ( ".widget-input" ) as HTMLInputElement ) . id =
115+ "widget-input-" + index . toString ( ) ;
116+ }
117+
118+ return clone ;
119+ } )
120+ . filter ( ( element ) => element !== undefined ) ;
87121
88122 // Return array of HTML elements
89123 return html_widgets ;
0 commit comments