LP1207533 toward UI collab/phasefx/lp1207533
authorJason Etheridge <jason@EquinoxInitiative.org>
Tue, 25 Aug 2020 14:44:10 +0000 (10:44 -0400)
committerJason Etheridge <jason@EquinoxInitiative.org>
Wed, 2 Sep 2020 12:47:03 +0000 (08:47 -0400)
Signed-off-by: Jason Etheridge <jason@EquinoxInitiative.org>
Open-ILS/src/eg2/src/app/staff/circ/patron/event-log/event-grid.component.html [new file with mode: 0644]
Open-ILS/src/eg2/src/app/staff/circ/patron/event-log/event-grid.component.ts [new file with mode: 0644]
Open-ILS/src/eg2/src/app/staff/circ/patron/event-log/event-log.component.html [new file with mode: 0644]
Open-ILS/src/eg2/src/app/staff/circ/patron/event-log/event-log.component.ts [new file with mode: 0644]
Open-ILS/src/eg2/src/app/staff/circ/patron/event-log/event-log.module.ts [new file with mode: 0644]
Open-ILS/src/eg2/src/app/staff/circ/patron/event-log/routing.module.ts [new file with mode: 0644]
Open-ILS/src/eg2/src/app/staff/circ/patron/routing.module.ts
Open-ILS/src/templates/staff/circ/patron/index.tt2

diff --git a/Open-ILS/src/eg2/src/app/staff/circ/patron/event-log/event-grid.component.html b/Open-ILS/src/eg2/src/app/staff/circ/patron/event-log/event-grid.component.html
new file mode 100644 (file)
index 0000000..663c793
--- /dev/null
@@ -0,0 +1,6 @@
+<eg-grid #grid [dataSource]="gridSource" idlClass="atul"
+  [sortable]="true"
+  [filterable]="true"
+  showFields="perm_lib,state,name,reactor,run_time,target_circ.target_copy,target_hold.current_copy"
+  persistKey="event_grid">
+</eg-grid>
diff --git a/Open-ILS/src/eg2/src/app/staff/circ/patron/event-log/event-grid.component.ts b/Open-ILS/src/eg2/src/app/staff/circ/patron/event-log/event-grid.component.ts
new file mode 100644 (file)
index 0000000..6b43381
--- /dev/null
@@ -0,0 +1,94 @@
+import {Component, EventEmitter, Input, Output, OnChanges, OnInit, ViewChild} from '@angular/core';
+import {Router} from '@angular/router';
+import {Observable, from, of} from 'rxjs';
+import {tap, switchMap, mergeMap} from 'rxjs/operators';
+import {AuthService} from '@eg/core/auth.service';
+import {FmRecordEditorComponent} from '@eg/share/fm-editor/fm-editor.component';
+import {FormatService} from '@eg/core/format.service';
+import {GridComponent} from '@eg/share/grid/grid.component';
+import {GridDataSource} from '@eg/share/grid/grid';
+import {IdlService, IdlObject} from '@eg/core/idl.service';
+import {PcrudService} from '@eg/core/pcrud.service';
+import {Pager} from '@eg/share/util/pager';
+import {ToastService} from '@eg/share/toast/toast.service';
+import {NetService} from '@eg/core/net.service';
+import {OrgService} from '@eg/core/org.service';
+
+// A filterable grid of A/T events for circ or ahr hook core types
+
+@Component({
+    selector: 'eg-event-grid',
+    templateUrl: './event-grid.component.html'
+})
+
+export class EventGridComponent implements OnChanges, OnInit {
+
+    @Input() patron: number;
+    @Input() event_type: string;
+
+    gridSource: GridDataSource;
+    numRowsSelected: number;
+
+    @ViewChild('grid', { static: true }) grid: GridComponent;
+
+    constructor(
+        private idl: IdlService,
+        private auth: AuthService,
+        private format: FormatService,
+        private pcrud: PcrudService,
+        private router: Router,
+        private toast: ToastService,
+        private net: NetService,
+        private org: OrgService
+    ) {
+
+    }
+
+    ngOnInit() {
+        this.gridSource = new GridDataSource();
+
+        this.gridSource.getRows = (pager: Pager, sort: any[]): Observable<IdlObject> => {
+        // TODO: why is this getting called twice on page load?
+
+            const orderBy: any = {atul: 'id'};
+            if (sort.length) {
+                orderBy.atul = sort[0].name + ' ' + sort[0].dir;
+            }
+
+            // base query to grab everything
+            const base: Object = {};
+            base[this.idl.classes['atul'].pkey] = {'!=' : null};
+            base['context_user'] = (this.patron ? this.patron : {'>' : 0})
+
+            // circs or holds?
+            if (this.event_type == 'circ') {
+                base['target_circ'] = { '>' : 0 }
+            } else {
+                base['target_hold'] = { '>' : 0 }
+            }
+
+            const query: any = new Array();
+            query.push(base);
+
+            // and add any filters
+            Object.keys(this.gridSource.filters).forEach(key => {
+                Object.keys(this.gridSource.filters[key]).forEach(key2 => {
+                    query.push(this.gridSource.filters[key][key2]);
+                });
+            });
+
+            return this.pcrud.search('atul',
+                query, {
+                flesh: 1,
+                flesh_fields: {atul: ['target_circ', 'target_hold']},
+                offset: pager.offset,
+                limit: pager.limit,
+                order_by: orderBy
+            });
+        };
+    }
+
+    ngOnChanges() { this.reloadGrid(); }
+
+    reloadGrid() { this.grid.reload(); }
+}
diff --git a/Open-ILS/src/eg2/src/app/staff/circ/patron/event-log/event-log.component.html b/Open-ILS/src/eg2/src/app/staff/circ/patron/event-log/event-log.component.html
new file mode 100644 (file)
index 0000000..2ccfdc2
--- /dev/null
@@ -0,0 +1,5 @@
+
+<eg-staff-banner bannerText="Triggered Event Log (Patron Specific)" i18n-bannerText>
+</eg-staff-banner>
+
+<eg-event-grid #eventGrid [patron]="patronId"></eg-event-grid>
diff --git a/Open-ILS/src/eg2/src/app/staff/circ/patron/event-log/event-log.component.ts b/Open-ILS/src/eg2/src/app/staff/circ/patron/event-log/event-log.component.ts
new file mode 100644 (file)
index 0000000..f707467
--- /dev/null
@@ -0,0 +1,30 @@
+import {Component, OnInit, ViewChild} from '@angular/core';
+import {ActivatedRoute} from '@angular/router';
+import {NetService} from '@eg/core/net.service';
+import {AuthService} from '@eg/core/auth.service';
+import {EventGridComponent} from './event-grid.component';
+
+@Component({
+  templateUrl: 'event-log.component.html'
+})
+
+export class EventLogComponent implements OnInit {
+    patronId: number;
+
+    @ViewChild('eventGrid', { static: true }) eventGrid: EventGridComponent;
+
+    constructor(
+        private route: ActivatedRoute,
+        private net: NetService,
+        private auth: AuthService
+    ) {}
+
+    ngOnInit() {
+        // Note: if this is not supplied, the grid will show recent events
+        // across all patrons, which may be a neat feature...
+        // TODO: see if we're honoring VIEW_USER permission and patron opt-in
+        this.patronId = +this.route.snapshot.paramMap.get('patron');
+    }
+}
+
+
diff --git a/Open-ILS/src/eg2/src/app/staff/circ/patron/event-log/event-log.module.ts b/Open-ILS/src/eg2/src/app/staff/circ/patron/event-log/event-log.module.ts
new file mode 100644 (file)
index 0000000..868a470
--- /dev/null
@@ -0,0 +1,19 @@
+import {NgModule} from '@angular/core';
+import {StaffCommonModule} from '@eg/staff/common.module';
+import {EventLogRoutingModule} from './routing.module';
+import {EventGridComponent} from './event-grid.component';
+import {EventLogComponent} from './event-log.component';
+
+@NgModule({
+  declarations: [
+    EventGridComponent,
+    EventLogComponent
+  ],
+  imports: [
+    StaffCommonModule,
+    EventLogRoutingModule,
+  ],
+})
+
+export class EventLogModule {}
+
diff --git a/Open-ILS/src/eg2/src/app/staff/circ/patron/event-log/routing.module.ts b/Open-ILS/src/eg2/src/app/staff/circ/patron/event-log/routing.module.ts
new file mode 100644 (file)
index 0000000..7196d31
--- /dev/null
@@ -0,0 +1,19 @@
+import {NgModule} from '@angular/core';
+import {RouterModule, Routes} from '@angular/router';
+import {EventLogComponent} from './event-log.component';
+
+const routes: Routes = [
+  { path: '',
+    component: EventLogComponent
+  },
+  { path: ':patron',
+    component: EventLogComponent
+  },
+];
+
+@NgModule({
+  imports: [RouterModule.forChild(routes)],
+  exports: [RouterModule]
+})
+
+export class EventLogRoutingModule {}
index c2b7432..a1b4ae6 100644 (file)
@@ -5,6 +5,10 @@ const routes: Routes = [
   { path: 'bcsearch',
     loadChildren: () =>
       import('./bcsearch/bcsearch.module').then(m => m.BcSearchModule)
+  },
+  { path: 'event-log',
+    loadChildren: () =>
+      import('./event-log/event-log.module').then(m => m.EventLogModule)
   }
 ];
 
index a36c758..3880385 100644 (file)
@@ -177,7 +177,7 @@ angular.module('egCoreMod').run(['egStrings', function(s) {
             </a>
           </li>
           <li>
-            <a href="./circ/patron/{{patron().id()}}/triggered_events">
+            <a href="/eg2/staff/circ/patron/event-log/{{patron().id()}}" target="_blank">
               [% l('Triggered Events / Notifications') %]
             </a>
           </li>