From 02ca3549d594d0ad6fd962e37afc6d59885812ad Mon Sep 17 00:00:00 2001 From: Matthieu Date: Tue, 24 Mar 2026 17:19:13 +0100 Subject: [PATCH] fix(search) : disable client-side filtering when server-search is active SearchSelect was filtering results client-side on label only, hiding server results matched by reference. Add serverSearch prop to bypass client filter when the API already handles search. Co-Authored-By: Claude Opus 4.6 (1M context) --- app/components/ComponentStructureAssignmentNode.vue | 3 +++ app/components/ComposantSelect.vue | 1 + app/components/PieceSelect.vue | 1 + app/components/ProductSelect.vue | 1 + app/components/common/SearchSelect.vue | 8 ++++++-- app/components/machine/AddEntityToMachineModal.vue | 1 + 6 files changed, 13 insertions(+), 2 deletions(-) diff --git a/app/components/ComponentStructureAssignmentNode.vue b/app/components/ComponentStructureAssignmentNode.vue index a52349d..23e6340 100644 --- a/app/components/ComponentStructureAssignmentNode.vue +++ b/app/components/ComponentStructureAssignmentNode.vue @@ -23,6 +23,7 @@ :empty-text="componentOptions.length ? 'Aucun résultat' : 'Aucun composant disponible'" :option-label="componentOptionLabel" :option-description="componentOptionDescription" + server-search @search="fetchComponentOptions" @update:modelValue="(value) => { assignment.selectedComponentId = normalizeSelectionValue(value); }" /> @@ -62,6 +63,7 @@ :empty-text="getPieceOptions(pieceAssignment).length ? 'Aucun résultat' : 'Aucune pièce disponible'" :option-label="pieceOptionLabel" :option-description="pieceOptionDescription" + server-search @search="(term) => fetchPieceOptions(pieceAssignment, term)" @update:modelValue="(value) => { pieceAssignment.selectedPieceId = normalizeSelectionValue(value); }" /> @@ -101,6 +103,7 @@ :empty-text="getProductOptions(productAssignment).length ? 'Aucun résultat' : 'Aucun produit disponible'" :option-label="productOptionLabel" :option-description="productOptionDescription" + server-search @search="(term) => fetchProductOptions(productAssignment, term)" @update:modelValue="(value) => { productAssignment.selectedProductId = normalizeSelectionValue(value); }" /> diff --git a/app/components/ComposantSelect.vue b/app/components/ComposantSelect.vue index 5d918b4..480de19 100644 --- a/app/components/ComposantSelect.vue +++ b/app/components/ComposantSelect.vue @@ -10,6 +10,7 @@ option-value="id" option-label="name" :disabled="disabled" + server-search @update:modelValue="updateValue" @search="handleSearch" > diff --git a/app/components/PieceSelect.vue b/app/components/PieceSelect.vue index e2aebc2..2227945 100644 --- a/app/components/PieceSelect.vue +++ b/app/components/PieceSelect.vue @@ -10,6 +10,7 @@ option-value="id" option-label="name" :disabled="disabled" + server-search @update:modelValue="updateValue" @search="handleSearch" > diff --git a/app/components/ProductSelect.vue b/app/components/ProductSelect.vue index c4b15b4..3b3261e 100644 --- a/app/components/ProductSelect.vue +++ b/app/components/ProductSelect.vue @@ -10,6 +10,7 @@ option-value="id" option-label="name" :disabled="disabled" + server-search @update:modelValue="updateValue" @search="handleSearch" > diff --git a/app/components/common/SearchSelect.vue b/app/components/common/SearchSelect.vue index 299d312..f18ab98 100644 --- a/app/components/common/SearchSelect.vue +++ b/app/components/common/SearchSelect.vue @@ -133,6 +133,10 @@ const props = defineProps({ maxVisible: { type: Number, default: 50 + }, + serverSearch: { + type: Boolean, + default: false } }) @@ -150,11 +154,11 @@ const selectedOption = computed(() => { }) const displayedOptions = computed(() => { - const term = searchTerm.value.trim().toLowerCase() const items = baseOptions.value.slice() - const filtered = term + const filtered = (!props.serverSearch && searchTerm.value.trim()) ? items.filter((option) => { + const term = searchTerm.value.trim().toLowerCase() const label = resolveLabel(option).toLowerCase() const description = resolveDescription(option)?.toLowerCase() || '' return label.includes(term) || description.includes(term) diff --git a/app/components/machine/AddEntityToMachineModal.vue b/app/components/machine/AddEntityToMachineModal.vue index f39fc98..3cf8529 100644 --- a/app/components/machine/AddEntityToMachineModal.vue +++ b/app/components/machine/AddEntityToMachineModal.vue @@ -44,6 +44,7 @@ :empty-text="`Aucun ${entityLabelLower} disponible dans cette catégorie`" :option-label="entityOptionLabel" :option-description="entityOptionDescription" + server-search @search="handleEntitySearch" />