LP1812670 Angular grid shows selector labels
[Evergreen.git] / Open-ILS / src / eg2 / src / app / core / format.service.ts
1 import {Injectable} from '@angular/core';
2 import {DatePipe, CurrencyPipe} from '@angular/common';
3 import {IdlService, IdlObject} from '@eg/core/idl.service';
4 import {OrgService} from '@eg/core/org.service';
5
6 /**
7  * Format IDL vield values for display.
8  */
9
10 declare var OpenSRF;
11
12 export interface FormatParams {
13     value: any;
14     idlClass?: string;
15     idlField?: string;
16     datatype?: string;
17     orgField?: string; // 'shortname' || 'name'
18     datePlusTime?: boolean;
19 }
20
21 @Injectable({providedIn: 'root'})
22 export class FormatService {
23
24     dateFormat = 'shortDate';
25     dateTimeFormat = 'short';
26     wsOrgTimezone: string = OpenSRF.tz;
27
28     constructor(
29         private datePipe: DatePipe,
30         private currencyPipe: CurrencyPipe,
31         private idl: IdlService,
32         private org: OrgService
33     ) {
34
35         // Create an inilne polyfill for Number.isNaN, which is
36         // not available in PhantomJS for unit testing.
37         // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/isNaN
38         if (!Number.isNaN) {
39             // "The following works because NaN is the only value
40             // in javascript which is not equal to itself."
41             Number.isNaN = (value: any) => {
42                 return value !== value;
43             };
44         }
45     }
46
47     /**
48      * Create a human-friendly display version of any field type.
49      */
50     transform(params: FormatParams): string {
51         const value = params.value;
52
53         if (   value === undefined
54             || value === null
55             || value === ''
56             || Number.isNaN(value)) {
57             return '';
58         }
59
60         let datatype = params.datatype;
61
62         if (!datatype) {
63             if (params.idlClass && params.idlField) {
64                 datatype = this.idl.classes[params.idlClass]
65                     .field_map[params.idlField].datatype;
66             } else {
67                 // Assume it's a primitive value
68                 return value + '';
69             }
70         }
71
72         switch (datatype) {
73
74             case 'org_unit':
75                 const orgField = params.orgField || 'shortname';
76                 const org = this.org.get(value);
77                 return org ? org[orgField]() : '';
78
79             case 'timestamp':
80                 const date = new Date(value);
81                 let fmt = this.dateFormat || 'shortDate';
82                 if (params.datePlusTime) {
83                     fmt = this.dateTimeFormat || 'short';
84                 }
85                 return this.datePipe.transform(date, fmt);
86
87             case 'money':
88                 return this.currencyPipe.transform(value);
89
90             case 'bool':
91                 // Slightly better than a bare 't' or 'f'.
92                 // Should probably add a global true/false string.
93                 return Boolean(
94                     value === 't' || value === 1 ||
95                     value === '1' || value === true
96                 ).toString();
97
98             default:
99                 return value + '';
100         }
101     }
102 }
103