Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions messages/en/dashboard.json
Original file line number Diff line number Diff line change
Expand Up @@ -1364,6 +1364,10 @@
"threeMonths": "In 3 months",
"oneYear": "In 1 year"
},
"providerGroupSelect": {
"providersSuffix": "providers",
"loadFailed": "Failed to load provider groups"
},
"providerGroup": {
"label": "Provider group",
"placeholder": "Select provider group",
Expand Down
4 changes: 4 additions & 0 deletions messages/ja/dashboard.json
Original file line number Diff line number Diff line change
Expand Up @@ -1326,6 +1326,10 @@
"threeMonths": "3か月後",
"oneYear": "1年後"
},
"providerGroupSelect": {
"providersSuffix": "件のプロバイダー",
"loadFailed": "プロバイダーグループの読み込みに失敗しました"
},
"providerGroup": {
"label": "プロバイダーグループ",
"placeholder": "プロバイダーグループを選択",
Expand Down
4 changes: 4 additions & 0 deletions messages/ru/dashboard.json
Original file line number Diff line number Diff line change
Expand Up @@ -1337,6 +1337,10 @@
"threeMonths": "Через 3 месяца",
"oneYear": "Через год"
},
"providerGroupSelect": {
"providersSuffix": "провайдеров",
"loadFailed": "Не удалось загрузить группы провайдеров"
},
"providerGroup": {
"label": "Группа провайдеров",
"placeholder": "Выберите группу провайдеров",
Expand Down
4 changes: 4 additions & 0 deletions messages/zh-CN/dashboard.json
Original file line number Diff line number Diff line change
Expand Up @@ -1365,6 +1365,10 @@
"threeMonths": "三月后",
"oneYear": "一年后"
},
"providerGroupSelect": {
"providersSuffix": "个供应商",
"loadFailed": "加载供应商分组失败"
},
"providerGroup": {
"label": "供应商分组",
"placeholder": "选择供应商分组",
Expand Down
4 changes: 4 additions & 0 deletions messages/zh-TW/dashboard.json
Original file line number Diff line number Diff line change
Expand Up @@ -1335,6 +1335,10 @@
"threeMonths": "三個月後",
"oneYear": "一年後"
},
"providerGroupSelect": {
"providersSuffix": "個供應商",
"loadFailed": "載入供應商分組失敗"
},
"providerGroup": {
"label": "供應商分組",
"placeholder": "選擇供應商分組",
Expand Down
11 changes: 6 additions & 5 deletions src/app/[locale]/dashboard/_components/user/edit-user-dialog.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -72,10 +72,8 @@ function EditUserDialogInner({ onOpenChange, user, onSuccess }: EditUserDialogPr
const tCommon = useTranslations("common");
const [isPending, startTransition] = useTransition();

// Use shared hooks
const modelSuggestions = useModelSuggestions(user.providerGroup);
const showUserProviderGroup = Boolean(user.providerGroup?.trim());
const userEditTranslations = useUserTranslations({ showProviderGroup: showUserProviderGroup });
// Always show providerGroup field in edit mode
const userEditTranslations = useUserTranslations({ showProviderGroup: true });

const defaultValues = useMemo(() => buildDefaultValues(user), [user]);

Expand Down Expand Up @@ -125,6 +123,9 @@ function EditUserDialogInner({ onOpenChange, user, onSuccess }: EditUserDialogPr

const currentUserDraft = form.values || defaultValues;

// Model suggestions based on current providerGroup value
const modelSuggestions = useModelSuggestions(currentUserDraft.providerGroup);

const handleUserChange = (field: string | Record<string, any>, value?: any) => {
const prev = form.values || defaultValues;
const next = { ...prev } as EditUserValues;
Expand Down Expand Up @@ -224,7 +225,7 @@ function EditUserDialogInner({ onOpenChange, user, onSuccess }: EditUserDialogPr
await handleEnableUser();
}
}}
showProviderGroup={showUserProviderGroup}
showProviderGroup
onChange={handleUserChange}
translations={userEditTranslations}
modelSuggestions={modelSuggestions}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,6 @@ import {
AlertDialogHeader,
AlertDialogTitle,
} from "@/components/ui/alert-dialog";
import { Badge } from "@/components/ui/badge";
import { Button } from "@/components/ui/button";
import { Label } from "@/components/ui/label";
import { Switch } from "@/components/ui/switch";
Expand All @@ -23,6 +22,7 @@ import { cn } from "@/lib/utils";
import { AccessRestrictionsSection } from "./access-restrictions-section";
import { type DailyResetMode, LimitRulePicker, type LimitType } from "./limit-rule-picker";
import { type LimitRuleDisplayItem, LimitRulesDisplay } from "./limit-rules-display";
import { ProviderGroupSelect } from "./provider-group-select";
import { QuickExpirePicker } from "./quick-expire-picker";

export interface UserEditSectionProps {
Expand Down Expand Up @@ -69,6 +69,17 @@ export interface UserEditSectionProps {
providerGroup?: {
label: string;
placeholder: string;
providersSuffix?: string;
tagInputErrors?: {
empty?: string;
duplicate?: string;
too_long?: string;
invalid_format?: string;
max_tags?: string;
};
errors?: {
loadFailed?: string;
};
};
enableStatus?: {
label: string;
Expand Down Expand Up @@ -411,20 +422,12 @@ export function UserEditSection({
/>

{showProviderGroup && translations.fields.providerGroup && (
<div className="space-y-2">
<Label>{translations.fields.providerGroup.label}</Label>
<div className="flex flex-wrap gap-1 p-2 border rounded-md bg-muted/50">
{(user.providerGroup || PROVIDER_GROUP.DEFAULT)
.split(",")
.map((g) => g.trim())
.filter(Boolean)
.map((group) => (
<Badge key={group} variant="secondary" className="text-xs">
{group}
</Badge>
))}
</div>
</div>
<ProviderGroupSelect
value={user.providerGroup || PROVIDER_GROUP.DEFAULT}
onChange={(val) => emitChange("providerGroup", val)}
disabled={false}
translations={translations.fields.providerGroup}
/>
)}
</div>
</div>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,17 @@ export interface UserEditTranslations {
providerGroup?: {
label: string;
placeholder: string;
providersSuffix?: string;
tagInputErrors?: {
empty?: string;
duplicate?: string;
too_long?: string;
invalid_format?: string;
max_tags?: string;
};
errors?: {
loadFailed?: string;
};
};
enableStatus: {
label: string;
Expand Down Expand Up @@ -98,6 +109,7 @@ export function useUserTranslations(
): UserEditTranslations {
const { showProviderGroup = false } = options;
const t = useTranslations("dashboard.userManagement");
const tUi = useTranslations("ui.tagInput");

return useMemo(() => {
return {
Expand All @@ -124,6 +136,17 @@ export function useUserTranslations(
? {
label: t("userEditSection.fields.providerGroup.label"),
placeholder: t("userEditSection.fields.providerGroup.placeholder"),
providersSuffix: t("providerGroupSelect.providersSuffix"),
tagInputErrors: {
empty: tUi("emptyTag"),
duplicate: tUi("duplicateTag"),
too_long: tUi("tooLong", { max: 50 }),
invalid_format: tUi("invalidFormat"),
max_tags: tUi("maxTags"),
},
errors: {
loadFailed: t("providerGroupSelect.loadFailed"),
},
}
: undefined,
enableStatus: {
Expand Down Expand Up @@ -187,5 +210,5 @@ export function useUserTranslations(
year: t("quickExpire.oneYear"),
},
};
}, [t, showProviderGroup]);
}, [t, tUi, showProviderGroup]);
}
Loading