From 097caf395cf12a33fd56e90feb94764a5d687183 Mon Sep 17 00:00:00 2001 From: kyy Date: Mon, 18 May 2026 14:26:50 +0900 Subject: [PATCH] =?UTF-8?q?=ED=83=80=EC=9D=B4=ED=8B=80=20=ED=81=AC?= =?UTF-8?q?=EA=B8=B0=20=EB=B0=8F=20=EC=83=81=EB=8B=A8=20=ED=8C=A8=EB=94=A9?= =?UTF-8?q?=20=EB=B0=80=EB=A6=BC=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- adminfront/src/features/auth/AuthPage.tsx | 6 +- .../features/integrity/DataIntegrityPage.tsx | 334 +++++++++--------- .../features/overview/GlobalOverviewPage.tsx | 10 +- .../projections/UserProjectionPage.tsx | 12 +- 4 files changed, 185 insertions(+), 177 deletions(-) diff --git a/adminfront/src/features/auth/AuthPage.tsx b/adminfront/src/features/auth/AuthPage.tsx index 890d3b7e..39fa62c6 100644 --- a/adminfront/src/features/auth/AuthPage.tsx +++ b/adminfront/src/features/auth/AuthPage.tsx @@ -4,9 +4,9 @@ import PermissionChecker from "./components/PermissionChecker"; function AuthPage() { return (
-
-
-

+
+
+

{t("ui.admin.auth_guard.title", "Auth Guard")}

diff --git a/adminfront/src/features/integrity/DataIntegrityPage.tsx b/adminfront/src/features/integrity/DataIntegrityPage.tsx index 47c2128e..5b295a50 100644 --- a/adminfront/src/features/integrity/DataIntegrityPage.tsx +++ b/adminfront/src/features/integrity/DataIntegrityPage.tsx @@ -325,13 +325,13 @@ function DataIntegrityContent() { const recheckMessage = recheckStatusText(recheckStatus); return ( -

-
-
-

+
+
+
+

{t("ui.admin.integrity.title", "데이터 정합성 검증")}

-

+

{t( "msg.admin.integrity.subtitle", "Review integrity status and inspect checks across the admin data model.", @@ -359,176 +359,184 @@ function DataIntegrityContent() { ) : null}

-

+ - {isError ? ( -
- {(error as Error)?.message || - t( - "msg.admin.integrity.report.load_error", - "정합성 리포트를 불러오지 못했습니다.", - )} -
- ) : null} - -
-
-
-

- {t("ui.admin.integrity.read_model.title", "Read model integrity")} -

-

- {t( - "msg.admin.integrity.read_model.description", - "Ory SoT를 덮어쓰지 않고 backend DB read model의 이상 징후만 확인합니다.", +

+ {isError ? ( +
+ {(error as Error)?.message || + t( + "msg.admin.integrity.report.load_error", + "정합성 리포트를 불러오지 못했습니다.", )} -

-
- {data ? ( - - {statusLabel(data.status)} - - ) : null} -
+
+ ) : null} - {isLoading ? ( -
- {t("ui.admin.integrity.loading", "불러오는 중")} -
- ) : ( -
+
+
-
- {t("ui.admin.integrity.summary.total_checks", "검사 항목")} -
-
- {data?.summary.totalChecks ?? 0} -
-
-
-
- {t("ui.admin.integrity.summary.passed", "정상")} -
-
- {data?.summary.passed ?? 0} -
-
-
-
- {t("ui.admin.integrity.summary.failures", "실패 건수")} -
-
- {data?.summary.failures ?? 0} -
-
-
-
- {t("ui.admin.integrity.summary.checked_at", "검사 시각")} -
-
- {formatDateTime(data?.checkedAt)} -
-
-
- )} - - -
- {(data?.sections ?? []).map((section) => ( -
-

- {integritySectionLabel(section.key, section.label)} + {t( + "ui.admin.integrity.read_model.title", + "Read model integrity", + )}

- - {statusLabel(section.status)} - +

+ {t( + "msg.admin.integrity.read_model.description", + "Ory SoT를 덮어쓰지 않고 backend DB read model의 이상 징후만 확인합니다.", + )} +

-
- {section.checks.map((check) => ( -
-
- -
-
- {integrityCheckLabel(check.key, check.label)} + {data ? ( + + {statusLabel(data.status)} + + ) : null} +
+ + {isLoading ? ( +
+ {t("ui.admin.integrity.loading", "불러오는 중")} +
+ ) : ( +
+
+
+ {t("ui.admin.integrity.summary.total_checks", "검사 항목")} +
+
+ {data?.summary.totalChecks ?? 0} +
+
+
+
+ {t("ui.admin.integrity.summary.passed", "정상")} +
+
+ {data?.summary.passed ?? 0} +
+
+
+
+ {t("ui.admin.integrity.summary.failures", "실패 건수")} +
+
+ {data?.summary.failures ?? 0} +
+
+
+
+ {t("ui.admin.integrity.summary.checked_at", "검사 시각")} +
+
+ {formatDateTime(data?.checkedAt)} +
+
+
+ )} +
+ +
+ {(data?.sections ?? []).map((section) => ( +
+
+

+ {integritySectionLabel(section.key, section.label)} +

+ + {statusLabel(section.status)} + +
+
+ {section.checks.map((check) => ( +
+
+ +
+
+ {integrityCheckLabel(check.key, check.label)} +
+

+ {integrityCheckDescription( + check.key, + check.description, + )} +

-

- {integrityCheckDescription(check.key, check.description)} -

+
+
+ + {statusLabel(check.status)} + + + {check.count} +
-
- - {statusLabel(check.status)} - - - {check.count} - -
-
- ))} -
- - ))} -
- -
-
-
-

- {t( - "ui.admin.integrity.orphan_login_ids.title", - "유령 로그인 ID 정리", - )} -

-

- {t( - "msg.admin.integrity.orphan_login_ids.description", - "삭제되었거나 존재하지 않는 사용자/테넌트를 참조하는 로그인 ID를 확인한 뒤 선택 삭제합니다.", - )} -

-
- + ))} +
+
+ ))}
- {orphanLoginIDsQuery.isError ? ( -
- {t( - "msg.admin.integrity.orphan_login_ids.load_error", - "유령 로그인 ID 대상을 불러오지 못했습니다.", - )} + +
+
+
+

+ {t( + "ui.admin.integrity.orphan_login_ids.title", + "유령 로그인 ID 정리", + )} +

+

+ {t( + "msg.admin.integrity.orphan_login_ids.description", + "삭제되었거나 존재하지 않는 사용자/테넌트를 참조하는 로그인 ID를 확인한 뒤 선택 삭제합니다.", + )} +

+
+
- ) : null} - {deleteMutation.data ? ( -
- {t( - "msg.admin.integrity.orphan_login_ids.delete_success", - "{{count}}개의 유령 로그인 ID를 삭제했습니다.", - { count: deleteMutation.data.deletedCount }, - )} -
- ) : null} - -
+ {orphanLoginIDsQuery.isError ? ( +
+ {t( + "msg.admin.integrity.orphan_login_ids.load_error", + "유령 로그인 ID 대상을 불러오지 못했습니다.", + )} +
+ ) : null} + {deleteMutation.data ? ( +
+ {t( + "msg.admin.integrity.orphan_login_ids.delete_success", + "{{count}}개의 유령 로그인 ID를 삭제했습니다.", + { count: deleteMutation.data.deletedCount }, + )} +
+ ) : null} + + +
); } diff --git a/adminfront/src/features/overview/GlobalOverviewPage.tsx b/adminfront/src/features/overview/GlobalOverviewPage.tsx index 6cf0b64f..59c33efc 100644 --- a/adminfront/src/features/overview/GlobalOverviewPage.tsx +++ b/adminfront/src/features/overview/GlobalOverviewPage.tsx @@ -194,7 +194,7 @@ function IntegrityOverviewSummary() { return (
-
+
{data.status === "pass" ? ( @@ -287,7 +287,7 @@ function RPUsageMixedChart({ return (
-
+

{t("ui.admin.overview.chart.title", "회사별 앱별 로그인 요청 현황")} @@ -507,9 +507,9 @@ function GlobalOverviewPage() { return (
-
+
-

+

{t("ui.common.overview.title", "운영 현황")}

@@ -562,7 +562,7 @@ function GlobalOverviewPage() { {usageQuery.isError ? (

-
+

{t( diff --git a/adminfront/src/features/projections/UserProjectionPage.tsx b/adminfront/src/features/projections/UserProjectionPage.tsx index 763dd29b..2c8efa7e 100644 --- a/adminfront/src/features/projections/UserProjectionPage.tsx +++ b/adminfront/src/features/projections/UserProjectionPage.tsx @@ -95,16 +95,16 @@ function UserProjectionContent() { const actionError = reconcileMutation.error ?? resetMutation.error; return ( -
-
-
-

+
+
+
+

{t( "ui.admin.user_projection.title", "User Projection Management", )}

-

+

{t( "msg.admin.user_projection.subtitle", "Review and sync the Kratos user read model.", @@ -134,7 +134,7 @@ function UserProjectionContent() { )}

-

+ {isError ? (