mirror of
				https://github.com/siyuan-note/plugin-sample-vite-svelte.git
				synced 2025-11-03 21:30:51 +00:00 
			
		
		
		
	🔨 refactor(setting): 重构了Svelte设置的模板
- 将 SettingPanel 作为基本模板 - 更改了 settingitem 的类型定义
This commit is contained in:
		
							parent
							
								
									f1fcf77500
								
							
						
					
					
						commit
						b0d28e2513
					
				
					 6 changed files with 169 additions and 116 deletions
				
			
		
							
								
								
									
										16
									
								
								src/index.ts
									
										
									
									
									
								
							
							
						
						
									
										16
									
								
								src/index.ts
									
										
									
									
									
								
							| 
						 | 
					@ -17,7 +17,7 @@ import {
 | 
				
			||||||
import "@/index.scss";
 | 
					import "@/index.scss";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import HelloExample from "@/hello.svelte";
 | 
					import HelloExample from "@/hello.svelte";
 | 
				
			||||||
import SettingPannel from "@/libs/setting-panel.svelte";
 | 
					import SettingExample from "@/setting-example.svelte";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import { SettingUtils } from "./libs/setting-utils";
 | 
					import { SettingUtils } from "./libs/setting-utils";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -173,16 +173,10 @@ export default class PluginSample extends Plugin {
 | 
				
			||||||
            title: "Readonly text",
 | 
					            title: "Readonly text",
 | 
				
			||||||
            description: "Select description",
 | 
					            description: "Select description",
 | 
				
			||||||
            select: {
 | 
					            select: {
 | 
				
			||||||
                options: [
 | 
					                options: {
 | 
				
			||||||
                    {
 | 
					                    1: "Option 1",
 | 
				
			||||||
                        val: 1,
 | 
					                    2: "Option 2"
 | 
				
			||||||
                        text: "Option 1"
 | 
					 | 
				
			||||||
                    },
 | 
					 | 
				
			||||||
                    {
 | 
					 | 
				
			||||||
                        val: 2,
 | 
					 | 
				
			||||||
                        text: "Option 2"
 | 
					 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
                ]
 | 
					 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
        });
 | 
					        });
 | 
				
			||||||
        this.settingUtils.addItem({
 | 
					        this.settingUtils.addItem({
 | 
				
			||||||
| 
						 | 
					@ -270,7 +264,7 @@ export default class PluginSample extends Plugin {
 | 
				
			||||||
                pannel.$destroy();
 | 
					                pannel.$destroy();
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
        });
 | 
					        });
 | 
				
			||||||
        let pannel = new SettingPannel({
 | 
					        let pannel = new SettingExample({
 | 
				
			||||||
            target: dialog.element.querySelector("#SettingPanel"),
 | 
					            target: dialog.element.querySelector("#SettingPanel"),
 | 
				
			||||||
        });
 | 
					        });
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										5
									
								
								src/libs/index.d.ts
									
										
									
									
										vendored
									
									
								
							
							
						
						
									
										5
									
								
								src/libs/index.d.ts
									
										
									
									
										vendored
									
									
								
							| 
						 | 
					@ -5,13 +5,16 @@ interface ISettingItem {
 | 
				
			||||||
    type: TSettingItemType;
 | 
					    type: TSettingItemType;
 | 
				
			||||||
    title: string;
 | 
					    title: string;
 | 
				
			||||||
    description?: string;
 | 
					    description?: string;
 | 
				
			||||||
 | 
					    text?: {
 | 
				
			||||||
 | 
					        placeholder?: string;
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
    slider?: {
 | 
					    slider?: {
 | 
				
			||||||
        min: number;
 | 
					        min: number;
 | 
				
			||||||
        max: number;
 | 
					        max: number;
 | 
				
			||||||
        step: number;
 | 
					        step: number;
 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
    select?: {
 | 
					    select?: {
 | 
				
			||||||
        options: {val: any; text: string}[];
 | 
					        options: { [key: string | number]: string };
 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
    button?: {
 | 
					    button?: {
 | 
				
			||||||
        label: string;
 | 
					        label: string;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -2,13 +2,13 @@
 | 
				
			||||||
    import { createEventDispatcher } from "svelte";
 | 
					    import { createEventDispatcher } from "svelte";
 | 
				
			||||||
    export let type: string; // Setting Type
 | 
					    export let type: string; // Setting Type
 | 
				
			||||||
    export let title: string; // Displayint Setting Title
 | 
					    export let title: string; // Displayint Setting Title
 | 
				
			||||||
    export let text: string; // Displaying Setting Text
 | 
					    export let description: string; // Displaying Setting Text
 | 
				
			||||||
    export let settingKey: string;
 | 
					    export let settingKey: string;
 | 
				
			||||||
    export let settingValue: any;
 | 
					    export let settingValue: any;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    //Optional
 | 
					    //Optional
 | 
				
			||||||
    export let placeholder: string = ""; // Use it if type is input
 | 
					    export let placeholder: string = ""; // Use it if type is input
 | 
				
			||||||
    export let options: { [key: string]: string } = {}; // Use it if type is select
 | 
					    export let options: { [key: string | number]: string } = {}; // Use it if type is select
 | 
				
			||||||
    export let slider: {
 | 
					    export let slider: {
 | 
				
			||||||
        min: number;
 | 
					        min: number;
 | 
				
			||||||
        max: number;
 | 
					        max: number;
 | 
				
			||||||
| 
						 | 
					@ -30,7 +30,7 @@
 | 
				
			||||||
    <div class="fn__flex-1">
 | 
					    <div class="fn__flex-1">
 | 
				
			||||||
        {title}
 | 
					        {title}
 | 
				
			||||||
        <div class="b3-label__text">
 | 
					        <div class="b3-label__text">
 | 
				
			||||||
            {text}
 | 
					            {@html description}
 | 
				
			||||||
        </div>
 | 
					        </div>
 | 
				
			||||||
    </div>
 | 
					    </div>
 | 
				
			||||||
    <span class="fn__space" />
 | 
					    <span class="fn__space" />
 | 
				
			||||||
| 
						 | 
					@ -53,6 +53,14 @@
 | 
				
			||||||
            bind:value={settingValue}
 | 
					            bind:value={settingValue}
 | 
				
			||||||
            on:change={changed}
 | 
					            on:change={changed}
 | 
				
			||||||
        />
 | 
					        />
 | 
				
			||||||
 | 
					    {:else if type === "number"}
 | 
				
			||||||
 | 
					        <input
 | 
				
			||||||
 | 
					            class="b3-text-field fn__flex-center fn__size200"
 | 
				
			||||||
 | 
					            id={settingKey}
 | 
				
			||||||
 | 
					            type="number"
 | 
				
			||||||
 | 
					            bind:value={settingValue}
 | 
				
			||||||
 | 
					            on:change={changed}
 | 
				
			||||||
 | 
					        />
 | 
				
			||||||
    {:else if type === "button"}
 | 
					    {:else if type === "button"}
 | 
				
			||||||
        <!-- Button Input -->
 | 
					        <!-- Button Input -->
 | 
				
			||||||
        <button
 | 
					        <button
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,99 +1,46 @@
 | 
				
			||||||
<script>
 | 
					<!--
 | 
				
			||||||
 | 
					 Copyright (c) 2023 by frostime All Rights Reserved.
 | 
				
			||||||
 | 
					 Author       : frostime
 | 
				
			||||||
 | 
					 Date         : 2023-07-01 19:23:50
 | 
				
			||||||
 | 
					 FilePath     : /src/libs/setting-panel.svelte
 | 
				
			||||||
 | 
					 LastEditTime : 2023-11-28 21:23:56
 | 
				
			||||||
 | 
					 Description  : 
 | 
				
			||||||
 | 
					-->
 | 
				
			||||||
 | 
					<script lang="ts">
 | 
				
			||||||
 | 
					    import { createEventDispatcher } from "svelte";
 | 
				
			||||||
    import SettingItem from "./setting-item.svelte";
 | 
					    import SettingItem from "./setting-item.svelte";
 | 
				
			||||||
    import { showMessage } from "siyuan";
 | 
					
 | 
				
			||||||
    import { onMount, onDestroy } from 'svelte';
 | 
					    export let group: string;
 | 
				
			||||||
    onMount(() => {
 | 
					    export let settingItems: ISettingItem[];
 | 
				
			||||||
        showMessage("Setting panel opened");
 | 
					    export let display: boolean = true;
 | 
				
			||||||
    });
 | 
					
 | 
				
			||||||
    onDestroy(() => {
 | 
					    const dispatch = createEventDispatcher();
 | 
				
			||||||
        showMessage("Setting panel closed");
 | 
					
 | 
				
			||||||
    });
 | 
					    function onClick( {detail}) {
 | 
				
			||||||
 | 
					        dispatch("click", { key: detail.key });
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    function onChanged( {detail}) {
 | 
				
			||||||
 | 
					        dispatch("changed", {group: group, ...detail});
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    $: fn__none = display ? "" : "fn__none";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
</script>
 | 
					</script>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
<!--
 | 
					<div class="config__tab-container {fn__none}" data-name={group}>
 | 
				
			||||||
You can use this template to quickly create a setting panel,
 | 
					    <slot />
 | 
				
			||||||
with the same UI style in SiYuan
 | 
					    {#each settingItems as item (item.key)}
 | 
				
			||||||
-->
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
<div class="config__tab-container">
 | 
					 | 
				
			||||||
    <div data-type="Header" class="fn__flex b3-label">
 | 
					 | 
				
			||||||
        <div class="fn_flex-1">
 | 
					 | 
				
			||||||
            <h4>This setting panel is provided by a svelte component</h4>
 | 
					 | 
				
			||||||
            <div class="b3-label__text">
 | 
					 | 
				
			||||||
                <span class="fn__flex-1">
 | 
					 | 
				
			||||||
                    See:
 | 
					 | 
				
			||||||
                    <pre style="display: inline">/lib/setting-pannel.svelte</pre>
 | 
					 | 
				
			||||||
                </span>
 | 
					 | 
				
			||||||
            </div>
 | 
					 | 
				
			||||||
        </div>
 | 
					 | 
				
			||||||
    </div>
 | 
					 | 
				
			||||||
        <SettingItem
 | 
					        <SettingItem
 | 
				
			||||||
        type="checkbox"
 | 
					            type={item.type}
 | 
				
			||||||
        title="Checkbox"
 | 
					            title={item.title}
 | 
				
			||||||
        text="This is a checkbox"
 | 
					            description={item.description}
 | 
				
			||||||
        settingKey="Checkbox"
 | 
					            settingKey={item.key}
 | 
				
			||||||
        settingValue={true}
 | 
					            settingValue={item.value}
 | 
				
			||||||
        on:changed={(event) => {
 | 
					            placeholder={item?.text.placeholder}
 | 
				
			||||||
            showMessage(
 | 
					            options={item?.select.options}
 | 
				
			||||||
                `Checkbox changed: ${event.detail.key} = ${event.detail.value}`
 | 
					            slider={item?.slider}
 | 
				
			||||||
            );
 | 
					            on:click={onClick}
 | 
				
			||||||
        }}
 | 
					            on:changed={onChanged}
 | 
				
			||||||
    />
 | 
					 | 
				
			||||||
    <SettingItem
 | 
					 | 
				
			||||||
        type="input"
 | 
					 | 
				
			||||||
        title="Input"
 | 
					 | 
				
			||||||
        text="This is an input"
 | 
					 | 
				
			||||||
        settingKey="Input"
 | 
					 | 
				
			||||||
        settingValue=""
 | 
					 | 
				
			||||||
        placeholder="Input something"
 | 
					 | 
				
			||||||
        on:changed={(event) => {
 | 
					 | 
				
			||||||
            showMessage(
 | 
					 | 
				
			||||||
                `Input changed: ${event.detail.key} = ${event.detail.value}`
 | 
					 | 
				
			||||||
            );
 | 
					 | 
				
			||||||
        }}
 | 
					 | 
				
			||||||
    />
 | 
					 | 
				
			||||||
    <SettingItem
 | 
					 | 
				
			||||||
        type="button"
 | 
					 | 
				
			||||||
        title="Button"
 | 
					 | 
				
			||||||
        text="This is a button"
 | 
					 | 
				
			||||||
        settingKey="Button"
 | 
					 | 
				
			||||||
        settingValue="Click me"
 | 
					 | 
				
			||||||
        on:clicked={() => {
 | 
					 | 
				
			||||||
            showMessage("Button clicked");
 | 
					 | 
				
			||||||
        }}
 | 
					 | 
				
			||||||
    />
 | 
					 | 
				
			||||||
    <SettingItem
 | 
					 | 
				
			||||||
        type="select"
 | 
					 | 
				
			||||||
        title="Select"
 | 
					 | 
				
			||||||
        text="This is a select"
 | 
					 | 
				
			||||||
        settingKey="Select"
 | 
					 | 
				
			||||||
        settingValue="left"
 | 
					 | 
				
			||||||
        options={{
 | 
					 | 
				
			||||||
            left: "Left",
 | 
					 | 
				
			||||||
            center: "Center",
 | 
					 | 
				
			||||||
            right: "Right",
 | 
					 | 
				
			||||||
        }}
 | 
					 | 
				
			||||||
        on:changed={(event) => {
 | 
					 | 
				
			||||||
            showMessage(
 | 
					 | 
				
			||||||
                `Select changed: ${event.detail.key} = ${event.detail.value}`
 | 
					 | 
				
			||||||
            );
 | 
					 | 
				
			||||||
        }}
 | 
					 | 
				
			||||||
    />
 | 
					 | 
				
			||||||
    <SettingItem
 | 
					 | 
				
			||||||
        type="slider"
 | 
					 | 
				
			||||||
        title="Slide"
 | 
					 | 
				
			||||||
        text="This is a slide"
 | 
					 | 
				
			||||||
        settingKey="Slide"
 | 
					 | 
				
			||||||
        settingValue={50}
 | 
					 | 
				
			||||||
        slider={{
 | 
					 | 
				
			||||||
            min: 0,
 | 
					 | 
				
			||||||
            max: 100,
 | 
					 | 
				
			||||||
            step: 1,
 | 
					 | 
				
			||||||
        }}
 | 
					 | 
				
			||||||
        on:changed={(event) => {
 | 
					 | 
				
			||||||
            showMessage(
 | 
					 | 
				
			||||||
                `Slide changed: ${event.detail.key} = ${event.detail.value}`
 | 
					 | 
				
			||||||
            );
 | 
					 | 
				
			||||||
        }}
 | 
					 | 
				
			||||||
        />
 | 
					        />
 | 
				
			||||||
 | 
					    {/each}
 | 
				
			||||||
</div>
 | 
					</div>
 | 
				
			||||||
| 
						 | 
					@ -3,7 +3,7 @@
 | 
				
			||||||
 * @Author       : frostime
 | 
					 * @Author       : frostime
 | 
				
			||||||
 * @Date         : 2023-09-16 18:05:00
 | 
					 * @Date         : 2023-09-16 18:05:00
 | 
				
			||||||
 * @FilePath     : /src/libs/setting-utils.ts
 | 
					 * @FilePath     : /src/libs/setting-utils.ts
 | 
				
			||||||
 * @LastEditTime : 2023-10-28 16:52:01
 | 
					 * @LastEditTime : 2023-11-28 21:16:36
 | 
				
			||||||
 * @Description  : A utility for siyuan plugin settings
 | 
					 * @Description  : A utility for siyuan plugin settings
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -93,10 +93,12 @@ export class SettingUtils {
 | 
				
			||||||
            case 'select':
 | 
					            case 'select':
 | 
				
			||||||
                let selectElement: HTMLSelectElement = document.createElement('select');
 | 
					                let selectElement: HTMLSelectElement = document.createElement('select');
 | 
				
			||||||
                selectElement.className = "b3-select fn__flex-center fn__size200";
 | 
					                selectElement.className = "b3-select fn__flex-center fn__size200";
 | 
				
			||||||
                for (let option of item.select?.options ?? []) {
 | 
					                let options = item.select?.options ?? {};
 | 
				
			||||||
 | 
					                for (let val in options) {
 | 
				
			||||||
                    let optionElement = document.createElement('option');
 | 
					                    let optionElement = document.createElement('option');
 | 
				
			||||||
                    optionElement.value = option.val;
 | 
					                    let text = options[val];
 | 
				
			||||||
                    optionElement.text = option.text;
 | 
					                    optionElement.value = val;
 | 
				
			||||||
 | 
					                    optionElement.text = text;
 | 
				
			||||||
                    selectElement.appendChild(optionElement);
 | 
					                    selectElement.appendChild(optionElement);
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
                selectElement.value = item.value;
 | 
					                selectElement.value = item.value;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										99
									
								
								src/setting-example.svelte
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										99
									
								
								src/setting-example.svelte
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,99 @@
 | 
				
			||||||
 | 
					<script>
 | 
				
			||||||
 | 
					    import SettingItem from "@/libs/setting-item.svelte";
 | 
				
			||||||
 | 
					    import { showMessage } from "siyuan";
 | 
				
			||||||
 | 
					    import { onMount, onDestroy } from 'svelte';
 | 
				
			||||||
 | 
					    onMount(() => {
 | 
				
			||||||
 | 
					        showMessage("Setting panel opened");
 | 
				
			||||||
 | 
					    });
 | 
				
			||||||
 | 
					    onDestroy(() => {
 | 
				
			||||||
 | 
					        showMessage("Setting panel closed");
 | 
				
			||||||
 | 
					    });
 | 
				
			||||||
 | 
					</script>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<!--
 | 
				
			||||||
 | 
					You can use this template to quickly create a setting panel,
 | 
				
			||||||
 | 
					with the same UI style in SiYuan
 | 
				
			||||||
 | 
					-->
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<div class="config__tab-container">
 | 
				
			||||||
 | 
					    <div data-type="Header" class="fn__flex b3-label">
 | 
				
			||||||
 | 
					        <div class="fn_flex-1">
 | 
				
			||||||
 | 
					            <h4>This setting panel is provided by a svelte component</h4>
 | 
				
			||||||
 | 
					            <div class="b3-label__text">
 | 
				
			||||||
 | 
					                <span class="fn__flex-1">
 | 
				
			||||||
 | 
					                    See:
 | 
				
			||||||
 | 
					                    <pre style="display: inline">/lib/setting-pannel.svelte</pre>
 | 
				
			||||||
 | 
					                </span>
 | 
				
			||||||
 | 
					            </div>
 | 
				
			||||||
 | 
					        </div>
 | 
				
			||||||
 | 
					    </div>
 | 
				
			||||||
 | 
					    <SettingItem
 | 
				
			||||||
 | 
					        type="checkbox"
 | 
				
			||||||
 | 
					        title="Checkbox"
 | 
				
			||||||
 | 
					        description="This is a <b>checkbox</b>"
 | 
				
			||||||
 | 
					        settingKey="Checkbox"
 | 
				
			||||||
 | 
					        settingValue={true}
 | 
				
			||||||
 | 
					        on:changed={(event) => {
 | 
				
			||||||
 | 
					            showMessage(
 | 
				
			||||||
 | 
					                `Checkbox changed: ${event.detail.key} = ${event.detail.value}`
 | 
				
			||||||
 | 
					            );
 | 
				
			||||||
 | 
					        }}
 | 
				
			||||||
 | 
					    />
 | 
				
			||||||
 | 
					    <SettingItem
 | 
				
			||||||
 | 
					        type="input"
 | 
				
			||||||
 | 
					        title="Input"
 | 
				
			||||||
 | 
					        description="This is an input"
 | 
				
			||||||
 | 
					        settingKey="Input"
 | 
				
			||||||
 | 
					        settingValue=""
 | 
				
			||||||
 | 
					        placeholder="Input something"
 | 
				
			||||||
 | 
					        on:changed={(event) => {
 | 
				
			||||||
 | 
					            showMessage(
 | 
				
			||||||
 | 
					                `Input changed: ${event.detail.key} = ${event.detail.value}`
 | 
				
			||||||
 | 
					            );
 | 
				
			||||||
 | 
					        }}
 | 
				
			||||||
 | 
					    />
 | 
				
			||||||
 | 
					    <SettingItem
 | 
				
			||||||
 | 
					        type="button"
 | 
				
			||||||
 | 
					        title="Button"
 | 
				
			||||||
 | 
					        description="This is a button"
 | 
				
			||||||
 | 
					        settingKey="Button"
 | 
				
			||||||
 | 
					        settingValue="Click me"
 | 
				
			||||||
 | 
					        on:clicked={() => {
 | 
				
			||||||
 | 
					            showMessage("Button clicked");
 | 
				
			||||||
 | 
					        }}
 | 
				
			||||||
 | 
					    />
 | 
				
			||||||
 | 
					    <SettingItem
 | 
				
			||||||
 | 
					        type="select"
 | 
				
			||||||
 | 
					        title="Select"
 | 
				
			||||||
 | 
					        description="This is a select"
 | 
				
			||||||
 | 
					        settingKey="Select"
 | 
				
			||||||
 | 
					        settingValue="left"
 | 
				
			||||||
 | 
					        options={{
 | 
				
			||||||
 | 
					            left: "Left",
 | 
				
			||||||
 | 
					            center: "Center",
 | 
				
			||||||
 | 
					            right: "Right",
 | 
				
			||||||
 | 
					        }}
 | 
				
			||||||
 | 
					        on:changed={(event) => {
 | 
				
			||||||
 | 
					            showMessage(
 | 
				
			||||||
 | 
					                `Select changed: ${event.detail.key} = ${event.detail.value}`
 | 
				
			||||||
 | 
					            );
 | 
				
			||||||
 | 
					        }}
 | 
				
			||||||
 | 
					    />
 | 
				
			||||||
 | 
					    <SettingItem
 | 
				
			||||||
 | 
					        type="slider"
 | 
				
			||||||
 | 
					        title="Slide"
 | 
				
			||||||
 | 
					        description="This is a slide"
 | 
				
			||||||
 | 
					        settingKey="Slide"
 | 
				
			||||||
 | 
					        settingValue={50}
 | 
				
			||||||
 | 
					        slider={{
 | 
				
			||||||
 | 
					            min: 0,
 | 
				
			||||||
 | 
					            max: 100,
 | 
				
			||||||
 | 
					            step: 1,
 | 
				
			||||||
 | 
					        }}
 | 
				
			||||||
 | 
					        on:changed={(event) => {
 | 
				
			||||||
 | 
					            showMessage(
 | 
				
			||||||
 | 
					                `Slide changed: ${event.detail.key} = ${event.detail.value}`
 | 
				
			||||||
 | 
					            );
 | 
				
			||||||
 | 
					        }}
 | 
				
			||||||
 | 
					    />
 | 
				
			||||||
 | 
					</div>
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue