@hed-hog/core 0.0.355 → 0.0.358

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 (287) hide show
  1. package/dist/ai/ai.service.d.ts +3 -12
  2. package/dist/ai/ai.service.d.ts.map +1 -1
  3. package/dist/ai/ai.service.js +34 -125
  4. package/dist/ai/ai.service.js.map +1 -1
  5. package/dist/auth/guards/auth.guard.d.ts +6 -1
  6. package/dist/auth/guards/auth.guard.d.ts.map +1 -1
  7. package/dist/auth/guards/auth.guard.js +33 -2
  8. package/dist/auth/guards/auth.guard.js.map +1 -1
  9. package/dist/core.module.d.ts.map +1 -1
  10. package/dist/core.module.js +3 -3
  11. package/dist/core.module.js.map +1 -1
  12. package/dist/file/file.controller.d.ts +4 -2
  13. package/dist/file/file.controller.d.ts.map +1 -1
  14. package/dist/file/file.controller.js +44 -38
  15. package/dist/file/file.controller.js.map +1 -1
  16. package/dist/file/file.service.d.ts +2 -2
  17. package/dist/file/file.service.d.ts.map +1 -1
  18. package/dist/file/file.service.js +58 -89
  19. package/dist/file/file.service.js.map +1 -1
  20. package/dist/file/provider/azure.provider.d.ts.map +1 -1
  21. package/dist/file/provider/azure.provider.js +10 -15
  22. package/dist/file/provider/azure.provider.js.map +1 -1
  23. package/dist/file/provider/gcs.provider.d.ts.map +1 -1
  24. package/dist/file/provider/gcs.provider.js +8 -9
  25. package/dist/file/provider/gcs.provider.js.map +1 -1
  26. package/dist/file/provider/local.provider.d.ts.map +1 -1
  27. package/dist/file/provider/local.provider.js +11 -10
  28. package/dist/file/provider/local.provider.js.map +1 -1
  29. package/dist/file/provider/provider.enum.d.ts +2 -1
  30. package/dist/file/provider/provider.enum.d.ts.map +1 -1
  31. package/dist/file/provider/provider.enum.js +1 -0
  32. package/dist/file/provider/provider.enum.js.map +1 -1
  33. package/dist/file/provider/provider.factory.d.ts +1 -1
  34. package/dist/file/provider/provider.factory.d.ts.map +1 -1
  35. package/dist/file/provider/provider.factory.js +18 -5
  36. package/dist/file/provider/provider.factory.js.map +1 -1
  37. package/dist/file/provider/s3.provider.d.ts.map +1 -1
  38. package/dist/file/provider/s3.provider.js +4 -20
  39. package/dist/file/provider/s3.provider.js.map +1 -1
  40. package/dist/file/provider/spaces.provider.d.ts +27 -0
  41. package/dist/file/provider/spaces.provider.d.ts.map +1 -0
  42. package/dist/file/provider/spaces.provider.js +203 -0
  43. package/dist/file/provider/spaces.provider.js.map +1 -0
  44. package/dist/index.d.ts +4 -3
  45. package/dist/index.d.ts.map +1 -1
  46. package/dist/index.js +4 -3
  47. package/dist/index.js.map +1 -1
  48. package/dist/integration-profile/dto/create.dto.d.ts +9 -0
  49. package/dist/integration-profile/dto/create.dto.d.ts.map +1 -0
  50. package/dist/integration-profile/dto/create.dto.js +54 -0
  51. package/dist/integration-profile/dto/create.dto.js.map +1 -0
  52. package/dist/integration-profile/dto/export.dto.d.ts +5 -0
  53. package/dist/integration-profile/dto/export.dto.d.ts.map +1 -0
  54. package/dist/integration-profile/dto/export.dto.js +29 -0
  55. package/dist/integration-profile/dto/export.dto.js.map +1 -0
  56. package/dist/integration-profile/dto/import-confirm.dto.d.ts +17 -0
  57. package/dist/integration-profile/dto/import-confirm.dto.d.ts.map +1 -0
  58. package/dist/integration-profile/dto/import-confirm.dto.js +77 -0
  59. package/dist/integration-profile/dto/import-confirm.dto.js.map +1 -0
  60. package/dist/integration-profile/dto/update.dto.d.ts.map +1 -0
  61. package/dist/integration-profile/dto/update.dto.js.map +1 -0
  62. package/dist/integration-profile/integration-profile.controller.d.ts +142 -0
  63. package/dist/integration-profile/integration-profile.controller.d.ts.map +1 -0
  64. package/dist/integration-profile/integration-profile.controller.js +166 -0
  65. package/dist/integration-profile/integration-profile.controller.js.map +1 -0
  66. package/dist/integration-profile/integration-profile.module.d.ts +3 -0
  67. package/dist/integration-profile/integration-profile.module.d.ts.map +1 -0
  68. package/dist/{mail-profile/mail-profile.module.js → integration-profile/integration-profile.module.js} +11 -13
  69. package/dist/integration-profile/integration-profile.module.js.map +1 -0
  70. package/dist/integration-profile/integration-profile.service.d.ts +160 -0
  71. package/dist/integration-profile/integration-profile.service.d.ts.map +1 -0
  72. package/dist/integration-profile/integration-profile.service.js +609 -0
  73. package/dist/integration-profile/integration-profile.service.js.map +1 -0
  74. package/dist/integration-profile/integration-profile.utils.d.ts +30 -0
  75. package/dist/integration-profile/integration-profile.utils.d.ts.map +1 -0
  76. package/dist/integration-profile/integration-profile.utils.js +156 -0
  77. package/dist/integration-profile/integration-profile.utils.js.map +1 -0
  78. package/dist/mail/mail.module.d.ts.map +1 -1
  79. package/dist/mail/mail.module.js +36 -23
  80. package/dist/mail/mail.module.js.map +1 -1
  81. package/dist/mail/mail.service.d.ts +4 -2
  82. package/dist/mail/mail.service.d.ts.map +1 -1
  83. package/dist/mail/mail.service.js +33 -51
  84. package/dist/mail/mail.service.js.map +1 -1
  85. package/dist/mcp/guards/mcp-auth.guard.js +1 -1
  86. package/dist/mcp/guards/mcp-auth.guard.js.map +1 -1
  87. package/dist/mcp/mcp-api-key.controller.d.ts +2 -0
  88. package/dist/mcp/mcp-api-key.controller.d.ts.map +1 -1
  89. package/dist/mcp/mcp-api-key.controller.js +1 -1
  90. package/dist/mcp/mcp-api-key.controller.js.map +1 -1
  91. package/dist/mcp/mcp-api-key.service.d.ts +2 -1
  92. package/dist/mcp/mcp-api-key.service.d.ts.map +1 -1
  93. package/dist/mcp/mcp-api-key.service.js +6 -2
  94. package/dist/mcp/mcp-api-key.service.js.map +1 -1
  95. package/dist/mcp/mcp.module.d.ts.map +1 -1
  96. package/dist/mcp/mcp.module.js +3 -5
  97. package/dist/mcp/mcp.module.js.map +1 -1
  98. package/dist/mcp-chat/mcp-chat.service.d.ts.map +1 -1
  99. package/dist/mcp-chat/mcp-chat.service.js +17 -16
  100. package/dist/mcp-chat/mcp-chat.service.js.map +1 -1
  101. package/dist/oauth/interfaces/OAuthProvider.d.ts +1 -1
  102. package/dist/oauth/interfaces/OAuthProvider.d.ts.map +1 -1
  103. package/dist/oauth/oauth.controller.d.ts +4 -1
  104. package/dist/oauth/oauth.controller.d.ts.map +1 -1
  105. package/dist/oauth/oauth.controller.js +31 -5
  106. package/dist/oauth/oauth.controller.js.map +1 -1
  107. package/dist/oauth/oauth.service.d.ts +12 -1
  108. package/dist/oauth/oauth.service.d.ts.map +1 -1
  109. package/dist/oauth/oauth.service.js +125 -23
  110. package/dist/oauth/oauth.service.js.map +1 -1
  111. package/dist/oauth/providers/abstract.provider.d.ts +1 -1
  112. package/dist/oauth/providers/abstract.provider.d.ts.map +1 -1
  113. package/dist/oauth/providers/facebook.provider.d.ts +5 -2
  114. package/dist/oauth/providers/facebook.provider.d.ts.map +1 -1
  115. package/dist/oauth/providers/facebook.provider.js +34 -19
  116. package/dist/oauth/providers/facebook.provider.js.map +1 -1
  117. package/dist/oauth/providers/github.provider.d.ts +6 -2
  118. package/dist/oauth/providers/github.provider.d.ts.map +1 -1
  119. package/dist/oauth/providers/github.provider.js +43 -20
  120. package/dist/oauth/providers/github.provider.js.map +1 -1
  121. package/dist/oauth/providers/google.provider.d.ts +5 -2
  122. package/dist/oauth/providers/google.provider.d.ts.map +1 -1
  123. package/dist/oauth/providers/google.provider.js +34 -19
  124. package/dist/oauth/providers/google.provider.js.map +1 -1
  125. package/dist/oauth/providers/microsoft-entra-id.provider.d.ts +5 -2
  126. package/dist/oauth/providers/microsoft-entra-id.provider.d.ts.map +1 -1
  127. package/dist/oauth/providers/microsoft-entra-id.provider.js +43 -40
  128. package/dist/oauth/providers/microsoft-entra-id.provider.js.map +1 -1
  129. package/dist/oauth/providers/microsoft.provider.d.ts +5 -2
  130. package/dist/oauth/providers/microsoft.provider.d.ts.map +1 -1
  131. package/dist/oauth/providers/microsoft.provider.js +34 -19
  132. package/dist/oauth/providers/microsoft.provider.js.map +1 -1
  133. package/dist/profile/profile.controller.js +1 -1
  134. package/dist/profile/profile.controller.js.map +1 -1
  135. package/dist/security/security.service.d.ts +2 -0
  136. package/dist/security/security.service.d.ts.map +1 -1
  137. package/dist/security/security.service.js +21 -0
  138. package/dist/security/security.service.js.map +1 -1
  139. package/dist/setting/setting.service.d.ts +26 -1
  140. package/dist/setting/setting.service.d.ts.map +1 -1
  141. package/dist/setting/setting.service.js +240 -7
  142. package/dist/setting/setting.service.js.map +1 -1
  143. package/dist/user/user.controller.d.ts +2 -1
  144. package/dist/user/user.controller.d.ts.map +1 -1
  145. package/dist/user/user.controller.js +5 -4
  146. package/dist/user/user.controller.js.map +1 -1
  147. package/dist/user/user.service.d.ts +4 -2
  148. package/dist/user/user.service.d.ts.map +1 -1
  149. package/dist/user/user.service.js +19 -4
  150. package/dist/user/user.service.js.map +1 -1
  151. package/dist/webhook-integration/dto/webhook-action.dto.d.ts +17 -2
  152. package/dist/webhook-integration/dto/webhook-action.dto.d.ts.map +1 -1
  153. package/dist/webhook-integration/dto/webhook-action.dto.js +93 -2
  154. package/dist/webhook-integration/dto/webhook-action.dto.js.map +1 -1
  155. package/dist/webhook-integration/event-webhook.controller.d.ts +1 -0
  156. package/dist/webhook-integration/event-webhook.controller.d.ts.map +1 -1
  157. package/dist/webhook-integration/event-webhook.controller.js +10 -0
  158. package/dist/webhook-integration/event-webhook.controller.js.map +1 -1
  159. package/dist/webhook-integration/event-webhook.service.d.ts +2 -0
  160. package/dist/webhook-integration/event-webhook.service.d.ts.map +1 -1
  161. package/dist/webhook-integration/event-webhook.service.js +30 -0
  162. package/dist/webhook-integration/event-webhook.service.js.map +1 -1
  163. package/dist/webhook-integration/webhook-command.registry.d.ts +15 -0
  164. package/dist/webhook-integration/webhook-command.registry.d.ts.map +1 -0
  165. package/dist/webhook-integration/webhook-command.registry.js +36 -0
  166. package/dist/webhook-integration/webhook-command.registry.js.map +1 -0
  167. package/dist/webhook-integration/webhook-integration.controller.d.ts +20 -0
  168. package/dist/webhook-integration/webhook-integration.controller.d.ts.map +1 -1
  169. package/dist/webhook-integration/webhook-integration.controller.js +48 -0
  170. package/dist/webhook-integration/webhook-integration.controller.js.map +1 -1
  171. package/dist/webhook-integration/webhook-integration.module.d.ts.map +1 -1
  172. package/dist/webhook-integration/webhook-integration.module.js +5 -0
  173. package/dist/webhook-integration/webhook-integration.module.js.map +1 -1
  174. package/dist/webhook-integration/webhook-integration.service.d.ts +27 -2
  175. package/dist/webhook-integration/webhook-integration.service.d.ts.map +1 -1
  176. package/dist/webhook-integration/webhook-integration.service.js +377 -50
  177. package/dist/webhook-integration/webhook-integration.service.js.map +1 -1
  178. package/hedhog/data/file_provider.yaml +9 -1
  179. package/hedhog/data/integration_provider.yaml +148 -0
  180. package/hedhog/data/integration_type.yaml +29 -0
  181. package/hedhog/data/menu.yaml +6 -21
  182. package/hedhog/data/role.yaml +8 -0
  183. package/hedhog/data/route.yaml +73 -373
  184. package/hedhog/data/setting_group.yaml +209 -365
  185. package/hedhog/data/setting_subgroup.yaml +21 -13
  186. package/hedhog/frontend/app/account/components/connected-accounts.tsx.ejs +25 -20
  187. package/hedhog/frontend/app/account/components/tokens.tsx.ejs +421 -0
  188. package/hedhog/frontend/app/account/layout.tsx.ejs +6 -3
  189. package/hedhog/frontend/app/account/mcp-tokens/page.tsx.ejs +2 -2
  190. package/hedhog/frontend/app/account/tokens/page.tsx.ejs +5 -0
  191. package/hedhog/frontend/app/configurations/[slug]/components/setting-field.tsx.ejs +938 -225
  192. package/hedhog/frontend/app/configurations/layout.tsx.ejs +1 -1
  193. package/hedhog/frontend/app/dashboard/dashboard-home-tabs.tsx.ejs +3 -1
  194. package/hedhog/frontend/app/integration/profiles/page.tsx.ejs +1830 -0
  195. package/hedhog/frontend/app/integrations-webhooks/page.tsx.ejs +829 -128
  196. package/hedhog/frontend/app/mail/profiles/page.tsx.ejs +1 -820
  197. package/hedhog/frontend/app/setting-list/page.tsx.ejs +229 -395
  198. package/hedhog/frontend/app/users/permissions.tsx.ejs +79 -2
  199. package/hedhog/frontend/app/users/user-sheet.tsx.ejs +7 -2
  200. package/hedhog/frontend/messages/en.json +239 -3
  201. package/hedhog/frontend/messages/pt.json +239 -3
  202. package/hedhog/table/file.yaml +1 -1
  203. package/hedhog/table/integration_profile.yaml +34 -0
  204. package/hedhog/table/integration_provider.yaml +23 -0
  205. package/hedhog/table/integration_type.yaml +19 -0
  206. package/hedhog/table/mcp_api_key.yaml +4 -0
  207. package/hedhog/table/webhook_action.yaml +141 -85
  208. package/package.json +4 -3
  209. package/src/ai/ai.service.ts +35 -153
  210. package/src/auth/guards/auth.guard.ts +32 -0
  211. package/src/core.module.ts +3 -3
  212. package/src/file/file.controller.ts +51 -42
  213. package/src/file/file.service.ts +67 -104
  214. package/src/file/provider/azure.provider.ts +14 -28
  215. package/src/file/provider/gcs.provider.ts +9 -9
  216. package/src/file/provider/local.provider.ts +10 -13
  217. package/src/file/provider/provider.enum.ts +1 -0
  218. package/src/file/provider/provider.factory.ts +21 -6
  219. package/src/file/provider/s3.provider.ts +4 -20
  220. package/src/file/provider/spaces.provider.ts +246 -0
  221. package/src/index.ts +6 -3
  222. package/src/integration-profile/dto/create.dto.ts +44 -0
  223. package/src/integration-profile/dto/export.dto.ts +15 -0
  224. package/src/integration-profile/dto/import-confirm.dto.ts +61 -0
  225. package/src/integration-profile/integration-profile.controller.ts +131 -0
  226. package/src/integration-profile/integration-profile.module.ts +16 -0
  227. package/src/integration-profile/integration-profile.service.ts +793 -0
  228. package/src/integration-profile/integration-profile.utils.ts +173 -0
  229. package/src/mail/mail.module.ts +41 -22
  230. package/src/mail/mail.service.ts +40 -64
  231. package/src/mcp/guards/mcp-auth.guard.ts +1 -1
  232. package/src/mcp/mcp-api-key.controller.ts +2 -2
  233. package/src/mcp/mcp-api-key.service.ts +6 -2
  234. package/src/mcp/mcp.module.ts +3 -5
  235. package/src/mcp-chat/mcp-chat.service.ts +23 -20
  236. package/src/oauth/interfaces/OAuthProvider.ts +1 -1
  237. package/src/oauth/oauth.controller.ts +30 -2
  238. package/src/oauth/oauth.service.ts +194 -35
  239. package/src/oauth/providers/abstract.provider.ts +1 -1
  240. package/src/oauth/providers/facebook.provider.ts +36 -20
  241. package/src/oauth/providers/github.provider.ts +46 -23
  242. package/src/oauth/providers/google.provider.ts +36 -20
  243. package/src/oauth/providers/microsoft-entra-id.provider.ts +42 -46
  244. package/src/oauth/providers/microsoft.provider.ts +36 -21
  245. package/src/profile/profile.controller.ts +2 -2
  246. package/src/security/security.service.ts +34 -1
  247. package/src/setting/setting.service.ts +307 -9
  248. package/src/user/user.controller.ts +4 -1
  249. package/src/user/user.service.ts +20 -2
  250. package/src/webhook-integration/dto/webhook-action.dto.ts +85 -4
  251. package/src/webhook-integration/event-webhook.controller.ts +55 -50
  252. package/src/webhook-integration/event-webhook.service.ts +422 -384
  253. package/src/webhook-integration/webhook-command.registry.ts +42 -0
  254. package/src/webhook-integration/webhook-integration.controller.ts +25 -0
  255. package/src/webhook-integration/webhook-integration.module.ts +50 -45
  256. package/src/webhook-integration/webhook-integration.service.ts +444 -53
  257. package/dist/mail-profile/dto/create.dto.d.ts +0 -23
  258. package/dist/mail-profile/dto/create.dto.d.ts.map +0 -1
  259. package/dist/mail-profile/dto/create.dto.js +0 -139
  260. package/dist/mail-profile/dto/create.dto.js.map +0 -1
  261. package/dist/mail-profile/dto/update.dto.d.ts.map +0 -1
  262. package/dist/mail-profile/dto/update.dto.js.map +0 -1
  263. package/dist/mail-profile/mail-profile.controller.d.ts +0 -94
  264. package/dist/mail-profile/mail-profile.controller.d.ts.map +0 -1
  265. package/dist/mail-profile/mail-profile.controller.js +0 -95
  266. package/dist/mail-profile/mail-profile.controller.js.map +0 -1
  267. package/dist/mail-profile/mail-profile.module.d.ts +0 -3
  268. package/dist/mail-profile/mail-profile.module.d.ts.map +0 -1
  269. package/dist/mail-profile/mail-profile.module.js.map +0 -1
  270. package/dist/mail-profile/mail-profile.service.d.ts +0 -109
  271. package/dist/mail-profile/mail-profile.service.d.ts.map +0 -1
  272. package/dist/mail-profile/mail-profile.service.js +0 -278
  273. package/dist/mail-profile/mail-profile.service.js.map +0 -1
  274. package/dist/mcp/tools/core-mail-profile.mcp-tools.d.ts +0 -32
  275. package/dist/mcp/tools/core-mail-profile.mcp-tools.d.ts.map +0 -1
  276. package/dist/mcp/tools/core-mail-profile.mcp-tools.js +0 -178
  277. package/dist/mcp/tools/core-mail-profile.mcp-tools.js.map +0 -1
  278. package/hedhog/data/mail_profile.yaml +0 -18
  279. package/hedhog/table/mail_profile.yaml +0 -75
  280. package/src/mail-profile/dto/create.dto.ts +0 -145
  281. package/src/mail-profile/mail-profile.controller.ts +0 -56
  282. package/src/mail-profile/mail-profile.module.ts +0 -18
  283. package/src/mail-profile/mail-profile.service.ts +0 -308
  284. package/src/mcp/tools/core-mail-profile.mcp-tools.ts +0 -128
  285. /package/dist/{mail-profile → integration-profile}/dto/update.dto.d.ts +0 -0
  286. /package/dist/{mail-profile → integration-profile}/dto/update.dto.js +0 -0
  287. /package/src/{mail-profile → integration-profile}/dto/update.dto.ts +0 -0
@@ -8,7 +8,7 @@ import { Label } from '@/components/ui/label';
8
8
  import { Switch } from '@/components/ui/switch';
9
9
  import { Role } from '@hed-hog/api-types';
10
10
  import { useApp, useQuery } from '@hed-hog/next-app-provider';
11
- import { Eye, Loader2, Search, ShieldCheck } from 'lucide-react';
11
+ import { CheckCheck, Eye, Loader2, Search, ShieldCheck, X } from 'lucide-react';
12
12
  import { useTranslations } from 'next-intl';
13
13
  import { useState } from 'react';
14
14
  import { toast } from 'sonner';
@@ -32,6 +32,7 @@ export function PermissionsSection({
32
32
  const t = useTranslations('core.UserPage');
33
33
  const { request, currentLocaleCode } = useApp();
34
34
  const [togglingRoleId, setTogglingRoleId] = useState<number | null>(null);
35
+ const [isBulkLoading, setIsBulkLoading] = useState(false);
35
36
  const [search, setSearch] = useState('');
36
37
  const [accessSheetOpen, setAccessSheetOpen] = useState(false);
37
38
 
@@ -78,6 +79,46 @@ export function PermissionsSection({
78
79
  }
79
80
  };
80
81
 
82
+ const handleAssignAll = async () => {
83
+ const unassigned = userRoles.filter((r) => !r.isAssigned && r.id);
84
+ if (!unassigned.length) return;
85
+ setIsBulkLoading(true);
86
+ try {
87
+ await Promise.all(
88
+ unassigned.map((role) =>
89
+ request({ url: `/user/${userId}/role/${role.id}`, method: 'POST' })
90
+ )
91
+ );
92
+ toast.success(t('allRolesAssigned'));
93
+ await refetchUserRoles();
94
+ onRoleChange?.();
95
+ } catch {
96
+ toast.error(t('errorBulkAssigningRoles'));
97
+ } finally {
98
+ setIsBulkLoading(false);
99
+ }
100
+ };
101
+
102
+ const handleRemoveAll = async () => {
103
+ const assigned = userRoles.filter((r) => r.isAssigned && r.id);
104
+ if (!assigned.length) return;
105
+ setIsBulkLoading(true);
106
+ try {
107
+ await Promise.all(
108
+ assigned.map((role) =>
109
+ request({ url: `/user/${userId}/role/${role.id}`, method: 'DELETE' })
110
+ )
111
+ );
112
+ toast.success(t('allRolesRemoved'));
113
+ await refetchUserRoles();
114
+ onRoleChange?.();
115
+ } catch {
116
+ toast.error(t('errorBulkRemovingRoles'));
117
+ } finally {
118
+ setIsBulkLoading(false);
119
+ }
120
+ };
121
+
81
122
  const filteredRoles = userRoles.filter((role) => {
82
123
  if (!search.trim()) return true;
83
124
  const q = search.toLowerCase();
@@ -88,6 +129,10 @@ export function PermissionsSection({
88
129
  );
89
130
  });
90
131
 
132
+ const hasUnassigned = userRoles.some((r) => !r.isAssigned);
133
+ const hasAssigned = userRoles.some((r) => r.isAssigned);
134
+ const isDisabled = isBulkLoading || !!togglingRoleId;
135
+
91
136
  if (isLoadingUserRoles) {
92
137
  return (
93
138
  <div className="flex items-center justify-center py-8">
@@ -121,6 +166,38 @@ export function PermissionsSection({
121
166
  className="pl-8 h-8 text-sm"
122
167
  />
123
168
  </div>
169
+ {hasUnassigned && (
170
+ <Button
171
+ variant="outline"
172
+ size="sm"
173
+ className="shrink-0 gap-1.5"
174
+ onClick={handleAssignAll}
175
+ disabled={isDisabled}
176
+ >
177
+ {isBulkLoading ? (
178
+ <Loader2 className="h-4 w-4 animate-spin" />
179
+ ) : (
180
+ <CheckCheck className="h-4 w-4" />
181
+ )}
182
+ {t('addAllRoles')}
183
+ </Button>
184
+ )}
185
+ {hasAssigned && (
186
+ <Button
187
+ variant="outline"
188
+ size="sm"
189
+ className="shrink-0 gap-1.5"
190
+ onClick={handleRemoveAll}
191
+ disabled={isDisabled}
192
+ >
193
+ {isBulkLoading ? (
194
+ <Loader2 className="h-4 w-4 animate-spin" />
195
+ ) : (
196
+ <X className="h-4 w-4" />
197
+ )}
198
+ {t('removeAllRoles')}
199
+ </Button>
200
+ )}
124
201
  <Button
125
202
  variant="outline"
126
203
  size="sm"
@@ -183,7 +260,7 @@ export function PermissionsSection({
183
260
  <Switch
184
261
  id={`role-${role.id}`}
185
262
  checked={role.isAssigned}
186
- disabled={isToggling}
263
+ disabled={isToggling || isDisabled}
187
264
  onCheckedChange={() =>
188
265
  handleToggleRole(role.id!, role.isAssigned)
189
266
  }
@@ -71,7 +71,7 @@ import {
71
71
  Users,
72
72
  } from 'lucide-react';
73
73
  import { useTranslations } from 'next-intl';
74
- import { useEffect, useMemo, useState } from 'react';
74
+ import { useEffect, useMemo, useRef, useState } from 'react';
75
75
  import { useForm, useWatch } from 'react-hook-form';
76
76
  import { toast } from 'sonner';
77
77
  import { z } from 'zod';
@@ -370,6 +370,7 @@ function UserEditSheet({
370
370
  const minPasswordLength = Number(getSettingValue('password-min-length')) || 6;
371
371
 
372
372
  const [activeTab, setActiveTab] = useState('overview');
373
+ const prevUserIdRef = useRef<number | null>(null);
373
374
  const [photo, setPhoto] = useState<number | null | undefined>(null);
374
375
  const [isUploadingAvatar, setIsUploadingAvatar] = useState(false);
375
376
  const [editFormError, setEditFormError] = useState<string | null>(null);
@@ -473,7 +474,10 @@ function UserEditSheet({
473
474
  email: getUserEmail(editingUser),
474
475
  }
475
476
  );
476
- setActiveTab('overview');
477
+ if (prevUserIdRef.current !== Number(editingUser.id)) {
478
+ setActiveTab('overview');
479
+ prevUserIdRef.current = Number(editingUser.id);
480
+ }
477
481
  }, [editingUser]); // eslint-disable-line react-hooks/exhaustive-deps
478
482
 
479
483
  const handleClose = (open: boolean) => {
@@ -482,6 +486,7 @@ function UserEditSheet({
482
486
  setIsResetPasswordDialogOpen(false);
483
487
  setIsResetResultDialogOpen(false);
484
488
  setResetPasswordResult('');
489
+ prevUserIdRef.current = null;
485
490
  }
486
491
  onOpenChange(open);
487
492
  };
@@ -76,6 +76,7 @@
76
76
  "tabAccounts": "Accounts",
77
77
  "tabSessions": "Sessions",
78
78
  "tabMcpTokens": "MCP Tokens",
79
+ "tabTokens": "Tokens",
79
80
  "breadcrumbLabel": "Account",
80
81
  "home": "Home",
81
82
  "title": "Account",
@@ -139,12 +140,12 @@
139
140
  "home": "Home",
140
141
  "core": "Core"
141
142
  },
142
- "title": "Manage setting options",
143
- "description": "Manage options for list-type settings (combobox and checkbox), organized by group and subgroup.",
143
+ "title": "Setting Lists",
144
+ "description": "Manage items for list-type settings (combobox and checkbox).",
144
145
  "searchPlaceholder": "Search by name, slug, description or option...",
145
146
  "loading": "Loading settings...",
146
147
  "emptyTitle": "No list settings found",
147
- "emptyDescriptionNoSettings": "The selected group has no list settings (combobox/checkbox) with options.",
148
+ "emptyDescriptionNoSettings": "There are no list-type settings (combobox/checkbox) configured.",
148
149
  "emptyDescriptionFiltered": "No setting matched the current filter.",
149
150
  "itemCount": "{count, plural, one {# item} other {# items}}",
150
151
  "emptyOptions": "No options configured.",
@@ -153,7 +154,18 @@
153
154
  "optionsSavedError": "Could not update options.",
154
155
  "optionsClearedSuccess": "List cleared successfully.",
155
156
  "optionsClearedError": "Could not clear the list.",
157
+ "viewMode": {
158
+ "list": "List",
159
+ "cards": "Cards"
160
+ },
161
+ "columns": {
162
+ "group": "Group",
163
+ "name": "Name",
164
+ "type": "Type",
165
+ "items": "Items"
166
+ },
156
167
  "actions": {
168
+ "refresh": "Refresh",
157
169
  "editOptions": "Edit list",
158
170
  "clearOptions": "Clear list",
159
171
  "addOption": "Add option",
@@ -260,6 +272,39 @@
260
272
  "editNameLabel": "Name",
261
273
  "editNamePlaceholder": "Enter user name",
262
274
  "saveChanges": "Save Changes",
275
+ "selectProfile": "Select profile",
276
+ "selectAllVisible": "Select all visible profiles",
277
+ "export": "Export",
278
+ "exportAll": "Export All",
279
+ "exportSelected": "Export Selected",
280
+ "exportDialogTitle": "Export integration profiles",
281
+ "exportDialogDescriptionAll": "You are exporting all integration profiles.",
282
+ "exportDialogDescriptionSelected": "You are exporting only selected integration profiles.",
283
+ "exportIncludeSecrets": "Include secrets (tokens/keys/passwords)",
284
+ "exportSuccess": "Profiles exported successfully.",
285
+ "exportError": "Failed to export profiles.",
286
+ "noProfilesSelected": "Select at least one profile to export.",
287
+ "import": "Import",
288
+ "importDialogTitle": "Import integration profiles",
289
+ "importDialogDescription": "Validate the .hedhog file and confirm how to resolve slug conflicts.",
290
+ "importTotalProfiles": "Profiles in file",
291
+ "importValidProfiles": "Valid profiles",
292
+ "importInvalidProfiles": "Invalid profiles",
293
+ "importConflictProfiles": "Profiles with conflict",
294
+ "importInvalidItemsTitle": "Invalid items",
295
+ "importInvalidItemWithSlug": "Slug: {slug}",
296
+ "importInvalidItemWithoutSlug": "Item #{index}",
297
+ "importConflictTitle": "Slug conflicts",
298
+ "importConflictDescription": "Choose how to handle each existing slug.",
299
+ "conflictActionIgnore": "Ignore",
300
+ "conflictActionReplace": "Replace",
301
+ "conflictActionRenameAuto": "Auto-generate new slug",
302
+ "confirmImport": "Confirm Import",
303
+ "importing": "Importing...",
304
+ "importValidateError": "Failed to validate import file.",
305
+ "importResolveAllConflicts": "Set an action for all slug conflicts.",
306
+ "importSuccessCount": "Import completed. {count} profiles imported.",
307
+ "importError": "Failed to import profiles.",
263
308
  "cancel": "Cancel",
264
309
  "noRecentActivity": "No recent activity from this user.",
265
310
  "users": "Users",
@@ -285,6 +330,12 @@
285
330
  "errorLoadingRoles": "Error loading roles",
286
331
  "errorAssigningRole": "Error assigning role",
287
332
  "errorRemovingRole": "Error removing role",
333
+ "addAllRoles": "Add all roles",
334
+ "removeAllRoles": "Remove all roles",
335
+ "allRolesAssigned": "All roles assigned successfully",
336
+ "allRolesRemoved": "All roles removed successfully",
337
+ "errorBulkAssigningRoles": "Error assigning all roles",
338
+ "errorBulkRemovingRoles": "Error removing all roles",
288
339
  "passwordResetTitle": "Password Reset",
289
340
  "passwordResetDescription": "Generate a new password for this user.",
290
341
  "passwordResetNotice": "After this reset, the user must change the password on the next login.",
@@ -1179,11 +1230,20 @@
1179
1230
  "fileUrlPlaceholder": "File URL",
1180
1231
  "selectOption": "Select an option",
1181
1232
  "selectMailProfile": "Select a mail profile",
1233
+ "selectWhatsAppProfile": "Select a WhatsApp profile",
1234
+ "selectStorageProfile": "Select a storage profile",
1235
+ "storageProfileEmptyState": "No storage profiles found.",
1236
+ "selectAiProfile": "Select an AI profile",
1237
+ "aiProfileEmptyState": "No AI profiles found.",
1238
+ "selectOAuthProfile": "Select an OAuth profile",
1239
+ "oauthProfileEmptyState": "No OAuth profiles found.",
1182
1240
  "mailProfile": {
1183
1241
  "nameLabel": "Name *",
1184
1242
  "namePlaceholder": "My Mail Profile",
1185
1243
  "fromEmailLabel": "From Email *",
1186
1244
  "fromEmailPlaceholder": "no-reply@example.com",
1245
+ "fromNameLabel": "Sender name",
1246
+ "fromNamePlaceholder": "Sales Team",
1187
1247
  "providerLabel": "Provider *",
1188
1248
  "providers": {
1189
1249
  "ses": "Amazon SES"
@@ -1195,6 +1255,8 @@
1195
1255
  "smtpUsernameLabel": "SMTP Username *",
1196
1256
  "smtpUsernamePlaceholder": "user@example.com",
1197
1257
  "smtpPasswordLabel": "SMTP Password *",
1258
+ "replyToEmailLabel": "Reply-to email",
1259
+ "replyToEmailPlaceholder": "support@company.com",
1198
1260
  "clientIdLabel": "Client ID *",
1199
1261
  "clientSecretLabel": "Client Secret *",
1200
1262
  "refreshTokenLabel": "Refresh Token *",
@@ -1202,6 +1264,17 @@
1202
1264
  "secretAccessKeyLabel": "Secret Access Key *",
1203
1265
  "regionLabel": "Region *",
1204
1266
  "regionPlaceholder": "us-east-1"
1267
+ },
1268
+ "whatsappProfile": {
1269
+ "nameLabel": "Name *",
1270
+ "namePlaceholder": "My WhatsApp Profile",
1271
+ "providerLabel": "Provider *",
1272
+ "hostLabel": "API Host *",
1273
+ "hostPlaceholder": "https://api.example.com",
1274
+ "instanceNameLabel": "Instance Name *",
1275
+ "instanceNamePlaceholder": "MyInstance",
1276
+ "tokenLabel": "Token *",
1277
+ "tokenPlaceholder": "Authentication token"
1205
1278
  }
1206
1279
  },
1207
1280
  "AddWidgetDialog": {
@@ -1924,6 +1997,7 @@
1924
1997
  "deleteError": "Could not delete the item.",
1925
1998
  "tokenGenerated": "Token generated successfully",
1926
1999
  "uuidRegenerated": "UUID regenerated successfully",
2000
+ "duplicated": "Duplicated successfully",
1927
2001
  "editEvent": "Edit event",
1928
2002
  "editIncoming": "Edit incoming webhook",
1929
2003
  "editEventWebhook": "Edit event webhook",
@@ -1998,6 +2072,49 @@
1998
2072
  "revokeSuccess": "API key revoked",
1999
2073
  "revokeFailure": "Failed to revoke API key"
2000
2074
  },
2075
+ "Tokens": {
2076
+ "title": "Access Tokens",
2077
+ "description": "Create and manage tokens for MCP server and REST API access",
2078
+ "createToken": "Create Token",
2079
+ "createTokenTitle": "Create Token",
2080
+ "createTokenDescription": "Choose the token type and give it a name to identify it later",
2081
+ "tokenTypeLabel": "Token Type",
2082
+ "typeMcp": "MCP",
2083
+ "typeApi": "API",
2084
+ "tokenNameLabel": "Token Name",
2085
+ "tokenNamePlaceholder": "e.g. My Application",
2086
+ "tokenCreatedTitle": "Token Created",
2087
+ "tokenCreatedWarning": "This token is shown only once. Copy it now and store it safely.",
2088
+ "tokenCreatedLabel": "Your new token",
2089
+ "closeDialog": "Close",
2090
+ "mcpUrlLabel": "MCP Server URL",
2091
+ "name": "Name",
2092
+ "type": "Type",
2093
+ "tokenPrefix": "Token Prefix",
2094
+ "lastUsed": "Last Used",
2095
+ "createdAt": "Created At",
2096
+ "never": "Never",
2097
+ "today": "Today",
2098
+ "daysAgo": "{days} days ago",
2099
+ "noTokens": "No tokens yet. Create one to get started.",
2100
+ "revokeTokenTitle": "Revoke Token",
2101
+ "revokeTokenDescription": "This token will stop working immediately. This action cannot be undone.",
2102
+ "cancel": "Cancel",
2103
+ "revokeConfirm": "Revoke",
2104
+ "closeSheet": "Done",
2105
+ "createFailure": "Failed to create token",
2106
+ "revokeSuccess": "Token revoked",
2107
+ "revokeFailure": "Failed to revoke token",
2108
+ "usageTitle": "Usage Instructions",
2109
+ "serverUrlLabel": "Server URL",
2110
+ "yourToken": "your-token",
2111
+ "mcpUsageDesc": "Configure your MCP client with the server URL below and pass the token as an Authorization header.",
2112
+ "mcpUsageHeader": "Add this header to your MCP client configuration:",
2113
+ "mcpUsageExampleLabel": "Example (Claude Desktop / Cursor):",
2114
+ "apiUsageDesc": "Use this token to authenticate REST API requests by passing it as a Bearer token in the Authorization header.",
2115
+ "apiUsageHeader": "Add this header to every request:",
2116
+ "apiUsageExampleLabel": "Example (curl):"
2117
+ },
2001
2118
  "McpFloatingChat": {
2002
2119
  "title": "MCP Chat",
2003
2120
  "openFullPage": "Open full view",
@@ -2110,5 +2227,124 @@
2110
2227
  "actions": "Actions",
2111
2228
  "noUserAgent": "—",
2112
2229
  "detailsDescription": "Full details of this access log entry"
2230
+ },
2231
+ "IntegrationProfilePage": {
2232
+ "breadcrumbHome": "Home",
2233
+ "breadcrumbTitle": "Integration Profiles",
2234
+ "title": "Integration Profiles",
2235
+ "description": "Manage credentials and connection settings for email, messaging, storage, AI, and OAuth providers.",
2236
+ "searchPlaceholder": "Search profiles by name or slug...",
2237
+ "selectProfile": "Select profile",
2238
+ "selectAllVisible": "Select all visible profiles",
2239
+ "newProfile": "New Profile",
2240
+ "export": "Export",
2241
+ "exportAll": "Export All",
2242
+ "exportSelected": "Export Selected",
2243
+ "exportDialogTitle": "Export integration profiles",
2244
+ "exportDialogDescriptionAll": "You are exporting all integration profiles.",
2245
+ "exportDialogDescriptionSelected": "You are exporting only the selected profiles.",
2246
+ "exportIncludeSecrets": "Include secrets (tokens/keys/passwords)",
2247
+ "exportSuccess": "Profiles exported successfully.",
2248
+ "exportError": "Failed to export profiles.",
2249
+ "noProfilesSelected": "Select at least one profile to export.",
2250
+ "import": "Import",
2251
+ "importDialogTitle": "Import integration profiles",
2252
+ "importDialogDescription": "Validate the .hedhog file and confirm how slug conflicts should be resolved.",
2253
+ "importTotalProfiles": "Profiles in file",
2254
+ "importValidProfiles": "Valid profiles",
2255
+ "importInvalidProfiles": "Invalid profiles",
2256
+ "importConflictProfiles": "Profiles with conflicts",
2257
+ "importInvalidItemsTitle": "Invalid items",
2258
+ "importInvalidItemWithSlug": "Slug: {slug}",
2259
+ "importInvalidItemWithoutSlug": "Item #{index}",
2260
+ "importConflictTitle": "Slug conflicts",
2261
+ "importConflictDescription": "Choose how to handle each existing slug.",
2262
+ "conflictActionIgnore": "Ignore",
2263
+ "conflictActionReplace": "Replace",
2264
+ "conflictActionRenameAuto": "New automatic slug",
2265
+ "confirmImport": "Confirm Import",
2266
+ "importing": "Importing...",
2267
+ "importValidateError": "Failed to validate import file.",
2268
+ "importResolveAllConflicts": "Set an action for all slug conflicts.",
2269
+ "importSuccessCount": "Import completed. {count} profiles imported.",
2270
+ "importError": "Failed to import profiles.",
2271
+ "newProfileTitle": "New Integration Profile",
2272
+ "newProfileDescription": "Choose a provider and fill in the credentials.",
2273
+ "editProfile": "Edit Profile",
2274
+ "editProfileDescription": "Update this integration profile and its credentials.",
2275
+ "nameLabel": "Name",
2276
+ "namePlaceholder": "My SMTP Profile",
2277
+ "slugLabel": "Slug",
2278
+ "slugPlaceholder": "my-smtp-profile",
2279
+ "typeLabel": "Type",
2280
+ "typePlaceholder": "Select a type...",
2281
+ "providerLabel": "Provider",
2282
+ "providerPlaceholder": "Select a provider...",
2283
+ "providerSelectTypFirst": "Select a type first",
2284
+ "isActiveLabel": "Active",
2285
+ "configSectionTitle": "Credentials",
2286
+ "tableName": "Name",
2287
+ "tableSlug": "Slug",
2288
+ "tableProvider": "Provider",
2289
+ "tableStatus": "Status",
2290
+ "tableUses": "Uses",
2291
+ "tableUpdated": "Updated",
2292
+ "tableActions": "Actions",
2293
+ "statusActive": "Active",
2294
+ "statusInactive": "Inactive",
2295
+ "noProfilesFound": "No profiles found",
2296
+ "noProfilesHint": "Create a new profile to store connection credentials.",
2297
+ "createProfile": "Create Profile",
2298
+ "saveChanges": "Save Changes",
2299
+ "cancel": "Cancel",
2300
+ "delete": "Delete",
2301
+ "deleteConfirmTitle": "Confirm Deletion",
2302
+ "deleteConfirmDescription": "Are you sure you want to delete this profile? This action cannot be undone.",
2303
+ "createSuccess": "Integration profile created successfully.",
2304
+ "createError": "Failed to create the integration profile.",
2305
+ "updateSuccess": "Integration profile updated successfully.",
2306
+ "updateError": "Failed to update the integration profile.",
2307
+ "deleteSuccess": "Integration profile deleted successfully.",
2308
+ "deleteError": "Failed to delete the integration profile.",
2309
+ "loadError": "Failed to load integration profile data.",
2310
+ "fieldHost": "Host",
2311
+ "fieldPort": "Port",
2312
+ "fieldUsername": "Username",
2313
+ "fieldPassword": "Password",
2314
+ "fieldSecure": "TLS / SSL",
2315
+ "fieldFromEmail": "From Email",
2316
+ "fieldFromName": "From Name",
2317
+ "fieldReplyTo": "Reply-To Email",
2318
+ "fieldClientId": "Client ID",
2319
+ "fieldClientSecret": "Client Secret",
2320
+ "fieldRefreshToken": "Refresh Token",
2321
+ "fieldAccessKeyId": "Access Key ID",
2322
+ "fieldSecretAccessKey": "Secret Access Key",
2323
+ "fieldRegion": "Region",
2324
+ "fieldToken": "Token",
2325
+ "fieldInstanceName": "Instance Name",
2326
+ "fieldPhoneNumberId": "Phone Number ID",
2327
+ "fieldAccessToken": "Access Token",
2328
+ "fieldBusinessId": "Business ID",
2329
+ "fieldBasePath": "Base Path",
2330
+ "fieldBucket": "Bucket",
2331
+ "fieldProjectId": "Project ID",
2332
+ "fieldKeyFileJson": "Service Account JSON",
2333
+ "fieldConnectionString": "Connection String",
2334
+ "fieldAccount": "Storage Account",
2335
+ "fieldAccountKey": "Account Key",
2336
+ "fieldContainer": "Container",
2337
+ "fieldEndpoint": "Endpoint URL",
2338
+ "fieldApiKey": "API Key",
2339
+ "fieldOrganization": "Organization ID",
2340
+ "fieldRedirectUri": "Redirect URI",
2341
+ "fieldTenantId": "Tenant ID",
2342
+ "callbackUrlsSectionTitle": "Callback URLs",
2343
+ "callbackUrlsDescription": "Register these URLs in your OAuth application settings.",
2344
+ "addCallbackUrl": "Add URL",
2345
+ "noCallbackUrls": "No callback URLs configured.",
2346
+ "callbackUrlPlaceholder": "https://yourdomain.com/callback/...",
2347
+ "showPassword": "Show value",
2348
+ "hidePassword": "Hide value"
2113
2349
  }
2114
2350
  }