]> git.ipfire.org Git - thirdparty/paperless-ngx.git/commitdiff
Working mail rule & account edit
authorMichael Shamoon <4887959+shamoon@users.noreply.github.com>
Tue, 8 Nov 2022 20:18:47 +0000 (12:18 -0800)
committerMichael Shamoon <4887959+shamoon@users.noreply.github.com>
Sat, 3 Dec 2022 17:31:23 +0000 (09:31 -0800)
src-ui/src/app/components/common/edit-dialog/mail-rule-edit-dialog/mail-rule-edit-dialog.component.html
src-ui/src/app/components/common/edit-dialog/mail-rule-edit-dialog/mail-rule-edit-dialog.component.ts
src-ui/src/app/components/manage/settings/settings.component.html
src-ui/src/app/components/manage/settings/settings.component.ts
src-ui/src/app/data/paperless-mail-rule.ts
src/documents/serialisers.py

index 0b7891e81850f7f99bdae291fbd97efa9fbb6999..876b7b17934560b2ae04e881a472b37a08769979 100644 (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-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>
index c4faf86abb009a6f8998c4c05b538d0dc62bff6a..d820e3d5d564e3905c055a07f15c56d0c594779d 100644 (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())
index 03cc9f02e5e42df3fb022f3f95c0d00aa43b64b5..0aec87033ff7c22cc46c056ba443d168f6a189ae 100644 (file)
 
             <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>
index 8efbb486ea79dfc8d5b043e0ec0c914af47a3770..818ad6b142730b407d24708882b5b089a1e26c50 100644 (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) {
index 31d73473984935e150fad6387d580d2a333d19ac..0f0e417f83d829b4ece73e32acaf6c17e3e9c897 100644 (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
 }
index 86e0f4a12d55e16cd433cc1375fa4ecbbdc11263..d2fa10af9bdd5dd932cb3a6f1910a7e5e89fd67c 100644 (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