LP#1779158 Ang vandelay queue list page
authorBill Erickson <berickxx@gmail.com>
Thu, 5 Jul 2018 18:23:38 +0000 (14:23 -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/queue-list.component.html [new file with mode: 0644]
Open-ILS/src/eg2/src/app/staff/cat/vandelay/queue-list.component.ts [new file with mode: 0644]
Open-ILS/src/eg2/src/app/staff/cat/vandelay/queue.component.html
Open-ILS/src/eg2/src/app/staff/cat/vandelay/queue.component.ts
Open-ILS/src/eg2/src/app/staff/cat/vandelay/routing.module.ts
Open-ILS/src/eg2/src/app/staff/cat/vandelay/vandelay.module.ts

diff --git a/Open-ILS/src/eg2/src/app/staff/cat/vandelay/queue-list.component.html b/Open-ILS/src/eg2/src/app/staff/cat/vandelay/queue-list.component.html
new file mode 100644 (file)
index 0000000..b75e7a9
--- /dev/null
@@ -0,0 +1,34 @@
+<div class="import-form">
+  <h2 i18n>Select a Queue To Inspect</h2>
+  <div class="row flex">
+    <div>
+      <label i18n>Queue Type</label>
+    </div>
+    <div class="col-lg-3">
+      <eg-combobox (onChange)="queueTypeChanged($event)"
+        [startId]="queueType"
+        placeholder="Queue Type..." i18n-placeholder>
+        <eg-combobox-entry entryId="bib" entryLabel="Bibliographic Records" 
+          i18n-entryLabel></eg-combobox-entry>
+        <eg-combobox-entry entryId="auth" entryLabel="Authority Records" 
+          i18n-entryLabel></eg-combobox-entry>
+        <eg-combobox-entry entryId="bib-acq" entryLabel="Acquisitions Records" 
+          i18n-entryLabel></eg-combobox-entry>
+      </eg-combobox>
+    </div>
+  </div>
+</div>
+
+<eg-grid *ngIf="queueType=='bib'" #bibQueueGrid 
+  (onRowActivate)="rowActivated($event)"
+  idlClass="vbq" [dataSource]="queueSource">
+  <eg-grid-toolbar-action label="Delete Selected" i18n-label 
+    [action]="deleteSelected"></eg-grid-toolbar-action>
+</eg-grid>
+
+<eg-grid *ngIf="queueType=='auth'" #authQueueGrid 
+  (onRowActivate)="rowActivated($event)"
+  idlClass="vaq" [dataSource]="queueSource">
+</eg-grid>
+
+
diff --git a/Open-ILS/src/eg2/src/app/staff/cat/vandelay/queue-list.component.ts b/Open-ILS/src/eg2/src/app/staff/cat/vandelay/queue-list.component.ts
new file mode 100644 (file)
index 0000000..84c73a3
--- /dev/null
@@ -0,0 +1,99 @@
+import {Component, OnInit, ViewChild} from '@angular/core';
+import {Observable} from 'rxjs/Observable';
+import 'rxjs/add/observable/of';
+import {map} from 'rxjs/operators/map';
+import {Router, ActivatedRoute, ParamMap} from '@angular/router';              
+import {Pager} from '@eg/share/util/pager';                                    
+import {IdlObject} from '@eg/core/idl.service';
+import {NetService} from '@eg/core/net.service';
+import {AuthService} from '@eg/core/auth.service';
+import {GridComponent} from '@eg/share/grid/grid.component';
+import {GridDataSource, GridColumn} from '@eg/share/grid/grid';
+import {VandelayService} from './vandelay.service';
+
+@Component({
+  templateUrl: 'queue-list.component.html'
+})
+export class QueueListComponent {
+
+    queueType: string; // bib / auth / bib-acq
+    queueSource: GridDataSource;
+    deleteSelected: (rows: IdlObject[]) => void;
+
+    // points to the currently active grid.
+    queueGrid: GridComponent;
+
+    @ViewChild('bibQueueGrid') bibQueueGrid: GridComponent;
+    @ViewChild('authQueueGrid') authQueueGrid: GridComponent;
+
+    constructor(
+        private router: Router,
+        private route: ActivatedRoute,
+        private net: NetService,
+        private auth: AuthService,
+        private vandelay: VandelayService) {
+
+        this.queueType = 'bib';
+        this.queueSource = new GridDataSource();
+
+        // queue API does not support sorting
+        this.queueSource.getRows = (pager: Pager) => {
+            return this.loadQueues(pager);
+        }
+
+        this.deleteSelected = (queues: IdlObject[]) => {
+
+            // Serialize the deletes, especially if there are many of them
+            // because they can be bulky calls
+            const qtype = this.queueType;
+            const method = `open-ils.vandelay.${qtype}_queue.delete`;
+
+            const deleteNext = (queues: IdlObject[], idx: number) => {
+                const queue = queues[idx];
+                if (!queue) { 
+                    this.currentGrid().reload();
+                    return Promise.resolve(); 
+                }
+    
+                return this.net.request('open-ils.vandelay', 
+                    method, this.auth.token(), queue.id()
+                ).toPromise().then(() => deleteNext(queues, ++idx));
+            }
+
+            deleteNext(queues, 0);
+        };
+    }
+
+    currentGrid(): GridComponent {
+        // The active grid changes along with the queue type.  
+        // The inactive grid will be set to null.
+        return this.bibQueueGrid || this.authQueueGrid;
+    }
+
+    rowActivated(queue) {
+        const url = `/staff/cat/vandelay/queue/${this.queueType}/${queue.id()}`;
+        this.router.navigate([url]);
+    }
+
+    queueTypeChanged($event) {
+        this.queueType = $event.id;
+        this.queueSource.reset();
+    }
+
+
+    loadQueues(pager: Pager): Observable<any> {
+
+        if (!this.queueType) {
+            return Observable.of();
+        }
+
+        const qtype = this.queueType.match(/bib/) ? 'bib' : 'authority';
+        const method = `open-ils.vandelay.${qtype}_queue.owner.retrieve`;
+
+        return this.net.request('open-ils.vandelay', 
+            method, this.auth.token(), null, null,
+            {offset: pager.offset, limit: pager.limit}
+        );
+    }
+}
+
index a806652..ac3da87 100644 (file)
@@ -1,23 +1,25 @@
-<div *ngIf="!queueId">
-  show queue selector
-</div>
+<h2 i18n>Queue {{queueSummary ? queueSummary.queue.name() : ''}}</h2>
 
-<div *ngIf="queueId">
+<ng-template #viewMarcTmpl let-row="row">
+  <!-- TODO click -->
+  <a href i18n>TODO</a>
+</ng-template>
 
-  <ng-template #viewMarcTmpl let-context>
-    <!-- TODO click -->
-    <a href i18n>View MARC</a>
-  </ng-template>
+<ng-template #matchesTmpl let-row="row">
+  <!-- TODO click -->
+  <a href i18n>TODO</a>
+</ng-template>
 
-  <ng-template #matchesTmpl let-context>
-    <!-- TODO click -->
-    <a href i18n>Matches</a>
-  </ng-template>
+<ng-template #errorsTmpl let-row="row">
+  <!-- TODO formatting / css -->
+  <b>{{row.import_error}}</b>
+</ng-template>
 
-  <ng-template #errorsTmpl let-row="row">
-    <!-- TODO formatting / css -->
-    <b>{{row.import_error}}</b>
-  </ng-template>
+<ng-template #importedAsTmpl let-row="row">
+  <a routerLink="/staff/catalog/record/{{row.imported_as}}">
+    {{row.imported_as}}
+  </a>
+</ng-template>
 
 
 <!-- 
@@ -25,26 +27,20 @@ Most columns are generated programmatically from queued record attribute
 definitions.  Hide a number of stock record attributes by default
 because there are a lot of them.
 -->
-  <eg-grid #queueGrid [dataSource]="queueSource"
-    hideFields="language,pagination,price,rec_identifier,eg_tcn_source,eg_identifier,item_barcode,zsource">
-    <eg-grid-column name="id" [index]="true" 
-      [hidden]="true"></eg-grid-column>
-    <eg-grid-column i18n-label label="View MARC" 
-      name="+viewMarc" [cellTemplate]="viewMarcTmpl">
-    </eg-grid-column>
-    <eg-grid-column i18n-label label="Matches" 
-      name="+matches" [cellTemplate]="matchesTmpl">
-    </eg-grid-column>
-    <eg-grid-column name="import_error" 
-      i18n-label label="Import Errors" [cellTemplate]="errorsTmpl">
-    </eg-grid-column>
-    <eg-grid-column name="import_time" 
-      i18n-label label="Import Date" datatype="timestamp">
-    </eg-grid-column>
-    <eg-grid-column name="imported_as" i18n-label label="Imported As">
-      <!-- todo record link template? -->
-    </eg-grid-column>
-  </eg-grid>
-
-</div>
+
+<eg-grid #queueGrid [dataSource]="queueSource"
+  hideFields="language,pagination,price,rec_identifier,eg_tcn_source,eg_identifier,item_barcode,zsource">
+  <eg-grid-column name="id" [index]="true" 
+    [hidden]="true"></eg-grid-column>
+  <eg-grid-column i18n-label label="View MARC" 
+    name="+viewMarc" [cellTemplate]="viewMarcTmpl"></eg-grid-column>
+  <eg-grid-column i18n-label label="Matches" 
+    name="+matches" [cellTemplate]="matchesTmpl"></eg-grid-column>
+  <eg-grid-column name="import_error" i18n-label 
+    label="Import Errors" [cellTemplate]="errorsTmpl"></eg-grid-column>
+  <eg-grid-column name="import_time" i18n-label 
+    label="Import Date" datatype="timestamp"></eg-grid-column>
+  <eg-grid-column name="imported_as" i18n-label 
+    label="Imported As" [cellTemplate]="importedAsTmpl"></eg-grid-column>
+</eg-grid>
 
index 57d3607..8d257ad 100644 (file)
@@ -1,10 +1,12 @@
-import {Component, OnInit, ViewChild} from '@angular/core';
+import {Component, OnInit, AfterViewInit, ViewChild} from '@angular/core';
 import {Observable} from 'rxjs/Observable';
 import 'rxjs/add/observable/of';
 import {map} from 'rxjs/operators/map';
 import {Router, ActivatedRoute, ParamMap} from '@angular/router';              
 import {Pager} from '@eg/share/util/pager';                                    
 import {IdlObject} from '@eg/core/idl.service';
+import {NetService} from '@eg/core/net.service';
+import {AuthService} from '@eg/core/auth.service';
 import {GridComponent} from '@eg/share/grid/grid.component';
 import {GridDataSource, GridColumn} from '@eg/share/grid/grid';
 import {VandelayService} from './vandelay.service';
@@ -12,12 +14,13 @@ import {VandelayService} from './vandelay.service';
 @Component({
   templateUrl: 'queue.component.html'
 })
-export class QueueComponent implements OnInit {
+export class QueueComponent implements AfterViewInit {
 
     queueId: number;
     queueType: string; // bib / auth / bib-acq
     queueSource: GridDataSource;
     queuedRecClass: string;
+    queueSummary: any;
 
     // keep a local copy for convenience
     attrDefs: IdlObject[];
@@ -27,6 +30,8 @@ export class QueueComponent implements OnInit {
     constructor(
         private router: Router,
         private route: ActivatedRoute,
+        private net: NetService,
+        private auth: AuthService,
         private vandelay: VandelayService) {
 
         this.route.paramMap.subscribe((params: ParamMap) => {                  
@@ -38,13 +43,17 @@ export class QueueComponent implements OnInit {
 
         // queue API does not support sorting
         this.queueSource.getRows = (pager: Pager) => {
-            return this.loadQueue(pager);
+            return this.loadQueueRecords(pager);
         }
-
     }
 
-    ngOnInit() {
-        if (this.queueType) { this.applyQueueType(); }
+    ngAfterViewInit() {
+        if (this.queueType) { 
+            this.applyQueueType(); 
+            if (this.queueId) {
+                this.loadQueueSummary();
+            }
+        }
     }
 
     applyQueueType() {
@@ -68,11 +77,16 @@ export class QueueComponent implements OnInit {
         );
     }
 
-    loadQueue(pager?: Pager): Observable<any> {
+    loadQueueSummary(): Promise<any> {
+        const method = 
+            `open-ils.vandelay.${this.queueType}_queue.summary.retrieve`;
 
-        if (!(this.queueId && this.queueType)) {
-            return Observable.of();
-        }
+        return this.net.request(
+            'open-ils.vandelay', method, this.auth.token(), this.queueId)
+        .toPromise().then(sum => this.queueSummary = sum);
+    }
+
+    loadQueueRecords(pager: Pager): Observable<any> {
 
         const options = {
             clear_marc: true,
index 0275b37..4d08569 100644 (file)
@@ -4,6 +4,7 @@ import {VandelayComponent} from './vandelay.component';
 import {ImportComponent} from './import.component';
 import {ExportComponent} from './export.component';
 import {QueueComponent} from './queue.component';
+import {QueueListComponent} from './queue-list.component';
 
 const routes: Routes = [{
   path: '',
@@ -20,7 +21,7 @@ const routes: Routes = [{
     component: ExportComponent
   }, {
     path: 'queue',
-    component: QueueComponent
+    component: QueueListComponent
   }, {
     path: 'queue/:qtype/:id',
     component: QueueComponent
index 6babf94..bd8fecc 100644 (file)
@@ -6,6 +6,7 @@ import {VandelayComponent} from './vandelay.component';
 import {ImportComponent} from './import.component';
 import {ExportComponent} from './export.component';
 import {QueueComponent} from './queue.component';
+import {QueueListComponent} from './queue-list.component';
 import {GridModule} from '@eg/share/grid/grid.module';
 import {HttpClientModule} from '@angular/common/http';
 
@@ -14,7 +15,8 @@ import {HttpClientModule} from '@angular/common/http';
     VandelayComponent,
     ImportComponent,
     ExportComponent,
-    QueueComponent
+    QueueComponent,
+    QueueListComponent
   ],
   imports: [
     StaffCommonModule,