@@ -420,8 +420,89 @@ fn App() -> impl IntoView {
420420 view ! { <Group units group_name images hostmap time=time_in_seconds/> } . into_view ( )
421421 } ;
422422
423+ let render_group_grid = move |id : u8 | {
424+ let group_name = create_memo ( move |_| {
425+ config
426+ . get ( )
427+ . unwrap ( )
428+ . groups
429+ . get_by_second ( & id)
430+ . unwrap ( )
431+ . clone ( )
432+ } ) ;
433+ let units = create_memo ( move |_| -> Vec < _ > {
434+ units
435+ . get ( )
436+ . unwrap_or_else ( Vec :: new)
437+ . iter ( )
438+ . filter ( |x| x. group == id)
439+ . cloned ( )
440+ . collect ( )
441+ } ) ;
442+ let render_unit_grid = move |idx : usize | {
443+ let unit = create_memo ( move |_| units. get ( ) [ idx] . clone ( ) ) ;
444+ let ping_ago = move || time_in_seconds. get ( ) - unit. get ( ) . last_ping_timestamp as i64 ;
445+
446+ let class = move || match ping_ago ( ) {
447+ ..0 => "grid-blue" ,
448+ 0 ..120 => "grid-green" ,
449+ 120 ..300 => "grid-yellow" ,
450+ 300 .. => "grid-red" ,
451+ } ;
452+
453+ let size_style = "width: 16px; height: 16px;" ;
454+
455+ let style = move || {
456+ format ! (
457+ "grid-column: {}; grid-row: {}; {size_style}" ,
458+ unit. get( ) . col,
459+ unit. get( ) . row
460+ )
461+ } ;
462+
463+ let popover_text = move || {
464+ format ! (
465+ "row {} col {}: {} seconds ago" ,
466+ unit. get( ) . row,
467+ unit. get( ) . col,
468+ ping_ago( )
469+ )
470+ } ;
471+
472+ view ! {
473+ <div style=style class=class>
474+ <Popover tooltip=true placement=PopoverPlacement :: Right >
475+ <PopoverTrigger slot>
476+ <div class=class style=size_style>
477+ </div>
478+ </PopoverTrigger >
479+ { popover_text}
480+ </Popover >
481+ </div>
482+ }
483+ } ;
484+ view ! {
485+ <div style="display: inline-block; text-align: center;" >
486+ <h2>{ group_name} </h2>
487+ <div style="display: inline-grid; margin: 10px; transform: scaleY(-1);" >
488+ <For each=move || 0 ..units. get( ) . len( ) key=|x| * x children=render_unit_grid/>
489+ </div>
490+ </div>
491+ }
492+ } ;
493+
423494 view ! {
424495 <Images images=image_stats/>
496+ <h1>Ping Summary </h1>
497+ <Space vertical=false >
498+ <For
499+ each=move || {
500+ config. get( ) . clone( ) . into_iter( ) . flat_map( |x| x. groups. into_iter( ) . map( |x| x. 1 ) )
501+ }
502+ key=|x| * x
503+ children=render_group_grid
504+ />
505+ </Space >
425506 <For
426507 each=move || {
427508 config. get( ) . clone( ) . into_iter( ) . flat_map( |x| x. groups. into_iter( ) . map( |x| x. 1 ) )
0 commit comments