From 8ddb13a5823d33a3062d496ba4b40f9aaf5770bc Mon Sep 17 00:00:00 2001
From: Scott Berg <saberg3@wisc.edu>
Date: Thu, 8 Aug 2019 11:09:59 -0500
Subject: [PATCH] Move audit logic to pipes.

---
 src/app/dars/audit/audit.component.html       |  8 ++---
 src/app/dars/audit/audit.component.scss       |  5 +--
 src/app/dars/audit/audit.component.ts         | 32 +------------------
 src/app/dars/dars.module.ts                   |  8 +++--
 src/app/dars/pipes/requirement-body.pipe.ts   | 25 +++++++++++++++
 ...-line.pipe.ts => requirement-line.pipe.ts} |  4 +--
 src/app/dars/pipes/requirement-title.pipe.ts  | 15 +++++++++
 src/app/dars/pipes/school-college.pipe.ts     |  3 +-
 8 files changed, 55 insertions(+), 45 deletions(-)
 create mode 100644 src/app/dars/pipes/requirement-body.pipe.ts
 rename src/app/dars/pipes/{audit-line.pipe.ts => requirement-line.pipe.ts} (86%)
 create mode 100644 src/app/dars/pipes/requirement-title.pipe.ts

diff --git a/src/app/dars/audit/audit.component.html b/src/app/dars/audit/audit.component.html
index 3c4aa43..5dd8cbf 100644
--- a/src/app/dars/audit/audit.component.html
+++ b/src/app/dars/audit/audit.component.html
@@ -134,7 +134,7 @@
       <ng-container *ngFor="let requirement of audit.requirements; trackBy: trackReq">
 
         <!-- START OF ACCORDION REQUIREMENT -->
-          <mat-expansion-panel #requirementPanel [expanded]="false" [disabled]="getRequirementBody(requirement).length === 0">
+          <mat-expansion-panel #requirementPanel [expanded]="false" [disabled]="(requirement | requirementBody).length === 0">
 
             <mat-expansion-panel-header class="reqExpansionPanelHeader" collapsedHeight="auto" expandedHeight="auto">
               <mat-panel-title class="requirement-title status-{{requirement.status.status.toLowerCase()}}">
@@ -172,7 +172,7 @@
                 </div>
                 <div>
                   <p>
-                    <ng-container *ngFor="let line of getRequirementTitle(requirement)">
+                    <ng-container *ngFor="let line of (requirement | requirementTitle)">
                       {{line}}
                     </ng-container>
                   </p>
@@ -180,7 +180,7 @@
               </mat-panel-title>
             </mat-expansion-panel-header>
 
-            <div *ngFor="let reqBody of getRequirementBody(requirement); trackBy: trackByIndex">
+            <div *ngFor="let reqBody of requirement | requirementBody; trackBy: trackByIndex">
 
               <div class="content-type content-type-{{reqBody.contentType}}" matTooltip="{{reqBody.contentType}}" matTooltipPosition="left">
                 <ng-container [ngSwitch]="reqBody.template">
@@ -227,7 +227,7 @@
                   <ng-container *ngSwitchCase="'lines'">
                       <p
                         *ngFor="let line of asLineBody(reqBody).lines; trackBy: trackByIndex"
-                        [innerHTML]="line | auditLine:reqBody.contentType"></p>
+                        [innerHTML]="line | requirementLine:reqBody.contentType"></p>
                   </ng-container>
 
                 </ng-container>
diff --git a/src/app/dars/audit/audit.component.scss b/src/app/dars/audit/audit.component.scss
index 86b1546..71729a4 100644
--- a/src/app/dars/audit/audit.component.scss
+++ b/src/app/dars/audit/audit.component.scss
@@ -114,14 +114,11 @@ $black: #000000;
 
 .reqExpansionPanelHeader[aria-disabled='true'] {
   .requirement-title {
-    padding-left: 3.1em;
+    padding-left: 44px;
   }
   .requirement-toggle {
     display: none;
   }
-  .requirement-icon {
-    display: none;
-  }
 }
 .requirement-title {
   display: flex;
diff --git a/src/app/dars/audit/audit.component.ts b/src/app/dars/audit/audit.component.ts
index 54388b4..7183694 100644
--- a/src/app/dars/audit/audit.component.ts
+++ b/src/app/dars/audit/audit.component.ts
@@ -47,7 +47,7 @@ export class DarsAuditComponent implements OnInit {
 
   public ngOnInit() {
     // Filter out LEGEND from audit data
-    this.audit.requirements = this.audit.requirements.filter(function(
+    this.audit.requirements = this.audit.requirements.filter(function (
       requirement,
     ) {
       return requirement.requirementName !== 'LEGEND';
@@ -63,36 +63,6 @@ export class DarsAuditComponent implements OnInit {
     this.requirements.closeAll();
   }
 
-  public getRequirementTitle(requirement: Requirement): string[] {
-    const title = requirement.requirementContents.find(
-      (r): r is ContentType =>
-        r.contentType === 'okRequirementTitle' ||
-        r.contentType === 'hText' ||
-        r.contentType === 'noRequirementTitle',
-    );
-    return title ? title.lines : ['No title found'];
-  }
-
-  public getRequirementBody(requirement: Requirement) {
-    return requirement.requirementContents.reduce<
-      (
-        | ContentType & { template: 'lines' }
-        | SubRequirementCourses & { template: 'courses' })[]
-    >((acc, item) => {
-      switch (item.contentType) {
-        case 'okRequirementTitle':
-        case 'noRequirementTitle':
-        case 'hText':
-          return acc;
-        case 'okSubrequirementCourses':
-        case 'noSubrequirementCourses':
-          return [...acc, { ...item, template: 'courses' }];
-        default:
-          return [...acc, { ...item, template: 'lines' }];
-      }
-    }, []);
-  }
-
   public trackReq(index: number, req: Requirement) {
     return `${index}-${req.requirementName}`;
   }
diff --git a/src/app/dars/dars.module.ts b/src/app/dars/dars.module.ts
index 210611f..fae4a58 100644
--- a/src/app/dars/dars.module.ts
+++ b/src/app/dars/dars.module.ts
@@ -11,7 +11,9 @@ import { MatStepperModule } from '@angular/material';
 import { AlertContainerComponent } from '../shared/components/alert-container/alert-container.component';
 import { StoreModule } from '@ngrx/store';
 import { darsReducer } from './store/reducer';
-import { AuditLinePipe } from './pipes/audit-line.pipe';
+import { RequirementTitlePipe } from './pipes/requirement-title.pipe';
+import { RequirementBodyPipe } from './pipes/requirement-body.pipe';
+import { RequirementLinePipe } from './pipes/requirement-line.pipe';
 import { SchoolOrCollegePipe } from './pipes/school-college.pipe';
 import { AuditNamePipe } from './pipes/name-format.pipe';
 import { NewDegreeAuditDialogComponent } from './new-degree-audit-dialog/new-degree-audit-dialog.component';
@@ -29,7 +31,9 @@ import { RouterModule } from '@angular/router';
   ],
   exports: [MatStepperModule],
   declarations: [
-    AuditLinePipe,
+    RequirementTitlePipe,
+    RequirementBodyPipe,
+    RequirementLinePipe,
     SchoolOrCollegePipe,
     AuditNamePipe,
     NewDegreeAuditDialogComponent,
diff --git a/src/app/dars/pipes/requirement-body.pipe.ts b/src/app/dars/pipes/requirement-body.pipe.ts
new file mode 100644
index 0000000..eb64a20
--- /dev/null
+++ b/src/app/dars/pipes/requirement-body.pipe.ts
@@ -0,0 +1,25 @@
+import { Pipe, PipeTransform } from '@angular/core';
+import { Requirement, ContentType, SubRequirementCourses } from '../models/audit/requirement';
+
+@Pipe({ name: 'requirementBody', pure: true })
+export class RequirementBodyPipe implements PipeTransform {
+    transform(requirement: Requirement) {
+        return requirement.requirementContents.reduce<
+            (
+                | ContentType & { template: 'lines' }
+                | SubRequirementCourses & { template: 'courses' })[]
+        >((acc, item) => {
+            switch (item.contentType) {
+                case 'okRequirementTitle':
+                case 'noRequirementTitle':
+                case 'hText':
+                    return acc;
+                case 'okSubrequirementCourses':
+                case 'noSubrequirementCourses':
+                    return [...acc, { ...item, template: 'courses' }];
+                default:
+                    return [...acc, { ...item, template: 'lines' }];
+            }
+        }, []);
+    }
+}
diff --git a/src/app/dars/pipes/audit-line.pipe.ts b/src/app/dars/pipes/requirement-line.pipe.ts
similarity index 86%
rename from src/app/dars/pipes/audit-line.pipe.ts
rename to src/app/dars/pipes/requirement-line.pipe.ts
index 3b0223c..c4355a5 100644
--- a/src/app/dars/pipes/audit-line.pipe.ts
+++ b/src/app/dars/pipes/requirement-line.pipe.ts
@@ -1,8 +1,8 @@
 import { Pipe, PipeTransform } from '@angular/core';
 import { ContentType } from '../models/audit/requirement';
 
-@Pipe({ name: 'auditLine' })
-export class AuditLinePipe implements PipeTransform {
+@Pipe({ name: 'requirementLine' })
+export class RequirementLinePipe implements PipeTransform {
   replaceIcon(line: string, search: string, icon: string): string {
     return line.replace(search, `<i class="material-icons">${icon}</i>`);
   }
diff --git a/src/app/dars/pipes/requirement-title.pipe.ts b/src/app/dars/pipes/requirement-title.pipe.ts
new file mode 100644
index 0000000..cff7cff
--- /dev/null
+++ b/src/app/dars/pipes/requirement-title.pipe.ts
@@ -0,0 +1,15 @@
+import { Pipe, PipeTransform } from '@angular/core';
+import { Requirement, ContentType } from '../models/audit/requirement';
+
+@Pipe({ name: 'requirementTitle', pure: true })
+export class RequirementTitlePipe implements PipeTransform {
+    transform(requirement: Requirement): string[] {
+        const title = requirement.requirementContents.find(
+            (r): r is ContentType =>
+                r.contentType === 'okRequirementTitle' ||
+                r.contentType === 'hText' ||
+                r.contentType === 'noRequirementTitle',
+        );
+        return title ? title.lines : ['No title found'];
+    }
+}
diff --git a/src/app/dars/pipes/school-college.pipe.ts b/src/app/dars/pipes/school-college.pipe.ts
index 8123b90..20bf836 100644
--- a/src/app/dars/pipes/school-college.pipe.ts
+++ b/src/app/dars/pipes/school-college.pipe.ts
@@ -1,7 +1,6 @@
 import { Pipe, PipeTransform } from '@angular/core';
-import { ContentType } from '../models/audit/requirement';
 
-@Pipe({ name: 'schoolOrCollege' })
+@Pipe({ name: 'schoolOrCollege', pure: true })
 export class SchoolOrCollegePipe implements PipeTransform {
     transform(string: string): string {
         if (string.includes(', School of')) {
-- 
GitLab