Files
boc/landvex-finance-sprint3/UI-REFACTOR-PLAN.md
T
Bernt bae705aa97 ARCHITECTURE: NFC roadmap, edge AI, audit logging
- 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
2026-06-29 16:24:48 +00:00

206 lines
7.4 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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)
```javascript
// 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)
```javascript
// 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** (34 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)*