@hed-hog/core 0.0.398 → 0.0.400

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 (664) hide show
  1. package/dist/ai/ai-agent.sort.d.ts +6 -0
  2. package/dist/ai/ai-agent.sort.d.ts.map +1 -0
  3. package/dist/ai/ai-agent.sort.js +21 -0
  4. package/dist/ai/ai-agent.sort.js.map +1 -0
  5. package/dist/ai/ai.controller.d.ts +4 -4
  6. package/dist/ai/ai.service.d.ts +35 -4
  7. package/dist/ai/ai.service.d.ts.map +1 -1
  8. package/dist/ai/ai.service.js +51 -137
  9. package/dist/ai/ai.service.js.map +1 -1
  10. package/dist/ai-instruction/ai-instruction.service.d.ts.map +1 -1
  11. package/dist/ai-instruction/ai-instruction.service.js +26 -23
  12. package/dist/ai-instruction/ai-instruction.service.js.map +1 -1
  13. package/dist/ai-instruction/ai-instruction.sort.d.ts +16 -0
  14. package/dist/ai-instruction/ai-instruction.sort.d.ts.map +1 -0
  15. package/dist/ai-instruction/ai-instruction.sort.js +32 -0
  16. package/dist/ai-instruction/ai-instruction.sort.js.map +1 -0
  17. package/dist/auth/auth.controller.d.ts +24 -8
  18. package/dist/auth/auth.controller.d.ts.map +1 -1
  19. package/dist/auth/auth.module.d.ts.map +1 -1
  20. package/dist/auth/auth.module.js +8 -1
  21. package/dist/auth/auth.module.js.map +1 -1
  22. package/dist/auth/auth.service.d.ts +72 -25
  23. package/dist/auth/auth.service.d.ts.map +1 -1
  24. package/dist/auth/auth.service.js +41 -4
  25. package/dist/auth/auth.service.js.map +1 -1
  26. package/dist/auth/guards/auth.guard.d.ts +3 -1
  27. package/dist/auth/guards/auth.guard.d.ts.map +1 -1
  28. package/dist/auth/guards/auth.guard.js +12 -3
  29. package/dist/auth/guards/auth.guard.js.map +1 -1
  30. package/dist/authorize/authorize.controller.d.ts +30 -6
  31. package/dist/authorize/authorize.controller.d.ts.map +1 -1
  32. package/dist/authorize/authorize.controller.js +120 -13
  33. package/dist/authorize/authorize.controller.js.map +1 -1
  34. package/dist/authorize/authorize.errors.d.ts +34 -0
  35. package/dist/authorize/authorize.errors.d.ts.map +1 -0
  36. package/dist/authorize/authorize.errors.js +37 -0
  37. package/dist/authorize/authorize.errors.js.map +1 -0
  38. package/dist/authorize/authorize.module.d.ts.map +1 -1
  39. package/dist/authorize/authorize.module.js +6 -1
  40. package/dist/authorize/authorize.module.js.map +1 -1
  41. package/dist/authorize/authorize.service.d.ts +78 -4
  42. package/dist/authorize/authorize.service.d.ts.map +1 -1
  43. package/dist/authorize/authorize.service.js +212 -21
  44. package/dist/authorize/authorize.service.js.map +1 -1
  45. package/dist/authorize/dto/authorize-info.dto.d.ts +10 -1
  46. package/dist/authorize/dto/authorize-info.dto.d.ts.map +1 -1
  47. package/dist/authorize/dto/authorize-info.dto.js +16 -1
  48. package/dist/authorize/dto/authorize-info.dto.js.map +1 -1
  49. package/dist/authorize/dto/consent.dto.d.ts +10 -1
  50. package/dist/authorize/dto/consent.dto.d.ts.map +1 -1
  51. package/dist/authorize/dto/consent.dto.js +16 -1
  52. package/dist/authorize/dto/consent.dto.js.map +1 -1
  53. package/dist/authorize/dto/token.dto.d.ts +12 -0
  54. package/dist/authorize/dto/token.dto.d.ts.map +1 -1
  55. package/dist/authorize/dto/token.dto.js +21 -1
  56. package/dist/authorize/dto/token.dto.js.map +1 -1
  57. package/dist/authorize/oauth-exception.filter.d.ts +17 -0
  58. package/dist/authorize/oauth-exception.filter.d.ts.map +1 -0
  59. package/dist/authorize/oauth-exception.filter.js +54 -0
  60. package/dist/authorize/oauth-exception.filter.js.map +1 -0
  61. package/dist/authorize/oauth-metadata.service.d.ts +39 -0
  62. package/dist/authorize/oauth-metadata.service.d.ts.map +1 -0
  63. package/dist/authorize/oauth-metadata.service.js +81 -0
  64. package/dist/authorize/oauth-metadata.service.js.map +1 -0
  65. package/dist/authorize/well-known.controller.d.ts +67 -0
  66. package/dist/authorize/well-known.controller.d.ts.map +1 -0
  67. package/dist/authorize/well-known.controller.js +126 -0
  68. package/dist/authorize/well-known.controller.js.map +1 -0
  69. package/dist/captcha/captcha.service.d.ts +32 -2
  70. package/dist/captcha/captcha.service.d.ts.map +1 -1
  71. package/dist/captcha/captcha.service.js +85 -12
  72. package/dist/captcha/captcha.service.js.map +1 -1
  73. package/dist/challenge/challenge.service.d.ts +2 -2
  74. package/dist/core.module.d.ts.map +1 -1
  75. package/dist/core.module.js +6 -0
  76. package/dist/core.module.js.map +1 -1
  77. package/dist/dashboard/dashboard/dashboard.controller.d.ts +9 -9
  78. package/dist/dashboard/dashboard/dashboard.service.d.ts +9 -9
  79. package/dist/dashboard/dashboard-component/dashboard-component.controller.d.ts +3 -3
  80. package/dist/dashboard/dashboard-component/dashboard-component.service.d.ts +3 -3
  81. package/dist/dashboard/dashboard-component-role/dashboard-component-role.controller.d.ts +3 -3
  82. package/dist/dashboard/dashboard-component-role/dashboard-component-role.service.d.ts +3 -3
  83. package/dist/dashboard/dashboard-component-role/dashboard-component-role.service.d.ts.map +1 -1
  84. package/dist/dashboard/dashboard-component-role/dashboard-component-role.service.js +2 -4
  85. package/dist/dashboard/dashboard-component-role/dashboard-component-role.service.js.map +1 -1
  86. package/dist/dashboard/dashboard-component-role/dashboard-component-role.sort.d.ts +8 -0
  87. package/dist/dashboard/dashboard-component-role/dashboard-component-role.sort.d.ts.map +1 -0
  88. package/dist/dashboard/dashboard-component-role/dashboard-component-role.sort.js +18 -0
  89. package/dist/dashboard/dashboard-component-role/dashboard-component-role.sort.js.map +1 -0
  90. package/dist/dashboard/dashboard-item/dashboard-item.service.d.ts.map +1 -1
  91. package/dist/dashboard/dashboard-item/dashboard-item.service.js +2 -4
  92. package/dist/dashboard/dashboard-item/dashboard-item.service.js.map +1 -1
  93. package/dist/dashboard/dashboard-item/dashboard-item.sort.d.ts +9 -0
  94. package/dist/dashboard/dashboard-item/dashboard-item.sort.d.ts.map +1 -0
  95. package/dist/dashboard/dashboard-item/dashboard-item.sort.js +19 -0
  96. package/dist/dashboard/dashboard-item/dashboard-item.sort.js.map +1 -0
  97. package/dist/dashboard/dashboard-role/dashboard-role.controller.d.ts +3 -3
  98. package/dist/dashboard/dashboard-role/dashboard-role.service.d.ts +3 -3
  99. package/dist/dashboard/dashboard-role/dashboard-role.service.d.ts.map +1 -1
  100. package/dist/dashboard/dashboard-role/dashboard-role.service.js +2 -4
  101. package/dist/dashboard/dashboard-role/dashboard-role.service.js.map +1 -1
  102. package/dist/dashboard/dashboard-role/dashboard-role.sort.d.ts +8 -0
  103. package/dist/dashboard/dashboard-role/dashboard-role.sort.d.ts.map +1 -0
  104. package/dist/dashboard/dashboard-role/dashboard-role.sort.js +16 -0
  105. package/dist/dashboard/dashboard-role/dashboard-role.sort.js.map +1 -0
  106. package/dist/file/file-upload-ticket.service.d.ts +160 -0
  107. package/dist/file/file-upload-ticket.service.d.ts.map +1 -0
  108. package/dist/file/file-upload-ticket.service.js +382 -0
  109. package/dist/file/file-upload-ticket.service.js.map +1 -0
  110. package/dist/file/file.controller.d.ts +24 -1
  111. package/dist/file/file.controller.d.ts.map +1 -1
  112. package/dist/file/file.controller.js +63 -2
  113. package/dist/file/file.controller.js.map +1 -1
  114. package/dist/file/file.module.d.ts.map +1 -1
  115. package/dist/file/file.module.js +14 -2
  116. package/dist/file/file.module.js.map +1 -1
  117. package/dist/file/file.service.d.ts +182 -6
  118. package/dist/file/file.service.d.ts.map +1 -1
  119. package/dist/file/file.service.js +385 -36
  120. package/dist/file/file.service.js.map +1 -1
  121. package/dist/file/filename-encoding.util.d.ts +24 -0
  122. package/dist/file/filename-encoding.util.d.ts.map +1 -0
  123. package/dist/file/filename-encoding.util.js +63 -0
  124. package/dist/file/filename-encoding.util.js.map +1 -0
  125. package/dist/file/image-optimization.service.d.ts +27 -0
  126. package/dist/file/image-optimization.service.d.ts.map +1 -1
  127. package/dist/file/image-optimization.service.js +63 -14
  128. package/dist/file/image-optimization.service.js.map +1 -1
  129. package/dist/file/mcp-file-source.schema.d.ts +33 -0
  130. package/dist/file/mcp-file-source.schema.d.ts.map +1 -0
  131. package/dist/file/mcp-file-source.schema.js +75 -0
  132. package/dist/file/mcp-file-source.schema.js.map +1 -0
  133. package/dist/file/mcp-file-source.service.d.ts +124 -0
  134. package/dist/file/mcp-file-source.service.d.ts.map +1 -0
  135. package/dist/file/mcp-file-source.service.js +262 -0
  136. package/dist/file/mcp-file-source.service.js.map +1 -0
  137. package/dist/file/mimetype-sniff.util.d.ts +62 -0
  138. package/dist/file/mimetype-sniff.util.d.ts.map +1 -0
  139. package/dist/file/mimetype-sniff.util.js +226 -0
  140. package/dist/file/mimetype-sniff.util.js.map +1 -0
  141. package/dist/file/remote-fetch.util.d.ts +35 -0
  142. package/dist/file/remote-fetch.util.d.ts.map +1 -0
  143. package/dist/file/remote-fetch.util.js +236 -0
  144. package/dist/file/remote-fetch.util.js.map +1 -0
  145. package/dist/impersonation/dto/start-impersonation.dto.d.ts +4 -1
  146. package/dist/impersonation/dto/start-impersonation.dto.d.ts.map +1 -1
  147. package/dist/impersonation/dto/start-impersonation.dto.js +1 -1
  148. package/dist/impersonation/dto/start-impersonation.dto.js.map +1 -1
  149. package/dist/impersonation/impersonation.service.d.ts +8 -3
  150. package/dist/impersonation/impersonation.service.d.ts.map +1 -1
  151. package/dist/impersonation/impersonation.service.js +14 -4
  152. package/dist/impersonation/impersonation.service.js.map +1 -1
  153. package/dist/incident/incident.controller.d.ts +2 -1
  154. package/dist/incident/incident.controller.d.ts.map +1 -1
  155. package/dist/incident/incident.controller.js +10 -6
  156. package/dist/incident/incident.controller.js.map +1 -1
  157. package/dist/incident/incident.service.d.ts +2 -0
  158. package/dist/incident/incident.service.d.ts.map +1 -1
  159. package/dist/incident/incident.service.js +4 -0
  160. package/dist/incident/incident.service.js.map +1 -1
  161. package/dist/index.d.ts +17 -0
  162. package/dist/index.d.ts.map +1 -1
  163. package/dist/index.js +17 -0
  164. package/dist/index.js.map +1 -1
  165. package/dist/integration-profile/integration-profile.secrets.d.ts.map +1 -1
  166. package/dist/integration-profile/integration-profile.secrets.js +7 -0
  167. package/dist/integration-profile/integration-profile.secrets.js.map +1 -1
  168. package/dist/integration-profile/integration-profile.service.d.ts +0 -13
  169. package/dist/integration-profile/integration-profile.service.d.ts.map +1 -1
  170. package/dist/integration-profile/integration-profile.service.js +5 -40
  171. package/dist/integration-profile/integration-profile.service.js.map +1 -1
  172. package/dist/integration-profile/integration-profile.utils.js +5 -5
  173. package/dist/integration-profile/integration-profile.utils.js.map +1 -1
  174. package/dist/integration-profile/testers/index.d.ts.map +1 -1
  175. package/dist/integration-profile/testers/index.js +2 -0
  176. package/dist/integration-profile/testers/index.js.map +1 -1
  177. package/dist/integration-profile/testers/shipping.testers.d.ts +3 -0
  178. package/dist/integration-profile/testers/shipping.testers.d.ts.map +1 -0
  179. package/dist/integration-profile/testers/shipping.testers.js +71 -0
  180. package/dist/integration-profile/testers/shipping.testers.js.map +1 -0
  181. package/dist/locale/locale.controller.d.ts +1 -1
  182. package/dist/locale/locale.service.d.ts +1 -1
  183. package/dist/mail/dto/send.dto.d.ts +6 -1
  184. package/dist/mail/dto/send.dto.d.ts.map +1 -1
  185. package/dist/mail/dto/send.dto.js.map +1 -1
  186. package/dist/mail/mail.service.d.ts +9 -0
  187. package/dist/mail/mail.service.d.ts.map +1 -1
  188. package/dist/mail/mail.service.js +34 -14
  189. package/dist/mail/mail.service.js.map +1 -1
  190. package/dist/mail-sent/mail-sent.controller.d.ts +1 -1
  191. package/dist/mail-sent/mail-sent.service.d.ts +1 -1
  192. package/dist/mail-sent/mail-sent.service.d.ts.map +1 -1
  193. package/dist/mail-sent/mail-sent.service.js +2 -1
  194. package/dist/mail-sent/mail-sent.service.js.map +1 -1
  195. package/dist/mail-sent/mail-sent.sort.d.ts +9 -0
  196. package/dist/mail-sent/mail-sent.sort.d.ts.map +1 -0
  197. package/dist/mail-sent/mail-sent.sort.js +19 -0
  198. package/dist/mail-sent/mail-sent.sort.js.map +1 -0
  199. package/dist/mcp/filters/mcp-challenge.filter.d.ts +20 -0
  200. package/dist/mcp/filters/mcp-challenge.filter.d.ts.map +1 -0
  201. package/dist/mcp/filters/mcp-challenge.filter.js +69 -0
  202. package/dist/mcp/filters/mcp-challenge.filter.js.map +1 -0
  203. package/dist/mcp/guards/mcp-auth.guard.d.ts +4 -1
  204. package/dist/mcp/guards/mcp-auth.guard.d.ts.map +1 -1
  205. package/dist/mcp/guards/mcp-auth.guard.js +19 -5
  206. package/dist/mcp/guards/mcp-auth.guard.js.map +1 -1
  207. package/dist/mcp/guards/mcp-permission.guard.d.ts +25 -3
  208. package/dist/mcp/guards/mcp-permission.guard.d.ts.map +1 -1
  209. package/dist/mcp/guards/mcp-permission.guard.js +46 -26
  210. package/dist/mcp/guards/mcp-permission.guard.js.map +1 -1
  211. package/dist/mcp/mcp-audit.service.d.ts +17 -0
  212. package/dist/mcp/mcp-audit.service.d.ts.map +1 -1
  213. package/dist/mcp/mcp-audit.service.js +32 -3
  214. package/dist/mcp/mcp-audit.service.js.map +1 -1
  215. package/dist/mcp/mcp-permission.service.d.ts +64 -0
  216. package/dist/mcp/mcp-permission.service.d.ts.map +1 -0
  217. package/dist/mcp/mcp-permission.service.js +178 -0
  218. package/dist/mcp/mcp-permission.service.js.map +1 -0
  219. package/dist/mcp/mcp-server.service.d.ts +3 -1
  220. package/dist/mcp/mcp-server.service.d.ts.map +1 -1
  221. package/dist/mcp/mcp-server.service.js +36 -15
  222. package/dist/mcp/mcp-server.service.js.map +1 -1
  223. package/dist/mcp/mcp.controller.d.ts.map +1 -1
  224. package/dist/mcp/mcp.controller.js +10 -2
  225. package/dist/mcp/mcp.controller.js.map +1 -1
  226. package/dist/mcp/mcp.module.d.ts.map +1 -1
  227. package/dist/mcp/mcp.module.js +5 -1
  228. package/dist/mcp/mcp.module.js.map +1 -1
  229. package/dist/mcp/tools/core-ai.mcp-tools.js +2 -9
  230. package/dist/mcp/tools/core-ai.mcp-tools.js.map +1 -1
  231. package/dist/mcp/tools/core-dashboard-items.mcp-tools.js +1 -1
  232. package/dist/mcp/tools/core-dashboard-items.mcp-tools.js.map +1 -1
  233. package/dist/mcp/tools/core-dashboard.mcp-tools.js +2 -9
  234. package/dist/mcp/tools/core-dashboard.mcp-tools.js.map +1 -1
  235. package/dist/mcp/tools/core-event-webhooks.mcp-tools.d.ts.map +1 -1
  236. package/dist/mcp/tools/core-event-webhooks.mcp-tools.js +2 -10
  237. package/dist/mcp/tools/core-event-webhooks.mcp-tools.js.map +1 -1
  238. package/dist/mcp/tools/core-files.mcp-tools.d.ts +17 -5
  239. package/dist/mcp/tools/core-files.mcp-tools.d.ts.map +1 -1
  240. package/dist/mcp/tools/core-files.mcp-tools.js +186 -24
  241. package/dist/mcp/tools/core-files.mcp-tools.js.map +1 -1
  242. package/dist/mcp/tools/core-integration-events.mcp-tools.js +2 -9
  243. package/dist/mcp/tools/core-integration-events.mcp-tools.js.map +1 -1
  244. package/dist/mcp/tools/core-mail-sent.mcp-tools.js +2 -14
  245. package/dist/mcp/tools/core-mail-sent.mcp-tools.js.map +1 -1
  246. package/dist/mcp/tools/core-mail.mcp-tools.js +2 -9
  247. package/dist/mcp/tools/core-mail.mcp-tools.js.map +1 -1
  248. package/dist/mcp/tools/core-menus.mcp-tools.d.ts.map +1 -1
  249. package/dist/mcp/tools/core-menus.mcp-tools.js +2 -10
  250. package/dist/mcp/tools/core-menus.mcp-tools.js.map +1 -1
  251. package/dist/mcp/tools/core-notifications.mcp-tools.d.ts.map +1 -1
  252. package/dist/mcp/tools/core-notifications.mcp-tools.js +0 -1
  253. package/dist/mcp/tools/core-notifications.mcp-tools.js.map +1 -1
  254. package/dist/mcp/tools/core-roles.mcp-tools.d.ts.map +1 -1
  255. package/dist/mcp/tools/core-roles.mcp-tools.js +2 -13
  256. package/dist/mcp/tools/core-roles.mcp-tools.js.map +1 -1
  257. package/dist/mcp/tools/core-routes.mcp-tools.d.ts.map +1 -1
  258. package/dist/mcp/tools/core-routes.mcp-tools.js +2 -11
  259. package/dist/mcp/tools/core-routes.mcp-tools.js.map +1 -1
  260. package/dist/mcp/tools/core-screens.mcp-tools.d.ts.map +1 -1
  261. package/dist/mcp/tools/core-screens.mcp-tools.js +2 -11
  262. package/dist/mcp/tools/core-screens.mcp-tools.js.map +1 -1
  263. package/dist/mcp/tools/core-sessions.mcp-tools.d.ts.map +1 -1
  264. package/dist/mcp/tools/core-sessions.mcp-tools.js +0 -2
  265. package/dist/mcp/tools/core-sessions.mcp-tools.js.map +1 -1
  266. package/dist/mcp/tools/core-settings.mcp-tools.d.ts.map +1 -1
  267. package/dist/mcp/tools/core-settings.mcp-tools.js +2 -10
  268. package/dist/mcp/tools/core-settings.mcp-tools.js.map +1 -1
  269. package/dist/mcp/tools/core-users.mcp-tools.js +2 -9
  270. package/dist/mcp/tools/core-users.mcp-tools.js.map +1 -1
  271. package/dist/mcp/tools/core-webhooks.mcp-tools.d.ts.map +1 -1
  272. package/dist/mcp/tools/core-webhooks.mcp-tools.js +2 -10
  273. package/dist/mcp/tools/core-webhooks.mcp-tools.js.map +1 -1
  274. package/dist/mcp/types/mcp-context.type.d.ts +9 -0
  275. package/dist/mcp/types/mcp-context.type.d.ts.map +1 -1
  276. package/dist/mcp-chat/mcp-chat.service.d.ts.map +1 -1
  277. package/dist/mcp-chat/mcp-chat.service.js +8 -0
  278. package/dist/mcp-chat/mcp-chat.service.js.map +1 -1
  279. package/dist/meeting/meeting-provider.registry.d.ts +115 -0
  280. package/dist/meeting/meeting-provider.registry.d.ts.map +1 -1
  281. package/dist/meeting/meeting-provider.registry.js.map +1 -1
  282. package/dist/meeting/meeting.constants.d.ts +70 -0
  283. package/dist/meeting/meeting.constants.d.ts.map +1 -1
  284. package/dist/meeting/meeting.constants.js +9 -1
  285. package/dist/meeting/meeting.constants.js.map +1 -1
  286. package/dist/menu/menu.service.d.ts.map +1 -1
  287. package/dist/menu/menu.service.js +29 -9
  288. package/dist/menu/menu.service.js.map +1 -1
  289. package/dist/message-template/dto/update-message-template.dto.d.ts +18 -0
  290. package/dist/message-template/dto/update-message-template.dto.d.ts.map +1 -0
  291. package/dist/message-template/dto/update-message-template.dto.js +38 -0
  292. package/dist/message-template/dto/update-message-template.dto.js.map +1 -0
  293. package/dist/message-template/message-template-admin.service.d.ts +70 -0
  294. package/dist/message-template/message-template-admin.service.d.ts.map +1 -0
  295. package/dist/message-template/message-template-admin.service.js +226 -0
  296. package/dist/message-template/message-template-admin.service.js.map +1 -0
  297. package/dist/message-template/message-template.controller.d.ts +29 -0
  298. package/dist/message-template/message-template.controller.d.ts.map +1 -0
  299. package/dist/message-template/message-template.controller.js +101 -0
  300. package/dist/message-template/message-template.controller.js.map +1 -0
  301. package/dist/message-template/message-template.module.d.ts +10 -0
  302. package/dist/message-template/message-template.module.d.ts.map +1 -0
  303. package/dist/message-template/message-template.module.js +33 -0
  304. package/dist/message-template/message-template.module.js.map +1 -0
  305. package/dist/message-template/message-template.registry.d.ts +55 -0
  306. package/dist/message-template/message-template.registry.d.ts.map +1 -0
  307. package/dist/message-template/message-template.registry.js +64 -0
  308. package/dist/message-template/message-template.registry.js.map +1 -0
  309. package/dist/message-template/message-template.service.d.ts +59 -0
  310. package/dist/message-template/message-template.service.d.ts.map +1 -0
  311. package/dist/message-template/message-template.service.js +166 -0
  312. package/dist/message-template/message-template.service.js.map +1 -0
  313. package/dist/notification/notification.constants.d.ts +11 -0
  314. package/dist/notification/notification.constants.d.ts.map +1 -0
  315. package/dist/notification/notification.constants.js +14 -0
  316. package/dist/notification/notification.constants.js.map +1 -0
  317. package/dist/notification/notification.controller.d.ts +20 -20
  318. package/dist/notification/notification.module.d.ts.map +1 -1
  319. package/dist/notification/notification.module.js +3 -0
  320. package/dist/notification/notification.module.js.map +1 -1
  321. package/dist/notification/notification.service.d.ts +33 -21
  322. package/dist/notification/notification.service.d.ts.map +1 -1
  323. package/dist/notification/notification.service.js +36 -2
  324. package/dist/notification/notification.service.js.map +1 -1
  325. package/dist/oauth/oauth.controller.d.ts +4 -6
  326. package/dist/oauth/oauth.controller.d.ts.map +1 -1
  327. package/dist/oauth/oauth.controller.js +0 -1
  328. package/dist/oauth/oauth.controller.js.map +1 -1
  329. package/dist/oauth/oauth.errors.d.ts +15 -1
  330. package/dist/oauth/oauth.errors.d.ts.map +1 -1
  331. package/dist/oauth/oauth.errors.js +9 -1
  332. package/dist/oauth/oauth.errors.js.map +1 -1
  333. package/dist/oauth/oauth.module.d.ts.map +1 -1
  334. package/dist/oauth/oauth.module.js +6 -1
  335. package/dist/oauth/oauth.module.js.map +1 -1
  336. package/dist/oauth/oauth.service.d.ts +25 -5
  337. package/dist/oauth/oauth.service.d.ts.map +1 -1
  338. package/dist/oauth/oauth.service.js +63 -27
  339. package/dist/oauth/oauth.service.js.map +1 -1
  340. package/dist/oauth/providers/abstract.provider.d.ts +10 -0
  341. package/dist/oauth/providers/abstract.provider.d.ts.map +1 -1
  342. package/dist/oauth/providers/abstract.provider.js +39 -12
  343. package/dist/oauth/providers/abstract.provider.js.map +1 -1
  344. package/dist/oauth/providers/github.provider.d.ts +1 -1
  345. package/dist/oauth/providers/github.provider.d.ts.map +1 -1
  346. package/dist/oauth/providers/github.provider.js +48 -22
  347. package/dist/oauth/providers/github.provider.js.map +1 -1
  348. package/dist/oauth/providers/microsoft-entra-id.provider.d.ts.map +1 -1
  349. package/dist/oauth/providers/microsoft-entra-id.provider.js +6 -0
  350. package/dist/oauth/providers/microsoft-entra-id.provider.js.map +1 -1
  351. package/dist/observability/monitored-cron.d.ts +29 -12
  352. package/dist/observability/monitored-cron.d.ts.map +1 -1
  353. package/dist/observability/monitored-cron.js +131 -46
  354. package/dist/observability/monitored-cron.js.map +1 -1
  355. package/dist/pairing/pairing.controller.d.ts +9 -9
  356. package/dist/pairing/pairing.service.d.ts +15 -11
  357. package/dist/pairing/pairing.service.d.ts.map +1 -1
  358. package/dist/profile/dto/change-password.dto.d.ts.map +1 -1
  359. package/dist/profile/dto/change-password.dto.js +4 -6
  360. package/dist/profile/dto/change-password.dto.js.map +1 -1
  361. package/dist/profile/profile.controller.d.ts +1 -1
  362. package/dist/profile/profile.service.d.ts +1 -1
  363. package/dist/profile/profile.service.d.ts.map +1 -1
  364. package/dist/profile/profile.service.js +9 -3
  365. package/dist/profile/profile.service.js.map +1 -1
  366. package/dist/realtime/realtime-tick.coalescer.d.ts +34 -0
  367. package/dist/realtime/realtime-tick.coalescer.d.ts.map +1 -0
  368. package/dist/realtime/realtime-tick.coalescer.js +60 -0
  369. package/dist/realtime/realtime-tick.coalescer.js.map +1 -0
  370. package/dist/realtime/realtime.service.d.ts +2 -0
  371. package/dist/realtime/realtime.service.d.ts.map +1 -1
  372. package/dist/realtime/realtime.service.js +22 -2
  373. package/dist/realtime/realtime.service.js.map +1 -1
  374. package/dist/redis/redis-kv.service.d.ts +90 -0
  375. package/dist/redis/redis-kv.service.d.ts.map +1 -0
  376. package/dist/redis/redis-kv.service.js +247 -0
  377. package/dist/redis/redis-kv.service.js.map +1 -0
  378. package/dist/redis/redis-master.d.ts +29 -0
  379. package/dist/redis/redis-master.d.ts.map +1 -0
  380. package/dist/redis/redis-master.js +81 -0
  381. package/dist/redis/redis-master.js.map +1 -0
  382. package/dist/redis/redis-pubsub.d.ts +12 -0
  383. package/dist/redis/redis-pubsub.d.ts.map +1 -1
  384. package/dist/redis/redis-pubsub.js +25 -2
  385. package/dist/redis/redis-pubsub.js.map +1 -1
  386. package/dist/redis/redis.module.d.ts +11 -0
  387. package/dist/redis/redis.module.d.ts.map +1 -0
  388. package/dist/redis/redis.module.js +30 -0
  389. package/dist/redis/redis.module.js.map +1 -0
  390. package/dist/session/session.controller.d.ts +6 -2
  391. package/dist/session/session.controller.d.ts.map +1 -1
  392. package/dist/session/session.service.d.ts +118 -15
  393. package/dist/session/session.service.d.ts.map +1 -1
  394. package/dist/session/session.service.js +251 -77
  395. package/dist/session/session.service.js.map +1 -1
  396. package/dist/setting/setting.controller.d.ts +5 -0
  397. package/dist/setting/setting.controller.d.ts.map +1 -1
  398. package/dist/setting/setting.service.d.ts +7 -0
  399. package/dist/setting/setting.service.d.ts.map +1 -1
  400. package/dist/setting/setting.service.js +38 -3
  401. package/dist/setting/setting.service.js.map +1 -1
  402. package/dist/task/task.service.d.ts +17 -0
  403. package/dist/task/task.service.d.ts.map +1 -1
  404. package/dist/task/task.service.js +48 -13
  405. package/dist/task/task.service.js.map +1 -1
  406. package/dist/token/token.service.d.ts +19 -1
  407. package/dist/token/token.service.d.ts.map +1 -1
  408. package/dist/token/token.service.js +39 -2
  409. package/dist/token/token.service.js.map +1 -1
  410. package/dist/user/user-credential.util.d.ts +10 -0
  411. package/dist/user/user-credential.util.d.ts.map +1 -1
  412. package/dist/user/user-credential.util.js +14 -1
  413. package/dist/user/user-credential.util.js.map +1 -1
  414. package/dist/user/user.service.d.ts +12 -4
  415. package/dist/user/user.service.d.ts.map +1 -1
  416. package/dist/user/user.service.js +2 -11
  417. package/dist/user/user.service.js.map +1 -1
  418. package/dist/user/user.sort.d.ts +16 -0
  419. package/dist/user/user.sort.d.ts.map +1 -0
  420. package/dist/user/user.sort.js +25 -0
  421. package/dist/user/user.sort.js.map +1 -0
  422. package/dist/utils/abbreviate-name.d.ts +13 -0
  423. package/dist/utils/abbreviate-name.d.ts.map +1 -0
  424. package/dist/utils/abbreviate-name.js +42 -0
  425. package/dist/utils/abbreviate-name.js.map +1 -0
  426. package/dist/utils/date-range-query.dto.d.ts +11 -0
  427. package/dist/utils/date-range-query.dto.d.ts.map +1 -0
  428. package/dist/utils/date-range-query.dto.js +63 -0
  429. package/dist/utils/date-range-query.dto.js.map +1 -0
  430. package/dist/utils/date-range.d.ts +96 -0
  431. package/dist/utils/date-range.d.ts.map +1 -0
  432. package/dist/utils/date-range.js +172 -0
  433. package/dist/utils/date-range.js.map +1 -0
  434. package/dist/webhook-integration/webhook-utils.d.ts.map +1 -1
  435. package/dist/webhook-integration/webhook-utils.js +24 -0
  436. package/dist/webhook-integration/webhook-utils.js.map +1 -1
  437. package/dist/whatsapp-sender/whatsapp-recipients.d.ts +49 -0
  438. package/dist/whatsapp-sender/whatsapp-recipients.d.ts.map +1 -0
  439. package/dist/whatsapp-sender/whatsapp-recipients.js +66 -0
  440. package/dist/whatsapp-sender/whatsapp-recipients.js.map +1 -0
  441. package/dist/whatsapp-sender/whatsapp-sender.service.d.ts +25 -0
  442. package/dist/whatsapp-sender/whatsapp-sender.service.d.ts.map +1 -1
  443. package/dist/whatsapp-sender/whatsapp-sender.service.js +46 -5
  444. package/dist/whatsapp-sender/whatsapp-sender.service.js.map +1 -1
  445. package/hedhog/data/integration_provider.yaml +9 -0
  446. package/hedhog/data/integration_type.yaml +6 -0
  447. package/hedhog/data/locale.yaml +0 -1
  448. package/hedhog/data/mail.yaml +2 -2
  449. package/hedhog/data/mail_layout.yaml +6 -3
  450. package/hedhog/data/menu.yaml +25 -5
  451. package/hedhog/data/route.yaml +140 -0
  452. package/hedhog/data/setting_group.yaml +137 -3
  453. package/hedhog/frontend/app/access-log/page.tsx.ejs +47 -53
  454. package/hedhog/frontend/app/account/components/active-sessions.tsx.ejs +33 -8
  455. package/hedhog/frontend/app/account/components/mcp-tokens.tsx.ejs +54 -13
  456. package/hedhog/frontend/app/account/components/mfa-method-card.tsx.ejs +7 -1
  457. package/hedhog/frontend/app/account/components/recovery-codes-dialog.tsx.ejs +1 -0
  458. package/hedhog/frontend/app/account/components/tokens.tsx.ejs +47 -17
  459. package/hedhog/frontend/app/ai_agent/page.tsx.ejs +46 -5
  460. package/hedhog/frontend/app/ai_instruction/_components/ai-instruction-form.tsx.ejs +101 -30
  461. package/hedhog/frontend/app/ai_instruction/_components/ai-instruction-versions.tsx.ejs +24 -8
  462. package/hedhog/frontend/app/ai_instruction/page.tsx.ejs +80 -15
  463. package/hedhog/frontend/app/configurations/[slug]/components/image-optimization-action.tsx.ejs +166 -0
  464. package/hedhog/frontend/app/configurations/[slug]/components/setting-field.test.tsx.ejs +145 -45
  465. package/hedhog/frontend/app/configurations/[slug]/components/setting-field.tsx.ejs +99 -219
  466. package/hedhog/frontend/app/configurations/[slug]/page.tsx.ejs +19 -1
  467. package/hedhog/frontend/app/configurations/layout.tsx.ejs +19 -5
  468. package/hedhog/frontend/app/dashboard/[slug]/widget-renderer.tsx.ejs +2 -8
  469. package/hedhog/frontend/app/dashboard/components/dynamic-widget.tsx.ejs +3 -0
  470. package/hedhog/frontend/app/dashboard/components/widget-wrapper.tsx.ejs +4 -0
  471. package/hedhog/frontend/app/dashboard/dashboard-home-tabs.tsx.ejs +43 -44
  472. package/hedhog/frontend/app/dashboard/management/tabs/component-roles-tab.tsx.ejs +41 -3
  473. package/hedhog/frontend/app/dashboard/management/tabs/components-tab.tsx.ejs +42 -2
  474. package/hedhog/frontend/app/dashboard/management/tabs/dashboard-roles-tab.tsx.ejs +41 -3
  475. package/hedhog/frontend/app/dashboard/management/tabs/dashboards-tab.tsx.ejs +39 -4
  476. package/hedhog/frontend/app/dashboard/management/tabs/items-tab.tsx.ejs +42 -3
  477. package/hedhog/frontend/app/incidents/page.tsx.ejs +60 -31
  478. package/hedhog/frontend/app/integration/profiles/page.tsx.ejs +45 -5
  479. package/hedhog/frontend/app/integrations-webhooks/page.tsx.ejs +92 -15
  480. package/hedhog/frontend/app/mail/log/page.tsx.ejs +109 -61
  481. package/hedhog/frontend/app/mail/template/page.tsx.ejs +125 -23
  482. package/hedhog/frontend/app/mcp_chat/chat-components.tsx.ejs +13 -15
  483. package/hedhog/frontend/app/mcp_chat/page.tsx.ejs +116 -110
  484. package/hedhog/frontend/app/message-templates/_components/message-template-sheet.tsx.ejs +245 -0
  485. package/hedhog/frontend/app/message-templates/_lib/types.ts.ejs +24 -0
  486. package/hedhog/frontend/app/message-templates/page.tsx.ejs +182 -0
  487. package/hedhog/frontend/app/pages/_components/page-wizard-sheet.tsx.ejs +1 -0
  488. package/hedhog/frontend/app/pages/page.tsx.ejs +94 -9
  489. package/hedhog/frontend/app/roles/menus.tsx.ejs +4 -4
  490. package/hedhog/frontend/app/roles/routes.tsx.ejs +4 -4
  491. package/hedhog/frontend/app/roles/users.tsx.ejs +4 -4
  492. package/hedhog/frontend/app/setting-list/page.tsx.ejs +71 -9
  493. package/hedhog/frontend/app/users/page.tsx.ejs +77 -67
  494. package/hedhog/frontend/messages/en.json +183 -36
  495. package/hedhog/frontend/messages/pt.json +183 -36
  496. package/hedhog/table/cron_lock.yaml +17 -0
  497. package/hedhog/table/file.yaml +13 -1
  498. package/hedhog/table/file_upload_chunk.yaml +23 -0
  499. package/hedhog/table/file_upload_ticket.yaml +67 -0
  500. package/hedhog/table/mcp_tool_call_log.yaml +30 -22
  501. package/hedhog/table/message_template.yaml +33 -0
  502. package/hedhog/table/setting.yaml +8 -0
  503. package/hedhog/table/user_session.yaml +36 -1
  504. package/package.json +8 -6
  505. package/src/ai/ai-agent.sort.ts +21 -0
  506. package/src/ai/ai.service.spec.ts +173 -1
  507. package/src/ai/ai.service.ts +64 -193
  508. package/src/ai-instruction/ai-instruction.service.ts +32 -28
  509. package/src/ai-instruction/ai-instruction.sort.ts +32 -0
  510. package/src/auth/auth.module.ts +8 -1
  511. package/src/auth/auth.service.spec.ts +108 -1
  512. package/src/auth/auth.service.ts +59 -5
  513. package/src/auth/guards/auth.guard.ts +9 -1
  514. package/src/authorize/authorize.controller.ts +126 -11
  515. package/src/authorize/authorize.errors.ts +55 -0
  516. package/src/authorize/authorize.module.ts +6 -1
  517. package/src/authorize/authorize.service.spec.ts +379 -7
  518. package/src/authorize/authorize.service.ts +309 -23
  519. package/src/authorize/dto/authorize-info.dto.ts +21 -3
  520. package/src/authorize/dto/consent.dto.ts +21 -3
  521. package/src/authorize/dto/token.dto.ts +24 -2
  522. package/src/authorize/oauth-exception.filter.ts +58 -0
  523. package/src/authorize/oauth-metadata.service.ts +67 -0
  524. package/src/authorize/well-known.controller.spec.ts +84 -0
  525. package/src/authorize/well-known.controller.ts +96 -0
  526. package/src/captcha/captcha.service.spec.ts +211 -4
  527. package/src/captcha/captcha.service.ts +127 -10
  528. package/src/core.module.ts +6 -0
  529. package/src/dashboard/dashboard-component-role/dashboard-component-role.service.ts +2 -3
  530. package/src/dashboard/dashboard-component-role/dashboard-component-role.sort.ts +18 -0
  531. package/src/dashboard/dashboard-item/dashboard-item.service.ts +2 -3
  532. package/src/dashboard/dashboard-item/dashboard-item.sort.ts +19 -0
  533. package/src/dashboard/dashboard-role/dashboard-role.service.ts +2 -3
  534. package/src/dashboard/dashboard-role/dashboard-role.sort.ts +16 -0
  535. package/src/file/file-upload-ticket.service.spec.ts +422 -0
  536. package/src/file/file-upload-ticket.service.ts +513 -0
  537. package/src/file/file.controller.ts +65 -0
  538. package/src/file/file.module.ts +14 -2
  539. package/src/file/file.service.spec.ts +94 -0
  540. package/src/file/file.service.ts +432 -30
  541. package/src/file/filename-encoding.util.spec.ts +54 -0
  542. package/src/file/filename-encoding.util.ts +67 -0
  543. package/src/file/image-optimization.service.spec.ts +156 -19
  544. package/src/file/image-optimization.service.ts +106 -21
  545. package/src/file/mcp-file-source.schema.ts +83 -0
  546. package/src/file/mcp-file-source.service.spec.ts +473 -0
  547. package/src/file/mcp-file-source.service.ts +445 -0
  548. package/src/file/mimetype-sniff.util.spec.ts +126 -0
  549. package/src/file/mimetype-sniff.util.ts +265 -0
  550. package/src/file/remote-fetch.util.spec.ts +117 -0
  551. package/src/file/remote-fetch.util.ts +330 -0
  552. package/src/impersonation/dto/start-impersonation.dto.ts +5 -2
  553. package/src/impersonation/impersonation.service.spec.ts +24 -1
  554. package/src/impersonation/impersonation.service.ts +14 -4
  555. package/src/incident/incident.controller.ts +9 -1
  556. package/src/incident/incident.service.ts +7 -0
  557. package/src/index.ts +17 -0
  558. package/src/integration-profile/integration-profile.secrets.ts +7 -0
  559. package/src/integration-profile/integration-profile.service.ts +7 -64
  560. package/src/integration-profile/integration-profile.utils.spec.ts +9 -0
  561. package/src/integration-profile/integration-profile.utils.ts +5 -5
  562. package/src/integration-profile/testers/index.ts +2 -0
  563. package/src/integration-profile/testers/remaining.testers.spec.ts +79 -0
  564. package/src/integration-profile/testers/shipping.testers.ts +94 -0
  565. package/src/mail/dto/send.dto.ts +6 -1
  566. package/src/mail/mail-template.spec.ts +58 -1
  567. package/src/mail/mail.service.spec.ts +112 -0
  568. package/src/mail/mail.service.ts +42 -4
  569. package/src/mail-sent/mail-sent.service.ts +3 -0
  570. package/src/mail-sent/mail-sent.sort.ts +19 -0
  571. package/src/mcp/filters/mcp-challenge.filter.spec.ts +76 -0
  572. package/src/mcp/filters/mcp-challenge.filter.ts +70 -0
  573. package/src/mcp/guards/mcp-auth.guard.spec.ts +51 -2
  574. package/src/mcp/guards/mcp-auth.guard.ts +24 -1
  575. package/src/mcp/guards/mcp-permission.guard.spec.ts +109 -15
  576. package/src/mcp/guards/mcp-permission.guard.ts +76 -51
  577. package/src/mcp/mcp-audit.service.spec.ts +107 -0
  578. package/src/mcp/mcp-audit.service.ts +37 -1
  579. package/src/mcp/mcp-permission.service.spec.ts +197 -0
  580. package/src/mcp/mcp-permission.service.ts +184 -0
  581. package/src/mcp/mcp-server.service.spec.ts +84 -2
  582. package/src/mcp/mcp-server.service.ts +111 -87
  583. package/src/mcp/mcp.controller.ts +8 -1
  584. package/src/mcp/mcp.module.ts +5 -1
  585. package/src/mcp/tools/core-ai.mcp-tools.ts +1 -1
  586. package/src/mcp/tools/core-dashboard-items.mcp-tools.ts +1 -1
  587. package/src/mcp/tools/core-dashboard.mcp-tools.ts +1 -1
  588. package/src/mcp/tools/core-event-webhooks.mcp-tools.ts +1 -2
  589. package/src/mcp/tools/core-files.mcp-tools.ts +202 -22
  590. package/src/mcp/tools/core-integration-events.mcp-tools.ts +1 -1
  591. package/src/mcp/tools/core-mail-sent.mcp-tools.ts +1 -1
  592. package/src/mcp/tools/core-mail.mcp-tools.ts +1 -1
  593. package/src/mcp/tools/core-menus.mcp-tools.ts +1 -2
  594. package/src/mcp/tools/core-notifications.mcp-tools.ts +0 -1
  595. package/src/mcp/tools/core-roles.mcp-tools.ts +1 -5
  596. package/src/mcp/tools/core-routes.mcp-tools.ts +1 -3
  597. package/src/mcp/tools/core-screens.mcp-tools.ts +1 -3
  598. package/src/mcp/tools/core-sessions.mcp-tools.ts +0 -2
  599. package/src/mcp/tools/core-settings.mcp-tools.ts +1 -2
  600. package/src/mcp/tools/core-users.mcp-tools.ts +1 -1
  601. package/src/mcp/tools/core-webhooks.mcp-tools.ts +1 -2
  602. package/src/mcp/types/mcp-context.type.ts +15 -6
  603. package/src/mcp-chat/mcp-chat.service.ts +8 -0
  604. package/src/meeting/meeting-provider.registry.ts +121 -0
  605. package/src/meeting/meeting.constants.ts +74 -0
  606. package/src/menu/menu.service.spec.ts +89 -0
  607. package/src/menu/menu.service.ts +29 -11
  608. package/src/message-template/dto/update-message-template.dto.ts +22 -0
  609. package/src/message-template/message-template-admin.service.spec.ts +163 -0
  610. package/src/message-template/message-template-admin.service.ts +239 -0
  611. package/src/message-template/message-template.controller.ts +52 -0
  612. package/src/message-template/message-template.module.ts +21 -0
  613. package/src/message-template/message-template.registry.spec.ts +62 -0
  614. package/src/message-template/message-template.registry.ts +125 -0
  615. package/src/message-template/message-template.service.spec.ts +149 -0
  616. package/src/message-template/message-template.service.ts +149 -0
  617. package/src/notification/notification.constants.ts +10 -0
  618. package/src/notification/notification.module.ts +3 -0
  619. package/src/notification/notification.service.spec.ts +75 -1
  620. package/src/notification/notification.service.ts +39 -1
  621. package/src/oauth/oauth.controller.ts +0 -1
  622. package/src/oauth/oauth.errors.ts +7 -0
  623. package/src/oauth/oauth.module.ts +6 -1
  624. package/src/oauth/oauth.service.spec.ts +58 -7
  625. package/src/oauth/oauth.service.ts +71 -32
  626. package/src/oauth/providers/abstract.provider.spec.ts +192 -0
  627. package/src/oauth/providers/abstract.provider.ts +46 -14
  628. package/src/oauth/providers/github.provider.ts +57 -34
  629. package/src/oauth/providers/microsoft-entra-id.provider.ts +8 -1
  630. package/src/observability/monitored-cron.spec.ts +164 -31
  631. package/src/observability/monitored-cron.ts +154 -62
  632. package/src/profile/dto/change-password.dto.ts +25 -7
  633. package/src/profile/profile.service.spec.ts +97 -0
  634. package/src/profile/profile.service.ts +9 -3
  635. package/src/realtime/realtime-tick.coalescer.spec.ts +92 -0
  636. package/src/realtime/realtime-tick.coalescer.ts +60 -0
  637. package/src/realtime/realtime.service.spec.ts +33 -0
  638. package/src/realtime/realtime.service.ts +28 -2
  639. package/src/redis/redis-kv.service.ts +261 -0
  640. package/src/redis/redis-master.spec.ts +111 -0
  641. package/src/redis/redis-master.ts +86 -0
  642. package/src/redis/redis-pubsub.ts +27 -3
  643. package/src/redis/redis.module.ts +17 -0
  644. package/src/session/session.service.spec.ts +121 -42
  645. package/src/session/session.service.ts +279 -82
  646. package/src/setting/setting.service.ts +44 -3
  647. package/src/task/task.service.spec.ts +41 -0
  648. package/src/task/task.service.ts +53 -13
  649. package/src/token/token.service.spec.ts +90 -0
  650. package/src/token/token.service.ts +48 -2
  651. package/src/user/user-credential.util.ts +14 -5
  652. package/src/user/user.service.ts +2 -12
  653. package/src/user/user.sort.ts +25 -0
  654. package/src/utils/abbreviate-name.spec.ts +50 -0
  655. package/src/utils/abbreviate-name.ts +44 -0
  656. package/src/utils/date-range-query.dto.ts +56 -0
  657. package/src/utils/date-range.spec.ts +175 -0
  658. package/src/utils/date-range.ts +246 -0
  659. package/src/webhook-integration/webhook-utils.spec.ts +67 -0
  660. package/src/webhook-integration/webhook-utils.ts +26 -0
  661. package/src/whatsapp-sender/whatsapp-recipients.spec.ts +89 -0
  662. package/src/whatsapp-sender/whatsapp-recipients.ts +83 -0
  663. package/src/whatsapp-sender/whatsapp-sender.service.spec.ts +112 -0
  664. package/src/whatsapp-sender/whatsapp-sender.service.ts +58 -5
@@ -46,6 +46,11 @@ import {
46
46
  import { ResizableSheetContent } from '@/components/ui/resizable-sheet-content';
47
47
  import { Skeleton } from '@/components/ui/skeleton';
48
48
  import { Tabs, TabsList, TabsTrigger } from '@/components/ui/tabs';
49
+ import {
50
+ Tooltip,
51
+ TooltipContent,
52
+ TooltipTrigger,
53
+ } from '@/components/ui/tooltip';
49
54
  import { useDebounce } from '@/hooks/use-debounce';
50
55
  import { cn } from '@/lib/utils';
51
56
  import { useApp, useQuery } from '@hed-hog/next-app-provider';
@@ -1078,30 +1083,36 @@ export function DashboardHomeTabs() {
1078
1083
  {tabContent}
1079
1084
  </TabsTrigger>
1080
1085
  <DropdownMenu>
1081
- <DropdownMenuTrigger asChild>
1082
- <Button
1083
- type="button"
1084
- variant="ghost"
1085
- size="icon"
1086
- className={cn(
1087
- 'absolute top-1/2 right-1 z-10 size-7 -translate-y-1/2 rounded-md text-muted-foreground hover:text-foreground',
1088
- isActiveTab
1089
- ? 'bg-background/80'
1090
- : 'bg-transparent hover:bg-background/60'
1091
- )}
1092
- onClick={(event) => {
1093
- event.stopPropagation();
1094
- setActiveSlug(dashboard.slug);
1095
- }}
1096
- onPointerDown={(event) =>
1097
- event.stopPropagation()
1098
- }
1099
- aria-label={t('tabActions')}
1100
- title={t('tabActions')}
1101
- >
1102
- <MoreHorizontal className="size-4" />
1103
- </Button>
1104
- </DropdownMenuTrigger>
1086
+ <Tooltip>
1087
+ <TooltipTrigger asChild>
1088
+ <DropdownMenuTrigger asChild>
1089
+ <Button
1090
+ type="button"
1091
+ variant="ghost"
1092
+ size="icon"
1093
+ className={cn(
1094
+ 'absolute top-1/2 right-1 z-10 size-7 -translate-y-1/2 rounded-md text-muted-foreground hover:text-foreground',
1095
+ isActiveTab
1096
+ ? 'bg-background/80'
1097
+ : 'bg-transparent hover:bg-background/60'
1098
+ )}
1099
+ onClick={(event) => {
1100
+ event.stopPropagation();
1101
+ setActiveSlug(dashboard.slug);
1102
+ }}
1103
+ onPointerDown={(event) =>
1104
+ event.stopPropagation()
1105
+ }
1106
+ aria-label={t('tabActions')}
1107
+ >
1108
+ <MoreHorizontal className="size-4" />
1109
+ </Button>
1110
+ </DropdownMenuTrigger>
1111
+ </TooltipTrigger>
1112
+ <TooltipContent>
1113
+ {t('tabActions')}
1114
+ </TooltipContent>
1115
+ </Tooltip>
1105
1116
  <DropdownMenuContent
1106
1117
  align="end"
1107
1118
  className="w-56"
@@ -1473,12 +1484,9 @@ export function DashboardHomeTabs() {
1473
1484
  className="w-full"
1474
1485
  onClick={handleCreateDashboard}
1475
1486
  disabled={isCreating}
1487
+ loading={isCreating}
1476
1488
  >
1477
- {isCreating ? (
1478
- <Loader2 className="size-4 animate-spin" />
1479
- ) : (
1480
- <Plus className="size-4" />
1481
- )}
1489
+ <Plus className="size-4" />
1482
1490
  {t('createDashboard')}
1483
1491
  </Button>
1484
1492
  </div>
@@ -1590,12 +1598,9 @@ export function DashboardHomeTabs() {
1590
1598
  className="w-full"
1591
1599
  onClick={() => void handleSaveDashboardIcon()}
1592
1600
  disabled={isSavingIcon || Boolean(iconValue.trim()) === false}
1601
+ loading={isSavingIcon}
1593
1602
  >
1594
- {isSavingIcon ? (
1595
- <Loader2 className="size-4 animate-spin" />
1596
- ) : (
1597
- <Palette className="size-4" />
1598
- )}
1603
+ <Palette className="size-4" />
1599
1604
  {t('saveIcon')}
1600
1605
  </Button>
1601
1606
  </div>
@@ -1705,12 +1710,9 @@ export function DashboardHomeTabs() {
1705
1710
  className="cursor-pointer"
1706
1711
  onClick={() => void handleRevokeShare(user.id)}
1707
1712
  disabled={revokingUserId === user.id}
1713
+ loading={revokingUserId === user.id}
1708
1714
  >
1709
- {revokingUserId === user.id ? (
1710
- <Loader2 className="size-4 animate-spin" />
1711
- ) : (
1712
- <Trash2 className="size-4" />
1713
- )}
1715
+ <Trash2 className="size-4" />
1714
1716
  </Button>
1715
1717
  ) : null}
1716
1718
  </div>
@@ -1886,12 +1888,9 @@ export function DashboardHomeTabs() {
1886
1888
  disabled={
1887
1889
  isSharingUsers || selectedShareUserIds.length === 0
1888
1890
  }
1891
+ loading={isSharingUsers}
1889
1892
  >
1890
- {isSharingUsers ? (
1891
- <Loader2 className="size-4 animate-spin" />
1892
- ) : (
1893
- <UserPlus className="size-4" />
1894
- )}
1893
+ <UserPlus className="size-4" />
1895
1894
  {t('shareSelectedUsers', {
1896
1895
  count: selectedShareUserIds.length,
1897
1896
  })}
@@ -1,5 +1,6 @@
1
1
  'use client';
2
2
 
3
+ import { SortableTableHead } from '@/components/entity-list';
3
4
  import {
4
5
  AlertDialog,
5
6
  AlertDialogAction,
@@ -45,6 +46,7 @@ import {
45
46
  TableRow,
46
47
  } from '@/components/ui/table';
47
48
  import { useDebounce } from '@/hooks/use-debounce';
49
+ import { useTableSort, type SortableColumn } from '@/hooks/use-table-sort';
48
50
  import { useFormDraft } from '@/hooks/use-form-draft';
49
51
  import { usePersistedPageSize } from '@/hooks/use-persisted-page-size';
50
52
  import { formatDateTime } from '@/lib/format-date';
@@ -136,6 +138,21 @@ type RequestError = {
136
138
 
137
139
  const DEFAULT_PAGE_SIZES = [6, 12, 24, 48, 96] as const;
138
140
 
141
+ /**
142
+ * Espelha `DASHBOARD_COMPONENT_ROLE_SORT`
143
+ * (`libraries/core/src/dashboard/dashboard-component-role/dashboard-component-role.sort.ts`).
144
+ * Nomes localizados ficam de fora — a ordenação usa o slug da relação to-one.
145
+ */
146
+ type ComponentRoleSortField = 'id' | 'component_slug' | 'role_slug';
147
+
148
+ const SORT_COLUMNS: readonly SortableColumn<ComponentRoleSortField>[] = [
149
+ { field: 'id', initialOrder: 'desc' },
150
+ 'component_slug',
151
+ 'role_slug',
152
+ ];
153
+
154
+ const DEFAULT_SORT = { field: 'id', order: 'desc' } as const;
155
+
139
156
  export function ComponentRolesTab() {
140
157
  const t = useTranslations('core.DashboardManagement');
141
158
  const { request, currentLocaleCode, getSettingValue } = useApp();
@@ -187,6 +204,12 @@ export function ComponentRolesTab() {
187
204
  const searchQuery = '';
188
205
  const debouncedSearch = useDebounce(searchQuery, 500);
189
206
 
207
+ const sort = useTableSort<ComponentRoleSortField>({
208
+ columns: SORT_COLUMNS,
209
+ defaultSort: DEFAULT_SORT,
210
+ onSortChange: () => setPage(1),
211
+ });
212
+
190
213
  const {
191
214
  data: paginatedData,
192
215
  isLoading,
@@ -198,11 +221,15 @@ export function ComponentRolesTab() {
198
221
  pageSize,
199
222
  debouncedSearch,
200
223
  currentLocaleCode,
224
+ sort.sortField,
225
+ sort.sortOrder,
201
226
  ],
202
227
  queryFn: async () => {
203
228
  const params = new URLSearchParams();
204
229
  params.set('page', String(page));
205
230
  params.set('pageSize', String(pageSize));
231
+ params.set('sortField', sort.sortField);
232
+ params.set('sortOrder', sort.sortOrder);
206
233
  if (debouncedSearch) params.set('search', debouncedSearch);
207
234
 
208
235
  const response = await request<{ data: ComponentRole[]; total: number }>({
@@ -483,9 +510,15 @@ export function ComponentRolesTab() {
483
510
  <Table>
484
511
  <TableHeader>
485
512
  <TableRow>
486
- <TableHead>ID</TableHead>
487
- <TableHead>{t('component')}</TableHead>
488
- <TableHead>{t('role')}</TableHead>
513
+ <SortableTableHead label="ID" {...sort.getSortProps('id')} />
514
+ <SortableTableHead
515
+ label={t('component')}
516
+ {...sort.getSortProps('component_slug')}
517
+ />
518
+ <SortableTableHead
519
+ label={t('role')}
520
+ {...sort.getSortProps('role_slug')}
521
+ />
489
522
  <TableHead className="w-25">{t('actions')}</TableHead>
490
523
  </TableRow>
491
524
  </TableHeader>
@@ -528,6 +561,7 @@ export function ComponentRolesTab() {
528
561
  size="icon"
529
562
  variant="ghost"
530
563
  onClick={() => handleDeleteClick(role.id)}
564
+ tooltip={t('delete')}
531
565
  >
532
566
  <IconTrash className="size-4" />
533
567
  </Button>
@@ -590,6 +624,7 @@ export function ComponentRolesTab() {
590
624
  className="size-8"
591
625
  onClick={() => setPage(1)}
592
626
  disabled={page === 1}
627
+ tooltip={t('goToFirstPage')}
593
628
  >
594
629
  <IconChevronsLeft className="size-4" />
595
630
  </Button>
@@ -599,6 +634,7 @@ export function ComponentRolesTab() {
599
634
  className="size-8"
600
635
  onClick={() => setPage((p) => Math.max(1, p - 1))}
601
636
  disabled={page === 1}
637
+ tooltip={t('goToPreviousPage')}
602
638
  >
603
639
  <IconChevronLeft className="size-4" />
604
640
  </Button>
@@ -608,6 +644,7 @@ export function ComponentRolesTab() {
608
644
  className="size-8"
609
645
  onClick={() => setPage((p) => Math.min(totalPages, p + 1))}
610
646
  disabled={page === totalPages}
647
+ tooltip={t('goToNextPage')}
611
648
  >
612
649
  <IconChevronRight className="size-4" />
613
650
  </Button>
@@ -617,6 +654,7 @@ export function ComponentRolesTab() {
617
654
  className="size-8"
618
655
  onClick={() => setPage(totalPages)}
619
656
  disabled={page === totalPages}
657
+ tooltip={t('goToLastPage')}
620
658
  >
621
659
  <IconChevronsRight className="size-4" />
622
660
  </Button>
@@ -1,5 +1,6 @@
1
1
  'use client';
2
2
 
3
+ import { SortableTableHead } from '@/components/entity-list';
3
4
  import {
4
5
  AlertDialog,
5
6
  AlertDialogAction,
@@ -54,6 +55,7 @@ import {
54
55
  } from '@/components/ui/tooltip';
55
56
  import { useDebounce } from '@/hooks/use-debounce';
56
57
  import { usePersistedPageSize } from '@/hooks/use-persisted-page-size';
58
+ import { useTableSort, type SortableColumn } from '@/hooks/use-table-sort';
57
59
  import { useApp, useQuery } from '@hed-hog/next-app-provider';
58
60
  import * as TablerIcons from '@tabler/icons-react';
59
61
  import {
@@ -113,6 +115,22 @@ interface RoleOption {
113
115
 
114
116
  const DEFAULT_PAGE_SIZES = [6, 12, 24, 48, 96] as const;
115
117
 
118
+ /**
119
+ * `DashboardComponentService.getAllComponents` não passa `options.sort` ao
120
+ * `paginate()`, então `slug`/`is_resizable` (colunas flat) já são aceitos em
121
+ * `sortField` sem allowlist própria. Nome (`dashboard_component_locale`,
122
+ * relação), tamanho (largura×altura combinados) e papel (multi-valorado)
123
+ * ficam de fora.
124
+ */
125
+ type ComponentSortField = 'slug' | 'is_resizable';
126
+
127
+ const SORT_COLUMNS: readonly SortableColumn<ComponentSortField>[] = [
128
+ 'slug',
129
+ 'is_resizable',
130
+ ];
131
+
132
+ const DEFAULT_SORT = { field: 'slug', order: 'asc' } as const;
133
+
116
134
  export function ComponentsTab() {
117
135
  const t = useTranslations('core.DashboardManagement');
118
136
  const { request, locales, currentLocaleCode } = useApp();
@@ -201,6 +219,12 @@ export function ComponentsTab() {
201
219
  return <TablerIcons.IconBox className="h-4 w-4" />;
202
220
  };
203
221
 
222
+ const sort = useTableSort<ComponentSortField>({
223
+ columns: SORT_COLUMNS,
224
+ defaultSort: DEFAULT_SORT,
225
+ onSortChange: () => setPage(1),
226
+ });
227
+
204
228
  const {
205
229
  data: paginatedData,
206
230
  isLoading,
@@ -212,11 +236,15 @@ export function ComponentsTab() {
212
236
  pageSize,
213
237
  debouncedSearch,
214
238
  currentLocaleCode,
239
+ sort.sortField,
240
+ sort.sortOrder,
215
241
  ],
216
242
  queryFn: async () => {
217
243
  const params = new URLSearchParams();
218
244
  params.set('page', String(page));
219
245
  params.set('pageSize', String(pageSize));
246
+ params.set('sortField', sort.sortField);
247
+ params.set('sortOrder', sort.sortOrder);
220
248
  if (debouncedSearch) params.set('search', debouncedSearch);
221
249
 
222
250
  const response = await request<{ data: Component[]; total: number }>({
@@ -752,10 +780,16 @@ export function ComponentsTab() {
752
780
  <Table>
753
781
  <TableHeader>
754
782
  <TableRow>
755
- <TableHead>{t('slug')}</TableHead>
783
+ <SortableTableHead
784
+ label={t('slug')}
785
+ {...sort.getSortProps('slug')}
786
+ />
756
787
  <TableHead>{t('name')}</TableHead>
757
788
  <TableHead>{t('size')}</TableHead>
758
- <TableHead>{t('resizable')}</TableHead>
789
+ <SortableTableHead
790
+ label={t('resizable')}
791
+ {...sort.getSortProps('is_resizable')}
792
+ />
759
793
  <TableHead>{t('role')}</TableHead>
760
794
  <TableHead style={{ width: 100 }}>{t('actions')}</TableHead>
761
795
  </TableRow>
@@ -889,6 +923,7 @@ export function ComponentsTab() {
889
923
  size="icon"
890
924
  variant="ghost"
891
925
  onClick={() => handleEdit(component)}
926
+ tooltip={t('editComponent')}
892
927
  >
893
928
  <IconEdit className="size-4" />
894
929
  </Button>
@@ -896,6 +931,7 @@ export function ComponentsTab() {
896
931
  size="icon"
897
932
  variant="ghost"
898
933
  onClick={() => handleDeleteClick(component.id)}
934
+ tooltip={t('delete')}
899
935
  >
900
936
  <IconTrash className="size-4" />
901
937
  </Button>
@@ -959,6 +995,7 @@ export function ComponentsTab() {
959
995
  className="size-8"
960
996
  onClick={() => setPage(1)}
961
997
  disabled={page === 1}
998
+ tooltip={t('goToFirstPage')}
962
999
  >
963
1000
  <IconChevronsLeft className="size-4" />
964
1001
  </Button>
@@ -968,6 +1005,7 @@ export function ComponentsTab() {
968
1005
  className="size-8"
969
1006
  onClick={() => setPage((p) => Math.max(1, p - 1))}
970
1007
  disabled={page === 1}
1008
+ tooltip={t('goToPreviousPage')}
971
1009
  >
972
1010
  <IconChevronLeft className="size-4" />
973
1011
  </Button>
@@ -977,6 +1015,7 @@ export function ComponentsTab() {
977
1015
  className="size-8"
978
1016
  onClick={() => setPage((p) => Math.min(totalPages, p + 1))}
979
1017
  disabled={page === totalPages}
1018
+ tooltip={t('goToNextPage')}
980
1019
  >
981
1020
  <IconChevronRight className="size-4" />
982
1021
  </Button>
@@ -986,6 +1025,7 @@ export function ComponentsTab() {
986
1025
  className="size-8"
987
1026
  onClick={() => setPage(totalPages)}
988
1027
  disabled={page === totalPages}
1028
+ tooltip={t('goToLastPage')}
989
1029
  >
990
1030
  <IconChevronsRight className="size-4" />
991
1031
  </Button>
@@ -1,5 +1,6 @@
1
1
  'use client';
2
2
 
3
+ import { SortableTableHead } from '@/components/entity-list';
3
4
  import {
4
5
  AlertDialog,
5
6
  AlertDialogAction,
@@ -45,6 +46,7 @@ import {
45
46
  TableRow,
46
47
  } from '@/components/ui/table';
47
48
  import { useDebounce } from '@/hooks/use-debounce';
49
+ import { useTableSort, type SortableColumn } from '@/hooks/use-table-sort';
48
50
  import { useFormDraft } from '@/hooks/use-form-draft';
49
51
  import { usePersistedPageSize } from '@/hooks/use-persisted-page-size';
50
52
  import { formatDateTime } from '@/lib/format-date';
@@ -135,6 +137,21 @@ type RequestError = {
135
137
 
136
138
  const DEFAULT_PAGE_SIZES = [6, 12, 24, 48, 96] as const;
137
139
 
140
+ /**
141
+ * Espelha `DASHBOARD_ROLE_SORT`
142
+ * (`libraries/core/src/dashboard/dashboard-role/dashboard-role.sort.ts`).
143
+ * Nomes localizados ficam de fora — a ordenação usa o slug da relação to-one.
144
+ */
145
+ type DashboardRoleSortField = 'id' | 'dashboard_slug' | 'role_slug';
146
+
147
+ const SORT_COLUMNS: readonly SortableColumn<DashboardRoleSortField>[] = [
148
+ { field: 'id', initialOrder: 'desc' },
149
+ 'dashboard_slug',
150
+ 'role_slug',
151
+ ];
152
+
153
+ const DEFAULT_SORT = { field: 'id', order: 'desc' } as const;
154
+
138
155
  export function DashboardRolesTab() {
139
156
  const t = useTranslations('core.DashboardManagement');
140
157
  const { request, currentLocaleCode, getSettingValue } = useApp();
@@ -186,6 +203,12 @@ export function DashboardRolesTab() {
186
203
  const searchQuery = '';
187
204
  const debouncedSearch = useDebounce(searchQuery, 500);
188
205
 
206
+ const sort = useTableSort<DashboardRoleSortField>({
207
+ columns: SORT_COLUMNS,
208
+ defaultSort: DEFAULT_SORT,
209
+ onSortChange: () => setPage(1),
210
+ });
211
+
189
212
  const {
190
213
  data: paginatedData,
191
214
  isLoading,
@@ -197,11 +220,15 @@ export function DashboardRolesTab() {
197
220
  pageSize,
198
221
  debouncedSearch,
199
222
  currentLocaleCode,
223
+ sort.sortField,
224
+ sort.sortOrder,
200
225
  ],
201
226
  queryFn: async () => {
202
227
  const params = new URLSearchParams();
203
228
  params.set('page', String(page));
204
229
  params.set('pageSize', String(pageSize));
230
+ params.set('sortField', sort.sortField);
231
+ params.set('sortOrder', sort.sortOrder);
205
232
  if (debouncedSearch) params.set('search', debouncedSearch);
206
233
 
207
234
  const response = await request<{ data: DashboardRole[]; total: number }>({
@@ -482,9 +509,15 @@ export function DashboardRolesTab() {
482
509
  <Table>
483
510
  <TableHeader>
484
511
  <TableRow>
485
- <TableHead>ID</TableHead>
486
- <TableHead>{t('dashboard')}</TableHead>
487
- <TableHead>{t('role')}</TableHead>
512
+ <SortableTableHead label="ID" {...sort.getSortProps('id')} />
513
+ <SortableTableHead
514
+ label={t('dashboard')}
515
+ {...sort.getSortProps('dashboard_slug')}
516
+ />
517
+ <SortableTableHead
518
+ label={t('role')}
519
+ {...sort.getSortProps('role_slug')}
520
+ />
488
521
  <TableHead className="w-25">{t('actions')}</TableHead>
489
522
  </TableRow>
490
523
  </TableHeader>
@@ -527,6 +560,7 @@ export function DashboardRolesTab() {
527
560
  size="icon"
528
561
  variant="ghost"
529
562
  onClick={() => handleDeleteClick(role.id)}
563
+ tooltip={t('delete')}
530
564
  >
531
565
  <IconTrash className="size-4" />
532
566
  </Button>
@@ -589,6 +623,7 @@ export function DashboardRolesTab() {
589
623
  className="size-8"
590
624
  onClick={() => setPage(1)}
591
625
  disabled={page === 1}
626
+ tooltip={t('goToFirstPage')}
592
627
  >
593
628
  <IconChevronsLeft className="size-4" />
594
629
  </Button>
@@ -598,6 +633,7 @@ export function DashboardRolesTab() {
598
633
  className="size-8"
599
634
  onClick={() => setPage((p) => Math.max(1, p - 1))}
600
635
  disabled={page === 1}
636
+ tooltip={t('goToPreviousPage')}
601
637
  >
602
638
  <IconChevronLeft className="size-4" />
603
639
  </Button>
@@ -607,6 +643,7 @@ export function DashboardRolesTab() {
607
643
  className="size-8"
608
644
  onClick={() => setPage((p) => Math.min(totalPages, p + 1))}
609
645
  disabled={page === totalPages}
646
+ tooltip={t('goToNextPage')}
610
647
  >
611
648
  <IconChevronRight className="size-4" />
612
649
  </Button>
@@ -616,6 +653,7 @@ export function DashboardRolesTab() {
616
653
  className="size-8"
617
654
  onClick={() => setPage(totalPages)}
618
655
  disabled={page === totalPages}
656
+ tooltip={t('goToLastPage')}
619
657
  >
620
658
  <IconChevronsRight className="size-4" />
621
659
  </Button>
@@ -1,5 +1,6 @@
1
1
  'use client';
2
2
 
3
+ import { SortableTableHead } from '@/components/entity-list';
3
4
  import {
4
5
  AlertDialog,
5
6
  AlertDialogAction,
@@ -54,6 +55,7 @@ import {
54
55
  } from '@/components/ui/tooltip';
55
56
  import { useDebounce } from '@/hooks/use-debounce';
56
57
  import { usePersistedPageSize } from '@/hooks/use-persisted-page-size';
58
+ import { useTableSort, type SortableColumn } from '@/hooks/use-table-sort';
57
59
  import { useApp, useQuery } from '@hed-hog/next-app-provider';
58
60
  import {
59
61
  IconChevronLeft,
@@ -100,6 +102,23 @@ interface RoleOption {
100
102
 
101
103
  const DEFAULT_PAGE_SIZES = [6, 12, 24, 48, 96] as const;
102
104
 
105
+ /**
106
+ * `DashboardService.getAllDashboards` não passa `options.sort` ao
107
+ * `paginate()`, então qualquer coluna flat do model já é aceita em
108
+ * `sortField` sem allowlist própria. Nome (`dashboard_locale`, relação) e
109
+ * papel (multi-valorado) ficam de fora: o primeiro exigiria filtrar o
110
+ * `include` por idioma (e adicionar `@Locale()` ao endpoint, uma mudança
111
+ * maior que esta tarefa pede), o segundo não é um valor único por linha.
112
+ */
113
+ type DashboardSortField = 'id' | 'slug';
114
+
115
+ const SORT_COLUMNS: readonly SortableColumn<DashboardSortField>[] = [
116
+ { field: 'id', initialOrder: 'desc' },
117
+ 'slug',
118
+ ];
119
+
120
+ const DEFAULT_SORT = { field: 'id', order: 'desc' } as const;
121
+
103
122
  export function DashboardsTab() {
104
123
  const t = useTranslations('core.DashboardManagement');
105
124
  const { request, locales, currentLocaleCode } = useApp();
@@ -160,6 +179,11 @@ export function DashboardsTab() {
160
179
  const [searchQuery, setSearchQuery] = useState('');
161
180
  const [roleSearchQuery, setRoleSearchQuery] = useState('');
162
181
  const debouncedSearch = useDebounce(searchQuery, 500);
182
+ const sort = useTableSort<DashboardSortField>({
183
+ columns: SORT_COLUMNS,
184
+ defaultSort: DEFAULT_SORT,
185
+ onSortChange: () => setPage(1),
186
+ });
163
187
 
164
188
  const {
165
189
  data: paginatedData,
@@ -172,11 +196,15 @@ export function DashboardsTab() {
172
196
  pageSize,
173
197
  debouncedSearch,
174
198
  currentLocaleCode,
199
+ sort.sortField,
200
+ sort.sortOrder,
175
201
  ],
176
202
  queryFn: async () => {
177
203
  const params = new URLSearchParams();
178
204
  params.set('page', String(page));
179
205
  params.set('pageSize', String(pageSize));
206
+ params.set('sortField', sort.sortField);
207
+ params.set('sortOrder', sort.sortOrder);
180
208
  if (debouncedSearch) params.set('search', debouncedSearch);
181
209
 
182
210
  const response = await request<{ data: Dashboard[]; total: number }>({
@@ -513,8 +541,11 @@ export function DashboardsTab() {
513
541
  <Table>
514
542
  <TableHeader>
515
543
  <TableRow>
516
- <TableHead>{t('id')}</TableHead>
517
- <TableHead>{t('slug')}</TableHead>
544
+ <SortableTableHead label={t('id')} {...sort.getSortProps('id')} />
545
+ <SortableTableHead
546
+ label={t('slug')}
547
+ {...sort.getSortProps('slug')}
548
+ />
518
549
  <TableHead>{t('name')}</TableHead>
519
550
  <TableHead>{t('role')}</TableHead>
520
551
  <TableHead className="w-25">{t('actions')}</TableHead>
@@ -631,7 +662,7 @@ export function DashboardsTab() {
631
662
  size="icon"
632
663
  variant="ghost"
633
664
  onClick={() => handleEdit(dashboard)}
634
- title={t('editDashboardTitle')}
665
+ tooltip={t('editDashboardTitle')}
635
666
  >
636
667
  <IconEdit className="size-4" />
637
668
  </Button>
@@ -639,7 +670,7 @@ export function DashboardsTab() {
639
670
  size="icon"
640
671
  variant="ghost"
641
672
  onClick={() => handleDeleteClick(dashboard.id)}
642
- title={t('deleteDashboardTitle')}
673
+ tooltip={t('deleteDashboardTitle')}
643
674
  >
644
675
  <IconTrash className="size-4" />
645
676
  </Button>
@@ -703,6 +734,7 @@ export function DashboardsTab() {
703
734
  className="size-8"
704
735
  onClick={() => setPage(1)}
705
736
  disabled={page === 1}
737
+ tooltip={t('goToFirstPage')}
706
738
  >
707
739
  <IconChevronsLeft className="size-4" />
708
740
  </Button>
@@ -712,6 +744,7 @@ export function DashboardsTab() {
712
744
  className="size-8"
713
745
  onClick={() => setPage((p) => Math.max(1, p - 1))}
714
746
  disabled={page === 1}
747
+ tooltip={t('goToPreviousPage')}
715
748
  >
716
749
  <IconChevronLeft className="size-4" />
717
750
  </Button>
@@ -721,6 +754,7 @@ export function DashboardsTab() {
721
754
  className="size-8"
722
755
  onClick={() => setPage((p) => Math.min(totalPages, p + 1))}
723
756
  disabled={page === totalPages}
757
+ tooltip={t('goToNextPage')}
724
758
  >
725
759
  <IconChevronRight className="size-4" />
726
760
  </Button>
@@ -730,6 +764,7 @@ export function DashboardsTab() {
730
764
  className="size-8"
731
765
  onClick={() => setPage(totalPages)}
732
766
  disabled={page === totalPages}
767
+ tooltip={t('goToLastPage')}
733
768
  >
734
769
  <IconChevronsRight className="size-4" />
735
770
  </Button>