From 86b9715ef4dd2c2308fbbb3ad77ca8886d331a2f Mon Sep 17 00:00:00 2001 From: Will Miao <13051207myq@gmail.com> Date: Fri, 31 Jan 2025 09:50:33 +0800 Subject: [PATCH] Refactor modal management to support multiple modals, enhance event handling, and improve code structure --- static/js/script.js | 233 ++++++++++++++++++++++++++------------------ 1 file changed, 136 insertions(+), 97 deletions(-) diff --git a/static/js/script.js b/static/js/script.js index 05921f77..599e50de 100644 --- a/static/js/script.js +++ b/static/js/script.js @@ -99,38 +99,152 @@ function lazyLoadImages() { }); } -// 优化模态窗口 +// 优化模态窗口管理 class ModalManager { constructor() { - this.modal = document.getElementById('loraModal'); + this.modals = new Map(); this.boundHandleEscape = this.handleEscape.bind(this); - this.boundHandleOutsideClick = this.handleOutsideClick.bind(this); - } + + // 注册所有模态窗口 + this.registerModal('loraModal', { + element: document.getElementById('loraModal'), + onClose: () => { + this.getModal('loraModal').element.style.display = 'none'; + document.body.classList.remove('modal-open'); + } + }); + + this.registerModal('deleteModal', { + element: document.getElementById('deleteModal'), + onClose: () => { + this.getModal('deleteModal').element.classList.remove('show'); + document.body.classList.remove('modal-open'); + pendingDeletePath = null; + } + }); - show(content) { - this.modal.innerHTML = content; - this.modal.style.display = 'block'; - document.body.classList.add('modal-open'); + // 添加全局事件监听 document.addEventListener('keydown', this.boundHandleEscape); - this.modal.addEventListener('click', this.boundHandleOutsideClick); } - close() { - this.modal.style.display = 'none'; - document.body.classList.remove('modal-open'); - document.removeEventListener('keydown', this.boundHandleEscape); - this.modal.removeEventListener('click', this.boundHandleOutsideClick); + registerModal(id, config) { + this.modals.set(id, { + element: config.element, + onClose: config.onClose, + isOpen: false + }); + + // 为每个模态窗口添加点击外部关闭事件 + config.element.addEventListener('click', (e) => { + if (e.target === config.element) { + this.closeModal(id); + } + }); + } + + getModal(id) { + return this.modals.get(id); + } + + showModal(id, content = null) { + const modal = this.getModal(id); + if (!modal) return; + + if (content) { + modal.element.innerHTML = content; + } + + if (id === 'loraModal') { + modal.element.style.display = 'block'; + } else if (id === 'deleteModal') { + modal.element.classList.add('show'); + } + + modal.isOpen = true; + document.body.classList.add('modal-open'); + } + + closeModal(id) { + const modal = this.getModal(id); + if (!modal) return; + + modal.onClose(); + modal.isOpen = false; } handleEscape(e) { - if (e.key === 'Escape') this.close(); - } - - handleOutsideClick(e) { - if (e.target === this.modal) this.close(); + if (e.key === 'Escape') { + // 关闭最后打开的模态窗口 + for (const [id, modal] of this.modals) { + if (modal.isOpen) { + this.closeModal(id); + break; + } + } + } } } - + +// 创建全局 modalManager 实例 +const modalManager = new ModalManager(); + +// 修改现有的 showModal 函数为 showLoraModal +function showLoraModal(lora) { + const escapedWords = lora.trainedWords?.length ? + lora.trainedWords.join(', ').toUpperCase().replace(/'/g, '\\\'') : ''; + + const content = ` +
+ `; + + modalManager.showModal('loraModal', content); +} + +// 修改现有的 showDeleteModal 函数 +function showDeleteModal(filePath) { + event.stopPropagation(); + pendingDeletePath = filePath; + + const card = document.querySelector(`.lora-card[data-filepath="${filePath}"]`); + const modelName = card.dataset.name; + const modal = modalManager.getModal('deleteModal').element; + const modelInfo = modal.querySelector('.delete-model-info'); + + modelInfo.innerHTML = ` + Model: ${modelName} +