Skip to content

Commit 5555624

Browse files
committed
service details to data grid
1 parent d35e6b6 commit 5555624

1 file changed

Lines changed: 41 additions & 24 deletions

File tree

frontend/src/pages/services/service-detail.tsx

Lines changed: 41 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,11 @@
1+
import type { FindOptions } from '@furystack/core'
12
import { useCollectionSync, useEntitySync } from '@furystack/entity-sync-client'
23
import type { Injector } from '@furystack/inject'
34
import { createComponent, LocationService, NestedRouteLink, Shade } from '@furystack/shades'
4-
5-
import { navigate } from '../../utils/navigate.js'
65
import {
76
Button,
7+
CollectionService,
8+
DataGrid,
89
Icon,
910
icons,
1011
Loader,
@@ -13,10 +14,13 @@ import {
1314
PageHeader,
1415
Paper,
1516
} from '@furystack/shades-common-components'
17+
import { ObservableValue } from '@furystack/utils'
1618
import { GitHubRepository, ServiceDefinition, StackDefinition } from 'common'
1719
import type { ServiceStateHistory, ServiceView, StackView } from 'common'
1820
import { getServiceCwd } from 'common'
1921

22+
import { navigate } from '../../utils/navigate.js'
23+
2024
import { ConfirmDialog } from '../../components/confirm-dialog.js'
2125
import { ServiceForm } from '../../components/entity-forms/service-form.js'
2226
import { ServiceStatusIndicator } from '../../components/service-status-indicator.js'
@@ -311,12 +315,24 @@ type ServiceHistoryProps = {
311315
injector: Injector
312316
}
313317

318+
type HistoryColumn = 'createdAt' | 'event' | 'triggeredBy' | 'triggerSource' | 'metadata'
319+
314320
const ServiceHistory = Shade<ServiceHistoryProps>({
315321
shadowDomName: 'shade-service-history',
316-
render: ({ props, useState }) => {
322+
render: ({ props, useState, useDisposable }) => {
317323
const [entries, setEntries] = useState<ServiceStateHistory[]>('entries', [])
318324
const [isLoading, setIsLoading] = useState('isLoading', true)
319325

326+
const collectionService = useDisposable(
327+
'collectionService',
328+
() => new CollectionService<ServiceStateHistory>({ searchField: 'event' }),
329+
)
330+
331+
const findOptions = useDisposable(
332+
'findOptions',
333+
() => new ObservableValue<FindOptions<ServiceStateHistory, Array<keyof ServiceStateHistory>>>({}),
334+
)
335+
320336
if (isLoading && entries.length === 0) {
321337
props.injector
322338
.getInstance(ServicesApiClient)
@@ -333,6 +349,8 @@ const ServiceHistory = Shade<ServiceHistoryProps>({
333349
.catch(() => setIsLoading(false))
334350
}
335351

352+
collectionService.data.setValue({ entries, count: entries.length })
353+
336354
return (
337355
<Paper>
338356
<h3 style={{ margin: '0 0 12px 0' }}>History</h3>
@@ -343,31 +361,30 @@ const ServiceHistory = Shade<ServiceHistoryProps>({
343361
) : entries.length === 0 ? (
344362
<div style={{ opacity: '0.6', padding: '12px 0' }}>No history entries yet.</div>
345363
) : (
346-
<div
347-
style={{
348-
display: 'grid',
349-
gridTemplateColumns: '180px 160px 120px 120px 1fr',
350-
gap: '4px 12px',
351-
fontSize: '13px',
364+
<DataGrid<ServiceStateHistory, HistoryColumn>
365+
columns={['createdAt', 'event', 'triggeredBy', 'triggerSource', 'metadata']}
366+
findOptions={findOptions}
367+
styles={undefined}
368+
collectionService={collectionService}
369+
headerComponents={{
370+
createdAt: () => <span>Time</span>,
371+
event: () => <span>Event</span>,
372+
triggeredBy: () => <span>Triggered by</span>,
373+
triggerSource: () => <span>Source</span>,
374+
metadata: () => <span>Details</span>,
352375
}}
353-
>
354-
<strong>Time</strong>
355-
<strong>Event</strong>
356-
<strong>Triggered by</strong>
357-
<strong>Source</strong>
358-
<strong>Details</strong>
359-
{entries.map((entry) => (
360-
<div style={{ display: 'contents' }}>
361-
<span>{new Date(entry.createdAt).toLocaleString()}</span>
362-
<span>{eventLabels[entry.event] ?? entry.event}</span>
363-
<span>{entry.triggeredBy}</span>
364-
<span>{entry.triggerSource}</span>
376+
rowComponents={{
377+
createdAt: (entry) => <span>{new Date(entry.createdAt).toLocaleString()}</span>,
378+
event: (entry) => <span>{eventLabels[entry.event] ?? entry.event}</span>,
379+
triggeredBy: (entry) => <span>{entry.triggeredBy}</span>,
380+
triggerSource: (entry) => <span>{entry.triggerSource}</span>,
381+
metadata: (entry) => (
365382
<span style={{ fontFamily: 'monospace', fontSize: '12px', opacity: '0.8' }}>
366383
{entry.metadata ?? ''}
367384
</span>
368-
</div>
369-
))}
370-
</div>
385+
),
386+
}}
387+
/>
371388
)}
372389
</Paper>
373390
)

0 commit comments

Comments
 (0)