diff --git a/src-ui/src/app/components/common/suggestions-dropdown/suggestions-dropdown.component.html b/src-ui/src/app/components/common/suggestions-dropdown/suggestions-dropdown.component.html
index 8d0ce0547..aca9fd72e 100644
--- a/src-ui/src/app/components/common/suggestions-dropdown/suggestions-dropdown.component.html
+++ b/src-ui/src/app/components/common/suggestions-dropdown/suggestions-dropdown.component.html
@@ -26,7 +26,7 @@
- @if (novelSuggestions === 0 && reusableSuggestions === 0) {
+ @if (novelSuggestions === 0 && fieldSuggestions === 0) {
No novel suggestions
@@ -49,9 +49,9 @@
}
}
- @if (reusableSuggestions > 0) {
+ @if (fieldSuggestions > 0) {
- {reusableSuggestions, plural, =1 {1 existing value suggested below} other {{{reusableSuggestions}} existing values suggested below}}
+ {fieldSuggestions, plural, =1 {1 suggestion available below} other {{{fieldSuggestions}} suggestions available below}}
}
diff --git a/src-ui/src/app/components/common/suggestions-dropdown/suggestions-dropdown.component.spec.ts b/src-ui/src/app/components/common/suggestions-dropdown/suggestions-dropdown.component.spec.ts
index b43c0cba7..7dfaf376f 100644
--- a/src-ui/src/app/components/common/suggestions-dropdown/suggestions-dropdown.component.spec.ts
+++ b/src-ui/src/app/components/common/suggestions-dropdown/suggestions-dropdown.component.spec.ts
@@ -84,7 +84,7 @@ describe('SuggestionsDropdownComponent', () => {
fixture.detectChanges()
expect(fixture.nativeElement.textContent).toContain(
- '2 existing values suggested below'
+ '2 suggestions available below'
)
expect(fixture.nativeElement.textContent).not.toContain(
'No novel suggestions'
@@ -108,7 +108,7 @@ describe('SuggestionsDropdownComponent', () => {
expect(component.totalSuggestions).toBe(4)
expect(fixture.nativeElement.textContent).toContain('Arbitration')
expect(fixture.nativeElement.textContent).toContain(
- '2 existing values suggested below'
+ '2 suggestions available below'
)
})
@@ -125,10 +125,33 @@ describe('SuggestionsDropdownComponent', () => {
})
expect(component.novelSuggestions).toBe(0)
- expect(component.totalSuggestions).toBe(5)
+ expect(component.totalSuggestions).toBe(6)
fixture.componentRef.setInput('appliedStoragePath', 7)
- expect(component.totalSuggestions).toBe(4)
+ expect(component.totalSuggestions).toBe(5)
+ })
+
+ it('should count title and dates as field suggestions without calling them existing values', () => {
+ fixture.componentRef.setInput('aiEnabled', true)
+ fixture.componentRef.setInput('fetchedSources', [SuggestionSource.ML])
+ fixture.componentRef.setInput('suggestions', {
+ title: 'Suggested title',
+ dates: ['2026-01-04', '2026-02-01', '2026-03-01'],
+ correspondents: [1, 2, 3, 4],
+ document_types: [1, 2, 3, 4],
+ tags: [1, 2, 3, 4, 5, 6, 7, 8],
+ })
+ fixture.detectChanges()
+ component.clickSuggest()
+ fixture.detectChanges()
+
+ expect(component.reusableSuggestions).toBe(16)
+ expect(component.fieldSuggestions).toBe(20)
+ expect(component.totalSuggestions).toBe(20)
+ expect(fixture.nativeElement.textContent).toContain(
+ '20 suggestions available below'
+ )
+ expect(fixture.nativeElement.textContent).not.toContain('existing value')
})
it('should show when a completed request returned no suggestions', () => {
@@ -145,6 +168,28 @@ describe('SuggestionsDropdownComponent', () => {
expect(fixture.nativeElement.textContent).toContain('No suggestions')
})
+ it('should wait for all pending responses before showing the empty state', () => {
+ fixture.componentRef.setInput('aiEnabled', true)
+ fixture.componentRef.setInput('source', SuggestionSource.Both)
+ fixture.componentRef.setInput('fetchedSources', [SuggestionSource.ML])
+ fixture.componentRef.setInput('suggestions', { tags: [] })
+ fixture.componentRef.setInput('loading', true)
+ fixture.detectChanges()
+
+ expect(component.noSuggestions).toBeFalsy()
+ expect(fixture.nativeElement.textContent).not.toContain('No suggestions')
+ expect(
+ fixture.nativeElement.querySelector('[role="status"]')
+ ).not.toBeNull()
+
+ fixture.componentRef.setInput('loading', false)
+ fixture.detectChanges()
+
+ expect(component.noSuggestions).toBeTruthy()
+ expect(fixture.nativeElement.textContent).toContain('No suggestions')
+ expect(fixture.nativeElement.querySelector('[role="status"]')).toBeNull()
+ })
+
it('should not show the empty state before a request or with suggestions', () => {
expect(component.noSuggestions).toBeFalsy()
diff --git a/src-ui/src/app/components/common/suggestions-dropdown/suggestions-dropdown.component.ts b/src-ui/src/app/components/common/suggestions-dropdown/suggestions-dropdown.component.ts
index 1a525f131..6290e4867 100644
--- a/src-ui/src/app/components/common/suggestions-dropdown/suggestions-dropdown.component.ts
+++ b/src-ui/src/app/components/common/suggestions-dropdown/suggestions-dropdown.component.ts
@@ -128,7 +128,15 @@ export class SuggestionsDropdownComponent {
}
get totalSuggestions(): number {
- return this.novelSuggestions + this.reusableSuggestions
+ return this.novelSuggestions + this.fieldSuggestions
+ }
+
+ get fieldSuggestions(): number {
+ return (
+ this.reusableSuggestions +
+ (this.suggestions()?.title ? 1 : 0) +
+ (this.suggestions()?.dates?.length ?? 0)
+ )
}
private countUnapplied(suggested: number[], applied: number[]): number {
@@ -139,6 +147,7 @@ export class SuggestionsDropdownComponent {
get noSuggestions(): boolean {
const suggestions = this.suggestions()
return (
+ !this.loading() &&
suggestions != null &&
!suggestions.title &&
!suggestions.tags?.length &&