Skip to content

Commit bdd262f

Browse files
committed
fix(web): only table rows scroll, header and pagination stay fixed
Restructure installation detail so the table header row stays sticky at the top, only the data rows scroll, and pagination stays at the bottom outside the scroll area.
1 parent b485158 commit bdd262f

1 file changed

Lines changed: 43 additions & 48 deletions

File tree

apps/web/src/features/dashboard/InstallationDetail.tsx

Lines changed: 43 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -103,12 +103,9 @@ export default function InstallationDetail() {
103103
</div>
104104
)}
105105

106-
{/* Scrollable content */}
107-
<div className="flex-1 min-h-0 overflow-y-auto">
108-
109106
{/* Error */}
110107
{error && (
111-
<div className="mb-4 px-4 py-3 bg-danger/8 border border-danger/20 rounded-card text-danger text-sm">
108+
<div className="shrink-0 mb-4 px-4 py-3 bg-danger/8 border border-danger/20 rounded-card text-danger text-sm">
112109
{error}
113110
</div>
114111
)}
@@ -129,24 +126,24 @@ export default function InstallationDetail() {
129126
</div>
130127
)}
131128

132-
{/* Session table */}
129+
{/* Session table — sticky header, scrollable rows */}
133130
{!loading && sessions.length > 0 && (
134-
<>
135-
<div className="border border-rule-str rounded-card overflow-hidden">
136-
{/* Header row */}
137-
<div
138-
className="grid bg-bg2 px-4 py-2.5 font-mono text-[10px] text-dim tracking-[0.18em] uppercase border-b border-rule"
139-
style={{ gridTemplateColumns: '36px 1fr 140px 110px 80px 80px' }}
140-
>
141-
<span>#</span>
142-
<span>REPO / PR</span>
143-
<span>SKILL</span>
144-
<span>STATUS</span>
145-
<span className="text-right">DURATION</span>
146-
<span className="text-right">RAN</span>
147-
</div>
148-
149-
{/* Data rows */}
131+
<div className="flex-1 min-h-0 flex flex-col border border-rule-str rounded-card overflow-hidden">
132+
{/* Table header (sticky) */}
133+
<div
134+
className="shrink-0 grid bg-bg2 px-4 py-2.5 font-mono text-[10px] text-dim tracking-[0.18em] uppercase border-b border-rule"
135+
style={{ gridTemplateColumns: '36px 1fr 140px 110px 80px 80px' }}
136+
>
137+
<span>#</span>
138+
<span>REPO / PR</span>
139+
<span>SKILL</span>
140+
<span>STATUS</span>
141+
<span className="text-right">DURATION</span>
142+
<span className="text-right">RAN</span>
143+
</div>
144+
145+
{/* Scrollable rows */}
146+
<div className="flex-1 min-h-0 overflow-y-auto">
150147
{sessions.map((session, idx) => {
151148
const statusColor =
152149
session.status === 'completed' ? 'ok' as const :
@@ -181,35 +178,33 @@ export default function InstallationDetail() {
181178
)
182179
})}
183180
</div>
184-
185-
{/* Pagination */}
186-
{totalPages > 1 && (
187-
<div className="flex items-center justify-center gap-4 mt-6">
188-
<Button
189-
variant="secondary"
190-
onClick={() => setPage((p) => Math.max(1, p - 1))}
191-
disabled={page <= 1}
192-
className="text-xs"
193-
>
194-
Previous
195-
</Button>
196-
<span className="text-dim text-xs font-mono">
197-
Page {page} of {totalPages}
198-
</span>
199-
<Button
200-
variant="secondary"
201-
onClick={() => setPage((p) => Math.min(totalPages, p + 1))}
202-
disabled={page >= totalPages}
203-
className="text-xs"
204-
>
205-
Next
206-
</Button>
207-
</div>
208-
)}
209-
</>
181+
</div>
210182
)}
211183

212-
</div>{/* end scrollable */}
184+
{/* Pagination (always outside scroll) */}
185+
{!loading && totalPages > 1 && (
186+
<div className="shrink-0 flex items-center justify-center gap-4 py-4">
187+
<Button
188+
variant="secondary"
189+
onClick={() => setPage((p) => Math.max(1, p - 1))}
190+
disabled={page <= 1}
191+
className="text-xs"
192+
>
193+
Previous
194+
</Button>
195+
<span className="text-dim text-xs font-mono">
196+
Page {page} of {totalPages}
197+
</span>
198+
<Button
199+
variant="secondary"
200+
onClick={() => setPage((p) => Math.min(totalPages, p + 1))}
201+
disabled={page >= totalPages}
202+
className="text-xs"
203+
>
204+
Next
205+
</Button>
206+
</div>
207+
)}
213208
</div>
214209
)
215210
}

0 commit comments

Comments
 (0)