From 2d6689ac5a723aca1841d05da3537750914fa1a8 Mon Sep 17 00:00:00 2001
From: Cathy Hu <cathy.hu@fau.de>
Date: Fri, 28 Aug 2020 17:34:07 +0200
Subject: [PATCH] [frontend] Add custom design for email

---
 .../email-dialog/email-dialog.component.html  | 21 ++++++++
 .../email-dialog/email-dialog.component.scss  |  0
 .../email-dialog.component.spec.ts            | 24 +++++++++
 .../email-dialog/email-dialog.component.ts    | 54 +++++++++++++++++++
 .../email-info-dialog.component.html          |  1 +
 .../email-info-dialog.component.scss          |  0
 .../email-info-dialog.component.spec.ts       | 24 +++++++++
 .../email-info-dialog.component.ts            | 12 +++++
 .../email-settings.component.html             | 44 +++++++++------
 .../email-settings.component.scss             | 25 ++++++++-
 .../email-settings.component.ts               | 29 +++++++++-
 kibicara-frontend/src/styles.scss             |  4 ++
 12 files changed, 221 insertions(+), 17 deletions(-)
 create mode 100644 kibicara-frontend/src/app/platforms/email/email-dialog/email-dialog.component.html
 create mode 100644 kibicara-frontend/src/app/platforms/email/email-dialog/email-dialog.component.scss
 create mode 100644 kibicara-frontend/src/app/platforms/email/email-dialog/email-dialog.component.spec.ts
 create mode 100644 kibicara-frontend/src/app/platforms/email/email-dialog/email-dialog.component.ts
 create mode 100644 kibicara-frontend/src/app/platforms/email/email-info-dialog/email-info-dialog.component.html
 create mode 100644 kibicara-frontend/src/app/platforms/email/email-info-dialog/email-info-dialog.component.scss
 create mode 100644 kibicara-frontend/src/app/platforms/email/email-info-dialog/email-info-dialog.component.spec.ts
 create mode 100644 kibicara-frontend/src/app/platforms/email/email-info-dialog/email-info-dialog.component.ts

diff --git a/kibicara-frontend/src/app/platforms/email/email-dialog/email-dialog.component.html b/kibicara-frontend/src/app/platforms/email/email-dialog/email-dialog.component.html
new file mode 100644
index 0000000..ff17739
--- /dev/null
+++ b/kibicara-frontend/src/app/platforms/email/email-dialog/email-dialog.component.html
@@ -0,0 +1,21 @@
+<h2 mat-dialog-title>Create new inbox</h2>
+
+<mat-dialog-content class="mat-typography">
+  <form class="input" [formGroup]="form">
+    <mat-form-field>
+      <mat-label>New inbox address</mat-label>
+      <input matInput formControlName="name" />
+      <mat-error
+        *ngIf="form.controls.name.errors && form.controls.name.errors.required"
+        >Inbox address is required</mat-error
+      >
+    </mat-form-field>
+  </form>
+</mat-dialog-content>
+
+<mat-dialog-actions align="end">
+  <button mat-button (click)="onCancel()">Cancel</button>
+  <button mat-button (click)="onSubmit()" cdkFocusInitial>
+    Create address
+  </button>
+</mat-dialog-actions>
diff --git a/kibicara-frontend/src/app/platforms/email/email-dialog/email-dialog.component.scss b/kibicara-frontend/src/app/platforms/email/email-dialog/email-dialog.component.scss
new file mode 100644
index 0000000..e69de29
diff --git a/kibicara-frontend/src/app/platforms/email/email-dialog/email-dialog.component.spec.ts b/kibicara-frontend/src/app/platforms/email/email-dialog/email-dialog.component.spec.ts
new file mode 100644
index 0000000..3b75ce8
--- /dev/null
+++ b/kibicara-frontend/src/app/platforms/email/email-dialog/email-dialog.component.spec.ts
@@ -0,0 +1,24 @@
+import { async, ComponentFixture, TestBed } from '@angular/core/testing';
+
+import { EmailDialogComponent } from './email-dialog.component';
+
+describe('EmailDialogComponent', () => {
+  let component: EmailDialogComponent;
+  let fixture: ComponentFixture<EmailDialogComponent>;
+
+  beforeEach(async(() => {
+    TestBed.configureTestingModule({
+      declarations: [EmailDialogComponent],
+    }).compileComponents();
+  }));
+
+  beforeEach(() => {
+    fixture = TestBed.createComponent(EmailDialogComponent);
+    component = fixture.componentInstance;
+    fixture.detectChanges();
+  });
+
+  it('should create', () => {
+    expect(component).toBeTruthy();
+  });
+});
diff --git a/kibicara-frontend/src/app/platforms/email/email-dialog/email-dialog.component.ts b/kibicara-frontend/src/app/platforms/email/email-dialog/email-dialog.component.ts
new file mode 100644
index 0000000..b1873fb
--- /dev/null
+++ b/kibicara-frontend/src/app/platforms/email/email-dialog/email-dialog.component.ts
@@ -0,0 +1,54 @@
+import { Component, OnInit, Input } from '@angular/core';
+import { MatDialogRef } from '@angular/material/dialog';
+import { Validators, FormBuilder } from '@angular/forms';
+import { EmailService } from 'src/app/core/api';
+import { first } from 'rxjs/operators';
+import { MatSnackBar } from '@angular/material/snack-bar';
+
+@Component({
+  selector: 'app-email-dialog',
+  templateUrl: './email-dialog.component.html',
+  styleUrls: ['./email-dialog.component.scss'],
+})
+export class EmailDialogComponent implements OnInit {
+  @Input() hoodId;
+  form;
+
+  constructor(
+    public dialogRef: MatDialogRef<EmailDialogComponent>,
+    private formBuilder: FormBuilder,
+    private emailService: EmailService,
+    private snackBar: MatSnackBar
+  ) {}
+
+  ngOnInit(): void {
+    this.form = this.formBuilder.group({
+      name: ['', Validators.required],
+    });
+  }
+
+  onCancel() {
+    this.dialogRef.close();
+  }
+
+  onSubmit() {
+    if (this.form.invalid) {
+      return;
+    }
+    this.emailService
+      .createEmail(this.hoodId, {
+        name: this.form.controls.name.value,
+      })
+      .pipe(first())
+      .subscribe(
+        () => {
+          this.dialogRef.close();
+        },
+        (error) => {
+          this.snackBar.open('Address already taken', 'Close', {
+            duration: 2000,
+          });
+        }
+      );
+  }
+}
diff --git a/kibicara-frontend/src/app/platforms/email/email-info-dialog/email-info-dialog.component.html b/kibicara-frontend/src/app/platforms/email/email-info-dialog/email-info-dialog.component.html
new file mode 100644
index 0000000..87c143e
--- /dev/null
+++ b/kibicara-frontend/src/app/platforms/email/email-info-dialog/email-info-dialog.component.html
@@ -0,0 +1 @@
+<p>email-info-dialog works!</p>
diff --git a/kibicara-frontend/src/app/platforms/email/email-info-dialog/email-info-dialog.component.scss b/kibicara-frontend/src/app/platforms/email/email-info-dialog/email-info-dialog.component.scss
new file mode 100644
index 0000000..e69de29
diff --git a/kibicara-frontend/src/app/platforms/email/email-info-dialog/email-info-dialog.component.spec.ts b/kibicara-frontend/src/app/platforms/email/email-info-dialog/email-info-dialog.component.spec.ts
new file mode 100644
index 0000000..de6271f
--- /dev/null
+++ b/kibicara-frontend/src/app/platforms/email/email-info-dialog/email-info-dialog.component.spec.ts
@@ -0,0 +1,24 @@
+import { async, ComponentFixture, TestBed } from '@angular/core/testing';
+
+import { EmailInfoDialogComponent } from './email-info-dialog.component';
+
+describe('EmailInfoDialogComponent', () => {
+  let component: EmailInfoDialogComponent;
+  let fixture: ComponentFixture<EmailInfoDialogComponent>;
+
+  beforeEach(async(() => {
+    TestBed.configureTestingModule({
+      declarations: [EmailInfoDialogComponent],
+    }).compileComponents();
+  }));
+
+  beforeEach(() => {
+    fixture = TestBed.createComponent(EmailInfoDialogComponent);
+    component = fixture.componentInstance;
+    fixture.detectChanges();
+  });
+
+  it('should create', () => {
+    expect(component).toBeTruthy();
+  });
+});
diff --git a/kibicara-frontend/src/app/platforms/email/email-info-dialog/email-info-dialog.component.ts b/kibicara-frontend/src/app/platforms/email/email-info-dialog/email-info-dialog.component.ts
new file mode 100644
index 0000000..5944b08
--- /dev/null
+++ b/kibicara-frontend/src/app/platforms/email/email-info-dialog/email-info-dialog.component.ts
@@ -0,0 +1,12 @@
+import { Component, OnInit } from '@angular/core';
+
+@Component({
+  selector: 'app-email-info-dialog',
+  templateUrl: './email-info-dialog.component.html',
+  styleUrls: ['./email-info-dialog.component.scss'],
+})
+export class EmailInfoDialogComponent implements OnInit {
+  constructor() {}
+
+  ngOnInit(): void {}
+}
diff --git a/kibicara-frontend/src/app/platforms/email/email-settings/email-settings.component.html b/kibicara-frontend/src/app/platforms/email/email-settings/email-settings.component.html
index d439400..cc0495a 100644
--- a/kibicara-frontend/src/app/platforms/email/email-settings/email-settings.component.html
+++ b/kibicara-frontend/src/app/platforms/email/email-settings/email-settings.component.html
@@ -1,20 +1,34 @@
 <mat-card>
   <mat-card-header>
-    <mat-card-title>E-Mails</mat-card-title>
+    <mat-card-title class="platform-title">
+      <div class="platform-heading">
+        E-Mails
+      </div>
+      <button mat-icon-button aria-label="How to use">
+        <mat-icon matTooltip="How to use" class="info-button">info</mat-icon>
+      </button>
+    </mat-card-title>
   </mat-card-header>
   <mat-card-content>
     <mat-list *ngIf="emails$ | async as emails">
-      <mat-list-item *ngIf="emails.length === 0">
-        <button mat-menu-item>
+      <mat-list-item *ngIf="emails.length === 0; else startButton">
+        <button mat-menu-item (click)="onCreate()">
           <mat-icon>add</mat-icon>
           <span> Add a platform connection!</span>
         </button>
         <mat-divider></mat-divider>
       </mat-list-item>
+      <ng-template #startButton>
+        <mat-list-item>
+          <div class="toggle-container">
+            <mat-slide-toggle class="toggle"></mat-slide-toggle>
+          </div>
+          <mat-divider></mat-divider>
+        </mat-list-item>
+      </ng-template>
       <mat-list-item *ngFor="let email of emails">
         <div class="entry">
-          Telegramdummy
-          <mat-slide-toggle></mat-slide-toggle>
+          {{ email.name }}
           <button
             mat-icon-button
             [matMenuTriggerFor]="menu"
@@ -24,17 +38,17 @@
           </button>
         </div>
         <mat-divider></mat-divider>
+        <mat-menu #menu="matMenu">
+          <button mat-menu-item (click)="onDelete(email.id)">
+            <mat-icon>delete</mat-icon>
+            <span>Delete</span>
+          </button>
+          <button mat-menu-item (click)="onCreate()">
+            <mat-icon>add</mat-icon>
+            <span>Add another</span>
+          </button>
+        </mat-menu>
       </mat-list-item>
     </mat-list>
-    <mat-menu #menu="matMenu">
-      <button mat-menu-item>
-        <mat-icon>delete</mat-icon>
-        <span>Delete</span>
-      </button>
-      <button mat-menu-item>
-        <mat-icon>add</mat-icon>
-        <span>Add another</span>
-      </button>
-    </mat-menu>
   </mat-card-content>
 </mat-card>
diff --git a/kibicara-frontend/src/app/platforms/email/email-settings/email-settings.component.scss b/kibicara-frontend/src/app/platforms/email/email-settings/email-settings.component.scss
index b76aeea..a08e4c4 100644
--- a/kibicara-frontend/src/app/platforms/email/email-settings/email-settings.component.scss
+++ b/kibicara-frontend/src/app/platforms/email/email-settings/email-settings.component.scss
@@ -1,6 +1,29 @@
 .entry {
   display: grid;
-  grid-template-columns: 4fr 40px 20px;
+  grid-template-columns: 4fr 20px;
   width: 100%;
   align-items: center;
 }
+
+.platform-title {
+  display: grid;
+  grid-template-columns: 1fr 40px;
+  width: 100%;
+  align-items: center;
+}
+
+.platform-heading {
+  align-self: flex-end;
+}
+
+.toggle-container {
+  display: grid;
+  grid-template-columns: 4fr 30px;
+  width: 100%;
+  align-items: center;
+}
+
+.toggle {
+  grid-column-start: 2;
+  align-self: flex-start;
+}
diff --git a/kibicara-frontend/src/app/platforms/email/email-settings/email-settings.component.ts b/kibicara-frontend/src/app/platforms/email/email-settings/email-settings.component.ts
index 78cb972..1df4ae3 100644
--- a/kibicara-frontend/src/app/platforms/email/email-settings/email-settings.component.ts
+++ b/kibicara-frontend/src/app/platforms/email/email-settings/email-settings.component.ts
@@ -1,6 +1,9 @@
 import { Component, OnInit, Input } from '@angular/core';
 import { Observable } from 'rxjs/internal/Observable';
 import { EmailService } from 'src/app/core/api';
+import { MatDialog } from '@angular/material/dialog';
+import { Router } from '@angular/router';
+import { EmailDialogComponent } from '../email-dialog/email-dialog.component';
 
 @Component({
   selector: 'app-email-settings',
@@ -11,9 +14,33 @@ export class EmailSettingsComponent implements OnInit {
   @Input() hoodId;
   emails$: Observable<Array<any>>;
 
-  constructor(private emailService: EmailService) {}
+  constructor(
+    private emailService: EmailService,
+    public dialog: MatDialog,
+    private router: Router
+  ) {}
 
   ngOnInit(): void {
+    this.reload();
+  }
+
+  private reload() {
     this.emails$ = this.emailService.getEmails(this.hoodId);
   }
+
+  onDelete(emailId) {
+    this.emailService.deleteEmail(emailId, this.hoodId).subscribe(() => {
+      this.reload();
+    });
+  }
+
+  onCreate() {
+    const dialogRef = this.dialog.open(EmailDialogComponent);
+
+    dialogRef.afterClosed().subscribe((hood) => {
+      // if (hood && hood.id) {
+      //   this.router.navigate(['/dashboard/hoods', hood.id]);
+      // }
+    });
+  }
 }
diff --git a/kibicara-frontend/src/styles.scss b/kibicara-frontend/src/styles.scss
index 5cf94e0..56ad8fa 100644
--- a/kibicara-frontend/src/styles.scss
+++ b/kibicara-frontend/src/styles.scss
@@ -12,3 +12,7 @@ body {
 .mat-tab-body-content {
   overflow: hidden !important;
 }
+
+.info-button {
+  color: #9e9e9e;
+}