-
-
+
{t("ui.admin.auth_guard.title", "Auth Guard")}
diff --git a/adminfront/src/features/auth/components/PermissionChecker.tsx b/adminfront/src/features/auth/components/PermissionChecker.tsx
index 792ac1ad..e286788b 100644
--- a/adminfront/src/features/auth/components/PermissionChecker.tsx
+++ b/adminfront/src/features/auth/components/PermissionChecker.tsx
@@ -1,5 +1,5 @@
import { useMutation } from "@tanstack/react-query";
-import { CheckCircle2, ShieldAlert, XCircle } from "lucide-react";
+import { CheckCircle2, XCircle } from "lucide-react";
import { useState } from "react";
import { Button } from "../../../components/ui/button";
import {
@@ -47,8 +47,7 @@ function PermissionChecker() {
return (
-
-
+
{t(
"ui.admin.auth_guard.checker.title",
"ReBAC permission checker",
diff --git a/adminfront/src/features/integrity/DataIntegrityPage.tsx b/adminfront/src/features/integrity/DataIntegrityPage.tsx
index b13e83eb..47c2128e 100644
--- a/adminfront/src/features/integrity/DataIntegrityPage.tsx
+++ b/adminfront/src/features/integrity/DataIntegrityPage.tsx
@@ -373,24 +373,16 @@ function DataIntegrityContent() {
-
-
-
-
-
-
- {t(
- "ui.admin.integrity.read_model.title",
- "Read model integrity",
- )}
-
-
- {t(
- "msg.admin.integrity.read_model.description",
- "Ory SoT를 덮어쓰지 않고 backend DB read model의 이상 징후만 확인합니다.",
- )}
-
-
+
+
+ {t("ui.admin.integrity.read_model.title", "Read model integrity")}
+
+
+ {t(
+ "msg.admin.integrity.read_model.description",
+ "Ory SoT를 덮어쓰지 않고 backend DB read model의 이상 징후만 확인합니다.",
+ )}
+
{data ? (
diff --git a/adminfront/src/features/overview/GlobalOverviewPage.tsx b/adminfront/src/features/overview/GlobalOverviewPage.tsx
index ece1bd78..6cf0b64f 100644
--- a/adminfront/src/features/overview/GlobalOverviewPage.tsx
+++ b/adminfront/src/features/overview/GlobalOverviewPage.tsx
@@ -2,7 +2,6 @@ import { useQuery } from "@tanstack/react-query";
import {
Activity,
AlertTriangle,
- BarChart3,
CheckCircle2,
Database,
ShieldCheck,
@@ -289,22 +288,16 @@ function RPUsageMixedChart({
return (
-
-
-
-
- {t(
- "ui.admin.overview.chart.title",
- "회사별 앱별 로그인 요청 현황",
- )}
-
-
- {t(
- "ui.admin.overview.chart.description",
- "전체 또는 선택한 회사 기준으로 그래프를 확인합니다.",
- )}
-
-
+
+
+ {t("ui.admin.overview.chart.title", "회사별 앱별 로그인 요청 현황")}
+
+
+ {t(
+ "ui.admin.overview.chart.description",
+ "전체 또는 선택한 조직 기준으로 그래프를 확인합니다.",
+ )}
+
{periodControls}
@@ -570,22 +563,19 @@ function GlobalOverviewPage() {
{usageQuery.isError ? (
-
-
-
-
- {t(
- "ui.admin.overview.chart.title",
- "회사별 앱별 로그인 요청 현황",
- )}
-
-
- {t(
- "ui.admin.overview.chart.description",
- "전체 또는 선택한 회사 기준으로 그래프를 확인합니다.",
- )}
-
-
+
+
+ {t(
+ "ui.admin.overview.chart.title",
+ "회사별 앱별 로그인 요청 현황",
+ )}
+
+
+ {t(
+ "ui.admin.overview.chart.description",
+ "전체 또는 선택한 조직 기준으로 그래프를 확인합니다.",
+ )}
+
{periodControls}
diff --git a/adminfront/src/features/projections/UserProjectionPage.tsx b/adminfront/src/features/projections/UserProjectionPage.tsx
index 6c91362f..763dd29b 100644
--- a/adminfront/src/features/projections/UserProjectionPage.tsx
+++ b/adminfront/src/features/projections/UserProjectionPage.tsx
@@ -1,5 +1,5 @@
import { useMutation, useQuery, useQueryClient } from "@tanstack/react-query";
-import { AlertTriangle, Database, RefreshCw, RotateCcw } from "lucide-react";
+import { AlertTriangle, RefreshCw, RotateCcw } from "lucide-react";
import { RoleGuard } from "../../components/auth/RoleGuard";
import { Badge } from "../../components/ui/badge";
import { Button } from "../../components/ui/button";
@@ -168,9 +168,6 @@ function UserProjectionContent() {
-
-
-
{t(
From 097caf395cf12a33fd56e90feb94764a5d687183 Mon Sep 17 00:00:00 2001
From: kyy
Date: Mon, 18 May 2026 14:26:50 +0900
Subject: [PATCH 11/25] =?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 (
-
-
-
+
- {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 (
-
-
-
+
{isError ? (
From a1f3604b24be4ff5cc8d9101a77bd5193fdefa91 Mon Sep 17 00:00:00 2001
From: kyy
Date: Mon, 18 May 2026 15:05:24 +0900
Subject: [PATCH 12/25] =?UTF-8?q?adminfront=20=EC=B9=B4=EB=93=9C=20?=
=?UTF-8?q?=ED=83=80=EC=9D=B4=ED=8B=80=20=ED=81=AC=EA=B8=B0=20=ED=86=B5?=
=?UTF-8?q?=EC=9D=BC=20(text-lg)=20=EB=B0=8F=20=ED=95=9C=EA=B5=AD=EC=96=B4?=
=?UTF-8?q?=20=EC=A0=81=EC=9A=A9?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
adminfront/src/features/api-keys/ApiKeyListPage.tsx | 2 +-
adminfront/src/features/audit/AuditLogsPage.tsx | 2 +-
.../features/auth/components/PermissionChecker.tsx | 6 +++---
.../src/features/integrity/DataIntegrityPage.tsx | 6 +++---
.../src/features/overview/GlobalOverviewPage.tsx | 11 +++++++----
.../src/features/projections/UserProjectionPage.tsx | 2 +-
.../src/features/tenants/routes/TenantListPage.tsx | 4 ++--
adminfront/src/features/users/UserListPage.tsx | 2 +-
adminfront/src/locales/ko.toml | 6 +++---
9 files changed, 22 insertions(+), 19 deletions(-)
diff --git a/adminfront/src/features/api-keys/ApiKeyListPage.tsx b/adminfront/src/features/api-keys/ApiKeyListPage.tsx
index 95931ade..c64b3fe6 100644
--- a/adminfront/src/features/api-keys/ApiKeyListPage.tsx
+++ b/adminfront/src/features/api-keys/ApiKeyListPage.tsx
@@ -193,7 +193,7 @@ function ApiKeyListPage() {
-
+
{t("ui.admin.apikeys.registry.title", "API Key Registry")}
diff --git a/adminfront/src/features/audit/AuditLogsPage.tsx b/adminfront/src/features/audit/AuditLogsPage.tsx
index 86e7eb84..71b83490 100644
--- a/adminfront/src/features/audit/AuditLogsPage.tsx
+++ b/adminfront/src/features/audit/AuditLogsPage.tsx
@@ -125,7 +125,7 @@ function AuditLogsPage() {
-
+
{t("ui.common.audit.registry.title", "Audit registry")}
diff --git a/adminfront/src/features/auth/components/PermissionChecker.tsx b/adminfront/src/features/auth/components/PermissionChecker.tsx
index e286788b..2be914f1 100644
--- a/adminfront/src/features/auth/components/PermissionChecker.tsx
+++ b/adminfront/src/features/auth/components/PermissionChecker.tsx
@@ -47,7 +47,7 @@ function PermissionChecker() {
return (
-
+
{t(
"ui.admin.auth_guard.checker.title",
"ReBAC permission checker",
@@ -154,7 +154,7 @@ function PermissionChecker() {
{result.allowed ? (
<>
-
+
{t(
"ui.admin.auth_guard.checker.allowed",
"Access ALLOWED",
@@ -170,7 +170,7 @@ function PermissionChecker() {
) : (
<>
-
+
{t(
"ui.admin.auth_guard.checker.denied",
"Access DENIED",
diff --git a/adminfront/src/features/integrity/DataIntegrityPage.tsx b/adminfront/src/features/integrity/DataIntegrityPage.tsx
index 5b295a50..bd8988df 100644
--- a/adminfront/src/features/integrity/DataIntegrityPage.tsx
+++ b/adminfront/src/features/integrity/DataIntegrityPage.tsx
@@ -375,7 +375,7 @@ function DataIntegrityContent() {
-
+
{t(
"ui.admin.integrity.read_model.title",
"Read model integrity",
@@ -444,7 +444,7 @@ function DataIntegrityContent() {
className="rounded-lg border border-border bg-card p-5"
>
-
+
{integritySectionLabel(section.key, section.label)}
@@ -489,7 +489,7 @@ function DataIntegrityContent() {
-
+
{t(
"ui.admin.integrity.orphan_login_ids.title",
"유령 로그인 ID 정리",
diff --git a/adminfront/src/features/overview/GlobalOverviewPage.tsx b/adminfront/src/features/overview/GlobalOverviewPage.tsx
index 59c33efc..dc04f151 100644
--- a/adminfront/src/features/overview/GlobalOverviewPage.tsx
+++ b/adminfront/src/features/overview/GlobalOverviewPage.tsx
@@ -201,8 +201,11 @@ function IntegrityOverviewSummary() {
) : (
)}
-
- {t("ui.admin.integrity.summary.title", "정합성 최종 검증")}
+
+ {t(
+ "ui.admin.integrity.summary.title",
+ "정합성 최종 검증",
+ )}
@@ -289,7 +292,7 @@ function RPUsageMixedChart({
-
+
{t("ui.admin.overview.chart.title", "회사별 앱별 로그인 요청 현황")}
@@ -564,7 +567,7 @@ function GlobalOverviewPage() {
-
+
{t(
"ui.admin.overview.chart.title",
"회사별 앱별 로그인 요청 현황",
diff --git a/adminfront/src/features/projections/UserProjectionPage.tsx b/adminfront/src/features/projections/UserProjectionPage.tsx
index 2c8efa7e..61666d9c 100644
--- a/adminfront/src/features/projections/UserProjectionPage.tsx
+++ b/adminfront/src/features/projections/UserProjectionPage.tsx
@@ -169,7 +169,7 @@ function UserProjectionContent() {
-
+
{t(
"ui.admin.user_projection.card.title",
"Kratos users projection",
diff --git a/adminfront/src/features/tenants/routes/TenantListPage.tsx b/adminfront/src/features/tenants/routes/TenantListPage.tsx
index e8c28d2e..1258f026 100644
--- a/adminfront/src/features/tenants/routes/TenantListPage.tsx
+++ b/adminfront/src/features/tenants/routes/TenantListPage.tsx
@@ -459,7 +459,7 @@ function TenantListPage() {
) {
return (
-
+
{t("msg.admin.common.forbidden", "접근 권한이 없습니다.")}