mirror of
https://github.com/SillyTavern/SillyTavern.git
synced 2025-06-05 21:59:27 +02:00
add minimum requirement of 2 [A-za-z] for slashcommand autocomplete to show up (#4080)
* add minimum requirement of 2 [A-za-z] for slashcommand autocomplete to show up * Migrate to dedicated AC toggle * Replace state checkbox with select --------- Co-authored-by: Cohee <18619528+Cohee1207@users.noreply.github.com>
This commit is contained in:
@@ -5041,6 +5041,14 @@
|
|||||||
<div class="fa-solid fa-circle-chevron-down inline-drawer-icon down"></div>
|
<div class="fa-solid fa-circle-chevron-down inline-drawer-icon down"></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="inline-drawer-content">
|
<div class="inline-drawer-content">
|
||||||
|
<label for="stscript_autocomplete_state">
|
||||||
|
<small data-i18n="Visibility">Visibility</small>
|
||||||
|
</label>
|
||||||
|
<select id="stscript_autocomplete_state">
|
||||||
|
<option value="0" data-i18n="Don't show">Don't show</option>
|
||||||
|
<option value="1" data-i18n="Input length > 1">Input length > 1</option>
|
||||||
|
<option value="2" data-i18n="Always show">Always show</option>
|
||||||
|
</select>
|
||||||
<label class="checkbox_label" for="stscript_autocomplete_autoHide">
|
<label class="checkbox_label" for="stscript_autocomplete_autoHide">
|
||||||
<input id="stscript_autocomplete_autoHide" type="checkbox" />
|
<input id="stscript_autocomplete_autoHide" type="checkbox" />
|
||||||
<small data-i18n="Automatically hide details">
|
<small data-i18n="Automatically hide details">
|
||||||
|
@@ -21,6 +21,14 @@ export const AUTOCOMPLETE_SELECT_KEY = {
|
|||||||
'ENTER': 2, // 2^1
|
'ENTER': 2, // 2^1
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/** @readonly */
|
||||||
|
/** @enum {Number} */
|
||||||
|
export const AUTOCOMPLETE_STATE = {
|
||||||
|
DISABLED: 0,
|
||||||
|
MIN_LENGTH: 1,
|
||||||
|
ALWAYS: 2,
|
||||||
|
};
|
||||||
|
|
||||||
export class AutoComplete {
|
export class AutoComplete {
|
||||||
/**@type {HTMLTextAreaElement|HTMLInputElement}*/ textarea;
|
/**@type {HTMLTextAreaElement|HTMLInputElement}*/ textarea;
|
||||||
/**@type {boolean}*/ isFloating = false;
|
/**@type {boolean}*/ isFloating = false;
|
||||||
@@ -254,8 +262,7 @@ export class AutoComplete {
|
|||||||
+ this.parserResult.name.length
|
+ this.parserResult.name.length
|
||||||
+ (this.startQuote ? 1 : 0)
|
+ (this.startQuote ? 1 : 0)
|
||||||
+ (this.endQuote ? 1 : 0)
|
+ (this.endQuote ? 1 : 0)
|
||||||
+ 1
|
+ 1;
|
||||||
;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -387,8 +394,7 @@ export class AutoComplete {
|
|||||||
return option;
|
return option;
|
||||||
})
|
})
|
||||||
// sort by fuzzy score or alphabetical
|
// sort by fuzzy score or alphabetical
|
||||||
.toSorted(this.matchType == 'fuzzy' ? this.fuzzyScoreCompare : (a, b) => a.name.localeCompare(b.name))
|
.toSorted(this.matchType == 'fuzzy' ? this.fuzzyScoreCompare : (a, b) => a.name.localeCompare(b.name));
|
||||||
;
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@@ -49,7 +49,7 @@ import { FILTER_TYPES } from './filters.js';
|
|||||||
import { PARSER_FLAG, SlashCommandParser } from './slash-commands/SlashCommandParser.js';
|
import { PARSER_FLAG, SlashCommandParser } from './slash-commands/SlashCommandParser.js';
|
||||||
import { SlashCommand } from './slash-commands/SlashCommand.js';
|
import { SlashCommand } from './slash-commands/SlashCommand.js';
|
||||||
import { ARGUMENT_TYPE, SlashCommandArgument, SlashCommandNamedArgument } from './slash-commands/SlashCommandArgument.js';
|
import { ARGUMENT_TYPE, SlashCommandArgument, SlashCommandNamedArgument } from './slash-commands/SlashCommandArgument.js';
|
||||||
import { AUTOCOMPLETE_SELECT_KEY, AUTOCOMPLETE_WIDTH } from './autocomplete/AutoComplete.js';
|
import { AUTOCOMPLETE_SELECT_KEY, AUTOCOMPLETE_STATE, AUTOCOMPLETE_WIDTH } from './autocomplete/AutoComplete.js';
|
||||||
import { SlashCommandEnumValue, enumTypes } from './slash-commands/SlashCommandEnumValue.js';
|
import { SlashCommandEnumValue, enumTypes } from './slash-commands/SlashCommandEnumValue.js';
|
||||||
import { commonEnumProviders, enumIcons } from './slash-commands/SlashCommandCommonEnumsProvider.js';
|
import { commonEnumProviders, enumIcons } from './slash-commands/SlashCommandCommonEnumsProvider.js';
|
||||||
import { POPUP_TYPE, callGenericPopup, fixToastrForDialogs } from './popup.js';
|
import { POPUP_TYPE, callGenericPopup, fixToastrForDialogs } from './popup.js';
|
||||||
@@ -306,6 +306,7 @@ let power_user = {
|
|||||||
stscript: {
|
stscript: {
|
||||||
matching: 'fuzzy',
|
matching: 'fuzzy',
|
||||||
autocomplete: {
|
autocomplete: {
|
||||||
|
state: AUTOCOMPLETE_STATE.ALWAYS,
|
||||||
autoHide: false,
|
autoHide: false,
|
||||||
style: 'theme',
|
style: 'theme',
|
||||||
font: {
|
font: {
|
||||||
@@ -1505,6 +1506,9 @@ async function loadPowerUserSettings(settings, data) {
|
|||||||
if (power_user.stscript.autocomplete === undefined) {
|
if (power_user.stscript.autocomplete === undefined) {
|
||||||
power_user.stscript.autocomplete = defaultStscript.autocomplete;
|
power_user.stscript.autocomplete = defaultStscript.autocomplete;
|
||||||
} else {
|
} else {
|
||||||
|
if (power_user.stscript.autocomplete.state === undefined) {
|
||||||
|
power_user.stscript.autocomplete.state = defaultStscript.autocomplete.state;
|
||||||
|
}
|
||||||
if (power_user.stscript.autocomplete.width === undefined) {
|
if (power_user.stscript.autocomplete.width === undefined) {
|
||||||
power_user.stscript.autocomplete.width = defaultStscript.autocomplete.width;
|
power_user.stscript.autocomplete.width = defaultStscript.autocomplete.width;
|
||||||
}
|
}
|
||||||
@@ -1642,6 +1646,7 @@ async function loadPowerUserSettings(settings, data) {
|
|||||||
$('#aux_field').val(power_user.aux_field);
|
$('#aux_field').val(power_user.aux_field);
|
||||||
$('#tag_import_setting').val(power_user.tag_import_setting);
|
$('#tag_import_setting').val(power_user.tag_import_setting);
|
||||||
|
|
||||||
|
$('#stscript_autocomplete_state').val(power_user.stscript.autocomplete.state).trigger('input');
|
||||||
$('#stscript_autocomplete_autoHide').prop('checked', power_user.stscript.autocomplete.autoHide ?? false).trigger('input');
|
$('#stscript_autocomplete_autoHide').prop('checked', power_user.stscript.autocomplete.autoHide ?? false).trigger('input');
|
||||||
$('#stscript_matching').val(power_user.stscript.matching ?? 'fuzzy');
|
$('#stscript_matching').val(power_user.stscript.matching ?? 'fuzzy');
|
||||||
$('#stscript_autocomplete_style').val(power_user.stscript.autocomplete.style ?? 'theme');
|
$('#stscript_autocomplete_style').val(power_user.stscript.autocomplete.style ?? 'theme');
|
||||||
@@ -3871,6 +3876,11 @@ $(document).ready(() => {
|
|||||||
saveSettingsDebounced();
|
saveSettingsDebounced();
|
||||||
});
|
});
|
||||||
|
|
||||||
|
$('#stscript_autocomplete_state').on('input', function () {
|
||||||
|
power_user.stscript.autocomplete.state = Number($(this).val());
|
||||||
|
saveSettingsDebounced();
|
||||||
|
});
|
||||||
|
|
||||||
$('#stscript_autocomplete_autoHide').on('input', function () {
|
$('#stscript_autocomplete_autoHide').on('input', function () {
|
||||||
power_user.stscript.autocomplete.autoHide = !!$(this).prop('checked');
|
power_user.stscript.autocomplete.autoHide = !!$(this).prop('checked');
|
||||||
saveSettingsDebounced();
|
saveSettingsDebounced();
|
||||||
|
@@ -67,7 +67,7 @@ import { background_settings } from './backgrounds.js';
|
|||||||
import { SlashCommandClosure } from './slash-commands/SlashCommandClosure.js';
|
import { SlashCommandClosure } from './slash-commands/SlashCommandClosure.js';
|
||||||
import { SlashCommandClosureResult } from './slash-commands/SlashCommandClosureResult.js';
|
import { SlashCommandClosureResult } from './slash-commands/SlashCommandClosureResult.js';
|
||||||
import { ARGUMENT_TYPE, SlashCommandArgument, SlashCommandNamedArgument } from './slash-commands/SlashCommandArgument.js';
|
import { ARGUMENT_TYPE, SlashCommandArgument, SlashCommandNamedArgument } from './slash-commands/SlashCommandArgument.js';
|
||||||
import { AutoComplete } from './autocomplete/AutoComplete.js';
|
import { AutoComplete, AUTOCOMPLETE_STATE } from './autocomplete/AutoComplete.js';
|
||||||
import { SlashCommand } from './slash-commands/SlashCommand.js';
|
import { SlashCommand } from './slash-commands/SlashCommand.js';
|
||||||
import { SlashCommandAbortController } from './slash-commands/SlashCommandAbortController.js';
|
import { SlashCommandAbortController } from './slash-commands/SlashCommandAbortController.js';
|
||||||
import { SlashCommandNamedArgumentAssignment } from './slash-commands/SlashCommandNamedArgumentAssignment.js';
|
import { SlashCommandNamedArgumentAssignment } from './slash-commands/SlashCommandNamedArgumentAssignment.js';
|
||||||
@@ -4927,7 +4927,7 @@ export async function setSlashCommandAutoComplete(textarea, isFloating = false)
|
|||||||
const parser = new SlashCommandParser();
|
const parser = new SlashCommandParser();
|
||||||
const ac = new AutoComplete(
|
const ac = new AutoComplete(
|
||||||
textarea,
|
textarea,
|
||||||
() => ac.text[0] == '/',
|
() => ac.text[0] == '/' && (power_user.stscript.autocomplete.state === AUTOCOMPLETE_STATE.ALWAYS || power_user.stscript.autocomplete.state === AUTOCOMPLETE_STATE.MIN_LENGTH && ac.text.length > 2),
|
||||||
async (text, index) => await parser.getNameAt(text, index),
|
async (text, index) => await parser.getNameAt(text, index),
|
||||||
isFloating,
|
isFloating,
|
||||||
);
|
);
|
||||||
|
Reference in New Issue
Block a user