{# Panel de cuenta self-service. Contrato con `make_account_router`: user → objeto con .email, .name (opcional), .is_admin (opcional) saved → "profile" | "password" | "" (query param tras un POST OK) error → "password-mismatch" | "wrong-password" | "password-failed" | "profile-failed" | "" Los endpoints GDPR (`/me/data/*`) los aporta `make_me_router`; aquí solo se pintan las acciones. Fragmento sin layout: el host lo envuelve (mismo contrato que `core/admin/users_panel.html`) y carga `htmx-events.js` (dgConfirm) y `reveal.js` (mostrar contraseña), que `sidebar_shell` ya trae. Estilos propios en el bloque `.dg-account` de `_tailwind.source.css`; pila, campos y avisos son componentes del paquete. #} {% from "core/components/page_header.html" import page_header %} {% from "core/components/csrf.html" import csrf_input %} {% from "core/components/icon.html" import icon, icon_tile %} {% from "core/components/initials.html" import initials %} {% set saved = saved if saved is defined else "" %} {% set error = error if error is defined else "" %} {% set _email = user.email or "" %} {% set _name = user.name if (user.name is defined and user.name) else "" %} {% set _is_admin = user.is_admin if user.is_admin is defined else false %} {# Solo códigos conocidos: nunca se pinta texto que llegue por la URL. El aviso va dentro de la tarjeta del formulario que se envió (`card`), junto a lo que se acaba de cambiar. #} {% if saved == "profile" %} {% set _flash = {"card": "profile", "tone": "success", "icon": "circle-check", "text": "Perfil actualizado."} %} {% elif saved == "password" %} {% set _flash = {"card": "password", "tone": "success", "icon": "circle-check", "text": "Contraseña actualizada."} %} {% elif error == "password-mismatch" %} {% set _flash = {"card": "password", "tone": "danger", "icon": "circle-alert", "text": "Las contraseñas nuevas no coinciden."} %} {% elif error == "wrong-password" %} {% set _flash = {"card": "password", "tone": "danger", "icon": "circle-alert", "text": "La contraseña actual no es correcta."} %} {% elif error %} {% set _flash = {"card": "profile" if error.startswith("profile") else "password", "tone": "danger", "icon": "circle-alert", "text": "No se pudo guardar el cambio. Inténtalo de nuevo en unos minutos."} %} {% else %} {% set _flash = none %} {% endif %} {% macro _flash_box(flash, card) -%} {%- if flash and flash.card == card %}
{{ icon(flash.icon) }}

{{ flash.text }}

{%- endif %} {%- endmacro %}
{{ page_header(title="Mi cuenta", subtitle="Tu perfil, tu contraseña y el control de tus datos personales.", icon="user", meta=[{"icon": "shield-check" if _is_admin else "user", "label": "Administrador" if _is_admin else "Usuario"}]) }}