diff --git a/web/js/autocompleter.js b/web/js/autocompleter.js index d0fb2ec..45bc2c2 100644 --- a/web/js/autocompleter.js +++ b/web/js/autocompleter.js @@ -489,6 +489,31 @@ app.registerExtension({ }), ] ), + $el( + "label", + { + textContent: "Debounce in ms: ", + style: { + display: "block", + }, + }, + [ + $el("input", { + type: "number", + value: +TextAreaAutoComplete.debounceMs || 75, + min: 0, + step: 10, + style: { + width: "80px" + }, + onchange: (event) => { + const value = Math.max(0, +event.target.value || 0); + TextAreaAutoComplete.debounceMs = value; + localStorage.setItem(id + ".DebounceMs", value); + }, + }), + ] + ), $el("button", { textContent: "Manage Custom Words", onclick: () => { @@ -520,12 +545,13 @@ app.registerExtension({ }, }); - TextAreaAutoComplete.enabled = enabledSetting.value; - TextAreaAutoComplete.replacer = localStorage.getItem(id + ".ReplaceUnderscore") === "true" ? (v) => v.replaceAll("_", " ") : undefined; - TextAreaAutoComplete.insertOnTab = localStorage.getItem(id + ".InsertOnTab") !== "false"; - TextAreaAutoComplete.insertOnEnter = localStorage.getItem(id + ".InsertOnEnter") !== "false"; - TextAreaAutoComplete.lorasEnabled = localStorage.getItem(id + ".ShowLoras") === "true"; - TextAreaAutoComplete.suggestionCount = +localStorage.getItem(id + ".SuggestionCount") || 20; + TextAreaAutoComplete.enabled = enabledSetting.value; + TextAreaAutoComplete.replacer = localStorage.getItem(id + ".ReplaceUnderscore") === "true" ? (v) => v.replaceAll("_", " ") : undefined; + TextAreaAutoComplete.insertOnTab = localStorage.getItem(id + ".InsertOnTab") !== "false"; + TextAreaAutoComplete.insertOnEnter = localStorage.getItem(id + ".InsertOnEnter") !== "false"; + TextAreaAutoComplete.lorasEnabled = localStorage.getItem(id + ".ShowLoras") === "true"; + TextAreaAutoComplete.suggestionCount = +localStorage.getItem(id + ".SuggestionCount") || 20; + TextAreaAutoComplete.debounceMs = +localStorage.getItem(id + ".DebounceMs") || 75; }, setup() { async function addEmbeddings() { diff --git a/web/js/common/autocomplete.js b/web/js/common/autocomplete.js index ac5fb1d..6dd8b2b 100644 --- a/web/js/common/autocomplete.js +++ b/web/js/common/autocomplete.js @@ -390,10 +390,19 @@ export class TextAreaAutoComplete { this.dropdown = $el("div.pysssss-autocomplete"); this.overrideWords = words; this.overrideSeparator = separator; + this.debouncedUpdate = this.#debounce(this.#update.bind(this), 75); this.#setup(); } + #debounce(func, delay) { + let timeout; + return (...args) => { + clearTimeout(timeout); + timeout = setTimeout(() => func.apply(this, args), delay); + }; + } + #setup() { this.el.addEventListener("keydown", this.#keyDown.bind(this)); this.el.addEventListener("keypress", this.#keyPress.bind(this)); @@ -457,7 +466,7 @@ export class TextAreaAutoComplete { } if (!e.defaultPrevented) { - this.#update(); + this.debouncedUpdate(); } } @@ -475,7 +484,7 @@ export class TextAreaAutoComplete { return; } if (!e.defaultPrevented) { - this.#update(); + this.debouncedUpdate(); } }