Passed
Push — master ( 3eefd8...b25c80 )
by
unknown
09:46
created

myems-admin/app/controllers/settings/space/spacemeter.controller.js   B

Complexity

Total Complexity 48
Complexity/F 1.78

Size

Lines of Code 257
Function Count 27

Duplication

Duplicated Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
wmc 48
eloc 183
mnd 21
bc 21
fnc 27
dl 0
loc 257
rs 8.5599
bpm 0.7776
cpm 1.7777
noi 0
c 0
b 0
f 0

How to fix   Complexity   

Complexity

Complex classes like myems-admin/app/controllers/settings/space/spacemeter.controller.js often do a lot of different things. To break such a class down, we need to identify a cohesive component within that class. A common approach to find such a component is to look for fields/methods that share the same prefixes, or suffixes.

Once you have determined the fields that belong together, you can apply the Extract Class refactoring. If the component makes sense as a sub-class, Extract Subclass is also a candidate, and is often faster.

1
'use strict';
2
3
app.controller('SpaceMeterController', function(
4
    $scope ,
5
    $window,
6
    $timeout,
7
    $translate,
8
    SpaceService,
9
    MeterService,
10
    VirtualMeterService,
11
    OfflineMeterService, 
12
    SpaceMeterService, 
13
    toaster,
14
    SweetAlert) {
15
    $scope.spaces = [];
16
    $scope.currentSpaceID = 1;
17
    $scope.spacemeters = [];
18
    $scope.cur_user = JSON.parse($window.localStorage.getItem("myems_admin_ui_current_user"));
19
    $scope.isLoadingMeters = false;
20
    $scope.tabInitialized = false;
21
22
    $scope.getAllSpaces = function() {
23
    let headers = { "User-UUID": $scope.cur_user.uuid, "Token": $scope.cur_user.token };
24
    SpaceService.getAllSpaces(headers, function (response) {
25
      if (angular.isDefined(response.status) && response.status === 200) {
26
        $scope.spaces = response.data;
27
      } else {
28
        $scope.spaces = [];
29
      }
30
      //create space tree
31
      var treedata = {'core': {'data': [], "multiple" : false,}, "plugins" : [ "wholerow" ]};
32
      for(var i=0; i < $scope.spaces.length; i++) {
33
          if ($scope.spaces[i].id == 1) {
34
            var node = {"id": $scope.spaces[i].id.toString(),
35
                                "parent": '#',
36
                                "text": $scope.spaces[i].name,
37
                                "state": {  'opened' : true,  'selected' : false },
38
                               };
39
          } else {
40
              var node = {"id": $scope.spaces[i].id.toString(),
41
                                  "parent": $scope.spaces[i].parent_space.id.toString(),
42
                                  "text": $scope.spaces[i].name,
43
                                 };
44
          };
45
          treedata['core']['data'].push(node);
46
      }
47
48
      angular.element(spacetreewithmeter).jstree(treedata);
49
      //space tree selected changed event handler
50
      angular.element(spacetreewithmeter).on("changed.jstree", function (e, data) {
51
          $scope.currentSpaceID = parseInt(data.selected[0]);
52
          $scope.spacemeters=[];
53
          $scope.getMetersBySpaceID($scope.currentSpaceID);
54
      });
55
    });
56
    };
57
58
	$scope.getMetersBySpaceID = function(id) {
59
	    if ($scope.isLoadingMeters) return;
60
	    $scope.isLoadingMeters = true;
61
	    var metertypes = ['meters', 'virtualmeters', 'offlinemeters'];
62
	    var completedRequests = 0;
63
	    $scope.spacemeters = [];
64
	    let headers = { "User-UUID": $scope.cur_user.uuid, "Token": $scope.cur_user.token };
65
        angular.forEach(metertypes, function(value, index) {
66
            SpaceMeterService.getMetersBySpaceID(id, value, headers, function(response) {
67
                completedRequests++;
68
                if (angular.isDefined(response.status) && response.status === 200) {
69
                    angular.forEach(response.data, function(item, indx) {
70
                        response.data[indx].metertype = value;
71
                    });
72
                    $scope.spacemeters = $scope.spacemeters.concat(response.data);
73
                }
74
                if (completedRequests === metertypes.length) {
75
                    $scope.isLoadingMeters = false;
76
                }
77
            });
78
        });
79
    };
80
81
	$scope.colorMeterType=function(type){
82
		if(type=='meters'){
83
			return 'btn-primary'
84
		}else if(type=='virtualmeters'){
85
			return 'btn-info'
86
		}else{
87
			return 'btn-success'
88
		}
89
	};
90
91
	$scope.changeMeterType=function(){
92
		switch($scope.currentMeterType){
93
			case 'meters':
94
				$scope.currentmeters=$scope.meters;
95
				break;
96
			case 'virtualmeters':
97
				$scope.currentmeters=$scope.virtualmeters;
98
				break;
99
			case  'offlinemeters':
100
				$scope.currentmeters=$scope.offlinemeters;
101
				break;
102
		}
103
	};
104
105
	$scope.getAllMeters = function() {
106
        let headers = { "User-UUID": $scope.cur_user.uuid, "Token": $scope.cur_user.token };
107
		MeterService.getAllMeters(headers, function (response) {
108
			if (angular.isDefined(response.status) && response.status === 200) {
109
				$scope.meters = response.data;
110
				$scope.currentMeterType="meters";
111
				$timeout(function(){
112
					$scope.changeMeterType();
113
				},1000);
114
			} else {
115
				$scope.meters = [];
116
			}
117
		});
118
119
	};
120
121
	$scope.getAllOfflineMeters = function() {
122
        let headers = { "User-UUID": $scope.cur_user.uuid, "Token": $scope.cur_user.token };
123
		OfflineMeterService.getAllOfflineMeters(headers, function (response) {
124
			if (angular.isDefined(response.status) && response.status === 200) {
125
				$scope.offlinemeters = response.data;
126
			} else {
127
				$scope.offlinemeters = [];
128
			}
129
		});
130
131
	};
132
133
	$scope.getAllVirtualMeters = function() {
134
        let headers = { "User-UUID": $scope.cur_user.uuid, "Token": $scope.cur_user.token };
135
		VirtualMeterService.getAllVirtualMeters(headers, function (response) {
136
			if (angular.isDefined(response.status) && response.status === 200) {
137
				$scope.virtualmeters = response.data;
138
			} else {
139
				$scope.virtualmeters = [];
140
			}
141
		});
142
143
	};
144
145
	$scope.pairMeter=function(dragEl,dropEl){
146
		var meterid=angular.element('#'+dragEl).scope().meter.id;
147
		var spaceid=angular.element(spacetreewithmeter).jstree(true).get_top_selected();
148
        let headers = { "User-UUID": $scope.cur_user.uuid, "Token": $scope.cur_user.token };
149
		SpaceMeterService.addPair(spaceid,meterid, $scope.currentMeterType, headers, function (response) {
150
			if (angular.isDefined(response.status) && response.status === 201) {
151
					toaster.pop({
152
						type: "success",
153
						title: $translate.instant("TOASTER.SUCCESS_TITLE"),
154
						body: $translate.instant("TOASTER.BIND_METER_SUCCESS"),
155
						showCloseButton: true,
156
					});
157
					$scope.getMetersBySpaceID(spaceid);
158
				} else {
159
          toaster.pop({
160
              type: "error",
161
              title: $translate.instant(response.data.title),
162
              body: $translate.instant(response.data.description),
163
              showCloseButton: true,
164
          });
165
				}
166
		});
167
	};
168
169
	$scope.deleteMeterPair=function(dragEl,dropEl){
170
		if(angular.element('#'+dragEl).hasClass('source')){
171
			return;
172
        }
173
        var spacemeterid = angular.element('#' + dragEl).scope().spacemeter.id;
174
        var spaceid = angular.element(spacetreewithmeter).jstree(true).get_top_selected();
175
        var metertype = angular.element('#' + dragEl).scope().spacemeter.metertype;
176
        let headers = { "User-UUID": $scope.cur_user.uuid, "Token": $scope.cur_user.token };
177
        SpaceMeterService.deletePair(spaceid, spacemeterid, metertype, headers, function (response) {
178
            if (angular.isDefined(response.status) && response.status === 204) {
179
                toaster.pop({
180
                    type: "success",
181
                    title: $translate.instant("TOASTER.SUCCESS_TITLE"),
182
                    body: $translate.instant("TOASTER.UNBIND_METER_SUCCESS"),
183
                    showCloseButton: true,
184
                });
185
                $scope.getMetersBySpaceID(spaceid);
186
            } else {
187
                toaster.pop({
188
                    type: "error",
189
                    title: $translate.instant(response.data.title),
190
                    body: $translate.instant(response.data.description),
191
                    showCloseButton: true,
192
                });
193
            }
194
		});
195
	};
196
197
    $scope.initTab = function() {
198
        if (!$scope.tabInitialized) {
199
            $scope.tabInitialized = true;
200
            $scope.getAllSpaces();
201
            $scope.getAllMeters();
202
            $scope.getAllVirtualMeters();
203
            $scope.getAllOfflineMeters();
204
        }
205
    };
206
207
    $scope.$on('space.tabSelected', function(event, tabIndex) {
208
        var TAB_INDEXES = ($scope.$parent && $scope.$parent.TAB_INDEXES) || { METER: 1 };
209
        if (tabIndex === TAB_INDEXES.METER && !$scope.tabInitialized) {
210
            $scope.initTab();
211
        }
212
    });
213
214
    $timeout(function() {
215
        var TAB_INDEXES = ($scope.$parent && $scope.$parent.TAB_INDEXES) || { METER: 1 };
216
        if ($scope.$parent && $scope.$parent.activeTabIndex === TAB_INDEXES.METER && !$scope.tabInitialized) {
217
            $scope.initTab();
218
        }
219
    }, 0);
220
221
    $scope.refreshSpaceTree = function() {
222
    let headers = { "User-UUID": $scope.cur_user.uuid, "Token": $scope.cur_user.token };
223
    SpaceService.getAllSpaces(headers, function (response) {
224
      if (angular.isDefined(response.status) && response.status === 200) {
225
        $scope.spaces = response.data;
226
      } else {
227
        $scope.spaces = [];
228
      }
229
      //create space tree
230
      var treedata = {'core': {'data': [], "multiple" : false,}, "plugins" : [ "wholerow" ]};
231
      for(var i=0; i < $scope.spaces.length; i++) {
232
          if ($scope.spaces[i].id == 1) {
233
            var node = {"id": $scope.spaces[i].id.toString(),
234
                                "parent": '#',
235
                                "text": $scope.spaces[i].name,
236
                                "state": {  'opened' : true,  'selected' : false },
237
                               };
238
          } else {
239
              var node = {"id": $scope.spaces[i].id.toString(),
240
                                  "parent": $scope.spaces[i].parent_space.id.toString(),
241
                                  "text": $scope.spaces[i].name,
242
                                 };
243
          };
244
          treedata['core']['data'].push(node);
245
      }
246
247
      angular.element(spacetreewithmeter).jstree(true).settings.core.data = treedata['core']['data'];
248
      angular.element(spacetreewithmeter).jstree(true).refresh();
249
    });
250
    };
251
252
	$scope.$on('handleBroadcastSpaceChanged', function(event) {
253
    $scope.spacemeters = [];
254
    $scope.refreshSpaceTree();
255
	});
256
257
});
258