feat: the Discord Add panel's artist field autocompletes against FabledCurator's artists (milestone 429)
CI and images / lint (push) Successful in 2s
CI and images / extension-version (push) Successful in 3s
CI and images / extension-test (push) Successful in 20s
CI and images / frontend-build (push) Successful in 20s
CI and images / backend-lint-and-test (push) Successful in 32s
CI and images / integration (push) Successful in 2m23s
CI and images / build-agent (push) Successful in 5s
CI and images / sign-extension (push) Successful in 2m56s
CI and images / build-web (push) Successful in 1m37s
CI and images / smoke-web (push) Successful in 56s
CI and images / promote (push) Successful in 1s
CI and images / lint (push) Successful in 2s
CI and images / extension-version (push) Successful in 3s
CI and images / extension-test (push) Successful in 20s
CI and images / frontend-build (push) Successful in 20s
CI and images / backend-lint-and-test (push) Successful in 32s
CI and images / integration (push) Successful in 2m23s
CI and images / build-agent (push) Successful in 5s
CI and images / sign-extension (push) Successful in 2m56s
CI and images / build-web (push) Successful in 1m37s
CI and images / smoke-web (push) Successful in 56s
CI and images / promote (push) Successful in 1s
Operator, after the first live run: "I need the extension to offer an
autofill search function so it's easier to match an entry with an existing
artist."
- The field searches as soon as the panel opens (the server name, usually)
and on every keystroke; matches list under it, with ↑/↓, Enter/Tab to pick,
Esc to close, and a last "+ New artist" row.
- Inline autofill: the rest of the top match is filled in and selected, so
typing on replaces it and Tab/Enter accepts it. Backspacing never refills.
- A result whose name IS the text, spacing and case aside, is picked on its
own; the hint says in green which existing artist the source will join.
- /api/artists/autocomplete also matches ignoring spacing and punctuation
("Tamada Heijun" finds "TamadaHeijun"), ranked just below an exact match.
The web UI's artist search gets it too.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LVjrnpQjRgHdvq95rASoiR
This commit is contained in:
@@ -78,3 +78,30 @@ function discordAddRequest(choice) {
|
||||
const name = (choice.artistName || '').trim();
|
||||
return name ? { url, artistName: name } : null;
|
||||
}
|
||||
|
||||
/**
|
||||
* An artist name reduced to what identifies it: lowercase letters and digits
|
||||
* of any script, nothing else — so "Tamada Heijun", "tamada_heijun" and
|
||||
* "TamadaHeijun" are one name. Mirrors the server's autocomplete (#429).
|
||||
*/
|
||||
function squashName(name) {
|
||||
return String(name || '').toLowerCase().replace(/[^\p{L}\p{N}]/gu, '');
|
||||
}
|
||||
|
||||
/** The search result that IS the query, spacing aside, else null. */
|
||||
function exactArtistMatch(query, results) {
|
||||
const q = squashName(query);
|
||||
if (!q) return null;
|
||||
return (results || []).find((a) => squashName(a.name) === q) || null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Inline autofill: the first result whose name extends what was typed
|
||||
* (case-insensitive), so the panel can fill in the rest and select it —
|
||||
* typing on overwrites it, Tab or Enter accepts it. null when none does.
|
||||
*/
|
||||
function inlineCompletion(typed, results) {
|
||||
const t = String(typed || '').toLowerCase();
|
||||
if (!t) return null;
|
||||
return (results || []).find((a) => a.name.length > t.length && a.name.toLowerCase().startsWith(t)) || null;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user