From 2ea59a47e60a17fdaf7300e65a95462ca9bbd22f Mon Sep 17 00:00:00 2001 From: Noor A Date: Wed, 7 Oct 2026 18:28:32 +0200 Subject: [PATCH 1/4] fix(filters): persistent filter panel, clearer header and search box - panel open state, expanded sections and source categories live in the filters store so they survive Chat <-> Search switches - header: title/chevron as a button, status line with count + clear all always visible; pills hidden on phones when collapsed - filters panel above results on mobile Search (ColumnTemplate filtersFirst prop) - clear-search as a Bulma delete in the text box corner Co-Authored-By: Claude Opus 5.5 --- e2e/search.spec.ts | 4 +- src/components/ColumnTemplate.vue | 9 +- src/components/FiltersComponent.vue | 170 ++++++++++++++---- src/components/TextAreaComponent.vue | 4 +- .../__snapshots__/QandA.spec.ts.snap | 49 ++--- src/components/dropdowns/SourcesSelector.vue | 3 +- src/localisation/en.ts | 2 + src/localisation/fr.ts | 2 + src/stores/filters.ts | 11 +- src/views/SearchSDG.vue | 27 ++- 10 files changed, 207 insertions(+), 74 deletions(-) diff --git a/e2e/search.spec.ts b/e2e/search.spec.ts index 9b931cd..9fd0fb4 100644 --- a/e2e/search.spec.ts +++ b/e2e/search.spec.ts @@ -38,7 +38,9 @@ test.describe('search', () => { test('should select a source', async ({ page }) => { await page.getByText('Fake-Collection').click(); - await expect(page.getByText('fake collection x')).toBeVisible(); + // selected pill + its remove (×) button, labelled "Effacer" + await expect(page.getByText('fake collection')).toBeVisible(); + await expect(page.getByRole('button', { name: 'Effacer', exact: true })).toBeVisible(); await expect(page.getByLabel('fake-collection').locator('span')).toBeChecked(); }); }); diff --git a/src/components/ColumnTemplate.vue b/src/components/ColumnTemplate.vue index bbbde1b..b83b527 100644 --- a/src/components/ColumnTemplate.vue +++ b/src/components/ColumnTemplate.vue @@ -4,6 +4,9 @@ import SidePanelIcon from '@/components/icons/SidePanelIcon.vue'; import { ref, type VNodeRef } from 'vue'; +// filtersFirst: on narrow screens put the right panel above the content instead of below it +defineProps<{ filtersFirst?: boolean }>(); + const scrollerRef = ref(null); const isOpen = ref(true); @@ -12,7 +15,7 @@ const toggleOpen = () => { };