CI / Build & Test (push) Failing after 28s
Split monolithic dashboard.js (2753 lines) into 18 focused modules
under dashboard/{core,data,ui,pages}/ with refresh.js and events.js
as orchestrators. Extracted ~900-line inline <style> into dashboard.css
and moved dashboard.html to dashboard/dashboard.html.
Split background.js (609 lines) into background/{logs,state,proxy,
native-messaging,tab-lifecycle,message-router}.js with a thin entry
point using importScripts().
Deleted dead files: wrong-domain.js (duplicate of inline script).
Updated manifest.json web_accessible_resources for new paths.
Updated docs/ARCHITECTURE.md to reflect the new file structure.
No functionality changed. No build step introduced.
55 lines
2.2 KiB
JavaScript
55 lines
2.2 KiB
JavaScript
// Orchestrates a full state refresh cycle.
|
|
// Depends on: core/messaging.js (fetchState), core/state.js (settings, SETTINGS_DEFAULTS, currentState),
|
|
// pages/ssh.js (sshConnections, renderSshGrid),
|
|
// pages/rdp.js (rdpConnections, renderRdpGrid),
|
|
// pages/overview.js (updateDashboard),
|
|
// pages/virtual-hosts.js (updateConnectionsTable),
|
|
// pages/servers.js (updateSwarmsTable),
|
|
// pages/proxy-ca.js (updateTabsTable),
|
|
// pages/service-tunnels.js (updateServiceTunnelsTable),
|
|
// pages/settings.js (updateSettingsUI),
|
|
// pages/backups.js (refreshBackups)
|
|
|
|
async function refresh() {
|
|
const state = await fetchState();
|
|
if (state) {
|
|
// Sync SSH connections from native host state — decode base64 password if present
|
|
if (Array.isArray(state.sshConnections)) {
|
|
sshConnections = state.sshConnections.map(c => {
|
|
const existing = sshConnections.find(e => e.id === c.id);
|
|
let password = (existing && existing.password) || '';
|
|
if (!password && c.passwordB64) {
|
|
try { password = decodeURIComponent(escape(atob(c.passwordB64))); } catch (_) {}
|
|
}
|
|
return { ...c, password };
|
|
});
|
|
renderSshGrid();
|
|
}
|
|
// Sync RDP connections from native host state — decode base64 password if present
|
|
if (Array.isArray(state.rdpConnections)) {
|
|
rdpConnections = state.rdpConnections.map(c => {
|
|
const existing = rdpConnections.find(e => e.id === c.id);
|
|
let password = (existing && existing.password) || '';
|
|
if (!password && c.passwordB64) {
|
|
try { password = decodeURIComponent(escape(atob(c.passwordB64))); } catch (_) {}
|
|
}
|
|
return { ...c, password };
|
|
});
|
|
renderRdpGrid();
|
|
}
|
|
// Sync settings from native host state
|
|
if (state.settings && typeof state.settings === 'object') {
|
|
settings = { ...SETTINGS_DEFAULTS, ...state.settings };
|
|
}
|
|
updateDashboard(state);
|
|
updateConnectionsTable(state);
|
|
updateSwarmsTable(state);
|
|
updateTabsTable(state);
|
|
updateServiceTunnelsTable(state);
|
|
updateSettingsUI();
|
|
}
|
|
const sshCountEl = $('sshCount');
|
|
if (sshCountEl) sshCountEl.textContent = sshConnections.length;
|
|
refreshBackups();
|
|
}
|