From 346dcc3dc08f8baa5adb6f83d03498f4ac305459 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Omar=20S=C3=A1nchez=20Pizarro?=
Date: Tue, 20 Jan 2026 18:20:26 +0100
Subject: [PATCH] Enhance Articles.vue with improved search and filter
functionality. Added search input, active filter chips, and clear filters
button. Refactored layout for better user experience.
---
web/frontend/src/views/Articles.vue | 232 ++++++++++++++++++++++------
1 file changed, 182 insertions(+), 50 deletions(-)
diff --git a/web/frontend/src/views/Articles.vue b/web/frontend/src/views/Articles.vue
index 378657a..3a6829d 100644
--- a/web/frontend/src/views/Articles.vue
+++ b/web/frontend/src/views/Articles.vue
@@ -10,60 +10,163 @@
({{ currentUser }})
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+ Filtros
+
+ {{ activeFiltersCount }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
-
+
+
+
+
+ {{ selectedPlatform === 'wallapop' ? 'Wallapop' : 'Vinted' }}
+
-
- ✕
+
+
+ {{ selectedUsername }}
+
+
+
+
+ {{ selectedWorker }}
+
@@ -124,6 +227,15 @@ import { ref, computed, watch, onMounted, onUnmounted } from 'vue';
import api from '../services/api';
import authService from '../services/auth';
import ArticleCard from '../components/ArticleCard.vue';
+import {
+ FunnelIcon,
+ XMarkIcon,
+ ServerIcon,
+ UserIcon,
+ BriefcaseIcon,
+ ArrowPathIcon,
+ MagnifyingGlassIcon
+} from '@heroicons/vue/24/outline';
const currentUser = ref(authService.getUsername() || null);
const isAdmin = ref(false);
@@ -183,6 +295,26 @@ const filteredArticles = computed(() => {
return allArticles.value;
});
+// Computed para filtros activos
+const hasActiveFilters = computed(() => {
+ return !!(selectedPlatform.value || selectedUsername.value || selectedWorker.value);
+});
+
+const activeFiltersCount = computed(() => {
+ let count = 0;
+ if (selectedPlatform.value) count++;
+ if (selectedUsername.value) count++;
+ if (selectedWorker.value) count++;
+ return count;
+});
+
+function clearAllFilters() {
+ selectedPlatform.value = '';
+ selectedUsername.value = '';
+ selectedWorker.value = '';
+ loadArticles();
+}
+
async function loadArticles(reset = true, silent = false) {