feat(settings): lead with version + update, tail the rest of System

App Settings opened on a System section that mixed the two things worth seeing
immediately (what this install runs, whether a newer release is waiting) with
three groups nobody sets twice (CLAUDE.md template path, default working
directory, image watcher, Cloudflare tunnel).

Split in two. **Updates** is now the first section and carries only the current
version and the update action, so the modal opens on it and the second thing in
reach is Terminal & Input, where Local Echo lives. **System** keeps Paths,
Automation and Remote access and tails the document, last in the rail.

Also fixes the admin-ui load-order test, which broke on this branch: it located
the modules with a bare `indexOf('session-ui.js')`, and the modal markup now
cites those modules in comments well above the script tags, so it was comparing
a comment against a `<script src>`. It matches the script tag itself now.
This commit is contained in:
Codeman maintainer
2026-08-10 12:29:00 +02:00
parent 8d094b086c
commit 1513067a7f
6 changed files with 112 additions and 87 deletions
+10 -5
View File
@@ -135,11 +135,16 @@ describe('admin panel modal', () => {
describe('index.html wiring', () => {
it('loads admin-ui.js after settings-ui.js and before session-ui.js', () => {
const settings = INDEX_HTML.indexOf('settings-ui.js');
const admin = INDEX_HTML.indexOf('admin-ui.js');
const session = INDEX_HTML.indexOf('session-ui.js');
expect(admin).toBeGreaterThan(settings);
expect(session).toBeGreaterThan(admin);
// Match the SCRIPT TAG, not the bare filename: modal markup earlier in the
// document cites these modules in comments ("session-ui.js: openSessionOptions"),
// and a bare indexOf finds the comment instead of the load order.
const at = (file: string) => {
const i = INDEX_HTML.indexOf(`src="${file}"`);
expect(i, `no <script src="${file}"> in index.html`).toBeGreaterThan(-1);
return i;
};
expect(at('admin-ui.js')).toBeGreaterThan(at('settings-ui.js'));
expect(at('session-ui.js')).toBeGreaterThan(at('admin-ui.js'));
});
it('ships the header Admin Panel button hidden by default', () => {