diff --git a/electron/main/ipc.ts b/electron/main/ipc.ts index 3cb79f0..9e721aa 100644 --- a/electron/main/ipc.ts +++ b/electron/main/ipc.ts @@ -58,6 +58,14 @@ function getDb() { max_score INTEGER, rubric TEXT )`).run() + db.prepare(`CREATE TABLE IF NOT EXISTS rubric ( + id INTEGER PRIMARY KEY AUTOINCREMENT, + question_title TEXT NOT NULL DEFAULT '', + max_score REAL NOT NULL DEFAULT 100, + reference_answer TEXT NOT NULL DEFAULT '', + rubric TEXT NOT NULL DEFAULT '', + sort_order INTEGER NOT NULL DEFAULT 0 + )`).run() } return db } @@ -243,12 +251,36 @@ export function setupIpc(win: BrowserWindow): void { return { base64: buffer.toString('base64'), mime, filePath } }) - // --- Rubric data bridge (toolbar ↔ rubric window) --- + // --- Rubric data bridge (toolbar ↔ rubric window), persisted to DB --- ipcMain.handle('rubric:storeData', (_event, data: any) => { + const d = getDb() + d.prepare('DELETE FROM rubric').run() + const insert = d.prepare('INSERT INTO rubric (question_title, max_score, reference_answer, rubric, sort_order) VALUES (?, ?, ?, ?, ?)') + const questions = data?.questions || [] + for (let i = 0; i < questions.length; i++) { + const q = questions[i] + insert.run(q.questionTitle || '', q.maxScore ?? 100, q.referenceAnswer || '', q.rubric || '', i) + } rubricPayload = data }) - ipcMain.handle('rubric:getData', () => rubricPayload) + ipcMain.handle('rubric:getData', () => { + if (rubricPayload) return rubricPayload + const d = getDb() + const rows: any[] = d.prepare('SELECT * FROM rubric ORDER BY sort_order').all() + if (rows.length) { + return { + questions: rows.map(r => ({ + questionTitle: r.question_title, + maxScore: r.max_score, + referenceAnswer: r.reference_answer, + rubric: r.rubric + })), + currentIndex: 0 + } + } + return null + }) // --- Grading data bridge (toolbar → result window) --- ipcMain.handle('grading:storeData', (_event, data: any) => {