77 onCleanup ,
88} from "solid-js" ;
99import { unwrap } from "solid-js/store" ;
10- import { Button , buttonVariants } from "~/components/ui/button" ;
10+ import { Button } from "~/components/ui/button" ;
1111import { createArchive , toConfigBlob } from "~/lib/download" ;
1212import { findPresetByName } from "~/lib/presets" ;
1313import {
@@ -18,13 +18,19 @@ import {
1818 modifyExperiment ,
1919} from "~/lib/store" ;
2020import { ExperimentConfigForm } from "./ExperimentConfigForm" ;
21+ import { ObservationsList } from "./ObservationsList" ;
2122import { PermutationsList } from "./PermutationsList" ;
22- import { MdiCog , MdiContentCopy , MdiDelete , MdiDownload } from "./icons" ;
23+ import {
24+ MdiCog ,
25+ MdiContentCopy ,
26+ MdiDelete ,
27+ MdiDotsHorizontal ,
28+ MdiDownload ,
29+ } from "./icons" ;
2330import {
2431 Card ,
2532 CardContent ,
2633 CardDescription ,
27- CardFooter ,
2834 CardHeader ,
2935 CardTitle ,
3036} from "./ui/card" ;
@@ -40,6 +46,10 @@ import {
4046 DropdownMenu ,
4147 DropdownMenuContent ,
4248 DropdownMenuItem ,
49+ DropdownMenuPortal ,
50+ DropdownMenuSub ,
51+ DropdownMenuSubContent ,
52+ DropdownMenuSubTrigger ,
4353 DropdownMenuTrigger ,
4454} from "./ui/dropdown-menu" ;
4555
@@ -202,27 +212,6 @@ function DownloadExperimentArchive(props: { experiment: Experiment }) {
202212 ) ;
203213}
204214
205- function DownloadExperiment ( props : { experiment : Experiment } ) {
206- return (
207- < DropdownMenu >
208- < DropdownMenuTrigger
209- class = { buttonVariants ( { variant : "outline" } ) }
210- title = "Download"
211- >
212- < MdiDownload />
213- </ DropdownMenuTrigger >
214- < DropdownMenuContent >
215- < DropdownMenuItem >
216- < DownloadExperimentConfiguration experiment = { props . experiment } />
217- </ DropdownMenuItem >
218- < DropdownMenuItem >
219- < DownloadExperimentArchive experiment = { props . experiment } />
220- </ DropdownMenuItem >
221- </ DropdownMenuContent >
222- </ DropdownMenu >
223- ) ;
224- }
225-
226215export function ExperimentCard ( props : {
227216 experiment : Experiment ;
228217 experimentIndex : number ;
@@ -233,57 +222,92 @@ export function ExperimentCard(props: {
233222 const descriptionId = `${ id } -description` ;
234223 return (
235224 < Card
236- class = "w-[380px ]"
225+ class = "min- w-[320px ]"
237226 role = "article"
238227 aria-labelledby = { id }
239228 aria-describedby = { descriptionId }
240229 >
241- < CardHeader >
230+ < CardHeader class = "flex-row items-center justify-between gap-4 py-2" >
231+ { /* Card title and buttons */ }
242232 < CardTitle id = { id } > { experiment ( ) . config . reference . name } </ CardTitle >
243- < CardDescription id = { descriptionId } >
233+ < div class = "flex gap-1" >
234+ < Show
235+ when = { ! experiment ( ) . output . running }
236+ fallback = {
237+ < RunningIndicator progress = { experiment ( ) . output . running } />
238+ }
239+ >
240+ < ExperimentSettingsDialog
241+ experiment = { experiment ( ) }
242+ experimentIndex = { experimentIndex ( ) }
243+ />
244+ < DropdownMenu >
245+ < DropdownMenuTrigger as = { Button } variant = "outline" >
246+ < MdiDotsHorizontal />
247+ </ DropdownMenuTrigger >
248+ < DropdownMenuContent >
249+ < DropdownMenuSub overlap >
250+ < DropdownMenuSubTrigger >
251+ { " " }
252+ < div class = "flex items-end gap-1" >
253+ < MdiDownload />
254+ Download{ " " }
255+ </ div > { " " }
256+ </ DropdownMenuSubTrigger >
257+ < DropdownMenuPortal >
258+ < DropdownMenuSubContent >
259+ < DropdownMenuItem >
260+ < DownloadExperimentConfiguration
261+ experiment = { props . experiment }
262+ />
263+ </ DropdownMenuItem >
264+ < DropdownMenuItem >
265+ < DownloadExperimentArchive
266+ experiment = { props . experiment }
267+ />
268+ </ DropdownMenuItem >
269+ </ DropdownMenuSubContent >
270+ </ DropdownMenuPortal >
271+ </ DropdownMenuSub >
272+ < DropdownMenuItem
273+ class = "flex gap-2"
274+ onSelect = { ( ) => {
275+ duplicateExperiment ( experimentIndex ( ) ) ;
276+ } }
277+ >
278+ < MdiContentCopy />
279+ Duplicate experiment
280+ </ DropdownMenuItem >
281+ < DropdownMenuItem
282+ class = "flex gap-2"
283+ onSelect = { ( ) => {
284+ if (
285+ window . confirm (
286+ "Are you sure you want to delete this experiment?" ,
287+ )
288+ ) {
289+ deleteExperiment ( experimentIndex ( ) ) ;
290+ }
291+ } }
292+ >
293+ < MdiDelete />
294+ Delete experiment
295+ </ DropdownMenuItem >
296+ </ DropdownMenuContent >
297+ </ DropdownMenu >
298+ </ Show >
299+ </ div >
300+ </ CardHeader >
301+ < CardContent class = "text-left" >
302+ < CardDescription class = "pb-4 text-left" id = { descriptionId } >
244303 { experiment ( ) . config . reference . description }
245304 </ CardDescription >
246- </ CardHeader >
247- < CardContent >
248305 < PermutationsList
249306 experiment = { experiment ( ) }
250307 experimentIndex = { experimentIndex ( ) }
251308 />
309+ < ObservationsList observations = { experiment ( ) . config . observations } />
252310 </ CardContent >
253- < CardFooter class = "gap-1" >
254- < Show
255- when = { ! experiment ( ) . output . running }
256- fallback = { < RunningIndicator progress = { experiment ( ) . output . running } /> }
257- >
258- < DownloadExperiment experiment = { experiment ( ) } />
259- < ExperimentSettingsDialog
260- experiment = { experiment ( ) }
261- experimentIndex = { experimentIndex ( ) }
262- />
263- < Button
264- variant = "outline"
265- title = "Duplicate experiment"
266- onClick = { ( ) => duplicateExperiment ( experimentIndex ( ) ) }
267- >
268- < MdiContentCopy />
269- </ Button >
270- < Button
271- variant = "outline"
272- title = "Delete experiment"
273- onClick = { ( ) => {
274- if (
275- window . confirm (
276- "Are you sure you want to delete this experiment?" ,
277- )
278- ) {
279- deleteExperiment ( experimentIndex ( ) ) ;
280- }
281- } }
282- >
283- < MdiDelete />
284- </ Button >
285- </ Show >
286- </ CardFooter >
287311 </ Card >
288312 ) ;
289313}
0 commit comments