From 9def2ad15a90afec3fa63e029f905b1d471ff4d6 Mon Sep 17 00:00:00 2001 From: CyberMind-FR Date: Wed, 4 Feb 2026 14:19:49 +0100 Subject: [PATCH] fix(exposure): Fix toggle switches always showing as ON Use DOM property assignment (cb.checked = value) instead of HTML attribute ('checked': false) which browsers treat as checked since any attribute presence means ON for boolean HTML attributes. Co-Authored-By: Claude Opus 4.5 --- .../resources/view/exposure/services.js | 31 +++++++++---------- 1 file changed, 15 insertions(+), 16 deletions(-) diff --git a/package/secubox/luci-app-exposure/htdocs/luci-static/resources/view/exposure/services.js b/package/secubox/luci-app-exposure/htdocs/luci-static/resources/view/exposure/services.js index ebdc4fdc..cffc7a0e 100644 --- a/package/secubox/luci-app-exposure/htdocs/luci-static/resources/view/exposure/services.js +++ b/package/secubox/luci-app-exposure/htdocs/luci-static/resources/view/exposure/services.js @@ -109,25 +109,15 @@ return view.extend({ svc.address.replace(/^.*:/, '').length < 4 ? svc.address : (isExternal ? '0.0.0.0' : '127.0.0.1')), // Tor toggle E('td', { 'style': 'text-align: center;' }, - isExternal ? E('label', { 'class': 'toggle-switch' }, [ - E('input', { - 'type': 'checkbox', - 'checked': !!torInfo, - 'change': ui.createHandlerFn(self, 'handleTorToggle', svc, torInfo) - }), - E('span', { 'class': 'toggle-slider tor-slider' }) - ]) : E('span', { 'class': 'exp-text-muted' }, '-') + isExternal ? self.makeToggle(!!torInfo, 'tor-slider', + ui.createHandlerFn(self, 'handleTorToggle', svc, torInfo) + ) : E('span', { 'class': 'exp-text-muted' }, '-') ), // SSL toggle E('td', { 'style': 'text-align: center;' }, - isExternal ? E('label', { 'class': 'toggle-switch' }, [ - E('input', { - 'type': 'checkbox', - 'checked': !!(sslInfo || domains.length > 0), - 'change': ui.createHandlerFn(self, 'handleSslToggle', svc, sslInfo, domains) - }), - E('span', { 'class': 'toggle-slider ssl-slider' }) - ]) : E('span', { 'class': 'exp-text-muted' }, '-') + isExternal ? self.makeToggle(!!(sslInfo || domains.length > 0), 'ssl-slider', + ui.createHandlerFn(self, 'handleSslToggle', svc, sslInfo, domains) + ) : E('span', { 'class': 'exp-text-muted' }, '-') ), // Exposure info E('td', {}, infoItems.length > 0 ? infoItems : @@ -167,6 +157,15 @@ return view.extend({ ]); }, + makeToggle: function(checked, sliderClass, handler) { + var cb = E('input', { 'type': 'checkbox', 'change': handler }); + cb.checked = checked; + return E('label', { 'class': 'toggle-switch' }, [ + cb, + E('span', { 'class': 'toggle-slider ' + sliderClass }) + ]); + }, + parseBackendPort: function(backend) { if (!backend) return null; var m = backend.match(/:(\d+)$/);