From 30c2539766bf2f59011e8c0a55e69f51c1aa964c Mon Sep 17 00:00:00 2001 From: Justin Edmund Date: Mon, 22 Dec 2025 13:58:25 -0800 Subject: [PATCH] move database filters to collapsible row with toggle button - add Filters button next to search input - show filter count badge when filters are active - auto-expand filters when URL has filter params --- .../database/DatabaseGridWithProvider.svelte | 218 +++++++++++++----- 1 file changed, 155 insertions(+), 63 deletions(-) diff --git a/src/lib/components/database/DatabaseGridWithProvider.svelte b/src/lib/components/database/DatabaseGridWithProvider.svelte index 99af5b8e..0d8619be 100644 --- a/src/lib/components/database/DatabaseGridWithProvider.svelte +++ b/src/lib/components/database/DatabaseGridWithProvider.svelte @@ -20,6 +20,8 @@ buildUrlFromFilters, type ParsedFilters } from '$lib/utils/filterParams' + import Button from '$lib/components/ui/Button.svelte' + import Icon from '$lib/components/Icon.svelte' import type { Snippet } from 'svelte' @@ -31,7 +33,13 @@ headerActions?: Snippet } - const { resource, columns, pageSize: initialPageSize = 20, leftActions, headerActions }: Props = $props() + const { + resource, + columns, + pageSize: initialPageSize = 20, + leftActions, + headerActions + }: Props = $props() // Derive entity type from resource const entityType = $derived( @@ -70,6 +78,18 @@ let proficiencyFilters = $state([]) let seasonFilters = $state([]) + // Filter visibility state + let showFilters = $state(false) + + // Check if any filters are active (for button indicator) + const hasActiveFilters = $derived( + elementFilters.length > 0 || + rarityFilters.length > 0 || + seriesFilters.length > 0 || + proficiencyFilters.length > 0 || + seasonFilters.length > 0 + ) + // Handle filter changes from CollectionFilters component function handleFiltersChange(filters: CollectionFilterState) { // Convert series to string[] (weapon series are UUIDs, character series are numbers that need conversion) @@ -271,11 +291,7 @@ if (urlInitialized) return if (resource === 'weapons' && !weaponSeriesQuery.data) return // Wait for weapon series - const parsed = parseFiltersFromUrl( - $page.url.searchParams, - entityType, - weaponSeriesQuery.data - ) + const parsed = parseFiltersFromUrl($page.url.searchParams, entityType, weaponSeriesQuery.data) // Set filter state elementFilters = parsed.element @@ -315,6 +331,17 @@ lastSearchTerm = parsed.searchQuery } + // Show filters panel if any filters are active from URL + if ( + parsed.element.length > 0 || + parsed.rarity.length > 0 || + parsed.proficiency.length > 0 || + parsed.season.length > 0 || + parsed.series.length > 0 + ) { + showFilters = true + } + urlInitialized = true loadData(parsed.page, false) // Don't update URL on initial load } @@ -353,62 +380,96 @@ {@render leftActions()} {/if} - -
{#if headerActions} {@render headerActions()} {/if} + +
-
- {#if loading} -
-
Loading...
-
- {/if} + {#if showFilters} +
+ +
+ {/if} - +
+ {#if loading} +
+
Loading...
+
+ {/if} + + +
+ +