LP1936233 Respond to broadcast item updates; title link
authorBill Erickson <berickxx@gmail.com>
Thu, 5 Aug 2021 16:01:36 +0000 (12:01 -0400)
committerBill Erickson <berickxx@gmail.com>
Thu, 5 Aug 2021 16:01:36 +0000 (12:01 -0400)
Signed-off-by: Bill Erickson <berickxx@gmail.com>
Open-ILS/src/eg2/src/app/staff/cat/item/status.component.html
Open-ILS/src/eg2/src/app/staff/cat/item/status.component.ts

index 15235db..acebc24 100644 (file)
@@ -26,6 +26,8 @@
   text="There is no corresponding purchase order for this item.">
 </eg-string>
 
+<eg-string #itemModified i18n-text text="Item Successfully Modified"></eg-string>
+
 <div class="row mb-3">
   <div class="col-lg-12 form-inline d-flex">
     <div class="input-group">
   {{r.call_number().suffix().label()}}
 </ng-template>
 
+<ng-template #titleTemplate let-r="row">
+  <ng-container *ngIf="r.call_number().id() == -1">
+    {{r.dummy_title()}}
+  </ng-container>
+  <ng-container *ngIf="r.call_number().id() > 0">
+    <a target="_blank"
+      routerLink="/staff/catalog/record/{{r.call_number().record().id()}}">
+      {{r.call_number().record().simple_record().title()}}
+    </a>
+  </ng-container>
+</ng-template>
+
+
 <eg-grid *ngIf="tab == 'list'" #grid [dataSource]="dataSource" idlClass="acp"
   (onRowActivate)="showDetails($event)" [cellTextGenerator]="cellTextGenerator"
   [useLocalSort]="true" [sortable]="true" [showDeclaredFieldsOnly]="true"
+  [rowFlairIsEnabled]="true" [rowFlairCallback]="rowFlair"
   [disablePaging]="true" persistKey="cat.item.status.list">
 
   <eg-grid-toolbar-button i18n-label label="Clear List" (onClick)="clearList()">
   <eg-grid-column i18n-label label="Call Number" name="call_number_label" 
     [cellTemplate]="callNumberTemplate"></eg-grid-column>
 
-  <eg-grid-column i18n-label label="Title"
-    path="call_number.record.simple_record.title"></eg-grid-column>
+  <eg-grid-column i18n-label label="Title" name="title" 
+    [cellTemplate]="titleTemplate"></eg-grid-column>
 
   <eg-grid-column path="call_number.*" [hidden]="true"></eg-grid-column>
   <eg-grid-column path="call_number.record.*" [hidden]="true"></eg-grid-column>
index 3be53f3..101b903 100644 (file)
@@ -44,13 +44,16 @@ import {MarkMissingDialogComponent
 import {AnonCacheService} from '@eg/share/util/anon-cache.service';
 import {ToastService} from '@eg/share/toast/toast.service';
 import {StringService} from '@eg/share/string/string.service';
+import {StringComponent} from '@eg/share/string/string.component';
 import {ConfirmDialogComponent} from '@eg/share/dialog/confirm.component';
 import {MarkItemsDialogComponent
     } from '@eg/staff/share/holdings/mark-items-dialog.component';
-import {GridDataSource, GridColumn, GridCellTextGenerator} from '@eg/share/grid/grid';
+import {GridDataSource, GridColumn, GridCellTextGenerator,
+    GridRowFlairEntry} from '@eg/share/grid/grid';
 import {GridComponent} from '@eg/share/grid/grid.component';
 import {Pager} from '@eg/share/util/pager';
 import {ItemStatusService} from './item.service';
+import {BroadcastService} from '@eg/share/util/broadcast.service';
 
 @Component({
   templateUrl: 'status.component.html'
@@ -68,6 +71,7 @@ export class ItemStatusComponent implements OnInit, AfterViewInit {
     tab: string;
     preloadCopyIds: number[];
 
+    rowFlair: (row: IdlObject) => GridRowFlairEntry;
     cellTextGenerator: GridCellTextGenerator;
     dataSource: GridDataSource = new GridDataSource();
     @ViewChild('grid') private grid: GridComponent;
@@ -102,6 +106,8 @@ export class ItemStatusComponent implements OnInit, AfterViewInit {
         private cancelTransitDialog: CancelTransitDialogComponent;
     @ViewChild('markItemsDialog')
         private markItemsDialog: MarkItemsDialogComponent;
+    @ViewChild('itemModified')
+        private itemModified: StringComponent;
 
     constructor(
         private router: Router,
@@ -121,6 +127,7 @@ export class ItemStatusComponent implements OnInit, AfterViewInit {
         private toast: ToastService,
         private strings: StringService,
         private anonCache: AnonCacheService,
+        private broadcaster: BroadcastService,
         private itemService: ItemStatusService
     ) {}
 
@@ -144,11 +151,41 @@ export class ItemStatusComponent implements OnInit, AfterViewInit {
             }
         }
 
+        this.broadcaster.listen('eg.holdings.update').subscribe(data => {
+            if (data && data.copies) {
+                const copies = [];
+                this.itemService.scannedItems.forEach(item => {
+                    if (data.copies.includes(item.id())) {
+                        item.ischanged(true); // for grid flair
+                        copies.push(item);
+                    }
+                });
+
+                if (copies.length > 0) {
+                    this.refreshSelectCopies(copies);
+                }
+            }
+        });
+
+        this.rowFlair = (row: IdlObject) => {
+            if (row.ischanged()) {
+                return {icon: 'save', title: this.itemModified.text}
+            }
+        };
+
         this.dataSource.getRows = (pager: Pager, sort: any[]) => {
             return from(this.itemService.scannedItems);
         };
 
         this.cellTextGenerator = {
+
+            title: row => {
+                if (row.call_number().id() === -1) {
+                    return row.dummy_title();
+                } else {
+                    return row.call_number().record().simple_record().title();
+                }
+            },
             call_number_label: row => {
                 return  row.call_number().prefix().label() + ' ' +
                         row.call_number().label() + ' ' +
@@ -208,6 +245,7 @@ export class ItemStatusComponent implements OnInit, AfterViewInit {
                         // Retain the original grid index value so row
                         // selection can persist.
                         updatedCopy._index = item._index;
+                        updatedCopy.ischanged(item.ischanged());
                         this.itemService.scannedItems.splice(idx, 1, updatedCopy);
                     }
                 });