From 22032dcff594957d79bebe22ddb1ca7931bea9cc Mon Sep 17 00:00:00 2001 From: TZGyn Date: Sat, 24 Feb 2024 18:22:16 +0800 Subject: [PATCH] update links page to use combobox to filter shorteners --- frontend/bun.lockb | Bin 150120 -> 156236 bytes frontend/package.json | 3 +- .../ui/command/command-dialog.svelte | 23 ++++++ .../ui/command/command-empty.svelte | 12 +++ .../ui/command/command-group.svelte | 18 +++++ .../ui/command/command-input.svelte | 23 ++++++ .../components/ui/command/command-item.svelte | 24 ++++++ .../components/ui/command/command-list.svelte | 15 ++++ .../ui/command/command-separator.svelte | 10 +++ .../ui/command/command-shortcut.svelte | 16 ++++ .../lib/components/ui/command/command.svelte | 22 +++++ .../src/lib/components/ui/command/index.ts | 37 +++++++++ .../src/lib/components/ui/popover/index.ts | 14 ++++ .../ui/popover/popover-content.svelte | 22 +++++ .../src/routes/(app)/links/+page.server.ts | 2 +- frontend/src/routes/(app)/links/+page.svelte | 75 +++++++++++++----- 16 files changed, 293 insertions(+), 23 deletions(-) create mode 100644 frontend/src/lib/components/ui/command/command-dialog.svelte create mode 100644 frontend/src/lib/components/ui/command/command-empty.svelte create mode 100644 frontend/src/lib/components/ui/command/command-group.svelte create mode 100644 frontend/src/lib/components/ui/command/command-input.svelte create mode 100644 frontend/src/lib/components/ui/command/command-item.svelte create mode 100644 frontend/src/lib/components/ui/command/command-list.svelte create mode 100644 frontend/src/lib/components/ui/command/command-separator.svelte create mode 100644 frontend/src/lib/components/ui/command/command-shortcut.svelte create mode 100644 frontend/src/lib/components/ui/command/command.svelte create mode 100644 frontend/src/lib/components/ui/command/index.ts create mode 100644 frontend/src/lib/components/ui/popover/index.ts create mode 100644 frontend/src/lib/components/ui/popover/popover-content.svelte diff --git a/frontend/bun.lockb b/frontend/bun.lockb index 71b8e8800eb4b8f5061410f7b9e7fa3cf41c68d8..12c1b712ce01d0c99755e98d461e9256c71c6b44 100755 GIT binary patch delta 27633 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 diff --git a/frontend/package.json b/frontend/package.json index b65beb3..9062b0d 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -35,8 +35,9 @@ "@types/he": "^1.2.3", "apexcharts": "^3.44.0", "argon2": "^0.31.2", - "bits-ui": "^0.9.8", + "bits-ui": "^0.18.2", "clsx": "^2.0.0", + "cmdk-sv": "^0.0.13", "drizzle-orm": "^0.29.0", "formsnap": "^0.4.1", "he": "^1.2.0", diff --git a/frontend/src/lib/components/ui/command/command-dialog.svelte b/frontend/src/lib/components/ui/command/command-dialog.svelte new file mode 100644 index 0000000..ecbf940 --- /dev/null +++ b/frontend/src/lib/components/ui/command/command-dialog.svelte @@ -0,0 +1,23 @@ + + + + + + + + + diff --git a/frontend/src/lib/components/ui/command/command-empty.svelte b/frontend/src/lib/components/ui/command/command-empty.svelte new file mode 100644 index 0000000..dc74bf5 --- /dev/null +++ b/frontend/src/lib/components/ui/command/command-empty.svelte @@ -0,0 +1,12 @@ + + + + + diff --git a/frontend/src/lib/components/ui/command/command-group.svelte b/frontend/src/lib/components/ui/command/command-group.svelte new file mode 100644 index 0000000..198a3df --- /dev/null +++ b/frontend/src/lib/components/ui/command/command-group.svelte @@ -0,0 +1,18 @@ + + + + + diff --git a/frontend/src/lib/components/ui/command/command-input.svelte b/frontend/src/lib/components/ui/command/command-input.svelte new file mode 100644 index 0000000..cfab3d9 --- /dev/null +++ b/frontend/src/lib/components/ui/command/command-input.svelte @@ -0,0 +1,23 @@ + + +
+ + +
diff --git a/frontend/src/lib/components/ui/command/command-item.svelte b/frontend/src/lib/components/ui/command/command-item.svelte new file mode 100644 index 0000000..1544991 --- /dev/null +++ b/frontend/src/lib/components/ui/command/command-item.svelte @@ -0,0 +1,24 @@ + + + + + diff --git a/frontend/src/lib/components/ui/command/command-list.svelte b/frontend/src/lib/components/ui/command/command-list.svelte new file mode 100644 index 0000000..6b1c915 --- /dev/null +++ b/frontend/src/lib/components/ui/command/command-list.svelte @@ -0,0 +1,15 @@ + + + + + diff --git a/frontend/src/lib/components/ui/command/command-separator.svelte b/frontend/src/lib/components/ui/command/command-separator.svelte new file mode 100644 index 0000000..51aa2da --- /dev/null +++ b/frontend/src/lib/components/ui/command/command-separator.svelte @@ -0,0 +1,10 @@ + + + diff --git a/frontend/src/lib/components/ui/command/command-shortcut.svelte b/frontend/src/lib/components/ui/command/command-shortcut.svelte new file mode 100644 index 0000000..517e9e9 --- /dev/null +++ b/frontend/src/lib/components/ui/command/command-shortcut.svelte @@ -0,0 +1,16 @@ + + + + + diff --git a/frontend/src/lib/components/ui/command/command.svelte b/frontend/src/lib/components/ui/command/command.svelte new file mode 100644 index 0000000..2806759 --- /dev/null +++ b/frontend/src/lib/components/ui/command/command.svelte @@ -0,0 +1,22 @@ + + + + + diff --git a/frontend/src/lib/components/ui/command/index.ts b/frontend/src/lib/components/ui/command/index.ts new file mode 100644 index 0000000..d8a2e7c --- /dev/null +++ b/frontend/src/lib/components/ui/command/index.ts @@ -0,0 +1,37 @@ +import { Command as CommandPrimitive } from "cmdk-sv"; + +import Root from "./command.svelte"; +import Dialog from "./command-dialog.svelte"; +import Empty from "./command-empty.svelte"; +import Group from "./command-group.svelte"; +import Item from "./command-item.svelte"; +import Input from "./command-input.svelte"; +import List from "./command-list.svelte"; +import Separator from "./command-separator.svelte"; +import Shortcut from "./command-shortcut.svelte"; + +const Loading = CommandPrimitive.Loading; + +export { + Root, + Dialog, + Empty, + Group, + Item, + Input, + List, + Separator, + Shortcut, + Loading, + // + Root as Command, + Dialog as CommandDialog, + Empty as CommandEmpty, + Group as CommandGroup, + Item as CommandItem, + Input as CommandInput, + List as CommandList, + Separator as CommandSeparator, + Shortcut as CommandShortcut, + Loading as CommandLoading, +}; diff --git a/frontend/src/lib/components/ui/popover/index.ts b/frontend/src/lib/components/ui/popover/index.ts new file mode 100644 index 0000000..fa05ad0 --- /dev/null +++ b/frontend/src/lib/components/ui/popover/index.ts @@ -0,0 +1,14 @@ +import { Popover as PopoverPrimitive } from "bits-ui"; +import Content from "./popover-content.svelte"; +const Root = PopoverPrimitive.Root; +const Trigger = PopoverPrimitive.Trigger; + +export { + Root, + Content, + Trigger, + // + Root as Popover, + Content as PopoverContent, + Trigger as PopoverTrigger, +}; diff --git a/frontend/src/lib/components/ui/popover/popover-content.svelte b/frontend/src/lib/components/ui/popover/popover-content.svelte new file mode 100644 index 0000000..a6cb199 --- /dev/null +++ b/frontend/src/lib/components/ui/popover/popover-content.svelte @@ -0,0 +1,22 @@ + + + + + diff --git a/frontend/src/routes/(app)/links/+page.server.ts b/frontend/src/routes/(app)/links/+page.server.ts index 7faed2d..a1e1f1a 100644 --- a/frontend/src/routes/(app)/links/+page.server.ts +++ b/frontend/src/routes/(app)/links/+page.server.ts @@ -9,7 +9,7 @@ export const load = (async (event) => { let project_id: number | undefined let selected_project: { value: null | string; label: string } = { value: null, - label: 'None', + label: 'All', } if (project_uuid) { diff --git a/frontend/src/routes/(app)/links/+page.svelte b/frontend/src/routes/(app)/links/+page.svelte index d7874f1..669f5c4 100644 --- a/frontend/src/routes/(app)/links/+page.svelte +++ b/frontend/src/routes/(app)/links/+page.svelte @@ -6,6 +6,8 @@ import * as Card from '$lib/components/ui/card' import * as DropdownMenu from '$lib/components/ui/dropdown-menu' import * as Select from '$lib/components/ui/select' + import * as Command from '$lib/components/ui/command' + import * as Popover from '$lib/components/ui/popover' import { Input } from '$lib/components/ui/input' import { Label } from '$lib/components/ui/label' import { Badge } from '$lib/components/ui/badge' @@ -15,15 +17,16 @@ Loader2, MoreVertical, QrCode, + Check, + ChevronsUpDown, } from 'lucide-svelte' import { goto, invalidateAll } from '$app/navigation' + import { cn } from '$lib/utils' import Qr from '$lib/components/QR.svelte' import AddShortenerDialog from './(component)/AddShortenerDialog.svelte' export let data: PageData - let selectedProject: any = data.selected_project - let dialogOpen = false let editDialogOpen = false @@ -32,6 +35,11 @@ let editShortenerCategory: any = undefined let isEditLoading = false + let open: boolean = false + let selectedProject: any = data.selected_project.label + + $: selectedProject = data.selected_project.label + const openEditDialog = (code: string, link: string) => { editDialogOpen = true editShortenerCode = code @@ -82,26 +90,51 @@
- - - - - - - Project - - None - - {#each data.projects as project} - - {project.name} + + + + + + + + No project found. + + + (open = false)}> + + All + - {/each} - - - - + {#each data.projects as project} + + (open = false)}> + + {project.name} + + + {/each} + + + +
{#if data.shorteners.length > 0}