forked from baron/baron-sso
refactor(adminfront): rename legacy companyCode to tenantSlug across frontend (#426)
This commit is contained in:
@@ -69,7 +69,7 @@ function UserCreatePage() {
|
||||
name: "",
|
||||
phone: "",
|
||||
role: "user",
|
||||
companyCode: "",
|
||||
tenantSlug: "",
|
||||
department: "",
|
||||
position: "",
|
||||
jobTitle: "",
|
||||
@@ -80,13 +80,13 @@ function UserCreatePage() {
|
||||
// Lock company for tenant_admin
|
||||
React.useEffect(() => {
|
||||
const p = profile as any;
|
||||
if (p?.role === "tenant_admin" && p.companyCode) {
|
||||
setValue("companyCode", p.companyCode);
|
||||
if (p?.role === "tenant_admin" && p.tenantSlug) {
|
||||
setValue("tenantSlug", p.tenantSlug);
|
||||
}
|
||||
}, [profile, setValue]);
|
||||
|
||||
const selectedCompanyCode = watch("companyCode");
|
||||
const selectedTenant = tenants.find((t) => t.slug === selectedCompanyCode);
|
||||
const selectedTenantSlug = watch("tenantSlug");
|
||||
const selectedTenant = tenants.find((t) => t.slug === selectedTenantSlug);
|
||||
|
||||
const selectedTenantId = selectedTenant?.id ?? "";
|
||||
|
||||
@@ -353,15 +353,15 @@ function UserCreatePage() {
|
||||
|
||||
<div className="grid gap-4 md:grid-cols-2">
|
||||
<div className="space-y-2">
|
||||
<Label htmlFor="companyCode">
|
||||
<Label htmlFor="tenantSlug">
|
||||
{t("ui.admin.users.create.form.tenant", "테넌트 (Tenant)")}
|
||||
</Label>
|
||||
|
||||
<div className="relative">
|
||||
<select
|
||||
id="companyCode"
|
||||
id="tenantSlug"
|
||||
className="flex h-9 w-full rounded-md border border-input bg-transparent px-3 py-1 text-sm shadow-sm transition-colors file:border-0 file:bg-transparent file:text-sm file:font-medium placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:cursor-not-allowed disabled:opacity-50"
|
||||
{...register("companyCode")}
|
||||
{...register("tenantSlug")}
|
||||
disabled={(profile as any)?.role === "tenant_admin"}
|
||||
>
|
||||
<option value="">
|
||||
|
||||
@@ -202,7 +202,7 @@ function UserDetailPage() {
|
||||
phone: "",
|
||||
role: "user",
|
||||
status: "active",
|
||||
companyCode: "",
|
||||
tenantSlug: "",
|
||||
department: "",
|
||||
position: "",
|
||||
jobTitle: "",
|
||||
@@ -243,7 +243,7 @@ function UserDetailPage() {
|
||||
phone: user.phone || "",
|
||||
role: user.role,
|
||||
status: user.status,
|
||||
companyCode: user.companyCode || "",
|
||||
tenantSlug: user.tenantSlug || "",
|
||||
department: user.department || "",
|
||||
position: user.position || "",
|
||||
jobTitle: user.jobTitle || "",
|
||||
@@ -377,7 +377,7 @@ function UserDetailPage() {
|
||||
<div className="relative">
|
||||
<select
|
||||
className="flex h-10 w-full rounded-md border border-input bg-background px-3 py-2 text-sm shadow-sm transition-colors focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-primary disabled:opacity-50"
|
||||
{...register("companyCode")}
|
||||
{...register("tenantSlug")}
|
||||
disabled={
|
||||
profile?.role === "tenant_admin" &&
|
||||
userAffiliatedTenants.length <= 1
|
||||
@@ -428,7 +428,7 @@ function UserDetailPage() {
|
||||
to={`/tenants/${jt.id}`}
|
||||
className={`inline-flex items-center gap-1 px-2 py-0.5 rounded border text-[11px] transition-colors ${
|
||||
jt.id ===
|
||||
tenants.find((t) => t.slug === watch("companyCode"))
|
||||
tenants.find((t) => t.slug === watch("tenantSlug"))
|
||||
?.id
|
||||
? "bg-primary/10 border-primary/30 text-primary font-bold"
|
||||
: "bg-background border-border text-muted-foreground hover:border-primary/50"
|
||||
|
||||
@@ -88,8 +88,8 @@ function UserListPage() {
|
||||
|
||||
// Lock company for tenant_admin
|
||||
React.useEffect(() => {
|
||||
if (profile?.role === "tenant_admin" && profile.companyCode) {
|
||||
setSelectedCompany(profile.companyCode);
|
||||
if (profile?.role === "tenant_admin" && profile.tenantSlug) {
|
||||
setSelectedCompany(profile.tenantSlug);
|
||||
}
|
||||
}, [profile]);
|
||||
|
||||
@@ -134,7 +134,7 @@ function UserListPage() {
|
||||
const query = useQuery({
|
||||
queryKey: [
|
||||
"users",
|
||||
{ limit, offset, search, companyCode: selectedCompany },
|
||||
{ limit, offset, search, tenantSlug: selectedCompany },
|
||||
],
|
||||
queryFn: () => fetchUsers(limit, offset, search, selectedCompany),
|
||||
placeholderData: (previousData) => previousData,
|
||||
@@ -531,7 +531,7 @@ function UserListPage() {
|
||||
<TableCell>
|
||||
<div className="flex flex-col text-sm">
|
||||
<span className="font-medium text-blue-600">
|
||||
{user.tenant?.name || user.companyCode || "-"}
|
||||
{user.tenant?.name || user.tenantSlug || "-"}
|
||||
</span>
|
||||
<span className="text-xs text-muted-foreground">
|
||||
{user.department || "-"}
|
||||
|
||||
@@ -138,7 +138,7 @@ export function UserBulkMoveGroupModal({
|
||||
if (!selectedTenantSlug) return;
|
||||
mutation.mutate({
|
||||
userIds,
|
||||
companyCode: selectedTenantSlug,
|
||||
tenantSlug: selectedTenantSlug,
|
||||
department: selectedGroupName, // can be empty for "No Department"
|
||||
} as any);
|
||||
};
|
||||
|
||||
@@ -74,7 +74,7 @@ export function UserBulkUploadModal({ onSuccess }: UserBulkUploadModalProps) {
|
||||
};
|
||||
|
||||
const downloadTemplate = () => {
|
||||
const headers = "email,name,phone,role,companyCode,department,employee_id";
|
||||
const headers = "email,name,phone,role,tenant,department,employee_id";
|
||||
const example =
|
||||
"user1@example.com,홍길동,010-1234-5678,user,tenant-slug,개발팀,EMP001";
|
||||
const blob = new Blob(
|
||||
@@ -203,7 +203,7 @@ ${example}`,
|
||||
<tr key={u.email} className="border-t">
|
||||
<td className="p-2">{u.email}</td>
|
||||
<td className="p-2">{u.name}</td>
|
||||
<td className="p-2">{u.companyCode || "-"}</td>
|
||||
<td className="p-2">{u.tenantSlug || "-"}</td>
|
||||
</tr>
|
||||
))}
|
||||
{previewData.length > 10 && (
|
||||
|
||||
@@ -3,7 +3,7 @@ import { parseUserCSV } from "./csvParser";
|
||||
|
||||
describe("parseUserCSV", () => {
|
||||
it("should parse valid CSV correctly", () => {
|
||||
const csv = `email,name,phone,role,companyCode,department,emp_id
|
||||
const csv = `email,name,phone,role,tenant,department,emp_id
|
||||
user1@test.com,Hong Gil Dong,010-1111-2222,user,baron,HR,E001
|
||||
user2@test.com,Kim Cheol Su,,admin,baron,IT,E002`;
|
||||
|
||||
@@ -15,7 +15,7 @@ user2@test.com,Kim Cheol Su,,admin,baron,IT,E002`;
|
||||
name: "Hong Gil Dong",
|
||||
phone: "010-1111-2222",
|
||||
role: "user",
|
||||
companyCode: "baron",
|
||||
tenantSlug: "baron",
|
||||
department: "HR",
|
||||
metadata: {
|
||||
emp_id: "E001",
|
||||
@@ -37,10 +37,10 @@ no-name@test.com,`;
|
||||
});
|
||||
|
||||
it("should handle mixed case headers", () => {
|
||||
const csv = `EMAIL,Name,CompanyCode
|
||||
const csv = `EMAIL,Name,Tenant
|
||||
test@test.com,Test,baron`;
|
||||
const result = parseUserCSV(csv);
|
||||
expect(result[0].email).toBe("test@test.com");
|
||||
expect(result[0].companyCode).toBe("baron");
|
||||
expect(result[0].tenantSlug).toBe("baron");
|
||||
});
|
||||
});
|
||||
|
||||
@@ -30,8 +30,8 @@ export function parseUserCSV(text: string): BulkUserItem[] {
|
||||
item.phone = value;
|
||||
} else if (header === "role") {
|
||||
item.role = value;
|
||||
} else if (header === "companycode") {
|
||||
item.companyCode = value;
|
||||
} else if (header === "tenant") {
|
||||
item.tenantSlug = value;
|
||||
} else if (header === "department") {
|
||||
item.department = value;
|
||||
} else {
|
||||
|
||||
Reference in New Issue
Block a user