From c6c79f7306c25a1b8ae6c6413dbc19aee23353cc Mon Sep 17 00:00:00 2001 From: chan Date: Thu, 4 Jun 2026 11:20:21 +0900 Subject: [PATCH] fix(admin): add missing Tabs import and refine import result UI type safety --- .../tenants/routes/TenantListPage.tsx | 203 +++++++++++------- 1 file changed, 126 insertions(+), 77 deletions(-) diff --git a/adminfront/src/features/tenants/routes/TenantListPage.tsx b/adminfront/src/features/tenants/routes/TenantListPage.tsx index 9351e1aa..ba62a6e5 100644 --- a/adminfront/src/features/tenants/routes/TenantListPage.tsx +++ b/adminfront/src/features/tenants/routes/TenantListPage.tsx @@ -76,6 +76,7 @@ import { TableHeader, TableRow, } from "../../../components/ui/table"; +import { Tabs, TabsList, TabsTrigger } from "../../../components/ui/tabs"; import { toast } from "../../../components/ui/use-toast"; import type { UserProfileResponse } from "../../../lib/adminApi"; import { @@ -288,6 +289,17 @@ function TenantListPage() { const [importResult, setImportResult] = React.useState(null); const [importResultOpen, setImportResultOpen] = React.useState(false); + const [importResultFilter, setImportResultFilter] = React.useState< + "all" | "created" | "updated" | "failed" | "skipped" + >("all"); + + const filteredImportDetails = React.useMemo(() => { + if (!importResult) return []; + if (importResultFilter === "all") return importResult.details; + if (importResultFilter === "failed") + return importResult.details.filter((d) => !d.success); + return importResult.details.filter((d) => d.action === importResultFilter); + }, [importResult, importResultFilter]); const [selectedBulkStatus, setSelectedBulkStatus] = React.useState(""); const _tenantTableScrollRef = React.useRef(null); @@ -1009,22 +1021,60 @@ function TenantListPage() { "가져오기 결과 리포트", )} - - {importResult && - t( - "msg.admin.tenants.import_result.summary", - "총 {{total}}건 처리: 생성 {{created}}, 갱신 {{updated}}, 실패 {{failed}}", - { - total: importResult.details.length, - created: importResult.created, - updated: importResult.updated, - failed: importResult.failed, - }, - )} - -
+ {importResult && ( +
+
+ + Total + + + {importResult.details.length} + +
+
+ Created + + {importResult.created} + +
+
+ Updated + + {importResult.updated} + +
+
+ + Failed + + + {importResult.failed} + +
+
+ )} + + + setImportResultFilter( + v as "all" | "created" | "updated" | "failed" | "skipped", + ) + } + className="w-full" + > + + ALL + CREATED + UPDATED + FAILED + SKIPPED + + + +
@@ -1037,10 +1087,7 @@ function TenantListPage() { {t("ui.admin.tenants.table.slug", "SLUG")} - - {t("ui.admin.tenants.import_result.action", "작업")} - - + {t("ui.admin.tenants.import_result.status", "상태")} @@ -1049,67 +1096,69 @@ function TenantListPage() { - {importResult?.details.map((detail) => ( - - - {detail.row} - - {detail.name} - - {detail.slug} - - - - {detail.action.toUpperCase()} - - - - {detail.success ? ( - - SUCCESS - - ) : ( - - FAILED - - )} - - - {detail.message} - {detail.modifiedFields && - detail.modifiedFields.length > 0 && ( -
- - {t( - "ui.admin.tenants.import_result.modified", - "수정됨:", - )} - - {detail.modifiedFields.map((field) => ( - - {field} - - ))} -
- )} + {filteredImportDetails.length === 0 ? ( + + + {t("ui.common.no_results", "표시할 결과가 없습니다.")} - ))} + ) : ( + filteredImportDetails.map((detail) => ( + + + {detail.row} + + + {detail.name} + + + {detail.slug} + + + + {detail.action.toUpperCase()} + + + + {detail.message} + {detail.modifiedFields && + detail.modifiedFields.length > 0 && ( +
+ + {t( + "ui.admin.tenants.import_result.modified", + "수정됨:", + )} + + {detail.modifiedFields.map((field) => ( + + {field} + + ))} +
+ )} +
+
+ )) + )}