From 49af08d3f6950b7f2ad4c24435e956532b3e941c Mon Sep 17 00:00:00 2001 From: kolaente Date: Wed, 7 Jan 2026 17:21:41 +0100 Subject: [PATCH] feat(filters): add UI for marking saved filters as favorites (#2055) This PR adds UI support for marking saved filters as favorites. The backend already supports the `is_favorite` field for saved filters, but the frontend didn't expose this functionality. Users can now favorite/unfavorite saved filters just like regular projects. --- frontend/src/components/home/Navigation.vue | 2 +- .../home/ProjectsNavigationItem.vue | 20 +++- frontend/src/modelTypes/ISavedFilter.ts | 1 + frontend/src/models/savedFilter.ts | 1 + frontend/src/stores/projects.ts | 37 +++++- .../e2e/project/saved-filter-favorite.spec.ts | 112 ++++++++++++++++++ pkg/models/saved_filters.go | 2 + 7 files changed, 167 insertions(+), 8 deletions(-) create mode 100644 frontend/tests/e2e/project/saved-filter-favorite.spec.ts diff --git a/frontend/src/components/home/Navigation.vue b/frontend/src/components/home/Navigation.vue index 4d3259f95..aedbaae33 100644 --- a/frontend/src/components/home/Navigation.vue +++ b/frontend/src/components/home/Navigation.vue @@ -84,7 +84,7 @@ class="menu" > diff --git a/frontend/src/components/home/ProjectsNavigationItem.vue b/frontend/src/components/home/ProjectsNavigationItem.vue index 532425688..3e9b9688f 100644 --- a/frontend/src/components/home/ProjectsNavigationItem.vue +++ b/frontend/src/components/home/ProjectsNavigationItem.vue @@ -52,7 +52,7 @@ {{ getProjectTitle(project) }} { .filter(p => !p.isArchived) .sort((a, b) => a.position - b.position) }) + +const canToggleFavorite = computed(() => { + // Allow favorite toggle for: + // 1. Regular projects (id > 0) with write permission + // 2. Saved filters (id < -1) - user owns their own filters + if (props.project.id === -1) return false // Favorites pseudo-project + if (props.project.id > 0) { + return props.project.maxPermission !== null && props.project.maxPermission > PERMISSIONS.READ + } + // Saved filters (negative IDs except -1) + return isSavedFilter(props.project) +})