Working mail rule & account edit

This commit is contained in:
Michael Shamoon 2022-11-08 12:18:47 -08:00
parent 997bff4917
commit 18ad9bcbf2
6 changed files with 72 additions and 47 deletions

View File

@ -9,15 +9,16 @@
<div class="col">
<app-input-text i18n-title title="Name" formControlName="name" [error]="error?.name"></app-input-text>
<app-input-text i18n-title title="Order" formControlName="order" [error]="error?.order"></app-input-text>
<app-input-text i18n-title title="Account" formControlName="account" [error]="error?.account"></app-input-text>
<app-input-select i18n-title title="Account" [items]="accounts" formControlName="account"></app-input-select>
<app-input-text i18n-title title="Folder" formControlName="folder" [error]="error?.folder"></app-input-text>
<app-input-text i18n-title title="Filter from" formControlName="filter_from" [error]="error?.filter_from"></app-input-text>
<app-input-text i18n-title title="Filter body" formControlName="filter_body" [error]="error?.filter_body"></app-input-text>
<app-input-text i18n-title title="Filter attachment filename" formControlName="filter_attachment_filename" [error]="error?.filter_attachment_filename"></app-input-text>
</div>
<div class="col">
<app-input-number i18n-title title="Maximum age" formControlName="maximum_age" [error]="error?.maximum_age"></app-input-number>
<app-input-select i18n-title title="Attachment type" [items]="attachmentTypeOptions" formControlName="attachment_type"></app-input-select>
</div>
<div class="col">
<app-input-text i18n-title title="Filter from" formControlName="filter_from" [error]="error?.filter_from"></app-input-text>
<app-input-text i18n-title title="Filter subject" formControlName="filter_subject" [error]="error?.filter_subject"></app-input-text>
<app-input-text i18n-title title="Filter body" formControlName="filter_body" [error]="error?.filter_body"></app-input-text>
<app-input-text i18n-title title="Filter attachment filename" formControlName="filter_attachment_filename" [error]="error?.filter_attachment_filename"></app-input-text>
<app-input-select i18n-title title="Action" [items]="actionOptions" formControlName="attachment_type"></app-input-select>
<app-input-text i18n-title title="Action parameter" formControlName="action_parameter" [error]="error?.action_parameter"></app-input-text>
</div>

View File

@ -5,6 +5,7 @@ import { first } from 'rxjs'
import { EditDialogComponent } from 'src/app/components/common/edit-dialog/edit-dialog.component'
import { PaperlessCorrespondent } from 'src/app/data/paperless-correspondent'
import { PaperlessDocumentType } from 'src/app/data/paperless-document-type'
import { PaperlessMailAccount } from 'src/app/data/paperless-mail-account'
import {
MailAction,
MailActionOptions,
@ -18,6 +19,7 @@ import {
} from 'src/app/data/paperless-mail-rule'
import { CorrespondentService } from 'src/app/services/rest/correspondent.service'
import { DocumentTypeService } from 'src/app/services/rest/document-type.service'
import { MailAccountService } from 'src/app/services/rest/mail-account.service'
import { MailRuleService } from 'src/app/services/rest/mail-rule.service'
@Component({
@ -26,17 +28,24 @@ import { MailRuleService } from 'src/app/services/rest/mail-rule.service'
styleUrls: ['./mail-rule-edit-dialog.component.scss'],
})
export class MailRuleEditDialogComponent extends EditDialogComponent<PaperlessMailRule> {
accounts: PaperlessMailAccount[]
correspondents: PaperlessCorrespondent[]
documentTypes: PaperlessDocumentType[]
constructor(
service: MailRuleService,
activeModal: NgbActiveModal,
accountService: MailAccountService,
correspondentService: CorrespondentService,
documentTypeService: DocumentTypeService
) {
super(service, activeModal)
accountService
.listAll()
.pipe(first())
.subscribe((result) => (this.accounts = result.results))
correspondentService
.listAll()
.pipe(first())

View File

@ -234,8 +234,8 @@
<li *ngFor="let account of mailAccounts" class="list-group-item" [formGroupName]="account.id">
<div class="row">
<div class="col"><button class="btn btn-link p-0" type="button" (click)="editMailAccount(account)">{{account.name}}</button></div>
<div class="col">{{account.imap_server}}</div>
<div class="col d-flex align-items-center"><button class="btn btn-link p-0" type="button" (click)="editMailAccount(account)">{{account.name}}</button></div>
<div class="col d-flex align-items-center">{{account.imap_server}}</div>
<div class="col">
<div class="btn-group">
<button class="btn btn-primary" type="button" (click)="editMailAccount(account)" i18n>Edit</button>
@ -261,8 +261,8 @@
<li *ngFor="let rule of mailRules" class="list-group-item" [formGroupName]="rule.id">
<div class="row">
<div class="col"><button class="btn btn-link p-0" type="button" (click)="editMailRule(rule)">{{rule.name}}</button></div>
<div class="col">{{rule.account.name}}</div>
<div class="col d-flex align-items-center"><button class="btn btn-link p-0" type="button" (click)="editMailRule(rule)">{{rule.name}}</button></div>
<div class="col d-flex align-items-center">{{(mailAccountService.getCached(rule.account) | async)?.name}}</div>
<div class="col">
<div class="btn-group">
<button class="btn btn-primary" type="button" (click)="editMailRule(rule)" i18n>Edit</button>

View File

@ -31,7 +31,7 @@ import { ViewportScroller } from '@angular/common'
import { TourService } from 'ngx-ui-tour-ng-bootstrap'
import { PaperlessMailAccount } from 'src/app/data/paperless-mail-account'
import { PaperlessMailRule } from 'src/app/data/paperless-mail-rule'
import { MailAccountService as MailAccountService } from 'src/app/services/rest/mail-account.service'
import { MailAccountService } from 'src/app/services/rest/mail-account.service'
import { MailRuleService } from 'src/app/services/rest/mail-rule.service'
import { NgbModal } from '@ng-bootstrap/ng-bootstrap'
import { MailAccountEditDialogComponent } from '../../common/edit-dialog/mail-account-edit-dialog/mail-account-edit-dialog.component'
@ -477,28 +477,30 @@ export class SettingsComponent
}
editMailAccount(account: PaperlessMailAccount) {
console.log(account)
var modal = this.modalService.open(MailAccountEditDialogComponent, {
backdrop: 'static',
size: 'xl',
})
modal.componentInstance.dialogMode = 'edit'
modal.componentInstance.object = account
// TODO: saving
// modal.componentInstance.success
// .pipe(
// switchMap((newStoragePath) => {
// return this.storagePathService
// .listAll()
// .pipe(map((storagePaths) => ({ newStoragePath, storagePaths })))
// })
// )
// .pipe(takeUntil(this.unsubscribeNotifier))
// .subscribe(({ newStoragePath, storagePaths }) => {
// this.storagePaths = storagePaths.results
// this.documentForm.get('storage_path').setValue(newStoragePath.id)
// })
modal.componentInstance.success
.pipe(takeUntil(this.unsubscribeNotifier))
.subscribe({
next: (newMailAccount) => {
this.toastService.showInfo(
$localize`Saved account "${newMailAccount.name}".`
)
this.mailAccountService.listAll().subscribe((r) => {
this.mailAccounts = r.results
this.initialize()
})
},
error: (e) => {
this.toastService.showError(
$localize`Error saving account: ${e.toString()}.`
)
},
})
}
deleteMailAccount(account: PaperlessMailAccount) {
@ -517,28 +519,31 @@ export class SettingsComponent
}
editMailRule(rule: PaperlessMailRule) {
console.log(rule)
var modal = this.modalService.open(MailRuleEditDialogComponent, {
backdrop: 'static',
size: 'xl',
})
modal.componentInstance.dialogMode = 'edit'
modal.componentInstance.object = rule
// TODO: saving
// modal.componentInstance.success
// .pipe(
// switchMap((newStoragePath) => {
// return this.storagePathService
// .listAll()
// .pipe(map((storagePaths) => ({ newStoragePath, storagePaths })))
// })
// )
// .pipe(takeUntil(this.unsubscribeNotifier))
// .subscribe(({ newStoragePath, storagePaths }) => {
// this.storagePaths = storagePaths.results
// this.documentForm.get('storage_path').setValue(newStoragePath.id)
// })
modal.componentInstance.success
.pipe(takeUntil(this.unsubscribeNotifier))
.subscribe({
next: (newMailRule) => {
this.toastService.showInfo(
$localize`Saved rule "${newMailRule.name}".`
)
this.mailRuleService.listAll().subscribe((r) => {
this.mailRules = r.results
this.initialize()
})
},
error: (e) => {
this.toastService.showError(
$localize`Error saving rule: ${e.toString()}.`
)
},
})
}
deleteMailRule(rule: PaperlessMailRule) {

View File

@ -101,7 +101,7 @@ export interface PaperlessMailRule extends ObjectWithId {
order: number
account: PaperlessMailAccount
account: number // PaperlessMailAccount.id
folder: string
@ -123,11 +123,11 @@ export interface PaperlessMailRule extends ObjectWithId {
assign_title_from: MailMetadataTitleOption
assign_tags?: PaperlessTag[]
assign_tags?: number[] // PaperlessTag.id
assign_document_type?: PaperlessDocumentType
assign_document_type?: number // PaperlessDocumentType.id
assign_correspondent_from?: MailMetadataCorrespondentOption
assign_correspondent?: PaperlessCorrespondent
assign_correspondent?: number // PaperlessCorrespondent.id
}

View File

@ -716,7 +716,17 @@ class MailAccountSerializer(serializers.ModelSerializer):
return mail_account
class AccountField(serializers.PrimaryKeyRelatedField):
def get_queryset(self):
return MailAccount.objects.all()
class MailRuleSerializer(serializers.ModelSerializer):
account = AccountField(allow_null=True)
assign_correspondent = CorrespondentField(allow_null=True)
assign_tags = TagsField(many=True)
assign_document_type = DocumentTypeField(allow_null=True)
class Meta:
model = MailRule
depth = 1