🎨 feat: Add "custom setting-items" example
This commit is contained in:
parent
29c494a3f4
commit
3d565424ae
3 changed files with 42 additions and 12 deletions
26
src/index.ts
26
src/index.ts
|
@ -31,7 +31,7 @@ const DOCK_TYPE = "dock_tab";
|
||||||
|
|
||||||
export default class PluginSample extends Plugin {
|
export default class PluginSample extends Plugin {
|
||||||
|
|
||||||
private customTab: () => IModel;
|
customTab: () => IModel;
|
||||||
private isMobile: boolean;
|
private isMobile: boolean;
|
||||||
private blockIconEventBindThis = this.blockIconEvent.bind(this);
|
private blockIconEventBindThis = this.blockIconEvent.bind(this);
|
||||||
private settingUtils: SettingUtils;
|
private settingUtils: SettingUtils;
|
||||||
|
@ -262,6 +262,28 @@ export default class PluginSample extends Plugin {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
this.settingUtils.addItem({
|
||||||
|
key: "Custom Element",
|
||||||
|
value: "",
|
||||||
|
type: "custom",
|
||||||
|
direction: "row",
|
||||||
|
title: "Custom Element",
|
||||||
|
description: "Custom Element description",
|
||||||
|
//Any custom element must offer the following methods
|
||||||
|
createElement: (currentVal: any) => {
|
||||||
|
let div = document.createElement('div');
|
||||||
|
div.style.border = "1px solid var(--b3-theme-primary)";
|
||||||
|
div.contentEditable = "true";
|
||||||
|
div.textContent = currentVal;
|
||||||
|
return div;
|
||||||
|
},
|
||||||
|
getEleVal: (ele: HTMLElement) => {
|
||||||
|
return ele.textContent;
|
||||||
|
},
|
||||||
|
setEleVal: (ele: HTMLElement, val: any) => {
|
||||||
|
ele.textContent = val;
|
||||||
|
}
|
||||||
|
});
|
||||||
this.settingUtils.addItem({
|
this.settingUtils.addItem({
|
||||||
key: "Hint",
|
key: "Hint",
|
||||||
value: "",
|
value: "",
|
||||||
|
@ -437,7 +459,7 @@ export default class PluginSample extends Plugin {
|
||||||
title: `SiYuan ${Constants.SIYUAN_VERSION}`,
|
title: `SiYuan ${Constants.SIYUAN_VERSION}`,
|
||||||
content: `<div id="helloPanel" class="b3-dialog__content"></div>`,
|
content: `<div id="helloPanel" class="b3-dialog__content"></div>`,
|
||||||
width: this.isMobile ? "92vw" : "720px",
|
width: this.isMobile ? "92vw" : "720px",
|
||||||
destroyCallback(options) {
|
destroyCallback() {
|
||||||
// hello.$destroy();
|
// hello.$destroy();
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
4
src/libs/index.d.ts
vendored
4
src/libs/index.d.ts
vendored
|
@ -3,10 +3,10 @@
|
||||||
* @Author : frostime
|
* @Author : frostime
|
||||||
* @Date : 2024-04-19 18:30:12
|
* @Date : 2024-04-19 18:30:12
|
||||||
* @FilePath : /src/libs/index.d.ts
|
* @FilePath : /src/libs/index.d.ts
|
||||||
* @LastEditTime : 2024-04-30 16:26:23
|
* @LastEditTime : 2024-04-30 16:39:54
|
||||||
* @Description :
|
* @Description :
|
||||||
*/
|
*/
|
||||||
type TSettingItemType = "checkbox" | "select" | "textinput" | "textarea" | "number" | "slider" | "button" | "hint";
|
type TSettingItemType = "checkbox" | "select" | "textinput" | "textarea" | "number" | "slider" | "button" | "hint" | "custom";
|
||||||
|
|
||||||
interface ISettingItemCore {
|
interface ISettingItemCore {
|
||||||
type: TSettingItemType;
|
type: TSettingItemType;
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
* @Author : frostime
|
* @Author : frostime
|
||||||
* @Date : 2023-12-17 18:28:19
|
* @Date : 2023-12-17 18:28:19
|
||||||
* @FilePath : /src/libs/setting-utils.ts
|
* @FilePath : /src/libs/setting-utils.ts
|
||||||
* @LastEditTime : 2024-04-30 16:28:00
|
* @LastEditTime : 2024-04-30 16:42:23
|
||||||
* @Description :
|
* @Description :
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
@ -21,7 +21,7 @@ const createDefaultGetter = (type: TSettingItemType) => {
|
||||||
case 'checkbox':
|
case 'checkbox':
|
||||||
getter = (ele: HTMLInputElement) => {
|
getter = (ele: HTMLInputElement) => {
|
||||||
return ele.checked;
|
return ele.checked;
|
||||||
}
|
};
|
||||||
break;
|
break;
|
||||||
case 'select':
|
case 'select':
|
||||||
case 'slider':
|
case 'slider':
|
||||||
|
@ -29,7 +29,7 @@ const createDefaultGetter = (type: TSettingItemType) => {
|
||||||
case 'textarea':
|
case 'textarea':
|
||||||
getter = (ele: HTMLInputElement | HTMLTextAreaElement | HTMLSelectElement) => {
|
getter = (ele: HTMLInputElement | HTMLTextAreaElement | HTMLSelectElement) => {
|
||||||
return ele.value;
|
return ele.value;
|
||||||
}
|
};
|
||||||
break;
|
break;
|
||||||
case 'number':
|
case 'number':
|
||||||
getter = (ele: HTMLInputElement) => {
|
getter = (ele: HTMLInputElement) => {
|
||||||
|
@ -37,9 +37,7 @@ const createDefaultGetter = (type: TSettingItemType) => {
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
getter = (ele: HTMLElement) => {
|
getter = () => null;
|
||||||
return ele?.textContent;
|
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
return getter;
|
return getter;
|
||||||
|
@ -57,7 +55,7 @@ const createDefaultSetter = (type: TSettingItemType) => {
|
||||||
case 'checkbox':
|
case 'checkbox':
|
||||||
setter = (ele: HTMLInputElement, value: any) => {
|
setter = (ele: HTMLInputElement, value: any) => {
|
||||||
ele.checked = value;
|
ele.checked = value;
|
||||||
}
|
};
|
||||||
break;
|
break;
|
||||||
case 'select':
|
case 'select':
|
||||||
case 'slider':
|
case 'slider':
|
||||||
|
@ -66,7 +64,10 @@ const createDefaultSetter = (type: TSettingItemType) => {
|
||||||
case 'number':
|
case 'number':
|
||||||
setter = (ele: HTMLInputElement | HTMLTextAreaElement | HTMLSelectElement, value: any) => {
|
setter = (ele: HTMLInputElement | HTMLTextAreaElement | HTMLSelectElement, value: any) => {
|
||||||
ele.value = value;
|
ele.value = value;
|
||||||
}
|
};
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
setter = () => {};
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
return setter;
|
return setter;
|
||||||
|
@ -240,6 +241,13 @@ export class SettingUtils {
|
||||||
|
|
||||||
addItem(item: ISettingUtilsItem) {
|
addItem(item: ISettingUtilsItem) {
|
||||||
this.settings.set(item.key, item);
|
this.settings.set(item.key, item);
|
||||||
|
const IsCustom = item.type === 'custom';
|
||||||
|
let error = IsCustom && (item.createElement === undefined || item.getEleVal === undefined || item.setEleVal === undefined);
|
||||||
|
if (error) {
|
||||||
|
console.error('The custom setting item must have createElement, getEleVal and setEleVal methods');
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
if (item.getEleVal === undefined) {
|
if (item.getEleVal === undefined) {
|
||||||
item.getEleVal = createDefaultGetter(item.type);
|
item.getEleVal = createDefaultGetter(item.type);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue