+
{[
['활성 앱', '10', Boxes],
- ['접속 사용자', '1,284', Users],
['라이센스 사용률', '72%', FileKey],
['런타임 정상률', '96.4%', Activity]
].map(([label, value, Icon]) => (
@@ -26,7 +96,65 @@ export function DashboardPage() {
))}
+
+
+
+
+ {launcherRows.map(([label, value]) => (
+
+ {label}
+ {value}
+
+ ))}
+
+
+
+
+
+
+ }
+ />
+
+ {commonAppsFailed ? (
+
Woodpecker 저장소를 불러오지 못했습니다.
+ ) : commonAppsLoading && commonApps.length === 0 ? (
+
저장소를 불러오는 중입니다.
+ ) : commonApps.length === 0 ? (
+
표시할 저장소가 없습니다.
+ ) : (
+
+ {commonApps.map((pipeline) => (
+
+
+
+
+
+
{pipeline.repository}
+
+
{pipeline.message}
+
+ {pipeline.url ? (
+
+
+
+ ) : null}
+
+
+ {pipeline.status}
+ {pipeline.branch}
+ {relativeTime(pipeline.createdAt)}
+
+
+ ))}
+
+ )}
+
+
+
>
);
}
-
diff --git a/src/pages/operations/UserSessionsPage.tsx b/src/pages/operations/UserSessionsPage.tsx
index 280e8b4..7a7ae52 100644
--- a/src/pages/operations/UserSessionsPage.tsx
+++ b/src/pages/operations/UserSessionsPage.tsx
@@ -103,7 +103,7 @@ export function UserSessionsPage() {
return (
<>
-
+
{failed ? (
사용자/세션 데이터를 불러오지 못했습니다.
@@ -149,7 +149,7 @@ export function UserSessionsPage() {
terminateUserSession(row.sessionId).then(refresh).catch(() => setFailed(true));
}}
>
- 세션 종료
+ 유효토큰 종료
);
diff --git a/src/pages/operations/operation-utils.tsx b/src/pages/operations/operation-utils.tsx
index db86c7c..4cfa0cb 100644
--- a/src/pages/operations/operation-utils.tsx
+++ b/src/pages/operations/operation-utils.tsx
@@ -7,7 +7,7 @@ export type BadgeTone = 'neutral' | 'green' | 'amber' | 'red' | 'blue' | 'violet
export function statusTone(status?: string | null): BadgeTone {
if (!status) return 'neutral';
- if (['활성', '완료', '게시됨', '게시중', '실행 중', '배포됨', '성공', 'Running', 'ACTIVE'].includes(status)) return 'green';
+ if (['활성', '유효토큰', '완료', '게시됨', '게시중', '실행 중', '배포됨', '성공', 'Running', 'ACTIVE'].includes(status)) return 'green';
if (['주의', '예약됨', '예약', '대기', '준비중', '카나리', '만료', 'PENDING'].includes(status)) return 'amber';
if (['잠김', '실패', '오프라인', '비활성', '종료', 'FAILED', 'Error', 'CrashLoopBackOff'].includes(status)) return 'red';
if (['런처'].includes(status)) return 'violet';