@lastbrain/module-auth 2.0.13 → 2.0.19

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (43) hide show
  1. package/dist/auth.build.config.d.ts.map +1 -1
  2. package/dist/auth.build.config.js +33 -47
  3. package/dist/components/AccountButton.d.ts.map +1 -1
  4. package/dist/components/AccountButton.js +9 -5
  5. package/dist/web/admin/signup-stats.d.ts.map +1 -1
  6. package/dist/web/admin/signup-stats.js +4 -2
  7. package/dist/web/admin/user-detail.d.ts.map +1 -1
  8. package/dist/web/admin/user-detail.js +42 -17
  9. package/dist/web/admin/users-by-signup-source.d.ts.map +1 -1
  10. package/dist/web/admin/users-by-signup-source.js +18 -7
  11. package/dist/web/admin/users.d.ts.map +1 -1
  12. package/dist/web/admin/users.js +11 -6
  13. package/dist/web/auth/dashboard.d.ts.map +1 -1
  14. package/dist/web/auth/dashboard.js +7 -3
  15. package/dist/web/auth/folder.d.ts.map +1 -1
  16. package/dist/web/auth/folder.js +5 -3
  17. package/dist/web/auth/profile.d.ts.map +1 -1
  18. package/dist/web/auth/profile.js +13 -6
  19. package/dist/web/auth/reglage.d.ts.map +1 -1
  20. package/dist/web/auth/reglage.js +11 -6
  21. package/dist/web/public/SignInPage.d.ts.map +1 -1
  22. package/dist/web/public/SignInPage.js +14 -56
  23. package/dist/web/public/SignUpPage.d.ts.map +1 -1
  24. package/dist/web/public/SignUpPage.js +18 -11
  25. package/package.json +4 -3
  26. package/src/auth.build.config.ts +34 -48
  27. package/src/components/AccountButton.tsx +17 -10
  28. package/src/i18n/en.json +263 -0
  29. package/src/i18n/fr.json +261 -0
  30. package/src/web/admin/signup-stats.tsx +10 -3
  31. package/src/web/admin/user-detail.tsx +135 -56
  32. package/src/web/admin/users-by-signup-source.tsx +60 -21
  33. package/src/web/admin/users.tsx +41 -18
  34. package/src/web/auth/dashboard.tsx +25 -9
  35. package/src/web/auth/folder.tsx +11 -3
  36. package/src/web/auth/profile.tsx +63 -29
  37. package/src/web/auth/reglage.tsx +43 -19
  38. package/src/web/public/SignInPage.tsx +32 -70
  39. package/src/web/public/SignUpPage.tsx +48 -26
  40. package/supabase/migrations/20251112000000_user_init.sql +35 -19
  41. package/supabase/migrations/20251112000001_auto_profile_and_admin_view.sql +8 -3
  42. package/supabase/migrations/20251112000002_sync_avatars.sql +7 -1
  43. package/supabase/migrations/20251124000001_add_get_admin_user_details.sql +2 -1
@@ -141,8 +141,8 @@ const authBuildConfig: ModuleBuildConfig = {
141
141
  menu: {
142
142
  public: [
143
143
  {
144
- title: "Notifications",
145
- description: "Vos notifications",
144
+ title: "module-auth.menu.notifications",
145
+ description: "module-auth.menu.notifications_desc",
146
146
  icon: "Bell",
147
147
  path: "#",
148
148
  order: 998,
@@ -151,8 +151,8 @@ const authBuildConfig: ModuleBuildConfig = {
151
151
  componentExport: "NotificationButton",
152
152
  },
153
153
  {
154
- title: "Compte",
155
- description: "Gérer votre compte",
154
+ title: "module-auth.menu.account",
155
+ description: "module-auth.menu.account_desc",
156
156
  icon: "User",
157
157
  path: "#",
158
158
  order: 999,
@@ -161,8 +161,8 @@ const authBuildConfig: ModuleBuildConfig = {
161
161
  componentExport: "AccountButton",
162
162
  },
163
163
  {
164
- title: "Theme",
165
- description: "Changer le thème",
164
+ title: "module-auth.menu.theme",
165
+ description: "module-auth.menu.theme_desc",
166
166
  icon: "Palette",
167
167
  path: "#",
168
168
  order: 9999,
@@ -173,8 +173,8 @@ const authBuildConfig: ModuleBuildConfig = {
173
173
  ],
174
174
  admin: [
175
175
  {
176
- title: "Gestion des utilisateurs",
177
- description: "Gérez les utilisateurs de la plateforme",
176
+ title: "module-auth.menu.users_management",
177
+ description: "module-auth.menu.users_management_desc",
178
178
  icon: "Users2",
179
179
  path: "/admin/auth/users",
180
180
  order: 1,
@@ -182,16 +182,16 @@ const authBuildConfig: ModuleBuildConfig = {
182
182
  shortcutDisplay: "⌘⇧U",
183
183
  },
184
184
  {
185
- title: "Statistiques d'inscriptions",
186
- description: "Suivez les inscriptions par source",
185
+ title: "module-auth.menu.signup_stats",
186
+ description: "module-auth.menu.signup_stats_desc",
187
187
  icon: "UserStar",
188
188
  path: "/admin/auth/signup-stats",
189
189
  order: 2,
190
190
  },
191
191
 
192
192
  {
193
- title: "Notifications",
194
- description: "Vos notifications",
193
+ title: "module-auth.menu.notifications",
194
+ description: "module-auth.menu.notifications_desc",
195
195
  icon: "Bell",
196
196
  path: "#",
197
197
  order: 998,
@@ -200,8 +200,8 @@ const authBuildConfig: ModuleBuildConfig = {
200
200
  componentExport: "NotificationButton",
201
201
  },
202
202
  {
203
- title: "Compte",
204
- description: "Gérer votre compte",
203
+ title: "module-auth.menu.account",
204
+ description: "module-auth.menu.account_desc",
205
205
  icon: "User",
206
206
  path: "#",
207
207
  order: 999,
@@ -210,8 +210,8 @@ const authBuildConfig: ModuleBuildConfig = {
210
210
  componentExport: "AccountButton",
211
211
  },
212
212
  {
213
- title: "Theme",
214
- description: "Changer le thème",
213
+ title: "module-auth.menu.theme",
214
+ description: "module-auth.menu.theme_desc",
215
215
  icon: "Palette",
216
216
  path: "#",
217
217
  order: 9999,
@@ -222,8 +222,8 @@ const authBuildConfig: ModuleBuildConfig = {
222
222
  ],
223
223
  auth: [
224
224
  {
225
- title: "Tableau de bord",
226
- description: "Accédez à votre tableau de bord",
225
+ title: "module-auth.menu.dashboard",
226
+ description: "module-auth.menu.dashboard_desc",
227
227
  icon: "LayoutDashboard",
228
228
  path: "/auth/dashboard",
229
229
  order: 1,
@@ -231,17 +231,17 @@ const authBuildConfig: ModuleBuildConfig = {
231
231
  shortcutDisplay: "⌘⇧D",
232
232
  },
233
233
  {
234
- title: "Dossier",
235
- description: "Accédez à votre dossier personnel",
234
+ title: "module-auth.menu.folder",
235
+ description: "module-auth.menu.folder_desc",
236
236
  icon: "FolderOpen",
237
237
  path: "/auth/folder",
238
- order: 2,
238
+ order: 99,
239
239
  shortcut: "cmd+shift+f",
240
240
  shortcutDisplay: "⌘⇧F",
241
241
  },
242
242
  {
243
- title: "Notifications",
244
- description: "Vos notifications",
243
+ title: "module-auth.menu.notifications",
244
+ description: "module-auth.menu.notifications_desc",
245
245
  icon: "Bell",
246
246
  path: "#",
247
247
  order: 998,
@@ -250,8 +250,8 @@ const authBuildConfig: ModuleBuildConfig = {
250
250
  componentExport: "NotificationButton",
251
251
  },
252
252
  {
253
- title: "Compte",
254
- description: "Gérer votre compte",
253
+ title: "module-auth.menu.account",
254
+ description: "module-auth.menu.account_desc",
255
255
  icon: "User",
256
256
  path: "#",
257
257
  order: 999,
@@ -260,8 +260,8 @@ const authBuildConfig: ModuleBuildConfig = {
260
260
  componentExport: "AccountButton",
261
261
  },
262
262
  {
263
- title: "Theme",
264
- description: "Changer le thème",
263
+ title: "module-auth.menu.theme",
264
+ description: "module-auth.menu.theme_desc",
265
265
  icon: "Palette",
266
266
  path: "#",
267
267
  order: 9999,
@@ -272,8 +272,8 @@ const authBuildConfig: ModuleBuildConfig = {
272
272
  ],
273
273
  account: [
274
274
  {
275
- title: "Mon profil",
276
- description: "Gérez vos informations personnelles",
275
+ title: "module-auth.menu.profile",
276
+ description: "module-auth.menu.profile_desc",
277
277
  icon: "User2",
278
278
  path: "/auth/profile",
279
279
  order: 1,
@@ -281,8 +281,8 @@ const authBuildConfig: ModuleBuildConfig = {
281
281
  shortcutDisplay: "⌘⇧P",
282
282
  },
283
283
  {
284
- title: "Paramètres",
285
- description: "Configurez votre compte",
284
+ title: "module-auth.menu.settings",
285
+ description: "module-auth.menu.settings_desc",
286
286
  icon: "Settings",
287
287
  path: "/auth/reglage",
288
288
  order: 2,
@@ -290,8 +290,8 @@ const authBuildConfig: ModuleBuildConfig = {
290
290
  shortcutDisplay: "⌘⇧S",
291
291
  },
292
292
  {
293
- title: "Déconnexion",
294
- description: "Se déconnecter",
293
+ title: "module-auth.menu.signout",
294
+ description: "module-auth.menu.signout",
295
295
  icon: "LogOut",
296
296
  path: "/signout",
297
297
  order: 99,
@@ -308,22 +308,8 @@ const authBuildConfig: ModuleBuildConfig = {
308
308
  filter: "owner_id=eq.${USER_ID}",
309
309
  broadcast: "user_notifications_updated",
310
310
  },
311
- {
312
- schema: "public",
313
- table: "user_profil",
314
- event: "*",
315
- filter: "owner_id=eq.${USER_ID}",
316
- broadcast: "user_profil_updated",
317
- },
318
- {
319
- schema: "public",
320
- table: "user_addresses",
321
- event: "*",
322
- filter: "owner_id=eq.${USER_ID}",
323
- broadcast: "user_address_updated",
324
- },
325
311
  ],
326
- },
312
+ },
327
313
  storage: {
328
314
  buckets: [
329
315
  {
@@ -1,6 +1,6 @@
1
1
  "use client";
2
2
 
3
- import { Button, Link } from "@lastbrain/ui";
3
+ import { AppLink, Button } from "@lastbrain/ui";
4
4
  import { Avatar } from "@lastbrain/ui";
5
5
  import {
6
6
  Dropdown,
@@ -10,6 +10,8 @@ import {
10
10
  } from "@lastbrain/ui";
11
11
  import * as LucideIcons from "lucide-react";
12
12
  import type { User } from "@supabase/supabase-js";
13
+ import { useModuleTranslation, langHref } from "@lastbrain/app";
14
+ import { useLanguage } from "@lastbrain/app";
13
15
 
14
16
  interface AccountButtonProps {
15
17
  item: {
@@ -38,12 +40,15 @@ export const AccountButton = ({
38
40
  accountMenu = [],
39
41
  onLogout,
40
42
  }: AccountButtonProps) => {
43
+ const { lang } = useLanguage();
44
+ const t = useModuleTranslation("auth");
45
+
41
46
  if (!user)
42
47
  return (
43
48
  <>
44
49
  <div className="block md:hidden">
45
50
  <Button
46
- as={Link}
51
+ as={AppLink}
47
52
  href="/signin"
48
53
  radius="full"
49
54
  isIconOnly
@@ -53,7 +58,7 @@ export const AccountButton = ({
53
58
  <LucideIcons.LogIn size={16} />
54
59
  </Button>
55
60
  <Button
56
- as={Link}
61
+ as={AppLink}
57
62
  href="/signup"
58
63
  radius="full"
59
64
  isIconOnly
@@ -66,23 +71,23 @@ export const AccountButton = ({
66
71
  </div>
67
72
  <div className="hidden md:block">
68
73
  <Button
69
- as={Link}
74
+ as={AppLink}
70
75
  href="/signin"
71
76
  startContent={<LucideIcons.LogIn size={16} />}
72
77
  variant="light"
73
78
  color="primary"
74
79
  >
75
- Se connecter
80
+ {t("signin")}
76
81
  </Button>
77
82
  <Button
78
- as={Link}
83
+ as={AppLink}
79
84
  href="/signup"
80
85
  variant="flat"
81
86
  className="ml-2"
82
87
  color="secondary"
83
88
  startContent={<LucideIcons.UserPlus2 size={16} />}
84
89
  >
85
- S'inscrire
90
+ {t("signup")}
86
91
  </Button>
87
92
  </div>
88
93
  </>
@@ -117,7 +122,9 @@ export const AccountButton = ({
117
122
  items={[
118
123
  {
119
124
  key: "hello",
120
- label: `Bonjour ${user?.user_metadata?.full_name || user.email}`,
125
+ label: `${t("hello")} ${
126
+ user?.user_metadata?.full_name || user.email
127
+ }`,
121
128
  isReadOnly: true,
122
129
  },
123
130
  ...accountMenu.map((item) => ({
@@ -130,7 +137,7 @@ export const AccountButton = ({
130
137
  href:
131
138
  item.path.includes("signout") || item.path.includes("logout")
132
139
  ? undefined
133
- : item.path,
140
+ : langHref(item.path, lang),
134
141
  })),
135
142
  ]}
136
143
  >
@@ -151,7 +158,7 @@ export const AccountButton = ({
151
158
  href={item.href}
152
159
  onPress={item.isLogout ? () => onLogout?.() : undefined}
153
160
  color={item.isLogout ? "danger" : "default"}
154
- description={item.description}
161
+ description={!item.isLogout && item.description}
155
162
  startContent={Icon && <Icon size={16} />}
156
163
  isDisabled={item.isReadOnly}
157
164
  isReadOnly={item.isReadOnly}
@@ -0,0 +1,263 @@
1
+ {
2
+ "welcome": "Welcome",
3
+ "signin": "Sign in",
4
+ "signup": "Sign up",
5
+ "signout": "Sign out",
6
+ "email": "Email",
7
+ "password": "Password",
8
+ "submit": "Submit",
9
+ "cancel": "Cancel",
10
+ "save": "Save",
11
+ "delete": "Delete",
12
+ "edit": "Edit",
13
+ "back": "Back",
14
+ "loading": "Loading...",
15
+ "error": "Error",
16
+ "success": "Success",
17
+ "hello": "Hello",
18
+ "menu.notifications": "Notifications",
19
+ "menu.notifications_desc": "Your notifications",
20
+ "menu.account": "Account",
21
+ "menu.account_desc": "Manage your account",
22
+ "menu.theme": "Theme",
23
+ "menu.theme_desc": "Change the theme",
24
+ "menu.dashboard": "Dashboard",
25
+ "menu.dashboard_desc": "Access your dashboard",
26
+ "menu.folder": "Folder",
27
+ "menu.folder_desc": "Access your personal folder",
28
+ "menu.users_management": "User Management",
29
+ "menu.users_management_desc": "Manage platform users",
30
+ "menu.signup_stats": "Signup Statistics",
31
+ "menu.signup_stats_desc": "Track signups by source",
32
+ "menu.signout": "Sign out",
33
+ "menu.settings": "Settings",
34
+ "menu.settings_desc": "Configure your account",
35
+ "menu.profile": "My Profile",
36
+ "menu.profile_desc": "Manage your personal information",
37
+ "menu.admin-panel": "Admin Panel",
38
+ "menu.administration": "Administration",
39
+ "menu.my-space": "My Space",
40
+ "menu.menu": "Menu",
41
+ "menu.open": "Open",
42
+ "menu.public": "Public Pages",
43
+ "menu.close": "Close",
44
+ "signin.title": "Welcome back",
45
+ "signin.subtitle": "Sign in to access your space",
46
+ "signin.email_placeholder": "your@email.com",
47
+ "signin.password_placeholder": "Password",
48
+ "signin.submit": "Sign in",
49
+ "signin.accept_terms": "By signing in, you agree to our",
50
+ "signin.term": "terms of use",
51
+ "signup.terms": "terms of use",
52
+
53
+ "signup.legal_prefix": "By signing up, you agree to our",
54
+ "signup.legal_and": "and our",
55
+ "signup.privacy": "privacy policy",
56
+ "signin.forgot_password": "Forgot password?",
57
+ "signin.no_account": "Don't have an account?",
58
+ "signin.sign_up": "Sign up",
59
+ "signin.error_title": "Sign in error",
60
+ "signin.success_title": "Successfully signed in!",
61
+ "signin.success_welcome": "Welcome",
62
+ "signin.chip_label": "Member area",
63
+ "signup.title": "Get started for free",
64
+ "signup.subtitle": "Create your account in seconds",
65
+ "signup.chip_label": "Join us",
66
+ "signup.full_name": "Full name",
67
+ "signup.password_hint": "Minimum 6 characters",
68
+ "signup.full_name_placeholder": "John Doe",
69
+ "signup.email_placeholder": "your@email.com",
70
+ "signup.password": "Password",
71
+ "signup.confirm_password": "Confirm password",
72
+ "signup.submit": "Sign up",
73
+ "signup.have_account": "Already have an account?",
74
+ "signup.sign_in": "Sign in",
75
+ "signup.password_mismatch": "Passwords do not match.",
76
+ "signup.password_too_short": "Password must be at least 6 characters long.",
77
+ "signup.success_confirmation": "Account created successfully! Please check your email to confirm your account.",
78
+ "signup.success_login": "Account created. You can now sign in.",
79
+ "signup.error_title": "Error",
80
+ "singup.or": "OR",
81
+ "signup.error_unexpected": "An unexpected error occurred.",
82
+ "dashboard.title": "Dashboard",
83
+ "dashboard.loading": "Loading dashboard...",
84
+ "dashboard.error_loading": "Error",
85
+ "dashboard.profile_summary": "Profile Summary",
86
+ "dashboard.account_status": "Account Status",
87
+ "dashboard.status": "Status",
88
+ "dashboard.active": "Active",
89
+ "dashboard.profile": "Profile",
90
+ "dashboard.completed": "Completed",
91
+ "dashboard.member_since": "Member since",
92
+ "profile.title": "My Profile",
93
+ "profile.loading": "Loading profile...",
94
+ "profile.error_loading": "Error loading profile",
95
+ "profile.first_name": "First name",
96
+ "profile.last_name": "Last name",
97
+ "profile.phone": "Phone",
98
+ "profile.company": "Company",
99
+ "profile.website": "Website",
100
+ "profile.location": "Location",
101
+ "profile.bio": "Bio",
102
+ "profile.bio_placeholder": "Tell us about yourself",
103
+ "profile.personal_info": "Personal Information",
104
+ "profile.edit": "Edit Profile",
105
+ "profile.first_name_placeholder": "Enter your first name",
106
+ "profile.last_name_placeholder": "Enter your last name",
107
+ "profile.phone_placeholder": "Enter your phone number",
108
+ "profile.professional_info": "Professional Information",
109
+ "profile.company_placeholder": "Enter your company name",
110
+ "profile.website_placeholder": "https://example.com",
111
+ "profile.location_placeholder": "City, Country",
112
+ "profile.preferences": "Preferences",
113
+ "profile.language": "Language",
114
+ "profile.language_placeholder": "en, fr, es...",
115
+ "profile.timezone": "Timezone",
116
+ "profile.timezone_placeholder": "Europe/Paris, America/New_York...",
117
+ "profile.avatar": "Profile picture",
118
+ "profile.save": "Save",
119
+ "profile.saving": "Saving...",
120
+ "profile.success": "Success",
121
+ "profile.updated": "Profile updated successfully",
122
+ "profile.success_title": "Success",
123
+ "profile.success_description": "Profile updated successfully",
124
+ "profile.error": "Error",
125
+ "profile.update_failed": "Failed to update profile",
126
+ "profile.error_title": "Error",
127
+ "profile.error_description": "Error updating profile",
128
+ "profile.cancel_button": "Cancel",
129
+ "profile.save_button": "Save Changes",
130
+ "settings.title": "Settings",
131
+ "settings.loading": "Loading settings...",
132
+ "settings.error": "Error loading settings",
133
+ "settings.notifications": "Notifications",
134
+ "settings.email_notifications": "Email notifications",
135
+ "settings.push_notifications": "Push notifications",
136
+ "settings.marketing_emails": "Marketing emails",
137
+ "settings.preferences": "Preferences",
138
+ "settings.language": "Language",
139
+ "settings.timezone": "Timezone",
140
+ "settings.theme": "Theme",
141
+ "settings.save": "Save",
142
+ "settings.saving": "Saving...",
143
+ "settings.success_title": "Success",
144
+ "settings.success_description": "Settings updated successfully",
145
+ "settings.error_title": "Error",
146
+ "settings.error_description": "Error updating settings",
147
+ "users.title": "User Management",
148
+ "users.search_placeholder": "Search by email or name",
149
+ "users.loading": "Loading users...",
150
+ "users.error": "Error loading users",
151
+ "users.user_id": "User ID",
152
+ "users.name": "Name",
153
+ "users.created_at": "Sign-up date",
154
+ "users.last_sign_in": "Last sign-in",
155
+ "users.role": "Role",
156
+ "users.actions": "Actions",
157
+ "users.view": "View details",
158
+ "users.refresh": "Refresh",
159
+ "signup_stats.title": "Sign-up Statistics",
160
+ "signup_stats.loading": "Loading statistics...",
161
+ "signup_stats.error": "Loading error",
162
+ "signup_stats.total": "Total signups",
163
+ "signup_stats.lastbrain": "LastBrain signups",
164
+ "signup_stats.recipe": "Recipe signups",
165
+ "reset_password.title": "Reset password",
166
+ "reset_password.subtitle": "Enter your email to receive a reset link",
167
+ "reset_password.email_placeholder": "your@email.com",
168
+ "reset_password.submit": "Send link",
169
+ "reset_password.success": "Check your email for the reset link",
170
+ "reset_password.error": "Error sending link",
171
+ "reset_password.back_to_signin": "Back to sign in",
172
+ "folder.loading": "Loading folder...",
173
+ "folder.error": "Error",
174
+ "folder.title": "Folder",
175
+ "users_by_source.title": "Users by signup source",
176
+ "users_by_source.search_placeholder": "Search by email or name...",
177
+ "users_by_source.filter_label": "Filter by source",
178
+ "users_by_source.all_sources": "All sources",
179
+ "users_by_source.source_lastbrain": "LastBrain",
180
+ "users_by_source.source_recipe": "Recipe",
181
+ "users_by_source.showing": "Showing",
182
+ "users_by_source.of": "of",
183
+ "users_by_source.users": "users",
184
+ "users_by_source.list_title": "Users list",
185
+ "users_by_source.loading": "Loading...",
186
+ "users_by_source.table_aria_label": "Users table",
187
+ "users_by_source.column_name": "Name",
188
+ "users_by_source.column_email": "Email",
189
+ "users_by_source.column_source": "Source",
190
+ "users_by_source.column_signup_date": "Signup date",
191
+ "users_by_source.recipe": "Recipe",
192
+ "users_by_source.lastbrain": "LastBrain",
193
+ "users_by_source.no_users": "No users found",
194
+ "users_by_source.loading_error": "Error loading users",
195
+ "users_by_source.loading_error_generic": "Error loading",
196
+ "user_detail.user_not_found_error": "User not found",
197
+ "user_detail.profile_loading_error": "Error loading profile:",
198
+ "user_detail.fill_title_message": "Please fill in the title and message",
199
+ "user_detail.notification_sent_success": "Notification sent successfully",
200
+ "user_detail.notification_send_error": "Error sending notification",
201
+ "user_detail.user_not_found": "User not found",
202
+ "user_detail.last_login": "Last login:",
203
+ "user_detail.not_available": "N/A",
204
+ "user_detail.at": "at",
205
+ "user_detail.administrator": "Administrator",
206
+ "user_detail.user": "User",
207
+ "user_detail.source_recipe": "Recipe",
208
+ "user_detail.source_lastbrain": "LastBrain",
209
+ "user_detail.user_options": "User options",
210
+ "user_detail.tab_profile": "Profile",
211
+ "user_detail.identity_section": "Identity",
212
+ "user_detail.full_name": "Full name",
213
+ "user_detail.not_provided": "Not provided",
214
+ "user_detail.first_name": "First name",
215
+ "user_detail.last_name": "Last name",
216
+ "user_detail.email": "Email",
217
+ "user_detail.phone": "Phone",
218
+ "user_detail.bio": "Bio",
219
+ "user_detail.professional_info": "Professional information",
220
+ "user_detail.company": "Company",
221
+ "user_detail.website": "Website",
222
+ "user_detail.location": "Location",
223
+ "user_detail.preferences": "Preferences",
224
+ "user_detail.language": "Language",
225
+ "user_detail.timezone": "Timezone",
226
+ "user_detail.account_info": "Account information",
227
+ "user_detail.role": "Role",
228
+ "user_detail.standard_user": "Standard user",
229
+ "user_detail.creation_date": "Creation date",
230
+ "user_detail.never": "Never",
231
+ "user_detail.tab_notifications": "Notifications",
232
+ "user_detail.send_notification": "Send notification",
233
+ "user_detail.notification_title": "Notification title",
234
+ "user_detail.notification_title_placeholder": "Ex: Important new message",
235
+ "user_detail.notification_message": "Message",
236
+ "user_detail.notification_message_placeholder": "Notification content...",
237
+ "user_detail.notification_type": "Notification type",
238
+ "user_detail.notification_type_info": "Information",
239
+ "user_detail.notification_type_warning": "Warning",
240
+ "user_detail.notification_type_danger": "Danger",
241
+ "user_detail.notification_type_success": "Success",
242
+ "user_detail.send_button": "Send notification",
243
+ "user_detail.tab_settings": "Settings",
244
+ "user_detail.admin_actions": "Admin actions",
245
+ "user_detail.reset_password_btn": "Reset password",
246
+ "user_detail.suspend_account_btn": "Suspend account",
247
+ "user_detail.promote_admin_btn": "Promote to administrator",
248
+ "user_detail.technical_metadata": "Technical metadata",
249
+ "users.search_button": "Search",
250
+ "users.refresh_button": "Refresh",
251
+ "users.loading_users": "Loading users...",
252
+ "users.no_users_found": "No users found",
253
+ "users.table_aria_label": "Users table",
254
+ "users.column_user": "USER",
255
+ "users.column_email": "EMAIL",
256
+ "users.column_role": "ROLE",
257
+ "users.column_last_sign_in": "LAST SIGN IN",
258
+ "users.column_created": "CREATED",
259
+ "users.column_actions": "ACTIONS",
260
+ "users.never": "Never",
261
+ "users.view_button": "View",
262
+ "users.showing_results": "Showing {{count}} of {{total}} users"
263
+ }