Skip to content

Commit 437c4ef

Browse files
Restyle permutations (#128)
* Move all permutation actions under button with name of permutation Also replace border around permutations with white space * Make name shorter * Add observation list to experiment card * Move delete permutation menu item to bottom and add seperators in menu To make it harder to delete permutation by accident * flex spacing in dropdown * Nicer layout of permuationslist and observationslist * Put experiment actions in card header --------- Co-authored-by: Peter Kalverla <[email protected]>
1 parent 39db9d7 commit 437c4ef

File tree

6 files changed

+250
-168
lines changed

6 files changed

+250
-168
lines changed

apps/class-solid/src/components/Experiment.tsx

Lines changed: 87 additions & 63 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import {
77
onCleanup,
88
} from "solid-js";
99
import { unwrap } from "solid-js/store";
10-
import { Button, buttonVariants } from "~/components/ui/button";
10+
import { Button } from "~/components/ui/button";
1111
import { createArchive, toConfigBlob } from "~/lib/download";
1212
import { findPresetByName } from "~/lib/presets";
1313
import {
@@ -18,13 +18,19 @@ import {
1818
modifyExperiment,
1919
} from "~/lib/store";
2020
import { ExperimentConfigForm } from "./ExperimentConfigForm";
21+
import { ObservationsList } from "./ObservationsList";
2122
import { 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";
2330
import {
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-
226215
export 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
}
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
import { For, Show } from "solid-js";
2+
import type { Observation } from "~/lib/experiment_config";
3+
4+
export function ObservationsList(props: {
5+
observations: Observation[] | undefined;
6+
}) {
7+
return (
8+
<Show when={props.observations !== undefined}>
9+
<section aria-label="observations" class="justify-self-center">
10+
<h2 class="text-lg">Observations</h2>
11+
<ul class="max-h-40 overflow-auto py-2">
12+
<For each={props.observations}>
13+
{(obs) => (
14+
<li class="mb-1 flex flex-row items-center justify-between border-l-4 px-2 py-1 shadow">
15+
{obs.name}
16+
</li>
17+
)}
18+
</For>
19+
</ul>
20+
</section>
21+
</Show>
22+
);
23+
}

0 commit comments

Comments
 (0)