@antelopejs/dms 0.6.2 → 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 (444) hide show
  1. package/CHANGELOG.md +22 -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/nav-badges.d.ts +6 -4
  27. package/dist/implementations/dms/nav-badges.js +6 -5
  28. package/dist/implementations/dms/nav-badges.js.map +1 -1
  29. package/dist/implementations/dms/page.d.ts +1 -0
  30. package/dist/implementations/dms/page.js +46 -8
  31. package/dist/implementations/dms/page.js.map +1 -1
  32. package/dist/implementations/dms/permission-preview.d.ts +1 -1
  33. package/dist/implementations/dms/permission-preview.js +9 -4
  34. package/dist/implementations/dms/permission-preview.js.map +1 -1
  35. package/dist/implementations/dms-auth/index.d.ts +3 -2
  36. package/dist/implementations/dms-auth/index.js +39 -35
  37. package/dist/implementations/dms-auth/index.js.map +1 -1
  38. package/dist/implementations/dms-auth/token-session.d.ts +3 -0
  39. package/dist/implementations/dms-auth/token-session.js +22 -0
  40. package/dist/implementations/dms-auth/token-session.js.map +1 -0
  41. package/dist/implementations/dms-notifications/index.d.ts +0 -1
  42. package/dist/implementations/dms-notifications/index.js +0 -7
  43. package/dist/implementations/dms-notifications/index.js.map +1 -1
  44. package/dist/pages/settings/settings-index.js +3 -2
  45. package/dist/pages/settings/settings-index.js.map +1 -1
  46. package/dist/pages/settings/users/account-activity-feed.d.ts +1 -1
  47. package/dist/pages/settings/users/account-activity-feed.js +1 -1
  48. package/dist/pages/settings/users/account-activity-feed.js.map +1 -1
  49. package/dist/pages/settings/users/account-activity.d.ts +1 -1
  50. package/dist/pages/settings/users/account-activity.js +1 -1
  51. package/dist/pages/settings/users/account-activity.js.map +1 -1
  52. package/dist/pages/settings/users/account-credentials.d.ts +3 -0
  53. package/dist/pages/settings/users/account-credentials.js +2 -0
  54. package/dist/pages/settings/users/account-credentials.js.map +1 -1
  55. package/dist/pages/settings/users/current-password.d.ts +1 -1
  56. package/dist/pages/settings/users/current-password.js +23 -2
  57. package/dist/pages/settings/users/current-password.js.map +1 -1
  58. package/dist/pages/settings/users/email-change.d.ts +1 -1
  59. package/dist/pages/settings/users/email-change.js +33 -26
  60. package/dist/pages/settings/users/email-change.js.map +1 -1
  61. package/dist/pages/settings/users/invite-resend.js +0 -1
  62. package/dist/pages/settings/users/invite-resend.js.map +1 -1
  63. package/dist/pages/settings/users/invites.d.ts +1 -2
  64. package/dist/pages/settings/users/invites.js +21 -19
  65. package/dist/pages/settings/users/invites.js.map +1 -1
  66. package/dist/pages/settings/users/member-invite-batch.js +0 -1
  67. package/dist/pages/settings/users/member-invite-batch.js.map +1 -1
  68. package/dist/pages/settings/users/member-invite-form.js +10 -22
  69. package/dist/pages/settings/users/member-invite-form.js.map +1 -1
  70. package/dist/pages/settings/users/member-role-options.d.ts +6 -4
  71. package/dist/pages/settings/users/member-role-options.js +15 -4
  72. package/dist/pages/settings/users/member-role-options.js.map +1 -1
  73. package/dist/pages/settings/users/members.d.ts +2 -3
  74. package/dist/pages/settings/users/members.js +7 -12
  75. package/dist/pages/settings/users/members.js.map +1 -1
  76. package/dist/pages/settings/users/notifications.d.ts +1 -8
  77. package/dist/pages/settings/users/notifications.js +6 -38
  78. package/dist/pages/settings/users/notifications.js.map +1 -1
  79. package/dist/pages/settings/users/permission-tree-nodes.d.ts +1 -1
  80. package/dist/pages/settings/users/permission-tree-nodes.js +23 -9
  81. package/dist/pages/settings/users/permission-tree-nodes.js.map +1 -1
  82. package/dist/pages/settings/users/permission-warnings.d.ts +7 -0
  83. package/dist/pages/settings/users/permission-warnings.js +42 -0
  84. package/dist/pages/settings/users/permission-warnings.js.map +1 -0
  85. package/dist/pages/settings/users/profile-helpers.d.ts +1 -3
  86. package/dist/pages/settings/users/profile-helpers.js +0 -16
  87. package/dist/pages/settings/users/profile-helpers.js.map +1 -1
  88. package/dist/pages/settings/users/role-editor-store.js +6 -3
  89. package/dist/pages/settings/users/role-editor-store.js.map +1 -1
  90. package/dist/pages/settings/users/role-editor.d.ts +2 -1
  91. package/dist/pages/settings/users/role-editor.js +8 -4
  92. package/dist/pages/settings/users/role-editor.js.map +1 -1
  93. package/dist/pages/settings/users/role-preview.js +2 -1
  94. package/dist/pages/settings/users/role-preview.js.map +1 -1
  95. package/dist/pages/settings/users/roles.js +5 -1
  96. package/dist/pages/settings/users/roles.js.map +1 -1
  97. package/dist/pages/settings/users/security-attention.d.ts +4 -0
  98. package/dist/pages/settings/users/security-attention.js +23 -7
  99. package/dist/pages/settings/users/security-attention.js.map +1 -1
  100. package/dist/pages/settings/users/security.d.ts +2 -1
  101. package/dist/pages/settings/users/security.js +13 -2
  102. package/dist/pages/settings/users/security.js.map +1 -1
  103. package/dist/pages/settings/users/two-factor-operations.d.ts +2 -1
  104. package/dist/pages/settings/users/two-factor-operations.js +28 -29
  105. package/dist/pages/settings/users/two-factor-operations.js.map +1 -1
  106. package/dist/routes/auth/forgot-password.js +3 -0
  107. package/dist/routes/auth/forgot-password.js.map +1 -1
  108. package/dist/routes/auth/index.d.ts +1 -0
  109. package/dist/routes/auth/index.js +1 -0
  110. package/dist/routes/auth/index.js.map +1 -1
  111. package/dist/routes/auth/invite.js +28 -4
  112. package/dist/routes/auth/invite.js.map +1 -1
  113. package/dist/routes/auth/login-throttle.d.ts +2 -0
  114. package/dist/routes/auth/login-throttle.js +5 -4
  115. package/dist/routes/auth/login-throttle.js.map +1 -1
  116. package/dist/routes/auth/request-2fa-email.js +6 -18
  117. package/dist/routes/auth/request-2fa-email.js.map +1 -1
  118. package/dist/routes/auth/reset-code.d.ts +3 -0
  119. package/dist/routes/auth/reset-code.js +37 -0
  120. package/dist/routes/auth/reset-code.js.map +1 -0
  121. package/dist/routes/auth/reset-password.d.ts +2 -2
  122. package/dist/routes/auth/reset-password.js +5 -10
  123. package/dist/routes/auth/reset-password.js.map +1 -1
  124. package/dist/routes/auth/signup.js +10 -32
  125. package/dist/routes/auth/signup.js.map +1 -1
  126. package/dist/routes/auth/two-factor-throttle.d.ts +5 -0
  127. package/dist/routes/auth/two-factor-throttle.js +81 -0
  128. package/dist/routes/auth/two-factor-throttle.js.map +1 -0
  129. package/dist/routes/auth/validate-forgot-password-token.js +2 -8
  130. package/dist/routes/auth/validate-forgot-password-token.js.map +1 -1
  131. package/dist/routes/auth/validate-invite-token.d.ts +1 -0
  132. package/dist/routes/auth/validate-invite-token.js +11 -0
  133. package/dist/routes/auth/validate-invite-token.js.map +1 -0
  134. package/dist/routes/auth/verify-2fa.js +10 -13
  135. package/dist/routes/auth/verify-2fa.js.map +1 -1
  136. package/dist/routes/auth.d.ts +1 -0
  137. package/dist/routes/auth.js +11 -1
  138. package/dist/routes/auth.js.map +1 -1
  139. package/dist/test/helpers/auth.d.ts +0 -1
  140. package/dist/test/helpers/auth.js +0 -1
  141. package/dist/test/helpers/auth.js.map +1 -1
  142. package/dist/test/helpers/emails.d.ts +10 -0
  143. package/dist/test/helpers/emails.js +36 -0
  144. package/dist/test/helpers/emails.js.map +1 -0
  145. package/dist/test/helpers/fixtures.d.ts +0 -1
  146. package/dist/test/helpers/fixtures.js +1 -2
  147. package/dist/test/helpers/fixtures.js.map +1 -1
  148. package/dist/test/helpers/page-access.d.ts +1 -0
  149. package/dist/test/helpers/page-access.js +6 -1
  150. package/dist/test/helpers/page-access.js.map +1 -1
  151. package/dist/test/integration/auth/current-password.test.d.ts +1 -0
  152. package/dist/test/integration/auth/current-password.test.js +65 -0
  153. package/dist/test/integration/auth/current-password.test.js.map +1 -0
  154. package/dist/test/integration/auth/password-reset.test.d.ts +1 -0
  155. package/dist/test/integration/auth/password-reset.test.js +126 -0
  156. package/dist/test/integration/auth/password-reset.test.js.map +1 -0
  157. package/dist/test/integration/auth/session-revocation.test.d.ts +1 -0
  158. package/dist/test/integration/auth/session-revocation.test.js +45 -0
  159. package/dist/test/integration/auth/session-revocation.test.js.map +1 -0
  160. package/dist/test/integration/auth/two-factor-codes.test.d.ts +1 -0
  161. package/dist/test/integration/auth/two-factor-codes.test.js +335 -0
  162. package/dist/test/integration/auth/two-factor-codes.test.js.map +1 -0
  163. package/dist/test/integration/auth/two-factor-password.test.js +5 -1
  164. package/dist/test/integration/auth/two-factor-password.test.js.map +1 -1
  165. package/dist/test/integration/auth/two-factor-token.test.d.ts +1 -0
  166. package/dist/test/integration/auth/two-factor-token.test.js +92 -0
  167. package/dist/test/integration/auth/two-factor-token.test.js.map +1 -0
  168. package/dist/test/integration/email-change.test.js +36 -0
  169. package/dist/test/integration/email-change.test.js.map +1 -1
  170. package/dist/test/integration/invite-extension-edit.test.js +0 -1
  171. package/dist/test/integration/invite-extension-edit.test.js.map +1 -1
  172. package/dist/test/integration/invite-link-status.test.d.ts +1 -0
  173. package/dist/test/integration/invite-link-status.test.js +110 -0
  174. package/dist/test/integration/invite-link-status.test.js.map +1 -0
  175. package/dist/test/integration/invite-resolution.test.js +0 -3
  176. package/dist/test/integration/invite-resolution.test.js.map +1 -1
  177. package/dist/test/integration/member-settings-access.test.js +17 -0
  178. package/dist/test/integration/member-settings-access.test.js.map +1 -1
  179. package/dist/test/integration/notification-unread-badge.test.d.ts +1 -0
  180. package/dist/test/integration/notification-unread-badge.test.js +92 -0
  181. package/dist/test/integration/notification-unread-badge.test.js.map +1 -0
  182. package/dist/test/integration/permission-warnings.test.d.ts +1 -0
  183. package/dist/test/integration/permission-warnings.test.js +71 -0
  184. package/dist/test/integration/permission-warnings.test.js.map +1 -0
  185. package/dist/test/integration/removed-member-notifications.test.d.ts +1 -0
  186. package/dist/test/integration/removed-member-notifications.test.js +80 -0
  187. package/dist/test/integration/removed-member-notifications.test.js.map +1 -0
  188. package/dist/test/integration/role-permission-ancestors.test.d.ts +1 -0
  189. package/dist/test/integration/role-permission-ancestors.test.js +146 -0
  190. package/dist/test/integration/role-permission-ancestors.test.js.map +1 -0
  191. package/dist/test/integration/tenant-lifecycle.test.js +0 -4
  192. package/dist/test/integration/tenant-lifecycle.test.js.map +1 -1
  193. package/dist/test/unit/auth-session-revocation.test.d.ts +1 -0
  194. package/dist/test/unit/auth-session-revocation.test.js +105 -0
  195. package/dist/test/unit/auth-session-revocation.test.js.map +1 -0
  196. package/dist/test/unit/db/email-normalization.test.js +0 -1
  197. package/dist/test/unit/db/email-normalization.test.js.map +1 -1
  198. package/dist/test/unit/db/notification-feed-filter.test.js +0 -16
  199. package/dist/test/unit/db/notification-feed-filter.test.js.map +1 -1
  200. package/dist/test/unit/db/notification-inbox.test.js +63 -13
  201. package/dist/test/unit/db/notification-inbox.test.js.map +1 -1
  202. package/dist/test/unit/db/notification-preferences.test.js +0 -17
  203. package/dist/test/unit/db/notification-preferences.test.js.map +1 -1
  204. package/dist/test/unit/implementations/dms/empty-menu-group.test.d.ts +1 -0
  205. package/dist/test/unit/implementations/dms/empty-menu-group.test.js +133 -0
  206. package/dist/test/unit/implementations/dms/empty-menu-group.test.js.map +1 -0
  207. package/dist/test/unit/implementations/dms/layout-banners.test.js +2 -1
  208. package/dist/test/unit/implementations/dms/layout-banners.test.js.map +1 -1
  209. package/dist/test/unit/implementations/dms/menu-hidden-blocks.test.d.ts +1 -0
  210. package/dist/test/unit/implementations/dms/menu-hidden-blocks.test.js +149 -0
  211. package/dist/test/unit/implementations/dms/menu-hidden-blocks.test.js.map +1 -0
  212. package/dist/test/unit/implementations/dms/nav-badges.test.js +55 -4
  213. package/dist/test/unit/implementations/dms/nav-badges.test.js.map +1 -1
  214. package/dist/test/unit/implementations/dms/page-all-components-hidden.test.d.ts +1 -0
  215. package/dist/test/unit/implementations/dms/page-all-components-hidden.test.js +118 -0
  216. package/dist/test/unit/implementations/dms/page-all-components-hidden.test.js.map +1 -0
  217. package/dist/test/unit/implementations/dms/permission-preview-aggregate.test.js +16 -0
  218. package/dist/test/unit/implementations/dms/permission-preview-aggregate.test.js.map +1 -1
  219. package/dist/test/unit/implementations/dms/permission-preview-cost.test.js +5 -3
  220. package/dist/test/unit/implementations/dms/permission-preview-cost.test.js.map +1 -1
  221. package/dist/test/unit/implementations/dms/permission-preview-menu.test.js +29 -3
  222. package/dist/test/unit/implementations/dms/permission-preview-menu.test.js.map +1 -1
  223. package/dist/test/unit/implementations/dms/quick-actions-button.test.js +4 -2
  224. package/dist/test/unit/implementations/dms/quick-actions-button.test.js.map +1 -1
  225. package/dist/test/unit/implementations/dms/user-permissions-gate.test.js +2 -1
  226. package/dist/test/unit/implementations/dms/user-permissions-gate.test.js.map +1 -1
  227. package/dist/test/unit/implementations/dms-base/table-view-shared-controller.test.js +2 -1
  228. package/dist/test/unit/implementations/dms-base/table-view-shared-controller.test.js.map +1 -1
  229. package/dist/test/unit/interfaces/dms/component-children-permissions.test.js +7 -2
  230. package/dist/test/unit/interfaces/dms/component-children-permissions.test.js.map +1 -1
  231. package/dist/test/unit/interfaces/dms/form-watch-permissions.test.d.ts +1 -0
  232. package/dist/test/unit/interfaces/dms/form-watch-permissions.test.js +133 -0
  233. package/dist/test/unit/interfaces/dms/form-watch-permissions.test.js.map +1 -0
  234. package/dist/test/unit/interfaces/dms/has-permission-ancestors.test.d.ts +1 -0
  235. package/dist/test/unit/interfaces/dms/has-permission-ancestors.test.js +149 -0
  236. package/dist/test/unit/interfaces/dms/has-permission-ancestors.test.js.map +1 -0
  237. package/dist/test/unit/interfaces/dms/invite-extension.test.js +13 -0
  238. package/dist/test/unit/interfaces/dms/invite-extension.test.js.map +1 -1
  239. package/dist/test/unit/interfaces/dms/member-access.test.js +27 -1
  240. package/dist/test/unit/interfaces/dms/member-access.test.js.map +1 -1
  241. package/dist/test/unit/interfaces/dms/nav-badge-tones.test.d.ts +1 -0
  242. package/dist/test/unit/interfaces/dms/nav-badge-tones.test.js +31 -0
  243. package/dist/test/unit/interfaces/dms/nav-badge-tones.test.js.map +1 -0
  244. package/dist/test/unit/interfaces/dms/page-extension.test.js +4 -1
  245. package/dist/test/unit/interfaces/dms/page-extension.test.js.map +1 -1
  246. package/dist/test/unit/interfaces/dms/permission-requirements.test.d.ts +1 -0
  247. package/dist/test/unit/interfaces/dms/permission-requirements.test.js +144 -0
  248. package/dist/test/unit/interfaces/dms/permission-requirements.test.js.map +1 -0
  249. package/dist/test/unit/interfaces/dms-base/layout-header-actions.test.js +6 -2
  250. package/dist/test/unit/interfaces/dms-base/layout-header-actions.test.js.map +1 -1
  251. package/dist/test/unit/interfaces/dms-base/lists-and-settings-catalog.test.js +1 -1
  252. package/dist/test/unit/interfaces/dms-base/lists-and-settings-catalog.test.js.map +1 -1
  253. package/dist/test/unit/interfaces/dms-base/table-view-export-permission.test.js +2 -1
  254. package/dist/test/unit/interfaces/dms-base/table-view-export-permission.test.js.map +1 -1
  255. package/dist/test/unit/interfaces/dms-base/table-view-reduced-chrome.test.js +2 -1
  256. package/dist/test/unit/interfaces/dms-base/table-view-reduced-chrome.test.js.map +1 -1
  257. package/dist/test/unit/interfaces/dms-base/table-view-shared-controller-permissions.test.js +2 -1
  258. package/dist/test/unit/interfaces/dms-base/table-view-shared-controller-permissions.test.js.map +1 -1
  259. package/dist/test/unit/pages/settings/account-activity-feed.test.js +2 -2
  260. package/dist/test/unit/pages/settings/account-activity-feed.test.js.map +1 -1
  261. package/dist/test/unit/pages/settings/account-activity.test.js +11 -2
  262. package/dist/test/unit/pages/settings/account-activity.test.js.map +1 -1
  263. package/dist/test/unit/pages/settings/invite-email-delivery.test.js +0 -1
  264. package/dist/test/unit/pages/settings/invite-email-delivery.test.js.map +1 -1
  265. package/dist/test/unit/pages/settings/invite-email-validation-option.test.d.ts +1 -0
  266. package/dist/test/unit/pages/settings/invite-email-validation-option.test.js +33 -0
  267. package/dist/test/unit/pages/settings/invite-email-validation-option.test.js.map +1 -0
  268. package/dist/test/unit/pages/settings/member-lists-page-size.test.d.ts +1 -0
  269. package/dist/test/unit/pages/settings/member-lists-page-size.test.js +22 -0
  270. package/dist/test/unit/pages/settings/member-lists-page-size.test.js.map +1 -0
  271. package/dist/test/unit/pages/settings/member-table-widths.test.js +2 -2
  272. package/dist/test/unit/pages/settings/member-table-widths.test.js.map +1 -1
  273. package/dist/test/unit/pages/settings/members-page.test.js +7 -10
  274. package/dist/test/unit/pages/settings/members-page.test.js.map +1 -1
  275. package/dist/test/unit/pages/settings/notifications-access-gate.test.js +3 -10
  276. package/dist/test/unit/pages/settings/notifications-access-gate.test.js.map +1 -1
  277. package/dist/test/unit/pages/settings/permission-tree-nodes.test.js +57 -0
  278. package/dist/test/unit/pages/settings/permission-tree-nodes.test.js.map +1 -1
  279. package/dist/test/unit/pages/settings/permission-warnings.test.d.ts +1 -0
  280. package/dist/test/unit/pages/settings/permission-warnings.test.js +49 -0
  281. package/dist/test/unit/pages/settings/permission-warnings.test.js.map +1 -0
  282. package/dist/test/unit/pages/settings/role-editor.test.js +16 -0
  283. package/dist/test/unit/pages/settings/role-editor.test.js.map +1 -1
  284. package/dist/test/unit/pages/settings/role-preview.test.js +7 -0
  285. package/dist/test/unit/pages/settings/role-preview.test.js.map +1 -1
  286. package/dist/test/unit/pages/settings/security-attention.test.d.ts +1 -0
  287. package/dist/test/unit/pages/settings/security-attention.test.js +74 -0
  288. package/dist/test/unit/pages/settings/security-attention.test.js.map +1 -0
  289. package/dist/test/unit/sanitize-user.test.d.ts +1 -0
  290. package/dist/test/unit/sanitize-user.test.js +21 -0
  291. package/dist/test/unit/sanitize-user.test.js.map +1 -0
  292. package/dist/test/unit/signup-email-validation.test.d.ts +1 -0
  293. package/dist/test/unit/signup-email-validation.test.js +79 -0
  294. package/dist/test/unit/signup-email-validation.test.js.map +1 -0
  295. package/dist/test/unit/validation/member-invite.schema.test.js +14 -52
  296. package/dist/test/unit/validation/member-invite.schema.test.js.map +1 -1
  297. package/dist/utils/account-notifications.d.ts +5 -0
  298. package/dist/utils/account-notifications.js +8 -0
  299. package/dist/utils/account-notifications.js.map +1 -1
  300. package/dist/utils/notification-emitter.d.ts +1 -1
  301. package/dist/utils/notification-emitter.js +1 -1
  302. package/dist/utils/notification-emitter.js.map +1 -1
  303. package/dist/utils/notification-tones.d.ts +2 -1
  304. package/dist/utils/notification-tones.js +5 -1
  305. package/dist/utils/notification-tones.js.map +1 -1
  306. package/dist/utils/one-time-code.d.ts +3 -0
  307. package/dist/utils/one-time-code.js +21 -0
  308. package/dist/utils/one-time-code.js.map +1 -0
  309. package/dist/utils/sign-in-monitor.d.ts +1 -0
  310. package/dist/utils/sign-in-monitor.js +3 -2
  311. package/dist/utils/sign-in-monitor.js.map +1 -1
  312. package/dist/utils/two-factor-codes.d.ts +10 -0
  313. package/dist/utils/two-factor-codes.js +76 -0
  314. package/dist/utils/two-factor-codes.js.map +1 -0
  315. package/dist/validation/auth.schema.d.ts +17 -0
  316. package/dist/validation/auth.schema.js +17 -6
  317. package/dist/validation/auth.schema.js.map +1 -1
  318. package/dist/validation/issue-message.d.ts +1 -0
  319. package/dist/validation/issue-message.js +9 -0
  320. package/dist/validation/issue-message.js.map +1 -0
  321. package/dist/validation/member-invite.schema.d.ts +1 -25
  322. package/dist/validation/member-invite.schema.js +2 -23
  323. package/dist/validation/member-invite.schema.js.map +1 -1
  324. package/frontend-vue/dms.frontend.ts +2 -0
  325. package/frontend-vue/layers/dms-auth/app/custom-pages/auth/forgot-validation.vue +3 -0
  326. package/frontend-vue/layers/dms-auth/app/custom-pages/auth/signup.vue +105 -5
  327. package/frontend-vue/layers/dms-auth/i18n/locales/auth-en-GB.json +20 -4
  328. package/frontend-vue/layers/dms-auth/i18n/locales/auth-fr-FR.json +20 -4
  329. package/frontend-vue/layers/dms-core/app/composables/useFieldErrors.ts +3 -2
  330. package/frontend-vue/layers/dms-core/app/types/menu.ts +15 -0
  331. package/frontend-vue/layers/dms-core/i18n/locales/core-en-GB.json +4 -1
  332. package/frontend-vue/layers/dms-core/i18n/locales/core-fr-FR.json +4 -1
  333. package/frontend-vue/layers/dms-layout/app/assets/css/main.css +20 -0
  334. package/frontend-vue/layers/dms-layout/app/build/components/layout/CommandPaletteAssistantAnswer.vue +75 -0
  335. package/frontend-vue/layers/dms-layout/app/build/components/layout/DashboardFrame.vue +22 -0
  336. package/frontend-vue/layers/dms-layout/app/build/components/layout/DashboardHeader.vue +24 -10
  337. package/frontend-vue/layers/dms-layout/app/build/components/layout/DashboardSidePanel.vue +139 -0
  338. package/frontend-vue/layers/dms-layout/app/build/components/layout/Footer.vue +4 -2
  339. package/frontend-vue/layers/dms-layout/app/build/components/layout/GithubStarPrompt.vue +90 -0
  340. package/frontend-vue/layers/dms-layout/app/build/components/layout/SidePanelHost.vue +17 -0
  341. package/frontend-vue/layers/dms-layout/app/build/components/notification/NotificationPopover.vue +25 -43
  342. package/frontend-vue/layers/dms-layout/app/build/components/pages/settings/members/MemberRolePicker.vue +24 -2
  343. package/frontend-vue/layers/dms-layout/app/build/components/pages/settings/notification/NotificationMatrixCategory.vue +70 -25
  344. package/frontend-vue/layers/dms-layout/app/build/components/pages/settings/notification/NotificationPreferencesForm.vue +25 -10
  345. package/frontend-vue/layers/dms-layout/app/build/components/pages/settings/notification/notificationDisplay.ts +41 -5
  346. package/frontend-vue/layers/dms-layout/app/build/components/pages/settings/profile/ProfilePreferencesSummary.vue +2 -1
  347. package/frontend-vue/layers/dms-layout/app/build/components/pages/settings/profile/ProfileSecuritySummary.vue +20 -4
  348. package/frontend-vue/layers/dms-layout/app/build/components/pages/settings/roles/RoleEditor.vue +21 -0
  349. package/frontend-vue/layers/dms-layout/app/build/components/pages/settings/roles/RolePermissionArea.vue +16 -2
  350. package/frontend-vue/layers/dms-layout/app/build/components/pages/settings/roles/RolePermissionBranch.vue +1 -0
  351. package/frontend-vue/layers/dms-layout/app/build/components/pages/settings/roles/RolePermissionLeaf.vue +13 -1
  352. package/frontend-vue/layers/dms-layout/app/build/components/pages/settings/roles/RolePermissionTree.vue +9 -0
  353. package/frontend-vue/layers/dms-layout/app/build/components/pages/settings/roles/RolePermissionWarning.vue +46 -0
  354. package/frontend-vue/layers/dms-layout/app/build/components/pages/settings/roles/role-permissions.ts +108 -29
  355. package/frontend-vue/layers/dms-layout/app/build/components/pages/settings/roles/role-types.ts +2 -0
  356. package/frontend-vue/layers/dms-layout/app/build/components/pages/settings/security/SecurityDialogFrame.vue +6 -6
  357. package/frontend-vue/layers/dms-layout/app/build/components/pages/settings/security/SecurityEmail.vue +7 -1
  358. package/frontend-vue/layers/dms-layout/app/build/components/pages/settings/security/SecuritySessions.vue +5 -4
  359. package/frontend-vue/layers/dms-layout/app/build/components/pages/settings/security/SecurityStatus.vue +4 -3
  360. package/frontend-vue/layers/dms-layout/app/build/components/pages/settings/security/SecurityTwoFactor.vue +54 -18
  361. package/frontend-vue/layers/dms-layout/app/build/components/pages/settings/shell/SettingsNav.vue +13 -8
  362. package/frontend-vue/layers/dms-layout/app/build/composables/command-palette/assistantGroups.ts +143 -0
  363. package/frontend-vue/layers/dms-layout/app/build/composables/command-palette/useCommandPaletteAssistantMode.ts +249 -0
  364. package/frontend-vue/layers/dms-layout/app/build/composables/general/useGithubStarPrompt.ts +178 -0
  365. package/frontend-vue/layers/dms-layout/app/build/composables/layout/sidePanelState.ts +191 -0
  366. package/frontend-vue/layers/dms-layout/app/build/composables/layout/useHeaderActionControls.ts +51 -0
  367. package/frontend-vue/layers/dms-layout/app/build/composables/layout/useSidePanelWidth.ts +113 -0
  368. package/frontend-vue/layers/dms-layout/app/build/composables/navigation/useCategoryNavCards.ts +17 -10
  369. package/frontend-vue/layers/dms-layout/app/build/composables/notification/useNotificationGroupsOpen.ts +45 -0
  370. package/frontend-vue/layers/dms-layout/app/build/composables/settings/profile/useProfilePreferences.ts +8 -1
  371. package/frontend-vue/layers/dms-layout/app/build/composables/settings/security/useSecurityOverview.ts +50 -3
  372. package/frontend-vue/layers/dms-layout/app/build/composables/settings/useSettingsNavigation.ts +3 -0
  373. package/frontend-vue/layers/dms-layout/app/build/utils/categoryPages.ts +1 -2
  374. package/frontend-vue/layers/dms-layout/app/build/utils/github-repository.ts +5 -0
  375. package/frontend-vue/layers/dms-layout/app/components/layout/DashboardSearch.vue +109 -7
  376. package/frontend-vue/layers/dms-layout/app/components/navigation/NavigationMenu.vue +19 -9
  377. package/frontend-vue/layers/dms-layout/app/composables/notification/useNotifications.ts +22 -40
  378. package/frontend-vue/layers/dms-layout/app/composables/useAppSidePanels.ts +96 -0
  379. package/frontend-vue/layers/dms-layout/app/composables/useCommandPaletteAssistant.ts +129 -0
  380. package/frontend-vue/layers/dms-layout/app/composables/useHeaderActions.ts +33 -11
  381. package/frontend-vue/layers/dms-layout/app/composables/useSidePanel.ts +41 -0
  382. package/frontend-vue/layers/dms-layout/app/pages/[...slug].vue +15 -0
  383. package/frontend-vue/layers/dms-layout/app/plugins/notification-stream.client.ts +1 -7
  384. package/frontend-vue/layers/dms-layout/app/plugins/side-panel-host.ts +13 -0
  385. package/frontend-vue/layers/dms-layout/app/types/page.ts +4 -0
  386. package/frontend-vue/layers/dms-layout/i18n/locales/layout-en-GB.json +43 -13
  387. package/frontend-vue/layers/dms-layout/i18n/locales/layout-fr-FR.json +43 -13
  388. package/frontend-vue/layers/dms-ui/app/build/components/form/FormLoadError.vue +45 -0
  389. package/frontend-vue/layers/dms-ui/app/build/components/modal/ModalEscHint.vue +28 -0
  390. package/frontend-vue/layers/dms-ui/app/build/composables/form/floatingSaveBars.ts +38 -0
  391. package/frontend-vue/layers/dms-ui/app/build/composables/form/formRecordLoad.ts +66 -0
  392. package/frontend-vue/layers/dms-ui/app/build/composables/navigation/useNavBadges.ts +50 -9
  393. package/frontend-vue/layers/dms-ui/app/build/composables/table/useTable.ts +7 -1
  394. package/frontend-vue/layers/dms-ui/app/build/composables/table-view/utils/chrome.ts +2 -2
  395. package/frontend-vue/layers/dms-ui/app/build/types/tree.ts +14 -10
  396. package/frontend-vue/layers/dms-ui/app/build/utils/navBadge.ts +12 -0
  397. package/frontend-vue/layers/dms-ui/app/build/utils/tone.ts +22 -0
  398. package/frontend-vue/layers/dms-ui/app/components/activity-feed/ActivityFeed.vue +117 -82
  399. package/frontend-vue/layers/dms-ui/app/components/blocks/NavCardGridBlock.vue +12 -1
  400. package/frontend-vue/layers/dms-ui/app/components/card/NavCard.vue +16 -1
  401. package/frontend-vue/layers/dms-ui/app/components/confirm/ConfirmModal.vue +7 -8
  402. package/frontend-vue/layers/dms-ui/app/components/form/Form.vue +28 -6
  403. package/frontend-vue/layers/dms-ui/app/components/form/components/Display.vue +5 -1
  404. package/frontend-vue/layers/dms-ui/app/components/save-bar/SaveBar.vue +4 -0
  405. package/frontend-vue/layers/dms-ui/app/components/status-pill/StatusPill.vue +7 -2
  406. package/frontend-vue/layers/dms-ui/app/components/table-view/TableView.vue +7 -2
  407. package/frontend-vue/layers/dms-ui/app/composables/form/useForm.ts +48 -34
  408. package/frontend-vue/layers/dms-ui/app/composables/table-view/types/config.ts +13 -3
  409. package/frontend-vue/layers/dms-ui/i18n/locales/ui-en-GB.json +16 -14
  410. package/frontend-vue/layers/dms-ui/i18n/locales/ui-fr-FR.json +16 -14
  411. package/frontend-vue/package.json +2 -2
  412. package/frontend-vue/pnpm-lock.yaml +5 -5
  413. package/frontend-vue/tests/activity-feed-fill-height.test.ts +107 -0
  414. package/frontend-vue/tests/category-nav-cards.test.ts +21 -13
  415. package/frontend-vue/tests/command-palette-assistant.test.ts +344 -0
  416. package/frontend-vue/tests/fixtures/dashboard-search-stub.ts +91 -0
  417. package/frontend-vue/tests/forgot-validation-resend.test.ts +234 -0
  418. package/frontend-vue/tests/form-display-options.test.ts +64 -0
  419. package/frontend-vue/tests/form-load-error.test.ts +160 -0
  420. package/frontend-vue/tests/form-saved-before-success.test.ts +110 -0
  421. package/frontend-vue/tests/github-star-prompt.test.ts +328 -0
  422. package/frontend-vue/tests/header-actions.test.ts +191 -0
  423. package/frontend-vue/tests/invites-edit-modal.test.ts +157 -0
  424. package/frontend-vue/tests/member-role-picker.test.ts +26 -0
  425. package/frontend-vue/tests/menu-hidden-page.test.ts +93 -0
  426. package/frontend-vue/tests/nav-badge-tones.test.ts +274 -0
  427. package/frontend-vue/tests/nav-card-badge.test.ts +69 -0
  428. package/frontend-vue/tests/nav-card-grid-empty-category.test.ts +163 -0
  429. package/frontend-vue/tests/notification-popover-errors.test.ts +71 -37
  430. package/frontend-vue/tests/notification-preferences-groups.test.ts +268 -0
  431. package/frontend-vue/tests/notification-tone-contract.test.ts +70 -0
  432. package/frontend-vue/tests/page-fill-height.test.ts +9 -1
  433. package/frontend-vue/tests/page-no-visible-blocks.test.ts +202 -0
  434. package/frontend-vue/tests/profile-preferences-summary.test.ts +26 -2
  435. package/frontend-vue/tests/profile-security-summary.test.ts +121 -0
  436. package/frontend-vue/tests/role-permission-tree.test.ts +102 -8
  437. package/frontend-vue/tests/role-permissions.test.ts +178 -56
  438. package/frontend-vue/tests/side-panels.test.ts +470 -0
  439. package/frontend-vue/tests/signup-invitation-link.test.ts +71 -2
  440. package/frontend-vue/tests/table-actions-column-width.test.ts +51 -1
  441. package/frontend-vue/tests/table-view-chrome.test.ts +2 -2
  442. package/frontend-vue/tests/vue-inventory.test.ts +1 -1
  443. package/package.json +1 -1
  444. package/skills/dms/REFERENCE.md +1 -1
@@ -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>
@@ -0,0 +1,38 @@
1
+ import {
2
+ computed,
3
+ onBeforeUnmount,
4
+ onMounted,
5
+ ref,
6
+ shallowReactive,
7
+ watch,
8
+ } from "vue";
9
+
10
+ // Only mounted bars count, so a server render never adds to it.
11
+ const shownBars = shallowReactive(new Set<symbol>());
12
+
13
+ /**
14
+ * Whether a floating save bar (the one sticking to the bottom of the panel)
15
+ * is on screen: what else sits in that corner steps aside for it.
16
+ */
17
+ export const isFloatingSaveBarShown = computed(() => shownBars.size > 0);
18
+
19
+ /** Counts the calling floating save bar while `isShown` holds. */
20
+ export function trackFloatingSaveBar(isShown: () => boolean): void {
21
+ const id = Symbol("floating-save-bar");
22
+ const isMounted = ref(false);
23
+ watch(
24
+ () => isMounted.value && isShown(),
25
+ (shown) => {
26
+ if (shown) shownBars.add(id);
27
+ else shownBars.delete(id);
28
+ },
29
+ { immediate: true },
30
+ );
31
+ onMounted(() => {
32
+ isMounted.value = true;
33
+ });
34
+ onBeforeUnmount(() => {
35
+ isMounted.value = false;
36
+ shownBars.delete(id);
37
+ });
38
+ }
@@ -0,0 +1,66 @@
1
+ import { type Ref, ref } from "vue";
2
+ import { apiErrorStatus } from "#dms-core/app/composables/useFieldErrors";
3
+ import { HTTP_FORBIDDEN } from "#dms-core/app/utils/http-status";
4
+
5
+ /**
6
+ * Why a form could not load the record it edits: `forbidden` when the server
7
+ * refused the caller the read (a role that may edit rows but not view them),
8
+ * `error` for anything else (a network failure, a server error, a row gone).
9
+ */
10
+ export type FormLoadFailure = "forbidden" | "error";
11
+
12
+ /** The cached load of a form's record (`useDmsAsyncData`), as far as it is read. */
13
+ export interface FormLoadSource<T> {
14
+ data: Ref<T | null>;
15
+ error: Ref<unknown>;
16
+ refresh(): Promise<void>;
17
+ }
18
+
19
+ /** Where a form stands with the record it loads, and how to try again. */
20
+ export interface FormRecordLoad {
21
+ /** Set while the last load failed: the form shows it instead of its fields. */
22
+ failure: Ref<FormLoadFailure | null>;
23
+ /** Set while `retry` loads the record again. */
24
+ retrying: Ref<boolean>;
25
+ /** Load the record again; the form opens on it once it arrives. */
26
+ retry(): Promise<void>;
27
+ }
28
+
29
+ /** The failure a load error stands for; `null` when there is none. */
30
+ export function formLoadFailure(error: unknown): FormLoadFailure | null {
31
+ if (!error) return null;
32
+ return apiErrorStatus(error) === HTTP_FORBIDDEN ? "forbidden" : "error";
33
+ }
34
+
35
+ /**
36
+ * Follow a form's record load: `apply` receives the record once it loaded,
37
+ * and only then. A failed load is never applied, not even the values a
38
+ * previous opening left in the cache: a form showing them, or its defaults,
39
+ * would read as the record and save over it.
40
+ */
41
+ export function trackFormRecordLoad<T>(
42
+ load: FormLoadSource<T>,
43
+ apply: (payload: T) => void,
44
+ ): FormRecordLoad {
45
+ const failure = ref<FormLoadFailure | null>(null);
46
+ const retrying = ref(false);
47
+ const settle = (): void => {
48
+ failure.value = formLoadFailure(load.error.value);
49
+ const payload = load.data.value;
50
+ if (!failure.value && payload) apply(payload);
51
+ };
52
+ settle();
53
+ return {
54
+ failure,
55
+ retrying,
56
+ async retry() {
57
+ retrying.value = true;
58
+ try {
59
+ await load.refresh();
60
+ } finally {
61
+ retrying.value = false;
62
+ }
63
+ settle();
64
+ },
65
+ };
66
+ }
@@ -1,24 +1,65 @@
1
+ import type { Tone } from "../../../types/tone";
2
+
3
+ /** A page's navigation badge: its label (`""` for none) and its tone. */
4
+ export interface NavBadge {
5
+ label: string;
6
+ /** Neutral (grey) when absent. */
7
+ tone?: Tone;
8
+ }
9
+
10
+ /** A menu entry as the server serves it, as far as its badge goes. */
11
+ export interface ServedNavBadge {
12
+ fullId?: string;
13
+ badge?: string;
14
+ /** The tone of a counted badge; neutral when absent. */
15
+ badgeTone?: Tone;
16
+ }
17
+
1
18
  /**
2
19
  * Fresh counts a page publishes for its navigation entry, by page full id
3
- * (`settings.workspace.members` → `"7"`, `""` for none). The server counts a table
4
- * view tab declared with `navBadge: true` when the menu loads; the table
5
- * publishes its own counter here once shown, which navigation surfaces draw
6
- * over the server's badge.
20
+ * (`settings.workspace.members` → `{ label: "7" }`, `""` for none), with
21
+ * their tone. The server counts a table view tab declared with `navBadge`
22
+ * when the menu loads; the table publishes its own counter here once shown,
23
+ * which navigation surfaces draw over the server's badge.
7
24
  *
8
25
  * Shared state, so a count published on one page stays shown on the others.
9
26
  */
10
27
  export const useNavBadges = () => {
11
- const badges = useDmsState<Record<string, string>>(
28
+ const badges = useDmsState<Record<string, NavBadge>>(
12
29
  "dms-nav-badges",
13
30
  () => ({}),
14
31
  );
15
32
 
16
33
  /** Sets, or with `undefined` clears, the badge of a page. */
17
- function setNavBadge(fullId: string, badge: string | undefined): void {
18
- if (badges.value[fullId] === badge) return;
34
+ function setNavBadge(
35
+ fullId: string,
36
+ label: string | undefined,
37
+ tone?: Tone,
38
+ ): void {
39
+ const current = badges.value[fullId];
40
+ if (current?.label === label && current?.tone === tone) return;
19
41
  const { [fullId]: _previous, ...rest } = badges.value;
20
- badges.value = badge === undefined ? rest : { ...rest, [fullId]: badge };
42
+ if (label === undefined) {
43
+ if (current !== undefined) badges.value = rest;
44
+ return;
45
+ }
46
+ badges.value = { ...rest, [fullId]: tone ? { label, tone } : { label } };
47
+ }
48
+
49
+ /**
50
+ * The badge `entry` shows: the one its page published, fresher, or the
51
+ * one the server served; undefined when it has none.
52
+ */
53
+ function navBadgeOf(entry: ServedNavBadge): NavBadge | undefined {
54
+ const live =
55
+ entry.fullId === undefined ? undefined : badges.value[entry.fullId];
56
+ const served: NavBadge | undefined =
57
+ entry.badge === undefined
58
+ ? undefined
59
+ : { label: entry.badge, tone: entry.badgeTone };
60
+ const badge = live ?? served;
61
+ return badge?.label ? badge : undefined;
21
62
  }
22
63
 
23
- return { badges, setNavBadge };
64
+ return { badges, setNavBadge, navBadgeOf };
24
65
  };
@@ -134,7 +134,13 @@ export const useTable = <T extends Data>(props: UseTableProps<T>) => {
134
134
 
135
135
  const tableConfig = shallowRef({
136
136
  data: tableData,
137
- columns: columns.value,
137
+ // Read on each update rather than once: labelled row actions are sized on
138
+ // the rows listed, which a table opened by client-side navigation only
139
+ // receives after it is set up. A copy taken then keeps the width of an
140
+ // empty list, and the rows' buttons are cut.
141
+ get columns() {
142
+ return columns.value;
143
+ },
138
144
 
139
145
  ...stateHandlers,
140
146
 
@@ -35,7 +35,7 @@ const LAYOUT_CHROME: Record<TableViewLayout, ResolvedTableChrome> = {
35
35
  pageSize: true,
36
36
  },
37
37
  // The list of a settings page: tabs, an open search field, quick filters,
38
- // sortable headers, the row menu and a short footer.
38
+ // sortable headers, the row menu and a footer with the page size picker.
39
39
  compact: {
40
40
  caption: false,
41
41
  search: "field",
@@ -44,7 +44,7 @@ const LAYOUT_CHROME: Record<TableViewLayout, ResolvedTableChrome> = {
44
44
  refresh: false,
45
45
  menu: false,
46
46
  columnMenus: false,
47
- pageSize: false,
47
+ pageSize: true,
48
48
  },
49
49
  };
50
50
 
@@ -53,6 +53,7 @@ function buildNavigationItem(
53
53
  variant: item.variant,
54
54
  status: item.status,
55
55
  badge: item.badge,
56
+ badgeTone: item.badgeTone,
56
57
  children: children.length > 0 ? children : undefined,
57
58
  };
58
59
  }
@@ -98,19 +99,22 @@ function convertToTreeItems(node: SiteLayoutTree): NavigationMenuItem[][] {
98
99
  }
99
100
 
100
101
  // Module roots are only ever direct children of the `modules` category, so the
101
- // same walk serves the root menu and a module's own menu.
102
+ // same walk serves the root menu and a module's own menu. A page left out of
103
+ // the menu (refused, or showing the viewer none of its blocks) hands its
104
+ // place to the pages nested under it that the viewer can open.
102
105
  function convertChildrenToItems(node: SiteLayoutTree): NavigationMenuItem[] {
103
- return node.childrenOrders
104
- .map((nodeId) => {
105
- const item = node.children[nodeId]!;
106
+ return node.childrenOrders.flatMap((nodeId): NavigationMenuItem[] => {
107
+ const item = node.children[nodeId]!;
106
108
 
107
- if (item.isModuleRoot || item.hasAccess === false) {
108
- return null;
109
- }
109
+ if (item.isModuleRoot) {
110
+ return [];
111
+ }
112
+ if (item.hasAccess === false) {
113
+ return item.layoutUrl ? convertChildrenToItems(item) : [];
114
+ }
110
115
 
111
- return buildNavigationItem(item, convertChildrenToItems(item));
112
- })
113
- .filter((item) => item !== null) as NavigationMenuItem[];
116
+ return [buildNavigationItem(item, convertChildrenToItems(item))];
117
+ });
114
118
  }
115
119
 
116
120
  const MODULE_PAGES_GROUP_ID = "module-pages";
@@ -0,0 +1,12 @@
1
+ import type { Tone } from "../../types/tone";
2
+ import { DMS_TONE_SOFT } from "./tone";
3
+
4
+ /**
5
+ * A page's navigation badge (v2 nav trail count): a small mono pill in the
6
+ * soft tint of the tone its count carries, neutral grey without one. The
7
+ * settings nav draws it after an entry, a nav card in its top corner; where
8
+ * it sits is the caller's.
9
+ */
10
+ export function navBadgeClass(tone: Tone | undefined): string {
11
+ return `rounded-full px-1.5 font-mono text-[10.5px] font-semibold tabular-nums ${DMS_TONE_SOFT[tone ?? "neutral"]}`;
12
+ }