Make provider addresses, contacts, and contact addresses filterable
authorMike Rylander <mrylander@gmail.com>
Wed, 15 Apr 2020 18:42:59 +0000 (14:42 -0400)
committerGalen Charlton <gmc@equinoxinitiative.org>
Wed, 15 Apr 2020 18:45:46 +0000 (14:45 -0400)
Signed-off-by: Mike Rylander <mrylander@gmail.com>
Signed-off-by: Galen Charlton <gmc@equinoxinitiative.org>
Open-ILS/src/eg2/src/app/staff/acq/provider/provider-addresses.component.html
Open-ILS/src/eg2/src/app/staff/acq/provider/provider-addresses.component.ts
Open-ILS/src/eg2/src/app/staff/acq/provider/provider-contact-addresses.component.html
Open-ILS/src/eg2/src/app/staff/acq/provider/provider-contact-addresses.component.ts
Open-ILS/src/eg2/src/app/staff/acq/provider/provider-contacts.component.html
Open-ILS/src/eg2/src/app/staff/acq/provider/provider-contacts.component.ts

index 4967b98..80cbd21 100644 (file)
@@ -9,6 +9,7 @@
   persistKey="acq.provider.addresses.grid"
   idlClass="acqpa" [dataSource]="gridSource"
   [sortable]="true"
+  [filterable]="true"
   hideFields="provider"
   [cellTextGenerator]="cellTextGenerator">
     <eg-grid-toolbar-button 
index 700d242..5c0fce7 100644 (file)
@@ -6,6 +6,8 @@ import {Pager} from '@eg/share/util/pager';
 import {IdlService, IdlObject} from '@eg/core/idl.service';
 import {NetService} from '@eg/core/net.service';
 import {AuthService} from '@eg/core/auth.service';
+import {PcrudService} from '@eg/core/pcrud.service';
+import {EventService} from '@eg/core/event.service';
 import {GridComponent} from '@eg/share/grid/grid.component';
 import {GridDataSource, GridCellTextGenerator} from '@eg/share/grid/grid';
 import {ProviderRecord, ProviderRecordService} from './provider-record.service';
@@ -48,6 +50,8 @@ export class ProviderAddressesComponent implements OnInit, AfterViewInit {
         private router: Router,
         private route: ActivatedRoute,
         private net: NetService,
+        private evt: EventService,
+        private pcrud: PcrudService,
         private idl: IdlService,
         private auth: AuthService,
         private providerRecord: ProviderRecordService,
@@ -85,6 +89,17 @@ export class ProviderAddressesComponent implements OnInit, AfterViewInit {
         console.log('this.providerRecord',this.providerRecord);
     }
 
+    generateSearch(filters): any {
+        const query: any = new Array();
+
+        Object.keys(filters).forEach(filterField => {
+            filters[filterField].forEach(condition => {
+                query.push(condition);
+            });
+        });
+        return query;
+    }
+
     getDataSource(): GridDataSource {
         const gridSource = new GridDataSource();
 
@@ -95,6 +110,40 @@ export class ProviderAddressesComponent implements OnInit, AfterViewInit {
             }
             let addresses = this.provider.addresses()
 
+            const query = this.generateSearch(gridSource.filters);
+            if (query.length) {
+                query.unshift( { id: addresses.map(a => a.id()) } );
+
+                const opts = {};
+                opts['offset'] = pager.offset;
+                opts['limit'] = pager.limit;
+                opts['au_by_id'] = true;
+
+                if (sort.length > 0) {
+                    opts['order_by'] = [];
+                    sort.forEach(sort_clause => {
+                        opts['order_by'].push({
+                            class: 'acqpa',
+                            field: sort_clause.name,
+                            direction: sort_clause.dir
+                        });
+                    });
+                }
+
+                return this.pcrud.search('acqpa',
+                    query,
+                    opts
+                ).pipe(
+                    map(res => {
+                        if (this.evt.parse(res)) {
+                            throw throwError(res);
+                        } else {
+                            return res;
+                        }
+                    }),
+                );
+            }
+
             if (sort.length > 0) {
                 addresses = addresses.sort((a, b) => {
                     for (let i = 0; i < sort.length; i++) {
index cbfd8d3..219b71e 100644 (file)
@@ -9,6 +9,7 @@
   persistKey="acq.provider.contact.addresses.grid"
   idlClass="acqpca" [dataSource]="gridSource"
   [sortable]="true"
+  [filterable]="true"
   hideFields="contact"
   [cellTextGenerator]="cellTextGenerator">
     <eg-grid-toolbar-button 
index ee7c8cf..d5c6066 100644 (file)
@@ -7,6 +7,7 @@ import {IdlService, IdlObject} from '@eg/core/idl.service';
 import {NetService} from '@eg/core/net.service';
 import {AuthService} from '@eg/core/auth.service';
 import {PcrudService} from '@eg/core/pcrud.service';
+import {EventService} from '@eg/core/event.service';
 import {GridComponent} from '@eg/share/grid/grid.component';
 import {GridDataSource, GridCellTextGenerator} from '@eg/share/grid/grid';
 import {ProviderRecord, ProviderRecordService} from './provider-record.service';
@@ -50,6 +51,7 @@ export class ProviderContactAddressesComponent implements OnInit, AfterViewInit
         private router: Router,
         private route: ActivatedRoute,
         private net: NetService,
+        private evt: EventService,
         private idl: IdlService,
         private auth: AuthService,
         private providerRecord: ProviderRecordService,
@@ -90,6 +92,17 @@ export class ProviderContactAddressesComponent implements OnInit, AfterViewInit
         console.log('this.contactId',this.contactId);
     }
 
+    generateSearch(filters): any {
+        const query: any = new Array();
+
+        Object.keys(filters).forEach(filterField => {
+            filters[filterField].forEach(condition => {
+                query.push(condition);
+            });
+        });
+        return query;
+    }
+
     getDataSource(): GridDataSource {
         const gridSource = new GridDataSource();
 
@@ -101,6 +114,40 @@ export class ProviderContactAddressesComponent implements OnInit, AfterViewInit
             let contact = this.providerRecord.current().contacts().filter( c => c.id() === cid)[0];
             let addresses = contact.addresses();
 
+            const query = this.generateSearch(gridSource.filters);
+            if (query.length) {
+                query.unshift( { id: addresses.map(a => a.id()) } );
+
+                const opts = {};
+                opts['offset'] = pager.offset;
+                opts['limit'] = pager.limit;
+                opts['au_by_id'] = true;
+
+                if (sort.length > 0) {
+                    opts['order_by'] = [];
+                    sort.forEach(sort_clause => {
+                        opts['order_by'].push({
+                            class: 'acqpca',
+                            field: sort_clause.name,
+                            direction: sort_clause.dir
+                        });
+                    });
+                }
+
+                return this.pcrud.search('acqpca',
+                    query,
+                    opts
+                ).pipe(
+                    map(res => {
+                        if (this.evt.parse(res)) {
+                            throw throwError(res);
+                        } else {
+                            return res;
+                        }
+                    }),
+                );
+            }
+
             if (sort.length > 0) {
                 addresses = addresses.sort((a, b) => {
                     for (let i = 0; i < sort.length; i++) {
index bc11ebe..3a344bf 100644 (file)
@@ -19,6 +19,7 @@
   idlClass="acqpc" [dataSource]="gridSource"
   [sortable]="true"
   [disableMultiSelect]="true"
+  [filterable]="true"
   hideFields="provider"
   [cellTextGenerator]="cellTextGenerator">
 
index 1553206..6a85a06 100644 (file)
@@ -5,6 +5,8 @@ import {Router, ActivatedRoute, ParamMap} from '@angular/router';
 import {Pager} from '@eg/share/util/pager';
 import {IdlService, IdlObject} from '@eg/core/idl.service';
 import {NetService} from '@eg/core/net.service';
+import {PcrudService} from '@eg/core/pcrud.service';
+import {EventService} from '@eg/core/event.service';
 import {AuthService} from '@eg/core/auth.service';
 import {GridComponent} from '@eg/share/grid/grid.component';
 import {GridDataSource, GridCellTextGenerator} from '@eg/share/grid/grid';
@@ -56,6 +58,8 @@ export class ProviderContactsComponent implements OnInit, AfterViewInit {
         private route: ActivatedRoute,
         private changeDetector: ChangeDetectorRef,
         private net: NetService,
+        private pcrud: PcrudService,
+        private evt: EventService,
         private auth: AuthService,
         private idl: IdlService,
         private providerRecord: ProviderRecordService,
@@ -105,6 +109,17 @@ export class ProviderContactsComponent implements OnInit, AfterViewInit {
         );
     }
 
+    generateSearch(filters): any {
+        const query: any = new Array();
+
+        Object.keys(filters).forEach(filterField => {
+            filters[filterField].forEach(condition => {
+                query.push(condition);
+            });
+        });
+        return query;
+    }
+
     getDataSource(): GridDataSource {
         const gridSource = new GridDataSource();
 
@@ -115,6 +130,40 @@ export class ProviderContactsComponent implements OnInit, AfterViewInit {
             }
             let contacts = this.provider.contacts()
 
+            const query = this.generateSearch(gridSource.filters);
+            if (query.length) {
+                query.unshift( { id: contacts.map(a => a.id()) } );
+
+                const opts = {};
+                opts['offset'] = pager.offset;
+                opts['limit'] = pager.limit;
+                opts['au_by_id'] = true;
+
+                if (sort.length > 0) {
+                    opts['order_by'] = [];
+                    sort.forEach(sort_clause => {
+                        opts['order_by'].push({
+                            class: 'acqpc',
+                            field: sort_clause.name,
+                            direction: sort_clause.dir
+                        });
+                    });
+                }
+
+                return this.pcrud.search('acqpc',
+                    query,
+                    opts
+                ).pipe(
+                    map(res => {
+                        if (this.evt.parse(res)) {
+                            throw throwError(res);
+                        } else {
+                            return res;
+                        }
+                    }),
+                );
+            }
+
             if (sort.length > 0) {
                 contacts = contacts.sort((a, b) => {
                     for (let i = 0; i < sort.length; i++) {