From 12f66a21156de77592e618008110cd2367114434 Mon Sep 17 00:00:00 2001 From: Hyko Date: Wed, 22 Apr 2026 13:27:04 -0400 Subject: [PATCH] feat(admin): add core users widget and reorganize dashboard widget registration --- .../admin/components/pages/DashboardPage.js | 3 +- .../admin/dashboard/serverRegistry.js | 3 +- .../admin/dashboard/widgets/index.client.js | 10 ++++++ .../admin/dashboard/widgets/index.server.js | 8 +++++ .../admin/dashboard/widgets/users.server.js | 30 ++++++++++++++++ .../admin/dashboard/widgets/users.widget.js | 36 +++++++++++++++++++ src/features/auth/dashboard.server.js | 22 ------------ src/features/auth/dashboard.widget.js | 33 ----------------- src/features/dashboard.client.js | 4 +-- src/features/dashboard.server.js | 4 +-- 10 files changed, 90 insertions(+), 63 deletions(-) create mode 100644 src/features/admin/dashboard/widgets/index.client.js create mode 100644 src/features/admin/dashboard/widgets/index.server.js create mode 100644 src/features/admin/dashboard/widgets/users.server.js create mode 100644 src/features/admin/dashboard/widgets/users.widget.js delete mode 100644 src/features/auth/dashboard.server.js delete mode 100644 src/features/auth/dashboard.widget.js diff --git a/src/features/admin/components/pages/DashboardPage.js b/src/features/admin/components/pages/DashboardPage.js index 7e93ead..9e5a839 100644 --- a/src/features/admin/components/pages/DashboardPage.js +++ b/src/features/admin/components/pages/DashboardPage.js @@ -1,6 +1,7 @@ 'use client'; import { getClientWidgets } from '../../dashboard/clientRegistry.js'; +import '../../dashboard/widgets/index.client.js'; import '../../../dashboard.client.js'; // Évalué après tous les imports : les auto-registrations sont complètes @@ -20,7 +21,7 @@ export default function DashboardPage({ stats }) { -
+
{sortedWidgets.map(({ id, Component }) => ( = NOW() - INTERVAL '30 days' THEN 1 END) AS new_this_month + FROM zen_auth_users + `); + return { + totalUsers: parseInt(result.rows[0].total) || 0, + newThisMonth: parseInt(result.rows[0].new_this_month) || 0, + }; + } catch (error) { + fail(`Users dashboard data error: ${error.message}`); + return { totalUsers: 0, newThisMonth: 0 }; + } +} + +registerServerWidget('users', getUsersDashboardData); diff --git a/src/features/admin/dashboard/widgets/users.widget.js b/src/features/admin/dashboard/widgets/users.widget.js new file mode 100644 index 0000000..c43a45e --- /dev/null +++ b/src/features/admin/dashboard/widgets/users.widget.js @@ -0,0 +1,36 @@ +'use client'; + +/** + * Widget core — Composant client : nombre d'utilisateurs + * + * Auto-enregistré via admin/dashboard/widgets/index.client.js. + * Pas besoin de modifier features/dashboard.client.js pour ce widget. + * + * Props du composant : + * data — { totalUsers: number, newThisMonth: number } retourné par getUsersDashboardData(), ou null + * loading — true tant que les données serveur ne sont pas disponibles + */ + +import { registerClientWidget } from '../clientRegistry.js'; +import { StatCard } from '@zen/core/shared/components'; +import { UserMultiple02Icon } from '@zen/core/shared/icons'; + +function UsersDashboardWidget({ data, loading }) { + const newThisMonth = data?.newThisMonth ?? 0; + return ( + 0 ? `+${newThisMonth} ce mois` : undefined} + changeType="increase" + icon={UserMultiple02Icon} + color="text-purple-400" + bgColor="bg-purple-500/10" + loading={loading} + /> + ); +} + +registerClientWidget('users', UsersDashboardWidget, 10); + +export default UsersDashboardWidget; diff --git a/src/features/auth/dashboard.server.js b/src/features/auth/dashboard.server.js deleted file mode 100644 index d033157..0000000 --- a/src/features/auth/dashboard.server.js +++ /dev/null @@ -1,22 +0,0 @@ -/** - * Auth Feature — Contribution serveur au tableau de bord - * - * Ce module s'auto-enregistre auprès du registre admin en side effect. - * Dépendance correcte : auth → admin (feature → core). - */ - -import { registerServerWidget } from '../admin/dashboard/registry.js'; -import { query } from '@zen/core/database'; -import { fail } from '@zen/core/shared/logger'; - -async function getDashboardData() { - try { - const result = await query(`SELECT COUNT(*) as count FROM zen_auth_users`); - return { totalUsers: parseInt(result.rows[0].count) || 0 }; - } catch (error) { - fail(`Auth dashboard data error: ${error.message}`); - return { totalUsers: 0 }; - } -} - -registerServerWidget('auth', getDashboardData); diff --git a/src/features/auth/dashboard.widget.js b/src/features/auth/dashboard.widget.js deleted file mode 100644 index 8a4043f..0000000 --- a/src/features/auth/dashboard.widget.js +++ /dev/null @@ -1,33 +0,0 @@ -'use client'; - -/** - * Auth Feature — Widget client pour le tableau de bord - * - * Ce module s'auto-enregistre auprès du registre admin en side effect. - * Dépendance correcte : auth → admin (feature → core). - * - * Props du composant : - * data — { totalUsers: number } retourné par getDashboardData(), ou null - * loading — true tant que les données serveur ne sont pas disponibles - */ - -import { registerClientWidget } from '../admin/dashboard/clientRegistry.js'; -import { StatCard } from '@zen/core/shared/components'; -import { UserMultiple02Icon } from '@zen/core/shared/icons'; - -function AuthDashboardWidget({ data, loading }) { - return ( - - ); -} - -registerClientWidget('auth', AuthDashboardWidget, 10); - -export default AuthDashboardWidget; diff --git a/src/features/dashboard.client.js b/src/features/dashboard.client.js index 43b83ed..f4c47c3 100644 --- a/src/features/dashboard.client.js +++ b/src/features/dashboard.client.js @@ -1,7 +1,7 @@ 'use client'; /** - * Câblage client des widgets du tableau de bord + * Câblage client des widgets du tableau de bord — Features externes * * Ce fichier est le SEUL à modifier pour ajouter le widget client * d'une nouvelle feature au tableau de bord. @@ -12,5 +12,3 @@ * Exemple pour une feature 'blog' : * import './blog/dashboard.widget.js'; */ - -import './auth/dashboard.widget.js'; diff --git a/src/features/dashboard.server.js b/src/features/dashboard.server.js index 157c381..b6fca16 100644 --- a/src/features/dashboard.server.js +++ b/src/features/dashboard.server.js @@ -1,5 +1,5 @@ /** - * Câblage serveur des widgets du tableau de bord + * Câblage serveur des widgets du tableau de bord — Features externes * * Ce fichier est le SEUL à modifier pour ajouter la contribution serveur * d'une nouvelle feature au tableau de bord. @@ -10,5 +10,3 @@ * Exemple pour une feature 'blog' : * import './blog/dashboard.server.js'; */ - -import './auth/dashboard.server.js';