Angular admin grid auto-link fleshing user/berick/admin-grid-fm-flesh
authorBill Erickson <berickxx@gmail.com>
Wed, 6 Mar 2019 22:41:25 +0000 (17:41 -0500)
committerBill Erickson <berickxx@gmail.com>
Wed, 6 Mar 2019 22:42:25 +0000 (17:42 -0500)
Mike's patch plus some fixes.

Signed-off-by: Bill Erickson <berickxx@gmail.com>
Open-ILS/src/eg2/src/app/core/format.service.ts
Open-ILS/src/eg2/src/app/share/grid/grid.ts
Open-ILS/src/eg2/src/app/staff/share/admin-page/admin-page.component.ts

index 2c7e388..ad7e9ce 100644 (file)
@@ -71,6 +71,44 @@ export class FormatService {
 
         switch (datatype) {
 
+            case 'link':
+                if (typeof value !== 'object') {
+                    return value + ''; // no fleshed value here
+                }
+
+                if (!params.idlClass || !params.idlField) {
+                    // Without a full accounting of the field data,
+                    // we can't determine the display value.
+                    return value + '';
+                }
+
+                const localClass = this.idl.classes[params.idlClass];
+
+                if (!localClass) {
+                    console.warn(`No such IDL class ${params.idlClass}`);
+                    return value + '';
+                }
+
+                if (!localClass.field_map[params.idlField]) {
+                    console.warn(`IDL class ${params.idlClass} ` +
+                        `has no field named "${params.idlField}"`);
+                    return value + '';
+                }
+
+                const linkType = localClass.field_map[params.idlField]['reltype'];
+                if (linkType !== 'has_a') {
+                    return value + ''; // eh?
+                }
+
+                const localField = localClass.field_map[params.idlField];
+                const remoteKey = localField['key'];
+
+                const remoteClass = this.idl.classes[localField['class']];
+                const remoteField = remoteClass.field_map[remoteKey];
+                const remoteSelector = remoteField.selector || remoteField.name;
+
+                return value[remoteSelector]() + '';
+
             case 'org_unit':
                 const orgField = params.orgField || 'shortname';
                 const org = this.org.get(value);
index dcffc95..4a6c4e6 100644 (file)
@@ -20,6 +20,8 @@ export class GridColumn {
     hidden: boolean;
     visible: boolean;
     sort: number;
+    // IDL class of the object which contains this field.
+    // Not to be confused with the class of a linked object.
     idlClass: string;
     idlFieldDef: any;
     datatype: string;
@@ -189,6 +191,7 @@ export class GridColumnSet {
             const idlInfo = this.idlInfoFromDotpath(col.path);
             if (idlInfo) {
                 col.idlFieldDef = idlInfo.idlField;
+                col.idlClass = idlInfo.idlClass.name;
                 if (!col.label) {
                     col.label = col.idlFieldDef.label || col.idlFieldDef.name;
                     col.datatype = col.idlFieldDef.datatype;
@@ -634,6 +637,8 @@ export class GridContext {
 
         return this.format.transform({
             value: val,
+            idlClass: col.idlClass,
+            idlField: col.idlFieldDef ? col.idlFieldDef.name : col.name,
             datatype: col.datatype,
             datePlusTime: Boolean(col.datePlusTime)
         });
@@ -682,6 +687,12 @@ export class GridContext {
             if (!col.datatype) {
                 col.datatype = idlField.datatype;
             }
+            if (!col.idlFieldDef) {
+                idlField = col.idlFieldDef;
+            }
+            if (!col.idlClass) {
+                col.idlClass = idlClassDef.name;
+            }
             if (!col.label) {
                 col.label = idlField.label || idlField.name;
             }
@@ -858,6 +869,7 @@ export class GridContext {
             col.name = field.name;
             col.label = field.label || field.name;
             col.idlFieldDef = field;
+            col.idlClass = this.columnSet.idlClass;
             col.datatype = field.datatype;
             col.isIndex = (field.name === pkeyField);
             col.isAuto = true;
index 80fd2fd..5c97f9d 100644 (file)
@@ -258,6 +258,7 @@ export class AdminPageComponent implements OnInit {
 
         this.dataSource.getRows = (pager: Pager, sort: any[]) => {
             const orderBy: any = {};
+            const fleshList: any = {};
 
             if (sort.length) {
                 // Sort specified from grid
@@ -268,10 +269,29 @@ export class AdminPageComponent implements OnInit {
                 orderBy[this.idlClass] = this.sortField;
             }
 
+            fleshList[this.idlClass] = [];
+            this.idlClassDef.fields.forEach(field => {
+                if (field['datatype'] === 'link'
+                    && field['reltype'] === 'has_a'
+                    && field['class'] !== 'aou'
+                ) { // Ignore aou, that's handled separately via cached data
+
+                    const remoteClass = this.idl.classes[field['class']];
+                    const remoteKey = remoteClass.pkey || 'id';
+                    const remoteField = remoteClass.field_map[remoteKey];
+
+                    if (remoteField.selector) { // only flesh fields with a selector
+                        fleshList[this.idlClass].push(field['name']);
+                    }
+                }
+            });
+
             const searchOps = {
                 offset: pager.offset,
                 limit: pager.limit,
-                order_by: orderBy
+                order_by: orderBy,
+                flesh_fields: fleshList,
+                flesh: 1
             };
 
             if (this.contextOrg) {