Search K
Appearance
Appearance
Dit blok is een kleine data-utility laag bovenop dezelfde state die het formulier gebruikt.
Functionaliteiten:
Dit staat in:
assets/index.htmlBelangrijke IDs:
| ID | Functie |
|---|---|
exportJson | Export |
importJson | Import |
print | Print / PDF |
Deze IDs worden gebruikt in JavaScript event listeners.
De styling van het gegevensbeheer blok komt uit:
assets/styles.cssBelangrijke classes:
| Class | Functie |
|---|---|
.panel | Card/panel layout |
.actions | Knoppenrij |
.btn | Algemene knopstijl |
.btn--ghost--2 | Secondary button variant |
Voor print/PDF wordt de editor verborgen met:
@media print;zodat alleen de preview of rapportage zichtbaar blijft.
Alle functionaliteit zit in:
assets/app.jsfunction loadState() {
return localStorage.getItem("balansmaker");
}function saveState(state) {
localStorage.setItem("balansmaker", JSON.stringify(state));
}De export werkt via:
JSON.stringify()BlobURL.createObjectURL()<a download> triggerVoorbeeld:
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);
}Import gebeurt via:
FileReader.readAsText();Daarna:
JSON.parse();en merge met default state.
Voorbeeld:
const sanitized = JSON.parse(text);
Object.assign(state, structuredClone(defaultState), sanitized);Printen gebruikt:
window.print();In de originele versie van Balansmaker wordt niet automatisch opgeslagen.
Opslaan gebeurt pas wanneer de gebruiker op:
Opslaanklikt.
Onderstaande variant is herbruikbaar in andere projecten.
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);
};
}const state = loadState(defaultState);
const scheduleAutosave = createAutosaver({
delayMs: 800,
});
// Aanroepen bij state wijzigingen:
scheduleAutosave(() => {
saveState(state, {
silent: true,
});
});Debounce voorkomt:
Gebruik meestal:
300ms – 1000msafhankelijk van de applicatie.