LP#1942220: (follow-up) implement link to catalog
authorGalen Charlton <gmc@equinoxOLI.org>
Fri, 29 Jul 2022 01:47:47 +0000 (01:47 +0000)
committerGalen Charlton <gmc@equinoxOLI.org>
Fri, 29 Jul 2022 01:47:47 +0000 (01:47 +0000)
Signed-off-by: Galen Charlton <gmc@equinoxOLI.org>
Open-ILS/src/eg2/src/app/staff/acq/lineitem/bib-finder-dialog.component.css [new file with mode: 0644]
Open-ILS/src/eg2/src/app/staff/acq/lineitem/bib-finder-dialog.component.html [new file with mode: 0644]
Open-ILS/src/eg2/src/app/staff/acq/lineitem/bib-finder-dialog.component.ts [new file with mode: 0644]
Open-ILS/src/eg2/src/app/staff/acq/lineitem/lineitem-list.component.html
Open-ILS/src/eg2/src/app/staff/acq/lineitem/lineitem-list.component.ts
Open-ILS/src/eg2/src/app/staff/acq/lineitem/lineitem.module.ts

diff --git a/Open-ILS/src/eg2/src/app/staff/acq/lineitem/bib-finder-dialog.component.css b/Open-ILS/src/eg2/src/app/staff/acq/lineitem/bib-finder-dialog.component.css
new file mode 100644 (file)
index 0000000..56fc5d3
--- /dev/null
@@ -0,0 +1,3 @@
+.bib-finder-results-row:nth-child(even) {
+  background-color: rgba(0,0,0,.03);
+}
diff --git a/Open-ILS/src/eg2/src/app/staff/acq/lineitem/bib-finder-dialog.component.html b/Open-ILS/src/eg2/src/app/staff/acq/lineitem/bib-finder-dialog.component.html
new file mode 100644 (file)
index 0000000..5adebb5
--- /dev/null
@@ -0,0 +1,57 @@
+<ng-template #dialogContent>
+  <form class="form-validated">
+    <div class="modal-header bg-info">
+      <h3 class="modal-title" i18n>Link Line Item to Catalog</h3>
+      <button type="button" class="close"
+        i18n-aria-label aria-label="Close" (click)="close()">
+        <span aria-hidden="true">&times;</span>
+      </button>
+    </div>
+    <div class="modal-body">
+      <h4 i18n>Line Item: {{liId}}</h4>
+      <div class="input-group">
+        <label for="searchQuery" class="mr-1" i18n>Search catalog for</label>
+        <input type="text" [(ngModel)]="queryString" [ngModelOptions]="{standalone: true}"
+          class="form-control" id="searchQuery">
+        <button type="submit" (click)="submitSearch()" class="btn btn-primary"
+                [disabled]="doingSearch || queryString.length < 1" i18n>Submit</button>
+      </div>
+      <div class="row">
+        <div class="col-12">
+          <eg-progress-inline *ngIf="doingSearch"></eg-progress-inline>
+        </div>
+      </div>
+      <div class="row mt-2">
+        <div class="col-6">
+          <h5 i18n>Search results</h5>
+          <div class="mt-1 pt-1 border-top">
+            <div *ngFor="let rec of results" class="bib-finder-results-row row mt-1">
+              <div class="col-3">
+                <button class="btn btn-success mr-1" (click)="close(rec.id)" i18n>Link</button>
+                <button class="btn btn-outline-dark mr-1" (click)="bibToDisplay = rec.id" i18n>View MARC</button>
+              </div>
+              <div class="col-9">
+                <span class="pr-1" i18n>Record {{rec.id}}:</span>
+                <span class="pr-1">{{rec.display.title}}</span>
+                <span class="pr-1">{{rec.display.author}}</span>
+                <span class="pr-1">{{rec.display.isbn}}</span>
+                <span class="pr-1">{{rec.display.issn}}</span>
+                <span class="pr-1">{{rec.display.pubdate}}</span>
+                <span class="pr-1">{{rec.display.publisher}}</span>
+              </div>
+            </div>
+          </div>
+        </div>
+        <div class="col-6">
+          <h5 i18n>MARC Display</h5>
+          <eg-marc-html recordType="bib" [recordId]="bibToDisplay" *ngIf="bibToDisplay"></eg-marc-html>
+        </div>
+      </div>
+    </div>
+    <div class="modal-footer">
+      <button type="button" class="btn btn-warning"
+        (click)="close()" i18n>Cancel</button>
+    </div>
+  </form>
+</ng-template>
+
diff --git a/Open-ILS/src/eg2/src/app/staff/acq/lineitem/bib-finder-dialog.component.ts b/Open-ILS/src/eg2/src/app/staff/acq/lineitem/bib-finder-dialog.component.ts
new file mode 100644 (file)
index 0000000..630400d
--- /dev/null
@@ -0,0 +1,107 @@
+import {Component, Input, ViewChild} from '@angular/core';
+import {Observable} from 'rxjs';
+import {map} from 'rxjs/operators';
+import {NgbModal, NgbModalOptions} from '@ng-bootstrap/ng-bootstrap';
+import {DialogComponent} from '@eg/share/dialog/dialog.component';
+import {NetService} from '@eg/core/net.service';
+import {EgEvent, EventService} from '@eg/core/event.service';
+import {IdlService, IdlObject} from '@eg/core/idl.service';
+import {ComboboxEntry} from '@eg/share/combobox/combobox.component';
+import {LineitemService} from './lineitem.service';
+import {BibRecordService, BibRecordSummary} from '@eg/share/catalog/bib-record.service';
+
+@Component({
+  selector: 'eg-acq-bib-finder-dialog',
+  styleUrls: ['./bib-finder-dialog.component.css'],
+  templateUrl: './bib-finder-dialog.component.html'
+})
+
+export class BibFinderDialogComponent extends DialogComponent {
+    @Input() liId: number;
+
+    queryString: string;
+    lineitem: IdlObject;
+    results: BibRecordSummary[] = [];
+    doingSearch = false;
+    bibToDisplay: number;
+
+    constructor(
+        private modal: NgbModal,
+        private net: NetService,
+        private evt: EventService,
+        private bib: BibRecordService,
+        private liService: LineitemService
+    ) {
+        super(modal);
+    }
+
+    open(args?: NgbModalOptions): Observable<any> {
+        if (!args) {
+            args = {};
+        }
+
+        this.queryString = '';
+        this.results.length = 0;
+        this.doingSearch = false;
+        this.bibToDisplay = null;
+        this.liService.getFleshedLineitems([this.liId], {fromCache: true}).subscribe(liStruct => {
+            this.lineitem = liStruct.lineitem;
+            this.queryString = this._buildDefaultQuery(this.lineitem);
+        });
+        return super.open(args);
+    }
+
+    _buildDefaultQuery(li: IdlObject): string {
+        let query = '';
+        ['title', 'author'].forEach(field => {
+            const attr = this.liService.getFirstAttributeValue(li, field);
+            if (attr.length) {
+                query += field + ':' + attr + ' ';
+            }
+        });
+        ['isbn', 'issn', 'upc'].forEach(field => {
+            const attr = this.liService.getFirstAttributeValue(li, field);
+            if (attr.length) {
+                query += 'identifier|' + field + ':' + attr + ' ';
+            }
+        });
+        return query;
+    }
+
+    submitSearch() {
+        this.results.length = 0;
+        this.bibToDisplay = null;
+        this.doingSearch = true;
+        this.net.request(
+            'open-ils.search',
+            'open-ils.search.biblio.multiclass.query.staff',
+            {limit: 15}, this.queryString, 1
+        ).subscribe(response => {
+            const evt = this.evt.parse(response);
+            if (evt) {
+                this.doingSearch = false;
+                return;
+            }
+            const ids = response.ids.map(x => x[0]);
+            if (ids.length < 1) {
+                this.doingSearch = false;
+                return;
+            }
+            const bibSummaries: {[id: number]: BibRecordSummary} = {};
+            this.bib.getBibSummaries(ids).subscribe(
+                summary => bibSummaries[summary.id] = summary,
+                err => {},
+                () => {
+                    this.doingSearch = false;
+                    ids.forEach(id => {
+                        if (bibSummaries[id]) {
+                            this.results.push(bibSummaries[id]);
+                        }
+                    });
+                }
+            );
+        });
+    }
+}
+
+
index 825c748..a67193a 100644 (file)
@@ -3,6 +3,7 @@
 <eg-acq-cancel-dialog recordType="li" #cancelDialog></eg-acq-cancel-dialog>
 <eg-acq-delete-lineitems-dialog #deleteLineitemsDialog></eg-acq-delete-lineitems-dialog>
 <eg-acq-add-copies-dialog #addCopiesDialog></eg-acq-add-copies-dialog>
+<eg-acq-bib-finder-dialog #bibFinderDialog></eg-acq-bib-finder-dialog>
 <eg-acq-batch-update-copies-dialog #batchUpdateCopiesDialog></eg-acq-batch-update-copies-dialog>
 <eg-acq-link-invoice-dialog #linkInvoiceDialog></eg-acq-link-invoice-dialog>
 <eg-acq-claim-policy-dialog #claimPolicyDialog></eg-acq-claim-policy-dialog>
               </a>
             </ng-container>
 
-            <!-- TODO link to catalog -->
+            <ng-container *ngIf="!li.eg_bib_id()">
+              <span class="ml-1 mr-1" i18n> | </span>
+              <a class="label-with-material-icon mr-2"
+                href="javascript:;" (click)="openBibFinder(li.id())"
+                title="Link to Catalog" i18n-title>
+                <span class="material-icons small mr-1">library_books</span>
+                <span i18n>Link to Catalog</span>
+              </a>
+            </ng-container>
 
             <span class="ml-1 mr-1" i18n> | </span>
             <a class="label-with-material-icon"
index 14a3047..14d12e5 100644 (file)
@@ -19,6 +19,7 @@ import {ConfirmDialogComponent} from '@eg/share/dialog/confirm.component';
 import {CancelDialogComponent} from './cancel-dialog.component';
 import {DeleteLineitemsDialogComponent} from './delete-lineitems-dialog.component';
 import {AddCopiesDialogComponent} from './add-copies-dialog.component';
+import {BibFinderDialogComponent} from './bib-finder-dialog.component';
 import {BatchUpdateCopiesDialogComponent} from './batch-update-copies-dialog.component';
 import {LinkInvoiceDialogComponent} from './link-invoice-dialog.component';
 import {ExportAttributesDialogComponent} from './export-attributes-dialog.component';
@@ -124,6 +125,7 @@ export class LineitemListComponent implements OnInit {
     @ViewChild('cancelDialog') cancelDialog: CancelDialogComponent;
     @ViewChild('deleteLineitemsDialog') deleteLineitemsDialog: DeleteLineitemsDialogComponent;
     @ViewChild('addCopiesDialog') addCopiesDialog: AddCopiesDialogComponent;
+    @ViewChild('bibFinderDialog') bibFinderDialog: BibFinderDialogComponent;
     @ViewChild('batchUpdateCopiesDialog') batchUpdateCopiesDialog: BatchUpdateCopiesDialogComponent;
     @ViewChild('linkInvoiceDialog') linkInvoiceDialog: LinkInvoiceDialogComponent;
     @ViewChild('exportAttributesDialog') exportAttributesDialog: ExportAttributesDialogComponent;
@@ -793,6 +795,30 @@ export class LineitemListComponent implements OnInit {
         });
     }
 
+    openBibFinder(liId: number) {
+        this.bibFinderDialog.liId = liId;
+        this.bibFinderDialog.open({size: 'xl'}).subscribe(bibId => {
+            if (!bibId) { return; }
+
+            const lis: IdlObject[] = [];
+            this.liService.getFleshedLineitems([liId], { fromCache: true }).subscribe(
+                liStruct => {
+                    liStruct.lineitem.eg_bib_id(bibId);
+                    liStruct.lineitem.attributes([]);
+                    lis.push(liStruct.lineitem);
+                },
+                err => { },
+                () => {
+                    this.net.request(
+                        'open-ils.acq',
+                        'open-ils.acq.lineitem.update',
+                        this.auth.token(), lis
+                    ).toPromise().then(resp => this.postBatchAction(resp, [liId]));
+                }
+            );
+        });
+    }
+
     batchUpdateCopiesOnLineitems() {
         const ids = Object.keys(this.selected).filter(id => this.selected[id]);
 
index d98742a..89d2780 100644 (file)
@@ -21,6 +21,7 @@ import {CancelDialogComponent} from './cancel-dialog.component';
 import {AddToPoDialogComponent} from './add-to-po-dialog.component';
 import {DeleteLineitemsDialogComponent} from './delete-lineitems-dialog.component';
 import {AddCopiesDialogComponent} from './add-copies-dialog.component';
+import {BibFinderDialogComponent} from './bib-finder-dialog.component';
 import {BatchUpdateCopiesDialogComponent} from './batch-update-copies-dialog.component';
 import {LinkInvoiceDialogComponent} from './link-invoice-dialog.component';
 import {ExportAttributesDialogComponent} from './export-attributes-dialog.component';
@@ -45,6 +46,7 @@ import {AcqCommonModule} from '../acq-common.module';
     AddToPoDialogComponent,
     DeleteLineitemsDialogComponent,
     AddCopiesDialogComponent,
+    BibFinderDialogComponent,
     BatchUpdateCopiesDialogComponent,
     LinkInvoiceDialogComponent,
     ExportAttributesDialogComponent,