From 75f5144b450ab347ae28c1183d34c031fcaf2e34 Mon Sep 17 00:00:00 2001 From: Gregor Vostrak Date: Wed, 8 Jul 2026 18:06:58 +0200 Subject: [PATCH] use pinned selection instead of fix items on dropdown open so async loaded collections update the dropdown properly --- .../Common/Project/ProjectDropdown.vue | 17 ++++++++++---- .../ui/src/Input/MultiselectDropdown.vue | 23 ++++++++++++------- .../js/packages/ui/src/Tag/TagDropdown.vue | 19 ++++++++++----- 3 files changed, 41 insertions(+), 18 deletions(-) diff --git a/resources/js/Components/Common/Project/ProjectDropdown.vue b/resources/js/Components/Common/Project/ProjectDropdown.vue index c37de296..c5a863f1 100644 --- a/resources/js/Components/Common/Project/ProjectDropdown.vue +++ b/resources/js/Components/Common/Project/ProjectDropdown.vue @@ -37,7 +37,18 @@ const emit = defineEmits(['update:modelValue', 'changed']); const activeClients = computed(() => clients.value.filter((c) => !c.is_archived)); -const sortedProjects = ref([]); +// The selected project is pinned when the dropdown opens so rows don't re-sort while +// the user interacts, but the project list itself stays reactive — projects may still +// be loading (fetchAllPages) when the dropdown opens. +const pinnedProjectId = ref(null); + +const sortedProjects = computed(() => { + return [...projects.value].sort((a, b) => { + const aPinned = pinnedProjectId.value === a.id ? 0 : 1; + const bPinned = pinnedProjectId.value === b.id ? 0 : 1; + return aPinned - bPinned; + }); +}); const shownProjects = computed(() => { return sortedProjects.value.filter((project) => { @@ -65,9 +76,7 @@ watch(open, (isOpen) => { searchInput.value?.$el?.focus(); }); - sortedProjects.value = [...projects.value].sort((iteratingProject) => { - return model.value === iteratingProject.id ? -1 : 1; - }); + pinnedProjectId.value = model.value; } }); diff --git a/resources/js/packages/ui/src/Input/MultiselectDropdown.vue b/resources/js/packages/ui/src/Input/MultiselectDropdown.vue index 9fd314b8..e3306ede 100644 --- a/resources/js/packages/ui/src/Input/MultiselectDropdown.vue +++ b/resources/js/packages/ui/src/Input/MultiselectDropdown.vue @@ -1,6 +1,6 @@