diff --git a/apps/uload/apps/web/package.json b/apps/uload/apps/web/package.json index d979caf0e..6b7f37661 100644 --- a/apps/uload/apps/web/package.json +++ b/apps/uload/apps/web/package.json @@ -41,6 +41,7 @@ "@manacore/shared-auth-stores": "workspace:*", "@manacore/shared-auth-ui": "workspace:*", "@manacore/shared-branding": "workspace:*", + "@manacore/shared-uload": "workspace:*", "@manacore/shared-ui": "workspace:*", "lucide-svelte": "^0.539.0", "svelte-i18n": "^4.0.1", diff --git a/apps/uload/apps/web/src/lib/data/local-store.ts b/apps/uload/apps/web/src/lib/data/local-store.ts index 03dea8f4e..27adec1b0 100644 --- a/apps/uload/apps/web/src/lib/data/local-store.ts +++ b/apps/uload/apps/web/src/lib/data/local-store.ts @@ -23,6 +23,7 @@ export interface LocalLink extends BaseRecord { utmCampaign?: string | null; folderId?: string | null; order: number; + source?: string | null; } export interface LocalTag extends BaseRecord { @@ -66,6 +67,7 @@ export const uloadStore = createLocalStore({ 'folderId', 'order', 'clickCount', + 'source', '[folderId+order]', '[isActive+order]', ], diff --git a/apps/uload/apps/web/src/routes/(app)/my/links/+page.svelte b/apps/uload/apps/web/src/routes/(app)/my/links/+page.svelte index 40bb7e4d3..ae293fa65 100644 --- a/apps/uload/apps/web/src/routes/(app)/my/links/+page.svelte +++ b/apps/uload/apps/web/src/routes/(app)/my/links/+page.svelte @@ -13,6 +13,7 @@ Trash, X, } from '@manacore/shared-icons'; + import { APP_SOURCE_LABELS } from '@manacore/shared-uload'; const QR_API = 'https://api.qrserver.com/v1/create-qr-code'; @@ -29,6 +30,16 @@ let searchQuery = $state(''); let selectedStatus = $state<'all' | 'active' | 'inactive'>('all'); let selectedFolderId = $state(null); + let selectedSource = $state(null); + + // Unique sources for filter dropdown + let availableSources = $derived.by(() => { + const sources = new Set(); + for (const link of links.value ?? []) { + if (link.source) sources.add(link.source); + } + return [...sources].sort(); + }); // Create form state let showCreateForm = $state(false); @@ -78,6 +89,7 @@ if (selectedStatus === 'active') result = result.filter((l) => l.isActive); if (selectedStatus === 'inactive') result = result.filter((l) => !l.isActive); if (selectedFolderId) result = result.filter((l) => l.folderId === selectedFolderId); + if (selectedSource) result = result.filter((l) => l.source === selectedSource); return result; }); @@ -437,6 +449,14 @@ {/each} {/if} + {#if availableSources.length > 0} + + {/if} @@ -515,6 +535,13 @@ > /{link.shortCode} + {#if link.source} + {APP_SOURCE_LABELS[link.source] || link.source} + {/if} {#if link.utmSource || link.utmMedium || link.utmCampaign}