bae705aa97
- Add NFC ePassport roadmap (ICAO 9303, eIDAS) - Add TensorFlow.js edge face detection (BlazeFace) - Add structured audit logger (GDPR-compliant) - Risk scoring support Part of KYC Apple Native UX v1.1.0
7.4 KiB
7.4 KiB
LandveX Finance — UI-Refaktoreringsplan
Status: Plan & grundstruktur (Sprint 3)
Mål: Modularisera 172KB / 3081 rader monolitisk HTML till underhållbara ES-moduler
Nuvarande:index.html= 177KB, 3081 rader, allt i ett (CSS + HTML + JS)
1. Nuvarande Arkitektur (Monolit)
index.html (177KB)
├── <style> ~900 rader CSS
├── <body> ~400 rader HTML-struktur
│ ├── Topbar (brand, period, tabs, status)
│ ├── 8 st tab-sektioner:
│ │ ├── Översikt (KPI, P&L, journal, actions)
│ │ ├── Tasks (checklista, onboarding)
│ │ ├── Transaktioner (tabell + mobilkort)
│ │ ├── Fakturor (fakturatabell)
│ │ ├── Skatt & Moms (VAT-grid, momsberäkning)
│ │ ├── Löner (payroll, personer, perioder)
│ │ ├── Period (stängning, checklista)
│ │ └── Prognos (forecast, likviditet)
│ └── Modaler (verifikat, faktura, balans, kvitton)
└── <script> ~1700 rader vanilla JS
├── State & utils
├── API-layer (fetch-wrapper)
├── 8 st tab-controllers
├── Modalfunktioner
├── Kvitto-hantering (drag-drop, upload)
├── Onboarding (ob-*)
└── Mobilnavigation (drawer, FAB)
Identifierade Komponenter/Vyer
| Vy | DOM-id | Rader JS | Komplexitet |
|---|---|---|---|
| Översikt | tab-overview |
~200 | Medel |
| Tasks | tab-tasks |
~80 | Låg |
| Transaktioner | tab-transactions |
~250 | HÖG (paginering, sök, filter) |
| Fakturor | tab-invoices |
~150 | Medel |
| Skatt & Moms | tab-vat |
~180 | Medel |
| Löner | tab-payroll |
~220 | HÖG (två vyer: person+period) |
| Period | tab-period |
~120 | Medel |
| Prognos | tab-forecast |
~100 | Låg |
| Modaler | modal-* |
~300 | HÖG (5 modaler) |
| Kvitto | drop-zone |
~150 | Medel |
| Onboarding | ob-* |
~200 | Medel |
2. Föreslagen Modulär Struktur
2.1 Filstruktur (ES Modules, vanilla JS)
finance/
├── index.html # Shell: <100 rader, laddar moduler
├── css/
│ ├── main.css # Variabler, layout, utilities
│ ├── components.css # Kort, knappar, tabeller, modaler
│ ├── responsive.css # Mobilanpassningar
│ └── onboarding.css # Onboarding-overlay
├── js/
│ ├── main.mjs # Entry point: init, routing, state
│ ├── state.mjs # Global state (S-objektet)
│ ├── api.mjs # Fetch-wrapper, auth headers
│ ├── utils.mjs # fmt, esc, pLabel, pParam, etc.
│ ├── components/
│ │ ├── kpi-row.mjs # 5 KPI-kort
│ │ ├── pl-table.mjs # Resultaträkning
│ │ ├── journal-widget.mjs # Senaste verifikat
│ │ ├── tx-table.mjs # Transaktionstabell + paginering
│ │ ├── tx-cards.mjs # Mobilkort för transaktioner
│ │ ├── invoice-table.mjs
│ │ ├── vat-grid.mjs # Moms-kort
│ │ ├── payroll-table.mjs
│ │ ├── period-close.mjs
│ │ └── forecast-chart.mjs
│ ├── modals/
│ │ ├── entry-modal.mjs # Ny/redigera verifikat
│ │ ├── invoice-modal.mjs # Ny faktura
│ │ ├── balance-modal.mjs # Balansräkning
│ │ ├── detail-modal.mjs # Verifikatdetalj
│ │ └── kassa-modal.mjs # Kassadetalj
│ ├── features/
│ │ ├── receipts.mjs # Kvitto-upload, drag-drop
│ │ ├── onboarding.mjs # Steg-för-steg guide
│ │ ├── mobile-nav.mjs # Drawer, FAB, hamburgare
│ │ └── period-picker.mjs # Månad/kvartal/custom
│ └── tabs/
│ ├── overview.mjs
│ ├── transactions.mjs
│ ├── invoices.mjs
│ ├── vat.mjs
│ ├── payroll.mjs
│ ├── period.mjs
│ ├── tasks.mjs
│ └── forecast.mjs
└── docs/
├── UI-REFACTOR-PLAN.md # Denna fil
└── ARCHITECTURE.md
2.2 Modulgränssnitt (kontrakt)
// js/tabs/overview.mjs
export function init() { /* en gång vid startup */ }
export function activate(period) { /* vid tab-switch */ }
export function deactivate() { /* cleanup */ }
// js/components/kpi-row.mjs
export function render(container, data) { /* rendera till DOM */ }
export function update(kpiId, value) { /* uppdatera en KPI */ }
// js/api.mjs
export async function api(path, method, body) { /* auth + fetch */ }
export async function getJournal(params) { /* typade wrappers */ }
export async function postJournal(entry) { }
2.3 State-hantering (förenklad Redux-pattern)
// js/state.mjs
const S = {
period: '2026-06',
periodMode: 'month',
tab: 'overview',
data: {}, // cache per tab
filters: {},
user: null,
};
const listeners = new Set();
export const state = {
get: () => S,
set: (patch) => { Object.assign(S, patch); listeners.forEach(l => l(S)); },
subscribe: (fn) => { listeners.add(fn); return () => listeners.delete(fn); }
};
3. Migreringsplan (fasad)
| Fas | Uppgift | Tid | Risk |
|---|---|---|---|
| 3.1 | Skapa filstruktur, main.mjs, state.mjs, api.mjs, utils.mjs |
2h | Låg |
| 3.2 | Extrahera CSS → css/*.css |
2h | Låg |
| 3.3 | Bygg tabs/overview.mjs + components/kpi-row.mjs |
3h | Medel |
| 3.4 | Bygg tabs/transactions.mjs + components/tx-table.mjs |
4h | HÖG |
| 3.5 | Bygg övriga tabs (invoices, vat, payroll, period, tasks, forecast) | 6h | Medel |
| 3.6 | Bygg modaler till modals/*.mjs |
4h | Medel |
| 3.7 | Extrahera features (receipts, onboarding, mobile-nav) | 3h | Medel |
| 3.8 | Integrationstest, bugfix, rollback-plan | 4h | Medel |
| 3.9 | Ta bort gammal inline JS/CSS från index.html | 1h | Låg |
Totalt: ~29h (3–4 dagar för 1 person)
4. Tekniska Beslut
| Fråga | Beslut | Motivering |
|---|---|---|
| React/Vue eller vanilla? | Vanilla ES modules | Ingen build-step, snabb laddning, team-kompetens |
| CSS framework? | Egen CSS | Redan design-system, ingen extra beroende |
| State management? | Egen ~50 rader | För litet för Redux/Zustand |
| Byggverktyg? | Inget | <script type="module"> räcker |
| Bakåtkompatibilitet? | Feature-flagg | ?v2=1 aktiverar nya moduler |
5. Risker & Mitigering
| Risk | Sannolikhet | Mitigering |
|---|---|---|
| Bugg i transaktionstabell (komplex paginering) | Medel | Bevara gammal som fallback, A/B-testa |
| Mobile-nav bryts | Låg | Testa på fysisk mobil direkt |
| Onboarding-state förloras | Låg | LocalStorage-nycklar oförändrade |
| API-ändringar | Låg | api.mjs wrapper isolerar ändringar |
6. Definition of Done
index.html< 100 rader- All JS i
.mjs-filer med explicita exports/imports - All CSS i
.css-filer - Ingen global state (förutom
state.mjs) - Mobilnavigation fungerar identiskt
- Onboarding fungerar identiskt
- Kvitto-upload fungerar identiskt
- Alla 8 tabs renderar korrekt
- Alla 5 modaler fungerar
- Ingen regression i API-anrop
Skapad: 2026-06-24
Nästa steg: Påbörja fas 3.1 (filstruktur + core modules)