Commit | Line | Data |
---|---|---|
44402a2e CW |
1 | (function(angular, $, _) { |
2 | "use strict"; | |
3 | ||
4 | angular.module('crmSearchDisplay').component('crmSearchDisplayTable', { | |
5 | bindings: { | |
6 | apiEntity: '<', | |
7 | apiParams: '<', | |
590c0e3f CW |
8 | settings: '<', |
9 | filters: '<' | |
44402a2e CW |
10 | }, |
11 | templateUrl: '~/crmSearchDisplay/crmSearchDisplayTable.html', | |
12 | controller: function($scope, crmApi4) { | |
13 | var ts = $scope.ts = CRM.ts(), | |
14 | ctrl = this; | |
15 | ||
16 | this.page = 1; | |
493f83d4 CW |
17 | this.selectedRows = []; |
18 | this.allRowsSelected = false; | |
44402a2e CW |
19 | |
20 | this.$onInit = function() { | |
590c0e3f | 21 | this.orderBy = _.cloneDeep(this.apiParams.orderBy || {}); |
44402a2e | 22 | this.limit = parseInt(ctrl.settings.limit || 0, 10); |
590c0e3f CW |
23 | this.columns = _.cloneDeep(ctrl.settings.columns); |
24 | _.each(ctrl.columns, function(col, num) { | |
44402a2e CW |
25 | var index = ctrl.apiParams.select.indexOf(col.expr); |
26 | if (_.includes(col.expr, '(') && !_.includes(col.expr, ' AS ')) { | |
27 | col.expr += ' AS column_' + num; | |
28 | ctrl.apiParams.select[index] += ' AS column_' + num; | |
29 | } | |
30 | col.key = _.last(col.expr.split(' AS ')); | |
31 | }); | |
44402a2e CW |
32 | }; |
33 | ||
493f83d4 | 34 | this.getResults = function() { |
44402a2e | 35 | var params = _.merge(_.cloneDeep(ctrl.apiParams), {limit: ctrl.limit, offset: (ctrl.page - 1) * ctrl.limit, orderBy: ctrl.orderBy}); |
590c0e3f CW |
36 | if (_.isEmpty(params.where)) { |
37 | params.where = []; | |
38 | } | |
39 | _.each(ctrl.filters, function(value, key) { | |
40 | if (value) { | |
41 | params.where.push([key, 'CONTAINS', value]); | |
42 | } | |
43 | }); | |
44402a2e CW |
44 | if (ctrl.settings.pager) { |
45 | params.select.push('row_count'); | |
46 | } | |
47 | crmApi4(ctrl.apiEntity, 'get', params).then(function(results) { | |
48 | ctrl.results = results; | |
49 | ctrl.rowCount = results.count; | |
50 | }); | |
44402a2e CW |
51 | }; |
52 | ||
493f83d4 | 53 | $scope.$watch('$ctrl.filters', ctrl.getResults, true); |
590c0e3f | 54 | |
44402a2e CW |
55 | /** |
56 | * Returns crm-i icon class for a sortable column | |
57 | * @param col | |
58 | * @returns {string} | |
59 | */ | |
60 | $scope.getOrderBy = function(col) { | |
61 | var dir = ctrl.orderBy && ctrl.orderBy[col.key]; | |
62 | if (dir) { | |
63 | return 'fa-sort-' + dir.toLowerCase(); | |
64 | } | |
65 | return 'fa-sort disabled'; | |
66 | }; | |
67 | ||
68 | /** | |
69 | * Called when clicking on a column header | |
70 | * @param col | |
71 | * @param $event | |
72 | */ | |
73 | $scope.setOrderBy = function(col, $event) { | |
74 | var dir = $scope.getOrderBy(col) === 'fa-sort-asc' ? 'DESC' : 'ASC'; | |
75 | if (!$event.shiftKey) { | |
76 | ctrl.orderBy = {}; | |
77 | } | |
78 | ctrl.orderBy[col.key] = dir; | |
493f83d4 | 79 | ctrl.getResults(); |
44402a2e CW |
80 | }; |
81 | ||
82 | $scope.formatResult = function(row, col) { | |
83 | var value = row[col.key]; | |
84 | return formatFieldValue(col, value); | |
85 | }; | |
86 | ||
87 | function formatFieldValue(col, value) { | |
88 | var type = col.dataType; | |
89 | if (_.isArray(value)) { | |
90 | return _.map(value, function(val) { | |
91 | return formatFieldValue(col, val); | |
92 | }).join(', '); | |
93 | } | |
94 | if (value && (type === 'Date' || type === 'Timestamp') && /^\d{4}-\d{2}-\d{2}/.test(value)) { | |
95 | return CRM.utils.formatDate(value, null, type === 'Timestamp'); | |
96 | } | |
97 | else if (type === 'Boolean' && typeof value === 'boolean') { | |
98 | return value ? ts('Yes') : ts('No'); | |
99 | } | |
100 | else if (type === 'Money' && typeof value === 'number') { | |
101 | return CRM.formatMoney(value); | |
102 | } | |
103 | return value; | |
104 | } | |
105 | ||
493f83d4 CW |
106 | $scope.selectAllRows = function() { |
107 | // Deselect all | |
108 | if (ctrl.allRowsSelected) { | |
109 | ctrl.allRowsSelected = false; | |
110 | ctrl.selectedRows.length = 0; | |
111 | return; | |
112 | } | |
113 | // Select all | |
114 | ctrl.allRowsSelected = true; | |
115 | if (ctrl.page === 1 && ctrl.results[1].length < ctrl.limit) { | |
116 | ctrl.selectedRows = _.pluck(ctrl.results[1], 'id'); | |
117 | return; | |
118 | } | |
119 | // If more than one page of results, use ajax to fetch all ids | |
120 | $scope.loadingAllRows = true; | |
121 | var params = _.cloneDeep(ctrl.apiParams); | |
122 | params.select = ['id']; | |
123 | crmApi4(ctrl.apiEntity, 'get', params, ['id']).then(function(ids) { | |
124 | $scope.loadingAllRows = false; | |
125 | ctrl.selectedRows = _.toArray(ids); | |
126 | }); | |
127 | }; | |
128 | ||
129 | $scope.selectRow = function(row) { | |
130 | var index = ctrl.selectedRows.indexOf(row.id); | |
131 | if (index < 0) { | |
132 | ctrl.selectedRows.push(row.id); | |
133 | ctrl.allRowsSelected = (ctrl.rowCount === ctrl.selectedRows.length); | |
134 | } else { | |
135 | ctrl.allRowsSelected = false; | |
136 | ctrl.selectedRows.splice(index, 1); | |
137 | } | |
138 | }; | |
139 | ||
140 | $scope.isRowSelected = function(row) { | |
141 | return ctrl.allRowsSelected || _.includes(ctrl.selectedRows, row.id); | |
142 | }; | |
143 | ||
44402a2e CW |
144 | } |
145 | }); | |
146 | ||
147 | })(angular, CRM.$, CRM._); |