From fea084096dd469bcc720f27a99eeebca75383650 Mon Sep 17 00:00:00 2001 From: Benjamin Lu Date: Mon, 2 Jun 2025 18:37:20 -0400 Subject: [PATCH 1/9] Update to new card design --- .../content/manager/ManagerDialogContent.vue | 28 ++++-- .../content/manager/packBanner/PackBanner.vue | 41 ++++++++ .../content/manager/packCard/PackCard.vue | 93 ++++++++++++------- .../manager/packCard/PackCardFooter.vue | 33 +++---- 4 files changed, 129 insertions(+), 66 deletions(-) create mode 100644 src/components/dialog/content/manager/packBanner/PackBanner.vue diff --git a/src/components/dialog/content/manager/ManagerDialogContent.vue b/src/components/dialog/content/manager/ManagerDialogContent.vue index f2fe93982f..6aeb18a089 100644 --- a/src/components/dialog/content/manager/ManagerDialogContent.vue +++ b/src/components/dialog/content/manager/ManagerDialogContent.vue @@ -408,19 +408,27 @@ const handleGridContainerClick = (event: MouseEvent) => { const hasMultipleSelections = computed(() => selectedNodePacks.value.length > 1) +// Track the last pack ID for which we've fetched full registry data +const lastFetchedPackId = ref(null) + +// Whenever a single pack is selected, fetch its full info once whenever(selectedNodePack, async () => { - // Cancel any in-flight requests from previously selected node pack getPackById.cancel() - - if (!selectedNodePack.value?.id) return - - // If only a single node pack is selected, fetch full node pack info from registry + const pack = selectedNodePack.value + if (!pack?.id) return if (hasMultipleSelections.value) return - const data = await getPackById.call(selectedNodePack.value.id) - - if (data?.id === selectedNodePack.value?.id) { - // If selected node hasn't changed since request, merge registry & Algolia data - selectedNodePacks.value = [merge(selectedNodePack.value, data)] + // Only fetch if we haven't already for this pack + if (lastFetchedPackId.value === pack.id) return + const data = await getPackById.call(pack.id) + if (data?.id === pack.id) { + lastFetchedPackId.value = pack.id + const mergedPack = merge({}, pack, data) + selectedNodePacks.value = [mergedPack] + // Replace pack in displayPacks so that children receive a fresh prop reference + const idx = displayPacks.value.findIndex((p) => p.id === mergedPack.id) + if (idx !== -1) { + displayPacks.value.splice(idx, 1, mergedPack) + } } }) diff --git a/src/components/dialog/content/manager/packBanner/PackBanner.vue b/src/components/dialog/content/manager/packBanner/PackBanner.vue new file mode 100644 index 0000000000..7e2c2e7100 --- /dev/null +++ b/src/components/dialog/content/manager/packBanner/PackBanner.vue @@ -0,0 +1,41 @@ + + + diff --git a/src/components/dialog/content/manager/packCard/PackCard.vue b/src/components/dialog/content/manager/packCard/PackCard.vue index 5cd3c98a99..75f377070a 100644 --- a/src/components/dialog/content/manager/packCard/PackCard.vue +++ b/src/components/dialog/content/manager/packCard/PackCard.vue @@ -7,19 +7,14 @@ }" :pt="{ body: { class: 'p-0 flex flex-col w-full h-full rounded-2xl gap-0' }, - content: { class: 'flex-1 flex flex-col rounded-2xl' }, - title: { - class: - 'self-stretch w-full px-4 py-3 inline-flex justify-start items-center gap-6' - }, + content: { class: 'flex-1 flex flex-col rounded-2xl min-h-0' }, footer: { class: 'p-0 m-0' } }" >