LP#1779158 Queue download option; add file-saver dep
authorBill Erickson <berickxx@gmail.com>
Wed, 11 Jul 2018 18:57:12 +0000 (14:57 -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/import.component.html
Open-ILS/src/eg2/src/app/staff/cat/vandelay/import.component.ts
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/queued-record.component.html
Open-ILS/src/eg2/src/app/staff/cat/vandelay/vandelay.service.ts

index 4f544b4..079fe59 100644 (file)
@@ -1,3 +1,12 @@
+<div class="row mb-3" *ngIf="importSelection()">
+  <div class="col-lg-2">
+    <button class="btn btn-info label-with-material-icon"
+      routerLink="/staff/cat/vandelay/queue/{{recordType}}/{{selectedQueue.id}}">
+      <span class="material-icons">arrow_back</span>
+      <span i18n>Return to Queue</span>
+    </button>
+  </div>
+</div>
 
 <div class="import-form form-validated">
   <h2 i18n>MARC File Upload</h2>
index 4909974..ad25acb 100644 (file)
@@ -7,14 +7,13 @@ import {OrgService} from '@eg/core/org.service';
 import {AuthService} from '@eg/core/auth.service';
 import {ToastService} from '@eg/share/toast/toast.service';
 import {ComboboxEntry} from '@eg/share/combobox/combobox.component';
-import {VandelayService, VandelayImportSelection} from './vandelay.service';
+import {VandelayService, VandelayImportSelection,
+  VANDELAY_UPLOAD_PATH} from './vandelay.service';
 import {HttpClient, HttpRequest, HttpEventType} from '@angular/common/http';
 import {HttpResponse, HttpErrorResponse} from '@angular/common/http';
 import {ProgressInlineComponent} from '@eg/share/dialog/progress-inline.component';
 import {Subject} from 'rxjs/Subject';
 
-const VAND_UPLOAD_URL = '/vandelay-upload';
-
 interface ImportOptions {
     overlay_map?: any;
     import_no_match?: boolean;
@@ -92,7 +91,6 @@ export class ImportComponent implements OnInit, AfterViewInit {
     }
 
     applyDefaults() {
-
         this.minQualityRatio = 0;
         this.selectedBibSource = 1; // default to system local
         this.recordType = 'bib';
@@ -104,6 +102,9 @@ export class ImportComponent implements OnInit, AfterViewInit {
         const queue = this.vandelay.importSelection.queue;
         this.recordType = queue.queue_type();
         this.selectedMatchSet = queue.match_set();
+
+        // This will be propagated to selectedQueue as a combobox
+        // entry via the combobox
         this.startQueueId = queue.id();
 
         if (this.recordType === 'bib') {
@@ -163,7 +164,6 @@ export class ImportComponent implements OnInit, AfterViewInit {
 
             case 'matchSets':
                 list = this.vandelay.matchSets[rtype];
-                console.log('match sets = ', list);
                 break;
 
             case 'importItemDefs':
@@ -315,7 +315,7 @@ export class ImportComponent implements OnInit, AfterViewInit {
             formData.append('bib_source', ''+this.selectedBibSource);
         }
 
-        const req = new HttpRequest('POST', VAND_UPLOAD_URL, formData, 
+        const req = new HttpRequest('POST', VANDELAY_UPLOAD_PATH, formData, 
             {reportProgress: true, responseType: 'text'});
 
         return this.http.request(req).pipe(tap(
index 3b90192..5414c85 100644 (file)
@@ -65,7 +65,8 @@
                 <a i18n>View Import Items</a>
               </div>
               <div class="flex-1">
-                <a i18n>Export Non-Imported Records</a>
+                <a [routerLink]="" (click)="exportNonImported()" 
+                  i18n>Export Non-Imported Records</a>
               </div>
             </div>
           </li>
index 224be6d..07fb4a5 100644 (file)
@@ -4,6 +4,7 @@ import 'rxjs/add/observable/of';
 import {map} from 'rxjs/operators/map';
 import {filter} from 'rxjs/operators/filter';
 import {Router, ActivatedRoute, ParamMap} from '@angular/router';              
+import {HttpClient} from '@angular/common/http';
 import {Pager} from '@eg/share/util/pager';                                    
 import {IdlObject} from '@eg/core/idl.service';
 import {EventService} from '@eg/core/event.service';
@@ -13,12 +14,13 @@ import {ConfirmDialogComponent} from '@eg/share/dialog/confirm.component';
 import {ProgressDialogComponent} from '@eg/share/dialog/progress.component';
 import {GridComponent} from '@eg/share/grid/grid.component';
 import {GridDataSource, GridColumn} from '@eg/share/grid/grid';
-import {VandelayService, VandelayImportSelection} from './vandelay.service';
+import {VandelayService, VandelayImportSelection,
+    VANDELAY_EXPORT_PATH} from './vandelay.service';
 
 @Component({
   templateUrl: 'queue.component.html'
 })
-export class QueueComponent implements AfterViewInit {
+export class QueueComponent implements OnInit, AfterViewInit {
 
     queueId: number;
     queueType: string; // bib / authority
@@ -46,6 +48,7 @@ export class QueueComponent implements AfterViewInit {
     constructor(
         private router: Router,
         private route: ActivatedRoute,
+        private http: HttpClient,
         private evt: EventService,
         private net: NetService,
         private auth: AuthService,
@@ -77,6 +80,11 @@ export class QueueComponent implements AfterViewInit {
         };
     }
 
+    ngOnInit() {
+        // Clear previous selection
+        this.vandelay.importSelection = null;
+    }
+
     ngAfterViewInit() {
         if (this.queueType) { 
             this.applyQueueType(); 
@@ -217,5 +225,9 @@ export class QueueComponent implements AfterViewInit {
             }
         );
     }
+
+    exportNonImported() {
+        this.vandelay.exportQueue(this.queueSummary.queue, true);
+    }
 }
 
index 31d88b1..47173ce 100644 (file)
@@ -10,7 +10,7 @@
 </div>
 
 <ngb-tabset #recordTabs [activeId]="recordTab" (tabChange)="onTabChange($event)">
-       <ngb-tab title="Record HTML" i18n-title id="marc">
+       <ngb-tab title="Queued Record HTML" i18n-title id="marc">
                <ng-template ngbTabContent>
       <eg-marc-html [recordId]="recordId" [recordType]="'vandelay-'+queueType">
       </eg-marc-html>
index 533b6c7..840b47e 100644 (file)
@@ -2,6 +2,8 @@ import {Injectable, EventEmitter} from '@angular/core';
 import {Observable} from 'rxjs/Observable';
 import {tap} from 'rxjs/operators/tap';
 import {map} from 'rxjs/operators/map';
+import {HttpClient} from '@angular/common/http';
+import {saveAs} from 'file-saver/FileSaver';
 import {IdlService, IdlObject} from '@eg/core/idl.service';
 import {OrgService} from '@eg/core/org.service';
 import {NetService} from '@eg/core/net.service';
@@ -11,6 +13,9 @@ import {PermService} from '@eg/core/perm.service';
 import {EventService} from '@eg/core/event.service';
 import {ProgressDialogComponent} from '@eg/share/dialog/progress.component';
 
+export const VANDELAY_EXPORT_PATH = '/exporter';
+export const VANDELAY_UPLOAD_PATH = '/vandelay-upload';
+
 export class VandelayImportSelection {
     recordIds: number[];
     queue: IdlObject;
@@ -36,6 +41,7 @@ export class VandelayService {
     importSelection: VandelayImportSelection;
 
     constructor(
+        private http: HttpClient,
         private idl: IdlService,
         private org: OrgService,
         private evt: EventService,
@@ -48,6 +54,7 @@ export class VandelayService {
         this.activeQueues = {};
         this.allQueues = {};
         this.matchSets = {};
+        this.importSelection = null;
     }
 
     getAttrDefs(dtype: string): Promise<IdlObject[]> {
@@ -262,5 +269,35 @@ export class VandelayService {
         return this.net.request('open-ils.vandelay', 
             method, this.auth.token(), queueId, options);
     }
+
+    exportQueue(queue: IdlObject, nonImported?: boolean) {
+
+        const etype = queue.queue_type().match(/auth/) ? 'auth' : 'bib';
+
+        let url = 
+          `${VANDELAY_EXPORT_PATH}?type=${etype}&queueid=${queue.id()}`
+
+        let saveName = queue.name();
+           
+        if (nonImported) {
+            url += '&nonimported=1';
+            saveName += '_nonimported';
+        }
+
+        saveName += '.mrc';
+
+        this.http.get(url, {responseType: 'text'}).subscribe(
+            data => {
+                saveAs(
+                    new Blob([data], {type: 'application/octet-stream'}),
+                    saveName
+                );
+            },
+            err  => {
+                console.error(err);
+            }
+        );
+    }
+
 }