LP#1779158 Active -> Recent Imports UI
authorBill Erickson <berickxx@gmail.com>
Tue, 25 Sep 2018 21:39:30 +0000 (17:39 -0400)
committerBill Erickson <berickxx@gmail.com>
Thu, 11 Oct 2018 18:56:30 +0000 (14:56 -0400)
Signed-off-by: Bill Erickson <berickxx@gmail.com>
Open-ILS/src/eg2/src/app/staff/cat/vandelay/active-imports.component.html [deleted file]
Open-ILS/src/eg2/src/app/staff/cat/vandelay/active-imports.component.ts [deleted file]
Open-ILS/src/eg2/src/app/staff/cat/vandelay/import.component.html
Open-ILS/src/eg2/src/app/staff/cat/vandelay/recent-imports.component.html [new file with mode: 0644]
Open-ILS/src/eg2/src/app/staff/cat/vandelay/recent-imports.component.ts [new file with mode: 0644]
Open-ILS/src/eg2/src/app/staff/cat/vandelay/routing.module.ts
Open-ILS/src/eg2/src/app/staff/cat/vandelay/vandelay.component.html
Open-ILS/src/eg2/src/app/staff/cat/vandelay/vandelay.module.ts

diff --git a/Open-ILS/src/eg2/src/app/staff/cat/vandelay/active-imports.component.html b/Open-ILS/src/eg2/src/app/staff/cat/vandelay/active-imports.component.html
deleted file mode 100644 (file)
index f77ae51..0000000
+++ /dev/null
@@ -1,58 +0,0 @@
-
-<div *ngIf="trackers.length == 0">
-    <div class="row">
-        <div class="col-lg-6">
-            <div class="alert alert-info">
-                <span i18n>No Imports In Progress</span>
-            </div>
-        </div>
-    </div>
-</div>
-
-  <div class="row" *ngFor="let tracker of trackers">
-    <div class="col-lg-6">
-      <div class="card">
-        <div class="card-header">
-          <div class="panel-title text-center">
-            <span i18n>Import Tracker 
-                <span class="font-weight-bold">{{tracker.name()}}</span></span>
-          </div>
-        </div>
-        <div class="card-body">
-          <div class="list-group">
-            <div class="list-group-item border-0 p-2">
-              <!-- .id (not .id()) check to see if it's fleshed yet -->
-              <span i18n *ngIf="tracker.queue().id">
-                Created on {{tracker.create_time() | date}} for
-                <a class="font-weight-bold"
-                  routerLink="/staff/cat/vandelay/queue/{{tracker.record_type()}}/{{tracker.queue().id()}}">
-                  Queue {{tracker.queue().name()}}
-                </a>
-              </span>
-            </div>
-            <div class="list-group-item border-0 p-2">
-              <span *ngIf="tracker.action_type() == 'enqueue'" i18n>Enqueuing...</span>
-              <span *ngIf="tracker.action_type() == 'import'" i18n>Importing...</span>
-            </div>
-            <div class="list-group-item border-0 p-2">
-              <span i18n>State:</span>
-              <span *ngIf="tracker.state() == 'active'" i18n>Active</span>
-              <span *ngIf="tracker.state() == 'complete'" i18n>Complete</span>
-              <span *ngIf="tracker.state() == 'error'" i18n>Error</span>
-              <span class='pl-3' *ngIf="tracker.state() == 'complete'">
-                <span class="material-icons text-success">thumb_up</span>
-              </span>
-            </div>
-            <div class="list-group-item border-0 p-2">
-              <!-- ensure the progress shows 100% when complete -->
-              <eg-progress-inline 
-                [max]="tracker.state() == 'complete' ? tracker.actions_performed() : tracker.total_actions() || null"
-                [value]="tracker.actions_performed()">
-              </eg-progress-inline>
-            </div>
-          </div>
-        </div>
-      </div>
-    </div>
-  </div>
-
diff --git a/Open-ILS/src/eg2/src/app/staff/cat/vandelay/active-imports.component.ts b/Open-ILS/src/eg2/src/app/staff/cat/vandelay/active-imports.component.ts
deleted file mode 100644 (file)
index 6ebcb66..0000000
+++ /dev/null
@@ -1,99 +0,0 @@
-import {Component, OnInit} from '@angular/core';
-import {IdlService, IdlObject} from '@eg/core/idl.service';
-import {AuthService} from '@eg/core/auth.service';
-import {PcrudService} from '@eg/core/pcrud.service';
-import {VandelayService} from './vandelay.service';
-
-@Component({
-    templateUrl: 'active-imports.component.html'
-})
-
-export class ActiveImportsComponent implements OnInit {
-
-    trackers: IdlObject[];
-    refreshInterval = 2000; // ms
-
-    constructor(
-        private idl: IdlService,
-        private auth: AuthService,
-        private pcrud: PcrudService,
-        private vandelay: VandelayService
-    ) {
-        this.trackers = [];
-    }
-
-    ngOnInit() {
-        this.pollTrackers();
-    }
-
-    pollTrackers() {
-
-        const prevTrackers = this.trackers;
-
-        // Report on active trackers for this workstation and for the
-        // logged in user, plus any that were already reported in the
-        // current instance of the UI.
-        const query: any = {
-            '-and' : [
-                {
-                    '-or': [
-                        {workstation: this.auth.user().wsid()},
-                        {usr: this.auth.user().id()}
-                    ]
-                }
-            ]
-        };
-
-        if (this.trackers.length) {
-            query['-and'].push({
-                '-or': [
-                    {state: 'active'},
-                    {id: prevTrackers.map(t => t.id())}
-                ]
-            });
-        } else {
-            query['-and'].push({state: 'active'});
-        }
-
-        this.pcrud.search('vst', query, {order_by: {vst: 'create_time'}})
-        .subscribe(
-            tracker => {
-                // The screen flickers less if the tracker array is 
-                // updated inline instead of rebuilt every time.
-
-                const existing = 
-                    this.trackers.filter(t => t.id() === tracker.id())[0];
-
-                if (existing) {
-                    existing.update_time(tracker.update_time());
-                    existing.state(tracker.state());
-                    existing.total_actions(tracker.total_actions());
-                    existing.actions_performed(tracker.actions_performed());
-                } else {
-                    // TODO: replace enqueue trackers with import trackers
-                    // for a given session instead of appending?
-                    this.trackers.push(tracker);
-                    this.fleshTrackerQueue(tracker);
-                }
-            },
-            err => {},
-            ()  => {
-                const active = 
-                    this.trackers.filter(t => t.state() === 'active');
-
-                // Continue updating the display with updated tracker
-                // data as long as we have any active trackers.
-                if (active.length > 0) {
-                    setTimeout(
-                        () => this.pollTrackers(), this.refreshInterval);
-                }
-            }
-        );
-    }
-
-    fleshTrackerQueue(tracker: IdlObject) {
-        const qClass = tracker.record_type() === 'bib' ? 'vbq' : 'vaq';
-        this.pcrud.retrieve(qClass, tracker.queue())
-        .subscribe(queue => tracker.queue(queue));
-    }
-}
index 6f48fb6..95be13d 100644 (file)
     <div class="col-lg-3">
       <input [(ngModel)]="sessionName" class="form-control" type="text"/>
     </div>
-    <div class="col-lg-3" *ngIf="bibTrashGroups.length">
+    <div class="col-lg-3">
       <label i18n>Remove MARC Field Groups</label>
     </div>
+    <div class="col-lg-3" *ngIf="bibTrashGroups.length == 0">
+        <span i18n class="font-italic">No Removal Groups Configured</span>
+    </div>
     <div class="col-lg-3" *ngIf="bibTrashGroups.length">
       <select multiple [(ngModel)]="selectedTrashGroups" 
         class="form-control" size="3">
diff --git a/Open-ILS/src/eg2/src/app/staff/cat/vandelay/recent-imports.component.html b/Open-ILS/src/eg2/src/app/staff/cat/vandelay/recent-imports.component.html
new file mode 100644 (file)
index 0000000..a7a5438
--- /dev/null
@@ -0,0 +1,67 @@
+<div class="row mb-2">
+  <div class="col-lg-6">
+    <div class="input-group">
+      <div class="input-group-prepend">
+        <span class="input-group-text" i18n>Show Sessions Since: </span>
+      </div>
+      <eg-date-select 
+        [initialIso]="sinceDate"
+        (onChangeAsIso)="dateFilterChange($event)">
+      </eg-date-select>
+    </div>
+  </div>
+</div>
+
+<div *ngIf="trackers.length == 0">
+    <div class="row">
+        <div class="col-lg-6">
+            <div class="alert alert-info">
+                <span i18n>No Imports In Progress</span>
+            </div>
+        </div>
+    </div>
+</div>
+
+  <div class="row" *ngFor="let tracker of trackers">
+    <div class="col-lg-12">
+      <div class="card tight-card">
+        <div class="card-header">
+          <div class="panel-title">
+            <span i18n>
+              {{tracker.create_time() | date:'short'}} : 
+              <span class="font-weight-bold">{{tracker.name()}}</span>
+            </span>
+          </div>
+        </div>
+        <div class="card-body">
+          <div class="list-group">
+            <div class="list-group-item border-0 p-2">
+              <!-- .id (not .id()) check to see if it's fleshed yet -->
+              <span i18n *ngIf="tracker.queue().id">
+                <a class="font-weight-bold"
+                  routerLink="/staff/cat/vandelay/queue/{{tracker.record_type()}}/{{tracker.queue().id()}}">
+                  Queue {{tracker.queue().name()}}
+                </a>
+              </span>
+              <span class="pl-2" *ngIf="tracker.action_type() == 'enqueue'" i18n>Enqueuing...</span>
+              <span class="pl-2" *ngIf="tracker.action_type() == 'import'" i18n>Importing...</span>
+              <span *ngIf="tracker.state() == 'active'" i18n>Active</span>
+              <span *ngIf="tracker.state() == 'complete'" i18n>Complete</span>
+              <span *ngIf="tracker.state() == 'error'" i18n>Error</span>
+              <span class='pl-3' *ngIf="tracker.state() == 'complete'">
+                <span class="material-icons text-success">thumb_up</span>
+              </span>
+            </div>
+            <div class="list-group-item border-0 p-2">
+              <!-- ensure the progress shows 100% when complete -->
+              <eg-progress-inline 
+                [max]="tracker.state() == 'complete' ? tracker.actions_performed() : tracker.total_actions() || null"
+                [value]="tracker.actions_performed()">
+              </eg-progress-inline>
+            </div>
+          </div>
+        </div>
+      </div>
+    </div>
+  </div>
+
diff --git a/Open-ILS/src/eg2/src/app/staff/cat/vandelay/recent-imports.component.ts b/Open-ILS/src/eg2/src/app/staff/cat/vandelay/recent-imports.component.ts
new file mode 100644 (file)
index 0000000..55b054b
--- /dev/null
@@ -0,0 +1,121 @@
+import {Component, OnInit} from '@angular/core';
+import {IdlService, IdlObject} from '@eg/core/idl.service';
+import {AuthService} from '@eg/core/auth.service';
+import {PcrudService} from '@eg/core/pcrud.service';
+import {VandelayService} from './vandelay.service';
+
+@Component({
+    templateUrl: 'recent-imports.component.html'
+})
+
+export class RecentImportsComponent implements OnInit {
+
+    trackers: IdlObject[];
+    refreshInterval = 2000; // ms
+    sinceDate: string;
+
+    constructor(
+        private idl: IdlService,
+        private auth: AuthService,
+        private pcrud: PcrudService,
+        private vandelay: VandelayService
+    ) {
+        this.trackers = [];
+    }
+
+    ngOnInit() {
+        this.pollTrackers();
+        let now = new Date();
+        now.setDate(now.getDate() - 1);
+        this.sinceDate = now.toISOString();
+    }
+
+    dateFilterChange(iso: string) {
+        this.sinceDate = iso;
+        // TODO: kill pending setTimeout and start a new poll loop.
+    }
+
+    pollTrackers() {
+
+        // Report on recent trackers for this workstation and for the
+        // logged in user.  Always show active trackers.
+        const query: any = {
+            '-and': [
+                {
+                    '-or': [
+                        {workstation: this.auth.user().wsid()},
+                        {usr: this.auth.user().id()}
+                    ],
+                }, {
+                    '-or': [
+                        {create_time: {'>=': this.sinceDate}},
+                        {state: 'active'}
+                    ]
+                }
+            ]
+        };
+
+        this.pcrud.search('vst', query, {order_by: {vst: 'create_time'}})
+        .subscribe(
+            tracker => {
+                // The screen flickers less if the tracker array is 
+                // updated inline instead of rebuilt every time.
+
+                const existing = 
+                    this.trackers.filter(t => t.id() === tracker.id())[0];
+
+                if (existing) {
+                    existing.update_time(tracker.update_time());
+                    existing.state(tracker.state());
+                    existing.total_actions(tracker.total_actions());
+                    existing.actions_performed(tracker.actions_performed());
+                } else {
+
+                    // Only show the import tracker when both an enqueue
+                    // and import tracker exist for a given session.
+                    const sameSes = this.trackers.filter(
+                        t => t.session_key() === tracker.session_key())[0];
+
+                    if (sameSes) {
+                        if (sameSes.action_type() === 'enqueue') {
+                            // Remove the enqueueu tracker
+
+                            for (let idx = 0; idx < this.trackers.length; idx++) {
+                                const trkr = this.trackers[idx];
+                                if (trkr.id() === sameSes.id()) {
+                                    this.trackers.splice(idx, 1);
+                                    break;
+                                }
+                            }
+                       } else if (sameSes.action_type() === 'import') {
+                            // Avoid adding the new enqueue tracker
+                            return;
+                        }
+                    }
+
+                    this.trackers.unshift(tracker);
+                    this.fleshTrackerQueue(tracker);
+                }
+            },
+            err => {},
+            ()  => {
+                const active = 
+                    this.trackers.filter(t => t.state() === 'active');
+
+                // Continue updating the display with updated tracker
+                // data as long as we have any active trackers.
+                if (active.length > 0) {
+                    setTimeout(
+                        () => this.pollTrackers(), this.refreshInterval);
+                }
+            }
+        );
+    }
+
+    fleshTrackerQueue(tracker: IdlObject) {
+        const qClass = tracker.record_type() === 'bib' ? 'vbq' : 'vaq';
+        this.pcrud.retrieve(qClass, tracker.queue())
+        .subscribe(queue => tracker.queue(queue));
+    }
+
+}
index aee0720..707b92b 100644 (file)
@@ -12,7 +12,7 @@ import {HoldingsProfilesComponent} from './holdings-profiles.component';
 import {QueueItemsComponent} from './queue-items.component';
 import {MatchSetListComponent} from './match-set-list.component';
 import {MatchSetComponent} from './match-set.component';
-import {ActiveImportsComponent} from './active-imports.component';
+import {RecentImportsComponent} from './recent-imports.component';
 
 const routes: Routes = [{
   path: '',
@@ -62,7 +62,7 @@ const routes: Routes = [{
     component: MatchSetComponent
   }, {
     path: 'active_imports',
-    component: ActiveImportsComponent
+    component: RecentImportsComponent
   }]
 }];
 
index 24471ed..a81472d 100644 (file)
@@ -35,7 +35,7 @@
   <li class="nav-item">
     <a class="nav-link" [ngClass]="{active: tab=='active_imports'}" 
       routerLink="/staff/cat/vandelay/active_imports" 
-      i18n>Active Imports</a>
+      i18n>Recent Imports</a>
   </li>
 </ul>
 
index 1a1d9b1..9bbfd46 100644 (file)
@@ -22,7 +22,7 @@ import {MatchSetComponent} from './match-set.component';
 import {MatchSetExpressionComponent} from './match-set-expression.component';
 import {MatchSetQualityComponent} from './match-set-quality.component';
 import {MatchSetNewPointComponent} from './match-set-new-point.component';
-import {ActiveImportsComponent} from './active-imports.component';
+import {RecentImportsComponent} from './recent-imports.component';
 
 @NgModule({
   declarations: [
@@ -43,7 +43,7 @@ import {ActiveImportsComponent} from './active-imports.component';
     MatchSetExpressionComponent,
     MatchSetQualityComponent,
     MatchSetNewPointComponent,
-    ActiveImportsComponent
+    RecentImportsComponent
   ],
   imports: [
     TreeModule,