95b581e8c5
fix(automation): implement all 6 actions + real cron parser fix(db): pq.Array for TEXT[], add sqlmock tests fix(schema): single source migrations docs: v2 architecture + frontend refactor proposals
2.6 KiB
2.6 KiB
BOC Frontend Refactor Proposal
Problem
12 HTML-filer (dashboard.html, crm.html, sales.html, ...) var och en med ~80 rader identisk sidebar-kod. En ändring = 12 filer att uppdatera. Risk för divergens.
Alternativ
A. Vanilla JS Component System (Rekommenderas)
Ett enda HTML-skelett, JavaScript laddar modul-innehåll dynamiskt.
web/
index.html # Single shell: sidebar + main container
assets/
boc.js # Router + auth + API
components.js # Sidebar, Header, KPI cards, Tables
modules/
dashboard.js # Dashboard-specific rendering
crm.js # CRM module
sales.js # Sales module
...
Fördelar:
- En sidebar, en källa till sanning
- Ingen build step (vanilla JS)
- Fungerar med nuvarande nginx static hosting
- ~2h att implementera
Nackdelar:
- Ingen type safety
- Manuell DOM-hantering
B. HTMX + Go Templates
Go backend servar HTML fragments. HTMX swappar innehåll.
backend/templates/
layout.html # Shell med sidebar
dashboard.html # Fragment
crm/
list.html
detail.html
Fördelar:
- Server-side rendering, SEO-vänligt
- Minimal JS
- Go standard library
Nackdelar:
- Kräver template engine i backend
- Mindre interaktivt utan extra JS
C. Lit/Web Components (Modern vanilla)
Web standard, inget framework. Lit ger reaktivitet.
Fördelar:
- Web standard, inget build step med import maps
- Reaktiva komponenter
- Framtidssäkert
Nackdelar:
- Learning curve
- ~4h att implementera
D. Full SPA (React/Vue/Svelte)
AVVISAS — För tungt för adminplattform. Byggsteg, bundle size, komplexitet.
Rekommendation: Alternativ A (Vanilla JS Router)
Snabbast att implementera, lättast att underhålla, matchar nuvarande arkitektur.
Implementation (estimerad 2-3h):
index.html— shell med sidebar +<main id="app">assets/router.js— hash-based routing (#/crm,#/sales)assets/components.js—renderSidebar(),renderKpiGrid(),renderTable()assets/modules/*.js— en fil per modul, exporterarrender()- Sidebar-markup i ett JSON-objekt, renderas dynamiskt
Exempel:
// router.js
const routes = {
'/': () => import('./modules/dashboard.js'),
'/crm': () => import('./modules/crm.js'),
'/sales': () => import('./modules/sales.js'),
// ...
};
window.addEventListener('hashchange', () => {
const path = location.hash.slice(1) || '/';
routes[path]().then(m => m.render(document.getElementById('app')));
});
Migration path:
- Skapa shell + router
- Konvertera en modul (dashboard) som proof-of-concept
- Konvertera resten en i taget
- Ta bort gamla HTML-filer