paper-burner/js/ui/ui_dom_elements.js

144 lines
5.5 KiB
JavaScript

/**
* UI DOM 元素引用管理模块
* 集中管理所有 DOM 元素的引用,便于维护和访问
*/
(function(window) {
'use strict';
/**
* DOM 元素引用对象
* 包含页面上所有需要被 JavaScript 操作的 DOM 元素
*/
const DOMElements = {
// ===== API Key 配置相关 =====
mistralApiKeysTextarea: document.getElementById('mistralApiKeys'),
rememberMistralKeyCheckbox: document.getElementById('rememberMistralKey'),
translationApiKeysTextarea: document.getElementById('translationApiKeys'),
rememberTranslationKeyCheckbox: document.getElementById('rememberTranslationKey'),
translationModelSelect: document.getElementById('translationModel'),
// ===== 自定义模型设置 =====
customModelSettingsContainer: document.getElementById('customModelSettingsContainer'),
customModelSettings: document.getElementById('customModelSettings'),
customModelSettingsToggle: document.getElementById('customModelSettingsToggle'),
customModelSettingsToggleIcon: document.getElementById('customModelSettingsToggleIcon'),
// ===== 高级设置 =====
advancedSettingsToggle: document.getElementById('advancedSettingsToggle'),
advancedSettings: document.getElementById('advancedSettings'),
advancedSettingsIcon: document.getElementById('advancedSettingsIcon'),
// ===== 处理参数配置 =====
maxTokensPerChunk: document.getElementById('maxTokensPerChunk'),
maxTokensPerChunkValue: document.getElementById('maxTokensPerChunkValue'),
skipProcessedFilesCheckbox: document.getElementById('skipProcessedFiles'),
concurrencyLevelInput: document.getElementById('concurrencyLevel'),
// ===== 文件管理 =====
dropZone: document.getElementById('dropZone'),
pdfFileInput: document.getElementById('pdfFileInput'),
browseFilesBtn: document.getElementById('browseFilesBtn'),
fileListContainer: document.getElementById('fileListContainer'),
fileList: document.getElementById('fileList'),
clearFilesBtn: document.getElementById('clearFilesBtn'),
// ===== 主要操作按钮 =====
targetLanguage: document.getElementById('targetLanguage'),
processBtn: document.getElementById('processBtn'),
downloadAllBtn: document.getElementById('downloadAllBtn'),
// ===== 批量模式 =====
batchModeToggleWrapper: document.getElementById('batchModeToggleWrapper'),
batchModeToggle: document.getElementById('batchModeToggle'),
batchModeConfigPanel: document.getElementById('batchModeConfig'),
// ===== 结果显示 =====
resultsSection: document.getElementById('resultsSection'),
resultsSummary: document.getElementById('resultsSummary'),
// ===== 进度显示 =====
progressSection: document.getElementById('progressSection'),
batchProgressText: document.getElementById('batchProgressText'),
concurrentProgressText: document.getElementById('concurrentProgressText'),
progressStep: document.getElementById('progressStep'),
progressPercentage: document.getElementById('progressPercentage'),
progressBar: document.getElementById('progressBar'),
progressLog: document.getElementById('progressLog'),
// ===== 通知系统 =====
notificationContainer: document.getElementById('notification-container'),
// ===== 自定义源站点 =====
customSourceSiteContainer: document.getElementById('customSourceSiteContainer'),
customSourceSiteSelect: document.getElementById('customSourceSiteSelect'),
customSourceSiteToggleIcon: document.getElementById('customSourceSiteToggleIcon'),
detectModelsBtn: document.getElementById('detectModelsBtn'),
// ===== 模型 Key 管理器 =====
modelKeyManagerBtn: document.getElementById('modelKeyManagerBtn'),
modelKeyManagerModal: document.getElementById('modelKeyManagerModal'),
closeModelKeyManager: document.getElementById('closeModelKeyManager'),
modelListColumn: document.getElementById('modelListColumn'),
modelConfigColumn: document.getElementById('modelConfigColumn'),
keyManagerColumn: document.getElementById('keyManagerColumn'),
};
/**
* 获取 DOM 元素
* @param {string} key - 元素键名
* @returns {HTMLElement|null} DOM 元素
*/
function getElement(key) {
return DOMElements[key] || null;
}
/**
* 批量获取 DOM 元素
* @param {string[]} keys - 元素键名数组
* @returns {Object} 包含请求元素的对象
*/
function getElements(keys) {
const result = {};
keys.forEach(key => {
result[key] = DOMElements[key] || null;
});
return result;
}
/**
* 检查元素是否存在
* @param {string} key - 元素键名
* @returns {boolean} 元素是否存在
*/
function hasElement(key) {
return DOMElements[key] !== null && DOMElements[key] !== undefined;
}
/**
* 获取所有 DOM 元素引用
* @returns {Object} 所有 DOM 元素的引用对象
*/
function getAllElements() {
return { ...DOMElements };
}
// 导出到全局
window.UIElements = {
...DOMElements,
getElement,
getElements,
hasElement,
getAllElements
};
// 为了向后兼容,也将各个元素单独导出到 window
// 这样原有代码中直接使用 mistralApiKeysTextarea 等变量的地方不需要修改
Object.keys(DOMElements).forEach(key => {
if (window[key] === undefined) {
window[key] = DOMElements[key];
}
});
})(window);