diff --git a/webui/static/settings.js b/webui/static/settings.js
index abde9eaf..4f2ade67 100644
--- a/webui/static/settings.js
+++ b/webui/static/settings.js
@@ -1834,9 +1834,22 @@ function _genreWhitelistRender(genres) {
const searchVal = (document.getElementById('genre-whitelist-search')?.value || '').toLowerCase();
const filtered = searchVal ? _genreWhitelistCache.filter(g => g.toLowerCase().includes(searchVal)) : _genreWhitelistCache;
container.innerHTML = filtered.map(g =>
- `${escapeHtml(g)}`
+ `${escapeHtml(g)}`
).join('');
if (countEl) countEl.textContent = `${_genreWhitelistCache.length} genres`;
+ _initGenreChipClickHandler();
+}
+
+function _initGenreChipClickHandler() {
+ const container = document.getElementById('genre-whitelist-chips');
+ if (!container) return;
+ container.onclick = (e) => {
+ const btn = e.target.closest('.genre-chip-x');
+ if (btn) {
+ e.preventDefault();
+ _genreWhitelistRemove(btn.dataset.genre);
+ }
+ };
}
function _genreWhitelistRemove(genre) {
@@ -2787,19 +2800,32 @@ function renderApiKeys(keys) {
container.innerHTML = keys.map(k => `
-
${k.label || 'Unnamed'}
+
${escapeHtml(k.label || 'Unnamed')}
- ${k.key_prefix || 'sk_...'}...
+ ${escapeHtml(k.key_prefix || 'sk_...')}...
· Created ${k.created_at ? new Date(k.created_at).toLocaleDateString() : 'unknown'}
${k.last_used_at ? '· Last used ' + new Date(k.last_used_at).toLocaleDateString() : ''}
-
`).join('');
+ _initApiKeyClickHandler();
+}
+
+function _initApiKeyClickHandler() {
+ const container = document.getElementById('api-keys-list');
+ if (!container) return;
+ container.onclick = (e) => {
+ const btn = e.target.closest('.revoke-api-key-btn');
+ if (btn) {
+ e.preventDefault();
+ revokeApiKey(btn.dataset.keyId, btn.dataset.keyLabel);
+ }
+ };
}
async function generateApiKey() {
@@ -3291,16 +3317,17 @@ async function loadHiFiInstances() {
listEl.innerHTML = data.instances.map((inst, i) => {
const enabledClass = inst.enabled ? '' : 'hifi-instance-disabled';
const checkHtml = inst.enabled
- ? `✔`
- : `✘`;
+ ? `✔`
+ : `✘`;
return `
☰
${escapeHtml(inst.url)}
${checkHtml}
- ✖
+ ✖
`;
}).join('');
_initHiFiDragDrop();
+ _initHiFiClickHandlers();
} catch (e) {
listEl.innerHTML = `Error loading instances: ${escapeHtml(e.message)}
`;
}
@@ -3349,6 +3376,24 @@ function _initHiFiDragDrop() {
});
}
+function _initHiFiClickHandlers() {
+ const listEl = document.getElementById('hifi-instances-list');
+ if (!listEl) return;
+ listEl.onclick = (e) => {
+ const toggle = e.target.closest('.hifi-instance-toggle');
+ if (toggle) {
+ e.preventDefault();
+ toggleHiFiInstance(toggle.dataset.url);
+ return;
+ }
+ const remove = e.target.closest('.hifi-instance-remove');
+ if (remove) {
+ e.preventDefault();
+ removeHiFiInstance(remove.dataset.url);
+ }
+ };
+}
+
async function _saveHiFiInstanceOrder(urls) {
try {
await fetch('/api/hifi/instances/reorder', {