--- /dev/null
+.bib-finder-results-row:nth-child(even) {
+ background-color: rgba(0,0,0,.03);
+}
--- /dev/null
+<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">×</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>
+
--- /dev/null
+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]);
+ }
+ });
+ }
+ );
+ });
+ }
+}
+
+
<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"
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';
@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;
});
}
+ 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]);
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';
AddToPoDialogComponent,
DeleteLineitemsDialogComponent,
AddCopiesDialogComponent,
+ BibFinderDialogComponent,
BatchUpdateCopiesDialogComponent,
LinkInvoiceDialogComponent,
ExportAttributesDialogComponent,