Convierte recordaLexia de una sola familia a multi-familia, con cuentas propias y persistencia de preferencias. Backend: - Tenant Family (email único + contraseña BCrypt + PIN + prefs de cuenta); family_id en child/activity/material_item/reward; aislamiento por familia (acceso cruzado responde 404). - Auth propia (sin Keycloak): registro/login email+contraseña, sesiones de familia persistidas en BD (sobreviven a reinicios), panel de padres tras PIN. - Liquibase 002-multitenant; seeder crea una familia demo. - Tests de aislamiento entre familias, registro/login y gate del panel. Frontend: - Login, registro y pantalla de cuenta; guards (sesion + PIN) e interceptor de sesion global; perfiles scopeados a la familia. Preferencias: - OpenDyslexic persistida por nino (child.dyslexiaFont) y default de cuenta. Decisiones en docs/adr/0004.
29 lines
1.0 KiB
HTML
29 lines
1.0 KiB
HTML
<main class="profiles">
|
|
<button type="button" class="profiles__account" (click)="openAccount()">
|
|
👨👩👧 {{ auth.family()?.name || 'Mi cuenta' }}
|
|
</button>
|
|
|
|
<h1 class="profiles__title">{{ i18n.t('whoEntersToday') }}</h1>
|
|
|
|
@if (loading()) {
|
|
<p class="profiles__msg">Cargando…</p>
|
|
} @else if (error()) {
|
|
<p class="profiles__msg">No se pudo conectar con el servidor. ¿Está arrancado el backend?</p>
|
|
} @else {
|
|
<div class="profiles__grid">
|
|
@for (child of children(); track child.id) {
|
|
<button type="button" class="kid" [style.--c]="child.accentColor" (click)="enter(child)">
|
|
<span class="kid__mascot">{{ child.mascot }}</span>
|
|
<span class="kid__name">{{ child.name }}</span>
|
|
<span class="kid__coins">🪙 {{ child.coins }}</span>
|
|
<span class="kid__age">{{ child.age }} años</span>
|
|
</button>
|
|
}
|
|
</div>
|
|
}
|
|
|
|
<button type="button" class="profiles__parents" (click)="openParents()">
|
|
⚙️ {{ i18n.t('parents') }}
|
|
</button>
|
|
</main>
|