<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-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>
- </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>
<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>
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,
} 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({
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())
<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>
<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>
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'
}
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) {
}
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) {
order: number
- account: PaperlessMailAccount
+ account: number // PaperlessMailAccount.id
folder: string
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
}
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