LP#1775466 Catalog add to bucket action
authorBill Erickson <berickxx@gmail.com>
Fri, 22 Jun 2018 20:41:59 +0000 (16:41 -0400)
committerBill Erickson <berickxx@gmail.com>
Fri, 22 Jun 2018 20:41:59 +0000 (16:41 -0400)
Signed-off-by: Bill Erickson <berickxx@gmail.com>
Open-ILS/src/eg2/src/app/staff/catalog/catalog.module.ts
Open-ILS/src/eg2/src/app/staff/catalog/record/actions.component.html
Open-ILS/src/eg2/src/app/staff/share/buckets/record-bucket-dialog.component.html [new file with mode: 0644]
Open-ILS/src/eg2/src/app/staff/share/buckets/record-bucket-dialog.component.ts [new file with mode: 0644]

index 8c1a421..26f0db3 100644 (file)
@@ -18,6 +18,7 @@ import {StaffCatalogService} from './catalog.service';
 import {RecordPaginationComponent} from './record/pagination.component';
 import {RecordActionsComponent} from './record/actions.component';
 import {MarcViewComponent} from './record/marc-view.component';
+import {RecordBucketDialogComponent} from '@eg/staff/share/buckets/record-bucket-dialog.component';
 
 @NgModule({
   declarations: [
@@ -32,7 +33,8 @@ import {MarcViewComponent} from './record/marc-view.component';
     ResultPaginationComponent,
     RecordPaginationComponent,
     RecordActionsComponent,
-    MarcViewComponent
+    MarcViewComponent,
+    RecordBucketDialogComponent
   ],
   imports: [
     StaffCommonModule,
index fed3c1c..53b7342 100644 (file)
@@ -10,6 +10,9 @@
 <eg-string key="catalog.record.toast.cleared" 
   text="Record Marks Cleared"></eg-string>
 
+<eg-record-bucket-dialog #recordBucketDialog [recordId]="recId">
+</eg-record-bucket-dialog>
+
 <div class="row ml-0 mr-0">
 
   <div ngbDropdown placement="bottom-right" class="ml-1">
@@ -50,6 +53,9 @@
     <button class="btn btn-info" id="otherActionsForDd" 
       ngbDropdownToggle i18n>Other Actions</button>
     <div ngbDropdownMenu aria-labelledby="otherActionsForDd">
+      <button class="dropdown-item" (click)="recordBucketDialog.open({size: 'lg'})">
+        <span i18n>Add To Bucket</span>
+      </button>
       <a class="dropdown-item" 
         href="/eg/staff/acq/legacy/lineitem/related/{{recId}}?target=bib">
         <span i18n>View/Place Orders</span>
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
new file mode 100644 (file)
index 0000000..3502ad8
--- /dev/null
@@ -0,0 +1,56 @@
+<ng-template #dialogContent>
+  <div class="modal-header bg-info">
+    <h4 class="modal-title" i18n>Add To Bucket</h4>
+    <button type="button" class="close" 
+      i18n-aria-label aria-label="Close" 
+      (click)="dismiss('cross_click')">
+      <span aria-hidden="true">&times;</span>
+    </button>
+  </div>
+  <div class="modal-body">
+    <div class="row">
+      <div class="col-lg-3 font-weight-bold" i18n>Name of existing bucket</div>
+      <div class="col-lg-5">
+         <select 
+          class="form-control"
+          placeholder="Existing Bucket..."
+          i18n-placeholder
+          [(ngModel)]="selectedBucket">
+          <option *ngFor="let bkt of buckets" 
+            value="{{bkt.id()}}">{{bkt.name()}}</option>
+        </select>
+      </div>
+      <div class="col-lg-4">
+        <button class="btn btn-info" (click)="addToSelected()" i18n 
+          [disabled]="!selectedBucket">
+          Add To Selected Bucket
+        </button>
+      </div>
+    </div>
+    <div class="row mt-3">
+      <div class="col-lg-3 font-weight-bold" i18n>Name of new bucket</div>
+      <div class="col-lg-5">
+        <input type="text" class="form-control" 
+          placeholder="New Bucket Name..."
+          i18n-placeholder
+          [(ngModel)]="newBucketName"/>
+      </div>
+      <div class="col-lg-4">
+        <button class="btn btn-info" (click)="addToNew()" i18n 
+          [disabled]="!newBucketName">
+          Add To New Bucket
+        </button>
+      </div>
+    </div>
+    <div class="row mt-3">
+      <div class="col-lg-3 font-weight-bold" i18n>New bucket description</div>
+      <div class="col-lg-5">
+        <textarea size="3" type="text" class="form-control" 
+          placeholder="Optional New Bucket Description..."
+          i18n-placeholder
+          [(ngModel)]="newBucketDesc">
+        </textarea>
+      </div>
+    </div>
+  </div>
+</ng-template>
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
new file mode 100644 (file)
index 0000000..bca5b69
--- /dev/null
@@ -0,0 +1,109 @@
+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[];
+
+    recId: number;
+    @Input() set recordId(id: number) {
+        this.recId = 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
+    }
+
+    ngOnInit() {
+
+        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', 'staff_client'
+            ).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('staff_client');
+
+        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 {
+                this.addToBucket(bktId);
+            }
+        });
+    }
+
+    // Add the record to the selected existing bucket
+    addToBucket(id: number) {
+        const item = this.idl.create('cbrebi');
+        item.bucket(id);
+        item.target_biblio_record_entry(this.recId);
+        this.net.request(
+            'open-ils.actor', 
+            'open-ils.actor.container.item.create',
+            this.auth.token(), 'biblio', item
+        ).subscribe(resp => {
+            const evt = this.evt.parse(resp);
+            if (evt) {
+                this.toast.danger(evt.toString());
+            } else {
+                this.close();
+            }
+        });
+    }
+}
+
+
+