From ed37f82c0f0b618bc7d3fd3f63735ddc611223a5 Mon Sep 17 00:00:00 2001
From: shamoon <4887959+shamoon@users.noreply.github.com>
Date: Sat, 16 Sep 2023 01:09:04 -0700
Subject: [PATCH] Frontend implementation of consumption templates
Testing
---
src-ui/src/app/app-routing.module.ts | 13 +-
src-ui/src/app/app.module.ts | 4 +
.../app-frame/app-frame.component.html | 7 +
...mption-template-edit-dialog.component.html | 73 ++++++++
...mption-template-edit-dialog.component.scss | 0
...ion-template-edit-dialog.component.spec.ts | 63 +++++++
...sumption-template-edit-dialog.component.ts | 88 ++++++++++
.../common/input/tags/tags.component.html | 2 +-
.../common/input/tags/tags.component.ts | 3 +
.../consmption-templates-list.component.html | 33 ++++
.../consmption-templates-list.component.scss | 0
...onsmption-templates-list.component.spec.ts | 166 ++++++++++++++++++
.../consmption-templates-list.component.ts | 111 ++++++++++++
.../consmption-templates.component.html | 1 +
.../consmption-templates.component.scss | 0
.../consmption-templates.component.spec.ts | 21 +++
.../consmption-templates.component.ts | 8 +
.../data/paperless-consumption-template.ts | 29 +++
src-ui/src/app/data/paperless-user.ts | 1 -
.../app/services/permissions.service.spec.ts | 4 +
.../src/app/services/permissions.service.ts | 1 +
.../rest/consumption-template.service.spec.ts | 7 +
.../rest/consumption-template.service.ts | 42 +++++
23 files changed, 674 insertions(+), 3 deletions(-)
create mode 100644 src-ui/src/app/components/common/edit-dialog/consumption-template-edit-dialog/consumption-template-edit-dialog.component.html
create mode 100644 src-ui/src/app/components/common/edit-dialog/consumption-template-edit-dialog/consumption-template-edit-dialog.component.scss
create mode 100644 src-ui/src/app/components/common/edit-dialog/consumption-template-edit-dialog/consumption-template-edit-dialog.component.spec.ts
create mode 100644 src-ui/src/app/components/common/edit-dialog/consumption-template-edit-dialog/consumption-template-edit-dialog.component.ts
create mode 100644 src-ui/src/app/components/manage/consmption-templates-list/consmption-templates-list.component.html
create mode 100644 src-ui/src/app/components/manage/consmption-templates-list/consmption-templates-list.component.scss
create mode 100644 src-ui/src/app/components/manage/consmption-templates-list/consmption-templates-list.component.spec.ts
create mode 100644 src-ui/src/app/components/manage/consmption-templates-list/consmption-templates-list.component.ts
create mode 100644 src-ui/src/app/components/manage/consmption-templates/consmption-templates.component.html
create mode 100644 src-ui/src/app/components/manage/consmption-templates/consmption-templates.component.scss
create mode 100644 src-ui/src/app/components/manage/consmption-templates/consmption-templates.component.spec.ts
create mode 100644 src-ui/src/app/components/manage/consmption-templates/consmption-templates.component.ts
create mode 100644 src-ui/src/app/data/paperless-consumption-template.ts
create mode 100644 src-ui/src/app/services/rest/consumption-template.service.spec.ts
create mode 100644 src-ui/src/app/services/rest/consumption-template.service.ts
diff --git a/src-ui/src/app/app-routing.module.ts b/src-ui/src/app/app-routing.module.ts
index d839274f8..ddedbc763 100644
--- a/src-ui/src/app/app-routing.module.ts
+++ b/src-ui/src/app/app-routing.module.ts
@@ -21,6 +21,7 @@ import {
PermissionAction,
PermissionType,
} from './services/permissions.service'
+import { ConsmptionTemplatesListComponent } from './components/manage/consmption-templates-list/consmption-templates-list.component'
export const routes: Routes = [
{ path: '', redirectTo: 'dashboard', pathMatch: 'full' },
@@ -182,7 +183,17 @@ export const routes: Routes = [
},
},
},
- { path: 'tasks', component: TasksComponent },
+ {
+ path: 'templates',
+ component: ConsmptionTemplatesListComponent,
+ canActivate: [PermissionsGuard],
+ data: {
+ requiredPermission: {
+ action: PermissionAction.View,
+ type: PermissionType.ConsumptionTemplate,
+ },
+ },
+ },
],
},
diff --git a/src-ui/src/app/app.module.ts b/src-ui/src/app/app.module.ts
index f46c06cb9..b5098025d 100644
--- a/src-ui/src/app/app.module.ts
+++ b/src-ui/src/app/app.module.ts
@@ -95,6 +95,8 @@ import { UsernamePipe } from './pipes/username.pipe'
import { LogoComponent } from './components/common/logo/logo.component'
import { IsNumberPipe } from './pipes/is-number.pipe'
import { ShareLinksDropdownComponent } from './components/common/share-links-dropdown/share-links-dropdown.component'
+import { ConsmptionTemplatesListComponent } from './components/manage/consmption-templates-list/consmption-templates-list.component'
+import { ConsumptionTemplateEditDialogComponent } from './components/common/edit-dialog/consumption-template-edit-dialog/consumption-template-edit-dialog.component'
import localeAf from '@angular/common/locales/af'
import localeAr from '@angular/common/locales/ar'
@@ -233,6 +235,8 @@ function initializeApp(settings: SettingsService) {
LogoComponent,
IsNumberPipe,
ShareLinksDropdownComponent,
+ ConsmptionTemplatesListComponent,
+ ConsumptionTemplateEditDialogComponent,
],
imports: [
BrowserModule,
diff --git a/src-ui/src/app/components/app-frame/app-frame.component.html b/src-ui/src/app/components/app-frame/app-frame.component.html
index 3d62c0932..61e716714 100644
--- a/src-ui/src/app/components/app-frame/app-frame.component.html
+++ b/src-ui/src/app/components/app-frame/app-frame.component.html
@@ -155,6 +155,13 @@
Storage paths
+
+
+ Templates
+
+
0 && slimSidebarEnabled" class="badge bg-danger position-absolute top-0 end-0">{{tasksService.failedFileTasks.length}}
diff --git a/src-ui/src/app/components/common/edit-dialog/consumption-template-edit-dialog/consumption-template-edit-dialog.component.html b/src-ui/src/app/components/common/edit-dialog/consumption-template-edit-dialog/consumption-template-edit-dialog.component.html
new file mode 100644
index 000000000..537fb8a9b
--- /dev/null
+++ b/src-ui/src/app/components/common/edit-dialog/consumption-template-edit-dialog/consumption-template-edit-dialog.component.html
@@ -0,0 +1,73 @@
+
diff --git a/src-ui/src/app/components/common/edit-dialog/consumption-template-edit-dialog/consumption-template-edit-dialog.component.scss b/src-ui/src/app/components/common/edit-dialog/consumption-template-edit-dialog/consumption-template-edit-dialog.component.scss
new file mode 100644
index 000000000..e69de29bb
diff --git a/src-ui/src/app/components/common/edit-dialog/consumption-template-edit-dialog/consumption-template-edit-dialog.component.spec.ts b/src-ui/src/app/components/common/edit-dialog/consumption-template-edit-dialog/consumption-template-edit-dialog.component.spec.ts
new file mode 100644
index 000000000..8e30ee8d8
--- /dev/null
+++ b/src-ui/src/app/components/common/edit-dialog/consumption-template-edit-dialog/consumption-template-edit-dialog.component.spec.ts
@@ -0,0 +1,63 @@
+import { HttpClientTestingModule } from '@angular/common/http/testing'
+import { ComponentFixture, TestBed } from '@angular/core/testing'
+import { FormsModule, ReactiveFormsModule } from '@angular/forms'
+import { NgbActiveModal, NgbModule } from '@ng-bootstrap/ng-bootstrap'
+import { NgSelectModule } from '@ng-select/ng-select'
+import { IfOwnerDirective } from 'src/app/directives/if-owner.directive'
+import { IfPermissionsDirective } from 'src/app/directives/if-permissions.directive'
+import { SafeHtmlPipe } from 'src/app/pipes/safehtml.pipe'
+import { NumberComponent } from '../../input/number/number.component'
+import { PermissionsGroupComponent } from '../../input/permissions/permissions-group/permissions-group.component'
+import { PermissionsUserComponent } from '../../input/permissions/permissions-user/permissions-user.component'
+import { SelectComponent } from '../../input/select/select.component'
+import { TagsComponent } from '../../input/tags/tags.component'
+import { TextComponent } from '../../input/text/text.component'
+import { ConsumptionTemplateEditDialogComponent } from './consumption-template-edit-dialog.component'
+import { EditDialogMode } from '../edit-dialog.component'
+
+describe('ConsumptionTemplateEditDialogComponent', () => {
+ let component: ConsumptionTemplateEditDialogComponent
+ let fixture: ComponentFixture
+
+ beforeEach(() => {
+ TestBed.configureTestingModule({
+ declarations: [
+ ConsumptionTemplateEditDialogComponent,
+ IfPermissionsDirective,
+ IfOwnerDirective,
+ SelectComponent,
+ TextComponent,
+ NumberComponent,
+ TagsComponent,
+ PermissionsUserComponent,
+ PermissionsGroupComponent,
+ SafeHtmlPipe,
+ ],
+ providers: [NgbActiveModal],
+ imports: [
+ HttpClientTestingModule,
+ FormsModule,
+ ReactiveFormsModule,
+ NgSelectModule,
+ NgbModule,
+ ],
+ }).compileComponents()
+
+ fixture = TestBed.createComponent(ConsumptionTemplateEditDialogComponent)
+ component = fixture.componentInstance
+
+ fixture.detectChanges()
+ })
+
+ it('should support create and edit modes', () => {
+ component.dialogMode = EditDialogMode.CREATE
+ const createTitleSpy = jest.spyOn(component, 'getCreateTitle')
+ const editTitleSpy = jest.spyOn(component, 'getEditTitle')
+ fixture.detectChanges()
+ expect(createTitleSpy).toHaveBeenCalled()
+ expect(editTitleSpy).not.toHaveBeenCalled()
+ component.dialogMode = EditDialogMode.EDIT
+ fixture.detectChanges()
+ expect(editTitleSpy).toHaveBeenCalled()
+ })
+})
diff --git a/src-ui/src/app/components/common/edit-dialog/consumption-template-edit-dialog/consumption-template-edit-dialog.component.ts b/src-ui/src/app/components/common/edit-dialog/consumption-template-edit-dialog/consumption-template-edit-dialog.component.ts
new file mode 100644
index 000000000..66d48aeef
--- /dev/null
+++ b/src-ui/src/app/components/common/edit-dialog/consumption-template-edit-dialog/consumption-template-edit-dialog.component.ts
@@ -0,0 +1,88 @@
+import { Component } from '@angular/core'
+import { FormGroup, FormControl } from '@angular/forms'
+import { NgbActiveModal } from '@ng-bootstrap/ng-bootstrap'
+import { first } from 'rxjs'
+import { PaperlessConsumptionTemplate } from 'src/app/data/paperless-consumption-template'
+import { PaperlessCorrespondent } from 'src/app/data/paperless-correspondent'
+import { PaperlessDocumentType } from 'src/app/data/paperless-document-type'
+import {
+ MailFilterAttachmentType,
+ MailRuleConsumptionScope,
+ MailAction,
+ MailMetadataTitleOption,
+ MailMetadataCorrespondentOption,
+} from 'src/app/data/paperless-mail-rule'
+import { PaperlessStoragePath } from 'src/app/data/paperless-storage-path'
+import { ConsumptionTemplateService } from 'src/app/services/rest/consumption-template.service'
+import { CorrespondentService } from 'src/app/services/rest/correspondent.service'
+import { DocumentTypeService } from 'src/app/services/rest/document-type.service'
+import { StoragePathService } from 'src/app/services/rest/storage-path.service'
+import { UserService } from 'src/app/services/rest/user.service'
+import { SettingsService } from 'src/app/services/settings.service'
+import { EditDialogComponent } from '../edit-dialog.component'
+
+@Component({
+ selector: 'pngx-consumption-template-edit-dialog',
+ templateUrl: './consumption-template-edit-dialog.component.html',
+ styleUrls: ['./consumption-template-edit-dialog.component.scss'],
+})
+export class ConsumptionTemplateEditDialogComponent extends EditDialogComponent {
+ templates: PaperlessConsumptionTemplate[]
+ correspondents: PaperlessCorrespondent[]
+ documentTypes: PaperlessDocumentType[]
+ storagePaths: PaperlessStoragePath[]
+
+ constructor(
+ service: ConsumptionTemplateService,
+ activeModal: NgbActiveModal,
+ correspondentService: CorrespondentService,
+ documentTypeService: DocumentTypeService,
+ storagePathService: StoragePathService,
+ userService: UserService,
+ settingsService: SettingsService
+ ) {
+ super(service, activeModal, userService, settingsService)
+
+ correspondentService
+ .listAll()
+ .pipe(first())
+ .subscribe((result) => (this.correspondents = result.results))
+
+ documentTypeService
+ .listAll()
+ .pipe(first())
+ .subscribe((result) => (this.documentTypes = result.results))
+
+ storagePathService
+ .listAll()
+ .pipe(first())
+ .subscribe((result) => (this.storagePaths = result.results))
+ }
+
+ getCreateTitle() {
+ return $localize`Create new consumption template`
+ }
+
+ getEditTitle() {
+ return $localize`Edit consumption template`
+ }
+
+ getForm(): FormGroup {
+ return new FormGroup({
+ name: new FormControl(null),
+ account: new FormControl(null),
+ filter_filename: new FormControl(null),
+ filter_path: new FormControl(null),
+ order: new FormControl(null),
+ assign_tags: new FormControl([]),
+ assign_owner: new FormControl(null),
+ assign_document_type: new FormControl(null),
+ assign_correspondent: new FormControl(null),
+ assign_storage_path: new FormControl(null),
+ assign_view_users: new FormControl(null),
+ assign_view_groups: new FormControl(null),
+ assign_change_users: new FormControl(null),
+ assign_change_groups: new FormControl(null),
+ })
+ }
+}
diff --git a/src-ui/src/app/components/common/input/tags/tags.component.html b/src-ui/src/app/components/common/input/tags/tags.component.html
index a49a0de2d..053f13419 100644
--- a/src-ui/src/app/components/common/input/tags/tags.component.html
+++ b/src-ui/src/app/components/common/input/tags/tags.component.html
@@ -1,5 +1,5 @@