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>
76 lines
2.0 KiB
Dart
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,
|
|
};
|
|
}
|