Refactor ModalManager to conditionally register modals based on their existence

- Updated ModalManager to check for the presence of modals before registration, improving performance and preventing errors on pages without certain modals.
- Added support for closing modals when clicking outside of them, enhancing user experience.
- Ensured consistent handling of modal display properties across various modal types.
This commit is contained in:
Will Miao
2025-03-19 16:36:07 +08:00
parent 7924e4000c
commit 32fa81cf93
2 changed files with 96 additions and 66 deletions

View File

@@ -10,85 +10,114 @@ export class ModalManager {
this.boundHandleEscape = this.handleEscape.bind(this); this.boundHandleEscape = this.handleEscape.bind(this);
// Register all modals // Register all modals - only if they exist in the current page
const loraModal = document.getElementById('loraModal');
if (loraModal) {
this.registerModal('loraModal', { this.registerModal('loraModal', {
element: document.getElementById('loraModal'), element: loraModal,
onClose: () => { onClose: () => {
this.getModal('loraModal').element.style.display = 'none'; this.getModal('loraModal').element.style.display = 'none';
document.body.classList.remove('modal-open'); document.body.classList.remove('modal-open');
} },
closeOnOutsideClick: true
}); });
}
const deleteModal = document.getElementById('deleteModal');
if (deleteModal) {
this.registerModal('deleteModal', { this.registerModal('deleteModal', {
element: document.getElementById('deleteModal'), element: deleteModal,
onClose: () => { onClose: () => {
this.getModal('deleteModal').element.classList.remove('show'); this.getModal('deleteModal').element.classList.remove('show');
document.body.classList.remove('modal-open'); document.body.classList.remove('modal-open');
} }
}); });
}
// Add downloadModal registration // Add downloadModal registration
const downloadModal = document.getElementById('downloadModal');
if (downloadModal) {
this.registerModal('downloadModal', { this.registerModal('downloadModal', {
element: document.getElementById('downloadModal'), element: downloadModal,
onClose: () => { onClose: () => {
this.getModal('downloadModal').element.style.display = 'none'; this.getModal('downloadModal').element.style.display = 'none';
document.body.classList.remove('modal-open'); document.body.classList.remove('modal-open');
} }
}); });
}
// Add settingsModal registration // Add settingsModal registration
const settingsModal = document.getElementById('settingsModal');
if (settingsModal) {
this.registerModal('settingsModal', { this.registerModal('settingsModal', {
element: document.getElementById('settingsModal'), element: settingsModal,
onClose: () => { onClose: () => {
this.getModal('settingsModal').element.style.display = 'none'; this.getModal('settingsModal').element.style.display = 'none';
document.body.classList.remove('modal-open'); document.body.classList.remove('modal-open');
} }
}); });
}
// Add moveModal registration // Add moveModal registration
const moveModal = document.getElementById('moveModal');
if (moveModal) {
this.registerModal('moveModal', { this.registerModal('moveModal', {
element: document.getElementById('moveModal'), element: moveModal,
onClose: () => { onClose: () => {
this.getModal('moveModal').element.style.display = 'none'; this.getModal('moveModal').element.style.display = 'none';
document.body.classList.remove('modal-open'); document.body.classList.remove('modal-open');
} }
}); });
}
// Add supportModal registration // Add supportModal registration
const supportModal = document.getElementById('supportModal');
if (supportModal) {
this.registerModal('supportModal', { this.registerModal('supportModal', {
element: document.getElementById('supportModal'), element: supportModal,
onClose: () => { onClose: () => {
this.getModal('supportModal').element.style.display = 'none'; this.getModal('supportModal').element.style.display = 'none';
document.body.classList.remove('modal-open'); document.body.classList.remove('modal-open');
} }
}); });
}
// Add updateModal registration // Add updateModal registration
const updateModal = document.getElementById('updateModal');
if (updateModal) {
this.registerModal('updateModal', { this.registerModal('updateModal', {
element: document.getElementById('updateModal'), element: updateModal,
onClose: () => { onClose: () => {
this.getModal('updateModal').element.style.display = 'none'; this.getModal('updateModal').element.style.display = 'none';
document.body.classList.remove('modal-open'); document.body.classList.remove('modal-open');
} }
}); });
}
// Add importModal registration // Add importModal registration
const importModal = document.getElementById('importModal');
if (importModal) {
this.registerModal('importModal', { this.registerModal('importModal', {
element: document.getElementById('importModal'), element: importModal,
onClose: () => { onClose: () => {
this.getModal('importModal').element.style.display = 'none'; this.getModal('importModal').element.style.display = 'none';
document.body.classList.remove('modal-open'); document.body.classList.remove('modal-open');
} }
}); });
}
// Add recipeModal registration // Add recipeModal registration
const recipeModal = document.getElementById('recipeModal');
if (recipeModal) {
this.registerModal('recipeModal', { this.registerModal('recipeModal', {
element: document.getElementById('recipeModal'), element: recipeModal,
onClose: () => { onClose: () => {
this.getModal('recipeModal').element.style.display = 'none'; this.getModal('recipeModal').element.style.display = 'none';
document.body.classList.remove('modal-open'); document.body.classList.remove('modal-open');
} },
closeOnOutsideClick: true
}); });
}
// Set up event listeners for modal toggles // Set up event listeners for modal toggles
const supportToggle = document.getElementById('supportToggleBtn'); const supportToggle = document.getElementById('supportToggleBtn');
@@ -107,8 +136,8 @@ export class ModalManager {
isOpen: false isOpen: false
}); });
// Only add click outside handler if it's the lora modal // Add click outside handler if specified in config
if (id == 'loraModal') { if (config.closeOnOutsideClick) {
config.element.addEventListener('click', (e) => { config.element.addEventListener('click', (e) => {
if (e.target === config.element) { if (e.target === config.element) {
this.closeModal(id); this.closeModal(id);

View File

@@ -92,6 +92,7 @@
const importModal = document.getElementById('importModal'); const importModal = document.getElementById('importModal');
if (importModal) { if (importModal) {
importModal.classList.remove('hidden'); importModal.classList.remove('hidden');
importModal.style.display = 'block';
} }
} }
</script> </script>