@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.
- package/dist/ai/ai.service.d.ts +3 -12
- package/dist/ai/ai.service.d.ts.map +1 -1
- package/dist/ai/ai.service.js +34 -125
- package/dist/ai/ai.service.js.map +1 -1
- package/dist/auth/guards/auth.guard.d.ts +6 -1
- package/dist/auth/guards/auth.guard.d.ts.map +1 -1
- package/dist/auth/guards/auth.guard.js +33 -2
- package/dist/auth/guards/auth.guard.js.map +1 -1
- package/dist/core.module.d.ts.map +1 -1
- package/dist/core.module.js +3 -3
- package/dist/core.module.js.map +1 -1
- package/dist/file/file.controller.d.ts +4 -2
- package/dist/file/file.controller.d.ts.map +1 -1
- package/dist/file/file.controller.js +44 -38
- package/dist/file/file.controller.js.map +1 -1
- package/dist/file/file.service.d.ts +2 -2
- package/dist/file/file.service.d.ts.map +1 -1
- package/dist/file/file.service.js +58 -89
- package/dist/file/file.service.js.map +1 -1
- package/dist/file/provider/azure.provider.d.ts.map +1 -1
- package/dist/file/provider/azure.provider.js +10 -15
- package/dist/file/provider/azure.provider.js.map +1 -1
- package/dist/file/provider/gcs.provider.d.ts.map +1 -1
- package/dist/file/provider/gcs.provider.js +8 -9
- package/dist/file/provider/gcs.provider.js.map +1 -1
- package/dist/file/provider/local.provider.d.ts.map +1 -1
- package/dist/file/provider/local.provider.js +11 -10
- package/dist/file/provider/local.provider.js.map +1 -1
- package/dist/file/provider/provider.enum.d.ts +2 -1
- package/dist/file/provider/provider.enum.d.ts.map +1 -1
- package/dist/file/provider/provider.enum.js +1 -0
- package/dist/file/provider/provider.enum.js.map +1 -1
- package/dist/file/provider/provider.factory.d.ts +1 -1
- package/dist/file/provider/provider.factory.d.ts.map +1 -1
- package/dist/file/provider/provider.factory.js +18 -5
- package/dist/file/provider/provider.factory.js.map +1 -1
- package/dist/file/provider/s3.provider.d.ts.map +1 -1
- package/dist/file/provider/s3.provider.js +4 -20
- package/dist/file/provider/s3.provider.js.map +1 -1
- package/dist/file/provider/spaces.provider.d.ts +27 -0
- package/dist/file/provider/spaces.provider.d.ts.map +1 -0
- package/dist/file/provider/spaces.provider.js +203 -0
- package/dist/file/provider/spaces.provider.js.map +1 -0
- package/dist/index.d.ts +4 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -3
- package/dist/index.js.map +1 -1
- package/dist/integration-profile/dto/create.dto.d.ts +9 -0
- package/dist/integration-profile/dto/create.dto.d.ts.map +1 -0
- package/dist/integration-profile/dto/create.dto.js +54 -0
- package/dist/integration-profile/dto/create.dto.js.map +1 -0
- package/dist/integration-profile/dto/export.dto.d.ts +5 -0
- package/dist/integration-profile/dto/export.dto.d.ts.map +1 -0
- package/dist/integration-profile/dto/export.dto.js +29 -0
- package/dist/integration-profile/dto/export.dto.js.map +1 -0
- package/dist/integration-profile/dto/import-confirm.dto.d.ts +17 -0
- package/dist/integration-profile/dto/import-confirm.dto.d.ts.map +1 -0
- package/dist/integration-profile/dto/import-confirm.dto.js +77 -0
- package/dist/integration-profile/dto/import-confirm.dto.js.map +1 -0
- package/dist/integration-profile/dto/update.dto.d.ts.map +1 -0
- package/dist/integration-profile/dto/update.dto.js.map +1 -0
- package/dist/integration-profile/integration-profile.controller.d.ts +142 -0
- package/dist/integration-profile/integration-profile.controller.d.ts.map +1 -0
- package/dist/integration-profile/integration-profile.controller.js +166 -0
- package/dist/integration-profile/integration-profile.controller.js.map +1 -0
- package/dist/integration-profile/integration-profile.module.d.ts +3 -0
- package/dist/integration-profile/integration-profile.module.d.ts.map +1 -0
- package/dist/{mail-profile/mail-profile.module.js → integration-profile/integration-profile.module.js} +11 -13
- package/dist/integration-profile/integration-profile.module.js.map +1 -0
- package/dist/integration-profile/integration-profile.service.d.ts +160 -0
- package/dist/integration-profile/integration-profile.service.d.ts.map +1 -0
- package/dist/integration-profile/integration-profile.service.js +609 -0
- package/dist/integration-profile/integration-profile.service.js.map +1 -0
- package/dist/integration-profile/integration-profile.utils.d.ts +30 -0
- package/dist/integration-profile/integration-profile.utils.d.ts.map +1 -0
- package/dist/integration-profile/integration-profile.utils.js +156 -0
- package/dist/integration-profile/integration-profile.utils.js.map +1 -0
- package/dist/mail/mail.module.d.ts.map +1 -1
- package/dist/mail/mail.module.js +36 -23
- package/dist/mail/mail.module.js.map +1 -1
- package/dist/mail/mail.service.d.ts +4 -2
- package/dist/mail/mail.service.d.ts.map +1 -1
- package/dist/mail/mail.service.js +33 -51
- package/dist/mail/mail.service.js.map +1 -1
- package/dist/mcp/guards/mcp-auth.guard.js +1 -1
- package/dist/mcp/guards/mcp-auth.guard.js.map +1 -1
- package/dist/mcp/mcp-api-key.controller.d.ts +2 -0
- package/dist/mcp/mcp-api-key.controller.d.ts.map +1 -1
- package/dist/mcp/mcp-api-key.controller.js +1 -1
- package/dist/mcp/mcp-api-key.controller.js.map +1 -1
- package/dist/mcp/mcp-api-key.service.d.ts +2 -1
- package/dist/mcp/mcp-api-key.service.d.ts.map +1 -1
- package/dist/mcp/mcp-api-key.service.js +6 -2
- package/dist/mcp/mcp-api-key.service.js.map +1 -1
- package/dist/mcp/mcp.module.d.ts.map +1 -1
- package/dist/mcp/mcp.module.js +3 -5
- package/dist/mcp/mcp.module.js.map +1 -1
- package/dist/mcp-chat/mcp-chat.service.d.ts.map +1 -1
- package/dist/mcp-chat/mcp-chat.service.js +17 -16
- package/dist/mcp-chat/mcp-chat.service.js.map +1 -1
- package/dist/oauth/interfaces/OAuthProvider.d.ts +1 -1
- package/dist/oauth/interfaces/OAuthProvider.d.ts.map +1 -1
- package/dist/oauth/oauth.controller.d.ts +4 -1
- package/dist/oauth/oauth.controller.d.ts.map +1 -1
- package/dist/oauth/oauth.controller.js +31 -5
- package/dist/oauth/oauth.controller.js.map +1 -1
- package/dist/oauth/oauth.service.d.ts +12 -1
- package/dist/oauth/oauth.service.d.ts.map +1 -1
- package/dist/oauth/oauth.service.js +125 -23
- package/dist/oauth/oauth.service.js.map +1 -1
- package/dist/oauth/providers/abstract.provider.d.ts +1 -1
- package/dist/oauth/providers/abstract.provider.d.ts.map +1 -1
- package/dist/oauth/providers/facebook.provider.d.ts +5 -2
- package/dist/oauth/providers/facebook.provider.d.ts.map +1 -1
- package/dist/oauth/providers/facebook.provider.js +34 -19
- package/dist/oauth/providers/facebook.provider.js.map +1 -1
- package/dist/oauth/providers/github.provider.d.ts +6 -2
- package/dist/oauth/providers/github.provider.d.ts.map +1 -1
- package/dist/oauth/providers/github.provider.js +43 -20
- package/dist/oauth/providers/github.provider.js.map +1 -1
- package/dist/oauth/providers/google.provider.d.ts +5 -2
- package/dist/oauth/providers/google.provider.d.ts.map +1 -1
- package/dist/oauth/providers/google.provider.js +34 -19
- package/dist/oauth/providers/google.provider.js.map +1 -1
- package/dist/oauth/providers/microsoft-entra-id.provider.d.ts +5 -2
- package/dist/oauth/providers/microsoft-entra-id.provider.d.ts.map +1 -1
- package/dist/oauth/providers/microsoft-entra-id.provider.js +43 -40
- package/dist/oauth/providers/microsoft-entra-id.provider.js.map +1 -1
- package/dist/oauth/providers/microsoft.provider.d.ts +5 -2
- package/dist/oauth/providers/microsoft.provider.d.ts.map +1 -1
- package/dist/oauth/providers/microsoft.provider.js +34 -19
- package/dist/oauth/providers/microsoft.provider.js.map +1 -1
- package/dist/profile/profile.controller.js +1 -1
- package/dist/profile/profile.controller.js.map +1 -1
- package/dist/security/security.service.d.ts +2 -0
- package/dist/security/security.service.d.ts.map +1 -1
- package/dist/security/security.service.js +21 -0
- package/dist/security/security.service.js.map +1 -1
- package/dist/setting/setting.service.d.ts +26 -1
- package/dist/setting/setting.service.d.ts.map +1 -1
- package/dist/setting/setting.service.js +240 -7
- package/dist/setting/setting.service.js.map +1 -1
- package/dist/user/user.controller.d.ts +2 -1
- package/dist/user/user.controller.d.ts.map +1 -1
- package/dist/user/user.controller.js +5 -4
- package/dist/user/user.controller.js.map +1 -1
- package/dist/user/user.service.d.ts +4 -2
- package/dist/user/user.service.d.ts.map +1 -1
- package/dist/user/user.service.js +19 -4
- package/dist/user/user.service.js.map +1 -1
- package/dist/webhook-integration/dto/webhook-action.dto.d.ts +17 -2
- package/dist/webhook-integration/dto/webhook-action.dto.d.ts.map +1 -1
- package/dist/webhook-integration/dto/webhook-action.dto.js +93 -2
- package/dist/webhook-integration/dto/webhook-action.dto.js.map +1 -1
- package/dist/webhook-integration/event-webhook.controller.d.ts +1 -0
- package/dist/webhook-integration/event-webhook.controller.d.ts.map +1 -1
- package/dist/webhook-integration/event-webhook.controller.js +10 -0
- package/dist/webhook-integration/event-webhook.controller.js.map +1 -1
- package/dist/webhook-integration/event-webhook.service.d.ts +2 -0
- package/dist/webhook-integration/event-webhook.service.d.ts.map +1 -1
- package/dist/webhook-integration/event-webhook.service.js +30 -0
- package/dist/webhook-integration/event-webhook.service.js.map +1 -1
- package/dist/webhook-integration/webhook-command.registry.d.ts +15 -0
- package/dist/webhook-integration/webhook-command.registry.d.ts.map +1 -0
- package/dist/webhook-integration/webhook-command.registry.js +36 -0
- package/dist/webhook-integration/webhook-command.registry.js.map +1 -0
- package/dist/webhook-integration/webhook-integration.controller.d.ts +20 -0
- package/dist/webhook-integration/webhook-integration.controller.d.ts.map +1 -1
- package/dist/webhook-integration/webhook-integration.controller.js +48 -0
- package/dist/webhook-integration/webhook-integration.controller.js.map +1 -1
- package/dist/webhook-integration/webhook-integration.module.d.ts.map +1 -1
- package/dist/webhook-integration/webhook-integration.module.js +5 -0
- package/dist/webhook-integration/webhook-integration.module.js.map +1 -1
- package/dist/webhook-integration/webhook-integration.service.d.ts +27 -2
- package/dist/webhook-integration/webhook-integration.service.d.ts.map +1 -1
- package/dist/webhook-integration/webhook-integration.service.js +377 -50
- package/dist/webhook-integration/webhook-integration.service.js.map +1 -1
- package/hedhog/data/file_provider.yaml +9 -1
- package/hedhog/data/integration_provider.yaml +148 -0
- package/hedhog/data/integration_type.yaml +29 -0
- package/hedhog/data/menu.yaml +6 -21
- package/hedhog/data/role.yaml +8 -0
- package/hedhog/data/route.yaml +73 -373
- package/hedhog/data/setting_group.yaml +209 -365
- package/hedhog/data/setting_subgroup.yaml +21 -13
- package/hedhog/frontend/app/account/components/connected-accounts.tsx.ejs +25 -20
- package/hedhog/frontend/app/account/components/tokens.tsx.ejs +421 -0
- package/hedhog/frontend/app/account/layout.tsx.ejs +6 -3
- package/hedhog/frontend/app/account/mcp-tokens/page.tsx.ejs +2 -2
- package/hedhog/frontend/app/account/tokens/page.tsx.ejs +5 -0
- package/hedhog/frontend/app/configurations/[slug]/components/setting-field.tsx.ejs +938 -225
- package/hedhog/frontend/app/configurations/layout.tsx.ejs +1 -1
- package/hedhog/frontend/app/dashboard/dashboard-home-tabs.tsx.ejs +3 -1
- package/hedhog/frontend/app/integration/profiles/page.tsx.ejs +1830 -0
- package/hedhog/frontend/app/integrations-webhooks/page.tsx.ejs +829 -128
- package/hedhog/frontend/app/mail/profiles/page.tsx.ejs +1 -820
- package/hedhog/frontend/app/setting-list/page.tsx.ejs +229 -395
- package/hedhog/frontend/app/users/permissions.tsx.ejs +79 -2
- package/hedhog/frontend/app/users/user-sheet.tsx.ejs +7 -2
- package/hedhog/frontend/messages/en.json +239 -3
- package/hedhog/frontend/messages/pt.json +239 -3
- package/hedhog/table/file.yaml +1 -1
- package/hedhog/table/integration_profile.yaml +34 -0
- package/hedhog/table/integration_provider.yaml +23 -0
- package/hedhog/table/integration_type.yaml +19 -0
- package/hedhog/table/mcp_api_key.yaml +4 -0
- package/hedhog/table/webhook_action.yaml +141 -85
- package/package.json +4 -3
- package/src/ai/ai.service.ts +35 -153
- package/src/auth/guards/auth.guard.ts +32 -0
- package/src/core.module.ts +3 -3
- package/src/file/file.controller.ts +51 -42
- package/src/file/file.service.ts +67 -104
- package/src/file/provider/azure.provider.ts +14 -28
- package/src/file/provider/gcs.provider.ts +9 -9
- package/src/file/provider/local.provider.ts +10 -13
- package/src/file/provider/provider.enum.ts +1 -0
- package/src/file/provider/provider.factory.ts +21 -6
- package/src/file/provider/s3.provider.ts +4 -20
- package/src/file/provider/spaces.provider.ts +246 -0
- package/src/index.ts +6 -3
- package/src/integration-profile/dto/create.dto.ts +44 -0
- package/src/integration-profile/dto/export.dto.ts +15 -0
- package/src/integration-profile/dto/import-confirm.dto.ts +61 -0
- package/src/integration-profile/integration-profile.controller.ts +131 -0
- package/src/integration-profile/integration-profile.module.ts +16 -0
- package/src/integration-profile/integration-profile.service.ts +793 -0
- package/src/integration-profile/integration-profile.utils.ts +173 -0
- package/src/mail/mail.module.ts +41 -22
- package/src/mail/mail.service.ts +40 -64
- package/src/mcp/guards/mcp-auth.guard.ts +1 -1
- package/src/mcp/mcp-api-key.controller.ts +2 -2
- package/src/mcp/mcp-api-key.service.ts +6 -2
- package/src/mcp/mcp.module.ts +3 -5
- package/src/mcp-chat/mcp-chat.service.ts +23 -20
- package/src/oauth/interfaces/OAuthProvider.ts +1 -1
- package/src/oauth/oauth.controller.ts +30 -2
- package/src/oauth/oauth.service.ts +194 -35
- package/src/oauth/providers/abstract.provider.ts +1 -1
- package/src/oauth/providers/facebook.provider.ts +36 -20
- package/src/oauth/providers/github.provider.ts +46 -23
- package/src/oauth/providers/google.provider.ts +36 -20
- package/src/oauth/providers/microsoft-entra-id.provider.ts +42 -46
- package/src/oauth/providers/microsoft.provider.ts +36 -21
- package/src/profile/profile.controller.ts +2 -2
- package/src/security/security.service.ts +34 -1
- package/src/setting/setting.service.ts +307 -9
- package/src/user/user.controller.ts +4 -1
- package/src/user/user.service.ts +20 -2
- package/src/webhook-integration/dto/webhook-action.dto.ts +85 -4
- package/src/webhook-integration/event-webhook.controller.ts +55 -50
- package/src/webhook-integration/event-webhook.service.ts +422 -384
- package/src/webhook-integration/webhook-command.registry.ts +42 -0
- package/src/webhook-integration/webhook-integration.controller.ts +25 -0
- package/src/webhook-integration/webhook-integration.module.ts +50 -45
- package/src/webhook-integration/webhook-integration.service.ts +444 -53
- package/dist/mail-profile/dto/create.dto.d.ts +0 -23
- package/dist/mail-profile/dto/create.dto.d.ts.map +0 -1
- package/dist/mail-profile/dto/create.dto.js +0 -139
- package/dist/mail-profile/dto/create.dto.js.map +0 -1
- package/dist/mail-profile/dto/update.dto.d.ts.map +0 -1
- package/dist/mail-profile/dto/update.dto.js.map +0 -1
- package/dist/mail-profile/mail-profile.controller.d.ts +0 -94
- package/dist/mail-profile/mail-profile.controller.d.ts.map +0 -1
- package/dist/mail-profile/mail-profile.controller.js +0 -95
- package/dist/mail-profile/mail-profile.controller.js.map +0 -1
- package/dist/mail-profile/mail-profile.module.d.ts +0 -3
- package/dist/mail-profile/mail-profile.module.d.ts.map +0 -1
- package/dist/mail-profile/mail-profile.module.js.map +0 -1
- package/dist/mail-profile/mail-profile.service.d.ts +0 -109
- package/dist/mail-profile/mail-profile.service.d.ts.map +0 -1
- package/dist/mail-profile/mail-profile.service.js +0 -278
- package/dist/mail-profile/mail-profile.service.js.map +0 -1
- package/dist/mcp/tools/core-mail-profile.mcp-tools.d.ts +0 -32
- package/dist/mcp/tools/core-mail-profile.mcp-tools.d.ts.map +0 -1
- package/dist/mcp/tools/core-mail-profile.mcp-tools.js +0 -178
- package/dist/mcp/tools/core-mail-profile.mcp-tools.js.map +0 -1
- package/hedhog/data/mail_profile.yaml +0 -18
- package/hedhog/table/mail_profile.yaml +0 -75
- package/src/mail-profile/dto/create.dto.ts +0 -145
- package/src/mail-profile/mail-profile.controller.ts +0 -56
- package/src/mail-profile/mail-profile.module.ts +0 -18
- package/src/mail-profile/mail-profile.service.ts +0 -308
- package/src/mcp/tools/core-mail-profile.mcp-tools.ts +0 -128
- /package/dist/{mail-profile → integration-profile}/dto/update.dto.d.ts +0 -0
- /package/dist/{mail-profile → integration-profile}/dto/update.dto.js +0 -0
- /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
|
-
|
|
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": "
|
|
143
|
-
"description": "Manage
|
|
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": "
|
|
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
|
}
|