Skip to content

Commit da071ed

Browse files
committed
reworking widget mapping
1 parent dbddbcb commit da071ed

File tree

1 file changed

+90
-56
lines changed

1 file changed

+90
-56
lines changed

src/config.ts

Lines changed: 90 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,53 @@
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

1252
interface 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

Comments
 (0)