2025-04-28 12:25:20 +08:00

271 lines
9.2 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/**
* 事件处理模块
* @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 = '<div class="no-file-selected">请选择一个运行环境配置文件查看内容</div>';
}
// 清空文件选择
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 = '<div class="no-file-selected">请选择一个运行环境配置文件查看内容</div>';
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);
});
}