diff --git a/ers5952-manager.jsx b/ers5952-manager.jsx index e2790ff..3606627 100644 --- a/ers5952-manager.jsx +++ b/ers5952-manager.jsx @@ -417,7 +417,7 @@ function SessionBtn({ session, onUnlock }) { // ══════════════════════════════════════════════════════════════════════════════ // SETTINGS PANEL // ══════════════════════════════════════════════════════════════════════════════ -function SettingsPanel({ settings, setSettings, onClose }) { +function SettingsPanel({ settings, setSettings, session, onClose }) { return (
e.stopPropagation()}> @@ -454,6 +454,29 @@ function SettingsPanel({ settings, setSettings, onClose }) {
+
+

Network

+
+
+
Services / Caddy box LAN IP
+
The computer running Caddy and services (Plex, etc.) — separate from this management computer
+
+ setSettings(s => ({...s, caddyIp: e.target.value}))} + placeholder="192.168.1.50" + onBlur={() => { + if (settings.caddyIp && session?.token) { + fetch("/api/services/config", { + method:"POST", + headers:{"Content-Type":"application/json"}, + body: JSON.stringify({ token: session.token, config: { caddy_ip: settings.caddyIp } }) + }).catch(() => {}); + } + }} + style={{background:"var(--bg)",border:"1px solid var(--b2)",color:"var(--tx)", + padding:"4px 8px",fontFamily:"var(--mono)",fontSize:11,borderRadius:3,width:140}}/> +
+
+

About

@@ -1473,7 +1496,7 @@ export default function App() { const [selected, setSelected] = useState(null); const [hostname, setHostname] = useState("ERS-5952"); const [switchIP, setSwitchIP] = useState("192.168.99.1"); - const [settings, setSettings] = useState({ cliMode: false, defaultPushMode: "batch" }); + const [settings, setSettings] = useState({ cliMode: false, defaultPushMode: "batch", caddyIp: "" }); const [showSettings, setShowSettings] = useState(false); const [connState, setConnState] = useState("connecting"); @@ -1487,6 +1510,13 @@ export default function App() { const updatePort = useCallback(p => setPorts(prev => prev.map(x => x.id===p.id?p:x)), []); // Heartbeat + // Load services config (caddy IP) once on mount + useEffect(() => { + API("/services/config").then(cfg => { + if (cfg.caddy_ip) setSettings(s => ({...s, caddyIp: cfg.caddy_ip})); + }).catch(() => {}); + }, []); + useEffect(() => { let firstPoll = true; const beat = async () => { @@ -1660,6 +1690,7 @@ export default function App() { {showSettings && setShowSettings(false)} />}
@@ -5099,14 +5130,12 @@ function ServicesTab({ vlans, session, onNeedAuth, backendOk }) { const [deploying, setDeploying] = useState(false); const [deployResult, setDeployResult] = useState(null); const [actionLoading, setActionLoading] = useState(""); - const [caddyIpInput, setCaddyIpInput] = useState(""); const load = async () => { try { const [svc, st] = await Promise.all([API("/services"), API("/services/status")]); setServices(svc.services || []); setStatus(st); - if (st.caddy_ip && !caddyIpInput) setCaddyIpInput(st.caddy_ip); } catch(e) { console.error(e); } }; useEffect(() => { if (backendOk) load(); }, [backendOk]); @@ -5127,17 +5156,6 @@ function ServicesTab({ vlans, session, onNeedAuth, backendOk }) { await load(); }; - const saveCaddyIp = async () => { - if (!session) { onNeedAuth(); return; } - if (!caddyIpInput.trim()) return; - try { - await API("/services/config", { method:"POST", body:{ - token: session.token, config: { caddy_ip: caddyIpInput.trim() } - }}); - await load(); - } catch(e) { alert("Failed: " + e.message); } - }; - const enableNatReflection = async () => { if (!session) { onNeedAuth(); return; } setActionLoading("nat"); @@ -5216,26 +5234,6 @@ function ServicesTab({ vlans, session, onNeedAuth, backendOk }) {
- {/* Services Host Config */} -
-
Services Host (Caddy Computer)
-
-
- The computer running Caddy and your services (Plex, etc.) — on LAN, separate from the - VLAN 99 management computer. -
-
-
- - setCaddyIpInput(e.target.value)} - placeholder="192.168.1.50"/> -
- -
-
-
- {/* Status Checklist */}
Setup Checklist