Passed
Push — master ( 98975f...e9b166 )
by
unknown
09:13
created

myems-admin/app/controllers/settings/equipment/equipmentmeter.controller.js   B

Complexity

Total Complexity 47
Complexity/F 1.47

Size

Lines of Code 240
Function Count 32

Duplication

Duplicated Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
wmc 47
eloc 168
dl 0
loc 240
rs 8.64
c 0
b 0
f 0
mnd 15
bc 15
fnc 32
bpm 0.4687
cpm 1.4686
noi 0

How to fix   Complexity   

Complexity

Complex classes like myems-admin/app/controllers/settings/equipment/equipmentmeter.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('EquipmentMeterController', function(
4
	$scope,
5
	$rootScope,
6
	$window,
7
	$timeout,
8
	$uibModal,
9
	$translate,
10
	MeterService,
11
	VirtualMeterService,
12
	OfflineMeterService,
13
	EquipmentMeterService,
14
	EquipmentService,
15
	toaster,
16
	SweetAlert) {
17
	$scope.cur_user = JSON.parse($window.localStorage.getItem("myems_admin_ui_current_user"));
18
    $scope.currentEquipment = {selected:undefined};
19
    $scope.currentMeterType = "meters";
20
	$scope.getAllEquipments = function(id) {
21
		let headers = { "User-UUID": $scope.cur_user.uuid, "Token": $scope.cur_user.token };
22
		EquipmentService.getAllEquipments(headers, function (response) {
23
			if (angular.isDefined(response.status) && response.status === 200) {
24
				$scope.equipments = response.data;
25
			} else {
26
				$scope.equipments = [];
27
			}
28
		});
29
	};
30
31
	$scope.changeEquipment=function(item,model){
32
		$scope.currentEquipment=item;
33
		$scope.currentEquipment.selected=model;
34
		if ($scope.currentEquipment && $scope.currentEquipment.id) {
35
			$scope.getMetersByEquipmentID($scope.currentEquipment.id);
36
		} else {
37
			// If no device is selected, clear the bound list and refresh the available list
38
			$scope.equipmentmeters = [];
39
			$scope.filterAvailableMeters();
40
		}
41
	};
42
43
	$scope.getMetersByEquipmentID = function(id) {
44
		var metertypes=['meters','virtualmeters','offlinemeters'];
45
		$scope.equipmentmeters=[];
46
		let headers = { "User-UUID": $scope.cur_user.uuid, "Token": $scope.cur_user.token };
47
		var pending = metertypes.length;
48
		angular.forEach(metertypes,function(value,index){
49
			EquipmentMeterService.getMetersByEquipmentID(id, value, headers, function (response) {
50
				if (angular.isDefined(response.status) && response.status === 200) {
51
					angular.forEach(response.data,function(item, indx){
52
						response.data[indx].metertype = value;
53
					});
54
					$scope.equipmentmeters = $scope.equipmentmeters.concat(response.data);
55
				}
56
				pending--;
57
				if (pending === 0) {
58
					$scope.filterAvailableMeters();
59
				}
60
			});
61
		});
62
	};
63
64
	$scope.colorMeterType=function(type){
65
		if(type=='meters'){
66
			return 'btn-primary'
67
		}else if(type=='virtualmeters'){
68
			return 'btn-info'
69
		}else{
70
			return 'btn-success'
71
		}
72
	};
73
74
	$scope.changeMeterType=function(){
75
		switch($scope.currentMeterType){
76
			case 'meters':
77
				$scope.currentmeters=$scope.filteredMeters || [];
78
				break;
79
			case 'virtualmeters':
80
				$scope.currentmeters=$scope.filteredVirtualMeters || [];
81
				break;
82
			case 'offlinemeters':
83
				$scope.currentmeters=$scope.filteredOfflineMeters || [];
84
				break;
85
		}
86
	};
87
88
	$scope.getAllMeters = function() {
89
		let headers = { "User-UUID": $scope.cur_user.uuid, "Token": $scope.cur_user.token };
90
		MeterService.getAllMeters(headers, function (response) {
91
			if (angular.isDefined(response.status) && response.status === 200) {
92
				$scope.meters = response.data;
93
				$scope.currentMeterType="meters";
94
				$scope.filterAvailableMeters();
95
				$timeout(function(){
96
					$scope.changeMeterType();
97
				},100);
98
			} else {
99
				$scope.meters = [];
100
			}
101
		});
102
	};
103
104
	$scope.getAllOfflineMeters = function() {
105
		let headers = { "User-UUID": $scope.cur_user.uuid, "Token": $scope.cur_user.token };
106
		OfflineMeterService.getAllOfflineMeters(headers, function (response) {
107
			if (angular.isDefined(response.status) && response.status === 200) {
108
				$scope.offlinemeters = response.data;
109
				$scope.filterAvailableMeters();
110
			} else {
111
				$scope.offlinemeters = [];
112
			}
113
		});
114
	};
115
116
	$scope.getAllVirtualMeters = function() {
117
		let headers = { "User-UUID": $scope.cur_user.uuid, "Token": $scope.cur_user.token };
118
		VirtualMeterService.getAllVirtualMeters(headers, function (response) {
119
			if (angular.isDefined(response.status) && response.status === 200) {
120
				$scope.virtualmeters = response.data;
121
				$scope.filterAvailableMeters();
122
			} else {
123
				$scope.virtualmeters = [];
124
			}
125
		});
126
	};
127
128
	$scope.filterAvailableMeters = function() {
129
		
130
		var boundSet = {};
131
		($scope.equipmentmeters || []).forEach(function(em) {
132
			var keyType = em.metertype || 'meters';
133
			// em.id should be the id of a specific table
134
			if (angular.isDefined(em.id)) {
135
				boundSet[keyType + '_' + em.id] = true;
136
			}
137
		});
138
139
		$scope.filteredMeters = ($scope.meters || []).filter(function(m){
140
			return !boundSet['meters_' + m.id];
141
		});
142
		$scope.filteredVirtualMeters = ($scope.virtualmeters || []).filter(function(vm){
143
			return !boundSet['virtualmeters_' + vm.id];
144
		});
145
		$scope.filteredOfflineMeters = ($scope.offlinemeters || []).filter(function(om){
146
			return !boundSet['offlinemeters_' + om.id];
147
		});
148
149
		$scope.changeMeterType();
150
	};
151
152
	$scope.pairMeter=function(dragEl,dropEl){
153
        var tem_uuid = angular.element('#' + dragEl);
154
        if (angular.isDefined(tem_uuid.scope().equipmentmeter)) {
155
            return;
156
        }
157
        var modalInstance = $uibModal.open({
158
            templateUrl: 'views/settings/equipment/equipmentmeter.model.html',
159
            controller: 'ModalEditEquipmentMeterCtrl',
160
            backdrop: 'static',
161
            size: 'sm'
162
        });
163
        modalInstance.result.then(function (is_output) {
164
		    var meterid=angular.element('#'+dragEl).scope().meter.id;
165
		    var equipmentid=$scope.currentEquipment.id;
166
			let headers = { "User-UUID": $scope.cur_user.uuid, "Token": $scope.cur_user.token };
167
            EquipmentMeterService.addPair(equipmentid, meterid, $scope.currentMeterType, is_output, headers, function (response) {
168
				if (angular.isDefined(response.status) && response.status === 201) {
169
					toaster.pop({
170
						type: "success",
171
						title: $translate.instant("TOASTER.SUCCESS_TITLE"),
172
						body: $translate.instant("TOASTER.BIND_METER_SUCCESS"),
173
						showCloseButton: true,
174
					});
175
					// Reacquire the binding and trigger filtering
176
					$scope.getMetersByEquipmentID($scope.currentEquipment.id);
177
				} else {
178
					toaster.pop({
179
						type: "error",
180
						title: $translate.instant(response.data.title),
181
						body: $translate.instant(response.data.description),
182
						showCloseButton: true,
183
					});
184
				}
185
			});
186
        },function() {
187
        });
188
		$rootScope.modalInstance = modalInstance;
189
    };
190
191
    $scope.deleteMeterPair = function (dragEl, dropEl) {
192
        if (angular.element('#' + dragEl).hasClass('source')) {
193
            return;
194
        }
195
        var equipmentmeterid = angular.element('#' + dragEl).scope().equipmentmeter.id;
196
        var equipmentid = $scope.currentEquipment.id;
197
        var metertype = angular.element('#' + dragEl).scope().equipmentmeter.metertype;
198
		let headers = { "User-UUID": $scope.cur_user.uuid, "Token": $scope.cur_user.token };
199
        EquipmentMeterService.deletePair(equipmentid, equipmentmeterid, metertype, headers, function (response) {
200
            if (angular.isDefined(response.status) && response.status === 204) {
201
                toaster.pop({
202
                    type: "success",
203
                    title: $translate.instant("TOASTER.SUCCESS_TITLE"),
204
                    body: $translate.instant("TOASTER.UNBIND_METER_SUCCESS"),
205
                    showCloseButton: true,
206
                });
207
                // Reacquire the binding and trigger filtering
208
                $scope.getMetersByEquipmentID($scope.currentEquipment.id);
209
            } else {
210
                toaster.pop({
211
                    type: "error",
212
                    title: $translate.instant(response.data.title),
213
                    body: $translate.instant(response.data.description),
214
                    showCloseButton: true,
215
                });
216
            }
217
        });
218
    };
219
220
	$scope.getAllEquipments();
221
	$scope.getAllMeters();
222
	$scope.getAllVirtualMeters();
223
	$scope.getAllOfflineMeters();
224
225
  	$scope.$on('handleBroadcastEquipmentChanged', function(event) {
226
    	$scope.getAllEquipments();
227
  	});
228
});
229
230
app.controller('ModalEditEquipmentMeterCtrl', function ($scope, $uibModalInstance) {
231
    $scope.is_output = "false";
232
233
    $scope.ok = function () {
234
        $uibModalInstance.close(angular.fromJson($scope.is_output));
235
    };
236
237
    $scope.cancel = function () {
238
        $uibModalInstance.dismiss('cancel');
239
    };
240
});
241