Merge pull request #19291 from eileenmcnaughton/prof
[civicrm-core.git] / ext / search / ang / crmSearchAdmin / crmSearchAdminDisplay.component.js
CommitLineData
e7515b5b
CW
1(function(angular, $, _) {
2 "use strict";
3
493f83d4 4 angular.module('crmSearchAdmin').component('crmSearchAdminDisplay', {
e7515b5b
CW
5 bindings: {
6 savedSearch: '<',
7 display: '<'
8 },
9 template: function() {
10 // Dynamic template generates switch condition for each display type
11 var html =
493f83d4 12 '<div ng-include="\'~/crmSearchAdmin/crmSearchAdminDisplay.html\'"></div>\n' +
e7515b5b 13 '<div ng-switch="$ctrl.display.type">\n';
493f83d4 14 _.each(CRM.crmSearchAdmin.displayTypes, function(type) {
e7515b5b
CW
15 html +=
16 '<div ng-switch-when="' + type.name + '">\n' +
17 ' <search-admin-display-' + type.name + ' api-entity="$ctrl.savedSearch.api_entity" api-params="$ctrl.savedSearch.api_params" display="$ctrl.display"></search-admin-display-' + type.name + '>\n' +
18 ' <hr>\n' +
19 ' <button type="button" class="btn btn-{{ !$ctrl.stale ? \'success\' : $ctrl.preview ? \'warning\' : \'primary\' }}" ng-click="$ctrl.previewDisplay()" ng-disabled="!$ctrl.stale">\n' +
20 ' <i class="crm-i ' + type.icon + '"></i>' +
21 ' {{ $ctrl.preview && $ctrl.stale ? ts("Refresh") : ts("Preview") }}\n' +
22 ' </button>\n' +
23 ' <hr>\n' +
24 ' <div ng-if="$ctrl.preview">\n' +
25 ' <crm-search-display-' + type.name + ' api-entity="$ctrl.savedSearch.api_entity" api-params="$ctrl.savedSearch.api_params" settings="$ctrl.display.settings"></crm-search-display-' + type.name + '>\n' +
26 ' </div>\n' +
27 '</div>\n';
28 });
29 html += '</div>';
30 return html;
31 },
03b55607 32 controller: function($scope, $timeout, searchMeta) {
e7515b5b
CW
33 var ts = $scope.ts = CRM.ts(),
34 ctrl = this;
35
03b55607
CW
36 function fieldToColumn(fieldExpr) {
37 var info = searchMeta.parseExpr(fieldExpr);
38 return {
39 expr: fieldExpr,
40 label: searchMeta.getDefaultLabel(fieldExpr),
41 dataType: (info.fn && info.fn.name === 'COUNT') ? 'Integer' : info.field.data_type
42 };
43 }
44
45 // Helper function to sort active from hidden columns and initialize each column with defaults
46 this.initColumns = function() {
47 if (!ctrl.display.settings.columns) {
48 ctrl.display.settings.columns = _.transform(ctrl.savedSearch.api_params.select, function(columns, fieldExpr) {
49 columns.push(fieldToColumn(fieldExpr));
50 });
51 return [];
52 } else {
53 var activeColumns = _.collect(ctrl.display.settings.columns, 'expr'),
54 hiddenColumns = _.transform(ctrl.savedSearch.api_params.select, function(hiddenColumns, fieldExpr) {
55 if (!_.includes(activeColumns, fieldExpr)) {
56 hiddenColumns.push(fieldToColumn(fieldExpr));
57 }
58 });
59 _.each(activeColumns, function(fieldExpr, index) {
60 if (!_.includes(ctrl.savedSearch.api_params.select, fieldExpr)) {
61 ctrl.display.settings.columns.splice(index, 1);
62 }
63 });
64 return hiddenColumns;
65 }
66 };
67
e7515b5b
CW
68 this.preview = this.stale = false;
69
70 this.previewDisplay = function() {
71 ctrl.preview = !ctrl.preview;
72 ctrl.stale = false;
73 if (!ctrl.preview) {
74 $timeout(function() {
75 ctrl.preview = true;
76 }, 100);
77 }
78 };
79
80 $scope.$watch('$ctrl.display.settings', function() {
81 ctrl.stale = true;
82 }, true);
83 }
84 });
85
86})(angular, CRM.$, CRM._);