1
0
forked from baron/baron-sso

변경된 앱 안내 패널 추가

This commit is contained in:
2026-05-27 14:10:28 +09:00
parent 73ba79b015
commit 939bf68f85
4 changed files with 157 additions and 4 deletions

View File

@@ -92,14 +92,62 @@ const recentClientActions = new Set([
"DELETE_CLIENT",
]);
const recentChangeGuideItems = [
{
titleKey: "ui.dev.clients.recent_changes.guide.create",
titleFallback: "앱 생성",
descriptionKey: "msg.dev.clients.recent_changes.guide.create_desc",
descriptionFallback:
"새 애플리케이션이 등록되면 이름, 유형, 기본 상태와 함께 표시됩니다.",
},
{
titleKey: "ui.dev.clients.recent_changes.guide.settings",
titleFallback: "설정 변경",
descriptionKey: "msg.dev.clients.recent_changes.guide.settings_desc",
descriptionFallback:
"앱 이름, 스코프, 테넌트 접근 제한, 커스텀 클레임, 보안 설정, 로그아웃 URI, JWKS 변경이 포함됩니다.",
},
{
titleKey: "ui.dev.clients.recent_changes.guide.status",
titleFallback: "상태 변경",
descriptionKey: "msg.dev.clients.recent_changes.guide.status_desc",
descriptionFallback: "Active / Inactive 전환이 여기에 포함됩니다.",
},
{
titleKey: "ui.dev.clients.recent_changes.guide.relation",
titleFallback: "관계 변경",
descriptionKey: "msg.dev.clients.recent_changes.guide.relation_desc",
descriptionFallback: "관계 추가와 삭제가 함께 표시됩니다.",
},
{
titleKey: "ui.dev.clients.recent_changes.guide.secret",
titleFallback: "클라이언트 시크릿 재발급",
descriptionKey: "msg.dev.clients.recent_changes.guide.secret_desc",
descriptionFallback: "시크릿 재발급 이력이 보입니다.",
},
{
titleKey: "ui.dev.clients.recent_changes.guide.delete",
titleFallback: "앱 삭제",
descriptionKey: "msg.dev.clients.recent_changes.guide.delete_desc",
descriptionFallback: "앱 삭제도 최근 변경 이력에 포함됩니다.",
},
] as const;
const recentClientFieldLabels: Record<string, string> = {
name: "이름",
type: "유형",
status: "상태",
scopes: "스코프",
tenant_access_restricted: "테넌트 접근 제한",
allowed_tenants: "허용 테넌트",
id_token_claims: "커스텀 클레임",
token_endpoint_auth_method: "인증 방식",
jwks_uri: "JWKS URI",
backchannel_logout_uri: "Backchannel Logout URI",
backchannel_logout_session_required: "세션 필수",
headless_login_enabled: "헤드리스 로그인",
headless_token_endpoint_auth_method: "헤드리스 인증 방식",
headless_jwks_uri: "헤드리스 JWKS URI",
redirect_uri_count: "Redirect URI 수",
scope_count: "Scope 수",
relation: "관계",
@@ -263,6 +311,8 @@ function ClientsPage() {
const [statusFilter, setStatusFilter] = useState("all");
const [isAdvancedFilterOpen, setIsAdvancedFilterOpen] = useState(false);
const [isRequestModalOpen, setIsRequestModalOpen] = useState(false);
const [isRecentChangesGuideOpen, setIsRecentChangesGuideOpen] =
useState(false);
const [sortConfig, setSortConfig] =
useState<SortConfig<ClientSortKey> | null>({
key: "createdAt",
@@ -921,12 +971,30 @@ function ClientsPage() {
</CardContent>
</Card>
<Card className="glass-panel">
<Card className="glass-panel">
<CardHeader className="flex flex-row items-center justify-between gap-4 pb-4">
<div>
<CardTitle className="text-xl font-semibold">
{t("ui.dev.clients.recent_changes.title", "최근 변경된 앱")}
</CardTitle>
<div className="flex items-center gap-1.5">
<CardTitle className="text-xl font-semibold">
{t("ui.dev.clients.recent_changes.title", "최근 변경된 앱")}
</CardTitle>
<Button
type="button"
variant="ghost"
size="icon"
className="-ml-1 h-8 w-8 translate-y-px text-muted-foreground hover:text-primary"
aria-label={t(
"ui.dev.clients.recent_changes.guide_button",
"최근 변경 항목 안내 열기",
)}
aria-expanded={isRecentChangesGuideOpen}
onClick={() =>
setIsRecentChangesGuideOpen((current) => !current)
}
>
<Info className="h-4 w-4" />
</Button>
</div>
<CardDescription>
{t(
"msg.dev.clients.recent_changes.description",
@@ -940,6 +1008,34 @@ function ClientsPage() {
"'감사 로그 조회' 관계가 있어야 최근 변경된 앱을 볼 수 있습니다.",
)}
</p>
{isRecentChangesGuideOpen && (
<div className="mt-3 rounded-xl border border-border/60 bg-muted/20 p-4">
<p className="text-sm font-semibold text-foreground">
{t(
"ui.dev.clients.recent_changes.guide_title",
"최근 변경 항목 안내",
)}
</p>
<div className="mt-3 space-y-3">
{recentChangeGuideItems.map((item) => (
<div key={item.titleKey} className="space-y-1">
<p className="text-sm font-medium text-foreground">
{t(item.titleKey, item.titleFallback)}
</p>
<p className="text-xs leading-5 text-muted-foreground">
{t(item.descriptionKey, item.descriptionFallback)}
</p>
</div>
))}
<p className="text-xs leading-5 text-muted-foreground">
{t(
"msg.dev.clients.recent_changes.guide.audit_only",
"동의 철회는 최근 변경된 앱 카드에 포함하지 않고, 감사 로그에서 확인합니다.",
)}
</p>
</div>
</div>
)}
</div>
<Button variant="outline" size="sm" asChild>
<Link to="/audit-logs">

View File

@@ -1367,6 +1367,16 @@ untitled = "Untitled"
[ui.dev.clients.recent_changes]
title = "Recently Changed Apps"
guide_button = "Open recent change guide"
guide_title = "Recent Change Guide"
[ui.dev.clients.recent_changes.guide]
create = "App creation"
settings = "Settings changes"
status = "Status changes"
relation = "Relationship changes"
secret = "Client secret rotation"
delete = "App deletion"
[msg.dev.clients.recent_changes]
description = "{{count}} applications have change history."
@@ -1374,6 +1384,15 @@ permission_note = "You need the 'Audit Log Viewer' relationship to see recently
empty = "No recent change logs yet."
no_detail = "Unable to inspect the changed fields."
[msg.dev.clients.recent_changes.guide]
audit_only = "Consent revocations are not included in this card; check the audit log instead."
create_desc = "When a new application is created, it appears with its name, type, and default status."
settings_desc = "Includes app name, scopes, tenant access restrictions, custom claims, security settings, logout URI, and JWKS changes."
status_desc = "Active / Inactive transitions are included here."
relation_desc = "Relationship additions and removals are shown together."
secret_desc = "Client secret rotation history is shown."
delete_desc = "Application deletions are also included in recent changes."
[ui.dev.clients.badge]
admin_session = "Admin Session"
dev_session = "DevFront Session"

View File

@@ -1367,6 +1367,16 @@ untitled = "Untitled"
[ui.dev.clients.recent_changes]
title = "최근 변경된 앱"
guide_button = "최근 변경 항목 안내 열기"
guide_title = "최근 변경 항목 안내"
[ui.dev.clients.recent_changes.guide]
create = "앱 생성"
settings = "설정 변경"
status = "상태 변경"
relation = "관계 변경"
secret = "클라이언트 시크릿 재발급"
delete = "앱 삭제"
[msg.dev.clients.recent_changes]
description = "총 {{count}}개의 애플리케이션이 변경된 이력이 있습니다."
@@ -1374,6 +1384,15 @@ permission_note = "'감사 로그 조회' 관계가 있어야 최근 변경된
empty = "최근 변경 로그가 아직 없습니다."
no_detail = "변경 항목을 확인할 수 없습니다."
[msg.dev.clients.recent_changes.guide]
audit_only = "동의 철회는 최근 변경된 앱 카드에 포함하지 않고, 감사 로그에서 확인합니다."
create_desc = "새 애플리케이션이 등록되면 이름, 유형, 기본 상태와 함께 표시됩니다."
settings_desc = "앱 이름, 스코프, 테넌트 접근 제한, 커스텀 클레임, 보안 설정, 로그아웃 URI, JWKS 변경이 포함됩니다."
status_desc = "Active / Inactive 전환이 여기에 포함됩니다."
relation_desc = "관계 추가와 삭제가 함께 표시됩니다."
secret_desc = "시크릿 재발급 이력이 보입니다."
delete_desc = "앱 삭제도 최근 변경 이력에 포함됩니다."
[ui.dev.clients.badge]
admin_session = "관리자 세션"
dev_session = "DevFront 세션"

View File

@@ -1423,6 +1423,16 @@ untitled = ""
[ui.dev.clients.recent_changes]
title = ""
guide_button = ""
guide_title = ""
[ui.dev.clients.recent_changes.guide]
create = ""
settings = ""
status = ""
relation = ""
secret = ""
delete = ""
[msg.dev.clients.recent_changes]
description = ""
@@ -1430,6 +1440,15 @@ permission_note = ""
empty = ""
no_detail = ""
[msg.dev.clients.recent_changes.guide]
audit_only = ""
create_desc = ""
settings_desc = ""
status_desc = ""
relation_desc = ""
secret_desc = ""
delete_desc = ""
[ui.dev.clients.badge]
admin_session = ""
dev_session = ""