/** * 事件处理模块 * @type {module} */ import { loadScenarioFiles, loadFileContent, saveFileContent, createNewConfig } from './file-operations.js'; import { createModal, resetEditState, checkSaveNeeded } from './utils.js'; /** * 初始化事件监听器 * @param {HTMLElement} component - 组件实例 */ export function setupEventListeners(component) { // 新建按钮 const newButton = component.shadowRoot.getElementById('newConfig'); newButton.addEventListener('click', async () => { // 检查是否需要保存当前文件 if (await checkSaveNeeded(component)) { showNewConfigDialog(component); } }); // 保存按钮 const saveButton = component.shadowRoot.getElementById('saveConfig'); saveButton.addEventListener('click', () => { if (component.currentFile && component.xmlContent) { saveFileContent(component, component.currentFile, component.xmlContent); } else { // 如果没有选择文件,则提示另存为 if (component.xmlContent) { showSaveAsDialog(component); } } }); // 另存为按钮 const saveAsButton = component.shadowRoot.getElementById('saveAsConfig'); saveAsButton.addEventListener('click', () => { showSaveAsDialog(component); }); // 刷新按钮 const refreshButton = component.shadowRoot.getElementById('refreshButton'); refreshButton.addEventListener('click', async () => { // 检查是否需要保存当前文件 if (await checkSaveNeeded(component)) { // 添加刷新中的样式 refreshButton.classList.add('refreshing'); try { // 重新加载文件列表 await loadScenarioFiles(component); // 清除编辑状态和内容 resetEditState(component.shadowRoot); // 清空内容区域 component.xmlContent = ''; component.xmlDoc = null; component.currentFile = null; const contentElement = component.shadowRoot.getElementById('fileContent'); if (contentElement) { contentElement.innerHTML = '
请选择一个运行环境配置文件查看内容
'; } // 清空文件选择 const fileSelector = component.shadowRoot.getElementById('scenarioFile'); if (fileSelector) { fileSelector.value = ''; } } catch (error) { console.error('刷新文件列表失败:', error); alert('刷新文件列表失败: ' + error.message); } finally { // 移除刷新中的样式 setTimeout(() => { refreshButton.classList.remove('refreshing'); }, 500); } } // 如果用户点击取消,什么也不做,保留当前内容 }); // 文件选择下拉框 const fileSelector = component.shadowRoot.getElementById('scenarioFile'); fileSelector.addEventListener('change', async (e) => { // 检查是否需要保存当前文件 if (await checkSaveNeeded(component)) { const selectedFile = e.target.value; if (selectedFile) { loadFileContent(component, selectedFile); } else { component.currentFile = null; component.xmlContent = ''; const contentElement = component.shadowRoot.getElementById('fileContent'); contentElement.innerHTML = '
请选择一个运行环境配置文件查看内容
'; component.isEdited = resetEditState(component.shadowRoot); } } else { // 恢复之前的选择 fileSelector.value = component.currentFile || ''; } }); // 添加fileSelectorChange处理器供外部调用 component.handleFileSelectorChange = async (e) => { // 检查是否需要保存当前文件 if (await checkSaveNeeded(component)) { const selectedFile = e.target.value; if (selectedFile) { loadFileContent(component, selectedFile); } } else { // 恢复之前的选择 fileSelector.value = component.currentFile || ''; } }; } /** * 显示新建配置对话框 * @param {HTMLElement} component - 组件实例 */ export function showNewConfigDialog(component) { // 创建表单容器 const formContent = document.createElement('div'); // 创建文件名输入组 const formGroup = document.createElement('div'); formGroup.className = 'form-group'; formGroup.style.marginBottom = '16px'; // 创建标签 const label = document.createElement('label'); label.htmlFor = 'fileName'; label.textContent = '文件名'; label.style.display = 'block'; label.style.marginBottom = '8px'; label.style.fontWeight = '500'; label.style.color = '#2d3748'; // 创建输入框 const input = document.createElement('input'); input.id = 'fileName'; input.className = 'form-control'; input.type = 'text'; input.value = 'NewConfig'; input.placeholder = '请输入文件名'; input.style.width = '100%'; input.style.padding = '10px 12px'; input.style.border = '1px solid #ddd'; input.style.borderRadius = '6px'; input.style.fontSize = '15px'; input.style.boxSizing = 'border-box'; // 添加提示信息 const helpText = document.createElement('div'); helpText.textContent = '如未指定后缀,将自动添加.sce后缀'; helpText.style.fontSize = '12px'; helpText.style.color = '#718096'; helpText.style.marginTop = '4px'; // 组装表单组 formGroup.appendChild(label); formGroup.appendChild(input); formGroup.appendChild(helpText); formContent.appendChild(formGroup); // 显示对话框 const modal = createModal(component.shadowRoot, '新建配置文件', formContent, () => { let fileName = input.value.trim(); if (!fileName) { alert('文件名不能为空'); return; } // 自动添加后缀 const ext = fileName.toLowerCase(); if (!ext.endsWith('.xml') && !ext.endsWith('.sce')) { fileName += '.sce'; } // 创建新文件 createNewConfig(component, fileName); // 关闭模态框 modal.modal.remove(); }); } /** * 显示另存为对话框 * @param {HTMLElement} component - 组件实例 */ export function showSaveAsDialog(component) { if (!component.xmlContent) { alert('没有内容可保存'); return; } // 创建表单容器 const formContent = document.createElement('div'); // 创建文件名输入组 const formGroup = document.createElement('div'); formGroup.className = 'form-group'; formGroup.style.marginBottom = '16px'; // 创建标签 const label = document.createElement('label'); label.htmlFor = 'fileName'; label.textContent = '文件名'; label.style.display = 'block'; label.style.marginBottom = '8px'; label.style.fontWeight = '500'; label.style.color = '#2d3748'; // 获取原文件名(不含路径和后缀) let defaultFileName = 'NewConfig'; if (component.currentFile) { const fileName = component.currentFile.split('/').pop(); defaultFileName = fileName.substring(0, fileName.lastIndexOf('.')) || fileName; } // 创建输入框 const input = document.createElement('input'); input.id = 'fileName'; input.className = 'form-control'; input.type = 'text'; input.value = defaultFileName; input.placeholder = '请输入文件名'; input.style.width = '100%'; input.style.padding = '10px 12px'; input.style.border = '1px solid #ddd'; input.style.borderRadius = '6px'; input.style.fontSize = '15px'; input.style.boxSizing = 'border-box'; // 添加提示信息 const helpText = document.createElement('div'); helpText.textContent = '如未指定后缀,将自动添加.sce后缀'; helpText.style.fontSize = '12px'; helpText.style.color = '#718096'; helpText.style.marginTop = '4px'; // 组装表单组 formGroup.appendChild(label); formGroup.appendChild(input); formGroup.appendChild(helpText); formContent.appendChild(formGroup); // 显示对话框 createModal(component.shadowRoot, '另存为', formContent, () => { let fileName = input.value.trim(); if (!fileName) { alert('文件名不能为空'); return; } // 自动添加后缀 const ext = fileName.toLowerCase(); if (!ext.endsWith('.xml') && !ext.endsWith('.sce')) { fileName += '.sce'; } // 直接使用文件名,saveFileContent 函数会处理成绝对路径 saveFileContent(component, fileName, component.xmlContent); }); }