From f3ee820fa4ad453e7791241dce99c67e08eac33c Mon Sep 17 00:00:00 2001 From: shamoon <4887959+shamoon@users.noreply.github.com> Date: Mon, 6 Apr 2026 21:59:11 -0700 Subject: [PATCH] Fix: prevent duplicate parent tag IDs (#12522) --- .../common/input/tags/tags.component.spec.ts | 14 ++++++++++++++ .../components/common/input/tags/tags.component.ts | 8 +++++--- 2 files changed, 19 insertions(+), 3 deletions(-) diff --git a/src-ui/src/app/components/common/input/tags/tags.component.spec.ts b/src-ui/src/app/components/common/input/tags/tags.component.spec.ts index ae543075e..21ca3eeff 100644 --- a/src-ui/src/app/components/common/input/tags/tags.component.spec.ts +++ b/src-ui/src/app/components/common/input/tags/tags.component.spec.ts @@ -205,6 +205,20 @@ describe('TagsComponent', () => { expect(component.value).toEqual([2, 1]) }) + it('should not duplicate parents when adding sibling nested tags', () => { + const root: Tag = { id: 1, name: 'root' } + const parent: Tag = { id: 2, name: 'parent', parent: 1 } + const leafA: Tag = { id: 3, name: 'leaf-a', parent: 2 } + const leafB: Tag = { id: 4, name: 'leaf-b', parent: 2 } + component.tags = [root, parent, leafA, leafB] + + component.value = [] + component.addTag(3) + component.addTag(4) + + expect(component.value).toEqual([3, 2, 1, 4]) + }) + it('should return ancestors from root to parent using getParentChain', () => { const root: Tag = { id: 1, name: 'root' } const mid: Tag = { id: 2, name: 'mid', parent: 1 } diff --git a/src-ui/src/app/components/common/input/tags/tags.component.ts b/src-ui/src/app/components/common/input/tags/tags.component.ts index 4546dabcb..c540ff9d7 100644 --- a/src-ui/src/app/components/common/input/tags/tags.component.ts +++ b/src-ui/src/app/components/common/input/tags/tags.component.ts @@ -153,11 +153,13 @@ export class TagsComponent implements OnInit, ControlValueAccessor { } public onAdd(tag: Tag) { - if (tag.parent) { + if (tag?.parent) { // add all parents recursively const parent = this.getTag(tag.parent) - this.value = [...this.value, parent.id] - this.onAdd(parent) + if (parent && !this.value.includes(parent.id)) { + this.value = [...this.value, parent.id] + this.onAdd(parent) + } } }