Search ext: decouple actions, add searchKit base module, rename searchAdmin module...
[civicrm-core.git] / ext / search / ang / crmSearchDisplay / crmSearchDisplayTable.component.js
CommitLineData
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._);