11import { useState , useEffect } from 'react'
22import { Link } from 'react-router-dom'
33import {
4- Anchor , Box , Button , Checkbox , Group , PasswordInput ,
5- Select , Table , Text , Title ,
4+ Anchor , Box , Button , Checkbox , Group , Modal , PasswordInput ,
5+ ScrollArea , Select , Table , Text , Title ,
66} from '@mantine/core'
77import { TestRecord , TestData } from '../types'
88import { diffDisplay , diffStyle , timingDisplay } from '../utils'
@@ -179,75 +179,63 @@ function TestHistory({
179179 )
180180}
181181
182- const COL_SPAN = 10
183-
184182function TestRow ( {
185183 record,
186- onUpdateReference ,
184+ onOpen ,
187185} : {
188186 record : TestRecord
189- onUpdateReference : ( record : TestRecord ) => void
187+ onOpen : ( record : TestRecord ) => void
190188} ) {
191- const [ expanded , setExpanded ] = useState ( false )
192189 const latestData = record . data [ record . data . length - 1 ]
193190 if ( ! latestData ) return null
194191
195192 return (
196- < >
197- < Table . Tr style = { { cursor : 'pointer' } } onClick = { ( ) => setExpanded ( e => ! e ) } >
198- < Table . Td >
199- < Box
200- px = { 6 }
201- py = { 2 }
202- style = { { borderRadius : 4 , textAlign : 'center' , fontSize : 13 , ...diffStyle ( latestData . pixelError ) } }
203- >
204- { diffDisplay ( latestData . pixelError ) }
205- </ Box >
206- </ Table . Td >
207- < Table . Td > { record . group } </ Table . Td >
208- < Table . Td > { record . name } </ Table . Td >
209- < Table . Td > { record . hardware } </ Table . Td >
210- < Table . Td > { timingDisplay ( latestData . timing ) } </ Table . Td >
211- < Table . Td >
212- < Anchor
213- size = "sm"
214- href = { `https://github.com/OpenSpace/OpenSpace/commit/${ latestData . commitHash } ` }
215- target = "_blank"
216- onClick = { ( e : React . MouseEvent ) => e . stopPropagation ( ) }
217- >
218- { latestData . commitHash . substring ( 0 , 8 ) }
219- </ Anchor >
220- </ Table . Td >
221- < Table . Td >
222- < Text size = "sm" > { new Date ( latestData . timeStamp ) . toISOString ( ) } </ Text >
223- </ Table . Td >
224- < Table . Td >
225- < ImageThumbnail
226- type = "candidate" group = { record . group } name = { record . name }
227- hardware = { record . hardware } stopPropagation
228- />
229- </ Table . Td >
230- < Table . Td >
231- < ImageThumbnail
232- type = "reference" group = { record . group } name = { record . name }
233- hardware = { record . hardware } stopPropagation
234- />
235- </ Table . Td >
236- < Table . Td >
237- < ImageThumbnail
238- type = "difference" group = { record . group } name = { record . name }
239- hardware = { record . hardware } stopPropagation
240- />
241- </ Table . Td >
242- </ Table . Tr >
243- { expanded && (
244- < Table . Tr >
245- < Table . Td colSpan = { COL_SPAN } style = { { padding : 0 } } >
246- < TestHistory record = { record } onUpdateReference = { onUpdateReference } />
247- </ Table . Td >
248- </ Table . Tr >
249- ) }
250- </ >
193+ < Table . Tr style = { { cursor : 'pointer' } } onClick = { ( ) => onOpen ( record ) } >
194+ < Table . Td >
195+ < Box
196+ px = { 6 }
197+ py = { 2 }
198+ style = { { borderRadius : 4 , textAlign : 'center' , fontSize : 13 , ...diffStyle ( latestData . pixelError ) } }
199+ >
200+ { diffDisplay ( latestData . pixelError ) }
201+ </ Box >
202+ </ Table . Td >
203+ < Table . Td > { record . group } </ Table . Td >
204+ < Table . Td > { record . name } </ Table . Td >
205+ < Table . Td > { record . hardware } </ Table . Td >
206+ < Table . Td > { timingDisplay ( latestData . timing ) } </ Table . Td >
207+ < Table . Td >
208+ < Anchor
209+ size = "sm"
210+ href = { `https://github.com/OpenSpace/OpenSpace/commit/${ latestData . commitHash } ` }
211+ target = "_blank"
212+ onClick = { ( e : React . MouseEvent ) => e . stopPropagation ( ) }
213+ >
214+ { latestData . commitHash . substring ( 0 , 8 ) }
215+ </ Anchor >
216+ </ Table . Td >
217+ < Table . Td >
218+ < Text size = "sm" > { new Date ( latestData . timeStamp ) . toISOString ( ) } </ Text >
219+ </ Table . Td >
220+ < Table . Td >
221+ < ImageThumbnail
222+ type = "candidate" group = { record . group } name = { record . name }
223+ hardware = { record . hardware } stopPropagation
224+ />
225+ </ Table . Td >
226+ < Table . Td >
227+ < ImageThumbnail
228+ type = "reference" group = { record . group } name = { record . name }
229+ hardware = { record . hardware } stopPropagation
230+ />
231+ </ Table . Td >
232+ < Table . Td >
233+ < ImageThumbnail
234+ type = "difference" group = { record . group } name = { record . name }
235+ hardware = { record . hardware } stopPropagation
236+ />
237+ </ Table . Td >
238+ </ Table . Tr >
251239 )
252240}
253241
@@ -272,6 +260,7 @@ export default function Home() {
272260 const [ allHardware , setAllHardware ] = useState < string [ ] > ( [ ] )
273261 const [ selectedHardware , setSelectedHardware ] = useState < Set < string > > ( new Set ( ) )
274262 const [ adminToken , setAdminToken ] = useState ( '' )
263+ const [ selectedRecord , setSelectedRecord ] = useState < TestRecord | null > ( null )
275264
276265 useEffect ( ( ) => {
277266 fetch ( '/api/test-records' )
@@ -398,12 +387,24 @@ export default function Home() {
398387 { visibleRecords . map ( record => (
399388 < TestRow
400389 key = { `${ record . group } -${ record . name } -${ record . hardware } ` }
390+ onOpen = { setSelectedRecord }
401391 record = { record }
402- onUpdateReference = { updateReference }
403392 />
404393 ) ) }
405394 </ Table . Tbody >
406395 </ Table >
396+
397+ < Modal
398+ opened = { selectedRecord !== null }
399+ onClose = { ( ) => setSelectedRecord ( null ) }
400+ title = { selectedRecord ? `${ selectedRecord . group } / ${ selectedRecord . name } — ${ selectedRecord . hardware } ` : '' }
401+ size = "auto"
402+ scrollAreaComponent = { ScrollArea . Autosize }
403+ >
404+ { selectedRecord && (
405+ < TestHistory record = { selectedRecord } onUpdateReference = { updateReference } />
406+ ) }
407+ </ Modal >
407408 </ Box >
408409 )
409410}
0 commit comments