1+ import type { FindOptions } from '@furystack/core'
12import { useCollectionSync , useEntitySync } from '@furystack/entity-sync-client'
23import type { Injector } from '@furystack/inject'
34import { createComponent , LocationService , NestedRouteLink , Shade } from '@furystack/shades'
4-
5- import { navigate } from '../../utils/navigate.js'
65import {
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'
1618import { GitHubRepository , ServiceDefinition , StackDefinition } from 'common'
1719import type { ServiceStateHistory , ServiceView , StackView } from 'common'
1820import { getServiceCwd } from 'common'
1921
22+ import { navigate } from '../../utils/navigate.js'
23+
2024import { ConfirmDialog } from '../../components/confirm-dialog.js'
2125import { ServiceForm } from '../../components/entity-forms/service-form.js'
2226import { 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+
314320const 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