const DB_NAME = 'SpreadsheetDB' const STORE_NAME = 'sheets' const LOG_STORE_NAME = 'op_logs' // Table for operation records const DB_VERSION = 2 // Increment version to trigger upgrade const openDB = () => { return new Promise((resolve, reject) => { const request = indexedDB.open(DB_NAME, DB_VERSION) request.onupgradeneeded = (event) => { const db = event.target.result // Main sheet store if (!db.objectStoreNames.contains(STORE_NAME)) { db.createObjectStore(STORE_NAME) } // Operation log store if (!db.objectStoreNames.contains(LOG_STORE_NAME)) { const store = db.createObjectStore(LOG_STORE_NAME, { keyPath: 'id', autoIncrement: true }) store.createIndex('timestamp', 'timestamp') } } request.onsuccess = () => resolve(request.result) request.onerror = () => reject(request.error) }) } export const db = { async get(key) { const db = await openDB() return new Promise((resolve, reject) => { const transaction = db.transaction(STORE_NAME, 'readonly') const store = transaction.objectStore(STORE_NAME) const request = store.get(key) request.onsuccess = () => resolve(request.result) request.onerror = () => reject(request.error) }) }, async set(key, value) { const db = await openDB() return new Promise((resolve, reject) => { const transaction = db.transaction(STORE_NAME, 'readwrite') const store = transaction.objectStore(STORE_NAME) const rawValue = JSON.parse(JSON.stringify(value)) const request = store.put(rawValue, key) request.onsuccess = () => resolve() request.onerror = () => reject(request.error) }) }, // New: Add operation record async addLog(type, details) { const db = await openDB() return new Promise((resolve, reject) => { const transaction = db.transaction(LOG_STORE_NAME, 'readwrite') const store = transaction.objectStore(LOG_STORE_NAME) const record = { type, details: JSON.parse(JSON.stringify(details)), // Ensure plain object timestamp: Date.now() } const request = store.add(record) request.onsuccess = () => resolve(request.result) request.onerror = () => reject(request.error) }) }, // New: Get recent logs (for restoring history if needed) async getLogs(limit = 50) { const db = await openDB() return new Promise((resolve, reject) => { const transaction = db.transaction(LOG_STORE_NAME, 'readonly') const store = transaction.objectStore(LOG_STORE_NAME) const index = store.index('timestamp') const request = index.openCursor(null, 'prev') // Newest first const results = [] request.onsuccess = (event) => { const cursor = event.target.result if (cursor && results.length < limit) { results.push(cursor.value) cursor.continue() } else { resolve(results.reverse()) } } request.onerror = () => reject(request.error) }) } }