Skip to content

Commit 0df9ec2

Browse files
committed
✨ feat(setting-utils): 增加自定义元素功能
1 parent 57cc62f commit 0df9ec2

File tree

2 files changed

+89
-60
lines changed

2 files changed

+89
-60
lines changed

src/libs/index.d.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,4 +19,5 @@ interface ISettingItem {
1919
label: string;
2020
callback: () => void;
2121
}
22+
createElement?: (currentVal: any) => HTMLElement;
2223
}

src/libs/setting-utils.ts

Lines changed: 88 additions & 60 deletions
Original file line numberDiff line numberDiff line change
@@ -3,35 +3,45 @@
33
* @Author : frostime
44
* @Date : 2023-12-17 18:28:19
55
* @FilePath : /src/libs/setting-utils.ts
6-
* @LastEditTime : 2024-04-28 17:49:31
6+
* @LastEditTime : 2024-04-29 17:17:19
77
* @Description :
88
*/
99

1010
import { Plugin, Setting } from 'siyuan';
1111

12-
const valueOf = (ele: HTMLElement) => {
12+
const valueOf = (ele: HTMLElement, parseNumber: Function=parseInt) => {
13+
let val: any = null;
1314
if (ele instanceof HTMLInputElement) {
1415
if (ele.type === 'checkbox') {
15-
return ele.checked;
16+
val = ele.checked;
1617
} else {
17-
return ele.value;
18+
if (ele.type === 'number') {
19+
val = parseNumber(ele.value);
20+
} else {
21+
val = ele.value;
22+
}
1823
}
1924
} else if (ele instanceof HTMLSelectElement) {
20-
return ele.value;
25+
val = ele.value;
2126
} else if (ele instanceof HTMLTextAreaElement) {
22-
return ele.value;
27+
val = ele.value;
2328
} else {
24-
return ele.textContent;
29+
val = ele?.textContent;
2530
}
31+
return val;
2632
}
2733

2834
const setValue = (ele: HTMLElement, value: any) => {
35+
if (ele === null || ele === undefined) return;
2936
if (ele instanceof HTMLInputElement) {
3037
if (ele.type === 'checkbox') {
3138
ele.checked = value;
3239
} else {
3340
ele.value = value;
3441
}
42+
if (ele.type === 'range') {
43+
ele.ariaLabel = value;
44+
}
3545
} else if (ele instanceof HTMLSelectElement) {
3646
ele.value = value;
3747
} else if (ele instanceof HTMLTextAreaElement) {
@@ -74,7 +84,7 @@ export class SettingUtils {
7484
this.save();
7585
},
7686
destroyCallback: () => {
77-
//从值恢复元素
87+
//Restore the original value
7888
for (let key of this.settings.keys()) {
7989
this.updateElementFromValue(key);
8090
}
@@ -197,8 +207,6 @@ export class SettingUtils {
197207
*/
198208
dump(): Object {
199209
let data: any = {};
200-
201-
202210
for (let [key, item] of this.settings) {
203211
if (item.type === 'button') continue;
204212
data[key] = item.value;
@@ -208,6 +216,33 @@ export class SettingUtils {
208216

209217
addItem(item: ISettingItem) {
210218
this.settings.set(item.key, item);
219+
if (item.createElement === undefined) {
220+
let itemElement = this.createDefaultElement(item);
221+
this.elements.set(item.key, itemElement);
222+
this.plugin.setting.addItem({
223+
title: item.title,
224+
description: item?.description,
225+
createActionElement: () => {
226+
this.updateElementFromValue(item.key);
227+
let element = this.getElement(item.key);
228+
return element;
229+
}
230+
});
231+
} else {
232+
this.plugin.setting.addItem({
233+
title: item.title,
234+
description: item?.description,
235+
createActionElement: () => {
236+
let val = this.get(item.key);
237+
let element = item.createElement(val);
238+
this.elements.set(item.key, element);
239+
return element;
240+
}
241+
});
242+
}
243+
}
244+
245+
createDefaultElement(item: ISettingItem) {
211246
let itemElement: HTMLElement;
212247
switch (item.type) {
213248
case 'checkbox':
@@ -283,16 +318,7 @@ export class SettingUtils {
283318
itemElement = hintElement;
284319
break;
285320
}
286-
this.elements.set(item.key, itemElement);
287-
this.plugin.setting.addItem({
288-
title: item.title,
289-
description: item?.description,
290-
createActionElement: () => {
291-
this.updateElementFromValue(item.key);
292-
let element = this.getElement(item.key);
293-
return element;
294-
}
295-
})
321+
return itemElement;
296322
}
297323

298324
/**
@@ -309,50 +335,52 @@ export class SettingUtils {
309335
private updateValueFromElement(key: string) {
310336
let item = this.settings.get(key);
311337
let element = this.elements.get(key) as any;
312-
switch (item.type) {
313-
case 'checkbox':
314-
item.value = element.checked;
315-
break;
316-
case 'select':
317-
item.value = element.value;
318-
break;
319-
case 'slider':
320-
item.value = element.value;
321-
break;
322-
case 'textinput':
323-
item.value = element.value;
324-
break;
325-
case 'textarea':
326-
item.value = element.value;
327-
break;
328-
case 'number':
329-
item.value = parseInt(element.value);
330-
break;
331-
}
338+
item.value = valueOf(element);
339+
// switch (item.type) {
340+
// case 'checkbox':
341+
// item.value = element.checked;
342+
// break;
343+
// case 'select':
344+
// item.value = element.value;
345+
// break;
346+
// case 'slider':
347+
// item.value = element.value;
348+
// break;
349+
// case 'textinput':
350+
// item.value = element.value;
351+
// break;
352+
// case 'textarea':
353+
// item.value = element.value;
354+
// break;
355+
// case 'number':
356+
// item.value = parseInt(element.value);
357+
// break;
358+
// }
332359
}
333360

334361
private updateElementFromValue(key: string) {
335362
let item = this.settings.get(key);
336363
let element = this.elements.get(key) as any;
337-
switch (item.type) {
338-
case 'checkbox':
339-
element.checked = item.value;
340-
break;
341-
case 'select':
342-
element.value = item.value;
343-
break;
344-
case 'slider':
345-
element.value = item.value;
346-
break;
347-
case 'textinput':
348-
element.value = item.value;
349-
break;
350-
case 'textarea':
351-
element.value = item.value;
352-
break;
353-
case 'number':
354-
element.value = item.value;
355-
break;
356-
}
364+
setValue(element, item.value);
365+
// switch (item.type) {
366+
// case 'checkbox':
367+
// element.checked = item.value;
368+
// break;
369+
// case 'select':
370+
// element.value = item.value;
371+
// break;
372+
// case 'slider':
373+
// element.value = item.value;
374+
// break;
375+
// case 'textinput':
376+
// element.value = item.value;
377+
// break;
378+
// case 'textarea':
379+
// element.value = item.value;
380+
// break;
381+
// case 'number':
382+
// element.value = item.value;
383+
// break;
384+
// }
357385
}
358386
}

0 commit comments

Comments
 (0)