Skip to content

Commit 7891982

Browse files
Popup menus for tracks and releases
Making things a bit less easy to delete feels like a good idea, as does not having bins everywhere
1 parent 062bd41 commit 7891982

File tree

5 files changed

+85
-5
lines changed

5 files changed

+85
-5
lines changed
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
<svg
2+
xmlns="http://www.w3.org/2000/svg"
3+
width="16"
4+
height="16"
5+
fill="currentColor"
6+
class="bi bi-three-dots"
7+
viewBox="0 0 16 16"
8+
>
9+
<path
10+
d="M3 9.5a1.5 1.5 0 1 1 0-3 1.5 1.5 0 0 1 0 3m5 0a1.5 1.5 0 1 1 0-3 1.5 1.5 0 0 1 0 3m5 0a1.5 1.5 0 1 1 0-3 1.5 1.5 0 0 1 0 3"
11+
/>
12+
</svg>
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
<script lang="ts">
2+
import type { Snippet } from "svelte";
3+
4+
let {
5+
children,
6+
popupMenuOpen = $bindable(),
7+
}: { children: Snippet; popupMenuOpen: boolean } = $props();
8+
</script>
9+
10+
<div class="popup-menu-wrapper">
11+
{@render children()}
12+
<button onclick={() => (popupMenuOpen = false)}>Close</button>
13+
</div>
14+
15+
<style>
16+
.popup-menu-wrapper {
17+
position: fixed;
18+
top: 50%;
19+
left: 50%;
20+
transform: translate(-50%, -50%);
21+
border: 1px solid gray;
22+
padding: 1rem;
23+
border-radius: 4px;
24+
background-color: var(--color-background);
25+
box-shadow: var(--box-shadow);
26+
width: 90%;
27+
max-width: 400px;
28+
display: flex;
29+
flex-direction: column;
30+
gap: 1rem;
31+
}
32+
</style>

dashboard/src/lib/components/views/music/ReleaseInfo.svelte

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
11
<script lang="ts">
2+
import ThreeDotsIcon from "$lib/components/icons/ThreeDotsIcon.svelte";
3+
import PopupWrapper from "$lib/components/layout/PopupWrapper.svelte";
24
import { deleteRelease } from "$lib/remote-functions/music.remote";
35
import { makeImageLink } from "$lib/utils";
46
import type { ReleaseHydrated } from "../../../../../../shared/types/hydrated";
@@ -11,6 +13,8 @@
1113
}: {
1214
release: ReleaseHydrated;
1315
} = $props();
16+
17+
let popupMenuOpen = $state(false);
1418
</script>
1519

1620
<div class="release-info">
@@ -35,11 +39,20 @@
3539
{/each}
3640
</ol>
3741
</div>
38-
<ButtonWrapper onClickFunction={() => deleteRelease(release.id)}>
39-
<BinIcon />
42+
<ButtonWrapper onClickFunction={() => (popupMenuOpen = !popupMenuOpen)}>
43+
<ThreeDotsIcon />
4044
</ButtonWrapper>
4145
</div>
4246

47+
{#if popupMenuOpen}
48+
<PopupWrapper bind:popupMenuOpen>
49+
<div>{release.title}</div>
50+
<ButtonWrapper onClickFunction={() => deleteRelease(release.id)}>
51+
<div class="delete">Delete Release <BinIcon /></div>
52+
</ButtonWrapper>
53+
</PopupWrapper>
54+
{/if}
55+
4356
<style>
4457
.release-info {
4558
display: flex;
@@ -60,4 +73,9 @@
6073
aspect-ratio: 1 / 1;
6174
box-shadow: var(--box-shadow);
6275
}
76+
.delete {
77+
display: flex;
78+
align-items: center;
79+
gap: 0.5rem;
80+
}
6381
</style>

dashboard/src/lib/components/views/music/TrackInfo.svelte

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,15 @@
11
<script lang="ts">
2+
import ThreeDotsIcon from "$lib/components/icons/ThreeDotsIcon.svelte";
3+
import PopupWrapper from "$lib/components/layout/PopupWrapper.svelte";
24
import { deleteTrack } from "$lib/remote-functions/music.remote";
35
import type { Track } from "../../../../../../shared/types/core";
46
import { prettifyDuration } from "../../../../../../shared/utils";
57
import BinIcon from "../../icons/BinIcon.svelte";
68
import ButtonWrapper from "../../layout/ButtonWrapper.svelte";
79
810
const { song }: { song: Track } = $props();
11+
12+
let popupMenuOpen = $state(false);
913
</script>
1014

1115
<div class="song-wrapper">
@@ -15,11 +19,20 @@
1519
<small>{prettifyDuration(song.duration_seconds)}</small>
1620
</div>
1721
</div>
18-
<ButtonWrapper onClickFunction={() => deleteTrack(song.id)}>
19-
<BinIcon />
22+
<ButtonWrapper onClickFunction={() => (popupMenuOpen = !popupMenuOpen)}>
23+
<ThreeDotsIcon />
2024
</ButtonWrapper>
2125
</div>
2226

27+
{#if popupMenuOpen}
28+
<PopupWrapper bind:popupMenuOpen>
29+
<div>{song.title}</div>
30+
<ButtonWrapper onClickFunction={() => deleteTrack(song.id)}>
31+
<div class="delete">Delete Track <BinIcon /></div>
32+
</ButtonWrapper>
33+
</PopupWrapper>
34+
{/if}
35+
2336
<style>
2437
.song-wrapper {
2538
display: flex;
@@ -37,4 +50,9 @@
3750
font-weight: 500;
3851
font-size: 70%;
3952
}
53+
.delete {
54+
display: flex;
55+
align-items: center;
56+
gap: 0.5rem;
57+
}
4058
</style>

dashboard/src/routes/+layout.svelte

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
99
let { children, data } = $props();
1010
11-
let { supabase, session } = $state(data);
11+
let { supabase, session } = $derived(data);
1212
1313
const artists = $derived(data.artists);
1414

0 commit comments

Comments
 (0)