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

myems-admin/app/controllers/settings/meter/offlinemeter.controller.js   F

Complexity

Total Complexity 63
Complexity/F 1.5

Size

Lines of Code 380
Function Count 42

Duplication

Duplicated Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
wmc 63
eloc 266
mnd 21
bc 21
fnc 42
dl 0
loc 380
rs 3.36
bpm 0.5
cpm 1.5
noi 0
c 0
b 0
f 0

How to fix   Complexity   

Complexity

Complex classes like myems-admin/app/controllers/settings/meter/offlinemeter.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('OfflineMeterController', function(
4
	$scope,
5
	$rootScope,
6
	$window,
7
	$translate,
8
	$uibModal,
9
	OfflineMeterService,
10
	CategoryService,
11
	EnergyItemService,
12
	CostCenterService,
13
	toaster,
14
	SweetAlert) {
15
16
	$scope.cur_user = JSON.parse($window.localStorage.getItem("myems_admin_ui_current_user"));
17
	$scope.searchOfflineMeterKeyword = '';
18
	$scope.getAllCostCenters = function() {
19
		let headers = { "User-UUID": $scope.cur_user.uuid, "Token": $scope.cur_user.token };
20
		CostCenterService.getAllCostCenters(headers, function (response) {
21
			if (angular.isDefined(response.status) && response.status === 200) {
22
				$scope.costcenters = response.data;
23
			} else {
24
				$scope.costcenters = [];
25
			}
26
		});
27
	};
28
29
	$scope.getAllCategories = function() {
30
		let headers = { "User-UUID": $scope.cur_user.uuid, "Token": $scope.cur_user.token };
31
		CategoryService.getAllCategories(headers, function (response) {
32
			if (angular.isDefined(response.status) && response.status === 200) {
33
				$scope.categories = response.data;
34
			} else {
35
				$scope.categories = [];
36
			}
37
		});
38
	};
39
40
	$scope.getAllEnergyItems = function() {
41
		let headers = { "User-UUID": $scope.cur_user.uuid, "Token": $scope.cur_user.token };
42
		EnergyItemService.getAllEnergyItems(headers, function (response) {
43
			if (angular.isDefined(response.status) && response.status === 200) {
44
				$scope.energyitems = response.data;
45
			} else {
46
				$scope.energyitems = [];
47
			}
48
		});
49
	};
50
51
	$scope.getAllOfflineMeters = function() {
52
		let headers = { "User-UUID": $scope.cur_user.uuid, "Token": $scope.cur_user.token };
53
		OfflineMeterService.getAllOfflineMeters(headers, function (response) {
54
			if (angular.isDefined(response.status) && response.status === 200) {
55
				$scope.offlinemeters = response.data;
56
			} else {
57
				$scope.offlinemeters = [];
58
			}
59
		});
60
61
	};
62
63
	$scope.addOfflineMeter = function() {
64
		var modalInstance = $uibModal.open({
65
			templateUrl: 'views/settings/meter/offlinemeter.model.html',
66
			controller: 'ModalAddOfflineMeterCtrl',
67
			windowClass: "animated fadeIn",
68
			resolve: {
69
				params: function() {
70
					return {
71
						offlinemeters: angular.copy($scope.offlinemeters),
72
						categories: angular.copy($scope.categories),
73
						energyitems: angular.copy($scope.energyitems),
74
						costcenters: angular.copy($scope.costcenters)
75
					};
76
				}
77
			}
78
		});
79
		modalInstance.result.then(function(offlinemeter) {
80
			offlinemeter.energy_category_id = offlinemeter.energy_category.id;
81
			if(angular.isDefined(offlinemeter.energy_item)) {
82
				offlinemeter.energy_item_id = offlinemeter.energy_item.id;
83
			} else {
84
				offlinemeter.energy_item_id = undefined;
85
			}
86
			offlinemeter.cost_center_id = offlinemeter.cost_center.id;
87
			let headers = { "User-UUID": $scope.cur_user.uuid, "Token": $scope.cur_user.token };
88
			OfflineMeterService.addOfflineMeter(offlinemeter, headers, function(response) {
89
				if (angular.isDefined(response.status) && response.status === 201) {
90
					toaster.pop({
91
						type: "success",
92
						title: $translate.instant("TOASTER.SUCCESS_TITLE"),
93
						body: $translate.instant("TOASTER.SUCCESS_ADD_BODY", {template: $translate.instant("SETTING.OFFLINE_METER")}),
94
						showCloseButton: true,
95
					});
96
					$scope.getAllOfflineMeters();
97
					$scope.$emit('handleEmitOfflineMeterChanged');
98
				} else {
99
					toaster.pop({
100
						type: "error",
101
						title: $translate.instant("TOASTER.ERROR_ADD_BODY", {template: $translate.instant("SETTING.OFFLINE_METER")}),
102
						body: $translate.instant(response.data.description),
103
						showCloseButton: true,
104
					});
105
				}
106
			});
107
		}, function() {
108
109
		});
110
		$rootScope.modalInstance = modalInstance;
111
	};
112
113
	$scope.editOfflineMeter = function(offlinemeter) {
114
		var modalInstance = $uibModal.open({
115
			windowClass: "animated fadeIn",
116
			templateUrl: 'views/settings/meter/offlinemeter.model.html',
117
			controller: 'ModalEditOfflineMeterCtrl',
118
			resolve: {
119
				params: function() {
120
					return {
121
						offlinemeter: angular.copy(offlinemeter),
122
						offlinemeters: angular.copy($scope.offlinemeters),
123
						categories: angular.copy($scope.categories),
124
						energyitems: angular.copy($scope.energyitems),
125
						costcenters: angular.copy($scope.costcenters)
126
					};
127
				}
128
			}
129
		});
130
131
		modalInstance.result.then(function(modifiedOfflineMeter) {
132
			modifiedOfflineMeter.energy_category_id = modifiedOfflineMeter.energy_category.id;
133
			if (modifiedOfflineMeter.energy_item != null && modifiedOfflineMeter.energy_item.id != null ) {
134
				modifiedOfflineMeter.energy_item_id = modifiedOfflineMeter.energy_item.id;
135
			} else {
136
				modifiedOfflineMeter.energy_item_id = undefined;
137
			}
138
			modifiedOfflineMeter.cost_center_id = modifiedOfflineMeter.cost_center.id;
139
			let headers = { "User-UUID": $scope.cur_user.uuid, "Token": $scope.cur_user.token };
140
			OfflineMeterService.editOfflineMeter(modifiedOfflineMeter, headers, function (response) {
141
				if (angular.isDefined(response.status) && response.status === 200) {
142
					toaster.pop({
143
						type: "success",
144
						title: $translate.instant("TOASTER.SUCCESS_TITLE"),
145
						body: $translate.instant("TOASTER.SUCCESS_UPDATE_BODY", {template: $translate.instant("SETTING.OFFLINE_METER")}),
146
						showCloseButton: true,
147
					});
148
					$scope.getAllOfflineMeters();
149
					$scope.$emit('handleEmitOfflineMeterChanged');
150
				} else {
151
					toaster.pop({
152
						type: "error",
153
						title: $translate.instant("TOASTER.ERROR_UPDATE_BODY", {template: $translate.instant("SETTING.OFFLINE_METER")}),
154
						body: $translate.instant(response.data.description),
155
						showCloseButton: true,
156
					});
157
				}
158
			});
159
		}, function() {
160
			//do nothing;
161
		});
162
		$rootScope.modalInstance = modalInstance;
163
	};
164
165
	$scope.deleteOfflineMeter = function(offlinemeter) {
166
		SweetAlert.swal({
167
				title: $translate.instant("SWEET.TITLE"),
168
				text: $translate.instant("SWEET.TEXT"),
169
				type: "warning",
170
				showCancelButton: true,
171
				confirmButtonColor: "#DD6B55",
172
				confirmButtonText: $translate.instant("SWEET.CONFIRM_BUTTON_TEXT"),
173
				cancelButtonText: $translate.instant("SWEET.CANCEL_BUTTON_TEXT"),
174
				closeOnConfirm: true,
175
				closeOnCancel: true
176
			},
177
			function(isConfirm) {
178
				if (isConfirm) {
179
					let headers = { "User-UUID": $scope.cur_user.uuid, "Token": $scope.cur_user.token };
180
					OfflineMeterService.deleteOfflineMeter(offlinemeter, headers, function (response) {
181
						if (angular.isDefined(response.status) && response.status === 204) {
182
							toaster.pop({
183
								type: "success",
184
								title: $translate.instant("TOASTER.SUCCESS_TITLE"),
185
								body: $translate.instant("TOASTER.SUCCESS_DELETE_BODY", {template: $translate.instant("SETTING.OFFLINE_METER")}),
186
								showCloseButton: true,
187
							});
188
							$scope.getAllOfflineMeters();
189
							$scope.$emit('handleEmitOfflineMeterChanged');
190
						} else {
191
							toaster.pop({
192
								type: "error",
193
								title: $translate.instant("TOASTER.ERROR_DELETE_BODY", {template: $translate.instant("SETTING.OFFLINE_METER")}),
194
								body: $translate.instant(response.data.description),
195
								showCloseButton: true,
196
							});
197
						}
198
					});
199
				}
200
			});
201
	};
202
203
	$scope.exportOfflineMeter = function(offlinemeter) {
204
		let headers = { "User-UUID": $scope.cur_user.uuid, "Token": $scope.cur_user.token };
205
		OfflineMeterService.exportOfflineMeter(offlinemeter, headers, function(response) {
206
			if (angular.isDefined(response.status) && response.status === 200) {
207
				$scope.exportdata = JSON.stringify(response.data);
208
				var modalInstance = $uibModal.open({
209
					windowClass: "animated fadeIn",
210
					templateUrl: 'views/common/export.html',
211
					controller: 'ModalExportCtrl',
212
					resolve: {
213
						params: function() {
214
							return {
215
								exportdata: angular.copy($scope.exportdata)
216
							};
217
						}
218
					}
219
				});
220
				modalInstance.result.then(function() {
221
					//do nothing;
222
				}, function() {
223
					//do nothing;
224
				});
225
				$rootScope.modalInstance = modalInstance;
226
			} else {
227
				$scope.exportdata = null;
228
			}
229
		});
230
	};
231
232
	$scope.cloneOfflineMeter = function(offlinemeter){
233
		let headers = { "User-UUID": $scope.cur_user.uuid, "Token": $scope.cur_user.token };
234
		OfflineMeterService.cloneOfflineMeter(offlinemeter, headers, function(response) {
235
			if (angular.isDefined(response.status) && response.status === 201) {
236
				toaster.pop({
237
					type: "success",
238
					title: $translate.instant("TOASTER.SUCCESS_TITLE"),
239
					body: $translate.instant("TOASTER.SUCCESS_ADD_BODY", {template: $translate.instant("SETTING.OFFLINE_METER")}),
240
					showCloseButton: true,
241
				});
242
				$scope.getAllOfflineMeters();
243
				$scope.$emit('handleEmitOfflineMeterChanged');
244
			}else {
245
				toaster.pop({
246
					type: "error",
247
					title: $translate.instant("TOASTER.ERROR_ADD_BODY", {template: $translate.instant("SETTING.OFFLINE_METER")}),
248
					body: $translate.instant(response.data.description),
249
					showCloseButton: true,
250
				});
251
			}
252
		});
253
	};
254
255
	$scope.importOfflineMeter = function() {
256
		var modalInstance = $uibModal.open({
257
			templateUrl: 'views/common/import.html',
258
			controller: 'ModalImportCtrl',
259
			windowClass: "animated fadeIn",
260
			resolve: {
261
				params: function() {
262
					return {
263
					};
264
				}
265
			}
266
		});
267
		modalInstance.result.then(function(importdata) {
268
			let headers = { "User-UUID": $scope.cur_user.uuid, "Token": $scope.cur_user.token };
269
			OfflineMeterService.importOfflineMeter(importdata, headers, function(response) {
270
				if (angular.isDefined(response.status) && response.status === 201) {
271
					toaster.pop({
272
						type: "success",
273
						title: $translate.instant("TOASTER.SUCCESS_TITLE"),
274
						body: $translate.instant("TOASTER.SUCCESS_ADD_BODY", {template: $translate.instant("SETTING.OFFLINE_METER")}),
275
						showCloseButton: true,
276
					});
277
					$scope.getAllOfflineMeters();
278
					$scope.$emit('handleEmitOfflineMeterChanged');
279
				} else {
280
					toaster.pop({
281
						type: "error",
282
						title: $translate.instant("TOASTER.ERROR_ADD_BODY", { template: $translate.instant("SETTING.OFFLINE_METER") }),
283
						body: $translate.instant(response.data.description),
284
						showCloseButton: true,
285
					});
286
				}
287
			});
288
		}, function() {
289
290
		});
291
		$rootScope.modalInstance = modalInstance;
292
	};
293
294
	let searchDebounceTimer = null;
295
	function safeApply(scope) {
296
		if (!scope.$$phase && !scope.$root.$$phase) {
297
			scope.$apply();
298
		}
299
	}
300
	$scope.searchOfflineMeters = function() {
301
		const headers = {
302
			"User-UUID": $scope.cur_user?.uuid,
303
			"Token": $scope.cur_user?.token
304
		};
305
306
		const rawKeyword = $scope.searchOfflineMeterKeyword || "";
307
		const trimmedKeyword = rawKeyword.trim();
308
309
		if (searchDebounceTimer) {
310
			clearTimeout(searchDebounceTimer);
311
		}
312
313
		searchDebounceTimer = setTimeout(() => {
314
			if (!trimmedKeyword) {
315
				$scope.getAllOfflineMeters();
316
				safeApply($scope);
317
				return;
318
			}
319
320
			OfflineMeterService.searchOfflineMeters(trimmedKeyword, headers, (response) => {
321
				$scope.offlinemeters = (response.status === 200) ? response.data : [];
322
				$scope.parentmeters = [...$scope.offlinemeters];
323
			});
324
		}, 300);
325
	};
326
327
328
	$scope.getAllOfflineMeters();
329
	$scope.getAllCategories();
330
	$scope.getAllEnergyItems();
331
	$scope.getAllCostCenters();
332
});
333
334
app.controller('ModalAddOfflineMeterCtrl', function($scope, $uibModalInstance, params) {
335
336
	$scope.operation = "SETTING.ADD_OFFLINE_METER";
337
	$scope.categories = params.categories;
338
	$scope.energyitems = [];
339
	$scope.costcenters = params.costcenters;
340
	$scope.offlinemeter = {
341
		is_counted: false
342
	};
343
	$scope.ok = function() {
344
		$uibModalInstance.close($scope.offlinemeter);
345
	};
346
347
	$scope.cancel = function() {
348
		$uibModalInstance.dismiss('cancel');
349
	};
350
351
	$scope.last_energy_category_select_id = null;
352
	$scope.change_energyitems = function(selected_energy_category_id){
353
		var i = 0;
354
		var j = 0;
355
		$scope.energyitems = [];
356
		for (; i < params.energyitems.length; i++){
357
			if (params.energyitems[i]['energy_category']['id'] == selected_energy_category_id){
358
				$scope.energyitems[j] = params.energyitems[i];
359
				j = j + 1;
360
			}
361
		}
362
363
		if ($scope.last_energy_category_select_id == null){
364
			$scope.last_energy_category_select_id = selected_energy_category_id;
365
		}
366
		else{
367
			if($scope.last_energy_category_select_id != selected_energy_category_id){
368
				$scope.last_energy_category_select_id = selected_energy_category_id;
369
				delete $scope.offlinemeter.energy_item;
370
			}
371
		}
372
	}
373
374
});
375
376
app.controller('ModalEditOfflineMeterCtrl', function($scope, $uibModalInstance, params) {
377
	$scope.operation = "SETTING.EDIT_OFFLINE_METER";
378
	$scope.offlinemeter = params.offlinemeter;
379
	$scope.offlinemeters = params.offlinemeters;
380
	$scope.categories = params.categories;
381
	$scope.energyitems = [];
382
	$scope.costcenters = params.costcenters;
383
384
	$scope.ok = function() {
385
		$uibModalInstance.close($scope.offlinemeter);
386
	};
387
388
	$scope.cancel = function() {
389
		$uibModalInstance.dismiss('cancel');
390
	};
391
392
	$scope.last_energy_category_select_id = null;
393
	$scope.change_energyitems = function(selected_energy_category_id){
394
		var i = 0;
395
		var j = 0;
396
		$scope.energyitems = [];
397
		for (; i < params.energyitems.length; i++){
398
			if (params.energyitems[i]['energy_category']['id'] == selected_energy_category_id){
399
				$scope.energyitems[j] = params.energyitems[i];
400
				j = j + 1;
401
			}
402
		}
403
404
		if ($scope.last_energy_category_select_id == null){
405
			$scope.last_energy_category_select_id = selected_energy_category_id;
406
		}
407
		else{
408
			if($scope.last_energy_category_select_id != selected_energy_category_id){
409
				$scope.last_energy_category_select_id = selected_energy_category_id;
410
				delete $scope.offlinemeter.energy_item;
411
			}
412
		}
413
	};
414
	$scope.change_energyitems($scope.offlinemeter.energy_category.id);
415
});
416