feat: Implement sidebar collapse and expand functionality
- 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
This commit is contained in:
114
static/js/sidebar-toggle.js
Normal file
114
static/js/sidebar-toggle.js
Normal file
@@ -0,0 +1,114 @@
|
||||
/**
|
||||
* 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;
|
||||
|
||||
Reference in New Issue
Block a user