Skip to content

Gegevensbeheer in Balansmaker

Dit blok is een kleine data-utility laag bovenop dezelfde state die het formulier gebruikt.

Functionaliteiten:

  • JSON exporteren
  • JSON importeren
  • PDF / print genereren
  • localStorage opslag

1. HTML-structuur

Dit staat in:

txt
assets/index.html

Belangrijke IDs:

IDFunctie
exportJsonExport
importJsonImport
printPrint / PDF

Deze IDs worden gebruikt in JavaScript event listeners.


2. CSS styling

De styling van het gegevensbeheer blok komt uit:

txt
assets/styles.css

Belangrijke classes:

ClassFunctie
.panelCard/panel layout
.actionsKnoppenrij
.btnAlgemene knopstijl
.btn--ghost--2Secondary button variant

Voor print/PDF wordt de editor verborgen met:

css
@media print;

zodat alleen de preview of rapportage zichtbaar blijft.


3. Werking in JavaScript

Alle functionaliteit zit in:

txt
assets/app.js

localStorage opslag

Laden

js
function loadState() {
  return localStorage.getItem("balansmaker");
}

Opslaan

js
function saveState(state) {
  localStorage.setItem("balansmaker", JSON.stringify(state));
}

4. JSON export

De export werkt via:

  1. JSON.stringify()
  2. Blob
  3. URL.createObjectURL()
  4. tijdelijke <a download> trigger

Voorbeeld:

js
function exportJson(state, filename) {
  const payload = JSON.stringify(state, null, 2);

  const blob = new Blob([payload], {
    type: "application/json",
  });

  const url = URL.createObjectURL(blob);

  const a = document.createElement("a");

  a.href = url;
  a.download = filename;
  a.click();

  URL.revokeObjectURL(url);
}

5. JSON import

Import gebeurt via:

js
FileReader.readAsText();

Daarna:

js
JSON.parse();

en merge met default state.

Voorbeeld:

js
const sanitized = JSON.parse(text);

Object.assign(state, structuredClone(defaultState), sanitized);

6. Print / PDF

Printen gebruikt:

js
window.print();

7. Autosave

In de originele versie van Balansmaker wordt niet automatisch opgeslagen.

Opslaan gebeurt pas wanneer de gebruiker op:

txt
Opslaan

klikt.


Debounced autosave variant

Onderstaande variant is herbruikbaar in andere projecten.

gegevensbeheer.js

js
const STORAGE_KEY = "balansmaker";

function loadState(fallbackState) {
  const stored = localStorage.getItem(STORAGE_KEY);

  if (!stored) {
    return structuredClone(fallbackState);
  }

  try {
    return {
      ...structuredClone(fallbackState),
      ...JSON.parse(stored),
    };
  } catch {
    return structuredClone(fallbackState);
  }
}

function saveState(state, { silent = false } = {}) {
  localStorage.setItem(STORAGE_KEY, JSON.stringify(state));

  if (!silent) {
    showToast("Opgeslagen ✨");
  }
}

function createAutosaver({ delayMs = 800 } = {}) {
  let timeoutId = null;

  return (saveFn) => {
    window.clearTimeout(timeoutId);

    timeoutId = window.setTimeout(saveFn, delayMs);
  };
}

Gebruik

js
const state = loadState(defaultState);

const scheduleAutosave = createAutosaver({
  delayMs: 800,
});

// Aanroepen bij state wijzigingen:
scheduleAutosave(() => {
  saveState(state, {
    silent: true,
  });
});

Belangrijke voordelen van debounce

Debounce voorkomt:

  • overmatig schrijven naar localStorage
  • performance issues
  • onnodige browser writes

Gebruik meestal:

txt
300ms – 1000ms

afhankelijk van de applicatie.