etm-powersync-app/lib/models/nymea_user.dart
Patrick Schurig ETM-Schurig d0a475a5d9 feat: refonte UI complète — design system EtmTokens + 4 écrans
Design system
- lib/theme/etm_tokens.dart : source de vérité couleurs + typo (IBM Plex Sans/Mono)
- lib/models/nymea_user.dart : modèle utilisateur nymea avec permissions EtmRole
- app_theme.dart : ThemeData migré vers IBM Plex Sans + couleurs EtmTokens

Navigation & drawer
- DrawerMenuButton : logo vert gradient + ombre
- Bottom nav : EtmTokens.green actif, EtmTokens.muted inactif
- DrawerPanel 320 px, restyled navy + gradient header + badges rôle

Dashboard (01_dashboard.html)
- Hero système : status pill + 3 métriques mono + illustration maison CustomPainter
- EnergyFlowWidget : 4 nœuds animés CustomPainter (flèches directionnelles)
  · gridPower > 0 = soutirage → flèche Grid→Home (amber)
  · gridPower < 0 = injection → flèche Home→Grid (bleu)
- EVChargingCard restyled : badge En charge + puissance mono 38px + 3 modes + SOC bar
- KPI 2×2 : spark bars, trend line, progress bar
- Consommateurs principaux + Décisions d'Héos (chips motifs)
- Prévisions placeholder explicite

Énergie
- KPI 2×2 avec icônes + fond soft + IBM Plex Mono
- Sélecteur période vert pill
- LineChart double axe : kW (gauche) / SOC % (droite, normalisé)
- BarChart bilan énergétique Wh (amber/bleu)
- Section Météo & prévision placeholder

Things
- Grille 2 col à hauteur intrinsèque (pas de childAspectRatio)
- Bandeau statut global (simulation / connecté / hors-ligne)
- _CategoryCard : header icon+label+count, séparateur coloré, liste tous items
- thing_category.dart : couleurs migrées vers EtmTokens

A/C — Climatisation / Chauffage
- Thermostats pièces EN HAUT : actives expandées, éteintes compactes
- Températures actuelle → cible ± avec EtmTokens.mono
- Sélecteur mode 4 boutons (Chauf/Clim/Auto/Vent)
- Chip "Chauffe au solaire en ce moment" (Héos)
- Sources pilotées par Héos EN BAS :
  · PAC SG-Ready : 4 états (Bloqué grisé / Normal / Recommandé / Forcé) + toggle Auto
  · Chauffe-eau : Surplus/Éco/Boost + temp eau 52°→60°C
  · Climatiseur : pré-refroidissement anticipé + info solaire

Packages ajoutés : google_fonts, flutter_staggered_grid_view, flutter_secure_storage
Asset : assets/house.svg (illustration maison CustomPainter)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-29 21:51:51 +02:00

76 lines
2.0 KiB
Dart

import 'package:flutter/material.dart';
import '../theme/etm_tokens.dart';
/// Les permissions natives de nymea:core (scopes appliqués par le cœur).
enum NymeaPermission {
admin,
controlThings,
configureThings,
executeMagic,
configureMagic,
}
/// Rôle d'affichage déduit des permissions.
enum EtmRole { utilisateur, installateur, admin }
extension EtmRoleDisplay on EtmRole {
String get label => switch (this) {
EtmRole.utilisateur => 'UTILISATEUR',
EtmRole.installateur => 'INSTALLATEUR',
EtmRole.admin => 'ADMIN ETM',
};
Color get color => switch (this) {
EtmRole.utilisateur => EtmTokens.blue,
EtmRole.installateur => EtmTokens.orange,
EtmRole.admin => EtmTokens.danger,
};
}
/// Utilisateur nymea authentifié avec son jeu de permissions.
@immutable
class NymeaUser {
const NymeaUser({
required this.name,
required this.username,
this.email,
this.permissions = const {},
});
final String name;
final String username;
final String? email;
final Set<NymeaPermission> permissions;
bool can(NymeaPermission p) => permissions.contains(p);
bool get canConfigure =>
can(NymeaPermission.configureThings) || can(NymeaPermission.configureMagic);
bool get isAdmin => can(NymeaPermission.admin);
EtmRole get role {
if (isAdmin) return EtmRole.admin;
if (canConfigure) return EtmRole.installateur;
return EtmRole.utilisateur;
}
static const Set<NymeaPermission> clientScopes = {
NymeaPermission.controlThings,
NymeaPermission.executeMagic,
};
static const Set<NymeaPermission> installerScopes = {
NymeaPermission.controlThings,
NymeaPermission.executeMagic,
NymeaPermission.configureThings,
NymeaPermission.configureMagic,
};
static const Set<NymeaPermission> adminScopes = {
NymeaPermission.admin,
NymeaPermission.controlThings,
NymeaPermission.executeMagic,
NymeaPermission.configureThings,
NymeaPermission.configureMagic,
};
}