Skip to content

Commit 3d56542

Browse files
committed
🎨 feat: Add "custom setting-items" example
1 parent 29c494a commit 3d56542

File tree

3 files changed

+42
-12
lines changed

3 files changed

+42
-12
lines changed

‎src/index.ts

+24-2
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ const DOCK_TYPE = "dock_tab";
3131

3232
export default class PluginSample extends Plugin {
3333

34-
private customTab: () => IModel;
34+
customTab: () => IModel;
3535
private isMobile: boolean;
3636
private blockIconEventBindThis = this.blockIconEvent.bind(this);
3737
private settingUtils: SettingUtils;
@@ -262,6 +262,28 @@ export default class PluginSample extends Plugin {
262262
}
263263
}
264264
});
265+
this.settingUtils.addItem({
266+
key: "Custom Element",
267+
value: "",
268+
type: "custom",
269+
direction: "row",
270+
title: "Custom Element",
271+
description: "Custom Element description",
272+
//Any custom element must offer the following methods
273+
createElement: (currentVal: any) => {
274+
let div = document.createElement('div');
275+
div.style.border = "1px solid var(--b3-theme-primary)";
276+
div.contentEditable = "true";
277+
div.textContent = currentVal;
278+
return div;
279+
},
280+
getEleVal: (ele: HTMLElement) => {
281+
return ele.textContent;
282+
},
283+
setEleVal: (ele: HTMLElement, val: any) => {
284+
ele.textContent = val;
285+
}
286+
});
265287
this.settingUtils.addItem({
266288
key: "Hint",
267289
value: "",
@@ -437,7 +459,7 @@ export default class PluginSample extends Plugin {
437459
title: `SiYuan ${Constants.SIYUAN_VERSION}`,
438460
content: `<div id="helloPanel" class="b3-dialog__content"></div>`,
439461
width: this.isMobile ? "92vw" : "720px",
440-
destroyCallback(options) {
462+
destroyCallback() {
441463
// hello.$destroy();
442464
},
443465
});

‎src/libs/index.d.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,10 @@
33
* @Author : frostime
44
* @Date : 2024-04-19 18:30:12
55
* @FilePath : /src/libs/index.d.ts
6-
* @LastEditTime : 2024-04-30 16:26:23
6+
* @LastEditTime : 2024-04-30 16:39:54
77
* @Description :
88
*/
9-
type TSettingItemType = "checkbox" | "select" | "textinput" | "textarea" | "number" | "slider" | "button" | "hint";
9+
type TSettingItemType = "checkbox" | "select" | "textinput" | "textarea" | "number" | "slider" | "button" | "hint" | "custom";
1010

1111
interface ISettingItemCore {
1212
type: TSettingItemType;

‎src/libs/setting-utils.ts

+16-8
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
* @Author : frostime
44
* @Date : 2023-12-17 18:28:19
55
* @FilePath : /src/libs/setting-utils.ts
6-
* @LastEditTime : 2024-04-30 16:28:00
6+
* @LastEditTime : 2024-04-30 16:42:23
77
* @Description :
88
*/
99

@@ -21,25 +21,23 @@ const createDefaultGetter = (type: TSettingItemType) => {
2121
case 'checkbox':
2222
getter = (ele: HTMLInputElement) => {
2323
return ele.checked;
24-
}
24+
};
2525
break;
2626
case 'select':
2727
case 'slider':
2828
case 'textinput':
2929
case 'textarea':
3030
getter = (ele: HTMLInputElement | HTMLTextAreaElement | HTMLSelectElement) => {
3131
return ele.value;
32-
}
32+
};
3333
break;
3434
case 'number':
3535
getter = (ele: HTMLInputElement) => {
3636
return parseInt(ele.value);
3737
}
3838
break;
3939
default:
40-
getter = (ele: HTMLElement) => {
41-
return ele?.textContent;
42-
}
40+
getter = () => null;
4341
break;
4442
}
4543
return getter;
@@ -57,7 +55,7 @@ const createDefaultSetter = (type: TSettingItemType) => {
5755
case 'checkbox':
5856
setter = (ele: HTMLInputElement, value: any) => {
5957
ele.checked = value;
60-
}
58+
};
6159
break;
6260
case 'select':
6361
case 'slider':
@@ -66,7 +64,10 @@ const createDefaultSetter = (type: TSettingItemType) => {
6664
case 'number':
6765
setter = (ele: HTMLInputElement | HTMLTextAreaElement | HTMLSelectElement, value: any) => {
6866
ele.value = value;
69-
}
67+
};
68+
break;
69+
default:
70+
setter = () => {};
7071
break;
7172
}
7273
return setter;
@@ -240,6 +241,13 @@ export class SettingUtils {
240241

241242
addItem(item: ISettingUtilsItem) {
242243
this.settings.set(item.key, item);
244+
const IsCustom = item.type === 'custom';
245+
let error = IsCustom && (item.createElement === undefined || item.getEleVal === undefined || item.setEleVal === undefined);
246+
if (error) {
247+
console.error('The custom setting item must have createElement, getEleVal and setEleVal methods');
248+
return;
249+
}
250+
243251
if (item.getEleVal === undefined) {
244252
item.getEleVal = createDefaultGetter(item.type);
245253
}

0 commit comments

Comments
 (0)