ERP/frontend/js/components/sidebar.js
2026-02-03 13:27:32 +08:00

77 lines
2.6 KiB
JavaScript

(() => {
// 展开/收起子菜单
document.querySelectorAll('.nav-item.has-children').forEach(group => {
const btn = group.querySelector('.nav-item-btn');
const caret = btn.querySelector('.caret');
const children = group.querySelector('.nav-children');
btn.addEventListener('click', () => {
children.classList.toggle('open');
caret.classList.toggle('rotate');
});
});
// 侧边栏折叠功能
const sidebar = document.getElementById('sidebar');
const toggleBtn = document.getElementById('sidebar-toggle');
if (sidebar && toggleBtn) {
// 从 localStorage 恢复状态
const isCollapsed = localStorage.getItem('sidebar-collapsed') === 'true';
if (isCollapsed) {
sidebar.classList.add('collapsed');
}
toggleBtn.addEventListener('click', () => {
sidebar.classList.toggle('collapsed');
const collapsed = sidebar.classList.contains('collapsed');
localStorage.setItem('sidebar-collapsed', collapsed);
toggleBtn.title = collapsed ? '展开菜单' : '收起菜单';
// 触发窗口 resize 事件,让图表立即重绘
setTimeout(() => {
window.dispatchEvent(new Event('resize'));
}, 310); // 等待侧边栏动画完成 (300ms)
});
// 设置初始 title
toggleBtn.title = sidebar.classList.contains('collapsed') ? '展开菜单' : '收起菜单';
}
// 二级菜单点击时自动缩进侧边栏功能
// 检查是否启用了此功能(默认启用)
const autoCollapseOnSubmenu = localStorage.getItem('sidebar-auto-collapse') !== 'false';
if (autoCollapseOnSubmenu) {
const dropdownItems = document.querySelectorAll('.dropdown-item');
dropdownItems.forEach(item => {
item.addEventListener('click', () => {
// 延迟执行,确保路由跳转完成后再缩进
setTimeout(() => {
if (sidebar && !sidebar.classList.contains('collapsed')) {
sidebar.classList.add('collapsed');
localStorage.setItem('sidebar-collapsed', 'true');
if (toggleBtn) {
toggleBtn.title = '展开菜单';
}
// 触发窗口 resize 事件,让图表立即重绘
setTimeout(() => {
window.dispatchEvent(new Event('resize'));
}, 310);
}
}, 100);
});
});
}
// 添加键盘快捷键切换功能
document.addEventListener('keydown', (e) => {
// Ctrl + B 切换侧边栏
if (e.ctrlKey && e.key === 'b') {
e.preventDefault();
if (sidebar && toggleBtn) {
toggleBtn.click();
}
}
});
})();