- Add CSS for collapsed sidebar state and transitions - Introduce SidebarToggle class for managing collapse/expand logic - Integrate SidebarToggle initialization in main script - Add toggle button to navbar and make mini sidebar clickable - Store sidebar collapsed state in localStorage - Filter image files and directories in view mode via FileTree - Make navbar brand clickable to navigate to collection root or home
115 lines
3.1 KiB
JavaScript
115 lines
3.1 KiB
JavaScript
/**
|
|
* Sidebar Toggle Module
|
|
* Manages sidebar collapse/expand functionality with localStorage persistence
|
|
*/
|
|
|
|
class SidebarToggle {
|
|
constructor(sidebarId, toggleButtonId) {
|
|
this.sidebar = document.getElementById(sidebarId);
|
|
this.toggleButton = document.getElementById(toggleButtonId);
|
|
this.storageKey = Config.STORAGE_KEYS.SIDEBAR_COLLAPSED || 'sidebarCollapsed';
|
|
this.isCollapsed = localStorage.getItem(this.storageKey) === 'true';
|
|
|
|
this.init();
|
|
}
|
|
|
|
/**
|
|
* Initialize the sidebar toggle
|
|
*/
|
|
init() {
|
|
// Apply initial state
|
|
this.apply();
|
|
|
|
// Setup toggle button click handler
|
|
if (this.toggleButton) {
|
|
this.toggleButton.addEventListener('click', () => {
|
|
this.toggle();
|
|
});
|
|
}
|
|
|
|
// Make mini sidebar clickable to expand
|
|
if (this.sidebar) {
|
|
this.sidebar.addEventListener('click', (e) => {
|
|
// Only expand if sidebar is collapsed and click is on the mini sidebar itself
|
|
// (not on the file tree content when expanded)
|
|
if (this.isCollapsed) {
|
|
this.expand();
|
|
}
|
|
});
|
|
|
|
// Add cursor pointer when collapsed
|
|
this.sidebar.style.cursor = 'default';
|
|
}
|
|
|
|
Logger.debug(`Sidebar initialized: ${this.isCollapsed ? 'collapsed' : 'expanded'}`);
|
|
}
|
|
|
|
/**
|
|
* Toggle sidebar state
|
|
*/
|
|
toggle() {
|
|
this.isCollapsed = !this.isCollapsed;
|
|
localStorage.setItem(this.storageKey, this.isCollapsed);
|
|
this.apply();
|
|
|
|
Logger.debug(`Sidebar ${this.isCollapsed ? 'collapsed' : 'expanded'}`);
|
|
}
|
|
|
|
/**
|
|
* Apply the current sidebar state
|
|
*/
|
|
apply() {
|
|
if (this.sidebar) {
|
|
if (this.isCollapsed) {
|
|
this.sidebar.classList.add('collapsed');
|
|
this.sidebar.style.cursor = 'pointer'; // Make mini sidebar clickable
|
|
} else {
|
|
this.sidebar.classList.remove('collapsed');
|
|
this.sidebar.style.cursor = 'default'; // Normal cursor when expanded
|
|
}
|
|
}
|
|
|
|
// Update toggle button icon
|
|
if (this.toggleButton) {
|
|
const icon = this.toggleButton.querySelector('i');
|
|
if (icon) {
|
|
if (this.isCollapsed) {
|
|
icon.className = 'bi bi-layout-sidebar-inset-reverse';
|
|
} else {
|
|
icon.className = 'bi bi-layout-sidebar';
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Collapse the sidebar
|
|
*/
|
|
collapse() {
|
|
if (!this.isCollapsed) {
|
|
this.toggle();
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Expand the sidebar
|
|
*/
|
|
expand() {
|
|
if (this.isCollapsed) {
|
|
this.toggle();
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Check if sidebar is currently collapsed
|
|
* @returns {boolean} True if sidebar is collapsed
|
|
*/
|
|
isCollapsedState() {
|
|
return this.isCollapsed;
|
|
}
|
|
}
|
|
|
|
// Make SidebarToggle globally available
|
|
window.SidebarToggle = SidebarToggle;
|
|
|