diff --git a/public/app.js b/public/app.js
index 6b58374..87305ad 100644
--- a/public/app.js
+++ b/public/app.js
@@ -11,6 +11,7 @@ let config = null;
document.addEventListener('DOMContentLoaded', async () => {
setupTabs();
await loadStatus();
+ await loadConfig();
await loadCameras();
renderLiveGrid();
renderPlaybackCameras();
@@ -65,6 +66,14 @@ async function loadStatus() {
}
}
+async function loadConfig() {
+ try {
+ const r = await fetch(API + '/config');
+ const j = await r.json();
+ if (j.success) config = j.data;
+ } catch(e) { config = {}; }
+}
+
// ── Cameras ──
async function loadCameras() {
try {
@@ -259,7 +268,27 @@ async function renderCameraCards() {
`;
return;
}
- container.innerHTML = cameras.map(c => `
+ container.innerHTML = `
+
+
🔐 Authentication
+
+
+
+
+
+ ` + cameras.map(c => `
📷 ${c.name || 'Unnamed'} ${c.ip}
⚙️ Config
@@ -354,9 +383,23 @@ document.getElementById('btn-save').addEventListener('click', async () => {
});
try {
- // Include auth settings if present (first-run wizard).
- const adminUser = document.getElementById('wiz-admin-user')?.value;
- const adminPass = document.getElementById('wiz-admin-pass')?.value;
+ // Include auth settings from the management card.
+ const authEnabled = document.querySelector('[data-auth="auth-enabled"]')?.checked || false;
+ const masterUser = document.querySelector('[data-auth="master-user"]')?.value || '';
+ const masterPass = document.querySelector('[data-auth="master-pass"]')?.value || '';
+ const viewerUser = document.querySelector('[data-auth="viewer-user"]')?.value || '';
+ const viewerPass = document.querySelector('[data-auth="viewer-pass"]')?.value || '';
+ const viewerEnabled = document.querySelector('[data-auth="viewer-enabled"]')?.checked || false;
+
+ cfg.auth = cfg.auth || {};
+ cfg.auth.enabled = authEnabled;
+ cfg.auth.master = cfg.auth.master || {};
+ cfg.auth.master.username = masterUser;
+ cfg.auth.viewer = cfg.auth.viewer || {};
+ cfg.auth.viewer.username = viewerUser;
+ cfg.auth.viewer.enabled = viewerEnabled || false;
+ if (masterPass) { cfg.auth.master.password = masterPass; cfg.auth.master.enabled = true; }
+ if (viewerPass) { cfg.auth.viewer.password = viewerPass; }
// Fetch current config, then post updated version.
const cr = await fetch(API + '/config');
@@ -364,13 +407,6 @@ document.getElementById('btn-save').addEventListener('click', async () => {
const cfg = cj.data || {};
cfg.cameras = updatedCameras;
- // Set auth if admin credentials were provided.
- if (adminUser && adminPass) {
- cfg.auth = cfg.auth || {};
- cfg.auth.enabled = true;
- cfg.auth.master = { username: adminUser, password: adminPass, enabled: true };
- }
-
const r = await fetch(API + '/config', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },