Revert "LP1952931 ASN Receiving UI / Li Table Experiment"
authorBill Erickson <berickxx@gmail.com>
Wed, 2 Feb 2022 16:59:38 +0000 (11:59 -0500)
committerBill Erickson <berickxx@gmail.com>
Fri, 11 Mar 2022 17:04:29 +0000 (12:04 -0500)
Staff prefer the scaled down grid view.

This reverts commit 8ee71edbe02fb9b1e3fd0a8846a46b90cf5f4f52.

Open-ILS/src/eg2/src/app/staff/acq/asn/receive.component.html
Open-ILS/src/eg2/src/app/staff/acq/asn/receive.component.ts
Open-ILS/src/eg2/src/app/staff/acq/asn/routing.module.ts
Open-ILS/src/eg2/src/app/staff/acq/lineitem/lineitem-list.component.ts

index 0d6f283..68d4005 100644 (file)
@@ -86,4 +86,55 @@ across different vendors to match a container code.
   </div>
 </div>
 
-<router-outlet (activate)="onListActivate($event)"></router-outlet>
+<!--
+<hr class="mt-2 mb-2"/>
+-->
+
+<ng-template #titleTmpl let-row="row">
+  <a target="_blank" 
+    fragment="{{row.lineitem.id()}}"
+    routerLink="/staff/acq/po/{{row.lineitem.purchase_order().id()}}">
+    {{row.title}}
+  </a>
+</ng-template>
+<ng-template #liIdTmpl let-row="row">
+  <a target="_blank" 
+    fragment="{{row.lineitem.id()}}"
+    routerLink="/staff/acq/po/{{row.lineitem.purchase_order().id()}}">
+    {{row.lineitem.id()}}
+  </a>
+</ng-template>
+<ng-template #poNameTmpl let-row="row">
+  <a target="_blank" 
+    routerLink="/staff/acq/po/{{row.lineitem.purchase_order().id()}}">
+    {{row.lineitem.purchase_order().name()}}
+  </a>
+</ng-template>
+
+<eg-grid *ngIf="container" #grid [dataSource]="gridDataSource" 
+  pageSize="50" (onRowActivate)="openLi($event)">
+
+  <eg-grid-toolbar-button i18n-label label="Receive All Items"
+    (onClick)="receiveAllItems()"></eg-grid-toolbar-button> 
+
+  <eg-grid-column i18n-label label="Entry ID" path="entry.id" 
+    [index]="true" [hidden]="true"></eg-grid-column>
+  <eg-grid-column i18n-label label="Lineitem ID" name="lineitem_id" 
+    [cellTemplate]="liIdTmpl"></eg-grid-column>
+  <eg-grid-column i18n-label label="Purchase Order" name="po_name" 
+    [cellTemplate]="poNameTmpl"></eg-grid-column>
+  <eg-grid-column i18n-label label="Title" name="title" flex="4" 
+    [cellTemplate]="titleTmpl"></eg-grid-column>
+  <eg-grid-column i18n-label label="ISBN" path="isbn"></eg-grid-column>
+  <eg-grid-column i18n-label label="ISSN" path="issn" [hidden]="true"></eg-grid-column>
+  <eg-grid-column i18n-label label="UPC" path="upc" [hidden]="true"></eg-grid-column>
+  <eg-grid-column i18n-label label="In Shipment" path="entry.item_count"></eg-grid-column>
+  <eg-grid-column i18n-label label="Ordered" path="lineitem.order_summary.item_count"></eg-grid-column>
+  <eg-grid-column i18n-label label="Pending Receive" path="recievable_count"></eg-grid-column>
+  <eg-grid-column i18n-label label="Received" path="lineitem.order_summary.recv_count"></eg-grid-column>
+  <eg-grid-column i18n-label label="Invoiced" path="lineitem.order_summary.invoice_count"></eg-grid-column>
+  <eg-grid-column i18n-label label="Canceled" path="lineitem.order_summary.cancel_count"></eg-grid-column>
+  <eg-grid-column i18n-label label="Delayed" path="lineitem.order_summary.delay_count"></eg-grid-column>
+</eg-grid>
+
+
index 55dbca6..0f5ad15 100644 (file)
@@ -1,4 +1,4 @@
-import {Component, OnInit, AfterViewInit, ViewChild} from '@angular/core';
+import {Component, OnInit, ViewChild} from '@angular/core';
 import {Router, ActivatedRoute, ParamMap} from '@angular/router';
 import {Location} from '@angular/common';
 import {Observable, Observer, of, from} from 'rxjs';
@@ -7,12 +7,13 @@ import {IdlObject} from '@eg/core/idl.service';
 import {PcrudService} from '@eg/core/pcrud.service';
 import {LineitemService} from '../lineitem/lineitem.service';
 import {Pager} from '@eg/share/util/pager';
-import {LineitemListComponent} from '../lineitem/lineitem-list.component';
+import {GridDataSource, GridColumn, GridCellTextGenerator} from '@eg/share/grid/grid';
+import {GridComponent} from '@eg/share/grid/grid.component';
 
 @Component({
   templateUrl: 'receive.component.html'
 })
-export class AsnReceiveComponent implements OnInit, AfterViewInit {
+export class AsnReceiveComponent implements OnInit {
 
     barcode = '';
 
@@ -20,7 +21,9 @@ export class AsnReceiveComponent implements OnInit, AfterViewInit {
     container: IdlObject;
     entries: IdlObject[] = [];
     containers: IdlObject[] = [];
-    liList: LineitemListComponent;
+
+    @ViewChild('grid') private grid: GridComponent;
+    gridDataSource: GridDataSource = new GridDataSource();
 
     constructor(
         private route: ActivatedRoute,
@@ -32,21 +35,30 @@ export class AsnReceiveComponent implements OnInit, AfterViewInit {
 
     ngOnInit() {
         this.barcode = this.route.snapshot.paramMap.get('containerCode') || '';
-    }
-
-    ngAfterViewInit() {
         if (this.barcode) {
-            setTimeout(() => this.findContainer());
+            this.findContainer();
         }
-    }
 
-    onListActivate(liList: LineitemListComponent) {
-        this.liList = liList;
+        this.gridDataSource.getRows = (pager: Pager, sort: any[]) => {
+            return from(this.entries.map(e => this.gridifyEntry(e)));
+        };
     }
 
-    isBasePage(): boolean {
-        return !this.route.firstChild ||
-            this.route.firstChild.snapshot.url.length === 0;
+    gridifyEntry(entry: IdlObject): any {
+        const li = entry.lineitem();
+        const sum = li.order_summary();
+        return {
+            entry: entry,
+            lineitem: li,
+            title: this.li.getFirstAttributeValue(li, 'title'),
+            author: this.li.getFirstAttributeValue(li, 'author'),
+            isbn: this.li.getFirstAttributeValue(li, 'isbn'),
+            issn: this.li.getFirstAttributeValue(li, 'issn'),
+            upc: this.li.getFirstAttributeValue(li, 'upc'),
+            recievable_count: sum.item_count() - (
+                sum.recv_count() + sum.cancel_count()
+            )
+        };
     }
 
     findContainer() {
@@ -58,19 +70,19 @@ export class AsnReceiveComponent implements OnInit, AfterViewInit {
             {container_code: this.barcode},
             {flesh: 1, flesh_fields: {acqsn: ['entries', 'provider']}}
         ).subscribe(
-            sn => this.containers.push(sn),
-            _ => {},
-            () => {
-
-                // TODO handle multiple containers w/ same code
-                if (this.containers.length === 1) {
-                    this.container = this.containers[0];
-                    this.loadContainer();
-                }
-
-                const node = document.getElementById('barcode-search-input');
-                (node as HTMLInputElement).select();
-            }
+          sn => this.containers.push(sn),
+          _ => {},
+          () => {
+
+              // TODO handle multiple containers w/ same code
+              if (this.containers.length === 1) {
+                  this.container = this.containers[0];
+                  this.loadContainer();
+              }
+
+              const node = document.getElementById('barcode-search-input');
+              (node as HTMLInputElement).select();
+          }
         );
     }
 
@@ -81,8 +93,19 @@ export class AsnReceiveComponent implements OnInit, AfterViewInit {
 
         if (entries.length === 0) { return; }
 
-        this.liList.fromLineitemIds = entries.map(e => e.lineitem());
-        this.liList.load();
+        this.li.getFleshedLineitems(entries.map(e => e.lineitem()), {})
+        .subscribe(
+            li_struct => {
+                // Flesh the lineitems directly in the shipment entry
+                const entry = entries.filter(e => e.lineitem() === li_struct.id)[0];
+                entry.lineitem(li_struct.lineitem);
+            },
+            _ => {},
+            () => {
+                this.entries = entries;
+                this.grid.reload();
+            }
+        );
     }
 
     openLi(row: any) {
index 811018e..b4d0f67 100644 (file)
@@ -14,23 +14,8 @@ const routes: Routes = [{
   component: AsnReceiveComponent
 }, {
   path: 'receive/:containerCode',
-  component: AsnReceiveComponent,
-  children : [{
-    path: '',
-    component: LineitemListComponent
-  }, {
-    path: 'lineitem/:lineitemId/detail',
-    component: LineitemDetailComponent
-  }, {
-    path: 'lineitem/:lineitemId/history',
-    component: LineitemHistoryComponent
-  }, {
-    path: 'lineitem/:lineitemId/items',
-    component: LineitemCopiesComponent
-  }, {
-    path: 'lineitem/:lineitemId/worksheet',
-    component: LineitemWorksheetComponent
-  }]
+  component: AsnReceiveComponent
+
 }];
 
 @NgModule({
index aa007b5..c739bb3 100644 (file)
@@ -45,7 +45,6 @@ export class LineitemListComponent implements OnInit {
     picklistId: number = null;
     poId: number = null;
     recordId: number = null; // lineitems related to a bib.
-    fromLineitemIds: number[] = null;
 
     loading = false;
     pager: Pager = new Pager();
@@ -240,8 +239,8 @@ export class LineitemListComponent implements OnInit {
     load(): Promise<any> {
         this.pageOfLineitems = [];
 
-        if (!this.loading && this.pager.limit && (this.poId ||
-            this.picklistId || this.recordId || this.fromLineitemIds)) {
+        if (!this.loading && this.pager.limit &&
+            (this.poId || this.picklistId || this.recordId)) {
 
             this.loading = true;
 
@@ -264,8 +263,6 @@ export class LineitemListComponent implements OnInit {
 
         if (this.picklistId) {
             Object.assign(searchTerms, { jub: [ { picklist: this.picklistId } ] });
-        } else if (this.fromLineitemIds) {
-            Object.assign(searchTerms, { jub: [ { id: this.fromLineitemIds } ] });
         } else if (this.recordId) {
             Object.assign(searchTerms, { jub: [ { eg_bib_id: this.recordId } ] });
         } else {