LP#1819179: Angular value formatter gets link smarts
authorBill Erickson <berickxx@gmail.com>
Wed, 6 Mar 2019 22:41:25 +0000 (17:41 -0500)
committerDan Wells <dbw2@calvin.edu>
Fri, 22 Mar 2019 20:23:35 +0000 (16:23 -0400)
Teach the FormatService to display selector values for linked objects
when the requested field is a link field and it contains an object value
instead of just a id/key value.

Improve IDL data passing from the grid to the IDL service so it can
better determine which fields are avialble for link selector display.

Signed-off-by: Bill Erickson <berickxx@gmail.com>
Signed-off-by: Mike Rylander <mrylander@gmail.com>
Signed-off-by: Dan Wells <dbw2@calvin.edu>
Open-ILS/src/eg2/src/app/core/format.service.ts
Open-ILS/src/eg2/src/app/share/grid/grid.ts

index 2c7e388..ad7e9ce 100644 (file)
@@ -71,6 +71,44 @@ export class FormatService {
 
         switch (datatype) {
 
 
         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);
             case 'org_unit':
                 const orgField = params.orgField || 'shortname';
                 const org = this.org.get(value);
index 16c5ea1..3743488 100644 (file)
@@ -20,6 +20,8 @@ export class GridColumn {
     hidden: boolean;
     visible: boolean;
     sort: number;
     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;
     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;
             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;
                 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,
 
         return this.format.transform({
             value: val,
+            idlClass: col.idlClass,
+            idlField: col.idlFieldDef ? col.idlFieldDef.name : col.name,
             datatype: col.datatype,
             datePlusTime: Boolean(col.datePlusTime)
         });
             datatype: col.datatype,
             datePlusTime: Boolean(col.datePlusTime)
         });
@@ -682,6 +687,12 @@ export class GridContext {
             if (!col.datatype) {
                 col.datatype = idlField.datatype;
             }
             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;
             }
             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.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;
             col.datatype = field.datatype;
             col.isIndex = (field.name === pkeyField);
             col.isAuto = true;