Commit | Line | Data |
---|---|---|
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._); |