forked from baron/baron-sso
Format adminfront code check targets
This commit is contained in:
@@ -24,6 +24,7 @@
|
|||||||
"node_modules",
|
"node_modules",
|
||||||
"tsconfig*.json",
|
"tsconfig*.json",
|
||||||
"test-results",
|
"test-results",
|
||||||
|
"test-results.nobody-backup",
|
||||||
"playwright-report"
|
"playwright-report"
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -34,7 +34,10 @@ describe("DomainTagInput", () => {
|
|||||||
/>,
|
/>,
|
||||||
);
|
);
|
||||||
|
|
||||||
await user.type(screen.getByPlaceholderText("example.com"), "samaneng.com ");
|
await user.type(
|
||||||
|
screen.getByPlaceholderText("example.com"),
|
||||||
|
"samaneng.com ",
|
||||||
|
);
|
||||||
|
|
||||||
expect(
|
expect(
|
||||||
await screen.findByText(
|
await screen.findByText(
|
||||||
|
|||||||
@@ -71,8 +71,7 @@ export function normalizeSchemaField(field: unknown): SchemaField {
|
|||||||
type,
|
type,
|
||||||
required: Boolean(source.required),
|
required: Boolean(source.required),
|
||||||
adminOnly: Boolean(source.adminOnly),
|
adminOnly: Boolean(source.adminOnly),
|
||||||
validation:
|
validation: typeof source.validation === "string" ? source.validation : "",
|
||||||
typeof source.validation === "string" ? source.validation : "",
|
|
||||||
unsigned: Boolean(source.unsigned),
|
unsigned: Boolean(source.unsigned),
|
||||||
isLoginId,
|
isLoginId,
|
||||||
indexed: isLoginId || Boolean(source.indexed),
|
indexed: isLoginId || Boolean(source.indexed),
|
||||||
|
|||||||
@@ -54,6 +54,9 @@ export function formatDomainConflictMessage(
|
|||||||
const tenantName =
|
const tenantName =
|
||||||
"tenant" in conflict
|
"tenant" in conflict
|
||||||
? conflict.tenant.name
|
? conflict.tenant.name
|
||||||
: conflict.tenantName || conflict.tenantSlug || conflict.tenantId || "다른";
|
: conflict.tenantName ||
|
||||||
|
conflict.tenantSlug ||
|
||||||
|
conflict.tenantId ||
|
||||||
|
"다른";
|
||||||
return `${conflict.domain} 도메인은 ${tenantName} 테넌트에 이미 설정되어 있습니다. 그래도 현재 테넌트에도 추가하시겠습니까?`;
|
return `${conflict.domain} 도메인은 ${tenantName} 테넌트에 이미 설정되어 있습니다. 그래도 현재 테넌트에도 추가하시겠습니까?`;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -129,7 +129,10 @@ export function buildTenantImportPreview(
|
|||||||
candidates[0] && candidates[0].score >= 0.95
|
candidates[0] && candidates[0].score >= 0.95
|
||||||
? candidates[0].tenantId
|
? candidates[0].tenantId
|
||||||
: "",
|
: "",
|
||||||
defaultCreateSlug: suggestUniqueTenantSlug(row.slug || row.name, tenants),
|
defaultCreateSlug: suggestUniqueTenantSlug(
|
||||||
|
row.slug || row.name,
|
||||||
|
tenants,
|
||||||
|
),
|
||||||
};
|
};
|
||||||
})
|
})
|
||||||
.sort((a, b) => {
|
.sort((a, b) => {
|
||||||
@@ -148,10 +151,7 @@ export function serializeTenantImportCSV(
|
|||||||
const sortedRows = [...previewRows].sort(
|
const sortedRows = [...previewRows].sort(
|
||||||
(a, b) => a.row.rowNumber - b.row.rowNumber,
|
(a, b) => a.row.rowNumber - b.row.rowNumber,
|
||||||
);
|
);
|
||||||
const targetTenantIds = buildTargetTenantIds(
|
const targetTenantIds = buildTargetTenantIds(sortedRows, selectedTenantIds);
|
||||||
sortedRows,
|
|
||||||
selectedTenantIds,
|
|
||||||
);
|
|
||||||
|
|
||||||
for (const preview of sortedRows) {
|
for (const preview of sortedRows) {
|
||||||
const resolution = selectedTenantIds[preview.row.rowNumber] ?? "";
|
const resolution = selectedTenantIds[preview.row.rowNumber] ?? "";
|
||||||
@@ -241,7 +241,9 @@ function remapParentTenantId(
|
|||||||
return targetTenantIds.bySourceId.get(parentTenantId) ?? parentTenantId;
|
return targetTenantIds.bySourceId.get(parentTenantId) ?? parentTenantId;
|
||||||
}
|
}
|
||||||
if (parentTenantSlug) {
|
if (parentTenantSlug) {
|
||||||
return targetTenantIds.bySourceSlug.get(parentTenantSlug.toLowerCase()) ?? "";
|
return (
|
||||||
|
targetTenantIds.bySourceSlug.get(parentTenantSlug.toLowerCase()) ?? ""
|
||||||
|
);
|
||||||
}
|
}
|
||||||
return "";
|
return "";
|
||||||
}
|
}
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -159,10 +159,7 @@ function UserListPage() {
|
|||||||
},
|
},
|
||||||
onError: () => {
|
onError: () => {
|
||||||
toast.error(
|
toast.error(
|
||||||
t(
|
t("msg.admin.users.export_error", "사용자 내보내기에 실패했습니다."),
|
||||||
"msg.admin.users.export_error",
|
|
||||||
"사용자 내보내기에 실패했습니다.",
|
|
||||||
),
|
|
||||||
);
|
);
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -400,10 +400,7 @@ export function UserBulkUploadModal({ onSuccess }: UserBulkUploadModalProps) {
|
|||||||
data-testid="user-import-tenant-resolution"
|
data-testid="user-import-tenant-resolution"
|
||||||
>
|
>
|
||||||
<div className="mb-2 font-medium">
|
<div className="mb-2 font-medium">
|
||||||
{t(
|
{t("ui.admin.users.bulk.tenant_resolution", "테넌트 매핑")}
|
||||||
"ui.admin.users.bulk.tenant_resolution",
|
|
||||||
"테넌트 매핑",
|
|
||||||
)}
|
|
||||||
</div>
|
</div>
|
||||||
<div className="space-y-2">
|
<div className="space-y-2">
|
||||||
{tenantPreviewRows.map((preview) => (
|
{tenantPreviewRows.map((preview) => (
|
||||||
@@ -487,7 +484,9 @@ export function UserBulkUploadModal({ onSuccess }: UserBulkUploadModalProps) {
|
|||||||
<td className="p-2">
|
<td className="p-2">
|
||||||
<input
|
<input
|
||||||
className="h-8 w-full min-w-[180px] rounded-md border border-input bg-background px-2 font-mono text-xs"
|
className="h-8 w-full min-w-[180px] rounded-md border border-input bg-background px-2 font-mono text-xs"
|
||||||
value={hanmacEmailPreviews[index]?.finalEmail ?? u.email}
|
value={
|
||||||
|
hanmacEmailPreviews[index]?.finalEmail ?? u.email
|
||||||
|
}
|
||||||
onChange={(event) =>
|
onChange={(event) =>
|
||||||
setPreviewData((prev) =>
|
setPreviewData((prev) =>
|
||||||
prev.map((item, itemIndex) =>
|
prev.map((item, itemIndex) =>
|
||||||
|
|||||||
@@ -1,18 +1,18 @@
|
|||||||
export type UserSchemaFieldType =
|
export type UserSchemaFieldType =
|
||||||
| "text"
|
| "text"
|
||||||
| "number"
|
| "number"
|
||||||
| "boolean"
|
| "boolean"
|
||||||
| "date"
|
| "date"
|
||||||
| "float"
|
| "float"
|
||||||
| "datetime";
|
| "datetime";
|
||||||
|
|
||||||
export type UserSchemaField = {
|
export type UserSchemaField = {
|
||||||
key: string;
|
key: string;
|
||||||
label?: string;
|
label?: string;
|
||||||
type?: UserSchemaFieldType;
|
type?: UserSchemaFieldType;
|
||||||
required?: boolean;
|
required?: boolean;
|
||||||
adminOnly?: boolean;
|
adminOnly?: boolean;
|
||||||
validation?: string;
|
validation?: string;
|
||||||
isLoginId?: boolean;
|
isLoginId?: boolean;
|
||||||
indexed?: boolean;
|
indexed?: boolean;
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -148,9 +148,11 @@ test.describe("Tenant Allowed Domains", () => {
|
|||||||
|
|
||||||
await page.getByRole("button", { name: "저장" }).click();
|
await page.getByRole("button", { name: "저장" }).click();
|
||||||
|
|
||||||
await expect.poll(() => savedPayload).toMatchObject({
|
await expect
|
||||||
domains: ["samaneng.com"],
|
.poll(() => savedPayload)
|
||||||
forceDomainConflicts: ["samaneng.com"],
|
.toMatchObject({
|
||||||
});
|
domains: ["samaneng.com"],
|
||||||
|
forceDomainConflicts: ["samaneng.com"],
|
||||||
|
});
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -288,9 +288,7 @@ test.describe("Tenants Management", () => {
|
|||||||
await page
|
await page
|
||||||
.getByTestId("tenant-import-match-select-3")
|
.getByTestId("tenant-import-match-select-3")
|
||||||
.selectOption("__create__");
|
.selectOption("__create__");
|
||||||
await page
|
await page.getByTestId("tenant-import-create-slug-3").fill("child-created");
|
||||||
.getByTestId("tenant-import-create-slug-3")
|
|
||||||
.fill("child-created");
|
|
||||||
await page.getByTestId("tenant-import-confirm-btn").click();
|
await page.getByTestId("tenant-import-confirm-btn").click();
|
||||||
|
|
||||||
await expect(page.getByTestId("tenant-import-result")).toContainText(
|
await expect(page.getByTestId("tenant-import-result")).toContainText(
|
||||||
|
|||||||
@@ -38,8 +38,9 @@ test.describe("Tenants CSV live E2E", () => {
|
|||||||
await page.route("**/api/v1/**", async (route) => {
|
await page.route("**/api/v1/**", async (route) => {
|
||||||
const requestUrl = new URL(route.request().url());
|
const requestUrl = new URL(route.request().url());
|
||||||
const liveUrl = `${baseURL}${requestUrl.pathname}${requestUrl.search}`;
|
const liveUrl = `${baseURL}${requestUrl.pathname}${requestUrl.search}`;
|
||||||
const headers = { ...route.request().headers() };
|
const { authorization: _authorization, ...headers } = route
|
||||||
delete headers.authorization;
|
.request()
|
||||||
|
.headers();
|
||||||
headers["x-test-role"] = "super_admin";
|
headers["x-test-role"] = "super_admin";
|
||||||
const response = await route.fetch({ url: liveUrl, headers });
|
const response = await route.fetch({ url: liveUrl, headers });
|
||||||
await route.fulfill({ response });
|
await route.fulfill({ response });
|
||||||
|
|||||||
@@ -368,7 +368,9 @@ test.describe("User Management", () => {
|
|||||||
"외부 기업 회원",
|
"외부 기업 회원",
|
||||||
"개인 회원",
|
"개인 회원",
|
||||||
]);
|
]);
|
||||||
await expect(page.getByRole("tab", { name: /외부 기업 회원/i })).toBeVisible();
|
await expect(
|
||||||
|
page.getByRole("tab", { name: /외부 기업 회원/i }),
|
||||||
|
).toBeVisible();
|
||||||
await expect(
|
await expect(
|
||||||
page.getByRole("tab", { name: /한맥가족 구성원/i }),
|
page.getByRole("tab", { name: /한맥가족 구성원/i }),
|
||||||
).toBeVisible();
|
).toBeVisible();
|
||||||
@@ -376,9 +378,7 @@ test.describe("User Management", () => {
|
|||||||
await expect(
|
await expect(
|
||||||
page.getByRole("tab", { name: /한맥가족 구성원/i }),
|
page.getByRole("tab", { name: /한맥가족 구성원/i }),
|
||||||
).toHaveAttribute("data-state", "active");
|
).toHaveAttribute("data-state", "active");
|
||||||
await expect(
|
await expect(page.getByLabel(/한맥 가족 구성원으로 등록/i)).toHaveCount(0);
|
||||||
page.getByLabel(/한맥 가족 구성원으로 등록/i),
|
|
||||||
).toHaveCount(0);
|
|
||||||
|
|
||||||
// Select Tenant first (important for schema fields to show up)
|
// Select Tenant first (important for schema fields to show up)
|
||||||
await page.getByRole("tab", { name: /외부 기업 회원/i }).click();
|
await page.getByRole("tab", { name: /외부 기업 회원/i }).click();
|
||||||
@@ -527,9 +527,7 @@ test.describe("User Management", () => {
|
|||||||
await expect(
|
await expect(
|
||||||
page.getByRole("tab", { name: /한맥가족 구성원/i }),
|
page.getByRole("tab", { name: /한맥가족 구성원/i }),
|
||||||
).toHaveAttribute("data-state", "active");
|
).toHaveAttribute("data-state", "active");
|
||||||
await expect(
|
await expect(page.getByLabel(/한맥 가족 구성원으로 등록/i)).toHaveCount(0);
|
||||||
page.getByLabel(/한맥 가족 구성원으로 등록/i),
|
|
||||||
).toHaveCount(0);
|
|
||||||
await expect(page.locator("select#role")).toHaveCount(0);
|
await expect(page.locator("select#role")).toHaveCount(0);
|
||||||
await expect(page.locator("input#department")).toHaveCount(0);
|
await expect(page.locator("input#department")).toHaveCount(0);
|
||||||
|
|
||||||
@@ -722,9 +720,7 @@ test.describe("User Management", () => {
|
|||||||
await expect(
|
await expect(
|
||||||
page.getByRole("tab", { name: /한맥가족 구성원/i }),
|
page.getByRole("tab", { name: /한맥가족 구성원/i }),
|
||||||
).toHaveAttribute("data-state", "active");
|
).toHaveAttribute("data-state", "active");
|
||||||
await expect(
|
await expect(page.getByLabel(/한맥 가족 구성원으로 등록/i)).toHaveCount(0);
|
||||||
page.getByLabel(/한맥 가족 구성원으로 등록/i),
|
|
||||||
).toHaveCount(0);
|
|
||||||
await expect(page.getByTestId("detail-appointment-row-0")).toBeVisible();
|
await expect(page.getByTestId("detail-appointment-row-0")).toBeVisible();
|
||||||
await expect(
|
await expect(
|
||||||
page.getByTestId("detail-appointment-tenant-owner-line-0"),
|
page.getByTestId("detail-appointment-tenant-owner-line-0"),
|
||||||
|
|||||||
@@ -177,9 +177,9 @@ test.describe("Users Bulk Upload", () => {
|
|||||||
),
|
),
|
||||||
});
|
});
|
||||||
|
|
||||||
await expect(page.getByTestId("user-import-tenant-resolution")).toContainText(
|
await expect(
|
||||||
/신규 생성|Create new/i,
|
page.getByTestId("user-import-tenant-resolution"),
|
||||||
);
|
).toContainText(/신규 생성|Create new/i);
|
||||||
await page.getByTestId("bulk-start-btn").click();
|
await page.getByTestId("bulk-start-btn").click();
|
||||||
|
|
||||||
await expect(page.getByText("new@test.com")).toBeVisible();
|
await expect(page.getByText("new@test.com")).toBeVisible();
|
||||||
|
|||||||
@@ -39,8 +39,9 @@ test.describe("Users CSV live E2E", () => {
|
|||||||
await page.route("**/api/v1/**", async (route) => {
|
await page.route("**/api/v1/**", async (route) => {
|
||||||
const requestUrl = new URL(route.request().url());
|
const requestUrl = new URL(route.request().url());
|
||||||
const liveUrl = `${baseURL}${requestUrl.pathname}${requestUrl.search}`;
|
const liveUrl = `${baseURL}${requestUrl.pathname}${requestUrl.search}`;
|
||||||
const headers = { ...route.request().headers() };
|
const { authorization: _authorization, ...headers } = route
|
||||||
delete headers.authorization;
|
.request()
|
||||||
|
.headers();
|
||||||
headers["x-test-role"] = "super_admin";
|
headers["x-test-role"] = "super_admin";
|
||||||
const response = await route.fetch({ url: liveUrl, headers });
|
const response = await route.fetch({ url: liveUrl, headers });
|
||||||
await route.fulfill({ response });
|
await route.fulfill({ response });
|
||||||
@@ -75,7 +76,9 @@ test.describe("Users CSV live E2E", () => {
|
|||||||
expect(path).toBeTruthy();
|
expect(path).toBeTruthy();
|
||||||
|
|
||||||
const csv = fs.readFileSync(path as string, "utf8");
|
const csv = fs.readFileSync(path as string, "utf8");
|
||||||
expect(csv).toContain("ID,Email,Name,Phone,Status,Tenant,Position,JobTitle,CreatedAt");
|
expect(csv).toContain(
|
||||||
|
"ID,Email,Name,Phone,Status,Tenant,Position,JobTitle,CreatedAt",
|
||||||
|
);
|
||||||
expect(csv).not.toContain("Role");
|
expect(csv).not.toContain("Role");
|
||||||
expect(csv).not.toContain("Department");
|
expect(csv).not.toContain("Department");
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -230,5 +230,4 @@ test.describe("User Schema Dynamic Form", () => {
|
|||||||
.first();
|
.first();
|
||||||
await expect(errorMsg).toBeVisible();
|
await expect(errorMsg).toBeVisible();
|
||||||
});
|
});
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|||||||
Reference in New Issue
Block a user