From 90a58dde185b9525303ab96541ae415ccf86127f Mon Sep 17 00:00:00 2001
From: shamoon <4887959+shamoon@users.noreply.github.com>
Date: Wed, 25 Feb 2026 17:25:36 -0800
Subject: [PATCH] Fix: separate displayed and API collection sizes for tags
(#12170)
---
.../management-list/management-list.component.html | 4 ++--
.../management-list.component.spec.ts | 5 +++--
.../management-list/management-list.component.ts | 13 ++++++++++++-
.../management-list/tag-list/tag-list.component.ts | 11 +++++++++++
4 files changed, 28 insertions(+), 5 deletions(-)
diff --git a/src-ui/src/app/components/manage/document-attributes/management-list/management-list.component.html b/src-ui/src/app/components/manage/document-attributes/management-list/management-list.component.html
index e16956f94..14a847ae6 100644
--- a/src-ui/src/app/components/manage/document-attributes/management-list/management-list.component.html
+++ b/src-ui/src/app/components/manage/document-attributes/management-list/management-list.component.html
@@ -62,9 +62,9 @@
@if (!loading || data.length > 0) {
- @if (collectionSize > 0) {
+ @if (displayCollectionSize > 0) {
- {collectionSize, plural, =1 {One {{typeName}}} other {{{collectionSize || 0}} total {{typeNamePlural}}}}
+ {displayCollectionSize, plural, =1 {One {{typeName}}} other {{{displayCollectionSize || 0}} total {{typeNamePlural}}}}
@if (selectedObjects.size > 0) {
({{selectedObjects.size}} selected)
}
diff --git a/src-ui/src/app/components/manage/document-attributes/management-list/management-list.component.spec.ts b/src-ui/src/app/components/manage/document-attributes/management-list/management-list.component.spec.ts
index 48b567752..437c6aa26 100644
--- a/src-ui/src/app/components/manage/document-attributes/management-list/management-list.component.spec.ts
+++ b/src-ui/src/app/components/manage/document-attributes/management-list/management-list.component.spec.ts
@@ -231,7 +231,7 @@ describe('ManagementListComponent', () => {
expect(reloadSpy).toHaveBeenCalled()
})
- it('should use the all list length for collection size when provided', fakeAsync(() => {
+ it('should use API count for pagination and all ids for displayed total', fakeAsync(() => {
jest.spyOn(tagService, 'listFiltered').mockReturnValueOnce(
of({
count: 1,
@@ -243,7 +243,8 @@ describe('ManagementListComponent', () => {
component.reloadData()
tick(100)
- expect(component.collectionSize).toBe(3)
+ expect(component.collectionSize).toBe(1)
+ expect(component.displayCollectionSize).toBe(3)
}))
it('should support quick filter for objects', () => {
diff --git a/src-ui/src/app/components/manage/document-attributes/management-list/management-list.component.ts b/src-ui/src/app/components/manage/document-attributes/management-list/management-list.component.ts
index e53664520..3738f491c 100644
--- a/src-ui/src/app/components/manage/document-attributes/management-list/management-list.component.ts
+++ b/src-ui/src/app/components/manage/document-attributes/management-list/management-list.component.ts
@@ -27,6 +27,7 @@ import {
MatchingModel,
} from 'src/app/data/matching-model'
import { ObjectWithPermissions } from 'src/app/data/object-with-permissions'
+import { Results } from 'src/app/data/results'
import { SETTINGS_KEYS } from 'src/app/data/ui-settings'
import {
SortableDirective,
@@ -94,6 +95,7 @@ export abstract class ManagementListComponent
public page = 1
public collectionSize = 0
+ public displayCollectionSize = 0
public sortField: string
public sortReverse: boolean
@@ -147,6 +149,14 @@ export abstract class ManagementListComponent
return data
}
+ protected getCollectionSize(results: Results): number {
+ return results.all?.length ?? results.count
+ }
+
+ protected getDisplayCollectionSize(results: Results): number {
+ return this.getCollectionSize(results)
+ }
+
getDocumentCount(object: MatchingModel): number {
return (
object.document_count ??
@@ -177,7 +187,8 @@ export abstract class ManagementListComponent
tap((c) => {
this.unfilteredData = c.results
this.data = this.filterData(c.results)
- this.collectionSize = c.all?.length ?? c.count
+ this.collectionSize = this.getCollectionSize(c)
+ this.displayCollectionSize = this.getDisplayCollectionSize(c)
this.allIDs = c.all
}),
delay(100)
diff --git a/src-ui/src/app/components/manage/document-attributes/management-list/tag-list/tag-list.component.ts b/src-ui/src/app/components/manage/document-attributes/management-list/tag-list/tag-list.component.ts
index f221fd572..0bbc638a3 100644
--- a/src-ui/src/app/components/manage/document-attributes/management-list/tag-list/tag-list.component.ts
+++ b/src-ui/src/app/components/manage/document-attributes/management-list/tag-list/tag-list.component.ts
@@ -9,6 +9,7 @@ import {
import { NgxBootstrapIconsModule } from 'ngx-bootstrap-icons'
import { TagEditDialogComponent } from 'src/app/components/common/edit-dialog/tag-edit-dialog/tag-edit-dialog.component'
import { FILTER_HAS_TAGS_ALL } from 'src/app/data/filter-rule-type'
+import { Results } from 'src/app/data/results'
import { Tag } from 'src/app/data/tag'
import { IfPermissionsDirective } from 'src/app/directives/if-permissions.directive'
import { SortableDirective } from 'src/app/directives/sortable.directive'
@@ -76,6 +77,16 @@ export class TagListComponent extends ManagementListComponent {
return data.filter((tag) => !tag.parent || !availableIds.has(tag.parent))
}
+ protected override getCollectionSize(results: Results): number {
+ // Tag list pages are requested with is_root=true (when unfiltered), so
+ // pagination must follow root count even though `all` includes descendants
+ return results.count
+ }
+
+ protected override getDisplayCollectionSize(results: Results): number {
+ return super.getCollectionSize(results)
+ }
+
protected override getSelectableIDs(tags: Tag[]): number[] {
const ids: number[] = []
for (const tag of tags.filter(Boolean)) {