From: Bill Erickson Date: Tue, 26 Mar 2019 15:17:35 +0000 (-0400) Subject: LP1821382 Add Items to Bucket menu action X-Git-Url: https://old-git.evergreen-ils.org/?a=commitdiff_plain;h=e4f4d618e2a0c2af8e804f11b0ad0a67165efe53;p=working%2FEvergreen.git LP1821382 Add Items to Bucket menu action Includes changes to the existing record bucket dialog to support all bucket types. Signed-off-by: Bill Erickson --- diff --git a/Open-ILS/src/eg2/src/app/staff/cat/vandelay/queue.component.html b/Open-ILS/src/eg2/src/app/staff/cat/vandelay/queue.component.html index e4ef84565b..2c1b3c3215 100644 --- a/Open-ILS/src/eg2/src/app/staff/cat/vandelay/queue.component.html +++ b/Open-ILS/src/eg2/src/app/staff/cat/vandelay/queue.component.html @@ -75,8 +75,8 @@
  • - - + +
    Copy Queue To Bucket diff --git a/Open-ILS/src/eg2/src/app/staff/catalog/basket-actions.component.html b/Open-ILS/src/eg2/src/app/staff/catalog/basket-actions.component.html index 5837acee84..4857db8cc1 100644 --- a/Open-ILS/src/eg2/src/app/staff/catalog/basket-actions.component.html +++ b/Open-ILS/src/eg2/src/app/staff/catalog/basket-actions.component.html @@ -1,5 +1,5 @@ - - + +
    diff --git a/Open-ILS/src/eg2/src/app/staff/catalog/basket-actions.component.ts b/Open-ILS/src/eg2/src/app/staff/catalog/basket-actions.component.ts index e00a396d17..f96df6fd75 100644 --- a/Open-ILS/src/eg2/src/app/staff/catalog/basket-actions.component.ts +++ b/Open-ILS/src/eg2/src/app/staff/catalog/basket-actions.component.ts @@ -5,8 +5,8 @@ import {Router} from '@angular/router'; import {NetService} from '@eg/core/net.service'; import {AuthService} from '@eg/core/auth.service'; import {PrintService} from '@eg/share/print/print.service'; -import {RecordBucketDialogComponent - } from '@eg/staff/share/buckets/record-bucket-dialog.component'; +import {BucketDialogComponent + } from '@eg/staff/share/buckets/bucket-dialog.component'; @Component({ selector: 'eg-catalog-basket-actions', @@ -17,7 +17,7 @@ export class BasketActionsComponent implements OnInit { basketAction: string; @ViewChild('addBasketToBucketDialog') - addToBucketDialog: RecordBucketDialogComponent; + addToBucketDialog: BucketDialogComponent; constructor( private router: Router, @@ -89,8 +89,12 @@ export class BasketActionsComponent implements OnInit { case 'bucket': this.basket.getRecordIds().then(ids => { - this.addToBucketDialog.recordId = ids; - this.addToBucketDialog.open({size: 'lg'}); + this.addToBucketDialog.bucketClass = 'biblio'; + this.addToBucketDialog.itemIds = ids; + this.addToBucketDialog.open({size: 'lg'}).then( + ok => {}, + dismissed => {} + ); }); break; diff --git a/Open-ILS/src/eg2/src/app/staff/catalog/record/actions.component.html b/Open-ILS/src/eg2/src/app/staff/catalog/record/actions.component.html index c52609925e..7634103fd7 100644 --- a/Open-ILS/src/eg2/src/app/staff/catalog/record/actions.component.html +++ b/Open-ILS/src/eg2/src/app/staff/catalog/record/actions.component.html @@ -10,8 +10,8 @@ - - + +
    diff --git a/Open-ILS/src/eg2/src/app/staff/catalog/record/holdings.component.html b/Open-ILS/src/eg2/src/app/staff/catalog/record/holdings.component.html index 42366eded1..dddba6ede2 100644 --- a/Open-ILS/src/eg2/src/app/staff/catalog/record/holdings.component.html +++ b/Open-ILS/src/eg2/src/app/staff/catalog/record/holdings.component.html @@ -49,6 +49,7 @@ +
    @@ -106,6 +107,11 @@ (onClick)="openItemNotes($event, 'create')"> + + Z + 0) { + this.bucketDialog.bucketClass = 'copy'; + this.bucketDialog.itemIds = copyIds; + this.bucketDialog.open({size: 'lg'}).then( + // No need to reload the grid after adding items to buckets. + () => {}, + dismissed => {} + ); + } + } } diff --git a/Open-ILS/src/eg2/src/app/staff/catalog/result/record.component.html b/Open-ILS/src/eg2/src/app/staff/catalog/result/record.component.html index 90f066b1e9..9a65dafc60 100644 --- a/Open-ILS/src/eg2/src/app/staff/catalog/result/record.component.html +++ b/Open-ILS/src/eg2/src/app/staff/catalog/result/record.component.html @@ -3,8 +3,6 @@ routerLink's egDateFilter's --> - -
    @@ -127,16 +125,6 @@ Place Hold -
    diff --git a/Open-ILS/src/eg2/src/app/staff/common.module.ts b/Open-ILS/src/eg2/src/app/staff/common.module.ts index 5a83f8ac29..9c822a2c6c 100644 --- a/Open-ILS/src/eg2/src/app/staff/common.module.ts +++ b/Open-ILS/src/eg2/src/app/staff/common.module.ts @@ -17,7 +17,7 @@ import {StringService} from '@eg/share/string/string.service'; import {TitleComponent} from '@eg/share/title/title.component'; import {FmRecordEditorComponent} from '@eg/share/fm-editor/fm-editor.component'; import {DateSelectComponent} from '@eg/share/date-select/date-select.component'; -import {RecordBucketDialogComponent} from '@eg/staff/share/buckets/record-bucket-dialog.component'; +import {BucketDialogComponent} from '@eg/staff/share/buckets/bucket-dialog.component'; import {BibSummaryComponent} from '@eg/staff/share/bib-summary/bib-summary.component'; import {TranslateComponent} from '@eg/staff/share/translate/translate.component'; import {AdminPageComponent} from '@eg/staff/share/admin-page/admin-page.component'; @@ -40,7 +40,7 @@ import {AdminPageComponent} from '@eg/staff/share/admin-page/admin-page.componen OpChangeComponent, FmRecordEditorComponent, DateSelectComponent, - RecordBucketDialogComponent, + BucketDialogComponent, BibSummaryComponent, TranslateComponent, AdminPageComponent @@ -64,7 +64,7 @@ import {AdminPageComponent} from '@eg/staff/share/admin-page/admin-page.componen OpChangeComponent, FmRecordEditorComponent, DateSelectComponent, - RecordBucketDialogComponent, + BucketDialogComponent, BibSummaryComponent, TranslateComponent, AdminPageComponent diff --git a/Open-ILS/src/eg2/src/app/staff/share/buckets/bucket-dialog.component.html b/Open-ILS/src/eg2/src/app/staff/share/buckets/bucket-dialog.component.html new file mode 100644 index 0000000000..32b6e2ec74 --- /dev/null +++ b/Open-ILS/src/eg2/src/app/staff/share/buckets/bucket-dialog.component.html @@ -0,0 +1,60 @@ + + + + diff --git a/Open-ILS/src/eg2/src/app/staff/share/buckets/bucket-dialog.component.ts b/Open-ILS/src/eg2/src/app/staff/share/buckets/bucket-dialog.component.ts new file mode 100644 index 0000000000..1300f0f3e3 --- /dev/null +++ b/Open-ILS/src/eg2/src/app/staff/share/buckets/bucket-dialog.component.ts @@ -0,0 +1,196 @@ +import {Component, OnInit, Input, Renderer2} from '@angular/core'; +import {NetService} from '@eg/core/net.service'; +import {IdlService} from '@eg/core/idl.service'; +import {EventService} from '@eg/core/event.service'; +import {ToastService} from '@eg/share/toast/toast.service'; +import {AuthService} from '@eg/core/auth.service'; +import {DialogComponent} from '@eg/share/dialog/dialog.component'; +import {NgbModal} from '@ng-bootstrap/ng-bootstrap'; +import {ComboboxEntry} from '@eg/share/combobox/combobox.component'; + +/** + * Dialog for adding bib records to new and existing record buckets. + */ + +@Component({ + selector: 'eg-bucket-dialog', + templateUrl: 'bucket-dialog.component.html' +}) + +export class BucketDialogComponent extends DialogComponent implements OnInit { + + selectedBucket: number; + newBucketName: string; + newBucketDesc: string; + buckets: any[]; + + @Input() bucketClass: 'biblio' | 'user' | 'callnumber' | 'copy'; + @Input() bucketType: string; // e.g. staff_client + + // ID's of items to add to the bucket + @Input() itemIds: number[]; + + // If set, itemIds will be derived from the records in a bib queue + @Input() fromBibQueue: number; + + // bucket item classes are these plus a following 'i'. + bucketFmClass: 'ccb' | 'ccnb' | 'cbreb' | 'cub'; + targetField: string; + + constructor( + private modal: NgbModal, // required for passing to parent + private renderer: Renderer2, + private toast: ToastService, + private idl: IdlService, + private net: NetService, + private evt: EventService, + private auth: AuthService) { + super(modal); // required for subclassing + this.buckets = []; + this.itemIds = []; + this.fromBibQueue = null; + } + + ngOnInit() { + this.onOpen$.subscribe(ok => { + this.reset(); // Reset data on dialog open + this.net.request( + 'open-ils.actor', + 'open-ils.actor.container.retrieve_by_class.authoritative', + this.auth.token(), this.auth.user().id(), + this.bucketClass, this.bucketType + ).subscribe(buckets => this.buckets = buckets); + }); + } + + reset() { + this.selectedBucket = null; + this.newBucketName = ''; + this.newBucketDesc = ''; + + if (!this.bucketClass) { + this.bucketClass = 'biblio'; + } + + switch (this.bucketClass) { + case 'biblio': + if (this.fromBibQueue) { + this.bucketType = 'vandelay_queue'; + } + this.bucketFmClass = 'cbreb'; + this.targetField = 'target_biblio_record_entry'; + break; + case 'copy': + this.bucketFmClass = 'ccb'; + this.targetField = 'target_copy'; + break; + case 'callnumber': + this.bucketFmClass = 'ccnb'; + this.targetField = 'target_call_number'; + break; + case 'user': + this.bucketFmClass = 'cub'; + this.targetField = 'target_user'; + } + + if (!this.bucketType) { + this.bucketType = 'staff_client'; + } + } + + addToSelected() { + this.addToBucket(this.selectedBucket); + } + + bucketChanged(entry: ComboboxEntry) { + if (entry) { + this.selectedBucket = entry.id; + } else { + this.selectedBucket = null; + } + } + + formatBucketEntries(): ComboboxEntry[] { + return this.buckets.map(b => ({id: b.id(), label: b.name()})); + } + + // Create a new bucket then add the record + addToNew() { + const bucket = this.idl.create(this.bucketFmClass); + + bucket.owner(this.auth.user().id()); + bucket.name(this.newBucketName); + bucket.description(this.newBucketDesc); + bucket.btype(this.bucketType); + + this.net.request( + 'open-ils.actor', + 'open-ils.actor.container.create', + this.auth.token(), this.bucketClass, bucket + ).subscribe(bktId => { + const evt = this.evt.parse(bktId); + if (evt) { + this.toast.danger(evt.desc); + } else { + // make it find-able to the queue-add method which + // requires the bucket name. + bucket.id(bktId); + this.buckets.push(bucket); + this.addToBucket(bktId); + } + }); + } + + addToBucket(id: number) { + if (this.itemIds.length > 0) { + this.addRecordToBucket(id); + } else if (this.fromBibQueue) { + this.addBibQueueToBucket(id); + } + } + + // Add the record(s) to the bucket with provided ID. + addRecordToBucket(bucketId: number) { + const items = []; + this.itemIds.forEach(itemId => { + const item = this.idl.create(this.bucketFmClass + 'i'); + item.bucket(bucketId); + item[this.targetField](itemId); + items.push(item); + }); + + this.net.request( + 'open-ils.actor', + 'open-ils.actor.container.item.create', + this.auth.token(), this.bucketClass, items + ).subscribe(resp => { + const evt = this.evt.parse(resp); + if (evt) { + this.toast.danger(evt.toString()); + } else { + this.close(); + } + }); + } + + addBibQueueToBucket(bucketId: number) { + const bucket = this.buckets.filter(b => b.id() === bucketId)[0]; + if (!bucket) { return; } + + this.net.request( + 'open-ils.vandelay', + 'open-ils.vandelay.bib_queue.to_bucket', + this.auth.token(), this.fromBibQueue, bucket.name() + ).toPromise().then(resp => { + const evt = this.evt.parse(resp); + if (evt) { + this.toast.danger(evt.toString()); + } else { + this.close(); + } + }); + } +} + + + diff --git a/Open-ILS/src/eg2/src/app/staff/share/buckets/record-bucket-dialog.component.html b/Open-ILS/src/eg2/src/app/staff/share/buckets/record-bucket-dialog.component.html deleted file mode 100644 index a2c88b8e34..0000000000 --- a/Open-ILS/src/eg2/src/app/staff/share/buckets/record-bucket-dialog.component.html +++ /dev/null @@ -1,64 +0,0 @@ - - - - diff --git a/Open-ILS/src/eg2/src/app/staff/share/buckets/record-bucket-dialog.component.ts b/Open-ILS/src/eg2/src/app/staff/share/buckets/record-bucket-dialog.component.ts deleted file mode 100644 index f1f6f19cfa..0000000000 --- a/Open-ILS/src/eg2/src/app/staff/share/buckets/record-bucket-dialog.component.ts +++ /dev/null @@ -1,160 +0,0 @@ -import {Component, OnInit, Input, Renderer2} from '@angular/core'; -import {NetService} from '@eg/core/net.service'; -import {IdlService} from '@eg/core/idl.service'; -import {EventService} from '@eg/core/event.service'; -import {ToastService} from '@eg/share/toast/toast.service'; -import {AuthService} from '@eg/core/auth.service'; -import {DialogComponent} from '@eg/share/dialog/dialog.component'; -import {NgbModal} from '@ng-bootstrap/ng-bootstrap'; - -/** - * Dialog for adding bib records to new and existing record buckets. - */ - -@Component({ - selector: 'eg-record-bucket-dialog', - templateUrl: 'record-bucket-dialog.component.html' -}) - -export class RecordBucketDialogComponent - extends DialogComponent implements OnInit { - - selectedBucket: number; - newBucketName: string; - newBucketDesc: string; - buckets: any[]; - - @Input() bucketType: string; - - // Add one or more bib records to bucket by ID. - recIds: number[]; - @Input() set recordId(id: number | number[]) { - this.recIds = [].concat(id); - } - - // Add items from a (vandelay) bib queue to a bucket - qId: number; - @Input() set queueId(id: number) { - this.qId = id; - } - - constructor( - private modal: NgbModal, // required for passing to parent - private renderer: Renderer2, - private toast: ToastService, - private idl: IdlService, - private net: NetService, - private evt: EventService, - private auth: AuthService) { - super(modal); // required for subclassing - this.recIds = []; - } - - ngOnInit() { - - if (this.qId) { - this.bucketType = 'vandelay_queue'; - } else { - this.bucketType = 'staff_client'; - } - - this.onOpen$.subscribe(ok => { - // Reset data on dialog open - - this.selectedBucket = null; - this.newBucketName = ''; - this.newBucketDesc = ''; - - this.net.request( - 'open-ils.actor', - 'open-ils.actor.container.retrieve_by_class.authoritative', - this.auth.token(), this.auth.user().id(), - 'biblio', this.bucketType - ).subscribe(buckets => this.buckets = buckets); - }); - } - - addToSelected() { - this.addToBucket(this.selectedBucket); - } - - // Create a new bucket then add the record - addToNew() { - const bucket = this.idl.create('cbreb'); - - bucket.owner(this.auth.user().id()); - bucket.name(this.newBucketName); - bucket.description(this.newBucketDesc); - bucket.btype(this.bucketType); - - this.net.request( - 'open-ils.actor', - 'open-ils.actor.container.create', - this.auth.token(), 'biblio', bucket - ).subscribe(bktId => { - const evt = this.evt.parse(bktId); - if (evt) { - this.toast.danger(evt.desc); - } else { - // make it find-able to the queue-add method which - // requires the bucket name. - bucket.id(bktId); - this.buckets.push(bucket); - this.addToBucket(bktId); - } - }); - } - - addToBucket(id: number) { - if (this.recIds.length > 0) { - this.addRecordToBucket(id); - } else if (this.qId) { - this.addQueueToBucket(id); - } - } - - // Add the record(s) to the bucket with provided ID. - addRecordToBucket(bucketId: number) { - const items = []; - this.recIds.forEach(recId => { - const item = this.idl.create('cbrebi'); - item.bucket(bucketId); - item.target_biblio_record_entry(recId); - items.push(item); - }); - - this.net.request( - 'open-ils.actor', - 'open-ils.actor.container.item.create', - this.auth.token(), 'biblio', items - ).subscribe(resp => { - const evt = this.evt.parse(resp); - if (evt) { - this.toast.danger(evt.toString()); - } else { - this.close(); - } - }); - } - - addQueueToBucket(bucketId: number) { - const bucket = this.buckets.filter(b => b.id() === bucketId)[0]; - if (!bucket) { return; } - - this.net.request( - 'open-ils.vandelay', - 'open-ils.vandelay.bib_queue.to_bucket', - this.auth.token(), this.qId, bucket.name() - ).toPromise().then(resp => { - const evt = this.evt.parse(resp); - if (evt) { - this.toast.danger(evt.toString()); - } else { - this.close(); - } - }); - } -} - - -