From 6ed740756e9e87c9ecefd4a0cbe16b1a1313243f Mon Sep 17 00:00:00 2001 From: shamoon <4887959+shamoon@users.noreply.github.com> Date: Tue, 31 Oct 2023 23:10:30 -0700 Subject: [PATCH] Frontend support for boolean + url custom fields --- src-ui/src/app/app.module.ts | 2 ++ .../common/input/check/check.component.html | 22 +++++++++--- .../common/input/url/url.component.html | 19 ++++++++++ .../common/input/url/url.component.scss | 0 .../common/input/url/url.component.spec.ts | 36 +++++++++++++++++++ .../common/input/url/url.component.ts | 21 +++++++++++ .../document-detail.component.html | 9 +++-- .../document-detail.component.spec.ts | 2 +- .../document-detail.component.ts | 14 +++----- 9 files changed, 108 insertions(+), 17 deletions(-) create mode 100644 src-ui/src/app/components/common/input/url/url.component.html create mode 100644 src-ui/src/app/components/common/input/url/url.component.scss create mode 100644 src-ui/src/app/components/common/input/url/url.component.spec.ts create mode 100644 src-ui/src/app/components/common/input/url/url.component.ts diff --git a/src-ui/src/app/app.module.ts b/src-ui/src/app/app.module.ts index ff511ae27..1967a3f78 100644 --- a/src-ui/src/app/app.module.ts +++ b/src-ui/src/app/app.module.ts @@ -39,6 +39,7 @@ import { NgxFileDropModule } from 'ngx-file-drop' import { TextComponent } from './components/common/input/text/text.component' import { SelectComponent } from './components/common/input/select/select.component' import { CheckComponent } from './components/common/input/check/check.component' +import { UrlComponent } from './components/common/input/url/url.component' import { PasswordComponent } from './components/common/input/password/password.component' import { SaveViewConfigDialogComponent } from './components/document-list/save-view-config-dialog/save-view-config-dialog.component' import { TagsComponent } from './components/common/input/tags/tags.component' @@ -203,6 +204,7 @@ function initializeApp(settings: SettingsService) { TextComponent, SelectComponent, CheckComponent, + UrlComponent, PasswordComponent, SaveViewConfigDialogComponent, TagsComponent, diff --git a/src-ui/src/app/components/common/input/check/check.component.html b/src-ui/src/app/components/common/input/check/check.component.html index 51d5250b4..230a6d02b 100644 --- a/src-ui/src/app/components/common/input/check/check.component.html +++ b/src-ui/src/app/components/common/input/check/check.component.html @@ -1,5 +1,19 @@ -
- - -
{{hint}}
+
+
+
+ + +
+
+
+ + +
{{hint}}
+
+
+
diff --git a/src-ui/src/app/components/common/input/url/url.component.html b/src-ui/src/app/components/common/input/url/url.component.html new file mode 100644 index 000000000..010d8d9cb --- /dev/null +++ b/src-ui/src/app/components/common/input/url/url.component.html @@ -0,0 +1,19 @@ +
+
+
+ + +
+
+ + +
+ {{error}} +
+
+
+
diff --git a/src-ui/src/app/components/common/input/url/url.component.scss b/src-ui/src/app/components/common/input/url/url.component.scss new file mode 100644 index 000000000..e69de29bb diff --git a/src-ui/src/app/components/common/input/url/url.component.spec.ts b/src-ui/src/app/components/common/input/url/url.component.spec.ts new file mode 100644 index 000000000..33eb96ec5 --- /dev/null +++ b/src-ui/src/app/components/common/input/url/url.component.spec.ts @@ -0,0 +1,36 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing' +import { + FormsModule, + ReactiveFormsModule, + NG_VALUE_ACCESSOR, +} from '@angular/forms' +import { UrlComponent } from './url.component' + +describe('TextComponent', () => { + let component: UrlComponent + let fixture: ComponentFixture + let input: HTMLInputElement + + beforeEach(async () => { + TestBed.configureTestingModule({ + declarations: [UrlComponent], + providers: [], + imports: [FormsModule, ReactiveFormsModule], + }).compileComponents() + + fixture = TestBed.createComponent(UrlComponent) + fixture.debugElement.injector.get(NG_VALUE_ACCESSOR) + component = fixture.componentInstance + fixture.detectChanges() + input = component.inputField.nativeElement + }) + + it('should support use of input field', () => { + expect(component.value).toBeUndefined() + // TODO: why doesnt this work? + // input.value = 'foo' + // input.dispatchEvent(new Event('change')) + // fixture.detectChanges() + // expect(component.value).toEqual('foo') + }) +}) diff --git a/src-ui/src/app/components/common/input/url/url.component.ts b/src-ui/src/app/components/common/input/url/url.component.ts new file mode 100644 index 000000000..c0c48ea4e --- /dev/null +++ b/src-ui/src/app/components/common/input/url/url.component.ts @@ -0,0 +1,21 @@ +import { Component, forwardRef } from '@angular/core' +import { NG_VALUE_ACCESSOR } from '@angular/forms' +import { AbstractInputComponent } from '../abstract-input' + +@Component({ + providers: [ + { + provide: NG_VALUE_ACCESSOR, + useExisting: forwardRef(() => UrlComponent), + multi: true, + }, + ], + selector: 'pngx-input-url', + templateUrl: './url.component.html', + styleUrls: ['./url.component.scss'], +}) +export class UrlComponent extends AbstractInputComponent { + constructor() { + super() + } +} 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 f81f96f26..4012bb7ad 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 @@ -102,9 +102,12 @@
- - - + + + + + +
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 aee093a57..a76b7e816 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 @@ -847,7 +847,7 @@ describe('DocumentDetailComponent', () => { initNormally() const initialLength = doc.custom_fields.length expect(component.customFieldFormFields).toHaveLength(initialLength) - component.removeField({ title: 'Field 1' } as any) + component.removeField(doc.custom_fields[0]) fixture.detectChanges() expect(component.document.custom_fields).toHaveLength(initialLength - 1) expect(component.customFieldFormFields).toHaveLength(initialLength - 1) diff --git a/src-ui/src/app/components/document-detail/document-detail.component.ts b/src-ui/src/app/components/document-detail/document-detail.component.ts index d36420f59..1318c14f7 100644 --- a/src-ui/src/app/components/document-detail/document-detail.component.ts +++ b/src-ui/src/app/components/document-detail/document-detail.component.ts @@ -68,7 +68,6 @@ import { PaperlessCustomFieldDataType, } from 'src/app/data/paperless-custom-field' import { PaperlessCustomFieldInstance } from 'src/app/data/paperless-custom-field-instance' -import { AbstractInputComponent } from '../common/input/abstract-input' enum DocumentDetailNavIDs { Details = 1, @@ -864,14 +863,11 @@ export class DocumentDetailComponent this.updateFormForCustomFields(true) } - removeField(input: AbstractInputComponent) { - // ok for now as custom field name unique is a constraint - const customFieldIndex = this.document.custom_fields.findIndex( - (f) => f.field.name === input.title + removeField(fieldInstance: PaperlessCustomFieldInstance) { + this.document.custom_fields.splice( + this.document.custom_fields.indexOf(fieldInstance), + 1 ) - if (customFieldIndex > -1) { - this.document.custom_fields.splice(customFieldIndex, 1) - this.updateFormForCustomFields(true) - } + this.updateFormForCustomFields(true) } }