@workos-inc/widgets 1.7.2 → 1.8.0

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 (214) hide show
  1. package/CHANGELOG.md +5 -0
  2. package/dist/cjs/api/endpoint.cjs +1 -0
  3. package/dist/cjs/api/endpoint.cjs.map +1 -1
  4. package/dist/cjs/api/endpoint.d.cts +1 -0
  5. package/dist/cjs/index.cjs +5 -2
  6. package/dist/cjs/index.cjs.map +1 -1
  7. package/dist/cjs/index.d.cts +1 -0
  8. package/dist/cjs/lib/add-mfa-dialog.cjs +133 -61
  9. package/dist/cjs/lib/add-mfa-dialog.cjs.map +1 -1
  10. package/dist/cjs/lib/admin-portal-domain-verification.cjs +41 -5
  11. package/dist/cjs/lib/admin-portal-domain-verification.cjs.map +1 -1
  12. package/dist/cjs/lib/admin-portal-sso-connection.cjs +121 -44
  13. package/dist/cjs/lib/admin-portal-sso-connection.cjs.map +1 -1
  14. package/dist/cjs/lib/api-keys/api-key-details-card.cjs +25 -3
  15. package/dist/cjs/lib/api-keys/api-key-details-card.cjs.map +1 -1
  16. package/dist/cjs/lib/api-keys/api-key-details-dialog.cjs +25 -3
  17. package/dist/cjs/lib/api-keys/api-key-details-dialog.cjs.map +1 -1
  18. package/dist/cjs/lib/api-keys/api-keys-search.cjs +13 -4
  19. package/dist/cjs/lib/api-keys/api-keys-search.cjs.map +1 -1
  20. package/dist/cjs/lib/api-keys/api-keys-table.cjs +94 -12
  21. package/dist/cjs/lib/api-keys/api-keys-table.cjs.map +1 -1
  22. package/dist/cjs/lib/api-keys/api-keys.cjs +16 -2
  23. package/dist/cjs/lib/api-keys/api-keys.cjs.map +1 -1
  24. package/dist/cjs/lib/api-keys/create-api-key.cjs +172 -20
  25. package/dist/cjs/lib/api-keys/create-api-key.cjs.map +1 -1
  26. package/dist/cjs/lib/api-keys/relative-time.cjs +12 -2
  27. package/dist/cjs/lib/api-keys/relative-time.cjs.map +1 -1
  28. package/dist/cjs/lib/api-keys/revoke-api-key-dialog.cjs +49 -7
  29. package/dist/cjs/lib/api-keys/revoke-api-key-dialog.cjs.map +1 -1
  30. package/dist/cjs/lib/change-password-dialog.cjs +122 -16
  31. package/dist/cjs/lib/change-password-dialog.cjs.map +1 -1
  32. package/dist/cjs/lib/copy-button.cjs +14 -2
  33. package/dist/cjs/lib/copy-button.cjs.map +1 -1
  34. package/dist/cjs/lib/copy-button.d.cts +2 -1
  35. package/dist/cjs/lib/delete-domain-dialog.cjs +52 -19
  36. package/dist/cjs/lib/delete-domain-dialog.cjs.map +1 -1
  37. package/dist/cjs/lib/delete-user-dialog.cjs +46 -11
  38. package/dist/cjs/lib/delete-user-dialog.cjs.map +1 -1
  39. package/dist/cjs/lib/delete-user-dialog.d.cts +2 -2
  40. package/dist/cjs/lib/domain-actions.cjs +51 -7
  41. package/dist/cjs/lib/domain-actions.cjs.map +1 -1
  42. package/dist/cjs/lib/domain-item.cjs +42 -8
  43. package/dist/cjs/lib/domain-item.cjs.map +1 -1
  44. package/dist/cjs/lib/edit-user-profile-dialog.cjs +62 -11
  45. package/dist/cjs/lib/edit-user-profile-dialog.cjs.map +1 -1
  46. package/dist/cjs/lib/edit-user-role-dialog.cjs +90 -17
  47. package/dist/cjs/lib/edit-user-role-dialog.cjs.map +1 -1
  48. package/dist/cjs/lib/elements.cjs +14 -3
  49. package/dist/cjs/lib/elements.cjs.map +1 -1
  50. package/dist/cjs/lib/elements.d.cts +5 -2
  51. package/dist/cjs/lib/elevated-access.cjs +78 -18
  52. package/dist/cjs/lib/elevated-access.cjs.map +1 -1
  53. package/dist/cjs/lib/generic-error.cjs +53 -11
  54. package/dist/cjs/lib/generic-error.cjs.map +1 -1
  55. package/dist/cjs/lib/generic-error.d.cts +5 -1
  56. package/dist/cjs/lib/i18n/intl-context.cjs +47 -0
  57. package/dist/cjs/lib/i18n/intl-context.cjs.map +1 -0
  58. package/dist/cjs/lib/i18n/intl-context.d.cts +29 -0
  59. package/dist/cjs/lib/i18n/translation.cjs +67 -0
  60. package/dist/cjs/lib/i18n/translation.cjs.map +1 -0
  61. package/dist/cjs/lib/i18n/translation.d.cts +16 -0
  62. package/dist/cjs/lib/i18n/use-locale.cjs +33 -0
  63. package/dist/cjs/lib/i18n/use-locale.cjs.map +1 -0
  64. package/dist/cjs/lib/i18n/use-locale.d.cts +7 -0
  65. package/dist/cjs/lib/i18n/use-translation.cjs +47 -0
  66. package/dist/cjs/lib/i18n/use-translation.cjs.map +1 -0
  67. package/dist/cjs/lib/i18n/use-translation.d.cts +15 -0
  68. package/dist/cjs/lib/identity-providers.d.cts +1 -1
  69. package/dist/cjs/lib/invite-user-dialog.cjs +69 -14
  70. package/dist/cjs/lib/invite-user-dialog.cjs.map +1 -1
  71. package/dist/cjs/lib/logout-all-sessions-dialog.cjs +33 -4
  72. package/dist/cjs/lib/logout-all-sessions-dialog.cjs.map +1 -1
  73. package/dist/cjs/lib/logout-dialog.cjs +34 -10
  74. package/dist/cjs/lib/logout-dialog.cjs.map +1 -1
  75. package/dist/cjs/lib/organization-switcher.cjs +12 -2
  76. package/dist/cjs/lib/organization-switcher.cjs.map +1 -1
  77. package/dist/cjs/lib/pipes.cjs +175 -36
  78. package/dist/cjs/lib/pipes.cjs.map +1 -1
  79. package/dist/cjs/lib/resend-invite-dialog.cjs +67 -17
  80. package/dist/cjs/lib/resend-invite-dialog.cjs.map +1 -1
  81. package/dist/cjs/lib/reset-mfa-dialog.cjs +50 -7
  82. package/dist/cjs/lib/reset-mfa-dialog.cjs.map +1 -1
  83. package/dist/cjs/lib/revoke-invite-dialog.cjs +42 -10
  84. package/dist/cjs/lib/revoke-invite-dialog.cjs.map +1 -1
  85. package/dist/cjs/lib/save-button.cjs +9 -1
  86. package/dist/cjs/lib/save-button.cjs.map +1 -1
  87. package/dist/cjs/lib/set-password-dialog.cjs +101 -13
  88. package/dist/cjs/lib/set-password-dialog.cjs.map +1 -1
  89. package/dist/cjs/lib/user-actions-dropdown.cjs +54 -6
  90. package/dist/cjs/lib/user-actions-dropdown.cjs.map +1 -1
  91. package/dist/cjs/lib/user-profile.cjs +81 -10
  92. package/dist/cjs/lib/user-profile.cjs.map +1 -1
  93. package/dist/cjs/lib/user-security.cjs +127 -25
  94. package/dist/cjs/lib/user-security.cjs.map +1 -1
  95. package/dist/cjs/lib/user-sessions.cjs +74 -15
  96. package/dist/cjs/lib/user-sessions.cjs.map +1 -1
  97. package/dist/cjs/lib/users-management.cjs +265 -49
  98. package/dist/cjs/lib/users-management.cjs.map +1 -1
  99. package/dist/cjs/lib/users-search.cjs +18 -4
  100. package/dist/cjs/lib/users-search.cjs.map +1 -1
  101. package/dist/cjs/lib/utils.cjs +10 -7
  102. package/dist/cjs/lib/utils.cjs.map +1 -1
  103. package/dist/cjs/lib/utils.d.cts +2 -1
  104. package/dist/cjs/lib/view-dns-record-dialog.cjs +89 -18
  105. package/dist/cjs/lib/view-dns-record-dialog.cjs.map +1 -1
  106. package/dist/cjs/workos-widgets.client.cjs +2 -2
  107. package/dist/cjs/workos-widgets.client.cjs.map +1 -1
  108. package/dist/esm/api/endpoint.d.ts +1 -0
  109. package/dist/esm/api/endpoint.js +1 -0
  110. package/dist/esm/api/endpoint.js.map +1 -1
  111. package/dist/esm/index.d.ts +1 -0
  112. package/dist/esm/index.js +3 -1
  113. package/dist/esm/index.js.map +1 -1
  114. package/dist/esm/lib/add-mfa-dialog.js +133 -61
  115. package/dist/esm/lib/add-mfa-dialog.js.map +1 -1
  116. package/dist/esm/lib/admin-portal-domain-verification.js +41 -5
  117. package/dist/esm/lib/admin-portal-domain-verification.js.map +1 -1
  118. package/dist/esm/lib/admin-portal-sso-connection.js +121 -44
  119. package/dist/esm/lib/admin-portal-sso-connection.js.map +1 -1
  120. package/dist/esm/lib/api-keys/api-key-details-card.js +25 -3
  121. package/dist/esm/lib/api-keys/api-key-details-card.js.map +1 -1
  122. package/dist/esm/lib/api-keys/api-key-details-dialog.js +25 -3
  123. package/dist/esm/lib/api-keys/api-key-details-dialog.js.map +1 -1
  124. package/dist/esm/lib/api-keys/api-keys-search.js +13 -4
  125. package/dist/esm/lib/api-keys/api-keys-search.js.map +1 -1
  126. package/dist/esm/lib/api-keys/api-keys-table.js +94 -12
  127. package/dist/esm/lib/api-keys/api-keys-table.js.map +1 -1
  128. package/dist/esm/lib/api-keys/api-keys.js +16 -2
  129. package/dist/esm/lib/api-keys/api-keys.js.map +1 -1
  130. package/dist/esm/lib/api-keys/create-api-key.js +172 -20
  131. package/dist/esm/lib/api-keys/create-api-key.js.map +1 -1
  132. package/dist/esm/lib/api-keys/relative-time.js +12 -2
  133. package/dist/esm/lib/api-keys/relative-time.js.map +1 -1
  134. package/dist/esm/lib/api-keys/revoke-api-key-dialog.js +49 -7
  135. package/dist/esm/lib/api-keys/revoke-api-key-dialog.js.map +1 -1
  136. package/dist/esm/lib/change-password-dialog.js +122 -16
  137. package/dist/esm/lib/change-password-dialog.js.map +1 -1
  138. package/dist/esm/lib/copy-button.d.ts +2 -1
  139. package/dist/esm/lib/copy-button.js +14 -2
  140. package/dist/esm/lib/copy-button.js.map +1 -1
  141. package/dist/esm/lib/delete-domain-dialog.js +52 -19
  142. package/dist/esm/lib/delete-domain-dialog.js.map +1 -1
  143. package/dist/esm/lib/delete-user-dialog.d.ts +2 -2
  144. package/dist/esm/lib/delete-user-dialog.js +36 -11
  145. package/dist/esm/lib/delete-user-dialog.js.map +1 -1
  146. package/dist/esm/lib/domain-actions.js +41 -7
  147. package/dist/esm/lib/domain-actions.js.map +1 -1
  148. package/dist/esm/lib/domain-item.js +42 -8
  149. package/dist/esm/lib/domain-item.js.map +1 -1
  150. package/dist/esm/lib/edit-user-profile-dialog.js +62 -11
  151. package/dist/esm/lib/edit-user-profile-dialog.js.map +1 -1
  152. package/dist/esm/lib/edit-user-role-dialog.js +90 -17
  153. package/dist/esm/lib/edit-user-role-dialog.js.map +1 -1
  154. package/dist/esm/lib/elements.d.ts +5 -2
  155. package/dist/esm/lib/elements.js +14 -3
  156. package/dist/esm/lib/elements.js.map +1 -1
  157. package/dist/esm/lib/elevated-access.js +78 -18
  158. package/dist/esm/lib/elevated-access.js.map +1 -1
  159. package/dist/esm/lib/generic-error.d.ts +5 -1
  160. package/dist/esm/lib/generic-error.js +53 -11
  161. package/dist/esm/lib/generic-error.js.map +1 -1
  162. package/dist/esm/lib/i18n/intl-context.d.ts +29 -0
  163. package/dist/esm/lib/i18n/intl-context.js +12 -0
  164. package/dist/esm/lib/i18n/intl-context.js.map +1 -0
  165. package/dist/esm/lib/i18n/translation.d.ts +16 -0
  166. package/dist/esm/lib/i18n/translation.js +45 -0
  167. package/dist/esm/lib/i18n/translation.js.map +1 -0
  168. package/dist/esm/lib/i18n/use-locale.d.ts +7 -0
  169. package/dist/esm/lib/i18n/use-locale.js +9 -0
  170. package/dist/esm/lib/i18n/use-locale.js.map +1 -0
  171. package/dist/esm/lib/i18n/use-translation.d.ts +15 -0
  172. package/dist/esm/lib/i18n/use-translation.js +23 -0
  173. package/dist/esm/lib/i18n/use-translation.js.map +1 -0
  174. package/dist/esm/lib/identity-providers.d.ts +1 -1
  175. package/dist/esm/lib/invite-user-dialog.js +70 -15
  176. package/dist/esm/lib/invite-user-dialog.js.map +1 -1
  177. package/dist/esm/lib/logout-all-sessions-dialog.js +33 -4
  178. package/dist/esm/lib/logout-all-sessions-dialog.js.map +1 -1
  179. package/dist/esm/lib/logout-dialog.js +34 -10
  180. package/dist/esm/lib/logout-dialog.js.map +1 -1
  181. package/dist/esm/lib/organization-switcher.js +12 -2
  182. package/dist/esm/lib/organization-switcher.js.map +1 -1
  183. package/dist/esm/lib/pipes.js +175 -36
  184. package/dist/esm/lib/pipes.js.map +1 -1
  185. package/dist/esm/lib/resend-invite-dialog.js +67 -17
  186. package/dist/esm/lib/resend-invite-dialog.js.map +1 -1
  187. package/dist/esm/lib/reset-mfa-dialog.js +50 -7
  188. package/dist/esm/lib/reset-mfa-dialog.js.map +1 -1
  189. package/dist/esm/lib/revoke-invite-dialog.js +42 -10
  190. package/dist/esm/lib/revoke-invite-dialog.js.map +1 -1
  191. package/dist/esm/lib/save-button.js +9 -1
  192. package/dist/esm/lib/save-button.js.map +1 -1
  193. package/dist/esm/lib/set-password-dialog.js +101 -13
  194. package/dist/esm/lib/set-password-dialog.js.map +1 -1
  195. package/dist/esm/lib/user-actions-dropdown.js +54 -6
  196. package/dist/esm/lib/user-actions-dropdown.js.map +1 -1
  197. package/dist/esm/lib/user-profile.js +81 -10
  198. package/dist/esm/lib/user-profile.js.map +1 -1
  199. package/dist/esm/lib/user-security.js +127 -25
  200. package/dist/esm/lib/user-security.js.map +1 -1
  201. package/dist/esm/lib/user-sessions.js +74 -15
  202. package/dist/esm/lib/user-sessions.js.map +1 -1
  203. package/dist/esm/lib/users-management.js +266 -51
  204. package/dist/esm/lib/users-management.js.map +1 -1
  205. package/dist/esm/lib/users-search.js +18 -4
  206. package/dist/esm/lib/users-search.js.map +1 -1
  207. package/dist/esm/lib/utils.d.ts +2 -1
  208. package/dist/esm/lib/utils.js +10 -7
  209. package/dist/esm/lib/utils.js.map +1 -1
  210. package/dist/esm/lib/view-dns-record-dialog.js +89 -18
  211. package/dist/esm/lib/view-dns-record-dialog.js.map +1 -1
  212. package/dist/esm/workos-widgets.client.js +2 -2
  213. package/dist/esm/workos-widgets.client.js.map +1 -1
  214. package/package.json +11 -2
@@ -49,6 +49,9 @@ var import_constants = require("./constants.js");
49
49
  var import_users_management_context = require("./users-management-context.js");
50
50
  var import_generic_error = require("./generic-error.js");
51
51
  var import_react_icons = require("@radix-ui/react-icons");
52
+ var import_translation = require("./i18n/translation.js");
53
+ var import_use_translation = require("./i18n/use-translation.js");
54
+ var import_use_locale = require("./i18n/use-locale.js");
52
55
  const UsersManagement = ({
53
56
  userData,
54
57
  rolesData,
@@ -62,6 +65,7 @@ const UsersManagement = ({
62
65
  const { listMetadata: pagination = {} } = userData;
63
66
  const { dispatch } = (0, import_users_management_context.useUsersManagementContext)();
64
67
  const isMultipleRolesEnabled = rolesData.multipleRolesEnabled;
68
+ const translate = (0, import_use_translation.useTranslation)();
65
69
  const [deferredLoading, setDeferredLoading] = React.useState(false);
66
70
  React.useEffect(() => {
67
71
  if (isPending) {
@@ -94,13 +98,48 @@ const UsersManagement = ({
94
98
  }
95
99
  ) })
96
100
  ] }),
97
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_themes.Box, { flexGrow: "0", flexShrink: "0", style: { placeSelf: "flex-end" }, children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_invite_user_dialog.InviteUserDialog, { children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_elements.Button, { children: "Invite user" }) }) })
101
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_themes.Box, { flexGrow: "0", flexShrink: "0", style: { placeSelf: "flex-end" }, children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_invite_user_dialog.InviteUserDialog, { children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_elements.Button, { children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
102
+ import_translation.Translation,
103
+ {
104
+ defaultMessage: "Invite user",
105
+ id: "NBXpRj",
106
+ description: "Button text to invite a new user to the organization"
107
+ }
108
+ ) }) }) })
98
109
  ] }),
99
110
  /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_themes.Table.Root, { variant: "ghost", size: "1", children: [
100
111
  /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_themes.Table.Header, { children: /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_themes.Table.Row, { children: [
101
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_themes.Table.ColumnHeaderCell, { width: "260px", children: "User" }),
102
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_themes.Table.ColumnHeaderCell, { width: "100px", children: `Role${isMultipleRolesEnabled ? "s" : ""}` }),
103
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_themes.Table.ColumnHeaderCell, { width: "140px", children: "Last active" }),
112
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_themes.Table.ColumnHeaderCell, { width: "260px", children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
113
+ import_translation.Translation,
114
+ {
115
+ defaultMessage: "User",
116
+ id: "BBh86k",
117
+ description: "Column header for user information in the users table"
118
+ }
119
+ ) }),
120
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_themes.Table.ColumnHeaderCell, { width: "100px", children: isMultipleRolesEnabled ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
121
+ import_translation.Translation,
122
+ {
123
+ defaultMessage: "Roles",
124
+ id: "A1DuWM",
125
+ description: "Column header for user roles when multiple roles are enabled"
126
+ }
127
+ ) : /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
128
+ import_translation.Translation,
129
+ {
130
+ defaultMessage: "Role",
131
+ id: "nQbe+Y",
132
+ description: "Column header for user role when only single role is allowed"
133
+ }
134
+ ) }),
135
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_themes.Table.ColumnHeaderCell, { width: "140px", children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
136
+ import_translation.Translation,
137
+ {
138
+ defaultMessage: "Last active",
139
+ id: "oOwLGt",
140
+ description: "Column header showing when users were last active"
141
+ }
142
+ ) }),
104
143
  /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_themes.Table.ColumnHeaderCell, { width: "28px" })
105
144
  ] }) }),
106
145
  /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
@@ -174,8 +213,11 @@ const UsersManagement = ({
174
213
  /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_themes.Table.Cell, { justify: "end", children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_user_actions_dropdown.UserActionsDropdown, { user, children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
175
214
  import_elements.IconButton,
176
215
  {
177
- title: "User actions",
178
- "aria-label": "User actions",
216
+ title: translate({
217
+ defaultMessage: "User actions",
218
+ id: "1nsmNS",
219
+ description: "Button tooltip for opening user actions menu"
220
+ }),
179
221
  children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_react_icons.DotsHorizontalIcon, {})
180
222
  }
181
223
  ) }) })
@@ -200,7 +242,14 @@ const UsersManagement = ({
200
242
  });
201
243
  }
202
244
  },
203
- children: "Previous"
245
+ children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
246
+ import_translation.Translation,
247
+ {
248
+ defaultMessage: "Previous",
249
+ id: "910Q6b",
250
+ description: "Button text to navigate to the previous page of users"
251
+ }
252
+ )
204
253
  }
205
254
  ),
206
255
  /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
@@ -218,7 +267,14 @@ const UsersManagement = ({
218
267
  });
219
268
  }
220
269
  },
221
- children: "Next"
270
+ children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
271
+ import_translation.Translation,
272
+ {
273
+ defaultMessage: "Next",
274
+ id: "UlAY08",
275
+ description: "Button text to navigate to the next page of users"
276
+ }
277
+ )
222
278
  }
223
279
  )
224
280
  ] }) : null
@@ -227,6 +283,15 @@ const UsersManagement = ({
227
283
  ) });
228
284
  };
229
285
  const UsersManagementLoading = (props) => {
286
+ const translate = (0, import_use_translation.useTranslation)();
287
+ const placeholderText = /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
288
+ import_translation.Translation,
289
+ {
290
+ defaultMessage: "All",
291
+ id: "l/Do9/",
292
+ description: "Filter option to show all users"
293
+ }
294
+ );
230
295
  return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
231
296
  import_themes.Flex,
232
297
  {
@@ -236,19 +301,57 @@ const UsersManagementLoading = (props) => {
236
301
  children: [
237
302
  /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_themes.Grid, { columns: "1fr auto", gap: "2", children: [
238
303
  /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_themes.Flex, { gap: "2", align: "center", children: [
239
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_elements.Skeleton, { loading: true, children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_themes.Box, { flexBasis: "380px", flexGrow: "0", flexShrink: "1", children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_elements.TextField, {}) }) }),
240
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_elements.Skeleton, { loading: true, children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_themes.Box, { flexGrow: "0", flexShrink: "0", children: /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_elements.Select.Root, { value: "all", onValueChange: () => void 0, children: [
241
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_elements.Select.Trigger, { children: "All" }),
242
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_elements.Select.Content, { children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_elements.Select.Item, { value: "all", children: "All" }) })
304
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_elements.Skeleton, { loading: true, children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_themes.Box, { flexBasis: "380px", flexGrow: "0", flexShrink: "1", children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
305
+ import_elements.TextField,
306
+ {
307
+ disabled: true,
308
+ "aria-label": translate({
309
+ defaultMessage: "User search",
310
+ id: "lzPOKv",
311
+ description: "Label for the user search input field"
312
+ })
313
+ }
314
+ ) }) }),
315
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_elements.Skeleton, { loading: true, children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_themes.Box, { flexGrow: "0", flexShrink: "0", children: /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_elements.Select.Root, { disabled: true, value: "all", onValueChange: () => void 0, children: [
316
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_elements.Select.Trigger, { children: placeholderText }),
317
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_elements.Select.Content, { children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_elements.Select.Item, { value: "all", children: placeholderText }) })
243
318
  ] }) }) })
244
319
  ] }),
245
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_elements.Skeleton, { loading: true, children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_themes.Box, { flexGrow: "0", flexShrink: "0", style: { placeSelf: "flex-end" }, children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_elements.Button, { children: "Invite user" }) }) })
320
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_elements.Skeleton, { loading: true, children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_themes.Box, { flexGrow: "0", flexShrink: "0", style: { placeSelf: "flex-end" }, children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_elements.Button, { disabled: true, children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
321
+ import_translation.Translation,
322
+ {
323
+ defaultMessage: "Invite user",
324
+ id: "NBXpRj",
325
+ description: "Button text to invite a new user to the organization"
326
+ }
327
+ ) }) }) })
246
328
  ] }),
247
329
  /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_themes.Table.Root, { variant: "ghost", size: "1", children: [
248
330
  /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_themes.Table.Header, { children: /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_themes.Table.Row, { children: [
249
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_themes.Table.ColumnHeaderCell, { width: "260px", children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_elements.Skeleton, { loading: true, children: "User" }) }),
250
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_themes.Table.ColumnHeaderCell, { width: "100px", children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_elements.Skeleton, { children: "Role" }) }),
251
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_themes.Table.ColumnHeaderCell, { width: "140px", children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_elements.Skeleton, { children: "Last active" }) }),
331
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_themes.Table.ColumnHeaderCell, { width: "260px", children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_elements.Skeleton, { loading: true, children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
332
+ import_translation.Translation,
333
+ {
334
+ defaultMessage: "User",
335
+ id: "BBh86k",
336
+ description: "Column header for user information in the users table"
337
+ }
338
+ ) }) }),
339
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_themes.Table.ColumnHeaderCell, { width: "100px", children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_elements.Skeleton, { children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
340
+ import_translation.Translation,
341
+ {
342
+ defaultMessage: "Role",
343
+ id: "FK7mP4",
344
+ description: "Column header for user role"
345
+ }
346
+ ) }) }),
347
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_themes.Table.ColumnHeaderCell, { width: "140px", children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_elements.Skeleton, { children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
348
+ import_translation.Translation,
349
+ {
350
+ defaultMessage: "Last active",
351
+ id: "oOwLGt",
352
+ description: "Column header showing when users were last active"
353
+ }
354
+ ) }) }),
252
355
  /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_themes.Table.ColumnHeaderCell, { width: "28px" })
253
356
  ] }) }),
254
357
  /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_themes.Table.Body, { children: Array.from({ length: import_constants.USER_ROW_LIMIT }, (_, index) => /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_themes.Table.Row, { align: "center", children: [
@@ -273,8 +376,22 @@ const UsersManagementLoading = (props) => {
273
376
  ] }, index)) })
274
377
  ] }),
275
378
  /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_themes.Flex, { gap: "2", justify: "end", children: [
276
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_elements.Skeleton, { loading: true, children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_elements.Button, { variant: "secondary", size: "1", children: "Previous" }) }),
277
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_elements.Skeleton, { loading: true, children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_elements.Button, { variant: "secondary", size: "1", children: "Next" }) })
379
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_elements.Skeleton, { loading: true, children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_elements.Button, { disabled: true, variant: "secondary", size: "1", children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
380
+ import_translation.Translation,
381
+ {
382
+ defaultMessage: "Previous",
383
+ id: "910Q6b",
384
+ description: "Button text to navigate to the previous page of users"
385
+ }
386
+ ) }) }),
387
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_elements.Skeleton, { loading: true, children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_elements.Button, { disabled: true, variant: "secondary", size: "1", children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
388
+ import_translation.Translation,
389
+ {
390
+ defaultMessage: "Next",
391
+ id: "UlAY08",
392
+ description: "Button text to navigate to the next page of users"
393
+ }
394
+ ) }) })
278
395
  ] })
279
396
  ]
280
397
  }
@@ -295,24 +412,73 @@ const UsersManagementError = ({
295
412
  };
296
413
  function UserBadge({ user }) {
297
414
  if (user.isLoggedInUser) {
298
- return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_elements.Badge, { color: "gray", style: { userSelect: "none" }, children: "You" });
415
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_elements.Badge, { color: "gray", style: { userSelect: "none" }, children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
416
+ import_translation.Translation,
417
+ {
418
+ defaultMessage: "You",
419
+ id: "ER1Vmv",
420
+ description: "Badge indicating the current logged-in user"
421
+ }
422
+ ) });
299
423
  }
300
424
  if (user.status === "Invited") {
301
425
  return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_elements.Badge, { color: "amber", style: { userSelect: "none" }, children: [
302
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_themes.VisuallyHidden, { children: "Status: " }),
303
- "Invited"
426
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_themes.VisuallyHidden, { children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
427
+ import_translation.Translation,
428
+ {
429
+ defaultMessage: "Status: ",
430
+ id: "E2o/+H",
431
+ description: "Prefix for status indicator in screen reader"
432
+ }
433
+ ) }),
434
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
435
+ import_translation.Translation,
436
+ {
437
+ defaultMessage: "Invited",
438
+ id: "byIkUu",
439
+ description: "Badge status indicating user has been invited but not yet accepted"
440
+ }
441
+ )
304
442
  ] });
305
443
  }
306
444
  if (user.status === "InviteExpired") {
307
445
  return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_elements.Badge, { color: "red", style: { userSelect: "none" }, children: [
308
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_themes.VisuallyHidden, { children: "Status: Invite " }),
309
- "Expired"
446
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_themes.VisuallyHidden, { children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
447
+ import_translation.Translation,
448
+ {
449
+ defaultMessage: "Status: Invite ",
450
+ id: "BWvbwY",
451
+ description: "Prefix for invite status indicator in screen reader"
452
+ }
453
+ ) }),
454
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
455
+ import_translation.Translation,
456
+ {
457
+ defaultMessage: "Expired",
458
+ id: "+0sQaN",
459
+ description: "Badge status indicating user invitation has expired"
460
+ }
461
+ )
310
462
  ] });
311
463
  }
312
464
  if (user.status === "InviteRevoked") {
313
465
  return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_elements.Badge, { color: "red", style: { userSelect: "none" }, children: [
314
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_themes.VisuallyHidden, { children: "Status: Invite " }),
315
- "Revoked"
466
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_themes.VisuallyHidden, { children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
467
+ import_translation.Translation,
468
+ {
469
+ defaultMessage: "Status: Invite ",
470
+ id: "BWvbwY",
471
+ description: "Prefix for invite status indicator in screen reader"
472
+ }
473
+ ) }),
474
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
475
+ import_translation.Translation,
476
+ {
477
+ defaultMessage: "Revoked",
478
+ id: "NNBv+r",
479
+ description: "Badge status indicating user invitation has been revoked"
480
+ }
481
+ )
316
482
  ] });
317
483
  }
318
484
  return null;
@@ -320,7 +486,21 @@ function UserBadge({ user }) {
320
486
  function LastActive(props) {
321
487
  if (!props.user.lastActivityAt) {
322
488
  return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_jsx_runtime.Fragment, { children: [
323
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_themes.VisuallyHidden, { children: props.user.status === "Active" ? "Never" : "Not active" }),
489
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_themes.VisuallyHidden, { children: props.user.status === "Active" ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
490
+ import_translation.Translation,
491
+ {
492
+ defaultMessage: "Never",
493
+ id: "0duvF4",
494
+ description: "Screen reader text indicating user has never been active"
495
+ }
496
+ ) : /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
497
+ import_translation.Translation,
498
+ {
499
+ defaultMessage: "Not active",
500
+ id: "hd2+kk",
501
+ description: "Screen reader text indicating user is not active"
502
+ }
503
+ ) }),
324
504
  /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_themes.Separator, {})
325
505
  ] });
326
506
  }
@@ -331,10 +511,11 @@ function LastActiveImpl({
331
511
  isHydrated,
332
512
  dim
333
513
  }) {
514
+ const locale = (0, import_use_locale.useLocale)();
334
515
  const { lastActiveDateTime, lastActiveDisplay } = React.useMemo(() => {
335
516
  const defaultTimeZone = "America/Los_Angeles";
336
517
  const lastActiveDate = new Date(date);
337
- const lastActiveDateTime2 = lastActiveDate.toLocaleTimeString("en-US", {
518
+ const lastActiveDateTime2 = lastActiveDate.toLocaleTimeString(locale, {
338
519
  // hard-coded timezone before hydration to prevent server/client mismatch
339
520
  timeZone: isHydrated ? void 0 : defaultTimeZone,
340
521
  month: "long",
@@ -343,18 +524,28 @@ function LastActiveImpl({
343
524
  hour: "numeric",
344
525
  minute: "numeric"
345
526
  });
346
- const lastActiveDisplay2 = isHydrated ? (0, import_utils.getComparativeReadableDate)(/* @__PURE__ */ new Date(), lastActiveDate) : lastActiveDate.toLocaleDateString("en-US", {
527
+ const lastActiveDisplay2 = isHydrated ? (0, import_utils.getComparativeReadableDate)(/* @__PURE__ */ new Date(), lastActiveDate, { locale }) : lastActiveDate.toLocaleDateString(locale, {
347
528
  // hard-coded timezone to prevent server/client mismatch
348
529
  timeZone: defaultTimeZone,
349
530
  month: "long",
350
531
  day: "numeric",
351
532
  year: "numeric"
352
533
  });
353
- return { lastActiveDateTime: lastActiveDateTime2, lastActiveDisplay: lastActiveDisplay2 };
354
- }, [isHydrated, date]);
534
+ return {
535
+ lastActiveDateTime: lastActiveDateTime2,
536
+ lastActiveDisplay: lastActiveDisplay2
537
+ };
538
+ }, [isHydrated, date, locale]);
355
539
  if (lastActiveDisplay === "Invalid Date") {
356
540
  return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_jsx_runtime.Fragment, { children: [
357
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_themes.VisuallyHidden, { children: "Unknown" }),
541
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_themes.VisuallyHidden, { children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
542
+ import_translation.Translation,
543
+ {
544
+ defaultMessage: "Unknown",
545
+ id: "UUigrK",
546
+ description: "Screen reader text indicating last active date is unknown"
547
+ }
548
+ ) }),
358
549
  /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_themes.Separator, {})
359
550
  ] });
360
551
  }
@@ -415,15 +606,17 @@ const UsersManagementEmptyState = ({ isPending }) => {
415
606
  }
416
607
  if (searchQuery || isClearing) {
417
608
  return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_themes.Flex, { align: "center", justify: "center", py: "8", direction: "column", gap: "2", children: [
418
- /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_themes.Text, { size: "2", children: [
419
- "No users found for query",
420
- " ",
421
- /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_themes.Text, { weight: "medium", children: [
422
- "\u201C",
423
- isClearing ? lastSearchQuery : searchQuery,
424
- "\u201D"
425
- ] })
426
- ] }),
609
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_themes.Text, { size: "2", children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
610
+ import_translation.Translation,
611
+ {
612
+ defaultMessage: "No users found for query '{query}'",
613
+ id: "wrEZ8+",
614
+ description: "Message shown when no users match the search query",
615
+ values: {
616
+ query: isClearing ? lastSearchQuery : searchQuery
617
+ }
618
+ }
619
+ ) }),
427
620
  /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
428
621
  import_elements.Button,
429
622
  {
@@ -434,12 +627,26 @@ const UsersManagementEmptyState = ({ isPending }) => {
434
627
  clearSearch();
435
628
  },
436
629
  loading: isPending,
437
- children: "Clear search"
630
+ children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
631
+ import_translation.Translation,
632
+ {
633
+ defaultMessage: "Clear search",
634
+ id: "Xv3fVI",
635
+ description: "Button text to clear the current search query"
636
+ }
637
+ )
438
638
  }
439
639
  )
440
640
  ] });
441
641
  }
442
- return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_themes.Flex, { align: "center", justify: "center", py: "8", gap: "2", children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_themes.Text, { size: "2", children: "No users found" }) });
642
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_themes.Flex, { align: "center", justify: "center", py: "8", gap: "2", children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_themes.Text, { size: "2", children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
643
+ import_translation.Translation,
644
+ {
645
+ defaultMessage: "No users found",
646
+ id: "MQ+LoA",
647
+ description: "Message shown when there are no users in the system"
648
+ }
649
+ ) }) });
443
650
  };
444
651
  function UserRolesCellContent({
445
652
  user,
@@ -448,19 +655,28 @@ function UserRolesCellContent({
448
655
  }) {
449
656
  if (!user.roles || user.roles.length === 0) {
450
657
  return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_jsx_runtime.Fragment, { children: [
451
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_themes.VisuallyHidden, { children: "No roles assigned" }),
658
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_themes.VisuallyHidden, { children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
659
+ import_translation.Translation,
660
+ {
661
+ defaultMessage: "No roles assigned",
662
+ id: "CVOVB0",
663
+ description: "Screen reader text indicating user has no roles assigned"
664
+ }
665
+ ) }),
452
666
  /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { "aria-hidden": true, style: { userSelect: "none" }, children: "\u2013" })
453
667
  ] });
454
668
  }
455
669
  if (isMultipleRolesEnabled && user.roles.length > 1) {
456
- return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
457
- import_themes.Tooltip,
670
+ const roleNames = user.roles?.map((role) => role.name).join(", ");
671
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_themes.Tooltip, { content: roleNames, maxWidth: "250px", children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(TableCellText, { dim: dimText, children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
672
+ import_translation.Translation,
458
673
  {
459
- content: user.roles?.map((role) => role.name).join(", "),
460
- maxWidth: "250px",
461
- children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(TableCellText, { dim: dimText, children: (0, import_utils.pluralize)("role", user.roles.length) })
674
+ defaultMessage: "{count} roles",
675
+ id: "lWAmRC",
676
+ description: "Shows the number of roles assigned to a user (plural)",
677
+ values: { count: user.roles.length }
462
678
  }
463
- );
679
+ ) }) });
464
680
  }
465
681
  return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(TableCellText, { dim: dimText, children: user.roles?.[0]?.name });
466
682
  }