From 34b547c16a1f0af452f969a3266ab411218693c5 Mon Sep 17 00:00:00 2001 From: Quadcom Date: Thu, 17 Sep 2026 13:26:35 -0400 Subject: [PATCH 1/2] feat(board): filter the public board by status, hiding completed by default The board showed every card regardless of where it had got to, so finished work crowded out what was still live. A status control in the toolbar now narrows the list, defaulting to everything that is not completed. `?s=` mirrors the existing `?b=`: the default view carries no parameter, so a bare board URL is still the default and any other selection is a shareable link. The list and boards endpoints take `status` as one name or a comma-separated list, so "everything still live" is one round trip; a single value keeps the old `eq` behaviour, leaving existing callers untouched. The board counts take the same filter, since a badge reading 8 above a list of 3 reads as a bug. Search is the one place the filter is applied client-side: the endpoint returns a fixed nearest-N set, so filtering narrows those matches rather than searching deeper. Search here is a duplicate check, not a way to browse. Co-Authored-By: Claude Opus 5 (1M context) Claude-Session: https://claude.ai/code/session_01E7qmtvZDwy69A484ArAJ2i --- app/components/board/BoardSearchToolbar.vue | 6 +- app/components/board/BoardStatusPicker.vue | 119 ++++++++++++++++++++ app/pages/index.vue | 86 +++++++++++++- app/stores/board.ts | 17 ++- i18n/locales/en.json | 5 + i18n/locales/zh.json | 5 + server/api/boards/index.get.ts | 6 +- server/api/posts/index.get.ts | 7 +- server/services/boards.ts | 12 +- server/services/feedback-web-queries.ts | 4 +- shared/types/post.ts | 28 +++++ 11 files changed, 274 insertions(+), 21 deletions(-) create mode 100644 app/components/board/BoardStatusPicker.vue diff --git a/app/components/board/BoardSearchToolbar.vue b/app/components/board/BoardSearchToolbar.vue index c9a1fa4d..e4687744 100644 --- a/app/components/board/BoardSearchToolbar.vue +++ b/app/components/board/BoardSearchToolbar.vue @@ -2,6 +2,7 @@ import { useMediaQuery } from '@vueuse/core' const q = defineModel({ default: '' }) const sortBy = defineModel<'top' | 'recent'>('sort', { default: 'recent' }) +const statusFilter = defineModel('status', { default: 'active' }) const emit = defineEmits<{ 'new-request': [] }>() const searchOpen = ref(false) @@ -98,6 +99,7 @@ defineExpose({ reset })
+