33 * @Author : frostime
44 * @Date : 2023-12-17 18:28:19
55 * @FilePath : /src/libs/setting-utils.ts
6- * @LastEditTime : 2024-04-30 16:09:54
6+ * @LastEditTime : 2024-04-30 16:28:00
77 * @Description :
88 */
99
1010import { Plugin , Setting } from 'siyuan' ;
1111
12- const valueOf = ( ele : HTMLElement , parseNumber : Function = parseInt ) => {
13- let val : any = null ;
14- if ( ele instanceof HTMLInputElement ) {
15- if ( ele . type === 'checkbox' ) {
16- val = ele . checked ;
17- } else {
18- if ( ele . type === 'number' ) {
19- val = parseNumber ( ele . value ) ;
20- } else {
21- val = ele . value ;
12+
13+ /**
14+ * The default function to get the value of the element
15+ * @param type
16+ * @returns
17+ */
18+ const createDefaultGetter = ( type : TSettingItemType ) => {
19+ let getter : ( ele : HTMLElement ) => any ;
20+ switch ( type ) {
21+ case 'checkbox' :
22+ getter = ( ele : HTMLInputElement ) => {
23+ return ele . checked ;
2224 }
23- }
24- } else if ( ele instanceof HTMLSelectElement ) {
25- val = ele . value ;
26- } else if ( ele instanceof HTMLTextAreaElement ) {
27- val = ele . value ;
28- } else {
29- val = ele ?. textContent ;
25+ break ;
26+ case 'select' :
27+ case 'slider' :
28+ case 'textinput' :
29+ case 'textarea' :
30+ getter = ( ele : HTMLInputElement | HTMLTextAreaElement | HTMLSelectElement ) => {
31+ return ele . value ;
32+ }
33+ break ;
34+ case 'number' :
35+ getter = ( ele : HTMLInputElement ) => {
36+ return parseInt ( ele . value ) ;
37+ }
38+ break ;
39+ default :
40+ getter = ( ele : HTMLElement ) => {
41+ return ele ?. textContent ;
42+ }
43+ break ;
3044 }
31- return val ;
45+ return getter ;
3246}
3347
34- const setValue = ( ele : HTMLElement , value : any ) => {
35- if ( ele === null || ele === undefined ) return ;
36- if ( ele instanceof HTMLInputElement ) {
37- if ( ele . type === 'checkbox' ) {
38- ele . checked = value ;
39- } else {
40- ele . value = value ;
41- }
42- if ( ele . type === 'range' ) {
43- ele . ariaLabel = value ;
44- }
45- } else if ( ele instanceof HTMLSelectElement ) {
46- ele . value = value ;
47- } else if ( ele instanceof HTMLTextAreaElement ) {
48- ele . value = value ;
49- } else {
50- ele . textContent = value ;
48+
49+ /**
50+ * The default function to set the value of the element
51+ * @param type
52+ * @returns
53+ */
54+ const createDefaultSetter = ( type : TSettingItemType ) => {
55+ let setter : ( ele : HTMLElement , value : any ) => void ;
56+ switch ( type ) {
57+ case 'checkbox' :
58+ setter = ( ele : HTMLInputElement , value : any ) => {
59+ ele . checked = value ;
60+ }
61+ break ;
62+ case 'select' :
63+ case 'slider' :
64+ case 'textinput' :
65+ case 'textarea' :
66+ case 'number' :
67+ setter = ( ele : HTMLInputElement | HTMLTextAreaElement | HTMLSelectElement , value : any ) => {
68+ ele . value = value ;
69+ }
70+ break ;
5171 }
72+ return setter ;
73+
5274}
5375
76+
5477export class SettingUtils {
5578 plugin : Plugin ;
5679 name : string ;
5780 file : string ;
5881
59- settings : Map < string , ISettingItemCore > = new Map ( ) ;
82+ settings : Map < string , ISettingUtilsItem > = new Map ( ) ;
6083 elements : Map < string , HTMLElement > = new Map ( ) ;
6184
6285 constructor ( args : {
@@ -157,14 +180,15 @@ export class SettingUtils {
157180 * @returns value in html
158181 */
159182 take ( key : string , apply : boolean = false ) {
183+ let item = this . settings . get ( key ) ;
160184 let element = this . elements . get ( key ) as any ;
161- if ( ! element ) {
185+ if ( ! element ) {
162186 return
163187 }
164188 if ( apply ) {
165189 this . updateValueFromElement ( key ) ;
166190 }
167- return valueOf ( element )
191+ return item . getEleVal ( element ) ;
168192 }
169193
170194 /**
@@ -216,6 +240,13 @@ export class SettingUtils {
216240
217241 addItem ( item : ISettingUtilsItem ) {
218242 this . settings . set ( item . key , item ) ;
243+ if ( item . getEleVal === undefined ) {
244+ item . getEleVal = createDefaultGetter ( item . type ) ;
245+ }
246+ if ( item . setEleVal === undefined ) {
247+ item . setEleVal = createDefaultSetter ( item . type ) ;
248+ }
249+
219250 if ( item . createElement === undefined ) {
220251 let itemElement = this . createDefaultElement ( item ) ;
221252 this . elements . set ( item . key , itemElement ) ;
@@ -338,53 +369,13 @@ export class SettingUtils {
338369 let item = this . settings . get ( key ) ;
339370 if ( item . type === 'button' ) return ;
340371 let element = this . elements . get ( key ) as any ;
341- item . value = valueOf ( element ) ;
342- // switch (item.type) {
343- // case 'checkbox':
344- // item.value = element.checked;
345- // break;
346- // case 'select':
347- // item.value = element.value;
348- // break;
349- // case 'slider':
350- // item.value = element.value;
351- // break;
352- // case 'textinput':
353- // item.value = element.value;
354- // break;
355- // case 'textarea':
356- // item.value = element.value;
357- // break;
358- // case 'number':
359- // item.value = parseInt(element.value);
360- // break;
361- // }
372+ item . value = item . getEleVal ( element ) ;
362373 }
363374
364375 private updateElementFromValue ( key : string ) {
365376 let item = this . settings . get ( key ) ;
366377 if ( item . type === 'button' ) return ;
367378 let element = this . elements . get ( key ) as any ;
368- setValue ( element , item . value ) ;
369- // switch (item.type) {
370- // case 'checkbox':
371- // element.checked = item.value;
372- // break;
373- // case 'select':
374- // element.value = item.value;
375- // break;
376- // case 'slider':
377- // element.value = item.value;
378- // break;
379- // case 'textinput':
380- // element.value = item.value;
381- // break;
382- // case 'textarea':
383- // element.value = item.value;
384- // break;
385- // case 'number':
386- // element.value = item.value;
387- // break;
388- // }
379+ item . setEleVal ( element , item . value ) ;
389380 }
390381}
0 commit comments