CI / Build & Test (push) Successful in 2m54s
Add docs/CONTRIBUTING.md covering the build system, dev workflow, all npm scripts, how to add new native host message types, code style, and debugging guidance. Add CHANGELOG.md at the project root documenting all features and fixes across the 1.0.0 release. Add JSDoc (@param, @returns) to all previously undocumented exported functions across 35 JS files: - native-host/holesail-manager/ (index, virtual-hosts, service-tunnels, servers, port-allocator) - native-host top-level managers (startup, connect-proxy, https-proxy, certificate-authority, ssh-manager, rdp-manager) - extension/background/ (logs, native-messaging, proxy, message-router) - extension/dashboard/core/ (utils, navigation, init) - extension/dashboard/ui/ (modal, toast, state-tag) - extension/dashboard/pages/ (all 10 page files) - extension/dashboard/refresh.js, events.js - extension/dashboard/data/hostname-validator.js - scripts/ (build-host, run-install)
46 lines
1.4 KiB
JavaScript
46 lines
1.4 KiB
JavaScript
/**
|
|
* Sidebar navigation for the dashboard.
|
|
* Manages the active nav item and visible page section, and wires up click listeners.
|
|
* Depends on: core/utils.js ($)
|
|
*/
|
|
|
|
const PAGE_TITLES = {
|
|
dashboard: 'Overview',
|
|
connections: 'Virtual Hosts',
|
|
swarms: 'Server Tunnels',
|
|
'service-tunnels': 'Service Tunnels',
|
|
tabs: 'Proxy & CA',
|
|
ssh: 'SSH Connections',
|
|
rdp: 'Remote Desktop',
|
|
backups: 'Backups',
|
|
logs: 'Logs',
|
|
settings: 'Settings'
|
|
};
|
|
|
|
/**
|
|
* Switch the dashboard to the specified page.
|
|
* Updates the active nav item, shows the corresponding `.page` section,
|
|
* and sets the topbar title.
|
|
* @param {string} page - Page key (e.g. `'dashboard'`, `'connections'`, `'ssh'`).
|
|
*/
|
|
function navigateTo(page) {
|
|
document.querySelectorAll('.nav-item').forEach(i => i.classList.remove('active'));
|
|
document.querySelectorAll('.page').forEach(p => p.classList.remove('active'));
|
|
const navItem = document.querySelector(`.nav-item[data-page="${page}"]`);
|
|
if (navItem) navItem.classList.add('active');
|
|
const pageEl = $(`page-${page}`);
|
|
if (pageEl) pageEl.classList.add('active');
|
|
const titleEl = $('topbarTitle');
|
|
if (titleEl) titleEl.textContent = PAGE_TITLES[page] || page;
|
|
}
|
|
|
|
/**
|
|
* Attach click listeners to all `.nav-item` elements.
|
|
* Called once during dashboard initialisation.
|
|
*/
|
|
function setupNavigation() {
|
|
document.querySelectorAll('.nav-item').forEach(item => {
|
|
item.addEventListener('click', () => navigateTo(item.dataset.page));
|
|
});
|
|
}
|