diff --git a/docs/documentation.toml b/docs/documentation.toml index c82d927a..b888046d 100644 --- a/docs/documentation.toml +++ b/docs/documentation.toml @@ -555,7 +555,7 @@ selected value: <% value %>""" [tp.system.functions.suggester] name = "suggester" description = "Spawns a suggester prompt and returns the user's chosen item." -definition = "tp.system.suggester(text_items: string[] | ((item: T) => string), items: T[], throw_on_cancel: boolean = false, placeholder: string = \"\", limit?: number = undefined)" +definition = "tp.system.suggester(text_items: string[] | ((item: T) => string), items: T[], throw_on_cancel: boolean = false, placeholder: string = \"\", limit?: number = undefined, default_value?: T = undefined)" [[tp.system.functions.suggester.args]] name = "text_items" @@ -577,6 +577,10 @@ description = "Placeholder string of the prompt." name = "limit" description = "Limit the number of items rendered at once (useful to improve performance when displaying large lists)." +[[tp.system.functions.suggester.args]] +name = "default_value" +description = "Default value to initialize the suggester with." + [[tp.system.functions.suggester.examples]] name = "Suggester" example = """<% await tp.system.suggester(["Happy", "Sad", "Confused"], ["Happy", "Sad", "Confused"]) %>""" @@ -601,10 +605,18 @@ let selectedValue = await tp.system.suggester(["Happy", "Sad", "Confused"], ["Ha # <% selectedValue %> selected value: <% selectedValue %>""" +[[tp.system.functions.suggester.examples]] +name = "Default value for the suggester" +example = """<%* +let selectedValue = await tp.system.suggester(["Happy", "Sad", "Confused"], ["Happy", "Sad", "Confused"], false, "", undefined, "Confused"); +%> +# <% selectedValue %> +selected value: <% selectedValue %>""" + [tp.system.functions.multi_suggester] name = "multi_suggester" description = "Spawns a suggester prompt that supports selecting multiple items and returns the user's chosen items." -definition = "tp.system.multi_suggester(text_items: string[] | ((item: T) => string), items: T[], throw_on_cancel: boolean = false, title: string = \"\", limit?: number = undefined)" +definition = "tp.system.multi_suggester(text_items: string[] | ((item: T) => string), items: T[], throw_on_cancel: boolean = false, title: string = \"\", limit?: number = undefined, default_values?: T[] = undefined)" [[tp.system.functions.multi_suggester.args]] name = "text_items" @@ -626,6 +638,10 @@ description = "Text placed at the top of the modal." name = "limit" description = "Limit the number of items rendered at once (useful to improve performance when displaying large lists)." +[[tp.system.functions.multi_suggester.args]] +name = "default_values" +description = "Default values to initialize the suggester with." + [[tp.system.functions.multi_suggester.examples]] name = "Multi-suggester" example = """<% await tp.system.multi_suggester(["Happy", "Sad", "Confused"], ["Happy", "Sad", "Confused"]) %>""" @@ -650,6 +666,14 @@ let selectedValues = await tp.system.multi_suggester(["Happy", "Sad", "Confused" # <% selectedValues %> selected values: <% selectedValues %>""" +[[tp.system.functions.multi_suggester.examples]] +name = "Default value for the suggester" +example = """<%* +let selectedValue = await tp.system.multi_suggester(["Happy", "Sad", "Confused"], ["Happy", "Sad", "Confused"], false, "", undefined, ["Happy", "Confused"]); +%> +# <% selectedValue %> +selected value: <% selectedValue %>""" + [tp.web] name = "web" description = "This modules contains every internal function related to the web (making web requests)." diff --git a/src/core/functions/internal_functions/system/InternalModuleSystem.ts b/src/core/functions/internal_functions/system/InternalModuleSystem.ts index d620e3e8..b61704a3 100644 --- a/src/core/functions/internal_functions/system/InternalModuleSystem.ts +++ b/src/core/functions/internal_functions/system/InternalModuleSystem.ts @@ -68,21 +68,24 @@ export class InternalModuleSystem extends InternalModule { items: T[], throw_on_cancel: boolean, placeholder: string, - limit?: number + limit?: number, + default_value?: T ) => Promise { return async ( text_items: string[] | ((item: T) => string), items: T[], throw_on_cancel = false, placeholder = "", - limit?: number + limit?: number, + default_value?: T ): Promise => { const suggester = new SuggesterModal( this.plugin.app, text_items, items, placeholder, - limit + limit, + default_value ); const promise = new Promise( ( @@ -106,21 +109,24 @@ export class InternalModuleSystem extends InternalModule { items: T[], throw_on_cancel: boolean, title: string, - limit?: number + limit?: number, + default_values?: T[] ) => Promise { return async ( text_items: string[] | ((item: T) => string), items: T[], throw_on_cancel = false, title = "", - limit?: number + limit?: number, + default_values?: T[] ): Promise => { const suggester = new MultiSuggesterModal( this.plugin.app, text_items, items, title, - limit + limit, + default_values ); const promise = new Promise( ( diff --git a/src/core/functions/internal_functions/system/MultiSuggesterModal.ts b/src/core/functions/internal_functions/system/MultiSuggesterModal.ts index c0645e93..66b799ff 100644 --- a/src/core/functions/internal_functions/system/MultiSuggesterModal.ts +++ b/src/core/functions/internal_functions/system/MultiSuggesterModal.ts @@ -22,7 +22,8 @@ export class MultiSuggesterModal extends Modal { private text_items: string[] | ((item: T) => string), private items: T[], title: string, - limit?: number + limit?: number, + default_values?: T[] ) { super(app); this.setTitle(title); @@ -49,10 +50,13 @@ export class MultiSuggesterModal extends Modal { new ButtonComponent(buttonContainer) .setButtonText("Cancel") .onClick(() => this.close()); + if (default_values) { + this.selectedItems = default_values; + } } onOpen(): void { - this.display(); + this.processSelectedItems(); } display(): void { @@ -85,6 +89,10 @@ export class MultiSuggesterModal extends Modal { onChooseItem(item: T): void { this.selectedItems.push(item); + this.processSelectedItems(); + } + + private processSelectedItems(): void { const filteredItems = this.items.filter((item) => { return !this.selectedItems.some( (selected_item) => selected_item === item diff --git a/src/core/functions/internal_functions/system/SuggesterModal.ts b/src/core/functions/internal_functions/system/SuggesterModal.ts index e816b1c7..22565601 100644 --- a/src/core/functions/internal_functions/system/SuggesterModal.ts +++ b/src/core/functions/internal_functions/system/SuggesterModal.ts @@ -11,7 +11,8 @@ export class SuggesterModal extends FuzzySuggestModal { private text_items: string[] | ((item: T) => string), private items: T[], placeholder: string, - limit?: number + limit?: number, + private default_value?: T ) { super(app); this.setPlaceholder(placeholder); @@ -22,6 +23,13 @@ export class SuggesterModal extends FuzzySuggestModal { return this.items; } + onOpen(): void { + if (this.default_value !== undefined) { + this.inputEl.value = this.getItemText(this.default_value); + this.inputEl.dispatchEvent(new InputEvent("input")); + } + } + onClose(): void { if (!this.submitted) { this.reject(new TemplaterError("Cancelled prompt"));