Commit | Line | Data |
---|---|---|
e78d6a2d CW |
1 | (function(angular, $, _) { |
2 | "use strict"; | |
3 | ||
4 | // Declare module | |
03b55607 CW |
5 | angular.module('crmSearchDisplay', CRM.angRequires('crmSearchDisplay')) |
6 | ||
406f1014 | 7 | .factory('searchDisplayUtils', function(crmApi4) { |
03b55607 | 8 | |
69f0bd2b CW |
9 | // Replace tokens keyed to rowData. |
10 | // If rowMeta is provided, values will be formatted; if omiited, raw values will be provided. | |
11 | function replaceTokens(str, rowData, rowMeta) { | |
c7e96654 CW |
12 | if (!str) { |
13 | return ''; | |
14 | } | |
69f0bd2b CW |
15 | _.each(rowData, function(value, key) { |
16 | if (str.indexOf('[' + key + ']') >= 0) { | |
17 | var column = rowMeta && _.findWhere(rowMeta, {key: key}), | |
18 | replacement = column ? formatRawValue(column, value) : value; | |
19 | str = str.replace(new RegExp(_.escapeRegExp('[' + key + ']', 'g')), replacement); | |
20 | } | |
03b55607 CW |
21 | }); |
22 | return str; | |
23 | } | |
24 | ||
69f0bd2b CW |
25 | function getUrl(link, rowData) { |
26 | var url = replaceTokens(link, rowData); | |
c7e96654 CW |
27 | if (url.slice(0, 1) !== '/' && url.slice(0, 4) !== 'http') { |
28 | url = CRM.url(url); | |
29 | } | |
daa4e55a | 30 | return url; |
c7e96654 CW |
31 | } |
32 | ||
69f0bd2b CW |
33 | // Returns html-escaped display value for a single column in a row |
34 | function formatDisplayValue(rowData, key, rowMeta) { | |
35 | var column = _.findWhere(rowMeta, {key: key}), | |
36 | displayValue = column.rewrite ? replaceTokens(column.rewrite, rowData, rowMeta) : formatRawValue(column, rowData[key]), | |
37 | result = _.escape(displayValue); | |
38 | if (column.link) { | |
daa4e55a | 39 | result = '<a href="' + _.escape(getUrl(column.link, rowData)) + '">' + result + '</a>'; |
69f0bd2b CW |
40 | } |
41 | return result; | |
42 | } | |
43 | ||
44 | // Formats raw field value according to data type | |
45 | function formatRawValue(column, value) { | |
46 | var type = column && column.dataType, | |
03b55607 CW |
47 | result = value; |
48 | if (_.isArray(value)) { | |
49 | return _.map(value, function(val) { | |
69f0bd2b | 50 | return formatRawValue(column, val); |
03b55607 CW |
51 | }).join(', '); |
52 | } | |
53 | if (value && (type === 'Date' || type === 'Timestamp') && /^\d{4}-\d{2}-\d{2}/.test(value)) { | |
54 | result = CRM.utils.formatDate(value, null, type === 'Timestamp'); | |
55 | } | |
56 | else if (type === 'Boolean' && typeof value === 'boolean') { | |
57 | result = value ? ts('Yes') : ts('No'); | |
58 | } | |
59 | else if (type === 'Money' && typeof value === 'number') { | |
60 | result = CRM.formatMoney(value); | |
61 | } | |
03b55607 | 62 | return result; |
b1603dbd | 63 | } |
03b55607 | 64 | |
406f1014 CW |
65 | function getApiParams(ctrl, mode) { |
66 | return { | |
67 | return: mode || 'page:' + ctrl.page, | |
68 | savedSearch: ctrl.search, | |
69 | display: ctrl.display, | |
70 | sort: ctrl.sort, | |
82bf6674 CW |
71 | filters: _.assign({}, (ctrl.afFieldset ? ctrl.afFieldset.getFieldData() : {}), ctrl.filters), |
72 | afform: ctrl.afFieldset ? ctrl.afFieldset.getFormName() : null | |
406f1014 CW |
73 | }; |
74 | } | |
75 | ||
76 | function getResults(ctrl) { | |
77 | var params = getApiParams(ctrl); | |
78 | crmApi4('SearchDisplay', 'run', params).then(function(results) { | |
79 | ctrl.results = results; | |
80 | if (ctrl.settings.pager && !ctrl.rowCount) { | |
81 | if (results.length < ctrl.settings.limit) { | |
82 | ctrl.rowCount = results.length; | |
83 | } else { | |
84 | var params = getApiParams(ctrl, 'row_count'); | |
85 | crmApi4('SearchDisplay', 'run', params).then(function(result) { | |
86 | ctrl.rowCount = result.count; | |
87 | }); | |
88 | } | |
b1603dbd CW |
89 | } |
90 | }); | |
b1603dbd CW |
91 | } |
92 | ||
93 | return { | |
69f0bd2b | 94 | formatDisplayValue: formatDisplayValue, |
406f1014 CW |
95 | getApiParams: getApiParams, |
96 | getResults: getResults, | |
daa4e55a CW |
97 | replaceTokens: replaceTokens, |
98 | getUrl: getUrl | |
03b55607 CW |
99 | }; |
100 | }); | |
e78d6a2d CW |
101 | |
102 | })(angular, CRM.$, CRM._); |