@antelopejs/dms 0.6.1 → 0.7.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 (472) hide show
  1. package/CHANGELOG.md +39 -0
  2. package/dist/db/models/notification-feed-filter.d.ts +0 -1
  3. package/dist/db/models/notification-feed-filter.js +0 -4
  4. package/dist/db/models/notification-feed-filter.js.map +1 -1
  5. package/dist/db/models/signInAttempts.model.d.ts +18 -0
  6. package/dist/db/models/signInAttempts.model.js +83 -12
  7. package/dist/db/models/signInAttempts.model.js.map +1 -1
  8. package/dist/db/models/userEmailChanges.model.d.ts +8 -1
  9. package/dist/db/models/userEmailChanges.model.js +27 -2
  10. package/dist/db/models/userEmailChanges.model.js.map +1 -1
  11. package/dist/db/models/userNotificationPreferences.model.d.ts +0 -2
  12. package/dist/db/models/userNotificationPreferences.model.js +0 -13
  13. package/dist/db/models/userNotificationPreferences.model.js.map +1 -1
  14. package/dist/db/models/userNotifications.model.d.ts +5 -2
  15. package/dist/db/models/userNotifications.model.js +19 -2
  16. package/dist/db/models/userNotifications.model.js.map +1 -1
  17. package/dist/db/tables/signInAttempts.table.d.ts +2 -1
  18. package/dist/db/tables/signInAttempts.table.js +4 -0
  19. package/dist/db/tables/signInAttempts.table.js.map +1 -1
  20. package/dist/db/tables/userEmailChanges.table.d.ts +2 -1
  21. package/dist/db/tables/userEmailChanges.table.js +6 -1
  22. package/dist/db/tables/userEmailChanges.table.js.map +1 -1
  23. package/dist/db/tables/userNotificationPreferences.table.d.ts +0 -1
  24. package/dist/db/tables/userNotificationPreferences.table.js +0 -4
  25. package/dist/db/tables/userNotificationPreferences.table.js.map +1 -1
  26. package/dist/implementations/dms/layout-banners.d.ts +4 -1
  27. package/dist/implementations/dms/layout-banners.js +33 -18
  28. package/dist/implementations/dms/layout-banners.js.map +1 -1
  29. package/dist/implementations/dms/nav-badges.d.ts +6 -4
  30. package/dist/implementations/dms/nav-badges.js +6 -5
  31. package/dist/implementations/dms/nav-badges.js.map +1 -1
  32. package/dist/implementations/dms/page.d.ts +1 -0
  33. package/dist/implementations/dms/page.js +46 -8
  34. package/dist/implementations/dms/page.js.map +1 -1
  35. package/dist/implementations/dms/permission-preview.d.ts +1 -1
  36. package/dist/implementations/dms/permission-preview.js +9 -4
  37. package/dist/implementations/dms/permission-preview.js.map +1 -1
  38. package/dist/implementations/dms-auth/index.d.ts +3 -2
  39. package/dist/implementations/dms-auth/index.js +39 -35
  40. package/dist/implementations/dms-auth/index.js.map +1 -1
  41. package/dist/implementations/dms-auth/token-session.d.ts +3 -0
  42. package/dist/implementations/dms-auth/token-session.js +22 -0
  43. package/dist/implementations/dms-auth/token-session.js.map +1 -0
  44. package/dist/implementations/dms-notifications/index.d.ts +0 -1
  45. package/dist/implementations/dms-notifications/index.js +0 -7
  46. package/dist/implementations/dms-notifications/index.js.map +1 -1
  47. package/dist/pages/settings/settings-index.js +3 -2
  48. package/dist/pages/settings/settings-index.js.map +1 -1
  49. package/dist/pages/settings/users/account-activity-feed.d.ts +1 -1
  50. package/dist/pages/settings/users/account-activity-feed.js +1 -1
  51. package/dist/pages/settings/users/account-activity-feed.js.map +1 -1
  52. package/dist/pages/settings/users/account-activity.d.ts +1 -1
  53. package/dist/pages/settings/users/account-activity.js +1 -1
  54. package/dist/pages/settings/users/account-activity.js.map +1 -1
  55. package/dist/pages/settings/users/account-credentials.d.ts +3 -0
  56. package/dist/pages/settings/users/account-credentials.js +2 -0
  57. package/dist/pages/settings/users/account-credentials.js.map +1 -1
  58. package/dist/pages/settings/users/current-password.d.ts +1 -1
  59. package/dist/pages/settings/users/current-password.js +23 -2
  60. package/dist/pages/settings/users/current-password.js.map +1 -1
  61. package/dist/pages/settings/users/email-change.d.ts +1 -1
  62. package/dist/pages/settings/users/email-change.js +33 -26
  63. package/dist/pages/settings/users/email-change.js.map +1 -1
  64. package/dist/pages/settings/users/invite-resend.js +0 -1
  65. package/dist/pages/settings/users/invite-resend.js.map +1 -1
  66. package/dist/pages/settings/users/invites.d.ts +1 -2
  67. package/dist/pages/settings/users/invites.js +21 -19
  68. package/dist/pages/settings/users/invites.js.map +1 -1
  69. package/dist/pages/settings/users/member-invite-batch.js +0 -1
  70. package/dist/pages/settings/users/member-invite-batch.js.map +1 -1
  71. package/dist/pages/settings/users/member-invite-form.js +10 -22
  72. package/dist/pages/settings/users/member-invite-form.js.map +1 -1
  73. package/dist/pages/settings/users/member-role-options.d.ts +6 -4
  74. package/dist/pages/settings/users/member-role-options.js +15 -4
  75. package/dist/pages/settings/users/member-role-options.js.map +1 -1
  76. package/dist/pages/settings/users/members.d.ts +2 -3
  77. package/dist/pages/settings/users/members.js +7 -12
  78. package/dist/pages/settings/users/members.js.map +1 -1
  79. package/dist/pages/settings/users/notifications.d.ts +1 -8
  80. package/dist/pages/settings/users/notifications.js +6 -38
  81. package/dist/pages/settings/users/notifications.js.map +1 -1
  82. package/dist/pages/settings/users/permission-tree-nodes.d.ts +1 -1
  83. package/dist/pages/settings/users/permission-tree-nodes.js +23 -9
  84. package/dist/pages/settings/users/permission-tree-nodes.js.map +1 -1
  85. package/dist/pages/settings/users/permission-warnings.d.ts +7 -0
  86. package/dist/pages/settings/users/permission-warnings.js +42 -0
  87. package/dist/pages/settings/users/permission-warnings.js.map +1 -0
  88. package/dist/pages/settings/users/profile-helpers.d.ts +1 -3
  89. package/dist/pages/settings/users/profile-helpers.js +0 -16
  90. package/dist/pages/settings/users/profile-helpers.js.map +1 -1
  91. package/dist/pages/settings/users/role-editor-store.js +6 -3
  92. package/dist/pages/settings/users/role-editor-store.js.map +1 -1
  93. package/dist/pages/settings/users/role-editor.d.ts +2 -1
  94. package/dist/pages/settings/users/role-editor.js +8 -4
  95. package/dist/pages/settings/users/role-editor.js.map +1 -1
  96. package/dist/pages/settings/users/role-preview.js +2 -1
  97. package/dist/pages/settings/users/role-preview.js.map +1 -1
  98. package/dist/pages/settings/users/roles.js +5 -1
  99. package/dist/pages/settings/users/roles.js.map +1 -1
  100. package/dist/pages/settings/users/security-attention.d.ts +4 -0
  101. package/dist/pages/settings/users/security-attention.js +23 -7
  102. package/dist/pages/settings/users/security-attention.js.map +1 -1
  103. package/dist/pages/settings/users/security.d.ts +2 -1
  104. package/dist/pages/settings/users/security.js +13 -2
  105. package/dist/pages/settings/users/security.js.map +1 -1
  106. package/dist/pages/settings/users/two-factor-operations.d.ts +2 -1
  107. package/dist/pages/settings/users/two-factor-operations.js +28 -29
  108. package/dist/pages/settings/users/two-factor-operations.js.map +1 -1
  109. package/dist/routes/auth/forgot-password.js +3 -0
  110. package/dist/routes/auth/forgot-password.js.map +1 -1
  111. package/dist/routes/auth/index.d.ts +1 -0
  112. package/dist/routes/auth/index.js +1 -0
  113. package/dist/routes/auth/index.js.map +1 -1
  114. package/dist/routes/auth/invite.js +28 -4
  115. package/dist/routes/auth/invite.js.map +1 -1
  116. package/dist/routes/auth/login-throttle.d.ts +2 -0
  117. package/dist/routes/auth/login-throttle.js +5 -4
  118. package/dist/routes/auth/login-throttle.js.map +1 -1
  119. package/dist/routes/auth/request-2fa-email.js +6 -18
  120. package/dist/routes/auth/request-2fa-email.js.map +1 -1
  121. package/dist/routes/auth/reset-code.d.ts +3 -0
  122. package/dist/routes/auth/reset-code.js +37 -0
  123. package/dist/routes/auth/reset-code.js.map +1 -0
  124. package/dist/routes/auth/reset-password.d.ts +2 -2
  125. package/dist/routes/auth/reset-password.js +5 -10
  126. package/dist/routes/auth/reset-password.js.map +1 -1
  127. package/dist/routes/auth/signup.js +10 -32
  128. package/dist/routes/auth/signup.js.map +1 -1
  129. package/dist/routes/auth/two-factor-throttle.d.ts +5 -0
  130. package/dist/routes/auth/two-factor-throttle.js +81 -0
  131. package/dist/routes/auth/two-factor-throttle.js.map +1 -0
  132. package/dist/routes/auth/validate-forgot-password-token.js +2 -8
  133. package/dist/routes/auth/validate-forgot-password-token.js.map +1 -1
  134. package/dist/routes/auth/validate-invite-token.d.ts +1 -0
  135. package/dist/routes/auth/validate-invite-token.js +11 -0
  136. package/dist/routes/auth/validate-invite-token.js.map +1 -0
  137. package/dist/routes/auth/verify-2fa.js +10 -13
  138. package/dist/routes/auth/verify-2fa.js.map +1 -1
  139. package/dist/routes/auth.d.ts +1 -0
  140. package/dist/routes/auth.js +11 -1
  141. package/dist/routes/auth.js.map +1 -1
  142. package/dist/test/helpers/auth.d.ts +0 -1
  143. package/dist/test/helpers/auth.js +0 -1
  144. package/dist/test/helpers/auth.js.map +1 -1
  145. package/dist/test/helpers/emails.d.ts +10 -0
  146. package/dist/test/helpers/emails.js +36 -0
  147. package/dist/test/helpers/emails.js.map +1 -0
  148. package/dist/test/helpers/fixtures.d.ts +0 -1
  149. package/dist/test/helpers/fixtures.js +1 -2
  150. package/dist/test/helpers/fixtures.js.map +1 -1
  151. package/dist/test/helpers/page-access.d.ts +1 -0
  152. package/dist/test/helpers/page-access.js +6 -1
  153. package/dist/test/helpers/page-access.js.map +1 -1
  154. package/dist/test/integration/auth/current-password.test.d.ts +1 -0
  155. package/dist/test/integration/auth/current-password.test.js +65 -0
  156. package/dist/test/integration/auth/current-password.test.js.map +1 -0
  157. package/dist/test/integration/auth/password-reset.test.d.ts +1 -0
  158. package/dist/test/integration/auth/password-reset.test.js +126 -0
  159. package/dist/test/integration/auth/password-reset.test.js.map +1 -0
  160. package/dist/test/integration/auth/session-revocation.test.d.ts +1 -0
  161. package/dist/test/integration/auth/session-revocation.test.js +45 -0
  162. package/dist/test/integration/auth/session-revocation.test.js.map +1 -0
  163. package/dist/test/integration/auth/two-factor-codes.test.d.ts +1 -0
  164. package/dist/test/integration/auth/two-factor-codes.test.js +335 -0
  165. package/dist/test/integration/auth/two-factor-codes.test.js.map +1 -0
  166. package/dist/test/integration/auth/two-factor-password.test.js +5 -1
  167. package/dist/test/integration/auth/two-factor-password.test.js.map +1 -1
  168. package/dist/test/integration/auth/two-factor-token.test.d.ts +1 -0
  169. package/dist/test/integration/auth/two-factor-token.test.js +92 -0
  170. package/dist/test/integration/auth/two-factor-token.test.js.map +1 -0
  171. package/dist/test/integration/email-change.test.js +36 -0
  172. package/dist/test/integration/email-change.test.js.map +1 -1
  173. package/dist/test/integration/invite-extension-edit.test.js +0 -1
  174. package/dist/test/integration/invite-extension-edit.test.js.map +1 -1
  175. package/dist/test/integration/invite-link-status.test.d.ts +1 -0
  176. package/dist/test/integration/invite-link-status.test.js +110 -0
  177. package/dist/test/integration/invite-link-status.test.js.map +1 -0
  178. package/dist/test/integration/invite-resolution.test.js +0 -3
  179. package/dist/test/integration/invite-resolution.test.js.map +1 -1
  180. package/dist/test/integration/member-settings-access.test.js +17 -0
  181. package/dist/test/integration/member-settings-access.test.js.map +1 -1
  182. package/dist/test/integration/notification-unread-badge.test.d.ts +1 -0
  183. package/dist/test/integration/notification-unread-badge.test.js +92 -0
  184. package/dist/test/integration/notification-unread-badge.test.js.map +1 -0
  185. package/dist/test/integration/permission-warnings.test.d.ts +1 -0
  186. package/dist/test/integration/permission-warnings.test.js +71 -0
  187. package/dist/test/integration/permission-warnings.test.js.map +1 -0
  188. package/dist/test/integration/removed-member-notifications.test.d.ts +1 -0
  189. package/dist/test/integration/removed-member-notifications.test.js +80 -0
  190. package/dist/test/integration/removed-member-notifications.test.js.map +1 -0
  191. package/dist/test/integration/role-permission-ancestors.test.d.ts +1 -0
  192. package/dist/test/integration/role-permission-ancestors.test.js +146 -0
  193. package/dist/test/integration/role-permission-ancestors.test.js.map +1 -0
  194. package/dist/test/integration/tenant-lifecycle.test.js +0 -4
  195. package/dist/test/integration/tenant-lifecycle.test.js.map +1 -1
  196. package/dist/test/unit/auth-session-revocation.test.d.ts +1 -0
  197. package/dist/test/unit/auth-session-revocation.test.js +105 -0
  198. package/dist/test/unit/auth-session-revocation.test.js.map +1 -0
  199. package/dist/test/unit/db/email-normalization.test.js +0 -1
  200. package/dist/test/unit/db/email-normalization.test.js.map +1 -1
  201. package/dist/test/unit/db/notification-feed-filter.test.js +0 -16
  202. package/dist/test/unit/db/notification-feed-filter.test.js.map +1 -1
  203. package/dist/test/unit/db/notification-inbox.test.js +63 -13
  204. package/dist/test/unit/db/notification-inbox.test.js.map +1 -1
  205. package/dist/test/unit/db/notification-preferences.test.js +0 -17
  206. package/dist/test/unit/db/notification-preferences.test.js.map +1 -1
  207. package/dist/test/unit/implementations/dms/empty-menu-group.test.d.ts +1 -0
  208. package/dist/test/unit/implementations/dms/empty-menu-group.test.js +133 -0
  209. package/dist/test/unit/implementations/dms/empty-menu-group.test.js.map +1 -0
  210. package/dist/test/unit/implementations/dms/layout-banners.test.js +78 -1
  211. package/dist/test/unit/implementations/dms/layout-banners.test.js.map +1 -1
  212. package/dist/test/unit/implementations/dms/menu-hidden-blocks.test.d.ts +1 -0
  213. package/dist/test/unit/implementations/dms/menu-hidden-blocks.test.js +149 -0
  214. package/dist/test/unit/implementations/dms/menu-hidden-blocks.test.js.map +1 -0
  215. package/dist/test/unit/implementations/dms/nav-badges.test.js +55 -4
  216. package/dist/test/unit/implementations/dms/nav-badges.test.js.map +1 -1
  217. package/dist/test/unit/implementations/dms/page-all-components-hidden.test.d.ts +1 -0
  218. package/dist/test/unit/implementations/dms/page-all-components-hidden.test.js +118 -0
  219. package/dist/test/unit/implementations/dms/page-all-components-hidden.test.js.map +1 -0
  220. package/dist/test/unit/implementations/dms/permission-preview-aggregate.test.js +16 -0
  221. package/dist/test/unit/implementations/dms/permission-preview-aggregate.test.js.map +1 -1
  222. package/dist/test/unit/implementations/dms/permission-preview-cost.test.js +5 -3
  223. package/dist/test/unit/implementations/dms/permission-preview-cost.test.js.map +1 -1
  224. package/dist/test/unit/implementations/dms/permission-preview-menu.test.js +29 -3
  225. package/dist/test/unit/implementations/dms/permission-preview-menu.test.js.map +1 -1
  226. package/dist/test/unit/implementations/dms/quick-actions-button.test.js +4 -2
  227. package/dist/test/unit/implementations/dms/quick-actions-button.test.js.map +1 -1
  228. package/dist/test/unit/implementations/dms/user-permissions-gate.test.js +2 -1
  229. package/dist/test/unit/implementations/dms/user-permissions-gate.test.js.map +1 -1
  230. package/dist/test/unit/implementations/dms-base/table-view-shared-controller.test.js +2 -1
  231. package/dist/test/unit/implementations/dms-base/table-view-shared-controller.test.js.map +1 -1
  232. package/dist/test/unit/interfaces/dms/component-children-permissions.test.js +7 -2
  233. package/dist/test/unit/interfaces/dms/component-children-permissions.test.js.map +1 -1
  234. package/dist/test/unit/interfaces/dms/form-watch-permissions.test.d.ts +1 -0
  235. package/dist/test/unit/interfaces/dms/form-watch-permissions.test.js +133 -0
  236. package/dist/test/unit/interfaces/dms/form-watch-permissions.test.js.map +1 -0
  237. package/dist/test/unit/interfaces/dms/has-permission-ancestors.test.d.ts +1 -0
  238. package/dist/test/unit/interfaces/dms/has-permission-ancestors.test.js +149 -0
  239. package/dist/test/unit/interfaces/dms/has-permission-ancestors.test.js.map +1 -0
  240. package/dist/test/unit/interfaces/dms/invite-extension.test.js +13 -0
  241. package/dist/test/unit/interfaces/dms/invite-extension.test.js.map +1 -1
  242. package/dist/test/unit/interfaces/dms/member-access.test.js +27 -1
  243. package/dist/test/unit/interfaces/dms/member-access.test.js.map +1 -1
  244. package/dist/test/unit/interfaces/dms/nav-badge-tones.test.d.ts +1 -0
  245. package/dist/test/unit/interfaces/dms/nav-badge-tones.test.js +31 -0
  246. package/dist/test/unit/interfaces/dms/nav-badge-tones.test.js.map +1 -0
  247. package/dist/test/unit/interfaces/dms/page-extension.test.js +4 -1
  248. package/dist/test/unit/interfaces/dms/page-extension.test.js.map +1 -1
  249. package/dist/test/unit/interfaces/dms/permission-requirements.test.d.ts +1 -0
  250. package/dist/test/unit/interfaces/dms/permission-requirements.test.js +144 -0
  251. package/dist/test/unit/interfaces/dms/permission-requirements.test.js.map +1 -0
  252. package/dist/test/unit/interfaces/dms-base/column-display.test.js +70 -0
  253. package/dist/test/unit/interfaces/dms-base/column-display.test.js.map +1 -1
  254. package/dist/test/unit/interfaces/dms-base/display-blocks-catalog.test.js +38 -0
  255. package/dist/test/unit/interfaces/dms-base/display-blocks-catalog.test.js.map +1 -1
  256. package/dist/test/unit/interfaces/dms-base/layout-header-actions.test.js +6 -2
  257. package/dist/test/unit/interfaces/dms-base/layout-header-actions.test.js.map +1 -1
  258. package/dist/test/unit/interfaces/dms-base/lists-and-settings-catalog.test.js +1 -1
  259. package/dist/test/unit/interfaces/dms-base/lists-and-settings-catalog.test.js.map +1 -1
  260. package/dist/test/unit/interfaces/dms-base/table-view-export-permission.test.js +2 -1
  261. package/dist/test/unit/interfaces/dms-base/table-view-export-permission.test.js.map +1 -1
  262. package/dist/test/unit/interfaces/dms-base/table-view-reduced-chrome.test.js +2 -1
  263. package/dist/test/unit/interfaces/dms-base/table-view-reduced-chrome.test.js.map +1 -1
  264. package/dist/test/unit/interfaces/dms-base/table-view-shared-controller-permissions.test.js +2 -1
  265. package/dist/test/unit/interfaces/dms-base/table-view-shared-controller-permissions.test.js.map +1 -1
  266. package/dist/test/unit/pages/settings/account-activity-feed.test.js +2 -2
  267. package/dist/test/unit/pages/settings/account-activity-feed.test.js.map +1 -1
  268. package/dist/test/unit/pages/settings/account-activity.test.js +11 -2
  269. package/dist/test/unit/pages/settings/account-activity.test.js.map +1 -1
  270. package/dist/test/unit/pages/settings/invite-email-delivery.test.js +0 -1
  271. package/dist/test/unit/pages/settings/invite-email-delivery.test.js.map +1 -1
  272. package/dist/test/unit/pages/settings/invite-email-validation-option.test.d.ts +1 -0
  273. package/dist/test/unit/pages/settings/invite-email-validation-option.test.js +33 -0
  274. package/dist/test/unit/pages/settings/invite-email-validation-option.test.js.map +1 -0
  275. package/dist/test/unit/pages/settings/member-lists-page-size.test.d.ts +1 -0
  276. package/dist/test/unit/pages/settings/member-lists-page-size.test.js +22 -0
  277. package/dist/test/unit/pages/settings/member-lists-page-size.test.js.map +1 -0
  278. package/dist/test/unit/pages/settings/member-table-widths.test.js +2 -2
  279. package/dist/test/unit/pages/settings/member-table-widths.test.js.map +1 -1
  280. package/dist/test/unit/pages/settings/members-page.test.js +7 -10
  281. package/dist/test/unit/pages/settings/members-page.test.js.map +1 -1
  282. package/dist/test/unit/pages/settings/notifications-access-gate.test.js +3 -10
  283. package/dist/test/unit/pages/settings/notifications-access-gate.test.js.map +1 -1
  284. package/dist/test/unit/pages/settings/permission-tree-nodes.test.js +57 -0
  285. package/dist/test/unit/pages/settings/permission-tree-nodes.test.js.map +1 -1
  286. package/dist/test/unit/pages/settings/permission-warnings.test.d.ts +1 -0
  287. package/dist/test/unit/pages/settings/permission-warnings.test.js +49 -0
  288. package/dist/test/unit/pages/settings/permission-warnings.test.js.map +1 -0
  289. package/dist/test/unit/pages/settings/role-editor.test.js +16 -0
  290. package/dist/test/unit/pages/settings/role-editor.test.js.map +1 -1
  291. package/dist/test/unit/pages/settings/role-preview.test.js +7 -0
  292. package/dist/test/unit/pages/settings/role-preview.test.js.map +1 -1
  293. package/dist/test/unit/pages/settings/security-attention.test.d.ts +1 -0
  294. package/dist/test/unit/pages/settings/security-attention.test.js +74 -0
  295. package/dist/test/unit/pages/settings/security-attention.test.js.map +1 -0
  296. package/dist/test/unit/sanitize-user.test.d.ts +1 -0
  297. package/dist/test/unit/sanitize-user.test.js +21 -0
  298. package/dist/test/unit/sanitize-user.test.js.map +1 -0
  299. package/dist/test/unit/signup-email-validation.test.d.ts +1 -0
  300. package/dist/test/unit/signup-email-validation.test.js +79 -0
  301. package/dist/test/unit/signup-email-validation.test.js.map +1 -0
  302. package/dist/test/unit/validation/member-invite.schema.test.js +14 -52
  303. package/dist/test/unit/validation/member-invite.schema.test.js.map +1 -1
  304. package/dist/utils/account-notifications.d.ts +5 -0
  305. package/dist/utils/account-notifications.js +8 -0
  306. package/dist/utils/account-notifications.js.map +1 -1
  307. package/dist/utils/notification-emitter.d.ts +1 -1
  308. package/dist/utils/notification-emitter.js +1 -1
  309. package/dist/utils/notification-emitter.js.map +1 -1
  310. package/dist/utils/notification-tones.d.ts +2 -1
  311. package/dist/utils/notification-tones.js +5 -1
  312. package/dist/utils/notification-tones.js.map +1 -1
  313. package/dist/utils/one-time-code.d.ts +3 -0
  314. package/dist/utils/one-time-code.js +21 -0
  315. package/dist/utils/one-time-code.js.map +1 -0
  316. package/dist/utils/sign-in-monitor.d.ts +1 -0
  317. package/dist/utils/sign-in-monitor.js +3 -2
  318. package/dist/utils/sign-in-monitor.js.map +1 -1
  319. package/dist/utils/two-factor-codes.d.ts +10 -0
  320. package/dist/utils/two-factor-codes.js +76 -0
  321. package/dist/utils/two-factor-codes.js.map +1 -0
  322. package/dist/validation/auth.schema.d.ts +17 -0
  323. package/dist/validation/auth.schema.js +17 -6
  324. package/dist/validation/auth.schema.js.map +1 -1
  325. package/dist/validation/issue-message.d.ts +1 -0
  326. package/dist/validation/issue-message.js +9 -0
  327. package/dist/validation/issue-message.js.map +1 -0
  328. package/dist/validation/member-invite.schema.d.ts +1 -25
  329. package/dist/validation/member-invite.schema.js +2 -23
  330. package/dist/validation/member-invite.schema.js.map +1 -1
  331. package/frontend-vue/dms.frontend.ts +2 -0
  332. package/frontend-vue/layers/dms-auth/app/custom-pages/auth/forgot-validation.vue +3 -0
  333. package/frontend-vue/layers/dms-auth/app/custom-pages/auth/signup.vue +105 -5
  334. package/frontend-vue/layers/dms-auth/i18n/locales/auth-en-GB.json +20 -4
  335. package/frontend-vue/layers/dms-auth/i18n/locales/auth-fr-FR.json +20 -4
  336. package/frontend-vue/layers/dms-core/app/composables/translation/useComposedText.ts +25 -0
  337. package/frontend-vue/layers/dms-core/app/composables/useFieldErrors.ts +3 -2
  338. package/frontend-vue/layers/dms-core/app/types/composed-text.ts +64 -0
  339. package/frontend-vue/layers/dms-core/app/types/menu.ts +15 -0
  340. package/frontend-vue/layers/dms-core/app/utils/composedText.ts +227 -0
  341. package/frontend-vue/layers/dms-core/app/utils/formatter.ts +49 -0
  342. package/frontend-vue/layers/dms-core/i18n/locales/core-en-GB.json +4 -1
  343. package/frontend-vue/layers/dms-core/i18n/locales/core-fr-FR.json +4 -1
  344. package/frontend-vue/layers/dms-layout/app/assets/css/main.css +20 -0
  345. package/frontend-vue/layers/dms-layout/app/build/components/layout/CommandPaletteAssistantAnswer.vue +75 -0
  346. package/frontend-vue/layers/dms-layout/app/build/components/layout/DashboardBanners.vue +17 -3
  347. package/frontend-vue/layers/dms-layout/app/build/components/layout/DashboardFrame.vue +22 -0
  348. package/frontend-vue/layers/dms-layout/app/build/components/layout/DashboardHeader.vue +24 -10
  349. package/frontend-vue/layers/dms-layout/app/build/components/layout/DashboardSidePanel.vue +139 -0
  350. package/frontend-vue/layers/dms-layout/app/build/components/layout/Footer.vue +4 -2
  351. package/frontend-vue/layers/dms-layout/app/build/components/layout/GithubStarPrompt.vue +90 -0
  352. package/frontend-vue/layers/dms-layout/app/build/components/layout/SidePanelHost.vue +17 -0
  353. package/frontend-vue/layers/dms-layout/app/build/components/notification/NotificationPopover.vue +25 -43
  354. package/frontend-vue/layers/dms-layout/app/build/components/pages/settings/members/MemberRolePicker.vue +24 -2
  355. package/frontend-vue/layers/dms-layout/app/build/components/pages/settings/notification/NotificationMatrixCategory.vue +70 -25
  356. package/frontend-vue/layers/dms-layout/app/build/components/pages/settings/notification/NotificationPreferencesForm.vue +25 -10
  357. package/frontend-vue/layers/dms-layout/app/build/components/pages/settings/notification/notificationDisplay.ts +41 -5
  358. package/frontend-vue/layers/dms-layout/app/build/components/pages/settings/profile/ProfilePreferencesSummary.vue +2 -1
  359. package/frontend-vue/layers/dms-layout/app/build/components/pages/settings/profile/ProfileSecuritySummary.vue +20 -4
  360. package/frontend-vue/layers/dms-layout/app/build/components/pages/settings/roles/RoleEditor.vue +21 -0
  361. package/frontend-vue/layers/dms-layout/app/build/components/pages/settings/roles/RolePermissionArea.vue +16 -2
  362. package/frontend-vue/layers/dms-layout/app/build/components/pages/settings/roles/RolePermissionBranch.vue +1 -0
  363. package/frontend-vue/layers/dms-layout/app/build/components/pages/settings/roles/RolePermissionLeaf.vue +13 -1
  364. package/frontend-vue/layers/dms-layout/app/build/components/pages/settings/roles/RolePermissionTree.vue +9 -0
  365. package/frontend-vue/layers/dms-layout/app/build/components/pages/settings/roles/RolePermissionWarning.vue +46 -0
  366. package/frontend-vue/layers/dms-layout/app/build/components/pages/settings/roles/role-permissions.ts +108 -29
  367. package/frontend-vue/layers/dms-layout/app/build/components/pages/settings/roles/role-types.ts +2 -0
  368. package/frontend-vue/layers/dms-layout/app/build/components/pages/settings/security/SecurityDialogFrame.vue +6 -6
  369. package/frontend-vue/layers/dms-layout/app/build/components/pages/settings/security/SecurityEmail.vue +7 -1
  370. package/frontend-vue/layers/dms-layout/app/build/components/pages/settings/security/SecuritySessions.vue +5 -4
  371. package/frontend-vue/layers/dms-layout/app/build/components/pages/settings/security/SecurityStatus.vue +4 -3
  372. package/frontend-vue/layers/dms-layout/app/build/components/pages/settings/security/SecurityTwoFactor.vue +54 -18
  373. package/frontend-vue/layers/dms-layout/app/build/components/pages/settings/shell/SettingsNav.vue +13 -8
  374. package/frontend-vue/layers/dms-layout/app/build/composables/command-palette/assistantGroups.ts +143 -0
  375. package/frontend-vue/layers/dms-layout/app/build/composables/command-palette/useCommandPaletteAssistantMode.ts +249 -0
  376. package/frontend-vue/layers/dms-layout/app/build/composables/general/useGithubStarPrompt.ts +178 -0
  377. package/frontend-vue/layers/dms-layout/app/build/composables/layout/sidePanelState.ts +191 -0
  378. package/frontend-vue/layers/dms-layout/app/build/composables/layout/useHeaderActionControls.ts +51 -0
  379. package/frontend-vue/layers/dms-layout/app/build/composables/layout/useSidePanelWidth.ts +113 -0
  380. package/frontend-vue/layers/dms-layout/app/build/composables/navigation/useCategoryNavCards.ts +17 -10
  381. package/frontend-vue/layers/dms-layout/app/build/composables/notification/useNotificationGroupsOpen.ts +45 -0
  382. package/frontend-vue/layers/dms-layout/app/build/composables/settings/profile/useProfilePreferences.ts +8 -1
  383. package/frontend-vue/layers/dms-layout/app/build/composables/settings/security/useSecurityOverview.ts +50 -3
  384. package/frontend-vue/layers/dms-layout/app/build/composables/settings/useSettingsNavigation.ts +3 -0
  385. package/frontend-vue/layers/dms-layout/app/build/utils/categoryPages.ts +1 -2
  386. package/frontend-vue/layers/dms-layout/app/build/utils/github-repository.ts +5 -0
  387. package/frontend-vue/layers/dms-layout/app/components/layout/DashboardSearch.vue +109 -7
  388. package/frontend-vue/layers/dms-layout/app/components/navigation/NavigationMenu.vue +19 -9
  389. package/frontend-vue/layers/dms-layout/app/composables/notification/useNotifications.ts +22 -40
  390. package/frontend-vue/layers/dms-layout/app/composables/useAppSidePanels.ts +96 -0
  391. package/frontend-vue/layers/dms-layout/app/composables/useCommandPaletteAssistant.ts +129 -0
  392. package/frontend-vue/layers/dms-layout/app/composables/useHeaderActions.ts +33 -11
  393. package/frontend-vue/layers/dms-layout/app/composables/useSidePanel.ts +41 -0
  394. package/frontend-vue/layers/dms-layout/app/pages/[...slug].vue +15 -0
  395. package/frontend-vue/layers/dms-layout/app/plugins/notification-stream.client.ts +1 -7
  396. package/frontend-vue/layers/dms-layout/app/plugins/side-panel-host.ts +13 -0
  397. package/frontend-vue/layers/dms-layout/app/types/page.ts +11 -1
  398. package/frontend-vue/layers/dms-layout/i18n/locales/layout-en-GB.json +43 -13
  399. package/frontend-vue/layers/dms-layout/i18n/locales/layout-fr-FR.json +43 -13
  400. package/frontend-vue/layers/dms-ui/app/build/components/form/FormLoadError.vue +45 -0
  401. package/frontend-vue/layers/dms-ui/app/build/components/modal/ModalEscHint.vue +28 -0
  402. package/frontend-vue/layers/dms-ui/app/build/components/table-view/IdentityCell.vue +36 -7
  403. package/frontend-vue/layers/dms-ui/app/build/composables/data-types/cellHelpers.ts +57 -0
  404. package/frontend-vue/layers/dms-ui/app/build/composables/data-types/metricCells.ts +19 -5
  405. package/frontend-vue/layers/dms-ui/app/build/composables/data-types/registerDefaults.ts +22 -2
  406. package/frontend-vue/layers/dms-ui/app/build/composables/data-types/twoLineCell.ts +118 -0
  407. package/frontend-vue/layers/dms-ui/app/build/composables/data-types/useColumnValueRenderer.ts +5 -3
  408. package/frontend-vue/layers/dms-ui/app/build/composables/form/floatingSaveBars.ts +38 -0
  409. package/frontend-vue/layers/dms-ui/app/build/composables/form/formRecordLoad.ts +66 -0
  410. package/frontend-vue/layers/dms-ui/app/build/composables/navigation/useNavBadges.ts +50 -9
  411. package/frontend-vue/layers/dms-ui/app/build/composables/table/useTable.ts +7 -1
  412. package/frontend-vue/layers/dms-ui/app/build/composables/table-view/utils/chrome.ts +2 -2
  413. package/frontend-vue/layers/dms-ui/app/build/types/tree.ts +14 -10
  414. package/frontend-vue/layers/dms-ui/app/build/utils/navBadge.ts +12 -0
  415. package/frontend-vue/layers/dms-ui/app/build/utils/relativeDate.ts +4 -35
  416. package/frontend-vue/layers/dms-ui/app/build/utils/tone.ts +22 -0
  417. package/frontend-vue/layers/dms-ui/app/components/activity-feed/ActivityFeed.vue +117 -82
  418. package/frontend-vue/layers/dms-ui/app/components/blocks/BannerBlock.vue +8 -5
  419. package/frontend-vue/layers/dms-ui/app/components/blocks/KeyValueListBlock.vue +38 -18
  420. package/frontend-vue/layers/dms-ui/app/components/blocks/NavCardGridBlock.vue +12 -1
  421. package/frontend-vue/layers/dms-ui/app/components/blocks/StatGroupBlock.vue +26 -23
  422. package/frontend-vue/layers/dms-ui/app/components/card/NavCard.vue +16 -1
  423. package/frontend-vue/layers/dms-ui/app/components/confirm/ConfirmModal.vue +7 -8
  424. package/frontend-vue/layers/dms-ui/app/components/form/Form.vue +28 -6
  425. package/frontend-vue/layers/dms-ui/app/components/form/components/Display.vue +5 -1
  426. package/frontend-vue/layers/dms-ui/app/components/save-bar/SaveBar.vue +4 -0
  427. package/frontend-vue/layers/dms-ui/app/components/status-pill/StatusPill.vue +7 -2
  428. package/frontend-vue/layers/dms-ui/app/components/table-view/TableView.vue +7 -2
  429. package/frontend-vue/layers/dms-ui/app/composables/form/useForm.ts +48 -34
  430. package/frontend-vue/layers/dms-ui/app/composables/table-view/types/config.ts +13 -3
  431. package/frontend-vue/layers/dms-ui/i18n/locales/ui-en-GB.json +16 -14
  432. package/frontend-vue/layers/dms-ui/i18n/locales/ui-fr-FR.json +16 -14
  433. package/frontend-vue/package.json +2 -2
  434. package/frontend-vue/pnpm-lock.yaml +5 -5
  435. package/frontend-vue/tests/activity-feed-fill-height.test.ts +107 -0
  436. package/frontend-vue/tests/category-nav-cards.test.ts +21 -13
  437. package/frontend-vue/tests/command-palette-assistant.test.ts +344 -0
  438. package/frontend-vue/tests/composed-text-blocks.test.ts +205 -0
  439. package/frontend-vue/tests/composed-text.test.ts +265 -0
  440. package/frontend-vue/tests/fixtures/dashboard-search-stub.ts +91 -0
  441. package/frontend-vue/tests/forgot-validation-resend.test.ts +234 -0
  442. package/frontend-vue/tests/form-display-options.test.ts +64 -0
  443. package/frontend-vue/tests/form-load-error.test.ts +160 -0
  444. package/frontend-vue/tests/form-saved-before-success.test.ts +110 -0
  445. package/frontend-vue/tests/github-star-prompt.test.ts +328 -0
  446. package/frontend-vue/tests/header-actions.test.ts +191 -0
  447. package/frontend-vue/tests/invites-edit-modal.test.ts +157 -0
  448. package/frontend-vue/tests/layout-banners.test.ts +56 -0
  449. package/frontend-vue/tests/member-role-picker.test.ts +26 -0
  450. package/frontend-vue/tests/menu-hidden-page.test.ts +93 -0
  451. package/frontend-vue/tests/nav-badge-tones.test.ts +274 -0
  452. package/frontend-vue/tests/nav-card-badge.test.ts +69 -0
  453. package/frontend-vue/tests/nav-card-grid-empty-category.test.ts +163 -0
  454. package/frontend-vue/tests/notification-popover-errors.test.ts +71 -37
  455. package/frontend-vue/tests/notification-preferences-groups.test.ts +268 -0
  456. package/frontend-vue/tests/notification-tone-contract.test.ts +70 -0
  457. package/frontend-vue/tests/page-fill-height.test.ts +9 -1
  458. package/frontend-vue/tests/page-no-visible-blocks.test.ts +202 -0
  459. package/frontend-vue/tests/profile-preferences-summary.test.ts +26 -2
  460. package/frontend-vue/tests/profile-security-summary.test.ts +121 -0
  461. package/frontend-vue/tests/role-permission-tree.test.ts +102 -8
  462. package/frontend-vue/tests/role-permissions.test.ts +178 -56
  463. package/frontend-vue/tests/side-panels.test.ts +470 -0
  464. package/frontend-vue/tests/signup-invitation-link.test.ts +71 -2
  465. package/frontend-vue/tests/table-actions-column-width.test.ts +51 -1
  466. package/frontend-vue/tests/table-cell-sublines.test.ts +466 -0
  467. package/frontend-vue/tests/table-metric-cells.test.ts +4 -0
  468. package/frontend-vue/tests/table-view-chrome.test.ts +2 -2
  469. package/frontend-vue/tests/vue-inventory.test.ts +1 -1
  470. package/package.json +2 -2
  471. package/skills/dms/REFERENCE.md +1 -1
  472. package/skills/dms/SKILL.md +7 -0
@@ -70,7 +70,21 @@
70
70
  "footer": {
71
71
  "navigate": "Navigate",
72
72
  "open": "Open",
73
- "close": "Close"
73
+ "close": "Close",
74
+ "send": "Send",
75
+ "askAi": "Ask AI",
76
+ "backToSearch": "Back to search"
77
+ },
78
+ "assistant": {
79
+ "placeholder": "Ask anything about your workspace…",
80
+ "ask": "Ask the assistant “{query}”",
81
+ "send": "Ask “{prompt}”",
82
+ "suggestions": "Try asking",
83
+ "emptyPrompt": "Type a question, then press Enter to send it.",
84
+ "loading": "The assistant is answering…",
85
+ "failed": "The assistant could not answer. Edit the question to try again.",
86
+ "modeAssistant": "Assistant mode. Type a question and press Enter. Tab returns to search.",
87
+ "modeSearch": "Search mode."
74
88
  }
75
89
  },
76
90
  "notification": {
@@ -86,6 +100,10 @@
86
100
  "no_content_title": "No content available",
87
101
  "no_content_message": "This page has not been configured yet. Please contact the administrator."
88
102
  },
103
+ "no_visible_blocks": {
104
+ "title": "Nothing to show for you here",
105
+ "description": "Your role doesn’t let you see any part of this page. Ask a workspace owner for access."
106
+ },
89
107
  "settings": {
90
108
  "title": "Settings",
91
109
  "intro": "Your profile, security and preferences, and the people and roles of this workspace.",
@@ -147,6 +165,8 @@
147
165
  "soon": "Soon",
148
166
  "category_switch": "All {name} notifications",
149
167
  "category_count": "{count} of {total} on",
168
+ "category_expand": "Show {name} notifications",
169
+ "category_collapse": "Hide {name} notifications",
150
170
  "locked_hint": "Required for account safety",
151
171
  "email_hint": "Only in-app notifications are available today. Email delivery is on the way.",
152
172
  "save_failed_on": "Couldn’t save — the switch was turned back on.",
@@ -261,8 +281,6 @@
261
281
  "language": "Invitation language",
262
282
  "tenant_owner": "Make workspace owner",
263
283
  "tenant_owner_description": "Owners have every permission, including billing, roles and removing members. Roles above are ignored. A workspace can have several owners.",
264
- "skip_email_validation": "Skip email validation",
265
- "skip_email_validation_description": "If enabled, the invited user will not need to verify their email address and their first and last name must be provided",
266
284
  "emails": "Email addresses",
267
285
  "emails_description": "Paste a list to invite several people with the same roles.",
268
286
  "language_description": "The language of the email and of their account.",
@@ -277,20 +295,18 @@
277
295
  "name": "Nicolas Petit"
278
296
  },
279
297
  "roles_required": "At least one role is required when the user is not an owner",
280
- "firstname_required": "First name is required when email validation is skipped",
281
- "lastname_required": "Last name is required when email validation is skipped",
282
298
  "already_member": "Already a member of this workspace",
283
299
  "header_button": "Invite members",
284
300
  "partial_title": "Invitations sent: {sent}",
285
301
  "partial_description": "{count} address was skipped: already a member or refused. | {count} addresses were skipped: already members or refused.",
286
302
  "roles_owner_hint": "Owners have every permission: the roles are ignored.",
303
+ "roles_owner_level": "{roles} amounts to owner-level access: whoever holds it can make themselves an owner. | {roles} amount to owner-level access: whoever holds them can make themselves an owner.",
287
304
  "roles_hint_empty": "Pick at least one role.",
288
305
  "roles_hint": "{roles}: {count} of {total} permissions.",
289
306
  "compare_roles": "Compare roles",
290
307
  "no_roles": "No role yet. Create one in Roles & permissions.",
291
308
  "emails_required": "Add at least one email address",
292
309
  "emails_too_many": "Invite at most 50 people at a time",
293
- "skip_validation_single_email": "Email validation can only be skipped for one person at a time",
294
310
  "failed": "The invitation could not be sent"
295
311
  },
296
312
  "action": {
@@ -337,7 +353,6 @@
337
353
  "two_factor_on": "On",
338
354
  "two_factor_off": "Off",
339
355
  "footer_count": "No members | {count} member | {count} members",
340
- "last_active_hint": "“Last active” is the last time they used the dashboard.",
341
356
  "confirm": {
342
357
  "close": "Close"
343
358
  },
@@ -378,7 +393,6 @@
378
393
  "roles": "Roles",
379
394
  "owner": "Owner",
380
395
  "language": "Language",
381
- "skip_email_validation": "Skip email validation",
382
396
  "status": "Status",
383
397
  "created_at": "Sent at",
384
398
  "expires_at": "Expires at",
@@ -389,9 +403,6 @@
389
403
  "email": "email{'@'}example.com",
390
404
  "roles": "Select roles"
391
405
  },
392
- "description": {
393
- "skip_email_validation": "If enabled, the invited user will not need to verify their email"
394
- },
395
406
  "status": {
396
407
  "pending": "Pending",
397
408
  "expired": "Expired"
@@ -425,8 +436,7 @@
425
436
  },
426
437
  "search": "Search invitations",
427
438
  "sent_by": "{date} · by {name}",
428
- "footer_count": "No invitations | {count} invitation | {count} invitations",
429
- "expiry_hint": "Invitations expire 7 days after they’re sent."
439
+ "footer_count": "No invitations | {count} invitation | {count} invitations"
430
440
  },
431
441
  "roles": {
432
442
  "table": {
@@ -489,6 +499,9 @@
489
499
  "requires": "Requires {name}",
490
500
  "auto_added": "{name} added automatically",
491
501
  "auto_added_many": "{count} added automatically",
502
+ "owner_level": "Owner-level access",
503
+ "owner_level_title": "This role amounts to owner-level access",
504
+ "owner_level_description": "Through {names}, anyone holding it can make themselves an owner or grant themselves any permission.",
492
505
  "not_grantable": "You don’t hold this permission, so you can’t grant it.",
493
506
  "search_empty": "No permission matches “{query}”.",
494
507
  "no_permissions": "No permission is registered yet.",
@@ -544,6 +557,13 @@
544
557
  "in_use": "Members or pending invites still hold this role.",
545
558
  "invalid_reassign": "Pick another role to move its members to.",
546
559
  "not_created": "The role could not be created."
560
+ },
561
+ "warning": {
562
+ "members": "Anyone with this access can change any member’s roles and make anyone an owner, themselves included. It amounts to owner-level access.",
563
+ "invites": "Anyone with this access can invite people, or change pending invitations, with any role or as owners. It amounts to owner-level access.",
564
+ "roles": "Anyone with this access can change what every role grants, their own included. It amounts to owner-level access.",
565
+ "roles_add": "Anyone with this access can create a role that grants any permission, everything included. It amounts to owner-level access.",
566
+ "roles_delete": "Anyone with this access can delete a role and move its members to any other role, a stronger one included. It amounts to owner-level access."
547
567
  }
548
568
  },
549
569
  "appearance": {
@@ -866,5 +886,15 @@
866
886
  },
867
887
  "widgets_dock": {
868
888
  "show": "Show the widgets"
889
+ },
890
+ "github_star_prompt": {
891
+ "title": "Enjoying the AntelopeJS DMS?",
892
+ "description": "The DMS is open source. If it helped you today, a GitHub star helps other developers find it.",
893
+ "star": "Star on GitHub",
894
+ "later": "Later",
895
+ "close": "Don't show again"
896
+ },
897
+ "side_panel": {
898
+ "resize": "Resize the panel"
869
899
  }
870
900
  }
@@ -70,7 +70,21 @@
70
70
  "footer": {
71
71
  "navigate": "Naviguer",
72
72
  "open": "Ouvrir",
73
- "close": "Fermer"
73
+ "close": "Fermer",
74
+ "send": "Envoyer",
75
+ "askAi": "Demander à l'IA",
76
+ "backToSearch": "Retour à la recherche"
77
+ },
78
+ "assistant": {
79
+ "placeholder": "Posez une question sur votre espace de travail…",
80
+ "ask": "Demander à l'assistant « {query} »",
81
+ "send": "Demander « {prompt} »",
82
+ "suggestions": "Essayez de demander",
83
+ "emptyPrompt": "Saisissez une question, puis appuyez sur Entrée pour l'envoyer.",
84
+ "loading": "L'assistant répond…",
85
+ "failed": "L'assistant n'a pas pu répondre. Modifiez la question pour réessayer.",
86
+ "modeAssistant": "Mode assistant. Saisissez une question et appuyez sur Entrée. Tab revient à la recherche.",
87
+ "modeSearch": "Mode recherche."
74
88
  }
75
89
  },
76
90
  "notification": {
@@ -86,6 +100,10 @@
86
100
  "no_content_title": "Aucun contenu disponible",
87
101
  "no_content_message": "Cette page n'a pas encore été configurée. Veuillez contacter l'administrateur."
88
102
  },
103
+ "no_visible_blocks": {
104
+ "title": "Rien à afficher pour vous ici",
105
+ "description": "Votre rôle ne vous permet de voir aucune partie de cette page. Demandez l’accès à un propriétaire de l’espace."
106
+ },
89
107
  "settings": {
90
108
  "title": "Paramètres",
91
109
  "intro": "Votre profil, votre sécurité et vos préférences, ainsi que les personnes et les rôles de cet espace.",
@@ -147,6 +165,8 @@
147
165
  "soon": "Bientôt",
148
166
  "category_switch": "Toutes les notifications {name}",
149
167
  "category_count": "{count} sur {total} actives",
168
+ "category_expand": "Afficher les notifications {name}",
169
+ "category_collapse": "Masquer les notifications {name}",
150
170
  "locked_hint": "Requis pour la sécurité du compte",
151
171
  "email_hint": "Seules les notifications dans l’app sont disponibles aujourd’hui. L’envoi par e-mail arrive bientôt.",
152
172
  "save_failed_on": "Échec de l’enregistrement — l’interrupteur a été réactivé.",
@@ -266,8 +286,6 @@
266
286
  "language": "Langue de l’invitation",
267
287
  "tenant_owner": "Rendre propriétaire de l’espace",
268
288
  "tenant_owner_description": "Les propriétaires ont toutes les permissions, y compris la facturation, les rôles et le retrait de membres. Les rôles ci-dessus sont ignorés. Un espace peut avoir plusieurs propriétaires.",
269
- "skip_email_validation": "Ignorer la validation e-mail",
270
- "skip_email_validation_description": "Si activé, l'utilisateur invité n'aura pas besoin de vérifier son adresse e-mail et son prénom et son nom doivent être renseignés",
271
289
  "emails": "Adresses e-mail",
272
290
  "emails_description": "Collez une liste pour inviter plusieurs personnes avec les mêmes rôles.",
273
291
  "language_description": "La langue de l’e-mail et de leur compte.",
@@ -282,19 +300,17 @@
282
300
  "name": "Nicolas Petit"
283
301
  },
284
302
  "roles_required": "Au moins un rôle est requis lorsque l'utilisateur n'est pas propriétaire",
285
- "firstname_required": "Le prénom est requis lorsque la validation e-mail est ignorée",
286
- "lastname_required": "Le nom est requis lorsque la validation e-mail est ignorée",
287
303
  "header_button": "Inviter des membres",
288
304
  "partial_title": "Invitations envoyées : {sent}",
289
305
  "partial_description": "{count} adresse ignorée : déjà membre ou refusée. | {count} adresses ignorées : déjà membres ou refusées.",
290
306
  "roles_owner_hint": "Les propriétaires ont toutes les permissions : les rôles sont ignorés.",
307
+ "roles_owner_level": "{roles} revient à un accès de propriétaire : qui l’a peut se nommer propriétaire. | {roles} reviennent à un accès de propriétaire : qui les a peut se nommer propriétaire.",
291
308
  "roles_hint_empty": "Choisissez au moins un rôle.",
292
309
  "roles_hint": "{roles} : {count} permissions sur {total}.",
293
310
  "compare_roles": "Comparer les rôles",
294
311
  "no_roles": "Aucun rôle pour l’instant. Créez-en un dans Rôles et permissions.",
295
312
  "emails_required": "Ajoutez au moins une adresse e-mail",
296
313
  "emails_too_many": "Invitez au plus 50 personnes à la fois",
297
- "skip_validation_single_email": "La validation e-mail ne peut être ignorée que pour une personne à la fois",
298
314
  "failed": "L’invitation n’a pas pu être envoyée"
299
315
  },
300
316
  "action": {
@@ -341,7 +357,6 @@
341
357
  "two_factor_on": "Activé",
342
358
  "two_factor_off": "Désactivé",
343
359
  "footer_count": "Aucun membre | {count} membre | {count} membres",
344
- "last_active_hint": "« Dernière activité » est la dernière utilisation du tableau de bord.",
345
360
  "confirm": {
346
361
  "close": "Fermer"
347
362
  },
@@ -382,7 +397,6 @@
382
397
  "roles": "Rôles",
383
398
  "owner": "Propriétaire",
384
399
  "language": "Langue",
385
- "skip_email_validation": "Ignorer la validation e-mail",
386
400
  "status": "Statut",
387
401
  "created_at": "Envoyée le",
388
402
  "expires_at": "Expire le",
@@ -393,9 +407,6 @@
393
407
  "email": "email{'@'}exemple.com",
394
408
  "roles": "Sélectionner des rôles"
395
409
  },
396
- "description": {
397
- "skip_email_validation": "Si activé, l'utilisateur invité n'aura pas besoin de vérifier son e-mail"
398
- },
399
410
  "status": {
400
411
  "pending": "En attente",
401
412
  "expired": "Expirée"
@@ -429,8 +440,7 @@
429
440
  },
430
441
  "search": "Rechercher des invitations",
431
442
  "sent_by": "{date} · par {name}",
432
- "footer_count": "Aucune invitation | {count} invitation | {count} invitations",
433
- "expiry_hint": "Les invitations expirent 7 jours après leur envoi."
443
+ "footer_count": "Aucune invitation | {count} invitation | {count} invitations"
434
444
  },
435
445
  "roles": {
436
446
  "table": {
@@ -493,6 +503,9 @@
493
503
  "requires": "Nécessite {name}",
494
504
  "auto_added": "{name} ajoutée automatiquement",
495
505
  "auto_added_many": "{count} ajoutées automatiquement",
506
+ "owner_level": "Accès propriétaire",
507
+ "owner_level_title": "Ce rôle revient à un accès de propriétaire",
508
+ "owner_level_description": "Avec {names}, toute personne qui a ce rôle peut se nommer propriétaire ou s’accorder n’importe quelle permission.",
496
509
  "not_grantable": "Vous n’avez pas cette permission, vous ne pouvez donc pas l’accorder.",
497
510
  "search_empty": "Aucune permission ne correspond à « {query} ».",
498
511
  "no_permissions": "Aucune permission n’est encore enregistrée.",
@@ -548,6 +561,13 @@
548
561
  "in_use": "Des membres ou des invitations en attente ont encore ce rôle.",
549
562
  "invalid_reassign": "Choisissez un autre rôle vers lequel déplacer ses membres.",
550
563
  "not_created": "Le rôle n’a pas pu être créé."
564
+ },
565
+ "warning": {
566
+ "members": "Toute personne ayant cet accès peut modifier les rôles de n’importe quel membre et nommer n’importe qui propriétaire, elle-même comprise. Cela revient à un accès de propriétaire.",
567
+ "invites": "Toute personne ayant cet accès peut inviter quelqu’un, ou modifier une invitation en attente, avec n’importe quel rôle ou comme propriétaire. Cela revient à un accès de propriétaire.",
568
+ "roles": "Toute personne ayant cet accès peut modifier ce que chaque rôle accorde, y compris le sien. Cela revient à un accès de propriétaire.",
569
+ "roles_add": "Toute personne ayant cet accès peut créer un rôle qui accorde n’importe quelle permission, y compris toutes. Cela revient à un accès de propriétaire.",
570
+ "roles_delete": "Toute personne ayant cet accès peut supprimer un rôle et déplacer ses membres vers n’importe quel autre rôle, y compris un rôle plus fort. Cela revient à un accès de propriétaire."
551
571
  }
552
572
  },
553
573
  "appearance": {
@@ -870,5 +890,15 @@
870
890
  },
871
891
  "widgets_dock": {
872
892
  "show": "Afficher les widgets"
893
+ },
894
+ "github_star_prompt": {
895
+ "title": "Vous appréciez AntelopeJS DMS ?",
896
+ "description": "Le DMS est open source. S'il vous a aidé aujourd'hui, une étoile GitHub aide d'autres développeurs à le découvrir.",
897
+ "star": "Mettre une étoile sur GitHub",
898
+ "later": "Plus tard",
899
+ "close": "Ne plus afficher"
900
+ },
901
+ "side_panel": {
902
+ "resize": "Redimensionner le panneau"
873
903
  }
874
904
  }
@@ -0,0 +1,45 @@
1
+ <script setup lang="ts">
2
+ import DmsEmptyState from "../../../components/empty-state/EmptyState.vue";
3
+ import type { FormLoadFailure } from "../../composables/form/formRecordLoad";
4
+
5
+ // What a form shows instead of its fields when the record it edits did not
6
+ // load: empty fields would read as the record, and a save from them would
7
+ // replace values the form never showed.
8
+ interface FormLoadErrorProps {
9
+ failure: FormLoadFailure;
10
+ /** Set while the record is being loaded again. */
11
+ retrying?: boolean;
12
+ }
13
+
14
+ interface FormLoadErrorEmits {
15
+ (e: "retry"): void;
16
+ }
17
+
18
+ const props = withDefaults(defineProps<FormLoadErrorProps>(), {
19
+ retrying: false,
20
+ });
21
+ const emit = defineEmits<FormLoadErrorEmits>();
22
+
23
+ const { t } = useI18n();
24
+ </script>
25
+
26
+ <template>
27
+ <DmsEmptyState
28
+ size="md"
29
+ :variant="props.failure === 'forbidden' ? 'no-access' : 'error'"
30
+ :title="t(`dms.form.load_error.${props.failure}_title`)"
31
+ :description="t(`dms.form.load_error.${props.failure}_description`)"
32
+ >
33
+ <template #actions>
34
+ <UButton
35
+ :label="t('dms.form.load_error.retry')"
36
+ icon="i-ph-arrows-clockwise"
37
+ color="neutral"
38
+ variant="outline"
39
+ size="sm"
40
+ :loading="props.retrying"
41
+ @click="emit('retry')"
42
+ />
43
+ </template>
44
+ </DmsEmptyState>
45
+ </template>
@@ -0,0 +1,28 @@
1
+ <script setup lang="ts">
2
+ // The "Esc to cancel" hint at the start of a modal footer. It takes the room
3
+ // the buttons leave and shows only when it fits there whole: long button
4
+ // labels push it out instead of squeezing it onto two lines past the edge.
5
+ interface ModalEscHintProps {
6
+ label: string;
7
+ }
8
+
9
+ const props = defineProps<ModalEscHintProps>();
10
+ </script>
11
+
12
+ <template>
13
+ <!-- A one-line wrapping row clipped to its first line: the empty marker
14
+ holds that line, so a hint wider than the room wraps to the hidden second
15
+ line rather than overflow the first. -->
16
+ <span
17
+ class="me-auto flex h-5 min-w-0 flex-1 flex-wrap overflow-hidden"
18
+ data-modal-esc-hint
19
+ >
20
+ <span aria-hidden="true" class="h-5 w-0" />
21
+ <span
22
+ class="text-dimmed flex h-5 items-center gap-1.5 text-xs whitespace-nowrap"
23
+ >
24
+ <UKbd value="Esc" size="sm" />
25
+ {{ props.label }}
26
+ </span>
27
+ </span>
28
+ </template>
@@ -5,7 +5,9 @@ import { useFileReadUrls } from "../../../composables/useFileReadUrls";
5
5
  /**
6
6
  * The `identity` cell of a table: an avatar (or an icon tile), a name with an
7
7
  * optional "You" tag and status badges, and a secondary line (an address).
8
- * Rendered by the `identity` data type, which reads the extras off the row.
8
+ * A row without a name may stand as a muted `emptyLabel` and an `emptyIcon`
9
+ * tile ("Automatic" and a robot). Rendered by the `identity` data type, which
10
+ * reads the extras off the row.
9
11
  */
10
12
  interface IdentityCellBadge {
11
13
  label: string;
@@ -18,6 +20,8 @@ interface IdentityCellProps {
18
20
  title?: string;
19
21
  /** Secondary line under the title. */
20
22
  subtitle?: string;
23
+ /** Text classes of the secondary line (its tone). */
24
+ subtitleClass?: string;
21
25
  /** Image value (`{ key }`, resolved through the file API) or a URL. */
22
26
  avatar?: { key: string; alt?: string } | string | null;
23
27
  /** Icon drawn in a tile instead of an avatar. */
@@ -30,17 +34,24 @@ interface IdentityCellProps {
30
34
  badges?: IdentityCellBadge[];
31
35
  /** Storage the avatar's file key lives in. */
32
36
  storage?: string;
37
+ /** Name drawn, muted, when there is no title. */
38
+ emptyLabel?: string;
39
+ /** Icon tile drawn when there is no title; `icon` otherwise. */
40
+ emptyIcon?: string;
33
41
  }
34
42
 
35
43
  const props = withDefaults(defineProps<IdentityCellProps>(), {
36
44
  title: "",
37
45
  subtitle: "",
46
+ subtitleClass: "text-dimmed",
38
47
  avatar: null,
39
48
  icon: undefined,
40
49
  selfId: undefined,
41
50
  selfLabel: undefined,
42
51
  badges: () => [],
43
52
  storage: undefined,
53
+ emptyLabel: undefined,
54
+ emptyIcon: undefined,
44
55
  });
45
56
 
46
57
  const { user } = useCurrentUser();
@@ -49,7 +60,22 @@ const { getUrl, resolve } = useFileReadUrls(props.storage);
49
60
  const MAX_INITIALS = 2;
50
61
  const INITIALS_SPLIT = /[\s.@_-]+/;
51
62
 
63
+ const isEmpty = computed(
64
+ () => !props.title && !!(props.emptyLabel || props.emptyIcon),
65
+ );
52
66
  const label = computed(() => props.title || props.subtitle);
67
+ const name = computed(() =>
68
+ isEmpty.value && props.emptyLabel ? props.emptyLabel : label.value,
69
+ );
70
+ const tileIcon = computed(() =>
71
+ isEmpty.value ? (props.emptyIcon ?? props.icon) : props.icon,
72
+ );
73
+ // Without a title the subtitle stands as the name, unless an empty label does.
74
+ const hasSubtitleLine = computed(
75
+ () =>
76
+ !!props.subtitle &&
77
+ (!!props.title || (isEmpty.value && !!props.emptyLabel)),
78
+ );
53
79
  const isSelf = computed(
54
80
  () => !!props.selfId && props.selfId === user.value?._id,
55
81
  );
@@ -79,10 +105,10 @@ const initials = computed(() =>
79
105
  ellipsis, the full label in their tooltip), then the name. -->
80
106
  <div class="flex min-w-0 items-center gap-2.5">
81
107
  <span
82
- v-if="props.icon"
108
+ v-if="tileIcon"
83
109
  class="bg-accented text-toned grid size-7 shrink-0 place-items-center rounded-[7px]"
84
110
  >
85
- <UIcon :name="props.icon" class="size-3.5" />
111
+ <UIcon :name="tileIcon" class="size-3.5" />
86
112
  </span>
87
113
  <UAvatar
88
114
  v-else
@@ -94,9 +120,10 @@ const initials = computed(() =>
94
120
  />
95
121
  <div class="min-w-0">
96
122
  <span
97
- class="text-highlighted flex min-w-0 items-center gap-1.5 leading-[1.3] font-semibold"
123
+ class="flex min-w-0 items-center gap-1.5 leading-[1.3]"
124
+ :class="isEmpty ? 'text-muted' : 'text-highlighted font-semibold'"
98
125
  >
99
- <span class="truncate" :title="label">{{ label }}</span>
126
+ <span class="truncate" :title="name">{{ name }}</span>
100
127
  <span
101
128
  v-if="isSelf && props.selfLabel"
102
129
  class="text-dimmed shrink-0 font-mono text-[10px] font-semibold tracking-[0.06em] uppercase"
@@ -116,8 +143,10 @@ const initials = computed(() =>
116
143
  />
117
144
  </span>
118
145
  <span
119
- v-if="props.title && props.subtitle"
120
- class="text-dimmed block truncate text-xs leading-[1.2]"
146
+ v-if="hasSubtitleLine"
147
+ class="block truncate text-xs leading-[1.2]"
148
+ :class="props.subtitleClass"
149
+ :title="props.subtitle"
121
150
  >
122
151
  {{ props.subtitle }}
123
152
  </span>
@@ -1,4 +1,9 @@
1
1
  import { get } from "@nuxt/ui/runtime/utils/index.js";
2
+ import type { BlockText } from "../../../../../dms-core/app/types/composed-text";
3
+ import {
4
+ type ComposableText,
5
+ isComposedText,
6
+ } from "../../../../../dms-core/app/utils/composedText";
2
7
 
3
8
  // What the cell data types share: reading a sibling field off the row, and
4
9
  // the text tones a cell takes.
@@ -37,3 +42,55 @@ export const toneClass = (
37
42
  tone: string | undefined,
38
43
  fallback = "default",
39
44
  ): string => CELL_TONES[tone ?? fallback] ?? CELL_TONES[fallback]!;
45
+
46
+ /**
47
+ * A cell's secondary line with its tone, as a row field holds it. Mirror of
48
+ * `CellSubline` from `@antelopejs/interface-dms/base/table-view`.
49
+ */
50
+ export interface CellSubline {
51
+ text: BlockText;
52
+ tone?: string;
53
+ }
54
+
55
+ /** A secondary line written in the reader's language, ready to draw. */
56
+ export interface ResolvedSubline {
57
+ text: string;
58
+ /** The row's own tone, when it gives one. */
59
+ tone?: string;
60
+ }
61
+
62
+ /** How a display reads the row field of its secondary line. */
63
+ export interface SublineReading {
64
+ processText: (text: ComposableText) => string;
65
+ /**
66
+ * Whether a bare string is a block text (`$`-prefixed for an i18n key)
67
+ * rather than data drawn as written (an address under a name).
68
+ */
69
+ isStringTranslated: boolean;
70
+ }
71
+
72
+ const isCellSubline = (value: unknown): value is CellSubline =>
73
+ typeof value === "object" &&
74
+ value !== null &&
75
+ "text" in value &&
76
+ !isComposedText(value);
77
+
78
+ const toSubline = (text: string, tone?: string): ResolvedSubline | undefined =>
79
+ text ? { text, tone } : undefined;
80
+
81
+ /**
82
+ * The secondary line a row field holds — a string, a composed text, or a text
83
+ * and its tone — or nothing for an empty field.
84
+ */
85
+ export function readSubline(
86
+ value: unknown,
87
+ { processText, isStringTranslated }: SublineReading,
88
+ ): ResolvedSubline | undefined {
89
+ if (isCellSubline(value)) {
90
+ return toSubline(processText(value.text), value.tone);
91
+ }
92
+ if (isComposedText(value)) return toSubline(processText(value));
93
+ const plain = stringOf(value);
94
+ if (!plain) return undefined;
95
+ return toSubline(isStringTranslated ? processText(plain) : plain);
96
+ }
@@ -2,7 +2,8 @@ import { defineAsyncComponent, h } from "vue";
2
2
  import type { DataType } from "#dms-core/app/composables/data-types/useDataType";
3
3
  import StatusPill from "../../../components/status-pill/StatusPill.vue";
4
4
  import MonoCell from "../../components/table/MonoCell.vue";
5
- import { readRowField, stringOf, toneClass, type Row } from "./cellHelpers";
5
+ import { useComposedText } from "../../../../../dms-core/app/composables/translation/useComposedText";
6
+ import { readRowField, readSubline, toneClass, type Row } from "./cellHelpers";
6
7
 
7
8
  const Sparkline = defineAsyncComponent(
8
9
  () => import("../../../components/chart/internal/Sparkline.vue"),
@@ -21,6 +22,8 @@ interface SelectItemOption {
21
22
  interface StatusPillOptions {
22
23
  tones?: Record<string, string>;
23
24
  subField?: string;
25
+ /** Tone of the line under the pill when the row gives none. */
26
+ subTone?: string;
24
27
  liveValues?: string[];
25
28
  /** The column's own type options: a select's items name the pill. */
26
29
  typeOptions?: { items?: SelectItemOption[] };
@@ -28,10 +31,12 @@ interface StatusPillOptions {
28
31
 
29
32
  /**
30
33
  * `status_pill`: a tinted pill led by a dot, in the tone the value maps to,
31
- * with an optional line under it in the same tone (a failure's cause).
34
+ * with an optional line under it (a failure's cause, a composed "retry Oct
35
+ * 10") in the row's tone, else `subTone`, else the pill's.
32
36
  */
33
37
  function renderStatusPill(value: unknown, options: unknown, row: Row) {
34
38
  const { processI18n } = useTranslation();
39
+ const { processText } = useComposedText();
35
40
  const opts = (options ?? {}) as StatusPillOptions;
36
41
  const key = String(value);
37
42
  const item = opts.typeOptions?.items?.find(
@@ -44,14 +49,23 @@ function renderStatusPill(value: unknown, options: unknown, row: Row) {
44
49
  icon: item?.icon,
45
50
  dot: opts.liveValues?.includes(key) ? "live" : "static",
46
51
  });
47
- const sub = stringOf(readRowField(row, opts.subField));
52
+ const sub = readSubline(readRowField(row, opts.subField), {
53
+ processText,
54
+ isStringTranslated: true,
55
+ });
48
56
  if (!sub) return pill;
49
57
  return h("span", { class: "flex min-w-0 flex-col items-start gap-0.5" }, [
50
58
  pill,
51
59
  h(
52
60
  "span",
53
- { class: ["max-w-full truncate text-xs", toneClass(tone, "muted")] },
54
- processI18n(sub),
61
+ {
62
+ class: [
63
+ "max-w-full truncate text-xs",
64
+ toneClass(sub.tone ?? opts.subTone ?? tone, "muted"),
65
+ ],
66
+ title: sub.text,
67
+ },
68
+ sub.text,
55
69
  ),
56
70
  ]);
57
71
  }
@@ -10,11 +10,14 @@ import { mapRelationBeforeState, sameRelationValue } from "./relationValue";
10
10
  import {
11
11
  isSet,
12
12
  readRowField,
13
+ readSubline,
13
14
  type Row,
14
15
  stringOf,
15
16
  toneClass,
16
17
  } from "./cellHelpers";
17
18
  import { registerMetricCellTypes } from "./metricCells";
19
+ import { registerTwoLineCellType } from "./twoLineCell";
20
+ import { useComposedText } from "../../../../../dms-core/app/composables/translation/useComposedText";
18
21
  import StatusPill from "../../../components/status-pill/StatusPill.vue";
19
22
  import IdentityCell from "../../components/table-view/IdentityCell.vue";
20
23
  import {
@@ -381,10 +384,15 @@ interface IdentityOptions {
381
384
  avatarField?: string;
382
385
  icon?: string;
383
386
  subtitleField?: string;
387
+ subtitleTone?: string;
384
388
  selfField?: string;
385
389
  selfLabel?: string;
386
390
  badges?: IdentityBadgeOption[];
387
391
  storage?: string;
392
+ /** Name drawn, muted, for a row without a value. */
393
+ emptyLabel?: string;
394
+ /** Icon tile of a row without a value. */
395
+ emptyIcon?: string;
388
396
  }
389
397
 
390
398
  const matchesBadge = (badge: IdentityBadgeOption, value: unknown): boolean =>
@@ -394,17 +402,28 @@ const matchesBadge = (badge: IdentityBadgeOption, value: unknown): boolean =>
394
402
 
395
403
  /**
396
404
  * `identity`: avatar or icon tile, the value as the name, a "You" tag on the
397
- * signed-in user's row, badges and a secondary line, all read off the row.
405
+ * signed-in user's row, badges and a secondary line (an address as written,
406
+ * or a composed text in its tone), all read off the row; `emptyLabel` and
407
+ * `emptyIcon` stand for a row without a value.
398
408
  */
399
409
  function renderIdentity(value: unknown, options: unknown, row: Row) {
400
410
  const { processI18n } = useTranslation();
411
+ const { processText } = useComposedText();
401
412
  const opts = (options ?? {}) as IdentityOptions;
402
413
  const badges = (opts.badges ?? [])
403
414
  .filter((badge) => matchesBadge(badge, readRowField(row, badge.field)))
404
415
  .map((badge) => ({ label: processI18n(badge.label), color: badge.tone }));
416
+ // An address or an id is data: only a composed text is translated.
417
+ const subtitle = readSubline(readRowField(row, opts.subtitleField), {
418
+ processText,
419
+ isStringTranslated: false,
420
+ });
405
421
  return h(IdentityCell, {
406
422
  title: stringOf(value) ?? "",
407
- subtitle: stringOf(readRowField(row, opts.subtitleField)) ?? "",
423
+ subtitle: subtitle?.text ?? "",
424
+ subtitleClass: toneClass(subtitle?.tone ?? opts.subtitleTone, "dimmed"),
425
+ emptyLabel: opts.emptyLabel ? processI18n(opts.emptyLabel) : undefined,
426
+ emptyIcon: opts.emptyIcon,
408
427
  avatar: readRowField(row, opts.avatarField) as
409
428
  | { key: string }
410
429
  | string
@@ -843,5 +862,6 @@ export function registerDefaultDataTypes() {
843
862
  registerDisplayOnlyTypes(registerDataType);
844
863
  registerCellTypes(registerDataType);
845
864
  registerMetricCellTypes(registerDataType);
865
+ registerTwoLineCellType(registerDataType);
846
866
  registerFieldTypes(registerDataType);
847
867
  }