From d2e92134cc539c734fbdfe178fd5b7e09518084f Mon Sep 17 00:00:00 2001 From: Denis Bykhov Date: Mon, 6 Jul 2026 10:08:03 +0500 Subject: [PATCH] fix: deduplicate object and document lists in DocTable and RelationEditor to prevent rendering issues (#10958) Signed-off-by: Denis Bykhov --- .../src/components/DocTable.svelte | 19 ++++++++++++++--- .../src/components/RelationEditor.svelte | 21 +++++++++++++++---- 2 files changed, 33 insertions(+), 7 deletions(-) diff --git a/plugins/view-resources/src/components/DocTable.svelte b/plugins/view-resources/src/components/DocTable.svelte index e2de1c218a..653b03e78d 100644 --- a/plugins/view-resources/src/components/DocTable.svelte +++ b/plugins/view-resources/src/components/DocTable.svelte @@ -47,7 +47,20 @@ const refs: HTMLElement[] = [] - $: refs.length = objects.length + $: uniqueObjects = deduplicate(objects) + + function deduplicate (list: Doc[] | undefined): Doc[] { + if (!list) return [] + const seen = new Set() + return list.filter((item) => { + if (item?._id == null) return false + if (seen.has(item._id)) return false + seen.add(item._id) + return true + }) + } + + $: refs.length = uniqueObjects.length $: viewlet = getViewlet(_class) @@ -210,9 +223,9 @@ {/if} - {#if objects.length > 0} + {#if uniqueObjects.length > 0} - {#each objects as object, row (object._id)} + {#each uniqueObjects as object, row (object._id)} () + return list.filter((item) => { + if (item?._id == null) return false + if (seen.has(item._id)) return false + seen.add(item._id) + return true + }) + } + function getCreate (): ObjectCreate | undefined { const factory = client.getHierarchy().classHierarchyMixin(_class, view.mixin.ObjectFactory) if (factory) { @@ -53,7 +66,7 @@ function add (): void { const create = getCreate() const isVersionable = client.getHierarchy().classHierarchyMixin(_class, core.mixin.VersionableClass) !== undefined - const baseQuery = { _id: { $nin: docs.map((p) => p._id) } } + const baseQuery = { _id: { $nin: uniqueDocs.map((p) => p._id) } } const docQuery = isVersionable ? { isLatest: true, ...baseQuery } : baseQuery showPopup( ObjectBoxPopup, @@ -120,7 +133,7 @@ return direction === 'B' } - $: allowToCreate = isAllowedToCreate(association, docs, direction) + $: allowToCreate = isAllowedToCreate(association, uniqueDocs, direction) $: classLabel = client.getHierarchy().getClass(_class).label @@ -139,9 +152,9 @@ - {#if docs?.length > 0 && config != null} + {#if uniqueDocs?.length > 0 && config != null} - + {:else if !readonly}