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';