// DOM Elements const apiKeyInput = document.getElementById('apiKey'); const scriptUrlInput = document.getElementById('scriptUrl'); const modelInput = document.getElementById('modelInput'); const saveConfigBtn = document.getElementById('saveConfig'); const customInput = document.getElementById('customInput'); const sendCustomBtn = document.getElementById('sendCustom'); const statusBadge = document.getElementById('statusBadge'); const resultsArea = document.getElementById('results'); // Preset Management Elements const newPresetName = document.getElementById('newPresetName'); const newPresetSheet = document.getElementById('newPresetSheet'); const newPresetFields = document.getElementById('newPresetFields'); const addPresetBtn = document.getElementById('addPreset'); const presetList = document.getElementById('presetList'); const presetSelect = document.getElementById('presetSelect'); const runPresetBtn = document.getElementById('runPreset'); // Collapsible logic const toggleConfig = document.getElementById('toggleConfig'); const configContent = document.getElementById('configContent'); const configChevron = document.getElementById('configChevron'); const DEFAULT_PRESETS = [ { id: 'p1', name: '提取笔记本', sheetName: '笔记本', fields: '品牌, CPU, 内存, 存储, 价格, URL' }, { id: 'p2', name: '提取外设', sheetName: '外设', fields: '品牌, 型号, 连接方式, 电池寿命, 价格, URL' } ]; let currentPresets = []; toggleConfig.addEventListener('click', () => { const isHidden = configContent.classList.toggle('hidden'); configChevron.classList.toggle('rotate-180', !isHidden); }); // Load settings and presets on startup chrome.storage.local.get(['geminiApiKey', 'googleScriptUrl', 'geminiModel', 'userPresets'], (data) => { if (data.geminiApiKey) { apiKeyInput.value = data.geminiApiKey; configContent.classList.add('hidden'); configChevron.classList.remove('rotate-180'); } else { configContent.classList.remove('hidden'); configChevron.classList.add('rotate-180'); } if (data.googleScriptUrl) scriptUrlInput.value = data.googleScriptUrl; if (data.geminiModel) modelInput.value = data.geminiModel; currentPresets = data.userPresets || DEFAULT_PRESETS; renderPresets(currentPresets); }); // Save settings saveConfigBtn.addEventListener('click', () => { const apiKey = apiKeyInput.value.trim(); const scriptUrl = scriptUrlInput.value.trim(); const model = modelInput.value.trim(); chrome.storage.local.set({ geminiApiKey: apiKey, googleScriptUrl: scriptUrl, geminiModel: model }, () => { updateStatus('已保存', 'bg-green-500 text-white'); setTimeout(() => updateStatus('待机', 'bg-gray-200 text-gray-600'), 2000); }); }); // Preset Management Logic addPresetBtn.addEventListener('click', async () => { const name = newPresetName.value.trim(); const sheetName = newPresetSheet.value.trim(); const fields = newPresetFields.value.trim(); if (!name || !fields) return alert('请输入名称和字段'); const { userPresets = DEFAULT_PRESETS } = await chrome.storage.local.get('userPresets'); const newPreset = { id: Date.now().toString(), name, sheetName, fields }; currentPresets = [...userPresets, newPreset]; await chrome.storage.local.set({ userPresets: currentPresets }); newPresetName.value = ''; newPresetSheet.value = ''; newPresetFields.value = ''; renderPresets(currentPresets); }); async function deletePreset(id) { const { userPresets = DEFAULT_PRESETS } = await chrome.storage.local.get('userPresets'); currentPresets = userPresets.filter(p => p.id !== id); await chrome.storage.local.set({ userPresets: currentPresets }); renderPresets(currentPresets); } function renderPresets(presets) { // Clear containers presetList.innerHTML = ''; presetSelect.innerHTML = ''; presets.forEach(preset => { // 1. Render in Settings List const item = document.createElement('div'); item.className = 'flex items-center justify-between bg-white p-3 mb-2 rounded-lg border border-gray-200 shadow-sm transition-all hover:border-indigo-200'; item.innerHTML = `