CMMS fork: Phase 6 polish — schema.html light theme + load-time IndexedDB wipe

- cmms-bridge.js: wipeProjectData() clears the project object stores (devices,
  boards, components, images, overlappedImages, nets, schemas, schemaComponents
  — not the KiCad symbol library) and resets studio.js's shared globals before
  the CMMS attachment ZIP is imported. The ZIP is the single source of truth for
  a CMMS board, so restoreDevice()'s merge path (which only de-dupes on a newer
  meta.lastModified, absent on CMMS-created boards) no longer accretes duplicate
  image/net rows across repeated opens. init() also stamps data-theme=light as
  well as =dark. All gated on PCBRETRACE_CONFIG — standalone untouched.
- schema.html: inline head script mirrors ?theme=light|dark (passed by studio.js
  on the iframe src) onto <html> and, for light, injects cmms-schema-light.css.
  Full no-op with no ?theme=.
- cmms-schema-light.css (new): [data-theme="light"]-gated override of
  schema.html's :root palette for the CMMS light theme. Canvas stays dark.
- studio.js: append ?theme=<active> to the schema.html iframe src.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
Stuart 2026-09-09 22:08:45 +10:00
commit eeb2af1e15
4 changed files with 84 additions and 2 deletions

View file

@ -350,10 +350,45 @@
trace('ensureBoard: created a starter board');
}
// Working-data stores restoreDevice() / processImportData() write into. The
// KiCad symbol-library stores (kicadSymbols, symbolTypes, componentTypes*,
// pinDirections) are reference data and expensive to rebuild — leave them.
const CMMS_PROJECT_STORES = ['devices', 'boards', 'components', 'images',
'overlappedImages', 'nets', 'schemas', 'schemaComponents'];
// The .pcbretrace.zip attachment is the single source of truth for a CMMS
// board — there is no local working copy to preserve between sessions. Clear
// the project stores before importing so restoreDevice() starts from empty
// and can't accrete duplicate image / net rows across repeated opens in the
// same browser (its merge path only de-dupes when timestamps say the import
// is newer, and CMMS-created boards carry no lastModified).
async function wipeProjectData() {
if (!db || !db.db) return;
const stores = CMMS_PROJECT_STORES.filter(s => db.db.objectStoreNames.contains(s));
if (stores.length) {
await new Promise((res, rej) => {
const tx = db.db.transaction(stores, 'readwrite');
stores.forEach(s => tx.objectStore(s).clear());
tx.oncomplete = () => res();
tx.onerror = () => rej(tx.error);
tx.onabort = () => rej(tx.error || new Error('wipe aborted'));
});
}
// studio.js caches these in shared globals — reset so a fresh import (or
// ensureBoard) doesn't reuse a now-deleted device/board.
deviceList = []; bomList = []; bomData = []; bomImages = [];
currentDeviceId = null; currentBomId = null; currentImgId = null;
trace('wipeProjectData: cleared', stores.join(', ') || '(none)');
}
async function init() {
if (CFG.dark) document.documentElement.setAttribute('data-theme', 'dark');
// Set light explicitly too (not just dark) so studio.js can tell a CMMS
// embed from standalone use and pass the theme to the schema.html iframe.
document.documentElement.setAttribute('data-theme', CFG.dark ? 'dark' : 'light');
injectControls();
try { await wipeProjectData(); } catch (e) { trace('wipeProjectData threw:', e && e.message); }
if (CFG.loadUrl) {
status('Loading board…');
try {