Files
ETPlot/assets/js/view-manager.js
T

193 lines
4.7 KiB
JavaScript

/**
* View Controls Manager - handles switching between grid, list-large, and list-compact views
*/
export class ViewManager {
constructor() {
this.currentView = 'grid';
this.init();
}
/**
* Initialize view controls
*/
init() {
this.setupViewButtons();
this.loadSavedView();
this.updateControlsVisibility();
}
/**
* Update visibility of view controls based on plot content
*/
updateControlsVisibility() {
const plotContainer = document.getElementById('plotContainer');
const controlsContainer = document.querySelector('.controls-container');
if (!plotContainer || !controlsContainer) return;
const hasPlots = plotContainer.children.length > 0;
controlsContainer.style.display = hasPlots ? 'flex' : 'none';
}
/**
* Setup view toggle buttons
*/
setupViewButtons() {
const viewButtons = document.querySelectorAll('.view-btn');
viewButtons.forEach(button => {
button.addEventListener('click', (e) => {
const newView = button.getAttribute('data-view');
this.switchView(newView);
});
});
}
/**
* Switch to a different view mode
*/
switchView(viewMode) {
if (viewMode === this.currentView) return;
const plotContainer = document.getElementById('plotContainer');
const viewButtons = document.querySelectorAll('.view-btn');
if (!plotContainer) return;
// Remove current view class
plotContainer.classList.remove(
'grid-view',
'list-large-view',
'list-compact-view'
);
// Add new view class
switch (viewMode) {
case 'grid':
plotContainer.classList.add('grid-view');
break;
case 'list-large':
plotContainer.classList.add('list-large-view');
break;
case 'list-compact':
plotContainer.classList.add('list-compact-view');
break;
default:
plotContainer.classList.add('grid-view');
viewMode = 'grid';
}
// Update button states
viewButtons.forEach(btn => {
if (btn.getAttribute('data-view') === viewMode) {
btn.classList.add('active');
} else {
btn.classList.remove('active');
}
});
// Save the preference
this.currentView = viewMode;
this.saveViewPreference(viewMode);
// Trigger any necessary layout updates
this.onViewChanged(viewMode);
}
/**
* Save view preference to localStorage
*/
saveViewPreference(viewMode) {
try {
localStorage.setItem('gallery-view-mode', viewMode);
} catch (e) {
// Ignore localStorage errors
}
}
/**
* Load saved view preference
*/
loadSavedView() {
try {
const savedView = localStorage.getItem('gallery-view-mode');
if (savedView && ['grid', 'list-large', 'list-compact'].includes(savedView)) {
this.switchView(savedView);
}
} catch (e) {
// Ignore localStorage errors, use default
}
}
/**
* Handle view change events - can be extended for additional functionality
*/
onViewChanged(viewMode) {
// Dispatch custom event for other components that might need to know
const event = new CustomEvent('viewChanged', {
detail: { viewMode }
});
document.dispatchEvent(event);
// Update any other UI elements that depend on view mode
this.updateUIForView(viewMode);
}
/**
* Update UI elements based on current view
*/
updateUIForView(viewMode) {
// You can add view-specific UI updates here
// For example, adjusting search result highlighting, etc.
// Update any tooltips or help text
const viewButtons = document.querySelectorAll('.view-btn');
viewButtons.forEach(btn => {
const btnView = btn.getAttribute('data-view');
if (btnView === viewMode) {
btn.style.transform = 'scale(1.05)';
} else {
btn.style.transform = 'scale(1)';
}
});
}
/**
* Get current view mode
*/
getCurrentView() {
return this.currentView;
}
/**
* Refresh controls visibility (call this when gallery content changes)
*/
refresh() {
this.updateControlsVisibility();
}
/**
* Check if current view is grid mode
*/
isGridView() {
return this.currentView === 'grid';
}
/**
* Check if current view is list mode (either variant)
*/
isListView() {
return this.currentView === 'list-large' || this.currentView === 'list-compact';
}
/**
* Cycle through view modes (useful for keyboard shortcuts)
*/
cycleView() {
const views = ['grid', 'list-large', 'list-compact'];
const currentIndex = views.indexOf(this.currentView);
const nextIndex = (currentIndex + 1) % views.length;
this.switchView(views[nextIndex]);
}
}