Feature: consumption templates (#4196)

* Initial implementation of consumption templates

* Frontend implementation of consumption templates

Testing

* Support consumption template source

* order templates, automatically add permissions

* Support title assignment in consumption templates

* Refactoring, filters to and, show sources on list

Show sources on template list, update some translation strings

Make filters and

minor testing

* Update strings

* Only update django-multiselectfield

* Basic docs, document some methods

* Improve testing coverage, template multi-assignment merges
This commit is contained in:
shamoon 2023-09-22 16:53:13 -07:00 committed by GitHub
parent 86d223fd93
commit 9712ac109d
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
51 changed files with 3250 additions and 444 deletions

View file

@ -0,0 +1,109 @@
import { Component, OnInit } from '@angular/core'
import { ConsumptionTemplateService } from 'src/app/services/rest/consumption-template.service'
import { ComponentWithPermissions } from '../../with-permissions/with-permissions.component'
import { Subject, takeUntil } from 'rxjs'
import { PaperlessConsumptionTemplate } from 'src/app/data/paperless-consumption-template'
import { NgbModal } from '@ng-bootstrap/ng-bootstrap'
import { ToastService } from 'src/app/services/toast.service'
import { PermissionsService } from 'src/app/services/permissions.service'
import {
ConsumptionTemplateEditDialogComponent,
DOCUMENT_SOURCE_OPTIONS,
} from '../../common/edit-dialog/consumption-template-edit-dialog/consumption-template-edit-dialog.component'
import { ConfirmDialogComponent } from '../../common/confirm-dialog/confirm-dialog.component'
import { EditDialogMode } from '../../common/edit-dialog/edit-dialog.component'
@Component({
selector: 'pngx-consumption-templates-list',
templateUrl: './consumption-templates-list.component.html',
styleUrls: ['./consumption-templates-list.component.scss'],
})
export class ConsumptionTemplatesListComponent
extends ComponentWithPermissions
implements OnInit
{
public templates: PaperlessConsumptionTemplate[] = []
private unsubscribeNotifier: Subject<any> = new Subject()
constructor(
private consumptionTemplateService: ConsumptionTemplateService,
public permissionsService: PermissionsService,
private modalService: NgbModal,
private toastService: ToastService
) {
super()
}
ngOnInit() {
this.reload()
}
reload() {
this.consumptionTemplateService
.listAll()
.pipe(takeUntil(this.unsubscribeNotifier))
.subscribe((r) => {
this.templates = r.results
})
}
getSourceList(template: PaperlessConsumptionTemplate): string {
return template.sources
.map((id) => DOCUMENT_SOURCE_OPTIONS.find((s) => s.id === id).name)
.join(', ')
}
editTemplate(rule: PaperlessConsumptionTemplate) {
const modal = this.modalService.open(
ConsumptionTemplateEditDialogComponent,
{
backdrop: 'static',
size: 'xl',
}
)
modal.componentInstance.dialogMode = rule
? EditDialogMode.EDIT
: EditDialogMode.CREATE
modal.componentInstance.object = rule
modal.componentInstance.succeeded
.pipe(takeUntil(this.unsubscribeNotifier))
.subscribe((newTemplate) => {
this.toastService.showInfo(
$localize`Saved template "${newTemplate.name}".`
)
this.consumptionTemplateService.clearCache()
this.reload()
})
modal.componentInstance.failed
.pipe(takeUntil(this.unsubscribeNotifier))
.subscribe((e) => {
this.toastService.showError($localize`Error saving template.`, e)
})
}
deleteTemplate(rule: PaperlessConsumptionTemplate) {
const modal = this.modalService.open(ConfirmDialogComponent, {
backdrop: 'static',
})
modal.componentInstance.title = $localize`Confirm delete template`
modal.componentInstance.messageBold = $localize`This operation will permanently delete this template.`
modal.componentInstance.message = $localize`This operation cannot be undone.`
modal.componentInstance.btnClass = 'btn-danger'
modal.componentInstance.btnCaption = $localize`Proceed`
modal.componentInstance.confirmClicked.subscribe(() => {
modal.componentInstance.buttonsEnabled = false
this.consumptionTemplateService.delete(rule).subscribe({
next: () => {
modal.close()
this.toastService.showInfo($localize`Deleted template`)
this.consumptionTemplateService.clearCache()
this.reload()
},
error: (e) => {
this.toastService.showError($localize`Error deleting template.`, e)
},
})
})
}
}