From d31b4ced631dda17b659d62d86a3123a7b2105a9 Mon Sep 17 00:00:00 2001 From: shamoon <4887959+shamoon@users.noreply.github.com> Date: Sat, 19 Apr 2025 22:52:46 -0700 Subject: [PATCH] Title suggestion ui --- .../common/input/text/text.component.html | 6 ++++++ .../common/input/text/text.component.spec.ts | 20 ++++++++++++++----- .../common/input/text/text.component.ts | 14 +++++++++++++ .../document-detail.component.html | 2 +- .../document-detail.component.spec.ts | 10 ++++++++++ 5 files changed, 46 insertions(+), 6 deletions(-) diff --git a/src-ui/src/app/components/common/input/text/text.component.html b/src-ui/src/app/components/common/input/text/text.component.html index 29e5698ad..9451d4f94 100644 --- a/src-ui/src/app/components/common/input/text/text.component.html +++ b/src-ui/src/app/components/common/input/text/text.component.html @@ -15,6 +15,12 @@ @if (hint) { } + @if (getSuggestion()?.length > 0) { + + Suggestion:  + {{getSuggestion()}}  + + }
{{error}}
diff --git a/src-ui/src/app/components/common/input/text/text.component.spec.ts b/src-ui/src/app/components/common/input/text/text.component.spec.ts index c5662b341..539c1eb6b 100644 --- a/src-ui/src/app/components/common/input/text/text.component.spec.ts +++ b/src-ui/src/app/components/common/input/text/text.component.spec.ts @@ -26,10 +26,20 @@ describe('TextComponent', () => { it('should support use of input field', () => { expect(component.value).toBeUndefined() - // TODO: why doesn't this work? - // input.value = 'foo' - // input.dispatchEvent(new Event('change')) - // fixture.detectChanges() - // expect(component.value).toEqual('foo') + input.value = 'foo' + input.dispatchEvent(new Event('input')) + fixture.detectChanges() + expect(component.value).toBe('foo') + }) + + it('should support suggestion', () => { + component.value = 'foo' + component.suggestion = 'foo' + expect(component.getSuggestion()).toBe('') + component.value = 'bar' + expect(component.getSuggestion()).toBe('foo') + component.applySuggestion() + fixture.detectChanges() + expect(component.value).toBe('foo') }) }) diff --git a/src-ui/src/app/components/common/input/text/text.component.ts b/src-ui/src/app/components/common/input/text/text.component.ts index cc06d5bc0..185a1a116 100644 --- a/src-ui/src/app/components/common/input/text/text.component.ts +++ b/src-ui/src/app/components/common/input/text/text.component.ts @@ -4,6 +4,7 @@ import { NG_VALUE_ACCESSOR, ReactiveFormsModule, } from '@angular/forms' +import { RouterLink } from '@angular/router' import { NgxBootstrapIconsModule } from 'ngx-bootstrap-icons' import { SafeHtmlPipe } from 'src/app/pipes/safehtml.pipe' import { AbstractInputComponent } from '../abstract-input' @@ -24,6 +25,7 @@ import { AbstractInputComponent } from '../abstract-input' ReactiveFormsModule, SafeHtmlPipe, NgxBootstrapIconsModule, + RouterLink, ], }) export class TextComponent extends AbstractInputComponent { @@ -33,7 +35,19 @@ export class TextComponent extends AbstractInputComponent { @Input() placeholder: string = '' + @Input() + suggestion: string = '' + constructor() { super() } + + getSuggestion() { + return this.value !== this.suggestion ? this.suggestion : '' + } + + applySuggestion() { + this.value = this.suggestion + this.onChange(this.value) + } } diff --git a/src-ui/src/app/components/document-detail/document-detail.component.html b/src-ui/src/app/components/document-detail/document-detail.component.html index 19d6faabb..eb99cd6b6 100644 --- a/src-ui/src/app/components/document-detail/document-detail.component.html +++ b/src-ui/src/app/components/document-detail/document-detail.component.html @@ -127,7 +127,7 @@ Details
- + diff --git a/src-ui/src/app/components/document-detail/document-detail.component.spec.ts b/src-ui/src/app/components/document-detail/document-detail.component.spec.ts index 345d488eb..d7b1f6069 100644 --- a/src-ui/src/app/components/document-detail/document-detail.component.spec.ts +++ b/src-ui/src/app/components/document-detail/document-detail.component.spec.ts @@ -156,6 +156,16 @@ describe('DocumentDetailComponent', () => { { provide: TagService, useValue: { + getCachedMany: (ids: number[]) => + of( + ids.map((id) => ({ + id, + name: `Tag${id}`, + is_inbox_tag: true, + color: '#ff0000', + text_color: '#000000', + })) + ), listAll: () => of({ count: 3,