1
0
forked from baron/baron-sso

refactor(adminfront): rename legacy companyCode to tenantSlug across frontend (#426)

This commit is contained in:
2026-03-23 16:59:05 +09:00
parent b2f96b216d
commit b0e18cc724
12 changed files with 48 additions and 48 deletions

View File

@@ -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="">

View File

@@ -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"

View File

@@ -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 || "-"}

View File

@@ -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);
};

View File

@@ -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 && (

View File

@@ -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");
});
});

View File

@@ -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 {