]> git.ipfire.org Git - thirdparty/paperless-ngx.git/commitdiff
Mail form tweaks
authorMichael Shamoon <4887959+shamoon@users.noreply.github.com>
Thu, 10 Nov 2022 03:59:35 +0000 (19:59 -0800)
committerMichael Shamoon <4887959+shamoon@users.noreply.github.com>
Sat, 3 Dec 2022 17:31:23 +0000 (09:31 -0800)
Include add button

Include add button

src-ui/src/app/components/common/edit-dialog/mail-account-edit-dialog/mail-account-edit-dialog.component.ts
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/common/input/number/number.component.html
src-ui/src/app/components/common/input/number/number.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-account.ts
src-ui/src/app/data/paperless-mail-rule.ts

index f4d395b033171559500992f9b0430fb64967cf68..98c897c899788429763e6ad8670162744287dcbc 100644 (file)
@@ -4,7 +4,6 @@ import { NgbActiveModal } from '@ng-bootstrap/ng-bootstrap'
 import { EditDialogComponent } from 'src/app/components/common/edit-dialog/edit-dialog.component'
 import {
   IMAPSecurity,
-  IMAPSecurityLabels,
   PaperlessMailAccount,
 } from 'src/app/data/paperless-mail-account'
 import { MailAccountService } from 'src/app/services/rest/mail-account.service'
@@ -40,6 +39,10 @@ export class MailAccountEditDialogComponent extends EditDialogComponent<Paperles
   }
 
   get imapSecurityOptions() {
-    return IMAPSecurityLabels
+    return [
+      { id: IMAPSecurity.None, name: $localize`No encryption` },
+      { id: IMAPSecurity.SSL, name: $localize`SSL` },
+      { id: IMAPSecurity.STARTTLS, name: $localize`STARTTLS` },
+    ]
   }
 }
index 876b7b17934560b2ae04e881a472b37a08769979..3eb793ae29c23b7837eadbab768677173c97b0e2 100644 (file)
         <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-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-text i18n-title title="Folder" formControlName="folder" i18n-hint hint="Subfolders must be separated by a delimiter, often a dot ('.') or slash ('/'), but it varies by mail server." [error]="error?.folder"></app-input-text>
+        <app-input-number i18n-title title="Maximum age (days)" formControlName="maximum_age" [showAdd]="false" [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">
+        <p class="small" i18n>Paperless will only process mails that match <em>all</em> of the filters specified below.</p>
         <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>
+        <app-input-text i18n-title title="Filter attachment filename" formControlName="filter_attachment_filename" i18n-hint hint="Only consume documents which entirely match this filename if specified. Wildcards such as *.pdf or *invoice* are allowed. Case insensitive." [error]="error?.filter_attachment_filename"></app-input-text>
       </div>
       <div class="col">
+        <app-input-select i18n-title title="Action" [items]="actionOptions" formControlName="attachment_type" i18n-hint hint="Action is only performed when documents are consumed from the mail. Mails without attachments remain entirely untouched."></app-input-select>
+        <app-input-text i18n-title title="Action parameter" formControlName="action_parameter" [error]="error?.action_parameter"></app-input-text>
         <app-input-select i18n-title title="Assign title from" [items]="metadataTitleOptions" formControlName="assign_title_from"></app-input-select>
         <app-input-tags [allowCreate]="false" formControlName="assign_tags"></app-input-tags>
-        <app-input-select i18n-title title="Assign document type" [items]="documentTypes" formControlName="assign_document_type"></app-input-select>
+        <app-input-select i18n-title title="Assign document type" [items]="documentTypes" [allowNull]="true" formControlName="assign_document_type"></app-input-select>
         <app-input-select i18n-title title="Assign correspondent from" [items]="metadataCorrespondentOptions" formControlName="assign_correspondent_from"></app-input-select>
-        <app-input-select i18n-title title="Assign correspondent" [items]="correspondents" formControlName="assign_correspondent"></app-input-select>
+        <app-input-select *ngIf="showCorrespondentField" i18n-title title="Assign correspondent" [items]="correspondents" [allowNull]="true" formControlName="assign_correspondent"></app-input-select>
       </div>
     </div>
   </div>
index d820e3d5d564e3905c055a07f15c56d0c594779d..b2d84d642d5f7cee3ee9b6ff204941831a976df7 100644 (file)
@@ -8,13 +8,9 @@ import { PaperlessDocumentType } from 'src/app/data/paperless-document-type'
 import { PaperlessMailAccount } from 'src/app/data/paperless-mail-account'
 import {
   MailAction,
-  MailActionOptions,
   MailFilterAttachmentType,
-  MailFilterAttachmentTypeOptions,
   MailMetadataCorrespondentOption,
-  MailMetadataCorrespondentOptionOptions,
   MailMetadataTitleOption,
-  MailMetadataTitleOptionOptions,
   PaperlessMailRule,
 } from 'src/app/data/paperless-mail-rule'
 import { CorrespondentService } from 'src/app/services/rest/correspondent.service'
@@ -89,19 +85,82 @@ export class MailRuleEditDialogComponent extends EditDialogComponent<PaperlessMa
     })
   }
 
+  get showCorrespondentField(): boolean {
+    return (
+      this.objectForm?.get('assign_correspondent_from')?.value ==
+      MailMetadataCorrespondentOption.FromCustom
+    )
+  }
+
   get attachmentTypeOptions() {
-    return MailFilterAttachmentTypeOptions
+    return [
+      {
+        id: MailFilterAttachmentType.Attachments,
+        name: $localize`Only process attachments.`,
+      },
+      {
+        id: MailFilterAttachmentType.Everything,
+        name: $localize`Process all files, including 'inline' attachments.`,
+      },
+    ]
   }
 
   get actionOptions() {
-    return MailActionOptions
+    return [
+      {
+        id: MailAction.Delete,
+        name: $localize`Delete`,
+      },
+      {
+        id: MailAction.Move,
+        name: $localize`Move to specified folder`,
+      },
+      {
+        id: MailAction.MarkRead,
+        name: $localize`Mark as read, don't process read mails`,
+      },
+      {
+        id: MailAction.Flag,
+        name: $localize`Flag the mail, don't process flagged mails`,
+      },
+      {
+        id: MailAction.Tag,
+        name: $localize`Tag the mail with specified tag, don't process tagged mails`,
+      },
+    ]
   }
 
   get metadataTitleOptions() {
-    return MailMetadataTitleOptionOptions
+    return [
+      {
+        id: MailMetadataTitleOption.FromSubject,
+        name: $localize`Use subject as title`,
+      },
+      {
+        id: MailMetadataTitleOption.FromFilename,
+        name: $localize`Use attachment filename as title`,
+      },
+    ]
   }
 
   get metadataCorrespondentOptions() {
-    return MailMetadataCorrespondentOptionOptions
+    return [
+      {
+        id: MailMetadataCorrespondentOption.FromNothing,
+        name: $localize`Do not assign a correspondent`,
+      },
+      {
+        id: MailMetadataCorrespondentOption.FromEmail,
+        name: $localize`Use mail address`,
+      },
+      {
+        id: MailMetadataCorrespondentOption.FromName,
+        name: $localize`Use name (or mail address if not available)`,
+      },
+      {
+        id: MailMetadataCorrespondentOption.FromCustom,
+        name: $localize`Use correspondent selected below`,
+      },
+    ]
   }
 }
index 3e2cc8d86041f529b1bd2b03a2f26f8faf26fa9e..ceff40250cf2ca931c1f42a6c167619c196f9bee 100644 (file)
@@ -2,7 +2,7 @@
   <label class="form-label" [for]="inputId">{{title}}</label>
   <div class="input-group" [class.is-invalid]="error">
     <input type="number" class="form-control" [id]="inputId" [(ngModel)]="value" (change)="onChange(value)" [class.is-invalid]="error">
-    <button class="btn btn-outline-secondary" type="button" id="button-addon1" (click)="nextAsn()" [disabled]="value">+1</button>
+    <button *ngIf="showAdd" class="btn btn-outline-secondary" type="button" id="button-addon1" (click)="nextAsn()" [disabled]="value">+1</button>
   </div>
   <div class="invalid-feedback">
     {{error}}
index cb29ff5e56b76476732339f03ecb1fc323ba393b..5ed861b5a95577974864e40973ddf2926bc58edf 100644 (file)
@@ -1,4 +1,4 @@
-import { Component, forwardRef } from '@angular/core'
+import { Component, forwardRef, Input } from '@angular/core'
 import { NG_VALUE_ACCESSOR } from '@angular/forms'
 import { FILTER_ASN_ISNULL } from 'src/app/data/filter-rule-type'
 import { DocumentService } from 'src/app/services/rest/document.service'
@@ -17,6 +17,9 @@ import { AbstractInputComponent } from '../abstract-input'
   styleUrls: ['./number.component.scss'],
 })
 export class NumberComponent extends AbstractInputComponent<number> {
+  @Input()
+  showAdd: boolean = true
+
   constructor(private documentService: DocumentService) {
     super()
   }
index 0aec87033ff7c22cc46c056ba443d168f6a189ae..1f0ada8abab79559b2eb1dce807c551c34f036f2 100644 (file)
       <a ngbNavLink i18n>Paperless Mail</a>
       <ng-template ngbNavContent>
 
-        <h4 i18n>Mail accounts</h4>
-        <ul class="list-group" formGroupName="mailAccounts">
+        <ng-container *ngIf="mailAccounts && mailRules">
+          <h4>
+            <ng-container i18n>Mail accounts</ng-container>
+            <button type="button" class="btn btn-sm btn-primary ms-4" (click)="editMailAccount()" i18n>Add Account</button>
+          </h4>
+          <ul class="list-group" formGroupName="mailAccounts">
 
             <li class="list-group-item">
               <div class="row">
               </div>
             </li>
 
-            <li *ngFor="let account of mailAccounts" class="list-group-item" [formGroupName]="account.id">
-              <div class="row">
-                <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>
-                    <button class="btn btn-outline-danger" type="button" (click)="deleteMailAccount(account)" i18n>Delete</button>
+              <li *ngFor="let account of mailAccounts" class="list-group-item" [formGroupName]="account.id">
+                <div class="row">
+                  <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-sm btn-primary" type="button" (click)="editMailAccount(account)" i18n>Edit</button>
+                      <button class="btn btn-sm btn-outline-danger" type="button" (click)="deleteMailAccount(account)" i18n>Delete</button>
+                    </div>
                   </div>
                 </div>
               </div>
             <div *ngIf="mailAccounts.length == 0" i18n>No mail accounts defined.</div>
         </ul>
 
-        <h4 class="mt-4" i18n>Mail rules</h4>
-        <ul class="list-group" formGroupName="mailRules">
+          <h4 class="mt-4">
+            <ng-container i18n>Mail rules</ng-container>
+            <button type="button" class="btn btn-sm btn-primary ms-4" (click)="editMailRule()" i18n>Add Rule</button>
+          </h4>
+          <ul class="list-group" formGroupName="mailRules">
 
             <li class="list-group-item">
               <div class="row">
               </div>
             </li>
 
-            <li *ngFor="let rule of mailRules" class="list-group-item" [formGroupName]="rule.id">
-              <div class="row">
-                <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>
-                    <button class="btn btn-outline-danger" type="button" (click)="deleteMailRule(rule)" i18n>Delete</button>
+              <li *ngFor="let rule of mailRules" class="list-group-item" [formGroupName]="rule.id">
+                <div class="row">
+                  <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-sm btn-primary" type="button" (click)="editMailRule(rule)" i18n>Edit</button>
+                      <button class="btn btn-sm btn-outline-danger" type="button" (click)="deleteMailRule(rule)" i18n>Delete</button>
+                    </div>
                   </div>
                 </div>
               </div>
index 818ad6b142730b407d24708882b5b089a1e26c50..6f68f04df5221461d1f6203a256ec06f2210d844 100644 (file)
@@ -481,7 +481,7 @@ export class SettingsComponent
       backdrop: 'static',
       size: 'xl',
     })
-    modal.componentInstance.dialogMode = 'edit'
+    modal.componentInstance.dialogMode = account ? 'edit' : 'create'
     modal.componentInstance.object = account
     modal.componentInstance.success
       .pipe(takeUntil(this.unsubscribeNotifier))
@@ -523,7 +523,7 @@ export class SettingsComponent
       backdrop: 'static',
       size: 'xl',
     })
-    modal.componentInstance.dialogMode = 'edit'
+    modal.componentInstance.dialogMode = rule ? 'edit' : 'create'
     modal.componentInstance.object = rule
     modal.componentInstance.success
       .pipe(takeUntil(this.unsubscribeNotifier))
index ea5c17a1bd1936a2402aea9fad975d08a32e30cc..9f875e78346a72eaf72900e576bff5791bffc770 100644 (file)
@@ -6,12 +6,6 @@ export enum IMAPSecurity {
   STARTTLS = 3,
 }
 
-export const IMAPSecurityLabels: Array<{ id: number; name: string }> = [
-  { id: IMAPSecurity.None, name: $localize`No encryption` },
-  { id: IMAPSecurity.SSL, name: $localize`SSL` },
-  { id: IMAPSecurity.STARTTLS, name: $localize`STARTTLS` },
-]
-
 export interface PaperlessMailAccount extends ObjectWithId {
   name: string
 
index 0f0e417f83d829b4ece73e32acaf6c17e3e9c897..ff6654a0b3603f5fb5d4e9555114a32d895302f2 100644 (file)
@@ -1,28 +1,10 @@
 import { ObjectWithId } from './object-with-id'
-import { PaperlessCorrespondent } from './paperless-correspondent'
-import { PaperlessDocumentType } from './paperless-document-type'
-import { PaperlessMailAccount } from './paperless-mail-account'
-import { PaperlessTag } from './paperless-tag'
 
 export enum MailFilterAttachmentType {
   Attachments = 1,
   Everything = 2,
 }
 
-export const MailFilterAttachmentTypeOptions: Array<{
-  id: number
-  name: string
-}> = [
-  {
-    id: MailFilterAttachmentType.Attachments,
-    name: $localize`Only process attachments.`,
-  },
-  {
-    id: MailFilterAttachmentType.Everything,
-    name: $localize`Process all files, including 'inline' attachments.`,
-  },
-]
-
 export enum MailAction {
   Delete = 1,
   Move = 2,
@@ -31,42 +13,11 @@ export enum MailAction {
   Tag = 5,
 }
 
-export const MailActionOptions: Array<{ id: number; name: string }> = [
-  { id: MailAction.Delete, name: $localize`Delete` },
-  { id: MailAction.Move, name: $localize`Move to specified folder` },
-  {
-    id: MailAction.MarkRead,
-    name: $localize`Mark as read, don't process read mails`,
-  },
-  {
-    id: MailAction.Flag,
-    name: $localize`Flag the mail, don't process flagged mails`,
-  },
-  {
-    id: MailAction.Tag,
-    name: $localize`Tag the mail with specified tag, don't process tagged mails`,
-  },
-]
-
 export enum MailMetadataTitleOption {
   FromSubject = 1,
   FromFilename = 2,
 }
 
-export const MailMetadataTitleOptionOptions: Array<{
-  id: number
-  name: string
-}> = [
-  {
-    id: MailMetadataTitleOption.FromSubject,
-    name: $localize`Use subject as title`,
-  },
-  {
-    id: MailMetadataTitleOption.FromFilename,
-    name: $localize`Use attachment filename as title`,
-  },
-]
-
 export enum MailMetadataCorrespondentOption {
   FromNothing = 1,
   FromEmail = 2,
@@ -74,28 +25,6 @@ export enum MailMetadataCorrespondentOption {
   FromCustom = 4,
 }
 
-export const MailMetadataCorrespondentOptionOptions: Array<{
-  id: number
-  name: string
-}> = [
-  {
-    id: MailMetadataCorrespondentOption.FromNothing,
-    name: $localize`Do not assign a correspondent`,
-  },
-  {
-    id: MailMetadataCorrespondentOption.FromEmail,
-    name: $localize`Use mail address`,
-  },
-  {
-    id: MailMetadataCorrespondentOption.FromName,
-    name: $localize`Use name (or mail address if not available)`,
-  },
-  {
-    id: MailMetadataCorrespondentOption.FromCustom,
-    name: $localize`Use correspondent selected below`,
-  },
-]
-
 export interface PaperlessMailRule extends ObjectWithId {
   name: string