From ab44526a291fa673aa2850d105f6412a70a5341f Mon Sep 17 00:00:00 2001 From: Christophe Besson Date: Sun, 6 Sep 2026 19:03:22 +0200 Subject: feat(client): Phase 2 — per-app settings panes, folder tree, multi-directory MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Each app's settings were inlined in `group-settings.js` — TMDB, MusicBrainz, and one folder picker per app, each with its own draft state and save handler saying the same thing about a different key. They are one file per app now, reached through the `apps.js` registry, and the page that renders them names no application at all: adding one is a registry entry and a settings file. The line between the two is what makes that true. What every app has — folders — the page does generically, through one `saveDirectories` bound to the app. What one app alone has, its pane does itself with the transport it is handed. An app that only needs directories touches neither `group-settings.js` nor `group-page.js`, which is `test_app_settings_plugin.py`'s subject. `settings-ui.js` exists because a pane importing the page that renders it is a cycle, and ES modules answer that with a temporal-dead-zone ReferenceError at first render — a component that silently does not appear, the fault already recorded in CLAUDE.md about hook ordering. The flat depth-indented ` setToken(e.target.value)} /> + + ${/* No "optional", and no mention of a shipped default. A key that + works without one is a key somebody else is paying the rate + limit for, and the operator should know they are meant to have + their own. */''} +

+ ${settings.tmdbTokenCustomized + ? t('settings_node.tmdb_token_customized') + : t('settings_app.tmdb_token_prompt')} + ${' '} + ${t('settings_app.tmdb_token_link')} +

+ + +
+ +

${t('settings_node.tmdb_language_hint')}

+
+ + + ${msg && html`

${msg}

`} + + `; +} + +export { VideoSettings, TMDB_LANGUAGE_BY_LOCALE }; -- cgit v1.2.3