Skip to content

Commit 601e45f

Browse files
committed
Added ability to display and remove stack reference links
1 parent 10259ae commit 601e45f

File tree

3 files changed

+89
-14
lines changed

3 files changed

+89
-14
lines changed

src/Exceptionless.Web/ClientApp/src/lib/features/stacks/components/StackCard.svelte

Lines changed: 2 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@
88
import TimeAgo from '$comp/formatters/TimeAgo.svelte';
99
import Muted from '$comp/typography/Muted.svelte';
1010
import { Badge } from '$comp/ui/badge';
11-
import { Button } from '$comp/ui/button';
1211
import * as Card from '$comp/ui/card';
1312
import * as Tooltip from '$comp/ui/tooltip';
1413
import { getProjectCountQuery, getStackCountQuery } from '$features/events/api.svelte';
@@ -20,11 +19,10 @@
2019
import IconCalendar from '~icons/mdi/calendar';
2120
import IconClock from '~icons/mdi/clock';
2221
import IconFilter from '~icons/mdi/filter';
23-
import IconReference from '~icons/mdi/link';
24-
import IconOpenInNew from '~icons/mdi/open-in-new';
2522
import IconUsers from '~icons/mdi/users';
2623
2724
import StackOptionsDropdownMenu from './StackOptionsDropdownMenu.svelte';
25+
import StackReferences from './StackReferences.svelte';
2826
import StackStatusDropdownMenu from './StackStatusDropdownMenu.svelte';
2927
3028
interface Props {
@@ -164,17 +162,7 @@
164162
</div>
165163
{/if}
166164

167-
<!-- TODO: Move to stack grid? -->
168-
{#if stack.references && stack.references.length > 0}
169-
<div class="flex items-center gap-2 text-sm">
170-
<span class="text-blue-500" title="Reference Links"> <IconReference class="size-4" /></span>
171-
{#each stack.references as referenceUrl}
172-
<Button href={referenceUrl} rel="noopener noreferrer" size="sm" target="_blank" title="Open in new window" variant="ghost"
173-
>{referenceUrl} <IconOpenInNew /></Button
174-
>
175-
{/each}
176-
</div>
177-
{/if}
165+
<StackReferences {stack} />
178166
</Card.Content>
179167
</Card.Root>
180168
{/if}
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
<script lang="ts">
2+
import { A, Small } from '$comp/typography';
3+
import Button from '$comp/ui/button/button.svelte';
4+
import IconReference from '~icons/mdi/link';
5+
import IconOpenInNew from '~icons/mdi/open-in-new';
6+
import IconRemove from '~icons/mdi/remove';
7+
8+
import { postRemoveLink } from '../api.svelte';
9+
import { Stack } from '../models';
10+
import RemoveStackReferenceDialog from './dialogs/RemoveStackReferenceDialog.svelte';
11+
12+
interface Props {
13+
stack: Stack;
14+
}
15+
16+
let { stack }: Props = $props();
17+
let openRemoveStackReferenceDialog = $state<boolean>(false);
18+
let referenceToRemove = $state<string>('');
19+
20+
const removeLink = postRemoveLink({
21+
route: {
22+
get id() {
23+
return stack?.id;
24+
}
25+
}
26+
});
27+
28+
function onOpenRemoveStackReferenceDialog(reference: string) {
29+
referenceToRemove = reference;
30+
openRemoveStackReferenceDialog = true;
31+
}
32+
33+
async function removeReference(reference: string) {
34+
await removeLink.mutateAsync(reference);
35+
}
36+
</script>
37+
38+
{#if stack.references?.length > 0}
39+
<ul class="space-y-2">
40+
{#each stack.references as reference (reference)}
41+
<li class="flex items-center gap-2">
42+
<IconReference />
43+
<A href={reference} target="_blank" rel="noopener noreferrer" class="flex items-center gap-2" variant="secondary">
44+
<Small class="truncate">{reference}</Small>
45+
<IconOpenInNew />
46+
</A>
47+
<Button variant="destructive" size="xs" onclick={() => onOpenRemoveStackReferenceDialog(reference)}>
48+
<IconRemove />
49+
</Button>
50+
</li>
51+
{/each}
52+
</ul>
53+
{/if}
54+
55+
<RemoveStackReferenceDialog bind:open={openRemoveStackReferenceDialog} reference={referenceToRemove} remove={removeReference} />
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
<script lang="ts">
2+
import { Code } from '$comp/typography';
3+
import * as AlertDialog from '$comp/ui/alert-dialog';
4+
import { buttonVariants } from '$comp/ui/button';
5+
6+
interface Props {
7+
open: boolean;
8+
reference: string;
9+
remove: (reference: string) => Promise<void>;
10+
}
11+
12+
let { open = $bindable(), reference, remove }: Props = $props();
13+
14+
async function onSubmit() {
15+
await remove(reference);
16+
open = false;
17+
}
18+
</script>
19+
20+
<AlertDialog.Root bind:open>
21+
<AlertDialog.Content>
22+
<AlertDialog.Header>
23+
<AlertDialog.Title>Delete Reference</AlertDialog.Title>
24+
<AlertDialog.Description>Are you sure you want to delete this reference link?</AlertDialog.Description>
25+
</AlertDialog.Header>
26+
<Code>{reference}</Code>
27+
<AlertDialog.Footer>
28+
<AlertDialog.Cancel>Cancel</AlertDialog.Cancel>
29+
<AlertDialog.Action class={buttonVariants({ variant: 'destructive' })} onclick={onSubmit}>Delete Reference Link</AlertDialog.Action>
30+
</AlertDialog.Footer>
31+
</AlertDialog.Content>
32+
</AlertDialog.Root>

0 commit comments

Comments
 (0)