Switched Panel Icon to Bootstrap Icon

This commit is contained in:
John Haverlack 2026-02-07 10:34:46 -09:00
parent 211cdcc53c
commit 574c28c81d
5 changed files with 70 additions and 19 deletions

View File

@ -57,7 +57,8 @@ MVP - Minimum Viable Product Task List
- [ ] Web UI - [ ] Web UI
- [ ] Progresive Web App - [ ] Progresive Web App
- [ ] Editable Dashboard - [ ] Editable Dashboard
- [ ] Panel Icon
**Resource Management** **Resource Management**
- [ ] CPU Reserve Capacity Allocation - [ ] CPU Reserve Capacity Allocation

View File

@ -25,6 +25,7 @@
"@fortawesome/fontawesome-free": "^6.7.2", "@fortawesome/fontawesome-free": "^6.7.2",
"aedes": "^0.51.3", "aedes": "^0.51.3",
"bootstrap": "^5.3.7", "bootstrap": "^5.3.7",
"bootstrap-icons": "^1.13.1",
"chart.js": "^4.5.1", "chart.js": "^4.5.1",
"csv-parse": "^5.6.0", "csv-parse": "^5.6.0",
"d3": "^7.9.0", "d3": "^7.9.0",

View File

@ -5,6 +5,7 @@
"open_browser": false, "open_browser": false,
"weblibs": { "weblibs": {
"bootstrap":"bootstrap/dist", "bootstrap":"bootstrap/dist",
"bootstrap-icons":"bootstrap-icons",
"chartjs":"chart.js/dist", "chartjs":"chart.js/dist",
"d3":"d3/dist", "d3":"d3/dist",
"fontawesome":"@fortawesome/fontawesome-free", "fontawesome":"@fortawesome/fontawesome-free",

View File

@ -9,6 +9,9 @@
<!-- Bootstrap CSS --> <!-- Bootstrap CSS -->
<link rel="stylesheet" href="/bootstrap/css/bootstrap.min.css"> <link rel="stylesheet" href="/bootstrap/css/bootstrap.min.css">
<!-- Bootstrap Icons -->
<link rel="stylesheet" href="/bootstrap-icons/font/bootstrap-icons.min.css">
<!-- Font Awesome --> <!-- Font Awesome -->
<link rel="stylesheet" href="/fontawesome/css/all.min.css"> <link rel="stylesheet" href="/fontawesome/css/all.min.css">

View File

@ -371,54 +371,99 @@ function loadNavTabs() {
// =============================== // ===============================
// Side Panel (layout-collapsing) // Side Panel (layout-collapsing)
// =============================== // ===============================
async function loadSidePanel() { // async function loadSidePanel() {
// console.log('DEBUG: loadSidePanel() called'); // // console.log('DEBUG: loadSidePanel() called');
// const panel = document.getElementById('sidepanel');
// const inner = document.getElementById('sidepanel-inner');
// const toggleBtn = document.getElementById('sidepanel-toggle');
// if (!panel || !inner || !toggleBtn) return;
// const currentPage =
// new URLSearchParams(window.location.search).get('page') || 'index';
// const isCollapsed =
// localStorage.getItem('sidepanel_collapsed') === 'true';
// if (isCollapsed) {
// panel.classList.add('collapsed');
// // toggleBtn.innerHTML = `<i class="fa-solid fa-folder-plus"></i>`;
// toggleBtn.innerHTML = '<i class="bi bi-layout-sidebar"></i>';
// } else {
// // toggleBtn.innerHTML = `<i class="fa-solid fa-folder-minus"></i>`;
// toggleBtn.innerHTML = '<i class="bi bi-layout-sidebar-reverse"></i>';
// }
// try {
// const res = await fetch('/api/nav/sidepanel');
// if (!res.ok) throw new Error(`HTTP ${res.status}`);
// const sideNav = await res.json();
// renderAllSidePanelSections(inner, sideNav, currentPage);
// } catch (err) {
// console.error('Failed to load side panel:', err);
// inner.innerHTML = '';
// }
// // Collapse / expand behavior
// toggleBtn.onclick = () => {
// const collapsed = panel.classList.toggle('collapsed');
// localStorage.setItem('sidepanel_collapsed', collapsed);
// // toggleBtn.innerHTML = `
// // <i class="fa-solid ${
// // collapsed ? 'fa-folder-plus' : 'fa-folder-minus'
// // }"></i>
// // `;
// toggleBtn.innerHTML = `
// <i class="bi ${
// collapsed ? 'bi-layout-sidebar' : 'bi-layout-sidebar-reverse'
// }"></i>
// `;
// };
// }
async function loadSidePanel() {
const panel = document.getElementById('sidepanel'); const panel = document.getElementById('sidepanel');
const inner = document.getElementById('sidepanel-inner'); const inner = document.getElementById('sidepanel-inner');
const toggleBtn = document.getElementById('sidepanel-toggle'); const toggleBtn = document.getElementById('sidepanel-toggle');
if (!panel || !inner || !toggleBtn) return; if (!panel || !inner || !toggleBtn) return;
const currentPage = const currentPage =
new URLSearchParams(window.location.search).get('page') || 'index'; new URLSearchParams(window.location.search).get('page') || 'index';
const isCollapsed = const isCollapsed =
localStorage.getItem('sidepanel_collapsed') === 'true'; localStorage.getItem('sidepanel_collapsed') === 'true';
if (isCollapsed) { if (isCollapsed) {
panel.classList.add('collapsed'); panel.classList.add('collapsed');
toggleBtn.innerHTML = `<i class="fa-solid fa-folder-plus"></i>`; toggleBtn.innerHTML = '<i class="bi bi-layout-sidebar"></i>';
} else { } else {
toggleBtn.innerHTML = `<i class="fa-solid fa-folder-minus"></i>`; toggleBtn.innerHTML = '<i class="bi bi-layout-sidebar-reverse"></i>';
} }
try { try {
const res = await fetch('/api/nav/sidepanel'); const res = await fetch('/api/nav/sidepanel');
if (!res.ok) throw new Error(`HTTP ${res.status}`); if (!res.ok) throw new Error(`HTTP ${res.status}`); // ✅ Fixed template literal
const sideNav = await res.json(); const sideNav = await res.json();
renderAllSidePanelSections(inner, sideNav, currentPage); renderAllSidePanelSections(inner, sideNav, currentPage);
} catch (err) { } catch (err) {
console.error('Failed to load side panel:', err); console.error('Failed to load side panel:', err);
inner.innerHTML = ''; inner.innerHTML = '';
} }
// Collapse / expand behavior // Collapse / expand behavior
toggleBtn.onclick = () => { toggleBtn.onclick = () => {
const collapsed = panel.classList.toggle('collapsed'); const collapsed = panel.classList.toggle('collapsed');
localStorage.setItem('sidepanel_collapsed', collapsed); localStorage.setItem('sidepanel_collapsed', collapsed);
toggleBtn.innerHTML = ` toggleBtn.innerHTML = `
<i class="fa-solid ${ <i class="bi ${collapsed ? 'bi-layout-sidebar' : 'bi-layout-sidebar-reverse'}"></i>
collapsed ? 'fa-folder-plus' : 'fa-folder-minus'
}"></i>
`; `;
}; };
} }
// ------------------------------- // -------------------------------
// Find matching section by page // Find matching section by page
// ------------------------------- // -------------------------------