forked from baron/baron-sso
변경된 앱 안내 패널 추가
This commit is contained in:
@@ -92,14 +92,62 @@ const recentClientActions = new Set([
|
|||||||
"DELETE_CLIENT",
|
"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> = {
|
const recentClientFieldLabels: Record<string, string> = {
|
||||||
name: "이름",
|
name: "이름",
|
||||||
type: "유형",
|
type: "유형",
|
||||||
status: "상태",
|
status: "상태",
|
||||||
|
scopes: "스코프",
|
||||||
|
tenant_access_restricted: "테넌트 접근 제한",
|
||||||
|
allowed_tenants: "허용 테넌트",
|
||||||
|
id_token_claims: "커스텀 클레임",
|
||||||
token_endpoint_auth_method: "인증 방식",
|
token_endpoint_auth_method: "인증 방식",
|
||||||
jwks_uri: "JWKS URI",
|
jwks_uri: "JWKS URI",
|
||||||
backchannel_logout_uri: "Backchannel Logout URI",
|
backchannel_logout_uri: "Backchannel Logout URI",
|
||||||
backchannel_logout_session_required: "세션 필수",
|
backchannel_logout_session_required: "세션 필수",
|
||||||
|
headless_login_enabled: "헤드리스 로그인",
|
||||||
|
headless_token_endpoint_auth_method: "헤드리스 인증 방식",
|
||||||
|
headless_jwks_uri: "헤드리스 JWKS URI",
|
||||||
redirect_uri_count: "Redirect URI 수",
|
redirect_uri_count: "Redirect URI 수",
|
||||||
scope_count: "Scope 수",
|
scope_count: "Scope 수",
|
||||||
relation: "관계",
|
relation: "관계",
|
||||||
@@ -263,6 +311,8 @@ function ClientsPage() {
|
|||||||
const [statusFilter, setStatusFilter] = useState("all");
|
const [statusFilter, setStatusFilter] = useState("all");
|
||||||
const [isAdvancedFilterOpen, setIsAdvancedFilterOpen] = useState(false);
|
const [isAdvancedFilterOpen, setIsAdvancedFilterOpen] = useState(false);
|
||||||
const [isRequestModalOpen, setIsRequestModalOpen] = useState(false);
|
const [isRequestModalOpen, setIsRequestModalOpen] = useState(false);
|
||||||
|
const [isRecentChangesGuideOpen, setIsRecentChangesGuideOpen] =
|
||||||
|
useState(false);
|
||||||
const [sortConfig, setSortConfig] =
|
const [sortConfig, setSortConfig] =
|
||||||
useState<SortConfig<ClientSortKey> | null>({
|
useState<SortConfig<ClientSortKey> | null>({
|
||||||
key: "createdAt",
|
key: "createdAt",
|
||||||
@@ -921,12 +971,30 @@ function ClientsPage() {
|
|||||||
</CardContent>
|
</CardContent>
|
||||||
</Card>
|
</Card>
|
||||||
|
|
||||||
<Card className="glass-panel">
|
<Card className="glass-panel">
|
||||||
<CardHeader className="flex flex-row items-center justify-between gap-4 pb-4">
|
<CardHeader className="flex flex-row items-center justify-between gap-4 pb-4">
|
||||||
<div>
|
<div>
|
||||||
<CardTitle className="text-xl font-semibold">
|
<div className="flex items-center gap-1.5">
|
||||||
{t("ui.dev.clients.recent_changes.title", "최근 변경된 앱")}
|
<CardTitle className="text-xl font-semibold">
|
||||||
</CardTitle>
|
{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>
|
<CardDescription>
|
||||||
{t(
|
{t(
|
||||||
"msg.dev.clients.recent_changes.description",
|
"msg.dev.clients.recent_changes.description",
|
||||||
@@ -940,6 +1008,34 @@ function ClientsPage() {
|
|||||||
"'감사 로그 조회' 관계가 있어야 최근 변경된 앱을 볼 수 있습니다.",
|
"'감사 로그 조회' 관계가 있어야 최근 변경된 앱을 볼 수 있습니다.",
|
||||||
)}
|
)}
|
||||||
</p>
|
</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>
|
</div>
|
||||||
<Button variant="outline" size="sm" asChild>
|
<Button variant="outline" size="sm" asChild>
|
||||||
<Link to="/audit-logs">
|
<Link to="/audit-logs">
|
||||||
|
|||||||
@@ -1367,6 +1367,16 @@ untitled = "Untitled"
|
|||||||
|
|
||||||
[ui.dev.clients.recent_changes]
|
[ui.dev.clients.recent_changes]
|
||||||
title = "Recently Changed Apps"
|
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]
|
[msg.dev.clients.recent_changes]
|
||||||
description = "{{count}} applications have change history."
|
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."
|
empty = "No recent change logs yet."
|
||||||
no_detail = "Unable to inspect the changed fields."
|
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]
|
[ui.dev.clients.badge]
|
||||||
admin_session = "Admin Session"
|
admin_session = "Admin Session"
|
||||||
dev_session = "DevFront Session"
|
dev_session = "DevFront Session"
|
||||||
|
|||||||
@@ -1367,6 +1367,16 @@ untitled = "Untitled"
|
|||||||
|
|
||||||
[ui.dev.clients.recent_changes]
|
[ui.dev.clients.recent_changes]
|
||||||
title = "최근 변경된 앱"
|
title = "최근 변경된 앱"
|
||||||
|
guide_button = "최근 변경 항목 안내 열기"
|
||||||
|
guide_title = "최근 변경 항목 안내"
|
||||||
|
|
||||||
|
[ui.dev.clients.recent_changes.guide]
|
||||||
|
create = "앱 생성"
|
||||||
|
settings = "설정 변경"
|
||||||
|
status = "상태 변경"
|
||||||
|
relation = "관계 변경"
|
||||||
|
secret = "클라이언트 시크릿 재발급"
|
||||||
|
delete = "앱 삭제"
|
||||||
|
|
||||||
[msg.dev.clients.recent_changes]
|
[msg.dev.clients.recent_changes]
|
||||||
description = "총 {{count}}개의 애플리케이션이 변경된 이력이 있습니다."
|
description = "총 {{count}}개의 애플리케이션이 변경된 이력이 있습니다."
|
||||||
@@ -1374,6 +1384,15 @@ permission_note = "'감사 로그 조회' 관계가 있어야 최근 변경된
|
|||||||
empty = "최근 변경 로그가 아직 없습니다."
|
empty = "최근 변경 로그가 아직 없습니다."
|
||||||
no_detail = "변경 항목을 확인할 수 없습니다."
|
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]
|
[ui.dev.clients.badge]
|
||||||
admin_session = "관리자 세션"
|
admin_session = "관리자 세션"
|
||||||
dev_session = "DevFront 세션"
|
dev_session = "DevFront 세션"
|
||||||
|
|||||||
@@ -1423,6 +1423,16 @@ untitled = ""
|
|||||||
|
|
||||||
[ui.dev.clients.recent_changes]
|
[ui.dev.clients.recent_changes]
|
||||||
title = ""
|
title = ""
|
||||||
|
guide_button = ""
|
||||||
|
guide_title = ""
|
||||||
|
|
||||||
|
[ui.dev.clients.recent_changes.guide]
|
||||||
|
create = ""
|
||||||
|
settings = ""
|
||||||
|
status = ""
|
||||||
|
relation = ""
|
||||||
|
secret = ""
|
||||||
|
delete = ""
|
||||||
|
|
||||||
[msg.dev.clients.recent_changes]
|
[msg.dev.clients.recent_changes]
|
||||||
description = ""
|
description = ""
|
||||||
@@ -1430,6 +1440,15 @@ permission_note = ""
|
|||||||
empty = ""
|
empty = ""
|
||||||
no_detail = ""
|
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]
|
[ui.dev.clients.badge]
|
||||||
admin_session = ""
|
admin_session = ""
|
||||||
dev_session = ""
|
dev_session = ""
|
||||||
|
|||||||
Reference in New Issue
Block a user