From 88d9c25b436d7c6465bddb5a84a3a651b38c397f Mon Sep 17 00:00:00 2001 From: chyoo Date: Tue, 7 Jul 2026 09:51:24 +0900 Subject: [PATCH] improve launcher history and runtime config UX --- src/pages/launcher/LauncherBuildPage.tsx | 4 +- .../launcher/LauncherCommonSettingsPage.tsx | 38 ++++++++++++++++++- src/pages/launcher/LauncherSourcePage.tsx | 12 ++---- src/pages/launcher/LauncherVersionsPage.tsx | 6 --- 4 files changed, 41 insertions(+), 19 deletions(-) diff --git a/src/pages/launcher/LauncherBuildPage.tsx b/src/pages/launcher/LauncherBuildPage.tsx index f2a928d..5d87400 100644 --- a/src/pages/launcher/LauncherBuildPage.tsx +++ b/src/pages/launcher/LauncherBuildPage.tsx @@ -48,7 +48,7 @@ function jobTime(job: LauncherBuildJob) { return Number.isNaN(value) ? 0 : value; } -const launcherBuildJobPageSize = 5; +const launcherBuildJobPageSize = 3; type BuildTarget = 'launcher-client' | 'launcher-backend'; type BuildRange = 'week' | 'month' | 'all'; @@ -387,7 +387,7 @@ export function LauncherBuildPage() { } /> -
+
{jobs.length === 0 ? (
빌드 작업이 없습니다. diff --git a/src/pages/launcher/LauncherCommonSettingsPage.tsx b/src/pages/launcher/LauncherCommonSettingsPage.tsx index e301e4f..ffdc40c 100644 --- a/src/pages/launcher/LauncherCommonSettingsPage.tsx +++ b/src/pages/launcher/LauncherCommonSettingsPage.tsx @@ -1,4 +1,4 @@ -import { MoreHorizontal, Plus, SlidersHorizontal, Trash2 } from 'lucide-react'; +import { ChevronLeft, ChevronRight, MoreHorizontal, Plus, SlidersHorizontal, Trash2 } from 'lucide-react'; import { useEffect, useMemo, useState, type FormEvent } from 'react'; import { Badge, Button, Card, CardHeader, Modal } from '../../components/ui'; import { useToast } from '../../components/toast'; @@ -33,6 +33,8 @@ const emptyForm: FormState = { isSecret: false }; +const settingsPageSize = 10; + function maskValue(setting: LauncherCommonSetting) { if (!setting.isSecret) return setting.value; if (!setting.value) return '-'; @@ -61,8 +63,11 @@ export function LauncherCommonSettingsPage() { const [editing, setEditing] = useState(null); const [form, setForm] = useState(emptyForm); const [saving, setSaving] = useState(false); + const [page, setPage] = useState(1); const loadingVisible = useMinimumLoading(loading); + const totalPages = Math.max(1, Math.ceil(settings.length / settingsPageSize)); + const pagedSettings = settings.slice((page - 1) * settingsPageSize, page * settingsPageSize); const summary = useMemo(() => ({ total: settings.length, endpoint: settings.filter((item) => item.type === 'endpoint').length, @@ -84,6 +89,10 @@ export function LauncherCommonSettingsPage() { refresh(); }, []); + useEffect(() => { + setPage((currentPage) => Math.min(currentPage, totalPages)); + }, [totalPages]); + const openCreate = () => { setEditing(null); setForm(emptyForm); @@ -192,7 +201,7 @@ export function LauncherCommonSettingsPage() { 등록된 설정이 없습니다. ) : null} - {settings.map((setting) => ( + {pagedSettings.map((setting) => (

@@ -214,6 +223,31 @@ export function LauncherCommonSettingsPage() {

+
+ + {loading ? '불러오는 중' : `총 ${settings.length}건 · ${page} / ${totalPages}`} + +
+ + +
+
+
{files.map((file) => (
@@ -510,12 +510,6 @@ export function LauncherSourcePage() {
- {activeForm.repository ? ( - - 저장소 열기 - - - ) : null}
@@ -618,7 +612,7 @@ export function LauncherSourcePage() { title="커밋 내역 상세" onClose={() => setDiffTarget(null)} className="max-w-[min(98vw,1800px)]" - bodyClassName="max-h-[84vh] px-4 py-4" + bodyClassName="max-h-[70vh] px-4 py-4" footer={} > {diffTarget ? ( diff --git a/src/pages/launcher/LauncherVersionsPage.tsx b/src/pages/launcher/LauncherVersionsPage.tsx index 67fe550..c40cad7 100644 --- a/src/pages/launcher/LauncherVersionsPage.tsx +++ b/src/pages/launcher/LauncherVersionsPage.tsx @@ -267,12 +267,6 @@ export function LauncherVersionsPage() { 커밋 {latestBackendBuild?.commitSha || '-'} -
- -