mirror of
https://github.com/willmiao/ComfyUI-Lora-Manager.git
synced 2026-03-21 21:22:11 -03:00
153 lines
5.6 KiB
JavaScript
153 lines
5.6 KiB
JavaScript
import { updateService } from '../managers/UpdateService.js';
|
|
|
|
/**
|
|
* Header.js - Manages the application header behavior across different pages
|
|
* Handles initialization of appropriate search and filter managers based on current page
|
|
*/
|
|
export class HeaderManager {
|
|
constructor() {
|
|
this.currentPage = this.detectCurrentPage();
|
|
this.searchManager = null;
|
|
this.filterManager = null;
|
|
|
|
// Initialize appropriate managers based on current page
|
|
this.initializeManagers();
|
|
|
|
// Set up common header functionality
|
|
this.initializeCommonElements();
|
|
}
|
|
|
|
detectCurrentPage() {
|
|
const path = window.location.pathname;
|
|
if (path.includes('/loras/recipes')) return 'recipes';
|
|
if (path.includes('/checkpoints')) return 'checkpoints';
|
|
if (path.includes('/loras')) return 'loras';
|
|
return 'unknown';
|
|
}
|
|
|
|
initializeManagers() {
|
|
// Import and initialize appropriate search manager based on page
|
|
if (this.currentPage === 'loras') {
|
|
import('../managers/LoraSearchManager.js').then(module => {
|
|
const { LoraSearchManager } = module;
|
|
this.searchManager = new LoraSearchManager();
|
|
window.searchManager = this.searchManager;
|
|
});
|
|
|
|
import('../managers/FilterManager.js').then(module => {
|
|
const { FilterManager } = module;
|
|
this.filterManager = new FilterManager();
|
|
window.filterManager = this.filterManager;
|
|
});
|
|
} else if (this.currentPage === 'recipes') {
|
|
import('../managers/RecipeSearchManager.js').then(module => {
|
|
const { RecipeSearchManager } = module;
|
|
this.searchManager = new RecipeSearchManager();
|
|
window.searchManager = this.searchManager;
|
|
});
|
|
|
|
import('../managers/RecipeFilterManager.js').then(module => {
|
|
const { RecipeFilterManager } = module;
|
|
this.filterManager = new RecipeFilterManager();
|
|
window.filterManager = this.filterManager;
|
|
});
|
|
} else if (this.currentPage === 'checkpoints') {
|
|
import('../managers/CheckpointSearchManager.js').then(module => {
|
|
const { CheckpointSearchManager } = module;
|
|
this.searchManager = new CheckpointSearchManager();
|
|
window.searchManager = this.searchManager;
|
|
});
|
|
|
|
// Note: Checkpoints page might get its own filter manager in the future
|
|
// For now, we can use a basic filter manager or none at all
|
|
}
|
|
}
|
|
|
|
initializeCommonElements() {
|
|
// Handle theme toggle
|
|
const themeToggle = document.querySelector('.theme-toggle');
|
|
if (themeToggle) {
|
|
themeToggle.addEventListener('click', () => {
|
|
if (typeof toggleTheme === 'function') {
|
|
toggleTheme();
|
|
}
|
|
});
|
|
}
|
|
|
|
// Handle settings toggle
|
|
const settingsToggle = document.querySelector('.settings-toggle');
|
|
if (settingsToggle) {
|
|
settingsToggle.addEventListener('click', () => {
|
|
if (window.settingsManager) {
|
|
window.settingsManager.toggleSettings();
|
|
}
|
|
});
|
|
}
|
|
|
|
// Handle update toggle
|
|
const updateToggle = document.getElementById('updateToggleBtn');
|
|
if (updateToggle) {
|
|
updateToggle.addEventListener('click', () => {
|
|
updateService.toggleUpdateModal();
|
|
});
|
|
}
|
|
|
|
// Handle support toggle
|
|
const supportToggle = document.getElementById('supportToggleBtn');
|
|
if (supportToggle) {
|
|
supportToggle.addEventListener('click', () => {
|
|
// Handle support panel logic
|
|
});
|
|
}
|
|
}
|
|
|
|
// Helper method to update panel positions (can be called from window resize handlers)
|
|
updatePanelPositions() {
|
|
if (this.searchManager && typeof this.searchManager.updatePanelPositions === 'function') {
|
|
this.searchManager.updatePanelPositions();
|
|
} else {
|
|
const searchOptionsPanel = document.getElementById('searchOptionsPanel');
|
|
const filterPanel = document.getElementById('filterPanel');
|
|
|
|
if (!searchOptionsPanel && !filterPanel) return;
|
|
|
|
// Get the header element
|
|
const header = document.querySelector('.app-header');
|
|
if (!header) return;
|
|
|
|
// Calculate the position based on the bottom of the header
|
|
const headerRect = header.getBoundingClientRect();
|
|
const topPosition = headerRect.bottom + 5; // Add 5px padding
|
|
|
|
// Set the positions
|
|
if (searchOptionsPanel) {
|
|
searchOptionsPanel.style.top = `${topPosition}px`;
|
|
}
|
|
|
|
if (filterPanel) {
|
|
filterPanel.style.top = `${topPosition}px`;
|
|
}
|
|
|
|
// Adjust panel horizontal position based on the search container
|
|
const searchContainer = document.querySelector('.header-search');
|
|
if (searchContainer) {
|
|
const searchRect = searchContainer.getBoundingClientRect();
|
|
|
|
// Position the search options panel aligned with the search container
|
|
if (searchOptionsPanel) {
|
|
searchOptionsPanel.style.right = `${window.innerWidth - searchRect.right}px`;
|
|
}
|
|
|
|
// Position the filter panel aligned with the filter button
|
|
if (filterPanel) {
|
|
const filterButton = document.getElementById('filterButton');
|
|
if (filterButton) {
|
|
const filterRect = filterButton.getBoundingClientRect();
|
|
filterPanel.style.right = `${window.innerWidth - filterRect.right}px`;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|