Merge pull request #19813 from eileenmcnaughton/dupe
[civicrm-core.git] / ext / search / ang / crmSearchDisplay.module.js
CommitLineData
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._);