fix: SQLite boolean binding + React StrictMode race condition

- Fix: SqliteAdapter.createLayer/updateLayer: convert JS booleans to integers (true→1, false→0)
  - Root cause: better-sqlite3 cannot bind JS booleans, causing layer creation to fail
  - Without layers, no elements could be created, making the entire CAD editor non-functional
- Fix: loadProjectDataTyped: remove Superseded throw for React StrictMode double-render safety
  - Root cause: StrictMode double-render created two load requests, first was superseded and
    set savedStatus to 'Fehler beim Laden', overwriting the successful second request
- Fix: App.tsx catch block: ignore cancelled/superseded errors to prevent false error status
- All tests pass: Backend 239/239, Frontend 374/374
- UI Test verified: Login → Dashboard → Project → CAD Editor → Line drawing → 4 elements created
This commit is contained in:
Leopoldadmin
2026-07-04 10:40:23 +02:00
parent 982fa119eb
commit c63e7e49ab
3 changed files with 6 additions and 9 deletions
+2 -2
View File
@@ -209,7 +209,7 @@ export class SqliteAdapter implements DatabaseInterface {
const id = data.id ?? `layer-${Date.now()}`;
this.db.prepare(
'INSERT INTO layers (id, drawing_id, name, visible, locked, color, line_type, transparency, sort_order, parent_id) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)',
).run(id, data.drawing_id!, data.name ?? 'Layer', data.visible ?? 1, data.locked ?? 0,
).run(id, data.drawing_id!, data.name ?? 'Layer', data.visible !== undefined ? (data.visible ? 1 : 0) : 1, data.locked !== undefined ? (data.locked ? 1 : 0) : 0,
data.color ?? '#ffffff', data.line_type ?? 'solid', data.transparency ?? 0,
data.sort_order ?? 0, data.parent_id ?? null);
return this.db.prepare('SELECT * FROM layers WHERE id = ?').get(id) as DBLayer;
@@ -220,7 +220,7 @@ export class SqliteAdapter implements DatabaseInterface {
const vals: any[] = [];
for (const [k, v] of Object.entries(data)) {
if (['name','visible','locked','color','line_type','transparency','sort_order','parent_id'].includes(k)) {
sets.push(`${k} = ?`); vals.push(v);
sets.push(`${k} = ?`); vals.push(k === 'visible' || k === 'locked' ? (v ? 1 : 0) : v);
}
}
if (sets.length > 0) {