@antelopejs/dms 0.5.5 → 0.6.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 (1275) hide show
  1. package/CHANGELOG.md +40 -0
  2. package/README.md +8 -0
  3. package/data/NOTICE.md +12 -0
  4. package/data/dbip-country-lite.mmdb +0 -0
  5. package/dist/attachments/access.d.ts +2 -2
  6. package/dist/attachments/access.js +2 -2
  7. package/dist/attachments/access.js.map +1 -1
  8. package/dist/attachments/table-view.d.ts +1 -1
  9. package/dist/attachments/table-view.js +2 -2
  10. package/dist/attachments/table-view.js.map +1 -1
  11. package/dist/config.d.ts +5 -1
  12. package/dist/config.js +1 -1
  13. package/dist/config.js.map +1 -1
  14. package/dist/crons/cleanup-user-invites.js +2 -2
  15. package/dist/crons/cleanup-user-invites.js.map +1 -1
  16. package/dist/db/models/index.d.ts +3 -0
  17. package/dist/db/models/index.js +3 -0
  18. package/dist/db/models/index.js.map +1 -1
  19. package/dist/db/models/notification-feed-filter.d.ts +39 -0
  20. package/dist/db/models/notification-feed-filter.js +143 -0
  21. package/dist/db/models/notification-feed-filter.js.map +1 -0
  22. package/dist/db/models/signInAttempts.model.d.ts +29 -0
  23. package/dist/db/models/signInAttempts.model.js +67 -0
  24. package/dist/db/models/signInAttempts.model.js.map +1 -0
  25. package/dist/db/models/userEmailChanges.model.d.ts +31 -0
  26. package/dist/db/models/userEmailChanges.model.js +21 -0
  27. package/dist/db/models/userEmailChanges.model.js.map +1 -0
  28. package/dist/db/models/userKnownDevices.model.d.ts +25 -0
  29. package/dist/db/models/userKnownDevices.model.js +45 -0
  30. package/dist/db/models/userKnownDevices.model.js.map +1 -0
  31. package/dist/db/models/userNotificationPreferences.model.d.ts +4 -0
  32. package/dist/db/models/userNotificationPreferences.model.js +28 -0
  33. package/dist/db/models/userNotificationPreferences.model.js.map +1 -1
  34. package/dist/db/models/userNotifications.model.d.ts +39 -5
  35. package/dist/db/models/userNotifications.model.js +152 -45
  36. package/dist/db/models/userNotifications.model.js.map +1 -1
  37. package/dist/db/tables/index.d.ts +3 -0
  38. package/dist/db/tables/index.js +3 -0
  39. package/dist/db/tables/index.js.map +1 -1
  40. package/dist/db/tables/signInAttempts.table.d.ts +9 -0
  41. package/dist/db/tables/signInAttempts.table.js +42 -0
  42. package/dist/db/tables/signInAttempts.table.js.map +1 -0
  43. package/dist/db/tables/systemState.table.d.ts +2 -0
  44. package/dist/db/tables/systemState.table.js +8 -0
  45. package/dist/db/tables/systemState.table.js.map +1 -1
  46. package/dist/db/tables/userEmailChanges.table.d.ts +9 -0
  47. package/dist/db/tables/userEmailChanges.table.js +45 -0
  48. package/dist/db/tables/userEmailChanges.table.js.map +1 -0
  49. package/dist/db/tables/userKnownDevices.table.d.ts +9 -0
  50. package/dist/db/tables/userKnownDevices.table.js +45 -0
  51. package/dist/db/tables/userKnownDevices.table.js.map +1 -0
  52. package/dist/db/tables/userNotificationPreferences.table.d.ts +1 -0
  53. package/dist/db/tables/userNotificationPreferences.table.js +4 -0
  54. package/dist/db/tables/userNotificationPreferences.table.js.map +1 -1
  55. package/dist/db/tables/userNotifications.table.d.ts +3 -0
  56. package/dist/db/tables/userNotifications.table.js +8 -0
  57. package/dist/db/tables/userNotifications.table.js.map +1 -1
  58. package/dist/dev/module-update-notifications.js +4 -1
  59. package/dist/dev/module-update-notifications.js.map +1 -1
  60. package/dist/hooks/invite-extensions.js +3 -3
  61. package/dist/hooks/invite-extensions.js.map +1 -1
  62. package/dist/hooks/workspace-notifications.d.ts +1 -0
  63. package/dist/hooks/workspace-notifications.js +26 -0
  64. package/dist/hooks/workspace-notifications.js.map +1 -0
  65. package/dist/implementations/dms/dev-reload.d.ts +1 -0
  66. package/dist/implementations/dms/dev-reload.js +9 -0
  67. package/dist/implementations/dms/dev-reload.js.map +1 -1
  68. package/dist/implementations/dms/invite-extensions.d.ts +1 -1
  69. package/dist/implementations/dms/invite-extensions.js +3 -3
  70. package/dist/implementations/dms/invite-extensions.js.map +1 -1
  71. package/dist/implementations/dms/nav-badges.d.ts +15 -0
  72. package/dist/implementations/dms/nav-badges.js +34 -0
  73. package/dist/implementations/dms/nav-badges.js.map +1 -0
  74. package/dist/implementations/dms/page.d.ts +45 -7
  75. package/dist/implementations/dms/page.js +484 -32
  76. package/dist/implementations/dms/page.js.map +1 -1
  77. package/dist/implementations/dms/permission-preview.d.ts +43 -0
  78. package/dist/implementations/dms/permission-preview.js +124 -0
  79. package/dist/implementations/dms/permission-preview.js.map +1 -0
  80. package/dist/implementations/dms/saas-mode.d.ts +1 -1
  81. package/dist/implementations/dms/uploads.d.ts +2 -2
  82. package/dist/implementations/dms-auth/index.d.ts +2 -1
  83. package/dist/implementations/dms-auth/index.js +15 -17
  84. package/dist/implementations/dms-auth/index.js.map +1 -1
  85. package/dist/implementations/dms-auth/session-handoff.d.ts +8 -0
  86. package/dist/implementations/dms-auth/session-handoff.js +46 -0
  87. package/dist/implementations/dms-auth/session-handoff.js.map +1 -0
  88. package/dist/implementations/dms-auth/token-secret.d.ts +1 -0
  89. package/dist/implementations/dms-auth/token-secret.js +9 -0
  90. package/dist/implementations/dms-auth/token-secret.js.map +1 -0
  91. package/dist/implementations/dms-base/bulk-selection.d.ts +3 -0
  92. package/dist/implementations/dms-base/bulk-selection.js +28 -0
  93. package/dist/implementations/dms-base/bulk-selection.js.map +1 -0
  94. package/dist/implementations/dms-base/filter-tokens.d.ts +7 -0
  95. package/dist/implementations/dms-base/filter-tokens.js +30 -0
  96. package/dist/implementations/dms-base/filter-tokens.js.map +1 -0
  97. package/dist/implementations/dms-base/footer-summary.d.ts +12 -0
  98. package/dist/implementations/dms-base/footer-summary.js +74 -0
  99. package/dist/implementations/dms-base/footer-summary.js.map +1 -0
  100. package/dist/implementations/dms-base/search-route.d.ts +1 -0
  101. package/dist/implementations/dms-base/search-route.js +11 -6
  102. package/dist/implementations/dms-base/search-route.js.map +1 -1
  103. package/dist/implementations/dms-base/table-view.d.ts +2 -1
  104. package/dist/implementations/dms-base/table-view.js +24 -7
  105. package/dist/implementations/dms-base/table-view.js.map +1 -1
  106. package/dist/implementations/dms-html-render/service-jwt.js +1 -1
  107. package/dist/implementations/dms-html-render/service-jwt.js.map +1 -1
  108. package/dist/implementations/dms-notifications/delivery-dedupe.d.ts +9 -0
  109. package/dist/implementations/dms-notifications/delivery-dedupe.js +38 -0
  110. package/dist/implementations/dms-notifications/delivery-dedupe.js.map +1 -0
  111. package/dist/implementations/dms-notifications/delivery-guard.d.ts +2 -0
  112. package/dist/implementations/dms-notifications/delivery-guard.js +7 -0
  113. package/dist/implementations/dms-notifications/delivery-guard.js.map +1 -0
  114. package/dist/implementations/dms-notifications/index.d.ts +7 -5
  115. package/dist/implementations/dms-notifications/index.js +72 -28
  116. package/dist/implementations/dms-notifications/index.js.map +1 -1
  117. package/dist/implementations/dms-notifications/registry.d.ts +2 -1
  118. package/dist/implementations/dms-notifications/registry.js +12 -3
  119. package/dist/implementations/dms-notifications/registry.js.map +1 -1
  120. package/dist/index.js +11 -2
  121. package/dist/index.js.map +1 -1
  122. package/dist/page-extensions/pending-report.js +2 -1
  123. package/dist/page-extensions/pending-report.js.map +1 -1
  124. package/dist/pages/settings/overview/account-activity.d.ts +4 -0
  125. package/dist/pages/settings/overview/account-activity.js +29 -0
  126. package/dist/pages/settings/overview/account-activity.js.map +1 -0
  127. package/dist/pages/settings/overview/account-summary.d.ts +7 -0
  128. package/dist/pages/settings/overview/account-summary.js +64 -0
  129. package/dist/pages/settings/overview/account-summary.js.map +1 -0
  130. package/dist/pages/settings/settings-index.d.ts +11 -1
  131. package/dist/pages/settings/settings-index.js +83 -4
  132. package/dist/pages/settings/settings-index.js.map +1 -1
  133. package/dist/pages/settings/users/account-activity-feed.d.ts +11 -0
  134. package/dist/pages/settings/users/account-activity-feed.js +198 -0
  135. package/dist/pages/settings/users/account-activity-feed.js.map +1 -0
  136. package/dist/pages/settings/users/account-activity-store.d.ts +3 -0
  137. package/dist/pages/settings/users/account-activity-store.js +77 -0
  138. package/dist/pages/settings/users/account-activity-store.js.map +1 -0
  139. package/dist/pages/settings/users/account-activity.d.ts +47 -0
  140. package/dist/pages/settings/users/account-activity.js +180 -0
  141. package/dist/pages/settings/users/account-activity.js.map +1 -0
  142. package/dist/pages/settings/users/account-credentials.d.ts +46 -0
  143. package/dist/pages/settings/users/account-credentials.js +99 -0
  144. package/dist/pages/settings/users/account-credentials.js.map +1 -0
  145. package/dist/pages/settings/users/account-data-store.d.ts +25 -0
  146. package/dist/pages/settings/users/account-data-store.js +188 -0
  147. package/dist/pages/settings/users/account-data-store.js.map +1 -0
  148. package/dist/pages/settings/users/account-data.d.ts +76 -0
  149. package/dist/pages/settings/users/account-data.js +131 -0
  150. package/dist/pages/settings/users/account-data.js.map +1 -0
  151. package/dist/pages/settings/users/appearance.d.ts +5 -1
  152. package/dist/pages/settings/users/appearance.js +39 -6
  153. package/dist/pages/settings/users/appearance.js.map +1 -1
  154. package/dist/pages/settings/users/category.js +3 -1
  155. package/dist/pages/settings/users/category.js.map +1 -1
  156. package/dist/pages/settings/users/current-password.d.ts +3 -0
  157. package/dist/pages/settings/users/current-password.js +19 -0
  158. package/dist/pages/settings/users/current-password.js.map +1 -0
  159. package/dist/pages/settings/users/dashboard-languages.d.ts +4 -0
  160. package/dist/pages/settings/users/dashboard-languages.js +8 -0
  161. package/dist/pages/settings/users/dashboard-languages.js.map +1 -0
  162. package/dist/pages/settings/users/email-change.d.ts +11 -0
  163. package/dist/pages/settings/users/email-change.js +87 -0
  164. package/dist/pages/settings/users/email-change.js.map +1 -0
  165. package/dist/pages/settings/users/index.d.ts +2 -0
  166. package/dist/pages/settings/users/index.js +2 -0
  167. package/dist/pages/settings/users/index.js.map +1 -1
  168. package/dist/pages/settings/users/invite-extension-routes.js +8 -9
  169. package/dist/pages/settings/users/invite-extension-routes.js.map +1 -1
  170. package/dist/pages/settings/users/invite-resend.d.ts +7 -0
  171. package/dist/pages/settings/users/invite-resend.js +41 -0
  172. package/dist/pages/settings/users/invite-resend.js.map +1 -0
  173. package/dist/pages/settings/users/invites.d.ts +12 -5
  174. package/dist/pages/settings/users/invites.js +207 -65
  175. package/dist/pages/settings/users/invites.js.map +1 -1
  176. package/dist/pages/settings/users/member-change-notifications.d.ts +5 -0
  177. package/dist/pages/settings/users/member-change-notifications.js +51 -0
  178. package/dist/pages/settings/users/member-change-notifications.js.map +1 -0
  179. package/dist/pages/settings/users/member-invite-batch.d.ts +37 -0
  180. package/dist/pages/settings/users/member-invite-batch.js +108 -0
  181. package/dist/pages/settings/users/member-invite-batch.js.map +1 -0
  182. package/dist/pages/settings/users/member-invite-form.d.ts +3 -5
  183. package/dist/pages/settings/users/member-invite-form.js +59 -74
  184. package/dist/pages/settings/users/member-invite-form.js.map +1 -1
  185. package/dist/pages/settings/users/member-management.d.ts +23 -0
  186. package/dist/pages/settings/users/member-management.js +107 -0
  187. package/dist/pages/settings/users/member-management.js.map +1 -0
  188. package/dist/pages/settings/users/member-role-options.d.ts +13 -0
  189. package/dist/pages/settings/users/member-role-options.js +28 -0
  190. package/dist/pages/settings/users/member-role-options.js.map +1 -0
  191. package/dist/pages/settings/users/member-roles-field.d.ts +8 -0
  192. package/dist/pages/settings/users/member-roles-field.js +44 -0
  193. package/dist/pages/settings/users/member-roles-field.js.map +1 -0
  194. package/dist/pages/settings/users/members.d.ts +31 -7
  195. package/dist/pages/settings/users/members.js +304 -122
  196. package/dist/pages/settings/users/members.js.map +1 -1
  197. package/dist/pages/settings/users/notifications.d.ts +38 -6
  198. package/dist/pages/settings/users/notifications.js +316 -33
  199. package/dist/pages/settings/users/notifications.js.map +1 -1
  200. package/dist/pages/settings/users/permission-tree-nodes.d.ts +7 -3
  201. package/dist/pages/settings/users/permission-tree-nodes.js +22 -15
  202. package/dist/pages/settings/users/permission-tree-nodes.js.map +1 -1
  203. package/dist/pages/settings/users/profile-access.d.ts +7 -0
  204. package/dist/pages/settings/users/profile-access.js +15 -0
  205. package/dist/pages/settings/users/profile-access.js.map +1 -0
  206. package/dist/pages/settings/users/profile-helpers.d.ts +7 -2
  207. package/dist/pages/settings/users/profile-helpers.js +10 -7
  208. package/dist/pages/settings/users/profile-helpers.js.map +1 -1
  209. package/dist/pages/settings/users/profile.d.ts +15 -37
  210. package/dist/pages/settings/users/profile.js +137 -242
  211. package/dist/pages/settings/users/profile.js.map +1 -1
  212. package/dist/pages/settings/users/region-form.d.ts +2 -0
  213. package/dist/pages/settings/users/region-form.js +93 -0
  214. package/dist/pages/settings/users/region-form.js.map +1 -0
  215. package/dist/pages/settings/users/region.d.ts +14 -0
  216. package/dist/pages/settings/users/region.js +77 -0
  217. package/dist/pages/settings/users/region.js.map +1 -0
  218. package/dist/pages/settings/users/regional-preferences.d.ts +14 -0
  219. package/dist/pages/settings/users/regional-preferences.js +56 -0
  220. package/dist/pages/settings/users/regional-preferences.js.map +1 -0
  221. package/dist/pages/settings/users/role-editor-store.d.ts +19 -0
  222. package/dist/pages/settings/users/role-editor-store.js +196 -0
  223. package/dist/pages/settings/users/role-editor-store.js.map +1 -0
  224. package/dist/pages/settings/users/role-editor.d.ts +60 -0
  225. package/dist/pages/settings/users/role-editor.js +109 -0
  226. package/dist/pages/settings/users/role-editor.js.map +1 -0
  227. package/dist/pages/settings/users/role-preview.d.ts +41 -0
  228. package/dist/pages/settings/users/role-preview.js +97 -0
  229. package/dist/pages/settings/users/role-preview.js.map +1 -0
  230. package/dist/pages/settings/users/roles.d.ts +18 -3
  231. package/dist/pages/settings/users/roles.js +235 -26
  232. package/dist/pages/settings/users/roles.js.map +1 -1
  233. package/dist/pages/settings/users/security-attention.d.ts +3 -0
  234. package/dist/pages/settings/users/security-attention.js +22 -0
  235. package/dist/pages/settings/users/security-attention.js.map +1 -0
  236. package/dist/pages/settings/users/security.d.ts +31 -0
  237. package/dist/pages/settings/users/security.js +251 -0
  238. package/dist/pages/settings/users/security.js.map +1 -0
  239. package/dist/pages/settings/users/shortcuts.js +2 -3
  240. package/dist/pages/settings/users/shortcuts.js.map +1 -1
  241. package/dist/pages/settings/users/two-factor-operations.d.ts +33 -0
  242. package/dist/pages/settings/users/two-factor-operations.js +156 -0
  243. package/dist/pages/settings/users/two-factor-operations.js.map +1 -0
  244. package/dist/routes/auth/client-ip.js +2 -5
  245. package/dist/routes/auth/client-ip.js.map +1 -1
  246. package/dist/routes/auth/index.d.ts +1 -0
  247. package/dist/routes/auth/index.js +1 -0
  248. package/dist/routes/auth/index.js.map +1 -1
  249. package/dist/routes/auth/login-throttle.d.ts +3 -0
  250. package/dist/routes/auth/login-throttle.js +29 -0
  251. package/dist/routes/auth/login-throttle.js.map +1 -0
  252. package/dist/routes/auth/login.d.ts +2 -1
  253. package/dist/routes/auth/login.js +16 -4
  254. package/dist/routes/auth/login.js.map +1 -1
  255. package/dist/routes/auth/oauth/callback.d.ts +3 -2
  256. package/dist/routes/auth/oauth/callback.js +4 -3
  257. package/dist/routes/auth/oauth/callback.js.map +1 -1
  258. package/dist/routes/auth/reset-password.js +3 -1
  259. package/dist/routes/auth/reset-password.js.map +1 -1
  260. package/dist/routes/auth/session-handoff.d.ts +4 -0
  261. package/dist/routes/auth/session-handoff.js +26 -0
  262. package/dist/routes/auth/session-handoff.js.map +1 -0
  263. package/dist/routes/auth/session-response.d.ts +3 -2
  264. package/dist/routes/auth/session-response.js +6 -6
  265. package/dist/routes/auth/session-response.js.map +1 -1
  266. package/dist/routes/auth/signup.d.ts +2 -1
  267. package/dist/routes/auth/signup.js +4 -2
  268. package/dist/routes/auth/signup.js.map +1 -1
  269. package/dist/routes/auth/verify-2fa.d.ts +2 -1
  270. package/dist/routes/auth/verify-2fa.js +8 -3
  271. package/dist/routes/auth/verify-2fa.js.map +1 -1
  272. package/dist/routes/auth.d.ts +2 -0
  273. package/dist/routes/auth.js +18 -4
  274. package/dist/routes/auth.js.map +1 -1
  275. package/dist/routes/onboarding.d.ts +1 -0
  276. package/dist/routes/onboarding.js +14 -4
  277. package/dist/routes/onboarding.js.map +1 -1
  278. package/dist/routes/system-state.d.ts +2 -0
  279. package/dist/routes/system-state.js +1 -1
  280. package/dist/routes/system-state.js.map +1 -1
  281. package/dist/test/antelope.test.js +1 -1
  282. package/dist/test/attachment-host/archive.d.ts +58 -0
  283. package/dist/test/attachment-host/archive.js +79 -0
  284. package/dist/test/attachment-host/archive.js.map +1 -0
  285. package/dist/test/attachment-host/capabilities.d.ts +82 -0
  286. package/dist/test/attachment-host/capabilities.js +189 -0
  287. package/dist/test/attachment-host/capabilities.js.map +1 -0
  288. package/dist/test/attachment-host/derived.d.ts +74 -0
  289. package/dist/test/attachment-host/derived.js +96 -0
  290. package/dist/test/attachment-host/derived.js.map +1 -0
  291. package/dist/test/attachment-host/index.d.ts +3 -0
  292. package/dist/test/attachment-host/index.js +3 -0
  293. package/dist/test/attachment-host/index.js.map +1 -1
  294. package/dist/test/attachment-host/native.js +9 -3
  295. package/dist/test/attachment-host/native.js.map +1 -1
  296. package/dist/test/helpers/derived-controller.d.ts +12 -0
  297. package/dist/test/helpers/derived-controller.js +20 -0
  298. package/dist/test/helpers/derived-controller.js.map +1 -0
  299. package/dist/test/integration/account-deletion.test.d.ts +1 -0
  300. package/dist/test/integration/account-deletion.test.js +84 -0
  301. package/dist/test/integration/account-deletion.test.js.map +1 -0
  302. package/dist/test/integration/auth/auth-key-rotation.test.d.ts +1 -0
  303. package/dist/test/integration/auth/auth-key-rotation.test.js +77 -0
  304. package/dist/test/integration/auth/auth-key-rotation.test.js.map +1 -0
  305. package/dist/test/integration/auth/login-throttle.test.d.ts +1 -0
  306. package/dist/test/integration/auth/login-throttle.test.js +88 -0
  307. package/dist/test/integration/auth/login-throttle.test.js.map +1 -0
  308. package/dist/test/integration/auth/sign-in-country.test.d.ts +1 -0
  309. package/dist/test/integration/auth/sign-in-country.test.js +75 -0
  310. package/dist/test/integration/auth/sign-in-country.test.js.map +1 -0
  311. package/dist/test/integration/auth/two-factor-password.test.d.ts +1 -0
  312. package/dist/test/integration/auth/two-factor-password.test.js +40 -0
  313. package/dist/test/integration/auth/two-factor-password.test.js.map +1 -0
  314. package/dist/test/integration/derived-controller.test.d.ts +1 -0
  315. package/dist/test/integration/derived-controller.test.js +105 -0
  316. package/dist/test/integration/derived-controller.test.js.map +1 -0
  317. package/dist/test/integration/email-change.test.d.ts +1 -0
  318. package/dist/test/integration/email-change.test.js +100 -0
  319. package/dist/test/integration/email-change.test.js.map +1 -0
  320. package/dist/test/integration/export-cleanup.test.js +1 -1
  321. package/dist/test/integration/export-cleanup.test.js.map +1 -1
  322. package/dist/test/integration/files/shared-controller-files.test.js +31 -21
  323. package/dist/test/integration/files/shared-controller-files.test.js.map +1 -1
  324. package/dist/test/integration/invite-extension-edit.test.js +5 -5
  325. package/dist/test/integration/invite-extension-edit.test.js.map +1 -1
  326. package/dist/test/integration/invite-resolution.test.js +6 -6
  327. package/dist/test/integration/invite-resolution.test.js.map +1 -1
  328. package/dist/test/integration/member-change-notifications.test.d.ts +1 -0
  329. package/dist/test/integration/member-change-notifications.test.js +52 -0
  330. package/dist/test/integration/member-change-notifications.test.js.map +1 -0
  331. package/dist/test/integration/member-settings-access.test.d.ts +1 -0
  332. package/dist/test/integration/member-settings-access.test.js +100 -0
  333. package/dist/test/integration/member-settings-access.test.js.map +1 -0
  334. package/dist/test/integration/notification-inbox.test.d.ts +1 -0
  335. package/dist/test/integration/notification-inbox.test.js +97 -0
  336. package/dist/test/integration/notification-inbox.test.js.map +1 -0
  337. package/dist/test/integration/notification-locked-subjects.test.d.ts +1 -0
  338. package/dist/test/integration/notification-locked-subjects.test.js +81 -0
  339. package/dist/test/integration/notification-locked-subjects.test.js.map +1 -0
  340. package/dist/test/integration/notifications.test.js +46 -1
  341. package/dist/test/integration/notifications.test.js.map +1 -1
  342. package/dist/test/integration/role-delete-reassign.test.d.ts +1 -0
  343. package/dist/test/integration/role-delete-reassign.test.js +68 -0
  344. package/dist/test/integration/role-delete-reassign.test.js.map +1 -0
  345. package/dist/test/integration/sign-in-records.test.d.ts +1 -0
  346. package/dist/test/integration/sign-in-records.test.js +41 -0
  347. package/dist/test/integration/sign-in-records.test.js.map +1 -0
  348. package/dist/test/integration/table-view-archive.test.d.ts +1 -0
  349. package/dist/test/integration/table-view-archive.test.js +46 -0
  350. package/dist/test/integration/table-view-archive.test.js.map +1 -0
  351. package/dist/test/integration/table-view-capabilities.test.d.ts +1 -0
  352. package/dist/test/integration/table-view-capabilities.test.js +146 -0
  353. package/dist/test/integration/table-view-capabilities.test.js.map +1 -0
  354. package/dist/test/integration/tenant-lifecycle.test.js +1 -1
  355. package/dist/test/integration/tenant-lifecycle.test.js.map +1 -1
  356. package/dist/test/unit/client-ip.test.js +0 -6
  357. package/dist/test/unit/client-ip.test.js.map +1 -1
  358. package/dist/test/unit/db/notification-feed-filter.test.d.ts +1 -0
  359. package/dist/test/unit/db/notification-feed-filter.test.js +144 -0
  360. package/dist/test/unit/db/notification-feed-filter.test.js.map +1 -0
  361. package/dist/test/unit/db/notification-inbox.test.d.ts +1 -0
  362. package/dist/test/unit/db/notification-inbox.test.js +110 -0
  363. package/dist/test/unit/db/notification-inbox.test.js.map +1 -0
  364. package/dist/test/unit/db/notification-preferences.test.js +35 -0
  365. package/dist/test/unit/db/notification-preferences.test.js.map +1 -1
  366. package/dist/test/unit/db/session-refresh-token.test.js +3 -14
  367. package/dist/test/unit/db/session-refresh-token.test.js.map +1 -1
  368. package/dist/test/unit/db/session-sweep.test.js +0 -1
  369. package/dist/test/unit/db/session-sweep.test.js.map +1 -1
  370. package/dist/test/unit/implementations/dms/dev-reload.test.js +41 -0
  371. package/dist/test/unit/implementations/dms/dev-reload.test.js.map +1 -1
  372. package/dist/test/unit/implementations/dms/gate-consistency.test.js +1 -1
  373. package/dist/test/unit/implementations/dms/gate-consistency.test.js.map +1 -1
  374. package/dist/test/unit/implementations/dms/missing-category.test.js +46 -0
  375. package/dist/test/unit/implementations/dms/missing-category.test.js.map +1 -1
  376. package/dist/test/unit/implementations/dms/nav-badges.test.d.ts +1 -0
  377. package/dist/test/unit/implementations/dms/nav-badges.test.js +146 -0
  378. package/dist/test/unit/implementations/dms/nav-badges.test.js.map +1 -0
  379. package/dist/test/unit/implementations/dms/permission-preview-aggregate.test.d.ts +1 -0
  380. package/dist/test/unit/implementations/dms/permission-preview-aggregate.test.js +116 -0
  381. package/dist/test/unit/implementations/dms/permission-preview-aggregate.test.js.map +1 -0
  382. package/dist/test/unit/implementations/dms/permission-preview-cost.test.d.ts +1 -0
  383. package/dist/test/unit/implementations/dms/permission-preview-cost.test.js +118 -0
  384. package/dist/test/unit/implementations/dms/permission-preview-cost.test.js.map +1 -0
  385. package/dist/test/unit/implementations/dms/permission-preview-header.test.d.ts +1 -0
  386. package/dist/test/unit/implementations/dms/permission-preview-header.test.js +78 -0
  387. package/dist/test/unit/implementations/dms/permission-preview-header.test.js.map +1 -0
  388. package/dist/test/unit/implementations/dms/permission-preview-menu.test.d.ts +1 -0
  389. package/dist/test/unit/implementations/dms/permission-preview-menu.test.js +162 -0
  390. package/dist/test/unit/implementations/dms/permission-preview-menu.test.js.map +1 -0
  391. package/dist/test/unit/implementations/dms-base/filter-tokens.test.d.ts +1 -0
  392. package/dist/test/unit/implementations/dms-base/filter-tokens.test.js +39 -0
  393. package/dist/test/unit/implementations/dms-base/filter-tokens.test.js.map +1 -0
  394. package/dist/test/unit/implementations/dms-base/footer-summary.test.d.ts +1 -0
  395. package/dist/test/unit/implementations/dms-base/footer-summary.test.js +51 -0
  396. package/dist/test/unit/implementations/dms-base/footer-summary.test.js.map +1 -0
  397. package/dist/test/unit/implementations/dms-notifications/delivery-dedupe.test.d.ts +1 -0
  398. package/dist/test/unit/implementations/dms-notifications/delivery-dedupe.test.js +100 -0
  399. package/dist/test/unit/implementations/dms-notifications/delivery-dedupe.test.js.map +1 -0
  400. package/dist/test/unit/implementations/dms-notifications/delivery-guard.test.d.ts +1 -0
  401. package/dist/test/unit/implementations/dms-notifications/delivery-guard.test.js +20 -0
  402. package/dist/test/unit/implementations/dms-notifications/delivery-guard.test.js.map +1 -0
  403. package/dist/test/unit/implementations/notification-subject-lock.test.d.ts +1 -0
  404. package/dist/test/unit/implementations/notification-subject-lock.test.js +31 -0
  405. package/dist/test/unit/implementations/notification-subject-lock.test.js.map +1 -0
  406. package/dist/test/unit/interfaces/dms/category-default-layout.test.d.ts +1 -0
  407. package/dist/test/unit/interfaces/dms/category-default-layout.test.js +85 -0
  408. package/dist/test/unit/interfaces/dms/category-default-layout.test.js.map +1 -0
  409. package/dist/test/unit/interfaces/dms/component-children-permissions.test.js +2 -2
  410. package/dist/test/unit/interfaces/dms/component-children-permissions.test.js.map +1 -1
  411. package/dist/test/unit/interfaces/dms/invite-extension.test.js +31 -28
  412. package/dist/test/unit/interfaces/dms/invite-extension.test.js.map +1 -1
  413. package/dist/test/unit/interfaces/dms/member-access.test.d.ts +1 -0
  414. package/dist/test/unit/interfaces/dms/member-access.test.js +117 -0
  415. package/dist/test/unit/interfaces/dms/member-access.test.js.map +1 -0
  416. package/dist/test/unit/interfaces/dms/module-permission-registration.test.js +11 -0
  417. package/dist/test/unit/interfaces/dms/module-permission-registration.test.js.map +1 -1
  418. package/dist/test/unit/interfaces/dms/module-reload-registrations.test.js +1 -1
  419. package/dist/test/unit/interfaces/dms/module-reload-registrations.test.js.map +1 -1
  420. package/dist/test/unit/interfaces/dms/page-extension.test.js +2 -1
  421. package/dist/test/unit/interfaces/dms/page-extension.test.js.map +1 -1
  422. package/dist/test/unit/interfaces/dms/page-registration-identity.test.js +5 -4
  423. package/dist/test/unit/interfaces/dms/page-registration-identity.test.js.map +1 -1
  424. package/dist/test/unit/interfaces/dms/tenant-invite-email.test.js +2 -2
  425. package/dist/test/unit/interfaces/dms/tenant-invite-email.test.js.map +1 -1
  426. package/dist/test/unit/interfaces/dms-auth/refresh-token-rotation.test.js +20 -32
  427. package/dist/test/unit/interfaces/dms-auth/refresh-token-rotation.test.js.map +1 -1
  428. package/dist/test/unit/interfaces/dms-base/block-vocabulary.test.d.ts +1 -0
  429. package/dist/test/unit/interfaces/dms-base/block-vocabulary.test.js +76 -0
  430. package/dist/test/unit/interfaces/dms-base/block-vocabulary.test.js.map +1 -0
  431. package/dist/test/unit/interfaces/dms-base/column-display.test.d.ts +1 -0
  432. package/dist/test/unit/interfaces/dms-base/column-display.test.js +98 -0
  433. package/dist/test/unit/interfaces/dms-base/column-display.test.js.map +1 -0
  434. package/dist/test/unit/interfaces/dms-base/data-types/field-types.test.d.ts +1 -0
  435. package/dist/test/unit/interfaces/dms-base/data-types/field-types.test.js +155 -0
  436. package/dist/test/unit/interfaces/dms-base/data-types/field-types.test.js.map +1 -0
  437. package/dist/test/unit/interfaces/dms-base/date-type-filter.test.d.ts +1 -0
  438. package/dist/test/unit/interfaces/dms-base/date-type-filter.test.js +34 -0
  439. package/dist/test/unit/interfaces/dms-base/date-type-filter.test.js.map +1 -0
  440. package/dist/test/unit/interfaces/dms-base/date-type-range.test.d.ts +1 -0
  441. package/dist/test/unit/interfaces/dms-base/date-type-range.test.js +29 -0
  442. package/dist/test/unit/interfaces/dms-base/date-type-range.test.js.map +1 -0
  443. package/dist/test/unit/interfaces/dms-base/display-blocks-catalog.test.d.ts +1 -0
  444. package/dist/test/unit/interfaces/dms-base/display-blocks-catalog.test.js +76 -0
  445. package/dist/test/unit/interfaces/dms-base/display-blocks-catalog.test.js.map +1 -0
  446. package/dist/test/unit/interfaces/dms-base/form-catalog.test.js +10 -5
  447. package/dist/test/unit/interfaces/dms-base/form-catalog.test.js.map +1 -1
  448. package/dist/test/unit/interfaces/dms-base/form-footer.test.d.ts +1 -0
  449. package/dist/test/unit/interfaces/dms-base/form-footer.test.js +12 -0
  450. package/dist/test/unit/interfaces/dms-base/form-footer.test.js.map +1 -0
  451. package/dist/test/unit/interfaces/dms-base/form-sections.test.d.ts +1 -0
  452. package/dist/test/unit/interfaces/dms-base/form-sections.test.js +93 -0
  453. package/dist/test/unit/interfaces/dms-base/form-sections.test.js.map +1 -0
  454. package/dist/test/unit/interfaces/dms-base/layout-header-actions.test.d.ts +1 -0
  455. package/dist/test/unit/interfaces/dms-base/layout-header-actions.test.js +222 -0
  456. package/dist/test/unit/interfaces/dms-base/layout-header-actions.test.js.map +1 -0
  457. package/dist/test/unit/interfaces/dms-base/lists-and-settings-catalog.test.d.ts +1 -0
  458. package/dist/test/unit/interfaces/dms-base/lists-and-settings-catalog.test.js +43 -0
  459. package/dist/test/unit/interfaces/dms-base/lists-and-settings-catalog.test.js.map +1 -0
  460. package/dist/test/unit/interfaces/dms-base/table-view-after-write.test.d.ts +1 -0
  461. package/dist/test/unit/interfaces/dms-base/table-view-after-write.test.js +62 -0
  462. package/dist/test/unit/interfaces/dms-base/table-view-after-write.test.js.map +1 -0
  463. package/dist/test/unit/interfaces/dms-base/table-view-bulk-operations.test.d.ts +1 -0
  464. package/dist/test/unit/interfaces/dms-base/table-view-bulk-operations.test.js +259 -0
  465. package/dist/test/unit/interfaces/dms-base/table-view-bulk-operations.test.js.map +1 -0
  466. package/dist/test/unit/interfaces/dms-base/table-view-column-validator.test.d.ts +1 -0
  467. package/dist/test/unit/interfaces/dms-base/table-view-column-validator.test.js +87 -0
  468. package/dist/test/unit/interfaces/dms-base/table-view-column-validator.test.js.map +1 -0
  469. package/dist/test/unit/interfaces/dms-base/table-view-export-permission.test.d.ts +1 -0
  470. package/dist/test/unit/interfaces/dms-base/table-view-export-permission.test.js +90 -0
  471. package/dist/test/unit/interfaces/dms-base/table-view-export-permission.test.js.map +1 -0
  472. package/dist/test/unit/interfaces/dms-base/table-view-footer.test.d.ts +1 -0
  473. package/dist/test/unit/interfaces/dms-base/table-view-footer.test.js +177 -0
  474. package/dist/test/unit/interfaces/dms-base/table-view-footer.test.js.map +1 -0
  475. package/dist/test/unit/interfaces/dms-base/table-view-form-page-texts.test.d.ts +1 -0
  476. package/dist/test/unit/interfaces/dms-base/table-view-form-page-texts.test.js +36 -0
  477. package/dist/test/unit/interfaces/dms-base/table-view-form-page-texts.test.js.map +1 -0
  478. package/dist/test/unit/interfaces/dms-base/table-view-form-page-urls.test.js +15 -13
  479. package/dist/test/unit/interfaces/dms-base/table-view-form-page-urls.test.js.map +1 -1
  480. package/dist/test/unit/interfaces/dms-base/table-view-form-redirect.test.js +9 -7
  481. package/dist/test/unit/interfaces/dms-base/table-view-form-redirect.test.js.map +1 -1
  482. package/dist/test/unit/interfaces/dms-base/table-view-meta-inherit.test.d.ts +1 -0
  483. package/dist/test/unit/interfaces/dms-base/table-view-meta-inherit.test.js +119 -0
  484. package/dist/test/unit/interfaces/dms-base/table-view-meta-inherit.test.js.map +1 -0
  485. package/dist/test/unit/interfaces/dms-base/table-view-one-writer.test.d.ts +1 -0
  486. package/dist/test/unit/interfaces/dms-base/table-view-one-writer.test.js +179 -0
  487. package/dist/test/unit/interfaces/dms-base/table-view-one-writer.test.js.map +1 -0
  488. package/dist/test/unit/interfaces/dms-base/table-view-realtime-no-change.test.d.ts +1 -0
  489. package/dist/test/unit/interfaces/dms-base/table-view-realtime-no-change.test.js +23 -0
  490. package/dist/test/unit/interfaces/dms-base/table-view-realtime-no-change.test.js.map +1 -0
  491. package/dist/test/unit/interfaces/dms-base/table-view-realtime.test.js +1 -1
  492. package/dist/test/unit/interfaces/dms-base/table-view-realtime.test.js.map +1 -1
  493. package/dist/test/unit/interfaces/dms-base/table-view-reduced-chrome.test.d.ts +1 -0
  494. package/dist/test/unit/interfaces/dms-base/table-view-reduced-chrome.test.js +454 -0
  495. package/dist/test/unit/interfaces/dms-base/table-view-reduced-chrome.test.js.map +1 -0
  496. package/dist/test/unit/interfaces/dms-base/table-view-route-param-filter-defaults.test.js +8 -6
  497. package/dist/test/unit/interfaces/dms-base/table-view-route-param-filter-defaults.test.js.map +1 -1
  498. package/dist/test/unit/interfaces/dms-base/table-view-shared-controller-permissions.test.d.ts +1 -0
  499. package/dist/test/unit/interfaces/dms-base/table-view-shared-controller-permissions.test.js +144 -0
  500. package/dist/test/unit/interfaces/dms-base/table-view-shared-controller-permissions.test.js.map +1 -0
  501. package/dist/test/unit/interfaces/dms-base/table-view-source-reorder.test.d.ts +1 -0
  502. package/dist/test/unit/interfaces/dms-base/table-view-source-reorder.test.js +188 -0
  503. package/dist/test/unit/interfaces/dms-base/table-view-source-reorder.test.js.map +1 -0
  504. package/dist/test/unit/interfaces/dms-base/table-view-tab-count-warning.test.js +1 -1
  505. package/dist/test/unit/interfaces/dms-base/table-view-tab-count-warning.test.js.map +1 -1
  506. package/dist/test/unit/interfaces/dms-base/table-view-tenant-gate.test.js +14 -13
  507. package/dist/test/unit/interfaces/dms-base/table-view-tenant-gate.test.js.map +1 -1
  508. package/dist/test/unit/interfaces/dms-base/table-view-views.test.d.ts +1 -0
  509. package/dist/test/unit/interfaces/dms-base/table-view-views.test.js +314 -0
  510. package/dist/test/unit/interfaces/dms-base/table-view-views.test.js.map +1 -0
  511. package/dist/test/unit/interfaces/dms-base/table-view-writer-row-rules.test.d.ts +1 -0
  512. package/dist/test/unit/interfaces/dms-base/table-view-writer-row-rules.test.js +292 -0
  513. package/dist/test/unit/interfaces/dms-base/table-view-writer-row-rules.test.js.map +1 -0
  514. package/dist/test/unit/onboarding-platform.test.d.ts +1 -0
  515. package/dist/test/unit/onboarding-platform.test.js +76 -0
  516. package/dist/test/unit/onboarding-platform.test.js.map +1 -0
  517. package/dist/test/unit/pages/settings/account-activity-feed.test.d.ts +1 -0
  518. package/dist/test/unit/pages/settings/account-activity-feed.test.js +116 -0
  519. package/dist/test/unit/pages/settings/account-activity-feed.test.js.map +1 -0
  520. package/dist/test/unit/pages/settings/account-activity.test.d.ts +1 -0
  521. package/dist/test/unit/pages/settings/account-activity.test.js +262 -0
  522. package/dist/test/unit/pages/settings/account-activity.test.js.map +1 -0
  523. package/dist/test/unit/pages/settings/account-data.test.d.ts +1 -0
  524. package/dist/test/unit/pages/settings/account-data.test.js +255 -0
  525. package/dist/test/unit/pages/settings/account-data.test.js.map +1 -0
  526. package/dist/test/unit/pages/settings/account-security.test.d.ts +1 -0
  527. package/dist/test/unit/pages/settings/account-security.test.js +208 -0
  528. package/dist/test/unit/pages/settings/account-security.test.js.map +1 -0
  529. package/dist/test/unit/pages/settings/invite-email-delivery.test.js +24 -18
  530. package/dist/test/unit/pages/settings/invite-email-delivery.test.js.map +1 -1
  531. package/dist/test/unit/pages/settings/invite-member-quick-action.test.js +1 -1
  532. package/dist/test/unit/pages/settings/invite-member-quick-action.test.js.map +1 -1
  533. package/dist/test/unit/pages/settings/member-roles-field.test.d.ts +1 -0
  534. package/dist/test/unit/pages/settings/member-roles-field.test.js +47 -0
  535. package/dist/test/unit/pages/settings/member-roles-field.test.js.map +1 -0
  536. package/dist/test/unit/pages/settings/member-table-widths.test.d.ts +1 -0
  537. package/dist/test/unit/pages/settings/member-table-widths.test.js +53 -0
  538. package/dist/test/unit/pages/settings/member-table-widths.test.js.map +1 -0
  539. package/dist/test/unit/pages/settings/members-page.test.d.ts +1 -0
  540. package/dist/test/unit/pages/settings/members-page.test.js +234 -0
  541. package/dist/test/unit/pages/settings/members-page.test.js.map +1 -0
  542. package/dist/test/unit/pages/settings/permission-tree-nodes.test.js +41 -5
  543. package/dist/test/unit/pages/settings/permission-tree-nodes.test.js.map +1 -1
  544. package/dist/test/unit/pages/settings/regional-preferences.test.d.ts +1 -0
  545. package/dist/test/unit/pages/settings/regional-preferences.test.js +118 -0
  546. package/dist/test/unit/pages/settings/regional-preferences.test.js.map +1 -0
  547. package/dist/test/unit/pages/settings/role-delete-confirm.test.d.ts +1 -0
  548. package/dist/test/unit/pages/settings/role-delete-confirm.test.js +77 -0
  549. package/dist/test/unit/pages/settings/role-delete-confirm.test.js.map +1 -0
  550. package/dist/test/unit/pages/settings/role-editor.test.d.ts +1 -0
  551. package/dist/test/unit/pages/settings/role-editor.test.js +261 -0
  552. package/dist/test/unit/pages/settings/role-editor.test.js.map +1 -0
  553. package/dist/test/unit/pages/settings/role-preview.test.d.ts +1 -0
  554. package/dist/test/unit/pages/settings/role-preview.test.js +200 -0
  555. package/dist/test/unit/pages/settings/role-preview.test.js.map +1 -0
  556. package/dist/test/unit/request-authenticators.test.js +1 -1
  557. package/dist/test/unit/request-authenticators.test.js.map +1 -1
  558. package/dist/test/unit/request-tenant-guards.test.js +2 -1
  559. package/dist/test/unit/request-tenant-guards.test.js.map +1 -1
  560. package/dist/test/unit/signup-account-guard.test.js +1 -1
  561. package/dist/test/unit/signup-account-guard.test.js.map +1 -1
  562. package/dist/test/unit/utils/attempt-limiter.test.d.ts +1 -0
  563. package/dist/test/unit/utils/attempt-limiter.test.js +43 -0
  564. package/dist/test/unit/utils/attempt-limiter.test.js.map +1 -0
  565. package/dist/test/unit/utils/failed-sign-ins.test.d.ts +1 -0
  566. package/dist/test/unit/utils/failed-sign-ins.test.js +57 -0
  567. package/dist/test/unit/utils/failed-sign-ins.test.js.map +1 -0
  568. package/dist/test/unit/utils/notification-rules.test.d.ts +1 -0
  569. package/dist/test/unit/utils/notification-rules.test.js +60 -0
  570. package/dist/test/unit/utils/notification-rules.test.js.map +1 -0
  571. package/dist/test/unit/utils/notification-tones.test.d.ts +1 -0
  572. package/dist/test/unit/utils/notification-tones.test.js +18 -0
  573. package/dist/test/unit/utils/notification-tones.test.js.map +1 -0
  574. package/dist/test/unit/utils/owned-registry.test.js +1 -1
  575. package/dist/test/unit/utils/owned-registry.test.js.map +1 -1
  576. package/dist/test/unit/utils/sign-in-country.test.d.ts +1 -0
  577. package/dist/test/unit/utils/sign-in-country.test.js +70 -0
  578. package/dist/test/unit/utils/sign-in-country.test.js.map +1 -0
  579. package/dist/test/unit/utils/sign-in-devices.test.d.ts +1 -0
  580. package/dist/test/unit/utils/sign-in-devices.test.js +105 -0
  581. package/dist/test/unit/utils/sign-in-devices.test.js.map +1 -0
  582. package/dist/test/unit/utils/type-check.test.js +1 -1
  583. package/dist/test/unit/utils/type-check.test.js.map +1 -1
  584. package/dist/test/unit/utils/user-activity.test.d.ts +1 -0
  585. package/dist/test/unit/utils/user-activity.test.js +85 -0
  586. package/dist/test/unit/utils/user-activity.test.js.map +1 -0
  587. package/dist/test/unit/utils/value-parser.test.js +1 -1
  588. package/dist/test/unit/utils/value-parser.test.js.map +1 -1
  589. package/dist/test/unit/utils/workspace-notifications.test.d.ts +1 -0
  590. package/dist/test/unit/utils/workspace-notifications.test.js +32 -0
  591. package/dist/test/unit/utils/workspace-notifications.test.js.map +1 -0
  592. package/dist/test/unit/validation/onboarding/register-admin.schema.test.js +54 -14
  593. package/dist/test/unit/validation/onboarding/register-admin.schema.test.js.map +1 -1
  594. package/dist/test/unit/validation/user-notification-preferences.schema.test.js +12 -0
  595. package/dist/test/unit/validation/user-notification-preferences.schema.test.js.map +1 -1
  596. package/dist/utils/account-notifications.d.ts +12 -4
  597. package/dist/utils/account-notifications.js +86 -101
  598. package/dist/utils/account-notifications.js.map +1 -1
  599. package/dist/utils/attempt-limiter.d.ts +12 -0
  600. package/dist/utils/attempt-limiter.js +48 -0
  601. package/dist/utils/attempt-limiter.js.map +1 -0
  602. package/dist/utils/email-change-mail.d.ts +3 -0
  603. package/dist/utils/email-change-mail.js +25 -0
  604. package/dist/utils/email-change-mail.js.map +1 -0
  605. package/dist/utils/export-jobs-run.d.ts +1 -1
  606. package/dist/utils/export-jobs-run.js +4 -3
  607. package/dist/utils/export-jobs-run.js.map +1 -1
  608. package/dist/utils/export-jobs.d.ts +3 -1
  609. package/dist/utils/export-jobs.js +11 -4
  610. package/dist/utils/export-jobs.js.map +1 -1
  611. package/dist/utils/failed-sign-ins.d.ts +13 -0
  612. package/dist/utils/failed-sign-ins.js +22 -0
  613. package/dist/utils/failed-sign-ins.js.map +1 -0
  614. package/dist/utils/index.d.ts +3 -3
  615. package/dist/utils/index.js +3 -3
  616. package/dist/utils/index.js.map +1 -1
  617. package/dist/utils/notification-emitter.d.ts +23 -0
  618. package/dist/utils/notification-emitter.js +43 -0
  619. package/dist/utils/notification-emitter.js.map +1 -0
  620. package/dist/utils/notification-rules.d.ts +5 -0
  621. package/dist/utils/notification-rules.js +26 -0
  622. package/dist/utils/notification-rules.js.map +1 -0
  623. package/dist/utils/notification-tones.d.ts +4 -0
  624. package/dist/utils/notification-tones.js +13 -0
  625. package/dist/utils/notification-tones.js.map +1 -0
  626. package/dist/utils/sign-in-country.d.ts +15 -0
  627. package/dist/utils/sign-in-country.js +87 -0
  628. package/dist/utils/sign-in-country.js.map +1 -0
  629. package/dist/utils/sign-in-devices.d.ts +15 -0
  630. package/dist/utils/sign-in-devices.js +43 -0
  631. package/dist/utils/sign-in-devices.js.map +1 -0
  632. package/dist/utils/sign-in-monitor.d.ts +6 -0
  633. package/dist/utils/sign-in-monitor.js +90 -0
  634. package/dist/utils/sign-in-monitor.js.map +1 -0
  635. package/dist/utils/user-activity.d.ts +4 -0
  636. package/dist/utils/user-activity.js +22 -0
  637. package/dist/utils/user-activity.js.map +1 -0
  638. package/dist/utils/user-agent.d.ts +2 -2
  639. package/dist/utils/workspace-notifications.d.ts +28 -0
  640. package/dist/utils/workspace-notifications.js +184 -0
  641. package/dist/utils/workspace-notifications.js.map +1 -0
  642. package/dist/validation/account-deletion.schema.d.ts +12 -0
  643. package/dist/validation/account-deletion.schema.js +44 -0
  644. package/dist/validation/account-deletion.schema.js.map +1 -0
  645. package/dist/validation/auth.schema.d.ts +7 -0
  646. package/dist/validation/auth.schema.js +3 -0
  647. package/dist/validation/auth.schema.js.map +1 -1
  648. package/dist/validation/member-invite.schema.d.ts +34 -9
  649. package/dist/validation/member-invite.schema.js +57 -23
  650. package/dist/validation/member-invite.schema.js.map +1 -1
  651. package/dist/validation/member-ownership.schema.d.ts +8 -0
  652. package/dist/validation/member-ownership.schema.js +8 -0
  653. package/dist/validation/member-ownership.schema.js.map +1 -0
  654. package/dist/validation/onboarding/register-admin.schema.d.ts +19 -4
  655. package/dist/validation/onboarding/register-admin.schema.js +27 -2
  656. package/dist/validation/onboarding/register-admin.schema.js.map +1 -1
  657. package/dist/validation/regional-preferences.schema.d.ts +22 -0
  658. package/dist/validation/regional-preferences.schema.js +70 -0
  659. package/dist/validation/regional-preferences.schema.js.map +1 -0
  660. package/dist/validation/role-editor.schema.d.ts +42 -0
  661. package/dist/validation/role-editor.schema.js +34 -0
  662. package/dist/validation/role-editor.schema.js.map +1 -0
  663. package/dist/validation/security.schema.d.ts +37 -0
  664. package/dist/validation/security.schema.js +61 -0
  665. package/dist/validation/security.schema.js.map +1 -0
  666. package/dist/validation/user-notification-preferences.schema.d.ts +1 -0
  667. package/dist/validation/user-notification-preferences.schema.js +2 -1
  668. package/dist/validation/user-notification-preferences.schema.js.map +1 -1
  669. package/frontend-vue/deferred-plugins.ts +2 -0
  670. package/frontend-vue/dms.frontend.build.ts +11 -0
  671. package/frontend-vue/dms.frontend.ts +32 -10
  672. package/frontend-vue/layers/dms-auth/app/build/components/AuthBackLink.vue +21 -0
  673. package/frontend-vue/layers/dms-auth/app/build/components/AuthFormAlert.vue +26 -0
  674. package/frontend-vue/layers/dms-auth/app/build/components/AuthNewPasswordField.vue +41 -0
  675. package/frontend-vue/layers/dms-auth/app/build/components/AuthResendCode.vue +51 -0
  676. package/frontend-vue/layers/dms-auth/app/build/composables/useAuthFormError.ts +102 -0
  677. package/frontend-vue/layers/dms-auth/app/build/utils/authStyles.ts +8 -0
  678. package/frontend-vue/layers/dms-auth/app/components/OAuthButtons.vue +6 -5
  679. package/frontend-vue/layers/dms-auth/app/composables/useLogout.ts +5 -0
  680. package/frontend-vue/layers/dms-auth/app/custom-pages/auth/2fa.vue +124 -83
  681. package/frontend-vue/layers/dms-auth/app/custom-pages/auth/accounts.vue +98 -94
  682. package/frontend-vue/layers/dms-auth/app/custom-pages/auth/backup.vue +82 -48
  683. package/frontend-vue/layers/dms-auth/app/custom-pages/auth/forgot-validation.vue +118 -80
  684. package/frontend-vue/layers/dms-auth/app/custom-pages/auth/forgot.vue +69 -47
  685. package/frontend-vue/layers/dms-auth/app/custom-pages/auth/login.vue +128 -103
  686. package/frontend-vue/layers/dms-auth/app/custom-pages/auth/recover-success.vue +20 -13
  687. package/frontend-vue/layers/dms-auth/app/custom-pages/auth/recover.vue +57 -75
  688. package/frontend-vue/layers/dms-auth/app/custom-pages/auth/signup.vue +108 -103
  689. package/frontend-vue/layers/dms-auth/app/custom-pages/auth/validate.vue +101 -80
  690. package/frontend-vue/layers/dms-auth/app/utils/accountsFlow.ts +1 -4
  691. package/frontend-vue/layers/dms-auth/i18n/locales/auth-en-GB.json +292 -21
  692. package/frontend-vue/layers/dms-auth/i18n/locales/auth-fr-FR.json +295 -24
  693. package/frontend-vue/layers/dms-core/app/build/composables/auth/usePermissionPreview.ts +297 -0
  694. package/frontend-vue/layers/dms-core/app/build/composables/page/usePageRecordLabel.ts +31 -0
  695. package/frontend-vue/layers/dms-core/app/build/utils/permission-preview.ts +266 -0
  696. package/frontend-vue/layers/dms-core/app/composables/data-types/useDataType.ts +27 -0
  697. package/frontend-vue/layers/dms-core/app/composables/period/compareResolvers.ts +35 -1
  698. package/frontend-vue/layers/dms-core/app/composables/useFieldErrors.ts +522 -0
  699. package/frontend-vue/layers/dms-core/app/composables/useFormValidation.ts +209 -0
  700. package/frontend-vue/layers/dms-core/app/composables/user/useRegionalFormat.ts +65 -0
  701. package/frontend-vue/layers/dms-core/app/composables/user/useUserRegionalPreferences.ts +57 -0
  702. package/frontend-vue/layers/dms-core/app/types/confirm-dialog.ts +68 -0
  703. package/frontend-vue/layers/dms-core/app/types/menu.ts +12 -0
  704. package/frontend-vue/layers/dms-core/app/types/row-action.ts +14 -0
  705. package/frontend-vue/layers/dms-core/app/utils/formatter.ts +76 -53
  706. package/frontend-vue/layers/dms-core/app/utils/regional.ts +269 -0
  707. package/frontend-vue/layers/dms-core/app/utils/url-interpolation.ts +23 -2
  708. package/frontend-vue/layers/dms-core/i18n/locales/core-en-GB.json +46 -7
  709. package/frontend-vue/layers/dms-core/i18n/locales/core-fr-FR.json +46 -7
  710. package/frontend-vue/layers/dms-core/shared/types/runtime-config.d.ts +0 -8
  711. package/frontend-vue/layers/dms-layout/app/app.config.ts +81 -149
  712. package/frontend-vue/layers/dms-layout/app/assets/css/main.css +379 -74
  713. package/frontend-vue/layers/dms-layout/app/build/components/layout/DashboardBanners.vue +24 -3
  714. package/frontend-vue/layers/dms-layout/app/build/components/layout/DashboardFrame.vue +97 -0
  715. package/frontend-vue/layers/dms-layout/app/build/components/layout/DashboardHeader.vue +136 -114
  716. package/frontend-vue/layers/dms-layout/app/build/components/layout/DashboardPageBody.vue +72 -0
  717. package/frontend-vue/layers/dms-layout/app/build/components/layout/DashboardSidebar.vue +118 -34
  718. package/frontend-vue/layers/dms-layout/app/build/components/layout/Footer.vue +148 -26
  719. package/frontend-vue/layers/dms-layout/app/build/components/layout/PageHeader.vue +10 -8
  720. package/frontend-vue/layers/dms-layout/app/build/components/layout/PageHeaderActionBar.vue +237 -0
  721. package/frontend-vue/layers/dms-layout/app/build/components/layout/PageHeaderActionsOutlet.vue +62 -0
  722. package/frontend-vue/layers/dms-layout/app/build/components/layout/PageSkeleton.vue +35 -0
  723. package/frontend-vue/layers/dms-layout/app/build/components/layout/QuickActionsPopover.vue +35 -12
  724. package/frontend-vue/layers/dms-layout/app/build/components/layout/RolePreviewBar.vue +137 -0
  725. package/frontend-vue/layers/dms-layout/app/build/components/layout/SidebarUserMenu.vue +113 -0
  726. package/frontend-vue/layers/dms-layout/app/build/components/layout/StageCard.vue +88 -0
  727. package/frontend-vue/layers/dms-layout/app/build/components/layout/UserIdentity.vue +34 -0
  728. package/frontend-vue/layers/dms-layout/app/build/components/layout/sidebarState.ts +5 -1
  729. package/frontend-vue/layers/dms-layout/app/build/components/notification/NotificationPopover.vue +122 -68
  730. package/frontend-vue/layers/dms-layout/app/build/components/pages/modules/ModuleCatalogTile.vue +99 -0
  731. package/frontend-vue/layers/dms-layout/app/build/components/pages/modules/ModuleStoreTile.vue +75 -0
  732. package/frontend-vue/layers/dms-layout/app/build/components/pages/modules/ModuleTile.vue +102 -0
  733. package/frontend-vue/layers/dms-layout/app/build/components/pages/settings/members/MemberRolePicker.vue +184 -0
  734. package/frontend-vue/layers/dms-layout/app/build/components/pages/settings/notification/NotificationInboxDisplay.vue +138 -0
  735. package/frontend-vue/layers/dms-layout/app/build/components/pages/settings/notification/NotificationInboxItem.vue +118 -0
  736. package/frontend-vue/layers/dms-layout/app/build/components/pages/settings/notification/NotificationMatrixCategory.vue +87 -0
  737. package/frontend-vue/layers/dms-layout/app/build/components/pages/settings/notification/NotificationMatrixSubject.vue +88 -0
  738. package/frontend-vue/layers/dms-layout/app/build/components/pages/settings/notification/NotificationPreferencesForm.vue +168 -273
  739. package/frontend-vue/layers/dms-layout/app/build/components/pages/settings/notification/notificationDisplay.ts +86 -0
  740. package/frontend-vue/layers/dms-layout/app/build/components/pages/settings/profile/ProfileAccountData.vue +40 -0
  741. package/frontend-vue/layers/dms-layout/app/build/components/pages/settings/profile/ProfileAvatar.vue +47 -0
  742. package/frontend-vue/layers/dms-layout/app/build/components/pages/settings/profile/ProfilePersonalInfo.vue +344 -0
  743. package/frontend-vue/layers/dms-layout/app/build/components/pages/settings/profile/ProfilePreferencesSummary.vue +68 -0
  744. package/frontend-vue/layers/dms-layout/app/build/components/pages/settings/profile/ProfileSecuritySummary.vue +75 -0
  745. package/frontend-vue/layers/dms-layout/app/build/components/pages/settings/profile/ProfileSummaryRow.vue +101 -0
  746. package/frontend-vue/layers/dms-layout/app/build/components/pages/settings/region/RegionFormatPreview.vue +90 -0
  747. package/frontend-vue/layers/dms-layout/app/build/components/pages/settings/region/RegionTimeZoneInput.vue +62 -0
  748. package/frontend-vue/layers/dms-layout/app/build/components/pages/settings/region/timeZones.ts +96 -0
  749. package/frontend-vue/layers/dms-layout/app/build/components/pages/settings/roles/RoleEditor.vue +370 -0
  750. package/frontend-vue/layers/dms-layout/app/build/components/pages/settings/roles/RoleMemberAvatars.vue +30 -0
  751. package/frontend-vue/layers/dms-layout/app/build/components/pages/settings/roles/RoleOwnerPanel.vue +57 -0
  752. package/frontend-vue/layers/dms-layout/app/build/components/pages/settings/roles/RolePanelHead.vue +41 -0
  753. package/frontend-vue/layers/dms-layout/app/build/components/pages/settings/roles/RolePermissionArea.vue +141 -0
  754. package/frontend-vue/layers/dms-layout/app/build/components/pages/settings/roles/RolePermissionBranch.vue +82 -0
  755. package/frontend-vue/layers/dms-layout/app/build/components/pages/settings/roles/RolePermissionGroup.vue +63 -0
  756. package/frontend-vue/layers/dms-layout/app/build/components/pages/settings/roles/RolePermissionLeaf.vue +209 -0
  757. package/frontend-vue/layers/dms-layout/app/build/components/pages/settings/roles/RolePermissionTree.vue +183 -0
  758. package/frontend-vue/layers/dms-layout/app/build/components/pages/settings/roles/RolesList.vue +158 -0
  759. package/frontend-vue/layers/dms-layout/app/build/components/pages/settings/roles/RolesListItem.vue +95 -0
  760. package/frontend-vue/layers/dms-layout/app/build/components/pages/settings/roles/role-permissions.ts +463 -0
  761. package/frontend-vue/layers/dms-layout/app/build/components/pages/settings/roles/role-types.ts +89 -0
  762. package/frontend-vue/layers/dms-layout/app/build/components/pages/settings/roles/useRoleEditor.ts +204 -0
  763. package/frontend-vue/layers/dms-layout/app/build/components/pages/settings/roles/useRolesApi.ts +71 -0
  764. package/frontend-vue/layers/dms-layout/app/build/components/pages/settings/security/SecurityBackupCodesModal.vue +160 -0
  765. package/frontend-vue/layers/dms-layout/app/build/components/pages/settings/security/SecurityCodeModal.vue +110 -0
  766. package/frontend-vue/layers/dms-layout/app/build/components/pages/settings/security/SecurityDialogFrame.vue +75 -0
  767. package/frontend-vue/layers/dms-layout/app/build/components/pages/settings/security/SecurityEditPanel.vue +169 -0
  768. package/frontend-vue/layers/dms-layout/app/build/components/pages/settings/security/SecurityEmail.vue +402 -0
  769. package/frontend-vue/layers/dms-layout/app/build/components/pages/settings/security/SecurityPanelField.vue +56 -0
  770. package/frontend-vue/layers/dms-layout/app/build/components/pages/settings/security/SecurityPassword.vue +330 -0
  771. package/frontend-vue/layers/dms-layout/app/build/components/pages/settings/security/SecurityPasswordModal.vue +102 -0
  772. package/frontend-vue/layers/dms-layout/app/build/components/pages/settings/security/SecuritySessions.vue +369 -0
  773. package/frontend-vue/layers/dms-layout/app/build/components/pages/settings/security/SecurityStatus.vue +177 -0
  774. package/frontend-vue/layers/dms-layout/app/build/components/pages/settings/security/SecurityTotpSetupModal.vue +189 -0
  775. package/frontend-vue/layers/dms-layout/app/build/components/pages/settings/security/SecurityTwoFactor.vue +597 -0
  776. package/frontend-vue/layers/dms-layout/app/build/components/pages/settings/shell/SettingsNav.vue +225 -0
  777. package/frontend-vue/layers/dms-layout/app/build/components/pages/settings/shell/SettingsShell.vue +22 -0
  778. package/frontend-vue/layers/dms-layout/app/build/components/pages/settings/shortcut/KeyboardShortcut.vue +3 -8
  779. package/frontend-vue/layers/dms-layout/app/build/components/pages/settings/theme/AppearanceAccessibility.vue +62 -0
  780. package/frontend-vue/layers/dms-layout/app/build/components/pages/settings/theme/AppearanceDeveloper.vue +50 -0
  781. package/frontend-vue/layers/dms-layout/app/build/components/pages/settings/theme/AppearanceOptionTile.vue +76 -0
  782. package/frontend-vue/layers/dms-layout/app/build/components/pages/settings/theme/AppearanceScale.vue +55 -0
  783. package/frontend-vue/layers/dms-layout/app/build/components/pages/settings/theme/AppearanceSidebar.vue +19 -0
  784. package/frontend-vue/layers/dms-layout/app/build/components/pages/settings/theme/AppearanceTheme.vue +60 -0
  785. package/frontend-vue/layers/dms-layout/app/build/components/pages/settings/theme/CssVariablesList.vue +276 -168
  786. package/frontend-vue/layers/dms-layout/app/build/components/pages/settings/theme/useAppearanceSave.ts +76 -0
  787. package/frontend-vue/layers/dms-layout/app/build/composables/dev-reload/useDevReloadHolder.ts +358 -0
  788. package/frontend-vue/layers/dms-layout/app/build/composables/general/useSidebarStartCollapsed.ts +14 -0
  789. package/frontend-vue/layers/dms-layout/app/build/composables/navigation/useCategoryNavCards.ts +73 -0
  790. package/frontend-vue/layers/dms-layout/app/build/composables/notification/useNotificationCatalog.ts +85 -0
  791. package/frontend-vue/layers/dms-layout/app/build/composables/notification/useNotificationPreferences.ts +90 -0
  792. package/frontend-vue/layers/dms-layout/app/build/composables/security/useSessionHandoff.ts +55 -0
  793. package/frontend-vue/layers/dms-layout/app/build/composables/settings/profile/preferencesSummary.ts +209 -0
  794. package/frontend-vue/layers/dms-layout/app/build/composables/settings/profile/useAccountData.ts +329 -0
  795. package/frontend-vue/layers/dms-layout/app/build/composables/settings/profile/useProfileAvatar.ts +95 -0
  796. package/frontend-vue/layers/dms-layout/app/build/composables/settings/profile/useProfilePreferences.ts +198 -0
  797. package/frontend-vue/layers/dms-layout/app/build/composables/settings/security/useCodeFieldError.ts +63 -0
  798. package/frontend-vue/layers/dms-layout/app/build/composables/settings/security/useRevealedBackupCodes.ts +53 -0
  799. package/frontend-vue/layers/dms-layout/app/build/composables/settings/security/useSecurityFormat.ts +95 -0
  800. package/frontend-vue/layers/dms-layout/app/build/composables/settings/security/useSecurityOverview.ts +85 -0
  801. package/frontend-vue/layers/dms-layout/app/build/composables/settings/useSettingsNavigation.ts +101 -0
  802. package/frontend-vue/layers/dms-layout/app/build/utils/categoryPages.ts +44 -0
  803. package/frontend-vue/layers/dms-layout/app/build/utils/dev-reload-stream.ts +80 -0
  804. package/frontend-vue/layers/dms-layout/app/build/utils/module-store-catalog.ts +137 -0
  805. package/frontend-vue/layers/dms-layout/app/build/utils/modules-catalog.ts +197 -0
  806. package/frontend-vue/layers/dms-layout/app/components/AppWidgetsDock.vue +49 -16
  807. package/frontend-vue/layers/dms-layout/app/components/layout/DashboardSearch.vue +18 -1
  808. package/frontend-vue/layers/dms-layout/app/components/layout/HStack.vue +2 -1
  809. package/frontend-vue/layers/dms-layout/app/components/layout/Spacer.vue +25 -0
  810. package/frontend-vue/layers/dms-layout/app/components/layout/VStack.vue +2 -1
  811. package/frontend-vue/layers/dms-layout/app/components/navigation/CollapsedMenuItem.vue +65 -4
  812. package/frontend-vue/layers/dms-layout/app/components/navigation/NavigationMenu.vue +109 -4
  813. package/frontend-vue/layers/dms-layout/app/composables/general/useAccessibilityPreferences.ts +52 -0
  814. package/frontend-vue/layers/dms-layout/app/composables/layout/useInstantSaveHeader.ts +34 -0
  815. package/frontend-vue/layers/dms-layout/app/composables/layout/usePageHeaderActions.ts +158 -0
  816. package/frontend-vue/layers/dms-layout/app/composables/notification/useNotifications.ts +169 -110
  817. package/frontend-vue/layers/dms-layout/app/composables/page/useModuleHistory.ts +60 -12
  818. package/frontend-vue/layers/dms-layout/app/composables/page/useModulesListing.ts +62 -26
  819. package/frontend-vue/layers/dms-layout/app/composables/page/usePageComponentPreload.ts +16 -14
  820. package/frontend-vue/layers/dms-layout/app/composables/page/useQuickActions.ts +1 -61
  821. package/frontend-vue/layers/dms-layout/app/composables/profile/useUserLanguage.ts +4 -3
  822. package/frontend-vue/layers/dms-layout/app/composables/useDevReload.ts +4 -359
  823. package/frontend-vue/layers/dms-layout/app/composables/useFooterLinks.ts +20 -1
  824. package/frontend-vue/layers/dms-layout/app/custom-layouts/DefaultLayout.vue +17 -43
  825. package/frontend-vue/layers/dms-layout/app/custom-layouts/EmptyLayout.vue +42 -4
  826. package/frontend-vue/layers/dms-layout/app/custom-layouts/SettingsLayout.vue +42 -0
  827. package/frontend-vue/layers/dms-layout/app/custom-pages/modules.vue +564 -70
  828. package/frontend-vue/layers/dms-layout/app/custom-pages/settings/roles.vue +298 -0
  829. package/frontend-vue/layers/dms-layout/app/custom-pages/settings/shortcuts.vue +162 -109
  830. package/frontend-vue/layers/dms-layout/app/emails/EmailChangeNotice.vue +28 -0
  831. package/frontend-vue/layers/dms-layout/app/emails/EmailChangeVerification.vue +32 -0
  832. package/frontend-vue/layers/dms-layout/app/error.vue +75 -84
  833. package/frontend-vue/layers/dms-layout/app/middleware/page-leave-guard.global.ts +8 -0
  834. package/frontend-vue/layers/dms-layout/app/pages/[...slug].vue +8 -0
  835. package/frontend-vue/layers/dms-layout/app/plugins/accessibility.ts +22 -0
  836. package/frontend-vue/layers/dms-layout/app/plugins/dms-dev-reload.client.ts +13 -16
  837. package/frontend-vue/layers/dms-layout/app/plugins/font-preload.ts +23 -0
  838. package/frontend-vue/layers/dms-layout/app/plugins/notification-stream.client.ts +15 -2
  839. package/frontend-vue/layers/dms-layout/app/plugins/permission-preview-prepaint.ts +40 -0
  840. package/frontend-vue/layers/dms-layout/app/plugins/permission-preview.client.ts +35 -0
  841. package/frontend-vue/layers/dms-layout/app/plugins/profile-sync.client.ts +10 -4
  842. package/frontend-vue/layers/dms-layout/app/plugins/regional-preferences.ts +19 -0
  843. package/frontend-vue/layers/dms-layout/app/theme/actions.ts +385 -0
  844. package/frontend-vue/layers/dms-layout/app/theme/data.ts +174 -0
  845. package/frontend-vue/layers/dms-layout/app/theme/form-controls.ts +657 -0
  846. package/frontend-vue/layers/dms-layout/app/theme/navigation.ts +295 -0
  847. package/frontend-vue/layers/dms-layout/app/theme/surfaces.ts +319 -0
  848. package/frontend-vue/layers/dms-layout/app/types/page.ts +22 -0
  849. package/frontend-vue/layers/dms-layout/app/utils/account-menu.ts +1 -1
  850. package/frontend-vue/layers/dms-layout/i18n/locales/layout-en-GB.json +639 -63
  851. package/frontend-vue/layers/dms-layout/i18n/locales/layout-fr-FR.json +638 -62
  852. package/frontend-vue/layers/dms-layout/public/images/antelope-logo/dark.svg +12 -12
  853. package/frontend-vue/layers/dms-layout/public/images/antelope-logo/light.svg +12 -12
  854. package/frontend-vue/layers/dms-onboarding/app/build/components/onboarding/StepIndicator.vue +44 -0
  855. package/frontend-vue/layers/dms-onboarding/app/build/components/onboarding/StepMeta.vue +41 -0
  856. package/frontend-vue/layers/dms-onboarding/app/build/components/onboarding/steps/platform.vue +153 -0
  857. package/frontend-vue/layers/dms-onboarding/app/build/components/onboarding/steps/ready.vue +191 -0
  858. package/frontend-vue/layers/dms-onboarding/app/build/composables/onboarding/steps.ts +16 -0
  859. package/frontend-vue/layers/dms-onboarding/app/components/onboarding/steps/register.vue +152 -115
  860. package/frontend-vue/layers/dms-onboarding/app/custom-pages/onboarding.vue +60 -1
  861. package/frontend-vue/layers/dms-onboarding/i18n/locales/onboarding-en-GB.json +46 -15
  862. package/frontend-vue/layers/dms-onboarding/i18n/locales/onboarding-fr-FR.json +46 -15
  863. package/frontend-vue/layers/dms-ui/app/build/components/activity-feed/activityFeedDays.ts +173 -0
  864. package/frontend-vue/layers/dms-ui/app/build/components/blocks/BlockActions.vue +72 -0
  865. package/frontend-vue/layers/dms-ui/app/build/components/blocks/BlockStatus.vue +69 -0
  866. package/frontend-vue/layers/dms-ui/app/build/components/chart/internal/ChartSkeleton.vue +56 -0
  867. package/frontend-vue/layers/dms-ui/app/build/components/containers/constants.ts +2 -0
  868. package/frontend-vue/layers/dms-ui/app/build/components/containers/drawer/DynamicDrawer.vue +70 -12
  869. package/frontend-vue/layers/dms-ui/app/build/components/containers/modal/DynamicModal.vue +91 -16
  870. package/frontend-vue/layers/dms-ui/app/build/components/form/ChipGroup.vue +113 -0
  871. package/frontend-vue/layers/dms-ui/app/build/components/form/FormEntries.vue +101 -0
  872. package/frontend-vue/layers/dms-ui/app/build/components/form/FormErrorSummary.vue +51 -0
  873. package/frontend-vue/layers/dms-ui/app/build/components/form/FormErrorText.vue +15 -0
  874. package/frontend-vue/layers/dms-ui/app/build/components/form/FormFieldControl.vue +109 -0
  875. package/frontend-vue/layers/dms-ui/app/build/components/form/FormFieldNotes.vue +96 -0
  876. package/frontend-vue/layers/dms-ui/app/build/components/form/FormRequiredLegend.vue +6 -0
  877. package/frontend-vue/layers/dms-ui/app/build/components/form/FormSectionNav.vue +94 -0
  878. package/frontend-vue/layers/dms-ui/app/build/components/form/FormSections.vue +131 -0
  879. package/frontend-vue/layers/dms-ui/app/build/components/form/OtpInput.vue +108 -0
  880. package/frontend-vue/layers/dms-ui/app/build/components/form/PasswordInput.vue +95 -0
  881. package/frontend-vue/layers/dms-ui/app/build/components/form/SearchInput.vue +102 -0
  882. package/frontend-vue/layers/dms-ui/app/build/components/form/UnsavedStatus.vue +30 -0
  883. package/frontend-vue/layers/dms-ui/app/build/components/period/PeriodRangeCalendar.vue +294 -0
  884. package/frontend-vue/layers/dms-ui/app/build/components/permission/PermissionVeil.vue +118 -0
  885. package/frontend-vue/layers/dms-ui/app/build/components/section/context.ts +10 -0
  886. package/frontend-vue/layers/dms-ui/app/build/components/skeleton/RowSkeleton.vue +38 -0
  887. package/frontend-vue/layers/dms-ui/app/build/components/stat/StatCell.vue +183 -0
  888. package/frontend-vue/layers/dms-ui/app/build/components/table/Actions.vue +397 -37
  889. package/frontend-vue/layers/dms-ui/app/build/components/table/Empty.vue +154 -61
  890. package/frontend-vue/layers/dms-ui/app/build/components/table/FiltersRow.vue +147 -68
  891. package/frontend-vue/layers/dms-ui/app/build/components/table/Menu.vue +13 -1
  892. package/frontend-vue/layers/dms-ui/app/build/components/table/MenuDensity.vue +80 -0
  893. package/frontend-vue/layers/dms-ui/app/build/components/table/MenuFilter.vue +11 -3
  894. package/frontend-vue/layers/dms-ui/app/build/components/table/MenuRoot.vue +11 -0
  895. package/frontend-vue/layers/dms-ui/app/build/components/table/MenuSort.vue +98 -4
  896. package/frontend-vue/layers/dms-ui/app/build/components/table/MenuViewMode.vue +37 -16
  897. package/frontend-vue/layers/dms-ui/app/build/components/table/MonoCell.vue +47 -0
  898. package/frontend-vue/layers/dms-ui/app/build/components/table/Pagination.vue +251 -36
  899. package/frontend-vue/layers/dms-ui/app/build/components/table/RowSelection.vue +210 -32
  900. package/frontend-vue/layers/dms-ui/app/build/components/table/Table.vue +999 -176
  901. package/frontend-vue/layers/dms-ui/app/build/components/table/Tabs.vue +157 -22
  902. package/frontend-vue/layers/dms-ui/app/build/components/table/Views.vue +286 -0
  903. package/frontend-vue/layers/dms-ui/app/build/components/table-view/CardGridSkeleton.vue +61 -0
  904. package/frontend-vue/layers/dms-ui/app/build/components/table-view/CardsDisplay.vue +186 -0
  905. package/frontend-vue/layers/dms-ui/app/build/components/table-view/ExpandedRowDetail.vue +147 -0
  906. package/frontend-vue/layers/dms-ui/app/build/components/table-view/IdentityCell.vue +126 -0
  907. package/frontend-vue/layers/dms-ui/app/build/composables/actions/bulkSelection.ts +67 -0
  908. package/frontend-vue/layers/dms-ui/app/build/composables/actions/rowNavigation.ts +85 -0
  909. package/frontend-vue/layers/dms-ui/app/build/composables/actions/useActionTargets.ts +452 -0
  910. package/frontend-vue/layers/dms-ui/app/build/composables/blocks/useBlockItems.ts +67 -0
  911. package/frontend-vue/layers/dms-ui/app/build/composables/chart/apexTheme.ts +168 -0
  912. package/frontend-vue/layers/dms-ui/app/build/composables/chart/sparklinePath.ts +81 -0
  913. package/frontend-vue/layers/dms-ui/app/build/composables/clipboard/useCopyFeedback.ts +49 -0
  914. package/frontend-vue/layers/dms-ui/app/build/composables/confirm/actionError.ts +142 -0
  915. package/frontend-vue/layers/dms-ui/app/build/composables/confirm/confirmDialogTexts.ts +66 -0
  916. package/frontend-vue/layers/dms-ui/app/build/composables/confirm/useActionConfirm.ts +102 -0
  917. package/frontend-vue/layers/dms-ui/app/build/composables/containers/context.ts +16 -0
  918. package/frontend-vue/layers/dms-ui/app/build/composables/data-types/cellHelpers.ts +39 -0
  919. package/frontend-vue/layers/dms-ui/app/build/composables/data-types/metricCells.ts +265 -0
  920. package/frontend-vue/layers/dms-ui/app/build/composables/data-types/registerDefaults.ts +339 -93
  921. package/frontend-vue/layers/dms-ui/app/build/composables/data-types/registerFieldTypes.ts +64 -0
  922. package/frontend-vue/layers/dms-ui/app/build/composables/data-types/relationValue.ts +66 -0
  923. package/frontend-vue/layers/dms-ui/app/build/composables/data-types/useColumnValueRenderer.ts +122 -0
  924. package/frontend-vue/layers/dms-ui/app/build/composables/form/formEntryContext.ts +55 -0
  925. package/frontend-vue/layers/dms-ui/app/build/composables/form/formFooter.ts +110 -0
  926. package/frontend-vue/layers/dms-ui/app/build/composables/form/formLayout.ts +91 -0
  927. package/frontend-vue/layers/dms-ui/app/build/composables/form/formSections.ts +110 -0
  928. package/frontend-vue/layers/dms-ui/app/build/composables/form/formValidation.ts +180 -0
  929. package/frontend-vue/layers/dms-ui/app/build/composables/form/keyValueRows.ts +64 -0
  930. package/frontend-vue/layers/dms-ui/app/build/composables/form/tagValues.ts +43 -0
  931. package/frontend-vue/layers/dms-ui/app/build/composables/form/useControlError.ts +34 -0
  932. package/frontend-vue/layers/dms-ui/app/build/composables/form/useInstantForm.ts +125 -0
  933. package/frontend-vue/layers/dms-ui/app/build/composables/global/searchShortcuts.ts +61 -0
  934. package/frontend-vue/layers/dms-ui/app/build/composables/global/shortcuts.ts +31 -0
  935. package/frontend-vue/layers/dms-ui/app/build/composables/instant-save/useInstantSave.ts +260 -0
  936. package/frontend-vue/layers/dms-ui/app/build/composables/navigation/useNavBadges.ts +24 -0
  937. package/frontend-vue/layers/dms-ui/app/build/composables/period/periodDisplay.ts +154 -0
  938. package/frontend-vue/layers/dms-ui/app/build/composables/period/usePeriodDraft.ts +127 -0
  939. package/frontend-vue/layers/dms-ui/app/build/composables/shortcuts/useShortcutRegistry.ts +18 -0
  940. package/frontend-vue/layers/dms-ui/app/build/composables/table/constants.ts +7 -1
  941. package/frontend-vue/layers/dms-ui/app/build/composables/table/useTable.ts +27 -10
  942. package/frontend-vue/layers/dms-ui/app/build/composables/table/useTableColumns.ts +437 -72
  943. package/frontend-vue/layers/dms-ui/app/build/composables/table/useTableConfigClipboard.ts +8 -1
  944. package/frontend-vue/layers/dms-ui/app/build/composables/table/useTableStates.ts +0 -7
  945. package/frontend-vue/layers/dms-ui/app/build/composables/table/utils/clearTableFilters.ts +80 -0
  946. package/frontend-vue/layers/dms-ui/app/build/composables/table/utils/columnOrder.ts +34 -0
  947. package/frontend-vue/layers/dms-ui/app/build/composables/table/utils/pageSizeOptions.ts +18 -0
  948. package/frontend-vue/layers/dms-ui/app/build/composables/table-view/displayRegistry.ts +30 -0
  949. package/frontend-vue/layers/dms-ui/app/build/composables/table-view/useAccumulatedPages.ts +46 -0
  950. package/frontend-vue/layers/dms-ui/app/build/composables/table-view/useExpandedRowDetails.ts +56 -0
  951. package/frontend-vue/layers/dms-ui/app/build/composables/table-view/useGroupedRows.ts +125 -0
  952. package/frontend-vue/layers/dms-ui/app/build/composables/table-view/useServerRenderedAsyncData.ts +23 -0
  953. package/frontend-vue/layers/dms-ui/app/build/composables/table-view/useTableFooter.ts +119 -0
  954. package/frontend-vue/layers/dms-ui/app/build/composables/table-view/useTableReorder.ts +77 -0
  955. package/frontend-vue/layers/dms-ui/app/build/composables/table-view/useTableRows.ts +175 -0
  956. package/frontend-vue/layers/dms-ui/app/build/composables/table-view/useTableViewConfig.ts +11 -5
  957. package/frontend-vue/layers/dms-ui/app/build/composables/table-view/useTableViewRowActions.ts +322 -344
  958. package/frontend-vue/layers/dms-ui/app/build/composables/table-view/useTableViews.ts +266 -0
  959. package/frontend-vue/layers/dms-ui/app/build/composables/table-view/utils/bulkActions.ts +152 -0
  960. package/frontend-vue/layers/dms-ui/app/build/composables/table-view/utils/card.ts +75 -0
  961. package/frontend-vue/layers/dms-ui/app/build/composables/table-view/utils/chrome.ts +70 -0
  962. package/frontend-vue/layers/dms-ui/app/build/composables/table-view/utils/expandedRowProps.ts +24 -0
  963. package/frontend-vue/layers/dms-ui/app/build/composables/table-view/utils/expandedRows.ts +51 -0
  964. package/frontend-vue/layers/dms-ui/app/build/composables/table-view/utils/formTexts.ts +127 -0
  965. package/frontend-vue/layers/dms-ui/app/build/composables/table-view/utils/groupedRows.ts +180 -0
  966. package/frontend-vue/layers/dms-ui/app/build/composables/table-view/utils/quickFilters.ts +178 -0
  967. package/frontend-vue/layers/dms-ui/app/build/composables/table-view/utils/recordLink.ts +32 -0
  968. package/frontend-vue/layers/dms-ui/app/build/composables/table-view/utils/reorder.ts +68 -0
  969. package/frontend-vue/layers/dms-ui/app/build/composables/table-view/utils/sortableColumns.ts +189 -0
  970. package/frontend-vue/layers/dms-ui/app/build/composables/table-view/utils/tableQuery.ts +1 -1
  971. package/frontend-vue/layers/dms-ui/app/build/composables/table-view/utils/views.ts +202 -0
  972. package/frontend-vue/layers/dms-ui/app/build/composables/unsaved-changes/formValue.ts +97 -0
  973. package/frontend-vue/layers/dms-ui/app/build/composables/unsaved-changes/registry.ts +216 -0
  974. package/frontend-vue/layers/dms-ui/app/build/types/tree.ts +1 -0
  975. package/frontend-vue/layers/dms-ui/app/build/utils/accessibilityPreferences.ts +138 -0
  976. package/frontend-vue/layers/dms-ui/app/build/utils/codeCells.ts +12 -0
  977. package/frontend-vue/layers/dms-ui/app/build/utils/codeEditor.ts +304 -0
  978. package/frontend-vue/layers/dms-ui/app/build/utils/dispatchQuickActionTarget.ts +74 -0
  979. package/frontend-vue/layers/dms-ui/app/build/utils/eyebrow.ts +7 -0
  980. package/frontend-vue/layers/dms-ui/app/build/utils/fieldOptionsI18n.ts +60 -0
  981. package/frontend-vue/layers/dms-ui/app/build/utils/fieldTrigger.ts +46 -0
  982. package/frontend-vue/layers/dms-ui/app/build/utils/link.ts +33 -0
  983. package/frontend-vue/layers/dms-ui/app/build/utils/literalText.ts +21 -0
  984. package/frontend-vue/layers/dms-ui/app/build/utils/monoChip.ts +13 -0
  985. package/frontend-vue/layers/dms-ui/app/build/utils/permissionPreview.ts +6 -0
  986. package/frontend-vue/layers/dms-ui/app/build/utils/quickActionTargets.ts +54 -0
  987. package/frontend-vue/layers/dms-ui/app/build/utils/relativeDate.ts +67 -0
  988. package/frontend-vue/layers/dms-ui/app/build/utils/selectionScope.ts +20 -0
  989. package/frontend-vue/layers/dms-ui/app/build/utils/textLink.ts +7 -0
  990. package/frontend-vue/layers/dms-ui/app/build/utils/tileRow.ts +10 -0
  991. package/frontend-vue/layers/dms-ui/app/build/utils/tone.ts +74 -0
  992. package/frontend-vue/layers/dms-ui/app/components/RecursiveComponent.vue +106 -37
  993. package/frontend-vue/layers/dms-ui/app/components/activity/ActivityItem.vue +80 -54
  994. package/frontend-vue/layers/dms-ui/app/components/activity-feed/ActivityFeed.vue +250 -0
  995. package/frontend-vue/layers/dms-ui/app/components/banner/Banner.vue +100 -57
  996. package/frontend-vue/layers/dms-ui/app/components/blocks/BannerBlock.vue +117 -0
  997. package/frontend-vue/layers/dms-ui/app/components/blocks/CardBlock.vue +99 -0
  998. package/frontend-vue/layers/dms-ui/app/components/blocks/EmptyStateBlock.vue +69 -0
  999. package/frontend-vue/layers/dms-ui/app/components/blocks/KeyValueListBlock.vue +113 -0
  1000. package/frontend-vue/layers/dms-ui/app/components/blocks/NavCardGridBlock.vue +199 -0
  1001. package/frontend-vue/layers/dms-ui/app/components/blocks/StatGroupBlock.vue +92 -0
  1002. package/frontend-vue/layers/dms-ui/app/components/card/Card.vue +82 -3
  1003. package/frontend-vue/layers/dms-ui/app/components/card/NavCard.vue +94 -28
  1004. package/frontend-vue/layers/dms-ui/app/components/chart/ApexChartHost.vue +149 -10
  1005. package/frontend-vue/layers/dms-ui/app/components/chart/Chart.vue +76 -24
  1006. package/frontend-vue/layers/dms-ui/app/components/chart/ChartCard.vue +62 -25
  1007. package/frontend-vue/layers/dms-ui/app/components/chart/internal/Sparkline.vue +98 -81
  1008. package/frontend-vue/layers/dms-ui/app/components/chart/internal/TrendBadge.vue +67 -26
  1009. package/frontend-vue/layers/dms-ui/app/components/check-list/CheckList.vue +228 -0
  1010. package/frontend-vue/layers/dms-ui/app/components/check-list/PasswordRules.vue +140 -0
  1011. package/frontend-vue/layers/dms-ui/app/components/confirm/ConfirmModal.vue +446 -13
  1012. package/frontend-vue/layers/dms-ui/app/components/copy/CopyButton.vue +5 -5
  1013. package/frontend-vue/layers/dms-ui/app/components/empty-state/EmptyState.vue +139 -0
  1014. package/frontend-vue/layers/dms-ui/app/components/field-error/FieldError.vue +31 -0
  1015. package/frontend-vue/layers/dms-ui/app/components/field-row/FieldRow.vue +156 -0
  1016. package/frontend-vue/layers/dms-ui/app/components/flow-canvas/FlowCanvas.vue +8 -0
  1017. package/frontend-vue/layers/dms-ui/app/components/form/Form.vue +652 -274
  1018. package/frontend-vue/layers/dms-ui/app/components/form/LocalizedField.vue +114 -37
  1019. package/frontend-vue/layers/dms-ui/app/components/form/components/BooleanCard.vue +55 -0
  1020. package/frontend-vue/layers/dms-ui/app/components/form/components/Calendar.vue +59 -7
  1021. package/frontend-vue/layers/dms-ui/app/components/form/components/Cascader.vue +32 -4
  1022. package/frontend-vue/layers/dms-ui/app/components/form/components/Checkbox.vue +9 -1
  1023. package/frontend-vue/layers/dms-ui/app/components/form/components/ChoiceCards.vue +64 -0
  1024. package/frontend-vue/layers/dms-ui/app/components/form/components/CopyableText.vue +26 -0
  1025. package/frontend-vue/layers/dms-ui/app/components/form/components/DatePicker.vue +140 -12
  1026. package/frontend-vue/layers/dms-ui/app/components/form/components/DatePickerRange.vue +17 -0
  1027. package/frontend-vue/layers/dms-ui/app/components/form/components/File.vue +35 -21
  1028. package/frontend-vue/layers/dms-ui/app/components/form/components/Image.vue +86 -38
  1029. package/frontend-vue/layers/dms-ui/app/components/form/components/InputAddress.vue +113 -1
  1030. package/frontend-vue/layers/dms-ui/app/components/form/components/InputCode.vue +196 -0
  1031. package/frontend-vue/layers/dms-ui/app/components/form/components/InputColor.vue +37 -7
  1032. package/frontend-vue/layers/dms-ui/app/components/form/components/InputNumber.vue +27 -5
  1033. package/frontend-vue/layers/dms-ui/app/components/form/components/InputPassword.vue +21 -39
  1034. package/frontend-vue/layers/dms-ui/app/components/form/components/InputPercentage.vue +16 -8
  1035. package/frontend-vue/layers/dms-ui/app/components/form/components/InputSecret.vue +107 -0
  1036. package/frontend-vue/layers/dms-ui/app/components/form/components/InputTags.vue +132 -0
  1037. package/frontend-vue/layers/dms-ui/app/components/form/components/InputTime.vue +16 -4
  1038. package/frontend-vue/layers/dms-ui/app/components/form/components/KeyValue.vue +85 -0
  1039. package/frontend-vue/layers/dms-ui/app/components/form/components/Relation.vue +21 -2
  1040. package/frontend-vue/layers/dms-ui/app/components/form/components/Repeater.vue +258 -0
  1041. package/frontend-vue/layers/dms-ui/app/components/form/components/RichText.vue +66 -15
  1042. package/frontend-vue/layers/dms-ui/app/components/form/components/SegmentedSelect.vue +49 -0
  1043. package/frontend-vue/layers/dms-ui/app/components/form/components/Select.vue +2 -0
  1044. package/frontend-vue/layers/dms-ui/app/components/grid/Grid.vue +47 -10
  1045. package/frontend-vue/layers/dms-ui/app/components/grid/GridRow.vue +42 -15
  1046. package/frontend-vue/layers/dms-ui/app/components/grid/columns.ts +84 -0
  1047. package/frontend-vue/layers/dms-ui/app/components/grid/constants.ts +16 -0
  1048. package/frontend-vue/layers/dms-ui/app/components/icon-well/IconWell.vue +84 -0
  1049. package/frontend-vue/layers/dms-ui/app/components/key-value-list/KeyValueList.vue +223 -0
  1050. package/frontend-vue/layers/dms-ui/app/components/kpi/KpiCard.vue +184 -64
  1051. package/frontend-vue/layers/dms-ui/app/components/link/AutoLink.vue +33 -0
  1052. package/frontend-vue/layers/dms-ui/app/components/list-row/ListRow.vue +301 -0
  1053. package/frontend-vue/layers/dms-ui/app/components/master-detail/MasterDetail.vue +3 -1
  1054. package/frontend-vue/layers/dms-ui/app/components/meter/Meter.vue +241 -0
  1055. package/frontend-vue/layers/dms-ui/app/components/meter/MeterBlock.vue +182 -0
  1056. package/frontend-vue/layers/dms-ui/app/components/period/PeriodSelector.vue +520 -166
  1057. package/frontend-vue/layers/dms-ui/app/components/record-card/RecordCard.vue +170 -0
  1058. package/frontend-vue/layers/dms-ui/app/components/save-bar/InstantSaveBadge.vue +54 -0
  1059. package/frontend-vue/layers/dms-ui/app/components/save-bar/SaveBar.vue +167 -0
  1060. package/frontend-vue/layers/dms-ui/app/components/save-bar/SaveStatus.vue +69 -0
  1061. package/frontend-vue/layers/dms-ui/app/components/section/Section.vue +96 -0
  1062. package/frontend-vue/layers/dms-ui/app/components/section-header/Eyebrow.vue +68 -0
  1063. package/frontend-vue/layers/dms-ui/app/components/section-header/SectionHeader.vue +121 -0
  1064. package/frontend-vue/layers/dms-ui/app/components/segmented/Segmented.vue +142 -33
  1065. package/frontend-vue/layers/dms-ui/app/components/stat-group/StatGroup.vue +186 -0
  1066. package/frontend-vue/layers/dms-ui/app/components/status/StatusSummary.vue +145 -43
  1067. package/frontend-vue/layers/dms-ui/app/components/status-pill/StatusPill.vue +167 -0
  1068. package/frontend-vue/layers/dms-ui/app/components/tab/Tab.vue +80 -6
  1069. package/frontend-vue/layers/dms-ui/app/components/table-view/FilePreview.vue +1 -1
  1070. package/frontend-vue/layers/dms-ui/app/components/table-view/KanbanBoard.vue +165 -34
  1071. package/frontend-vue/layers/dms-ui/app/components/table-view/KanbanDisplay.vue +9 -12
  1072. package/frontend-vue/layers/dms-ui/app/components/table-view/TableView.vue +990 -110
  1073. package/frontend-vue/layers/dms-ui/app/components/top-list/TopListCard.vue +158 -70
  1074. package/frontend-vue/layers/dms-ui/app/components/top-list/internal/TopListRow.vue +53 -19
  1075. package/frontend-vue/layers/dms-ui/app/composables/chart/apexPlotOptions.ts +37 -6
  1076. package/frontend-vue/layers/dms-ui/app/composables/chart/apexTypeConfigs.ts +4 -3
  1077. package/frontend-vue/layers/dms-ui/app/composables/chart/resolveSparklineAccent.ts +6 -3
  1078. package/frontend-vue/layers/dms-ui/app/composables/chart/useApexChart.ts +157 -113
  1079. package/frontend-vue/layers/dms-ui/app/composables/chart/useChartFetch.ts +56 -17
  1080. package/frontend-vue/layers/dms-ui/app/composables/chart/useChartTheme.ts +58 -9
  1081. package/frontend-vue/layers/dms-ui/app/composables/confirm/index.ts +1 -0
  1082. package/frontend-vue/layers/dms-ui/app/composables/confirm/types.ts +102 -0
  1083. package/frontend-vue/layers/dms-ui/app/composables/confirm/useConfirm.ts +6 -8
  1084. package/frontend-vue/layers/dms-ui/app/composables/containers/openDynamicContainer.ts +1 -0
  1085. package/frontend-vue/layers/dms-ui/app/composables/containers/types.ts +30 -1
  1086. package/frontend-vue/layers/dms-ui/app/composables/form/types/api.ts +1 -1
  1087. package/frontend-vue/layers/dms-ui/app/composables/form/types/field.ts +34 -0
  1088. package/frontend-vue/layers/dms-ui/app/composables/form/types/props.ts +34 -3
  1089. package/frontend-vue/layers/dms-ui/app/composables/form/useForm.ts +392 -94
  1090. package/frontend-vue/layers/dms-ui/app/composables/global/keyboardPlatform.ts +125 -0
  1091. package/frontend-vue/layers/dms-ui/app/composables/resolveDmsComponent.ts +14 -17
  1092. package/frontend-vue/layers/dms-ui/app/composables/tab/types/props.ts +8 -0
  1093. package/frontend-vue/layers/dms-ui/app/composables/table-view/types/action-target.ts +6 -10
  1094. package/frontend-vue/layers/dms-ui/app/composables/table-view/types/column.ts +14 -0
  1095. package/frontend-vue/layers/dms-ui/app/composables/table-view/types/config.ts +216 -4
  1096. package/frontend-vue/layers/dms-ui/app/composables/table-view/types/custom-button.ts +8 -0
  1097. package/frontend-vue/layers/dms-ui/app/composables/table-view/types/display.ts +94 -3
  1098. package/frontend-vue/layers/dms-ui/app/composables/table-view/useTableDataChanges.ts +41 -0
  1099. package/frontend-vue/layers/dms-ui/app/composables/table-view/useTableViewDisplays.ts +42 -27
  1100. package/frontend-vue/layers/dms-ui/app/composables/unsaved-changes/index.ts +2 -0
  1101. package/frontend-vue/layers/dms-ui/app/composables/unsaved-changes/useFormDirty.ts +54 -0
  1102. package/frontend-vue/layers/dms-ui/app/composables/unsaved-changes/useUnsavedChanges.ts +120 -0
  1103. package/frontend-vue/layers/dms-ui/app/composables/usePasswordStrength.ts +12 -6
  1104. package/frontend-vue/layers/dms-ui/app/config/shortcuts-registry.ts +5 -5
  1105. package/frontend-vue/layers/dms-ui/app/plugins/shortcuts.ts +2 -0
  1106. package/frontend-vue/layers/dms-ui/app/plugins/table-view-displays.ts +55 -0
  1107. package/frontend-vue/layers/dms-ui/app/types/modal.ts +3 -1
  1108. package/frontend-vue/layers/dms-ui/app/types/row-action.ts +27 -0
  1109. package/frontend-vue/layers/dms-ui/app/types/tone.ts +13 -0
  1110. package/frontend-vue/layers/dms-ui/app/utils/semanticTint.ts +1 -1
  1111. package/frontend-vue/layers/dms-ui/i18n/locales/ui-en-GB.json +330 -86
  1112. package/frontend-vue/layers/dms-ui/i18n/locales/ui-fr-FR.json +326 -82
  1113. package/frontend-vue/package.json +14 -3
  1114. package/frontend-vue/pnpm-lock.yaml +284 -492
  1115. package/frontend-vue/tests/accessibility-preferences.test.ts +320 -0
  1116. package/frontend-vue/tests/activity-feed-days.test.ts +125 -0
  1117. package/frontend-vue/tests/category-nav-cards.test.ts +97 -0
  1118. package/frontend-vue/tests/chart-colors.test.ts +1 -1
  1119. package/frontend-vue/tests/chart-series-styles.test.ts +9 -9
  1120. package/frontend-vue/tests/chip-group.test.ts +68 -0
  1121. package/frontend-vue/tests/confirm-action-errors.test.ts +324 -0
  1122. package/frontend-vue/tests/confirm-dialog-fields.test.ts +271 -0
  1123. package/frontend-vue/tests/confirm-typed-text.test.ts +201 -0
  1124. package/frontend-vue/tests/copy-feedback.test.ts +48 -0
  1125. package/frontend-vue/tests/custom-action-confirm-from.test.ts +85 -0
  1126. package/frontend-vue/tests/dev-reload-stream.test.ts +139 -0
  1127. package/frontend-vue/tests/dev-reload.test.ts +2 -2
  1128. package/frontend-vue/tests/error-page-message.test.ts +15 -0
  1129. package/frontend-vue/tests/field-errors.test.ts +212 -0
  1130. package/frontend-vue/tests/field-options-i18n.test.ts +41 -0
  1131. package/frontend-vue/tests/field-row.test.ts +101 -0
  1132. package/frontend-vue/tests/file-unavailable.test.ts +7 -1
  1133. package/frontend-vue/tests/form-action-reset.test.ts +106 -0
  1134. package/frontend-vue/tests/form-actions.test.ts +6 -7
  1135. package/frontend-vue/tests/form-control-error-state.test.ts +164 -0
  1136. package/frontend-vue/tests/form-footer-kind.test.ts +96 -0
  1137. package/frontend-vue/tests/form-reload-on-reopen.test.ts +20 -0
  1138. package/frontend-vue/tests/form-required-fields.test.ts +16 -0
  1139. package/frontend-vue/tests/form-required-validation.test.ts +407 -0
  1140. package/frontend-vue/tests/form-sections.test.ts +94 -0
  1141. package/frontend-vue/tests/form-server-field-errors.test.ts +187 -0
  1142. package/frontend-vue/tests/form-submit-clear.test.ts +406 -0
  1143. package/frontend-vue/tests/form-submit-only-changed.test.ts +195 -0
  1144. package/frontend-vue/tests/form-validation.test.ts +213 -0
  1145. package/frontend-vue/tests/grid-responsive-columns.test.ts +68 -1
  1146. package/frontend-vue/tests/header-action-press-in-place.test.ts +231 -0
  1147. package/frontend-vue/tests/image-hydration-ids.test.ts +10 -1
  1148. package/frontend-vue/tests/image-reference-preservation.test.ts +18 -2
  1149. package/frontend-vue/tests/input-tags.test.ts +146 -0
  1150. package/frontend-vue/tests/instant-save-badge.test.ts +195 -0
  1151. package/frontend-vue/tests/instant-save.test.ts +217 -0
  1152. package/frontend-vue/tests/key-value-rows.test.ts +52 -0
  1153. package/frontend-vue/tests/keyboard-platform.test.ts +87 -0
  1154. package/frontend-vue/tests/kpi-no-comparison.test.ts +92 -0
  1155. package/frontend-vue/tests/member-role-picker.test.ts +227 -0
  1156. package/frontend-vue/tests/metadata-retry.test.ts +12 -1
  1157. package/frontend-vue/tests/meter-block-load-error.test.ts +70 -0
  1158. package/frontend-vue/tests/module-store-catalog.test.ts +152 -0
  1159. package/frontend-vue/tests/modules-catalog.test.ts +152 -0
  1160. package/frontend-vue/tests/notification-inbox-display.test.ts +169 -0
  1161. package/frontend-vue/tests/notification-popover-errors.test.ts +136 -17
  1162. package/frontend-vue/tests/onboarding-register.test.ts +71 -44
  1163. package/frontend-vue/tests/otp-input.test.ts +97 -0
  1164. package/frontend-vue/tests/page-fill-height.test.ts +82 -16
  1165. package/frontend-vue/tests/password-input.test.ts +122 -0
  1166. package/frontend-vue/tests/period-draft.test.ts +120 -0
  1167. package/frontend-vue/tests/period-presets.test.ts +12 -0
  1168. package/frontend-vue/tests/period-scope-first-fetch.test.ts +93 -8
  1169. package/frontend-vue/tests/permission-preview-partial.test.ts +301 -0
  1170. package/frontend-vue/tests/permission-preview-session.test.ts +69 -0
  1171. package/frontend-vue/tests/permission-preview.test.ts +196 -0
  1172. package/frontend-vue/tests/permission-veil-stable-content.test.ts +191 -0
  1173. package/frontend-vue/tests/profile-preferences-summary.test.ts +510 -0
  1174. package/frontend-vue/tests/quick-actions.test.ts +2 -2
  1175. package/frontend-vue/tests/record-card.test.ts +73 -0
  1176. package/frontend-vue/tests/regional-format.test.ts +67 -0
  1177. package/frontend-vue/tests/regional-preferences.test.ts +209 -0
  1178. package/frontend-vue/tests/relation-value.test.ts +39 -0
  1179. package/frontend-vue/tests/resolve-dms-component.test.ts +47 -0
  1180. package/frontend-vue/tests/response-warning-toast.test.ts +1 -1
  1181. package/frontend-vue/tests/revealed-backup-codes.test.ts +58 -0
  1182. package/frontend-vue/tests/role-permission-tree.test.ts +470 -0
  1183. package/frontend-vue/tests/role-permissions.test.ts +539 -0
  1184. package/frontend-vue/tests/roles-name-errors.test.ts +295 -0
  1185. package/frontend-vue/tests/save-bar.test.ts +106 -0
  1186. package/frontend-vue/tests/save-status-error.test.ts +66 -0
  1187. package/frontend-vue/tests/search-input.test.ts +91 -0
  1188. package/frontend-vue/tests/section-description-only.test.ts +33 -0
  1189. package/frontend-vue/tests/security-email-panel.test.ts +378 -0
  1190. package/frontend-vue/tests/security-password-modal.test.ts +128 -0
  1191. package/frontend-vue/tests/security-password-panel.test.ts +267 -0
  1192. package/frontend-vue/tests/security-sessions-load-error.test.ts +123 -0
  1193. package/frontend-vue/tests/security-status-load-error.test.ts +106 -0
  1194. package/frontend-vue/tests/selection-scope.test.ts +24 -0
  1195. package/frontend-vue/tests/session-handoff.test.ts +60 -0
  1196. package/frontend-vue/tests/settings-navigation.test.ts +170 -0
  1197. package/frontend-vue/tests/settings-search-shortcuts.test.ts +191 -0
  1198. package/frontend-vue/tests/shortcuts-aggregate.test.ts +12 -5
  1199. package/frontend-vue/tests/sidebar-footer-navigation.test.ts +10 -0
  1200. package/frontend-vue/tests/sidebar-search-hint.test.ts +191 -0
  1201. package/frontend-vue/tests/signup-invitation-link.test.ts +6 -2
  1202. package/frontend-vue/tests/stat-cell-shared.test.ts +64 -0
  1203. package/frontend-vue/tests/tab-slot-spacing.test.ts +21 -0
  1204. package/frontend-vue/tests/table-actions-column-width.test.ts +85 -0
  1205. package/frontend-vue/tests/table-cell-wrap.test.ts +8 -3
  1206. package/frontend-vue/tests/table-clear-filters.test.ts +254 -0
  1207. package/frontend-vue/tests/table-density-menu.test.ts +128 -0
  1208. package/frontend-vue/tests/table-header-placement.test.ts +21 -0
  1209. package/frontend-vue/tests/table-metric-cells.test.ts +139 -0
  1210. package/frontend-vue/tests/table-page-size-options.test.ts +20 -0
  1211. package/frontend-vue/tests/table-row-action-errors.test.ts +360 -0
  1212. package/frontend-vue/tests/table-row-hover.test.ts +6 -1
  1213. package/frontend-vue/tests/table-scroll-area.test.ts +43 -0
  1214. package/frontend-vue/tests/table-view-bulk-actions.test.ts +154 -0
  1215. package/frontend-vue/tests/table-view-bulk-drawer.test.ts +311 -0
  1216. package/frontend-vue/tests/table-view-card-props.test.ts +226 -0
  1217. package/frontend-vue/tests/table-view-chrome.test.ts +175 -0
  1218. package/frontend-vue/tests/table-view-display-registry.test.ts +59 -0
  1219. package/frontend-vue/tests/table-view-expanded-band.test.ts +143 -0
  1220. package/frontend-vue/tests/table-view-expanded-row-details.test.ts +88 -0
  1221. package/frontend-vue/tests/table-view-expanded-rows.test.ts +55 -0
  1222. package/frontend-vue/tests/table-view-form-texts.test.ts +124 -0
  1223. package/frontend-vue/tests/table-view-grouped.test.ts +277 -0
  1224. package/frontend-vue/tests/table-view-pagination-modes.test.ts +48 -0
  1225. package/frontend-vue/tests/table-view-reorder.test.ts +122 -0
  1226. package/frontend-vue/tests/table-view-selection-footer-empty.test.ts +379 -0
  1227. package/frontend-vue/tests/table-view-sortable-columns.test.ts +293 -0
  1228. package/frontend-vue/tests/table-view-sources.test.ts +115 -0
  1229. package/frontend-vue/tests/table-view-views.test.ts +540 -0
  1230. package/frontend-vue/tests/tag-values.test.ts +32 -0
  1231. package/frontend-vue/tests/time-span.test.ts +37 -0
  1232. package/frontend-vue/tests/tone.test.ts +45 -0
  1233. package/frontend-vue/tests/unsaved-changes.test.ts +184 -0
  1234. package/frontend-vue/tests/url-interpolation.test.ts +40 -0
  1235. package/frontend-vue/tests/vue-inventory.test.ts +24 -9
  1236. package/frontend-vue/vitest.config.ts +6 -0
  1237. package/package.json +8 -5
  1238. package/skills/dms/REFERENCE.md +1 -1
  1239. package/skills/dms/SKILL.md +1 -1
  1240. package/skills/dms-auth/SKILL.md +2 -1
  1241. package/skills/dms-module/SKILL.md +1 -1
  1242. package/skills/dms-pages/REFERENCE.md +3 -3
  1243. package/skills/dms-pages/SKILL.md +5 -4
  1244. package/frontend-vue/antelope.config.json +0 -5
  1245. package/frontend-vue/layers/dms-layout/app/build/components/pages/settings/notification/NotificationsList.vue +0 -226
  1246. package/frontend-vue/layers/dms-layout/app/components/profile/ProfileLanguage.vue +0 -51
  1247. package/frontend-vue/layers/dms-layout/app/components/profile/ProfileSessions.vue +0 -321
  1248. package/frontend-vue/layers/dms-layout/app/components/profile/ProfileTwoFactor.vue +0 -501
  1249. package/frontend-vue/layers/dms-layout/app/custom-pages/settings/appearance.vue +0 -174
  1250. package/frontend-vue/layers/dms-layout/app/custom-pages/settings/index.vue +0 -164
  1251. package/frontend-vue/layers/dms-layout/app/custom-pages/settings/notifications.vue +0 -15
  1252. package/frontend-vue/layers/dms-layout/app/plugins/language-sync.ts +0 -10
  1253. package/frontend-vue/layers/dms-ui/app/build/components/form/PermissionsTreeNode.vue +0 -148
  1254. package/frontend-vue/layers/dms-ui/app/components/form/components/InputTree.vue +0 -98
  1255. package/frontend-vue/layers/dms-ui/app/components/form/components/PermissionsTree.vue +0 -133
  1256. package/frontend-vue/layers/dms-ui/app/components/tree/Tree.vue +0 -196
  1257. package/frontend-vue/layers/dms-ui/app/composables/tree/shortcuts/index.ts +0 -65
  1258. package/frontend-vue/layers/dms-ui/app/composables/tree/shortcuts/treeArrowDown.ts +0 -11
  1259. package/frontend-vue/layers/dms-ui/app/composables/tree/shortcuts/treeArrowUp.ts +0 -11
  1260. package/frontend-vue/layers/dms-ui/app/composables/tree/shortcuts/treeEnd.ts +0 -11
  1261. package/frontend-vue/layers/dms-ui/app/composables/tree/shortcuts/treeEnter.ts +0 -11
  1262. package/frontend-vue/layers/dms-ui/app/composables/tree/shortcuts/treeEscape.ts +0 -35
  1263. package/frontend-vue/layers/dms-ui/app/composables/tree/shortcuts/treeHome.ts +0 -11
  1264. package/frontend-vue/layers/dms-ui/app/composables/tree/shortcuts/treeShiftA.ts +0 -32
  1265. package/frontend-vue/layers/dms-ui/app/composables/tree/shortcuts/treeSpace.ts +0 -11
  1266. package/frontend-vue/layers/dms-ui/app/composables/tree/types/events.ts +0 -8
  1267. package/frontend-vue/layers/dms-ui/app/composables/tree/types/index.ts +0 -4
  1268. package/frontend-vue/layers/dms-ui/app/composables/tree/types/navigation.ts +0 -7
  1269. package/frontend-vue/layers/dms-ui/app/composables/tree/types/node.ts +0 -12
  1270. package/frontend-vue/layers/dms-ui/app/composables/tree/types/props.ts +0 -34
  1271. package/frontend-vue/layers/dms-ui/app/composables/tree/useTree.ts +0 -334
  1272. package/frontend-vue/layers/dms-ui/app/plugins/table-view-displays.client.ts +0 -31
  1273. package/frontend-vue/tests/tree-escape-shortcut.test.ts +0 -138
  1274. package/frontend-vue/tests/tree-without-source.test.ts +0 -79
  1275. /package/frontend-vue/layers/dms-ui/app/{utils → build/utils}/responseWarning.ts +0 -0
@@ -22,9 +22,14 @@ import type {
22
22
  import type { DmsAppConfig } from "#dms-core/shared/types/app-config";
23
23
  import { useTable } from "../../composables/table/useTable";
24
24
  import type { LabeledColumn } from "../../composables/table/useTableColumns";
25
+ import {
26
+ defaultSortingState,
27
+ type SortValueKind,
28
+ } from "../../composables/table-view/utils/sortableColumns";
25
29
  import type {
26
30
  CustomButton,
27
31
  TableViewDisplayCapabilities,
32
+ TableViewEmptyStatesConfig,
28
33
  } from "../../../composables/table-view/types";
29
34
  import type {
30
35
  FormContainer,
@@ -33,15 +38,66 @@ import type {
33
38
  import type { CustomRowAction } from "../../../types/row-action";
34
39
  import type { RowActionConfig } from "#dms-core/app/types/row-action";
35
40
  import type { TableTabItem } from "./Tabs.vue";
41
+ import type { ColumnDisplay } from "../../composables/data-types/useColumnValueRenderer";
42
+ import type { ResolvedTableChrome } from "../../composables/table-view/utils/chrome";
43
+ import type { ResolvedQuickFilter } from "../../composables/table-view/utils/quickFilters";
44
+ import type { ClearableTableFilters } from "../../composables/table/utils/clearTableFilters";
45
+ import type { EventHookOn } from "@vueuse/core";
46
+ import type { VNodeChild } from "vue";
36
47
 
37
48
  export interface Data {
38
49
  [key: string]: unknown;
39
50
  }
40
51
 
52
+ export type TableDensity = "default" | "compact";
53
+
54
+ /**
55
+ * Rows split into groups under header rows, the `grouped` display: the rows
56
+ * arrive sorted on the grouped column, and a page starting inside a group
57
+ * repeats its header.
58
+ */
59
+ export interface TableRowGrouping<T = Data> {
60
+ /** Key of the group a row belongs to. */
61
+ keyOf: (row: T) => string;
62
+ /** Content of a group's header row, read off its first row. */
63
+ header: (key: string, row: T) => VNodeChild;
64
+ /** Number of rows the group holds, once counted. */
65
+ countOf?: (key: string) => number | undefined;
66
+ /** A click on the header folds the group's rows. */
67
+ collapsible?: boolean;
68
+ }
69
+
70
+ /**
71
+ * A list growing by pages instead of paging (`loadMore`, `infinite`): what
72
+ * the footer shows instead of its pager.
73
+ */
74
+ export interface TableAccumulation {
75
+ mode: "loadMore" | "infinite";
76
+ /** Rows listed so far. */
77
+ shown: number;
78
+ hasMore: boolean;
79
+ loading: boolean;
80
+ /** Appends the next page. */
81
+ load: () => void;
82
+ }
83
+
84
+ /** Rows ordered by hand (backend `reorder`): a handle moves a row. */
85
+ export interface TableReorder {
86
+ /** Off while a search, a filter or a tab narrows the rows. */
87
+ enabled: boolean;
88
+ /** Moves the row at `from` to `to`, within the page. */
89
+ move: (from: number, to: number) => void;
90
+ }
91
+
92
+ /** Where a table draws its views (see `TableProps.viewsPlacement`). */
93
+ export type TableViewsPlacement = "band" | "header";
94
+
41
95
  export type TableColumn<T> = ColumnDef<T> & {
42
96
  type?: DataTypeConfig;
43
97
  /** Wrap the default cell renderer without clipping; custom cell slots own their layout. */
44
98
  cellWrap?: boolean;
99
+ /** Data type the cells render through instead of the column's own `type`. */
100
+ display?: ColumnDisplay;
45
101
  };
46
102
 
47
103
  export interface TableRowActionOptions {
@@ -103,6 +159,13 @@ export interface TableProps<T> {
103
159
  formPages?: FormPageUrls;
104
160
  routeParams?: Record<string, string>;
105
161
  defaultSort?: { field: string; desc?: boolean };
162
+ /**
163
+ * Name of the default sort's column in the toolbar sort menu: the field may
164
+ * not be a displayed column. Defaults to the column's label.
165
+ */
166
+ defaultSortLabel?: string;
167
+ /** How the default sort's values compare, for its direction label. */
168
+ defaultSortKind?: SortValueKind;
106
169
  initialColumnVisibility?: VisibilityState;
107
170
  presenceByRow?: TableRowPresenceMap;
108
171
  canExport?: boolean;
@@ -110,13 +173,61 @@ export interface TableProps<T> {
110
173
  * Displays offered by this table view (registry ∩ config, filtered by
111
174
  * availability). When more than one, the options menu shows a "view mode"
112
175
  * switcher. In kanban mode the menu also edits the `kanbanGroupBy` model
113
- * among `kanbanGroupByOptions`.
176
+ * among `kanbanGroupByOptions`, in grouped mode the `groupedGroupBy` model
177
+ * among `groupedGroupByOptions`.
114
178
  */
115
179
  displays?: TableViewSwitcherItem[];
116
180
  kanbanGroupByOptions?: KanbanGroupByOption[];
181
+ groupedGroupByOptions?: KanbanGroupByOption[];
117
182
  /** Chrome capabilities of the active display; gates filters/search/sort/columns. */
118
183
  activeCapabilities?: Required<TableViewDisplayCapabilities>;
119
184
 
185
+ /**
186
+ * Archive mode: shows the "Archived" toolbar toggle (bound to the
187
+ * `showArchived` model). While on, the table lists archived rows under an
188
+ * amber strip and swaps the row and bulk actions to restore.
189
+ */
190
+ archiveToggle?: boolean;
191
+ /**
192
+ * Controls drawn around the rows (the resolved backend `chrome`). Defaults
193
+ * to the full chrome.
194
+ */
195
+ chrome?: ResolvedTableChrome;
196
+ /** Placeholder of the search field. */
197
+ searchPlaceholder?: string;
198
+ /**
199
+ * One-click dropdown filters of the toolbar, writing the column filters
200
+ * (the `columnFilters` model).
201
+ */
202
+ quickFilters?: ResolvedQuickFilter[];
203
+ /** Footer texts: the row count (i18n key receiving `{ count }`) and a hint. */
204
+ footer?: TableFooterTexts;
205
+ /**
206
+ * The table's own rows per page, offered in the footer picker next to the
207
+ * standard sizes.
208
+ */
209
+ defaultPageSize?: number;
210
+ /**
211
+ * Caps the rows in a scroll area of their own (any CSS length), under a
212
+ * header band that stays in view.
213
+ */
214
+ maxHeight?: string;
215
+ /**
216
+ * Where the `views` slot is drawn: a band of its own under the header
217
+ * (views as tabs or pills), or inside the header (a views menu).
218
+ */
219
+ viewsPlacement?: TableViewsPlacement;
220
+ /** Splits the rows into groups under header rows. */
221
+ grouping?: TableRowGrouping<T>;
222
+ /** The list grows by pages instead of paging. */
223
+ accumulation?: TableAccumulation;
224
+ /** Rows ordered by hand: a drag handle in front of each row. */
225
+ reorder?: TableReorder;
226
+ /** Custom actions the selection bar offers (backend `bulk`). */
227
+ bulkActions?: CustomRowAction[];
228
+ /** What the empty body says, per reason it is empty. */
229
+ emptyStates?: TableViewEmptyStatesConfig;
230
+
120
231
  data?: T[] | null;
121
232
  columns?: TableColumn<T>[];
122
233
  loading?: boolean;
@@ -145,8 +256,34 @@ export interface TableProps<T> {
145
256
  paginationOptions?: Omit<PaginationOptions, "onPaginationChange">;
146
257
  }
147
258
 
259
+ export interface TableFooterTexts {
260
+ /** i18n key (`$`-prefixed) receiving `{ count }`, pluralized on it. */
261
+ countLabel?: string;
262
+ /** Hint at the right of the count. */
263
+ hint?: string;
264
+ /** Figures computed over the listed rows, after the count. */
265
+ summaries?: TableFooterSummary[];
266
+ /** A legend of a select column's values. */
267
+ legend?: TableFooterLegendItem[];
268
+ }
269
+
270
+ /** A figure of the footer band, its value drawn (absent while it loads). */
271
+ export interface TableFooterSummary {
272
+ id: string;
273
+ label: string;
274
+ value?: VNodeChild;
275
+ }
276
+
277
+ /** An entry of the footer legend: a value and its color. */
278
+ export interface TableFooterLegendItem {
279
+ label: string;
280
+ /** Tone of its dot. */
281
+ color?: string;
282
+ }
283
+
148
284
  export interface TableEmits<T> {
149
- (e: "add" | "refresh"): void;
285
+ (e: "add" | "refresh" | "exportAll"): void;
286
+ (e: "bulkAction", action: CustomRowAction): void;
150
287
  (e: "details" | "edit", item: T): void;
151
288
  (e: "delete" | "archive" | "restore" | "export", itemIds: string[]): void;
152
289
  (e: "duplicate", itemId: string): void;
@@ -174,17 +311,55 @@ export interface TableSharedData<T> {
174
311
  labeledColumns: ComputedRef<LabeledColumn<T>[]>;
175
312
  customNavItems: NavItem[];
176
313
  hasCustomSort: ComputedRef<boolean>;
314
+ /** The table's default sort, if it has one. */
315
+ defaultSort?: { field: string; desc?: boolean };
316
+ /** Name of the default sort's column (see `TableProps.defaultSortLabel`). */
317
+ defaultSortLabel?: string;
318
+ /** How the default sort's values compare (see `TableProps.defaultSortKind`). */
319
+ defaultSortKind?: SortValueKind;
320
+ /** The list is sorted by its default sort: the user sorted nothing. */
321
+ isUsingDefaultSort: ComputedRef<boolean>;
322
+ /** Goes back to the default sort (none without one). */
323
+ resetSorting: () => void;
177
324
  hasCustomColumns: ComputedRef<boolean>;
178
325
  deleteFilter: (index: number) => void;
326
+ /**
327
+ * Clears everything that narrows the rows — filter chips (quick filters
328
+ * included) and the toolbar search — and goes back to the first page.
329
+ */
179
330
  resetFilters: () => void;
331
+ /** What `resetFilters` would clear (nothing: no clear action to offer). */
332
+ clearableFilters: ComputedRef<ClearableTableFilters>;
333
+ /** A search or a filter chip narrows the rows. */
334
+ isFiltered: ComputedRef<boolean>;
335
+ /** Runs after `resetFilters` (e.g. the toolbar folds its search). */
336
+ onFiltersCleared: EventHookOn;
180
337
  deleteSorting: (index: number) => void;
181
338
  rowCount: number;
339
+ /** No row listed yet while the first page loads: footers draw placeholders. */
340
+ firstPageLoading: boolean;
182
341
  displays: TableViewSwitcherItem[];
183
342
  hasDisplaySwitcher: boolean;
184
343
  activeDisplayState: ModelRef<string>;
185
344
  activeCapabilities: ComputedRef<Required<TableViewDisplayCapabilities>>;
186
345
  kanbanGroupByState: ModelRef<string>;
187
346
  kanbanGroupByOptions: KanbanGroupByOption[];
347
+ groupedGroupByState: ModelRef<string>;
348
+ groupedGroupByOptions: KanbanGroupByOption[];
349
+ showArchivedState: ModelRef<boolean>;
350
+ /** Row height: `compact` gives 36px rows under a 32px header band. */
351
+ densityState: ModelRef<TableDensity>;
352
+ chrome: ComputedRef<ResolvedTableChrome>;
353
+ footer?: TableFooterTexts;
354
+ /** See `TableProps.defaultPageSize`. */
355
+ defaultPageSize?: number;
356
+ /** See `TableProps.accumulation`. */
357
+ accumulation?: TableAccumulation;
358
+ /**
359
+ * See `TableProps.emptyStates`: a custom display's empty body says them
360
+ * too.
361
+ */
362
+ emptyStates?: TableViewEmptyStatesConfig;
188
363
  }
189
364
  </script>
190
365
 
@@ -201,9 +376,13 @@ import {
201
376
  type ModelRef,
202
377
  ref,
203
378
  shallowRef,
379
+ useId,
380
+ useSlots,
381
+ useTemplateRef,
382
+ watch,
204
383
  watchEffect,
205
384
  } from "vue";
206
- import { provideLocal } from "@vueuse/core";
385
+ import { createEventHook, provideLocal, useElementSize } from "@vueuse/core";
207
386
  import { tv } from "tailwind-variants";
208
387
  import { get } from "@nuxt/ui/runtime/utils/index.js";
209
388
 
@@ -214,57 +393,137 @@ import TableFiltersRow from "./FiltersRow.vue";
214
393
  import TableRowSelection from "./RowSelection.vue";
215
394
  import TableTabs from "./Tabs.vue";
216
395
  import { createTableViewDeleteShortcut } from "../../../composables/table-view/shortcuts/tableViewDelete";
396
+ import { FULL_TABLE_CHROME } from "../../composables/table-view/utils/chrome";
397
+ import {
398
+ clearTableFilters,
399
+ clearableTableFilters,
400
+ isTableNarrowed,
401
+ type TableNarrowingState,
402
+ } from "../../composables/table/utils/clearTableFilters";
217
403
  import {
218
404
  DEFAULT_PAGE_INDEX,
219
405
  DEFAULT_PAGE_SIZE,
220
406
  } from "../../composables/table/constants";
407
+ import { mergeColumnOrder } from "../../composables/table/utils/columnOrder";
408
+ import { EYEBROW_CLASS } from "../../utils/eyebrow";
221
409
 
222
410
  // Same color as the surrounding card frame (.dms-card) so sticky
223
411
  // rail/pinned cells blend in instead of showing a contrasting block.
224
412
  const PANEL_MATCH_BG = "bg-(--dms-surface-card)";
225
413
 
226
- // Header cells sit on the muted header band; sticky header cells need the
227
- // same opaque background as the non-sticky ones.
228
- const HEADER_MATCH_BG = "bg-muted dark:bg-accented";
414
+ const HEADER_PLACEMENT = "header";
415
+
416
+ // Header cells sit on the v2 band color; sticky header cells need the same
417
+ // opaque background as the non-sticky ones.
418
+ const HEADER_MATCH_BG = "bg-(--dms-bg-muted)";
229
419
 
230
420
  // Sticky cells paint their own opaque background over the row's, so they have
231
421
  // to repeat the hover tint under the exact same condition as the row itself;
232
422
  // otherwise only the pinned column lights up.
233
- const ROW_HOVER_BG = "hover:bg-elevated dark:hover:bg-accented";
234
- const ROW_HOVER_CELL_BG =
235
- "group-hover:bg-elevated dark:group-hover:bg-accented";
423
+ const ROW_HOVER_BG = "hover:bg-elevated";
424
+ const ROW_HOVER_CELL_BG = "group-hover:bg-elevated";
425
+
426
+ // A selected row is tinted with the accent; sticky cells need an opaque mix of
427
+ // the same tint so scrolled content never shows through them.
428
+ const ROW_SELECTED_BG = "data-[selected=true]:bg-primary/10";
429
+ const ROW_SELECTED_CELL_BG =
430
+ "group-data-[selected=true]:bg-[color-mix(in_srgb,var(--ui-primary)_10%,var(--dms-surface-card))]";
431
+
432
+ // An expanded row keeps the hover tint and hands its bottom rule to the detail
433
+ // band below it.
434
+ const ROW_EXPANDED_BG = "data-[expanded=true]:bg-elevated";
435
+ const ROW_EXPANDED_CELL_BG = "group-data-[expanded=true]:bg-elevated";
436
+
437
+ // Sticky header: the band gains a soft shadow once the body scrolls under it.
438
+ const HEADER_SCROLL_SHADOW =
439
+ "shadow-[0_8px_10px_-8px_color-mix(in_srgb,var(--ui-border-accented)_90%,transparent)]";
440
+
441
+ // The v2 bands start 18px from the card edge. The first data cell carries that
442
+ // gutter; after the 2px presence rail (an empty first cell) it takes the rest.
443
+ const FIRST_HEAD_CELL_GUTTER = "first:ps-[18px] [th:empty:first-child+&]:ps-4";
444
+ const FIRST_ROW_CELL_GUTTER = "first:ps-[18px] [td:empty:first-child+&]:ps-4";
236
445
 
237
446
  const theme = tv({
238
447
  slots: {
239
- root: "dms-card flow-root p-4 sm:p-6",
240
- header: "flex justify-between",
241
- caption: "text-lg md:text-xl font-semibold truncate",
242
-
243
- tableRoot:
244
- "border-default mt-4 overflow-x-auto rounded-lg border whitespace-nowrap",
448
+ root: "dms-card flow-root overflow-hidden",
449
+ header:
450
+ "flex flex-wrap items-center gap-x-3 gap-y-2.5 py-3 ps-[18px] pe-3.5",
451
+ caption:
452
+ "me-auto flex min-w-0 items-center gap-2.5 text-[15px] leading-[1.2] font-[650] tracking-[-0.015em] text-highlighted",
453
+ captionLabel: "truncate",
454
+ captionCount: "font-mono text-xs font-medium tabular-nums text-dimmed",
455
+ captionCountPlaceholder: "h-3 w-6 rounded-[4px]",
456
+
457
+ tableRoot: "relative overflow-x-auto whitespace-nowrap",
245
458
  tableBase: "inline-block min-w-full align-middle",
246
- table: "text-default w-full min-w-full table-fixed text-left text-sm/6",
459
+ table: "text-default w-full min-w-full table-fixed text-left text-[13px]/5",
247
460
  tableCaption: "sr-only",
248
461
 
249
- headCell: `${HEADER_MATCH_BG} border-b-default text-muted group relative touch-none select-none overflow-hidden border-b px-4 py-3 text-xs font-semibold`,
250
- headCellInternal: "flex w-full items-center justify-between",
462
+ // 2px indeterminate bar riding the bottom edge of the header band.
463
+ loadingBar:
464
+ "pointer-events-none absolute inset-x-0 top-9 z-40 h-0.5 overflow-hidden",
465
+ loadingBarIndicator:
466
+ "absolute inset-y-0 start-0 w-1/2 rounded-full bg-(--dms-accent-fill) animate-[carousel_1.3s_ease-in-out_infinite]",
467
+ skeletonRow: "pointer-events-none",
468
+ skeletonCell: "block h-2.5 rounded-md",
469
+
470
+ // Archive mode: an amber strip under the chrome while archived rows show.
471
+ archiveStrip:
472
+ "flex flex-wrap items-center gap-x-2.5 gap-y-1.5 border-b border-(--dms-warning-line) bg-(--dms-warning-tint) py-[9px] ps-[18px] pe-3.5 text-[13px] text-highlighted",
473
+ archiveStripIcon: "size-[17px] shrink-0 text-warning",
474
+ archiveStripText: "min-w-0",
475
+ archiveStripTitle: "font-semibold",
476
+ archiveStripDescription: "text-[12.5px] text-muted",
477
+ archiveStripAction: "ms-auto",
478
+
479
+ // Detail band of an expanded row, on the muted surface and indented to
480
+ // the content column.
481
+ expandedCell:
482
+ "border-b border-default bg-(--dms-bg-muted) p-0 whitespace-normal in-[tr:last-child]:border-b-0",
483
+ // The band sticks to the visible part of a horizontally scrolled table
484
+ // (its width is the scroll area's, --dms-table-viewport), so the detail
485
+ // never hides past the card edge. Phones drop the content-column indent.
486
+ expandedBody:
487
+ "sticky start-0 w-[var(--dms-table-viewport,auto)] pt-4 pb-[18px] pe-[18px] ps-[18px] sm:ps-[68px]",
488
+
489
+ headCell: `${HEADER_MATCH_BG} ${FIRST_HEAD_CELL_GUTTER} border-b-default text-dimmed group relative touch-none select-none overflow-hidden border-b h-9 px-3.5 py-0 ${EYEBROW_CLASS} last:pe-2.5`,
490
+ headCellInternal: "flex w-full items-center justify-between gap-1",
251
491
  colOptionsTrigger: "opacity-0 transition-opacity group-hover:opacity-100",
252
492
  colResizer:
253
493
  "bg-primary/40 absolute right-0 top-0 z-10 h-full w-1 cursor-col-resize touch-none select-none opacity-0 hover:opacity-100",
254
494
 
255
- row: "group",
256
- rowCell:
257
- "border-b-muted border-b px-4 py-3.5 text-sm in-[tr:last-child]:border-b-0",
258
- rowInternal: "",
495
+ row: `group ${ROW_SELECTED_BG} ${ROW_EXPANDED_BG}`,
496
+ rowCell: `${FIRST_ROW_CELL_GUTTER} border-b-muted border-b h-11 px-3.5 py-0 text-[13px] last:pe-2.5 in-[tr:last-child]:border-b-0 group-data-[expanded=true]:border-b-transparent`,
497
+ rowInternal: "transition-opacity duration-150",
259
498
  rowContainer: "relative",
260
- rowSpan: "line-clamp-1",
261
-
262
- rowSelection: "opacity-0 transition-opacity group-hover:opacity-100",
263
- rowAction: "flex items-center justify-end gap-1",
264
-
265
- columnActiveSortIcon: "size-4",
266
-
267
- skeletonTd: "absolute inset-px",
499
+ rowSpan: "line-clamp-1 text-ellipsis",
500
+
501
+ // The row checkbox and the row actions (the … menu and every other icon
502
+ // of the last column) stay visible but faded, and come to full strength
503
+ // when the row is hovered, selected, focused or one of its menus is open.
504
+ rowSelection:
505
+ "opacity-40 transition-opacity group-hover:opacity-100 focus-visible:opacity-100",
506
+ rowAction:
507
+ "flex items-center justify-end gap-1 opacity-40 transition-opacity group-hover:opacity-100 group-data-[selected=true]:opacity-100 focus-within:opacity-100 has-[[data-state=open]]:opacity-100",
508
+
509
+ columnActiveSortIcon: "size-3 shrink-0 text-primary",
510
+
511
+ // Group header of the grouped display, on the band color, kept in view
512
+ // over a horizontally scrolled table like a detail band.
513
+ groupCell: `${HEADER_MATCH_BG} border-b border-default p-0`,
514
+ groupHeader:
515
+ "sticky start-0 flex h-9 w-[var(--dms-table-viewport,auto)] items-center gap-2 ps-[18px] pe-3.5 text-[12.5px] text-muted",
516
+ groupToggle:
517
+ "inline-flex min-w-0 items-center gap-2 hover:text-highlighted",
518
+ groupCount:
519
+ "rounded-[4px] bg-elevated px-[5px] py-px font-mono text-[10.5px] font-semibold tabular-nums text-dimmed",
520
+
521
+ // The move handle of a hand-ordered table, in a narrow first column.
522
+ handleHeadCell: `${HEADER_MATCH_BG} border-b-default w-8 border-b p-0`,
523
+ handleCell:
524
+ "border-b-muted w-8 border-b ps-2 pe-0 in-[tr:last-child]:border-b-0",
525
+ handle:
526
+ "inline-flex size-6 cursor-grab items-center justify-center rounded text-dimmed hover:text-highlighted focus-visible:outline-2 focus-visible:outline-(--dms-accent-line) disabled:cursor-not-allowed disabled:opacity-40 [&>svg]:size-4",
268
527
  },
269
528
  variants: {
270
529
  cellWrap: {
@@ -272,20 +531,64 @@ const theme = tv({
272
531
  rowSpan: "line-clamp-none whitespace-normal [overflow-wrap:anywhere]",
273
532
  },
274
533
  },
534
+ // The header sits straight on the column band when no tabs row follows
535
+ // it, and then carries the rule itself.
536
+ headerDivided: {
537
+ true: {
538
+ header: "border-b border-default",
539
+ },
540
+ },
541
+ // Tabs up in the header band (no caption): they take its full height and
542
+ // their underline lands on its bottom rule.
543
+ tabsInline: {
544
+ true: {
545
+ header: "min-h-11 py-0",
546
+ },
547
+ },
275
548
  pinned: {
276
549
  left: {
277
550
  headCell: `${HEADER_MATCH_BG} sticky z-10 shadow-[2px_0_0_0_rgba(0,0,0,0.06)]`,
278
- rowCell: `${PANEL_MATCH_BG} group-data-[presence=true]:bg-elevated dark:group-data-[presence=true]:bg-accented sticky z-10 shadow-[2px_0_0_0_rgba(0,0,0,0.06)]`,
551
+ rowCell: `${PANEL_MATCH_BG} ${ROW_SELECTED_CELL_BG} ${ROW_EXPANDED_CELL_BG} group-data-[presence=true]:bg-elevated sticky z-10 shadow-[2px_0_0_0_rgba(0,0,0,0.06)]`,
279
552
  },
280
553
  right: {
281
554
  headCell: `${HEADER_MATCH_BG} sticky z-10 shadow-[-2px_0_0_0_rgba(0,0,0,0.06)]`,
282
- rowCell: `${PANEL_MATCH_BG} group-data-[presence=true]:bg-elevated dark:group-data-[presence=true]:bg-accented sticky z-10 shadow-[-2px_0_0_0_rgba(0,0,0,0.06)]`,
555
+ rowCell: `${PANEL_MATCH_BG} ${ROW_SELECTED_CELL_BG} ${ROW_EXPANDED_CELL_BG} group-data-[presence=true]:bg-elevated sticky z-10 shadow-[-2px_0_0_0_rgba(0,0,0,0.06)]`,
556
+ },
557
+ },
558
+ // Dense lists: 36px rows under a 32px header band.
559
+ density: {
560
+ default: "",
561
+ compact: {
562
+ headCell: "h-8",
563
+ rowCell: "h-9 text-[12.5px]",
564
+ loadingBar: "top-8",
565
+ },
566
+ },
567
+ // The header band sticks to the top of a height-capped scroll area.
568
+ scrollArea: {
569
+ true: {
570
+ tableRoot: "overflow-y-auto overscroll-contain",
571
+ table: "border-separate border-spacing-0",
572
+ headCell: "sticky top-0 z-20",
573
+ },
574
+ },
575
+ scrolled: {
576
+ true: "",
577
+ },
578
+ // Rows listed while viewing the archive read as set aside.
579
+ // Restore stays on show there, it is the only thing to do with them.
580
+ archived: {
581
+ true: {
582
+ rowCell: "text-muted",
583
+ rowAction: "opacity-100",
283
584
  },
284
585
  },
586
+ // A re-fetch keeps the rows on show, faded once it lasts (the delay
587
+ // spares quick ones a flicker), under the header band's loading bar.
285
588
  loading: {
286
589
  true: {
287
590
  row: "cursor-wait hover:bg-transparent",
288
- rowInternal: "opacity-0",
591
+ rowInternal: "opacity-60 delay-200",
289
592
  },
290
593
  },
291
594
  rowClickable: {
@@ -301,9 +604,15 @@ const theme = tv({
301
604
  rowSelection: "opacity-100",
302
605
  },
303
606
  },
607
+ // Labelled inline actions are the row's actions on show: never faded.
608
+ prominent: {
609
+ true: {
610
+ rowAction: "opacity-100",
611
+ },
612
+ },
304
613
  presence: {
305
614
  true: {
306
- row: "opacity-70 bg-elevated dark:bg-accented",
615
+ row: "bg-elevated",
307
616
  },
308
617
  },
309
618
  },
@@ -323,6 +632,20 @@ const theme = tv({
323
632
  rowCell: ROW_HOVER_CELL_BG,
324
633
  },
325
634
  },
635
+ {
636
+ scrollArea: true,
637
+ pinned: ["left", "right"],
638
+ class: {
639
+ headCell: "z-30",
640
+ },
641
+ },
642
+ {
643
+ scrollArea: true,
644
+ scrolled: true,
645
+ class: {
646
+ headCell: HEADER_SCROLL_SHADOW,
647
+ },
648
+ },
326
649
  ],
327
650
  });
328
651
 
@@ -373,9 +696,70 @@ const activeDisplayState = defineModel<string>("activeDisplay", {
373
696
  const kanbanGroupByState = defineModel<string>("kanbanGroupBy", {
374
697
  default: "",
375
698
  });
699
+ const groupedGroupByState = defineModel<string>("groupedGroupBy", {
700
+ default: "",
701
+ });
376
702
  const expandedState = defineModel<ExpandedState>("expanded", {
377
703
  default: (): ExpandedState => ({}),
378
704
  });
705
+ const showArchivedState = defineModel<boolean>("showArchived", {
706
+ default: false,
707
+ });
708
+ const densityState = defineModel<TableDensity>("density", {
709
+ default: "default",
710
+ });
711
+ // "Select all N matching": a bulk action covers every row the filters match.
712
+ const allMatchingState = defineModel<boolean>("allMatching", {
713
+ default: false,
714
+ });
715
+
716
+ const slots = useSlots();
717
+ // A detail renderer turns the expander column on.
718
+ const isExpandable = !!slots.expanded;
719
+ // The caret button names the detail row it opens (aria-controls).
720
+ const tableDomId = `dms-table-${useId()}`;
721
+ const expandedRowDomId = (rowId: string): string =>
722
+ `${tableDomId}-detail-${rowId.replace(/\s+/g, "_")}`;
723
+
724
+ // Rows are archived ones only while the toggle is on.
725
+ const isShowingArchived = computed(
726
+ () => !!props.archiveToggle && showArchivedState.value,
727
+ );
728
+
729
+ // As many placeholder rows as the page will list (capped), fading out.
730
+ const SKELETON_MAX_ROW_COUNT = 10;
731
+ const SKELETON_TOTAL_FADE = 0.7;
732
+ const SKELETON_WIDTHS = ["62%", "48%", "70%", "54%", "40%"];
733
+ const skeletonWidth = (rowIndex: number, columnIndex: number): string =>
734
+ SKELETON_WIDTHS[(rowIndex + columnIndex) % SKELETON_WIDTHS.length]!;
735
+
736
+ // The scroll shadow under a sticky header only shows once rows went under it.
737
+ const hasScrollArea = computed(() => !!props.maxHeight);
738
+ const isScrolled = ref(false);
739
+ const onTableScroll = (event: Event) => {
740
+ if (!hasScrollArea.value) return;
741
+ isScrolled.value = (event.target as HTMLElement).scrollTop > 0;
742
+ };
743
+ // Expanded detail bands are as wide as the visible scroll area.
744
+ const tableRootRef = useTemplateRef<HTMLElement>("tableRoot");
745
+ const { width: tableViewportWidth } = useElementSize(tableRootRef);
746
+ const tableRootStyle = computed(() => ({
747
+ maxHeight: props.maxHeight,
748
+ "--dms-table-viewport":
749
+ (isExpandable || !!props.grouping) && tableViewportWidth.value > 0
750
+ ? `${tableViewportWidth.value}px`
751
+ : undefined,
752
+ }));
753
+
754
+ // A clipped cell value reads in full in a native tooltip.
755
+ const syncClippedTitle = (event: MouseEvent) => {
756
+ const cell = event.currentTarget as HTMLElement;
757
+ if (cell.scrollWidth > cell.clientWidth) {
758
+ cell.title = cell.textContent?.trim() ?? "";
759
+ } else {
760
+ cell.removeAttribute("title");
761
+ }
762
+ };
379
763
  const paginationState = defineModel<PaginationState>("pagination", {
380
764
  default: (): PaginationState => ({
381
765
  pageIndex: DEFAULT_PAGE_INDEX,
@@ -383,6 +767,20 @@ const paginationState = defineModel<PaginationState>("pagination", {
383
767
  }),
384
768
  });
385
769
 
770
+ // The first page is on its way: skeleton rows (and placeholders for the
771
+ // counts) hold the list's place instead of its empty state.
772
+ const isFirstPageLoading = computed(
773
+ () => !!props.loading && !props.data?.length,
774
+ );
775
+ const skeletonRowCount = computed(() =>
776
+ Math.min(
777
+ paginationState.value.pageSize || DEFAULT_PAGE_SIZE,
778
+ SKELETON_MAX_ROW_COUNT,
779
+ ),
780
+ );
781
+ const skeletonRowOpacity = (rowIndex: number): number =>
782
+ 1 - ((rowIndex - 1) * SKELETON_TOTAL_FADE) / skeletonRowCount.value;
783
+
386
784
  const onResize = (
387
785
  event: MouseEvent | TouchEvent,
388
786
  header: Header<T, unknown>,
@@ -392,15 +790,61 @@ const onResize = (
392
790
 
393
791
  const PRESENCE_RAIL_WIDTH = 2;
394
792
  const PRESENCE_RAIL_WIDTH_PX = `${PRESENCE_RAIL_WIDTH}px`;
395
- const PRESENCE_RAIL_ACTIVE_BG = "bg-primary";
793
+ // Someone else editing the row is the violet (AI/collaboration) accent; a row
794
+ // selected here is the cyan one.
795
+ const PRESENCE_RAIL_ACTIVE_BG = "bg-secondary";
796
+ const SELECTION_RAIL_BG = "bg-primary";
396
797
 
397
798
  const hasPresenceRail = computed(() => props.presenceByRow !== undefined);
799
+ // Cells drawn in front of the columns: the presence rail, the move handle.
800
+ const leadingCellCount = computed(
801
+ () => (hasPresenceRail.value ? 1 : 0) + (props.reorder ? 1 : 0),
802
+ );
803
+
804
+ // Moving rows: the row dragged by its handle, dropped on another row; the
805
+ // arrow keys on a handle move its row by one.
806
+ const draggedRowIndex = ref<number | undefined>();
807
+ const dropRow = (index: number) => {
808
+ const from = draggedRowIndex.value;
809
+ draggedRowIndex.value = undefined;
810
+ if (from !== undefined && props.reorder?.enabled) {
811
+ props.reorder.move(from, index);
812
+ }
813
+ };
814
+ const stepRow = (index: number, step: number) => {
815
+ const target = index + step;
816
+ const count = table.getRowModel().rows.length;
817
+ if (props.reorder?.enabled && target >= 0 && target < count) {
818
+ props.reorder.move(index, target);
819
+ }
820
+ };
821
+
822
+ // Pinned columns stick only while they cover at most 60% of the visible scroll
823
+ // area: on a phone, labelled row actions or a wide pinned set would otherwise
824
+ // hide every column scrolling under them. The wider side lets go first.
825
+ const PINNED_MAX_VIEWPORT_SHARE = 0.6;
826
+ const stickyPinnedSides = computed(() => {
827
+ const budget = tableViewportWidth.value * PINNED_MAX_VIEWPORT_SHARE;
828
+ const left = table.getLeftTotalSize();
829
+ const right = table.getRightTotalSize();
830
+ if (!budget || left + right <= budget) return { left: true, right: true };
831
+ const keepLeft = left < right && left <= budget;
832
+ const keepRight = left >= right && right <= budget;
833
+ return { left: keepLeft, right: keepRight };
834
+ });
835
+
836
+ const getStickyPin = (column: { getIsPinned: () => unknown }) => {
837
+ const pinned = column.getIsPinned();
838
+ if (pinned === "left" && stickyPinnedSides.value.left) return "left";
839
+ if (pinned === "right" && stickyPinnedSides.value.right) return "right";
840
+ return undefined;
841
+ };
398
842
 
399
843
  const getPinnedLeftOffset = (column: {
400
844
  getIsPinned: () => unknown;
401
845
  getStart: (pos: "left") => number;
402
846
  }) => {
403
- if (column.getIsPinned() !== "left") return undefined;
847
+ if (getStickyPin(column) !== "left") return undefined;
404
848
  const base = column.getStart("left");
405
849
  const rail = hasPresenceRail.value ? PRESENCE_RAIL_WIDTH : 0;
406
850
  return `${base + rail}px`;
@@ -410,13 +854,43 @@ const getPinnedRightOffset = (column: {
410
854
  getIsPinned: () => unknown;
411
855
  getAfter: (pos: "right") => number;
412
856
  }) => {
413
- if (column.getIsPinned() !== "right") return undefined;
857
+ if (getStickyPin(column) !== "right") return undefined;
414
858
  return `${column.getAfter("right")}px`;
415
859
  };
416
860
 
417
- const getPinnedVariant = (column: { getIsPinned: () => unknown }) => {
418
- const pinned = column.getIsPinned();
419
- return pinned === "left" || pinned === "right" ? pinned : undefined;
861
+ const getPinnedVariant = getStickyPin;
862
+
863
+ // A scrolling column is never wider than the room the sticky columns leave
864
+ // (a 300px identity column on a phone): its content truncates in view
865
+ // instead of running under the pinned actions.
866
+ const MIN_SCROLLING_COLUMN_WIDTH = 120;
867
+ const scrollingColumnMaxWidth = computed(() => {
868
+ const viewport = tableViewportWidth.value;
869
+ if (!viewport) return Infinity;
870
+ const sides = stickyPinnedSides.value;
871
+ const sticky =
872
+ (sides.left ? table.getLeftTotalSize() : 0) +
873
+ (sides.right ? table.getRightTotalSize() : 0) +
874
+ (hasPresenceRail.value ? PRESENCE_RAIL_WIDTH : 0);
875
+ return Math.max(viewport - sticky, MIN_SCROLLING_COLUMN_WIDTH);
876
+ });
877
+
878
+ const getHeaderWidth = (header: Header<T, unknown>): string => {
879
+ const size = header.getSize();
880
+ if (getStickyPin(header.column)) return `${size}px`;
881
+ return `${Math.min(size, scrollingColumnMaxWidth.value)}px`;
882
+ };
883
+
884
+ // Only a header the list can be sorted on states its order to assistive
885
+ // technologies; the others carry no `aria-sort` at all.
886
+ const headerAriaSort = (
887
+ column: Header<T, unknown>["column"],
888
+ ): "ascending" | "descending" | "none" | undefined => {
889
+ if (!column.getCanSort()) return undefined;
890
+ const sorted = column.getIsSorted();
891
+ if (sorted === "asc") return "ascending";
892
+ if (sorted === "desc") return "descending";
893
+ return "none";
420
894
  };
421
895
 
422
896
  const isUsingDefaultSort = computed(() => {
@@ -434,29 +908,144 @@ const uiTableRoot = tv({
434
908
  extend: tv(theme),
435
909
  ...(appConfig.ui?.table || {}),
436
910
  });
437
- const uiTable = computed(() => uiTableRoot());
911
+ const uiTable = computed(() =>
912
+ uiTableRoot({
913
+ density: densityState.value,
914
+ scrollArea: hasScrollArea.value,
915
+ scrolled: isScrolled.value,
916
+ archived: isShowingArchived.value,
917
+ }),
918
+ );
438
919
 
439
- const { table, labeledColumns, deleteFilter, resetFilters, deleteSorting } =
440
- useTable<T>({
441
- tableProps: props,
442
- emits,
443
- states: {
444
- globalFilterState,
445
- columnFiltersState,
446
- columnOrderState,
447
- columnVisibilityState,
448
- columnPinningState,
449
- columnSizingState,
450
- rowSelectionState,
451
- sortingState,
452
- expandedState,
453
- paginationState,
454
- },
455
- ui: uiTable,
456
- });
920
+ const {
921
+ table,
922
+ declaredColumnOrder,
923
+ labeledColumns,
924
+ deleteFilter,
925
+ deleteSorting,
926
+ } = useTable<T>({
927
+ tableProps: props,
928
+ emits,
929
+ states: {
930
+ globalFilterState,
931
+ columnFiltersState,
932
+ columnOrderState,
933
+ columnVisibilityState,
934
+ columnPinningState,
935
+ columnSizingState,
936
+ rowSelectionState,
937
+ sortingState,
938
+ expandedState,
939
+ paginationState,
940
+ },
941
+ ui: uiTable,
942
+ expandable: isExpandable,
943
+ expandedRowDomId,
944
+ showArchived: props.archiveToggle ? isShowingArchived : undefined,
945
+ columnMenus: (props.chrome ?? FULL_TABLE_CHROME).columnMenus,
946
+ });
457
947
 
458
948
  const rowCount = computed(() => props.paginationOptions?.rowCount ?? 0);
459
949
 
950
+ type TableRow = ReturnType<typeof table.getRowModel>["rows"][number];
951
+
952
+ /** A line of the table body: a row, or the header of the group it opens. */
953
+ interface BodyEntry {
954
+ kind: "row" | "group";
955
+ id: string;
956
+ /** The row, or the first row of the group a header opens. */
957
+ row: TableRow;
958
+ /** Group key, on a group header. */
959
+ key?: string;
960
+ /**
961
+ * Draws a group header with the grouping it was listed under: a header
962
+ * still rendering once the grouping is gone reads it, not the prop.
963
+ */
964
+ header?: () => VNodeChild;
965
+ }
966
+
967
+ const GROUP_ENTRY_PREFIX = "group:";
968
+ const collapsedGroups = ref<string[]>([]);
969
+ const toggleGroup = (key: string) => {
970
+ collapsedGroups.value = collapsedGroups.value.includes(key)
971
+ ? collapsedGroups.value.filter((collapsed) => collapsed !== key)
972
+ : [...collapsedGroups.value, key];
973
+ };
974
+
975
+ const bodyEntries = computed<BodyEntry[]>(() => {
976
+ const rows = table.getRowModel().rows;
977
+ const grouping = props.grouping;
978
+ if (!grouping) return rows.map((row) => ({ kind: "row", id: row.id, row }));
979
+ const entries: BodyEntry[] = [];
980
+ let currentKey: string | undefined;
981
+ for (const row of rows) {
982
+ const key = grouping.keyOf(row.original);
983
+ if (key !== currentKey) {
984
+ currentKey = key;
985
+ entries.push({
986
+ kind: "group",
987
+ id: GROUP_ENTRY_PREFIX + key,
988
+ row,
989
+ key,
990
+ header: () => grouping.header(key, row.original),
991
+ });
992
+ }
993
+ if (!collapsedGroups.value.includes(key)) {
994
+ entries.push({ kind: "row", id: row.id, row });
995
+ }
996
+ }
997
+ return entries;
998
+ });
999
+
1000
+ const { t, locale } = useI18n();
1001
+
1002
+ const formattedRowCount = computed(() =>
1003
+ new Intl.NumberFormat(locale.value).format(rowCount.value),
1004
+ );
1005
+
1006
+ const captionCountLabel = computed(() =>
1007
+ isShowingArchived.value
1008
+ ? t("dms.table.archived_count", { count: formattedRowCount.value })
1009
+ : formattedRowCount.value,
1010
+ );
1011
+
1012
+ const hasTabs = computed(() => (props.tabs?.length ?? 0) > 0);
1013
+ const hasViewsBand = computed(
1014
+ () => !!slots.views && props.viewsPlacement === "band",
1015
+ );
1016
+ const hasViewsInHeader = computed(
1017
+ () => !!slots.views && props.viewsPlacement === "header",
1018
+ );
1019
+
1020
+ const resolvedChrome = computed<ResolvedTableChrome>(
1021
+ () => props.chrome ?? FULL_TABLE_CHROME,
1022
+ );
1023
+ // Without a caption, the tabs move up into the header band.
1024
+ const tabsInline = computed(
1025
+ () => hasTabs.value && !resolvedChrome.value.caption,
1026
+ );
1027
+ // A button placed in the page header is drawn there, not in the toolbar; it
1028
+ // stays pressable by id (header button, quick action).
1029
+ const toolbarButtons = computed(() =>
1030
+ (props.customButtons ?? []).filter(
1031
+ (button) => button.placement !== HEADER_PLACEMENT,
1032
+ ),
1033
+ );
1034
+ const canAddFromToolbar = computed(() => {
1035
+ const add = normalizeActionConfig(props.rowActions?.add);
1036
+ return !!add.isEnabled && add.placement !== HEADER_PLACEMENT;
1037
+ });
1038
+
1039
+ // The bulk bar shows whenever selected rows have something to go to.
1040
+ const hasBulkActions = computed(
1041
+ () =>
1042
+ normalizeActionConfig(props.rowActions?.delete).isEnabled ||
1043
+ normalizeActionConfig(props.rowActions?.archive).isEnabled ||
1044
+ normalizeActionConfig(props.rowActions?.restore).isEnabled ||
1045
+ !!props.canExport ||
1046
+ (props.bulkActions?.length ?? 0) > 0,
1047
+ );
1048
+
460
1049
  // Defined once (stable ref identity) so consumers that capture tableSharedData
461
1050
  // by value (e.g. Actions.vue via useTableContext) still react when the active
462
1051
  // display — and thus its capabilities — changes.
@@ -464,7 +1053,31 @@ const resolvedCapabilities = computed<Required<TableViewDisplayCapabilities>>(
464
1053
  () => props.activeCapabilities ?? DEFAULT_CAPABILITIES,
465
1054
  );
466
1055
 
467
- const baselineColumnOrder = [...columnOrderState.value];
1056
+ // The single "clear all" of the table: every clear action goes through it.
1057
+ const narrowingState: TableNarrowingState = {
1058
+ columnFilters: columnFiltersState,
1059
+ globalFilter: globalFilterState,
1060
+ pagination: paginationState,
1061
+ searchApplies: computed(() => resolvedCapabilities.value.search),
1062
+ };
1063
+ const filtersCleared = createEventHook();
1064
+ const resetFilters = () => {
1065
+ clearTableFilters(narrowingState);
1066
+ void filtersCleared.trigger();
1067
+ };
1068
+ const clearableFilters = computed(() => clearableTableFilters(narrowingState));
1069
+ const isFiltered = computed(() => isTableNarrowed(narrowingState));
1070
+
1071
+ // A partial order (a view's) names some columns: the others follow.
1072
+ watch(columnOrderState, (order) => {
1073
+ const merged = mergeColumnOrder(order, declaredColumnOrder);
1074
+ if (!isSameColumnList(merged, order)) columnOrderState.value = merged;
1075
+ });
1076
+ const baselineColumnOrder = declaredColumnOrder;
1077
+
1078
+ function isSameColumnList(a: readonly unknown[], b: readonly unknown[]) {
1079
+ return a.length === b.length && a.every((item, index) => item === b[index]);
1080
+ }
468
1081
  const baselineColumnPinning = JSON.parse(
469
1082
  JSON.stringify(columnPinningState.value),
470
1083
  ) as ColumnPinningState;
@@ -476,9 +1089,8 @@ const hasCustomSort = computed(() => {
476
1089
  return !isUsingDefaultSort.value;
477
1090
  });
478
1091
 
479
- const areArraysEqual = (a: unknown[], b: unknown[]): boolean => {
480
- if (a.length !== b.length) return false;
481
- return a.every((item, index) => item === b[index]);
1092
+ const resetSorting = () => {
1093
+ sortingState.value = defaultSortingState(props.defaultSort);
482
1094
  };
483
1095
 
484
1096
  const arePinningEqual = (
@@ -486,13 +1098,14 @@ const arePinningEqual = (
486
1098
  b: ColumnPinningState,
487
1099
  ): boolean => {
488
1100
  return (
489
- areArraysEqual(a.left ?? [], b.left ?? []) &&
490
- areArraysEqual(a.right ?? [], b.right ?? [])
1101
+ isSameColumnList(a.left ?? [], b.left ?? []) &&
1102
+ isSameColumnList(a.right ?? [], b.right ?? [])
491
1103
  );
492
1104
  };
493
1105
 
494
1106
  const hasCustomColumns = computed(() => {
495
- if (!areArraysEqual(columnOrderState.value, baselineColumnOrder)) return true;
1107
+ if (!isSameColumnList(columnOrderState.value, baselineColumnOrder))
1108
+ return true;
496
1109
  if (!arePinningEqual(columnPinningState.value, baselineColumnPinning))
497
1110
  return true;
498
1111
 
@@ -527,17 +1140,35 @@ watchEffect(() => {
527
1140
  labeledColumns,
528
1141
  customNavItems: props.customNavItems || [],
529
1142
  hasCustomSort,
1143
+ defaultSort: props.defaultSort,
1144
+ defaultSortLabel: props.defaultSortLabel,
1145
+ defaultSortKind: props.defaultSortKind,
1146
+ isUsingDefaultSort,
1147
+ resetSorting,
530
1148
  hasCustomColumns,
531
1149
  deleteFilter,
532
1150
  resetFilters,
1151
+ clearableFilters,
1152
+ isFiltered,
1153
+ onFiltersCleared: filtersCleared.on,
533
1154
  deleteSorting,
534
1155
  rowCount: rowCount.value,
1156
+ firstPageLoading: isFirstPageLoading.value,
535
1157
  displays: props.displays || [],
536
1158
  hasDisplaySwitcher: (props.displays?.length ?? 0) > 1,
537
1159
  activeDisplayState,
538
1160
  activeCapabilities: resolvedCapabilities,
539
1161
  kanbanGroupByState,
540
1162
  kanbanGroupByOptions: props.kanbanGroupByOptions || [],
1163
+ groupedGroupByState,
1164
+ groupedGroupByOptions: props.groupedGroupByOptions || [],
1165
+ showArchivedState,
1166
+ densityState,
1167
+ chrome: resolvedChrome,
1168
+ footer: props.footer,
1169
+ defaultPageSize: props.defaultPageSize,
1170
+ accumulation: props.accumulation,
1171
+ emptyStates: props.emptyStates,
541
1172
  };
542
1173
  });
543
1174
 
@@ -555,8 +1186,6 @@ const handleRowLeave = () => {
555
1186
  hoveredRowId.value = null;
556
1187
  };
557
1188
 
558
- const { t } = useI18n();
559
-
560
1189
  const getRowPresence = (row: T): TableRowPresenceActor[] | undefined => {
561
1190
  if (!props.presenceByRow) return undefined;
562
1191
  const id = get(row, rowIdKey) as string | undefined;
@@ -604,39 +1233,127 @@ defineShortcuts({
604
1233
 
605
1234
  <template>
606
1235
  <div :class="uiTable.root()">
607
- <header :class="uiTable.header()">
608
- <h2 :class="uiTable.caption()">
609
- {{ caption }}
610
- </h2>
611
-
612
- <TableActions
613
- v-model:global-filter="globalFilterState"
614
- v-model:column-visibility="columnVisibilityState"
615
- v-model:sorting="sortingState"
616
- :table
617
- :can-add-row="normalizeActionConfig(rowActions?.add).isEnabled"
618
- :custom-buttons="customButtons"
619
- :on-custom-button="onCustomButton"
1236
+ <template v-if="resolvedCapabilities.header">
1237
+ <header
1238
+ :class="
1239
+ uiTable.header({
1240
+ headerDivided: (!hasTabs && !hasViewsBand) || tabsInline,
1241
+ tabsInline,
1242
+ })
1243
+ "
1244
+ >
1245
+ <TableTabs
1246
+ v-if="tabsInline && tabs"
1247
+ v-model="activeTabId"
1248
+ :tabs="tabs"
1249
+ :label="caption"
1250
+ inline
1251
+ />
1252
+ <h2 v-else-if="resolvedChrome.caption" :class="uiTable.caption()">
1253
+ <span :class="uiTable.captionLabel()" @mouseenter="syncClippedTitle">
1254
+ {{ caption }}
1255
+ </span>
1256
+ <USkeleton
1257
+ v-if="isFirstPageLoading"
1258
+ aria-hidden="true"
1259
+ :class="uiTable.captionCountPlaceholder()"
1260
+ />
1261
+ <span v-else-if="rowCount > 0" :class="uiTable.captionCount()">
1262
+ {{ captionCountLabel }}
1263
+ </span>
1264
+ </h2>
1265
+
1266
+ <slot v-if="hasViewsInHeader" name="views" />
1267
+
1268
+ <TableActions
1269
+ v-model:global-filter="globalFilterState"
1270
+ v-model:column-visibility="columnVisibilityState"
1271
+ v-model:sorting="sortingState"
1272
+ v-model:show-archived="showArchivedState"
1273
+ :table
1274
+ :can-add-row="canAddFromToolbar"
1275
+ :archive-toggle="archiveToggle"
1276
+ :custom-buttons="toolbarButtons"
1277
+ :on-custom-button="onCustomButton"
1278
+ :chrome="resolvedChrome"
1279
+ :search-placeholder="searchPlaceholder"
1280
+ :quick-filters="quickFilters"
1281
+ :class="{
1282
+ 'ms-auto': !resolvedChrome.caption && !tabsInline,
1283
+ 'py-2': tabsInline,
1284
+ }"
1285
+ />
1286
+ </header>
1287
+
1288
+ <slot v-if="hasViewsBand" name="views" />
1289
+
1290
+ <TableTabs
1291
+ v-if="hasTabs && tabs && !tabsInline"
1292
+ v-model="activeTabId"
1293
+ :tabs="tabs"
620
1294
  />
621
- </header>
622
1295
 
623
- <TableTabs
624
- v-if="tabs && tabs.length > 0"
625
- v-model="activeTabId"
626
- :tabs="tabs"
627
- />
628
-
629
- <TableFiltersRow v-if="filtersRowOpen && resolvedCapabilities.filters" />
1296
+ <TableFiltersRow
1297
+ v-if="
1298
+ filtersRowOpen &&
1299
+ resolvedCapabilities.filters &&
1300
+ resolvedChrome.filters
1301
+ "
1302
+ />
630
1303
 
631
- <TableRowSelection
632
- v-if="rowActions?.delete || canExport"
633
- v-model:row-selection="rowSelectionState"
634
- :row-actions="rowActions"
635
- :can-export="canExport"
636
- />
1304
+ <div
1305
+ v-if="isShowingArchived"
1306
+ role="status"
1307
+ :class="uiTable.archiveStrip()"
1308
+ >
1309
+ <UIcon name="i-ph-archive" :class="uiTable.archiveStripIcon()" />
1310
+ <span :class="uiTable.archiveStripText()">
1311
+ <strong :class="uiTable.archiveStripTitle()">
1312
+ {{ t("dms.table.archive_strip_title") }}
1313
+ </strong>
1314
+ {{ " " }}
1315
+ <span :class="uiTable.archiveStripDescription()">
1316
+ {{ t("dms.table.archive_strip_description") }}
1317
+ </span>
1318
+ </span>
1319
+ <UButton
1320
+ :label="t('dms.table.show_active')"
1321
+ :icon="appConfig.ui.icons.arrowLeft"
1322
+ color="neutral"
1323
+ variant="ghost"
1324
+ size="xs"
1325
+ :class="uiTable.archiveStripAction()"
1326
+ @click="showArchivedState = false"
1327
+ />
1328
+ </div>
1329
+
1330
+ <TableRowSelection
1331
+ v-if="hasBulkActions"
1332
+ v-model:row-selection="rowSelectionState"
1333
+ v-model:all-matching="allMatchingState"
1334
+ :row-actions="rowActions"
1335
+ :bulk-actions="bulkActions"
1336
+ :total="rowCount"
1337
+ :can-export="canExport"
1338
+ :archived="isShowingArchived"
1339
+ />
1340
+ </template>
637
1341
 
638
1342
  <slot name="body" :table="table">
639
- <section :class="uiTable.tableRoot()">
1343
+ <section
1344
+ ref="tableRoot"
1345
+ :class="uiTable.tableRoot()"
1346
+ :style="tableRootStyle"
1347
+ @scroll.passive="onTableScroll"
1348
+ >
1349
+ <div
1350
+ v-if="loading && !isFirstPageLoading"
1351
+ aria-hidden="true"
1352
+ :class="uiTable.loadingBar()"
1353
+ >
1354
+ <span :class="uiTable.loadingBarIndicator()" />
1355
+ </div>
1356
+
640
1357
  <div :class="uiTable.tableBase()">
641
1358
  <table :class="uiTable.table()">
642
1359
  <caption v-if="caption" :class="uiTable.tableCaption()">
@@ -653,16 +1370,23 @@ defineShortcuts({
653
1370
  :class="[
654
1371
  HEADER_MATCH_BG,
655
1372
  'border-b-default sticky left-0 z-30 border-b p-0',
1373
+ hasScrollArea && 'top-0 z-40',
656
1374
  ]"
657
1375
  :style="{
658
1376
  width: PRESENCE_RAIL_WIDTH_PX,
659
1377
  minWidth: PRESENCE_RAIL_WIDTH_PX,
660
1378
  }"
661
1379
  />
1380
+ <th
1381
+ v-if="reorder"
1382
+ :class="uiTable.handleHeadCell()"
1383
+ :aria-label="t('dms.table.reorder.column')"
1384
+ />
662
1385
  <th
663
1386
  v-for="header in headerGroup.headers"
664
1387
  :key="header.id"
665
1388
  :colspan="header.colSpan"
1389
+ :aria-sort="headerAriaSort(header.column)"
666
1390
  :data-pinned="header.column.getIsPinned()"
667
1391
  :class="
668
1392
  uiTable.headCell({
@@ -670,7 +1394,7 @@ defineShortcuts({
670
1394
  })
671
1395
  "
672
1396
  :style="{
673
- width: header.getSize() + 'px',
1397
+ width: getHeaderWidth(header),
674
1398
  left: getPinnedLeftOffset(header.column),
675
1399
  right: getPinnedRightOffset(header.column),
676
1400
  }"
@@ -703,100 +1427,197 @@ defineShortcuts({
703
1427
 
704
1428
  <tbody>
705
1429
  <template v-if="table.getRowModel().rows?.length">
706
- <template v-for="row in table.getRowModel().rows" :key="row.id">
707
- <tr
708
- :data-selected="row.getIsSelected()"
709
- :data-expanded="row.getIsExpanded()"
710
- :data-presence="!!getRowPresence(row.original)"
711
- :title="
712
- getRowPresence(row.original)
713
- ? presenceTooltipText(getRowPresence(row.original)!)
714
- : undefined
715
- "
716
- :class="
717
- uiTable.row({
718
- loading,
719
- rowClickable: isRowClickable(row.original),
720
- presence: !!getRowPresence(row.original),
721
- })
722
- "
723
- @dblclick="handleRowDoubleClick(row.original)"
724
- @mouseenter="handleRowHover(row)"
725
- @mouseleave="handleRowLeave"
726
- >
727
- <td
728
- v-if="hasPresenceRail"
729
- :class="[
730
- 'border-b-muted sticky left-0 z-30 border-b p-0 in-[tr:last-child]:border-b-0',
731
- presenceRailBackground(row.original),
732
- ]"
733
- :style="{
734
- width: PRESENCE_RAIL_WIDTH_PX,
735
- minWidth: PRESENCE_RAIL_WIDTH_PX,
736
- }"
737
- />
1430
+ <template
1431
+ v-for="{ kind, id, row, key, header } in bodyEntries"
1432
+ :key="id"
1433
+ >
1434
+ <tr v-if="kind === 'group' && grouping">
738
1435
  <td
739
- v-for="cell in row.getVisibleCells()"
740
- :key="cell.id"
741
- :data-pinned="cell.column.getIsPinned()"
1436
+ :colspan="row.getVisibleCells().length + leadingCellCount"
1437
+ :class="uiTable.groupCell()"
1438
+ >
1439
+ <div :class="uiTable.groupHeader()">
1440
+ <component
1441
+ :is="grouping.collapsible ? 'button' : 'span'"
1442
+ :type="grouping.collapsible ? 'button' : undefined"
1443
+ :aria-expanded="
1444
+ grouping.collapsible
1445
+ ? !collapsedGroups.includes(key!)
1446
+ : undefined
1447
+ "
1448
+ :class="uiTable.groupToggle()"
1449
+ @click="grouping.collapsible && toggleGroup(key!)"
1450
+ >
1451
+ <UIcon
1452
+ v-if="grouping.collapsible"
1453
+ :name="
1454
+ collapsedGroups.includes(key!)
1455
+ ? 'i-ph-caret-right'
1456
+ : 'i-ph-caret-down'
1457
+ "
1458
+ class="size-3"
1459
+ />
1460
+ <component :is="header" />
1461
+ </component>
1462
+ <span
1463
+ v-if="grouping.countOf?.(key!) !== undefined"
1464
+ :class="uiTable.groupCount()"
1465
+ >
1466
+ {{ grouping.countOf(key!) }}
1467
+ </span>
1468
+ </div>
1469
+ </td>
1470
+ </tr>
1471
+ <template v-else>
1472
+ <tr
1473
+ :data-selected="row.getIsSelected()"
1474
+ :data-expanded="row.getIsExpanded()"
1475
+ :data-presence="!!getRowPresence(row.original)"
1476
+ :title="
1477
+ getRowPresence(row.original)
1478
+ ? presenceTooltipText(getRowPresence(row.original)!)
1479
+ : undefined
1480
+ "
742
1481
  :class="
743
- uiTable.rowCell({
744
- pinned: getPinnedVariant(cell.column),
1482
+ uiTable.row({
745
1483
  loading,
746
1484
  rowClickable: isRowClickable(row.original),
1485
+ presence: !!getRowPresence(row.original),
747
1486
  })
748
1487
  "
749
- :style="{
750
- left: getPinnedLeftOffset(cell.column),
751
- right: getPinnedRightOffset(cell.column),
752
- }"
1488
+ @dblclick="handleRowDoubleClick(row.original)"
1489
+ @mouseenter="handleRowHover(row)"
1490
+ @mouseleave="handleRowLeave"
1491
+ @dragover="reorder?.enabled && $event.preventDefault()"
1492
+ @drop="dropRow(row.index)"
753
1493
  >
754
- <div :class="uiTable.rowContainer()">
755
- <div :class="uiTable.rowInternal({ loading })">
756
- <slot
757
- :name="`${cell.column.id}-cell`"
758
- v-bind="cell.getContext()"
759
- >
760
- <div
761
- :class="
762
- uiTable.rowSpan({
763
- cellWrap: (
764
- cell.column.columnDef as TableColumn<T>
765
- ).cellWrap,
766
- })
767
- "
1494
+ <td
1495
+ v-if="hasPresenceRail"
1496
+ :class="[
1497
+ 'border-b-muted sticky left-0 z-30 border-b p-0 in-[tr:last-child]:border-b-0',
1498
+ row.getIsSelected() && !getRowPresence(row.original)
1499
+ ? SELECTION_RAIL_BG
1500
+ : presenceRailBackground(row.original),
1501
+ ]"
1502
+ :style="{
1503
+ width: PRESENCE_RAIL_WIDTH_PX,
1504
+ minWidth: PRESENCE_RAIL_WIDTH_PX,
1505
+ }"
1506
+ />
1507
+ <td v-if="reorder" :class="uiTable.handleCell()">
1508
+ <button
1509
+ type="button"
1510
+ :draggable="reorder.enabled"
1511
+ :disabled="!reorder.enabled"
1512
+ :aria-label="t('dms.table.reorder.move')"
1513
+ :title="
1514
+ reorder.enabled
1515
+ ? t('dms.table.reorder.move')
1516
+ : t('dms.table.reorder.disabled')
1517
+ "
1518
+ :class="uiTable.handle()"
1519
+ @dragstart="draggedRowIndex = row.index"
1520
+ @dragend="draggedRowIndex = undefined"
1521
+ @keydown.up.prevent="stepRow(row.index, -1)"
1522
+ @keydown.down.prevent="stepRow(row.index, 1)"
1523
+ >
1524
+ <UIcon name="i-ph-dots-six-vertical" />
1525
+ </button>
1526
+ </td>
1527
+ <td
1528
+ v-for="cell in row.getVisibleCells()"
1529
+ :key="cell.id"
1530
+ :data-pinned="cell.column.getIsPinned()"
1531
+ :class="
1532
+ uiTable.rowCell({
1533
+ pinned: getPinnedVariant(cell.column),
1534
+ loading,
1535
+ rowClickable: isRowClickable(row.original),
1536
+ })
1537
+ "
1538
+ :style="{
1539
+ left: getPinnedLeftOffset(cell.column),
1540
+ right: getPinnedRightOffset(cell.column),
1541
+ }"
1542
+ >
1543
+ <div :class="uiTable.rowContainer()">
1544
+ <div :class="uiTable.rowInternal({ loading })">
1545
+ <slot
1546
+ :name="`${cell.column.id}-cell`"
1547
+ v-bind="cell.getContext()"
768
1548
  >
769
- <FlexRender
770
- :render="cell.column.columnDef.cell"
771
- :props="cell.getContext()"
772
- />
773
- </div>
774
- </slot>
1549
+ <div
1550
+ :class="
1551
+ uiTable.rowSpan({
1552
+ cellWrap: (
1553
+ cell.column.columnDef as TableColumn<T>
1554
+ ).cellWrap,
1555
+ })
1556
+ "
1557
+ @mouseenter="syncClippedTitle"
1558
+ >
1559
+ <FlexRender
1560
+ :render="cell.column.columnDef.cell"
1561
+ :props="cell.getContext()"
1562
+ />
1563
+ </div>
1564
+ </slot>
1565
+ </div>
775
1566
  </div>
776
-
777
- <USkeleton
778
- v-show="loading"
779
- :class="uiTable.skeletonTd()"
780
- />
781
- </div>
782
- </td>
783
- </tr>
784
- <tr v-if="row.getIsExpanded()">
785
- <td
786
- :colspan="
787
- row.getAllCells().length + (hasPresenceRail ? 1 : 0)
788
- "
1567
+ </td>
1568
+ </tr>
1569
+ <tr
1570
+ v-if="row.getIsExpanded()"
1571
+ :id="expandedRowDomId(row.id)"
789
1572
  >
790
- <slot name="expanded" :row="row" />
791
- </td>
792
- </tr>
1573
+ <td
1574
+ :colspan="
1575
+ row.getVisibleCells().length + leadingCellCount
1576
+ "
1577
+ :class="uiTable.expandedCell()"
1578
+ >
1579
+ <div :class="uiTable.expandedBody()">
1580
+ <slot name="expanded" :row="row" />
1581
+ </div>
1582
+ </td>
1583
+ </tr>
1584
+ </template>
793
1585
  </template>
794
1586
  </template>
1587
+ <!-- First load: skeleton rows keep the column rhythm instead of
1588
+ flashing the empty state. -->
1589
+ <template v-else-if="loading">
1590
+ <tr
1591
+ v-for="rowIndex in skeletonRowCount"
1592
+ :key="`skeleton-${rowIndex}`"
1593
+ aria-hidden="true"
1594
+ :class="uiTable.skeletonRow()"
1595
+ :style="{ opacity: skeletonRowOpacity(rowIndex) }"
1596
+ >
1597
+ <td
1598
+ v-if="hasPresenceRail"
1599
+ class="border-b-muted border-b p-0 in-[tr:last-child]:border-b-0"
1600
+ />
1601
+ <td v-if="reorder" :class="uiTable.handleCell()" />
1602
+ <td
1603
+ v-for="(
1604
+ column, columnIndex
1605
+ ) in table.getVisibleLeafColumns()"
1606
+ :key="column.id"
1607
+ :class="uiTable.rowCell()"
1608
+ >
1609
+ <USkeleton
1610
+ v-if="column.columnDef.meta"
1611
+ :class="uiTable.skeletonCell()"
1612
+ :style="{ width: skeletonWidth(rowIndex, columnIndex) }"
1613
+ />
1614
+ </td>
1615
+ </tr>
1616
+ </template>
795
1617
  <tr v-else>
796
1618
  <td
797
1619
  :colspan="
798
- table.getVisibleLeafColumns().length +
799
- (hasPresenceRail ? 1 : 0)
1620
+ table.getVisibleLeafColumns().length + leadingCellCount
800
1621
  "
801
1622
  class="p-0"
802
1623
  >
@@ -805,6 +1626,8 @@ defineShortcuts({
805
1626
  normalizeActionConfig(rowActions?.add).isEnabled
806
1627
  "
807
1628
  :load-error="loadError"
1629
+ :archived="isShowingArchived"
1630
+ :empty-states="emptyStates"
808
1631
  />
809
1632
  </td>
810
1633
  </tr>