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

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

Complexity

Total Complexity 77
Complexity/F 1.6

Size

Lines of Code 467
Function Count 48

Duplication

Duplicated Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
wmc 77
eloc 330
dl 0
loc 467
rs 2.24
c 0
b 0
f 0
mnd 29
bc 29
fnc 48
bpm 0.6041
cpm 1.6041
noi 0

How to fix   Complexity   

Complexity

Complex classes like myems-admin/app/controllers/settings/meter/meter.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('MeterController', function($scope,
4
	$rootScope,
5
	$window,
6
	$translate,
7
	$uibModal,
8
	MeterService,
9
	CategoryService,
10
	CostCenterService,
11
	EnergyItemService,
12
	toaster,
13
	SweetAlert) {
14
	$scope.cur_user = JSON.parse($window.localStorage.getItem("myems_admin_ui_current_user"));
15
	$scope.exportdata = '';
16
	$scope.importdata = '';
17
	$scope.searchKeyword = '';
18
19
	$scope.getAllCostCenters = function() {
20
		let headers = { "User-UUID": $scope.cur_user.uuid, "Token": $scope.cur_user.token };
21
		CostCenterService.getAllCostCenters(headers, function (response) {
22
			if (angular.isDefined(response.status) && response.status === 200) {
23
				$scope.costcenters = response.data;
24
			} else {
25
				$scope.costcenters = [];
26
			}
27
		});
28
	};
29
30
	$scope.getAllCategories = function() {
31
		let headers = { "User-UUID": $scope.cur_user.uuid, "Token": $scope.cur_user.token };
32
		CategoryService.getAllCategories(headers, function (response) {
33
			if (angular.isDefined(response.status) && response.status === 200) {
34
				$scope.categories = response.data;
35
			} else {
36
				$scope.categories = [];
37
			}
38
		});
39
40
	};
41
42
	$scope.getAllEnergyItems = function() {
43
		let headers = { "User-UUID": $scope.cur_user.uuid, "Token": $scope.cur_user.token };
44
		EnergyItemService.getAllEnergyItems(headers, function (response) {
45
			if (angular.isDefined(response.status) && response.status === 200) {
46
				$scope.energyitems = response.data;
47
			} else {
48
				$scope.energyitems = [];
49
			}
50
	});
51
52
};
53
	$scope.getAllMeters = function() {
54
		let headers = { "User-UUID": $scope.cur_user.uuid, "Token": $scope.cur_user.token };
55
		MeterService.getAllMeters(headers, function (response) {
56
			if (angular.isDefined(response.status) && response.status === 200) {
57
				$scope.meters = response.data;
58
				$scope.parentmeters = response.data;
59
			} else {
60
				$scope.meters = [];
61
				$scope.parentmeters = [];
62
			}
63
			//create meter tree
64
			var treedata = {'core': {'data': [], "multiple" : false,}, "plugins" : [ "wholerow" ]};
65
			for(var i=0; i < $scope.meters.length; i++) {
66
					if ($scope.meters[i].master_meter == null) {
67
						var node = {"id": $scope.meters[i].id.toString(),
68
																"parent": '#',
69
																"text": $scope.meters[i].name,
70
																"state": {  'opened' : true,  'selected' : false },
71
															 };
72
					} else {
73
							var node = {"id": $scope.meters[i].id.toString(),
74
																	"parent": $scope.meters[i].master_meter.id.toString(),
75
																	"text": $scope.meters[i].name,
76
																 };
77
					};
78
					treedata['core']['data'].push(node);
79
			}
80
81
			angular.element(metertree).jstree(treedata);
82
			//meter tree selected changed event handler
83
			angular.element(metertree).on("changed.jstree", function (e, data) {
84
				$scope.currentMeterID = parseInt(data.selected[0]);
85
				$scope.getMeterSubmeters($scope.currentMeterID);
86
			});
87
		});
88
89
	};
90
91
    let searchDebounceTimer = null;
92
93
    function safeApply(scope) {
94
        if (!scope.$$phase && !scope.$root.$$phase) {
95
            scope.$apply();
96
        }
97
    }
98
99
    $scope.searchMeters = function() {
100
        const headers = {
101
            "User-UUID": $scope.cur_user?.uuid,
102
            "Token": $scope.cur_user?.token
103
        };
104
105
        const rawKeyword = $scope.searchKeyword || "";
106
        const trimmedKeyword = rawKeyword.trim();
107
108
        if (searchDebounceTimer) {
109
            clearTimeout(searchDebounceTimer);
110
        }
111
112
        searchDebounceTimer = setTimeout(() => {
113
            if (!trimmedKeyword) {
114
                $scope.getAllMeters();
115
                safeApply($scope);
116
                return;
117
            }
118
119
            MeterService.searchMeters(trimmedKeyword, headers, (response) => {
120
                $scope.meters = (response.status === 200) ? response.data : [];
121
                $scope.parentmeters = [...$scope.meters];
122
123
                const treedata = {
124
                    'core': { 'data': [], "multiple": false },
125
                    "plugins": ["wholerow"]
126
                };
127
128
                $scope.meters.forEach(meter => {
129
                    const node = {
130
                        "id": meter.id.toString(),
131
                        "text": meter.name
132
                    };
133
134
                    if (!meter.master_meter) {
135
                        node.parent = '#';
136
                        node.state = { 'opened': true, 'selected': false };
137
                    } else {
138
                        node.parent = meter.master_meter.id.toString();
139
                    }
140
141
                    treedata.core.data.push(node);
142
                });
143
144
                const treeElement = angular.element(metertree);
145
                const existingTree = treeElement.jstree(true);
146
147
                if (existingTree) {
148
                    existingTree.settings.core.data = treedata.core.data;
149
                    existingTree.refresh();
150
                } else {
151
                    treeElement.jstree(treedata);
152
                }
153
154
                treeElement.off("changed.jstree");
155
                treeElement.on("changed.jstree", (e, data) => {
156
                    if (data.selected?.length) {
157
                        $scope.currentMeterID = parseInt(data.selected[0], 10);
158
                        $scope.getMeterSubmeters($scope.currentMeterID);
159
                    } else {
160
                        $scope.currentMeterID = null;
161
                        $scope.submeters = [];
162
                    }
163
                    safeApply($scope);
164
                });
165
166
                safeApply($scope);
167
            });
168
        }, 300);
169
    };
170
171
172
	$scope.refreshMeterTree = function() {
173
		let headers = { "User-UUID": $scope.cur_user.uuid, "Token": $scope.cur_user.token };
174
		MeterService.getAllMeters(headers, function (response) {
175
			if (angular.isDefined(response.status) && response.status === 200) {
176
				$scope.meters = response.data;
177
				$scope.parentmeters = response.data;
178
			} else {
179
				$scope.meters = [];
180
				$scope.parentmeters = [];
181
			}
182
			//create meter tree
183
			var treedata = {'core': {'data': [], "multiple" : false,}, "plugins" : [ "wholerow" ]};
184
			for(var i=0; i < $scope.meters.length; i++) {
185
				if ($scope.meters[i].master_meter == null) {
186
					var node = {"id": $scope.meters[i].id.toString(),
187
								"parent": '#',
188
								"text": $scope.meters[i].name,
189
								"state": {  'opened' : true,  'selected' : false },
190
								};
191
				} else {
192
					var node = {"id": $scope.meters[i].id.toString(),
193
								"parent": $scope.meters[i].master_meter.id.toString(),
194
								"text": $scope.meters[i].name,
195
								};
196
				};
197
				treedata['core']['data'].push(node);
198
			}
199
			var metertree = document.getElementById("metertree");
200
			angular.element(metertree).jstree(true).settings.core.data = treedata['core']['data'];
201
			angular.element(metertree).jstree(true).refresh();
202
		});
203
	};
204
205
	$scope.getMeterSubmeters = function(meterid) {
206
		let headers = { "User-UUID": $scope.cur_user.uuid, "Token": $scope.cur_user.token };
207
		MeterService.getMeterSubmeters(meterid, headers, function (response) {
208
		if (angular.isDefined(response.status) && response.status === 200) {
209
			$scope.currentMeterSubmeters = response.data;
210
		} else {
211
			$scope.currentMeterSubmeters = [];
212
		}
213
		});
214
	};
215
216
	$scope.addMeter = function() {
217
		var modalInstance = $uibModal.open({
218
			templateUrl: 'views/settings/meter/meter.model.html',
219
			controller: 'ModalAddMeterCtrl',
220
			windowClass: "animated fadeIn",
221
			resolve: {
222
				params: function() {
223
					return {
224
						meters: angular.copy($scope.meters),
225
						parentmeters: angular.copy($scope.parentmeters),
226
						categories: angular.copy($scope.categories),
227
						costcenters: angular.copy($scope.costcenters),
228
						energyitems: angular.copy($scope.energyitems),
229
					};
230
				}
231
			}
232
		});
233
		modalInstance.result.then(function(meter) {
234
			let headers = { "User-UUID": $scope.cur_user.uuid, "Token": $scope.cur_user.token };
235
			meter.energy_category_id = meter.energy_category.id;
236
			meter.cost_center_id = meter.cost_center.id;
237
			if(angular.isDefined(meter.energy_item)) {
238
				meter.energy_item_id = meter.energy_item.id;
239
			} else {
240
				meter.energy_item_id = undefined;
241
			}
242
			if(angular.isDefined(meter.master_meter)) {
243
				meter.master_meter_id = meter.master_meter.id;
244
			} else {
245
				meter.master_meter_id = undefined;
246
			}
247
			MeterService.addMeter(meter, headers, function (response) {
248
				if (angular.isDefined(response.status) && response.status === 201) {
249
					toaster.pop({
250
						type: "success",
251
						title: $translate.instant("TOASTER.SUCCESS_TITLE"),
252
						body: $translate.instant("TOASTER.SUCCESS_ADD_BODY", {template: $translate.instant("SETTING.METER")}),
253
						showCloseButton: true,
254
					});
255
					$scope.getAllMeters();
256
					$scope.$emit('handleEmitMeterChanged');
257
				} else {
258
					toaster.pop({
259
						type: "error",
260
						title: $translate.instant("TOASTER.ERROR_ADD_BODY", {template: $translate.instant("SETTING.METER")}),
261
						body: $translate.instant(response.data.description),
262
						showCloseButton: true,
263
					});
264
				}
265
			});
266
		}, function() {
267
268
		});
269
		$rootScope.modalInstance = modalInstance;
270
	};
271
272
	$scope.editMeter = function(meter) {
273
		var modalInstance = $uibModal.open({
274
			windowClass: "animated fadeIn",
275
			templateUrl: 'views/settings/meter/meter.model.html',
276
			controller: 'ModalEditMeterCtrl',
277
			resolve: {
278
				params: function() {
279
					return {
280
						meter: angular.copy(meter),
281
						meters: angular.copy($scope.meters),
282
						parentmeters: angular.copy($scope.parentmeters),
283
						categories: angular.copy($scope.categories),
284
						costcenters: angular.copy($scope.costcenters),
285
						energyitems: angular.copy($scope.energyitems),
286
					};
287
				}
288
			}
289
		});
290
291
		modalInstance.result.then(function(modifiedMeter) {
292
			let headers = { "User-UUID": $scope.cur_user.uuid, "Token": $scope.cur_user.token };
293
			modifiedMeter.energy_category_id = modifiedMeter.energy_category.id;
294
			modifiedMeter.cost_center_id = modifiedMeter.cost_center.id;
295
			if (modifiedMeter.energy_item != null && modifiedMeter.energy_item.id != null ) {
296
				modifiedMeter.energy_item_id = modifiedMeter.energy_item.id;
297
			} else {
298
				modifiedMeter.energy_item_id = undefined;
299
			}
300
			if (modifiedMeter.master_meter != null && modifiedMeter.master_meter.id != null ) {
301
				modifiedMeter.master_meter_id = modifiedMeter.master_meter.id;
302
			} else {
303
				modifiedMeter.master_meter_id = undefined;
304
			}
305
			MeterService.editMeter(modifiedMeter, headers,function (response) {
306
				if (angular.isDefined(response.status) && response.status === 200) {
307
					toaster.pop({
308
						type: "success",
309
						title: $translate.instant("TOASTER.SUCCESS_TITLE"),
310
						body: $translate.instant("TOASTER.SUCCESS_UPDATE_BODY", {template: $translate.instant("SETTING.METER")}),
311
						showCloseButton: true,
312
					});
313
					$scope.getAllMeters();
314
					$scope.$emit('handleEmitMeterChanged');
315
				} else {
316
					toaster.pop({
317
						type: "error",
318
						title: $translate.instant("TOASTER.ERROR_UPDATE_BODY", {template: $translate.instant("SETTING.METER")}),
319
						body: $translate.instant(response.data.description),
320
						showCloseButton: true,
321
					});
322
				}
323
			});
324
		}, function() {
325
			//do nothing;
326
		});
327
		$rootScope.modalInstance = modalInstance;
328
	};
329
330
	$scope.deleteMeter = function(meter) {
331
		SweetAlert.swal({
332
				title: $translate.instant("SWEET.TITLE"),
333
				text: $translate.instant("SWEET.TEXT"),
334
				type: "warning",
335
				showCancelButton: true,
336
				confirmButtonColor: "#DD6B55",
337
				confirmButtonText: $translate.instant("SWEET.CONFIRM_BUTTON_TEXT"),
338
				cancelButtonText: $translate.instant("SWEET.CANCEL_BUTTON_TEXT"),
339
				closeOnConfirm: true,
340
				closeOnCancel: true
341
			},
342
			function(isConfirm) {
343
				if (isConfirm) {
344
					let headers = { "User-UUID": $scope.cur_user.uuid, "Token": $scope.cur_user.token };
345
					MeterService.deleteMeter(meter, headers, function (response) {
346
						if (angular.isDefined(response.status) && response.status === 204) {
347
							toaster.pop({
348
								type: "success",
349
								title: $translate.instant("TOASTER.SUCCESS_TITLE"),
350
								body: $translate.instant("TOASTER.SUCCESS_DELETE_BODY", {template: $translate.instant("SETTING.METER")}),
351
								showCloseButton: true,
352
							});
353
							$scope.getAllMeters();
354
							$scope.$emit('handleEmitMeterChanged');
355
						} else {
356
							toaster.pop({
357
								type: "error",
358
								title: $translate.instant("TOASTER.ERROR_DELETE_BODY", {template: $translate.instant("SETTING.METER")}),
359
								body: $translate.instant(response.data.description),
360
								showCloseButton: true,
361
							});
362
						}
363
					});
364
				}
365
			});
366
	};
367
368
	$scope.exportMeter = function(meter) {
369
		let headers = { "User-UUID": $scope.cur_user.uuid, "Token": $scope.cur_user.token };
370
		MeterService.exportMeter(meter, headers, function(response) {
371
			if (angular.isDefined(response.status) && response.status === 200) {
372
				$scope.exportdata = JSON.stringify(response.data);
373
				var modalInstance = $uibModal.open({
374
					windowClass: "animated fadeIn",
375
					templateUrl: 'views/common/export.html',
376
					controller: 'ModalExportCtrl',
377
					resolve: {
378
						params: function() {
379
							return {
380
								exportdata: angular.copy($scope.exportdata)
381
							};
382
						}
383
					}
384
				});
385
				modalInstance.result.then(function() {
386
					//do nothing;
387
				}, function() {
388
					//do nothing;
389
				});
390
				$rootScope.modalInstance = modalInstance;
391
			} else {
392
				$scope.exportdata = null;
393
			}
394
		});
395
	};
396
397
	$scope.cloneMeter = function(meter){
398
		let headers = { "User-UUID": $scope.cur_user.uuid, "Token": $scope.cur_user.token };
399
		MeterService.cloneMeter(meter, headers, function(response) {
400
			if (angular.isDefined(response.status) && response.status === 201) {
401
				toaster.pop({
402
					type: "success",
403
					title: $translate.instant("TOASTER.SUCCESS_TITLE"),
404
					body: $translate.instant("TOASTER.SUCCESS_ADD_BODY", {template: $translate.instant("SETTING.METER")}),
405
					showCloseButton: true,
406
				});
407
				$scope.$emit('handleEmitMeterChanged');
408
			}else {
409
				toaster.pop({
410
					type: "error",
411
					title: $translate.instant("TOASTER.ERROR_ADD_BODY", {template: $translate.instant("SETTING.METER")}),
412
					body: $translate.instant(response.data.description),
413
					showCloseButton: true,
414
				});
415
			}
416
		});
417
	};
418
419
	$scope.importMeter = function() {
420
		var modalInstance = $uibModal.open({
421
			templateUrl: 'views/common/import.html',
422
			controller: 'ModalImportCtrl',
423
			windowClass: "animated fadeIn",
424
			resolve: {
425
				params: function() {
426
					return {
427
					};
428
				}
429
			}
430
		});
431
		modalInstance.result.then(function(importdata) {
432
			let headers = { "User-UUID": $scope.cur_user.uuid, "Token": $scope.cur_user.token };
433
			MeterService.importMeter(importdata, headers, function(response) {
434
				if (angular.isDefined(response.status) && response.status === 201) {
435
					toaster.pop({
436
						type: "success",
437
						title: $translate.instant("TOASTER.SUCCESS_TITLE"),
438
						body: $translate.instant("TOASTER.SUCCESS_ADD_BODY", {template: $translate.instant("SETTING.METER")}),
439
						showCloseButton: true,
440
					});
441
					$scope.$emit('handleEmitMeterChanged');
442
				} else {
443
					toaster.pop({
444
						type: "error",
445
						title: $translate.instant("TOASTER.ERROR_ADD_BODY", { template: $translate.instant("SETTING.METER") }),
446
						body: $translate.instant(response.data.description),
447
						showCloseButton: true,
448
					});
449
				}
450
			});
451
		}, function() {
452
453
		});
454
		$rootScope.modalInstance = modalInstance;
455
	};
456
457
	$scope.getAllMeters();
458
	$scope.getAllCategories();
459
	$scope.getAllCostCenters();
460
    $scope.getAllEnergyItems();
461
462
	$scope.$on('handleBroadcastMeterChanged', function(event) {
463
		$scope.refreshMeterTree();
464
	});
465
466
});
467
468
app.controller('ModalAddMeterCtrl', function($scope, $uibModalInstance, params) {
469
470
	$scope.operation = "SETTING.ADD_METER";
471
	$scope.categories = params.categories;
472
	$scope.costcenters = params.costcenters;
473
	$scope.energyitems = [];
474
	$scope.parentmeters = params.parentmeters;
475
	$scope.meter = {
476
		is_counted: false
477
	};
478
	$scope.ok = function() {
479
		$uibModalInstance.close($scope.meter);
480
	};
481
482
	$scope.cancel = function() {
483
		$uibModalInstance.dismiss('cancel');
484
	};
485
486
	$scope.last_energy_category_select_id = null;
487
	$scope.change_energyitems = function(selected_energy_category_id){
488
		var i = 0;
489
		var j = 0;
490
		$scope.energyitems = [];
491
		for (; i < params.energyitems.length; i++){
492
			if (params.energyitems[i]['energy_category']['id'] == selected_energy_category_id){
493
				$scope.energyitems[j] = params.energyitems[i];
494
				j = j + 1;
495
			}
496
		}
497
498
		if ($scope.last_energy_category_select_id == null){
499
			$scope.last_energy_category_select_id = selected_energy_category_id;
500
		}
501
		else{
502
			if($scope.last_energy_category_select_id != selected_energy_category_id){
503
				$scope.last_energy_category_select_id = selected_energy_category_id;
504
				delete $scope.meter.energy_item;
505
			}
506
		}
507
	};
508
});
509
510
app.controller('ModalEditMeterCtrl', function($scope, $uibModalInstance, params) {
511
	$scope.operation = "SETTING.EDIT_METER";
512
	$scope.meter = params.meter;
513
	$scope.meters = params.meters;
514
	$scope.parentmeters = params.parentmeters;
515
	$scope.categories = params.categories;
516
	$scope.costcenters = params.costcenters;
517
	$scope.energyitems = [];
518
	$scope.ok = function() {
519
		$uibModalInstance.close($scope.meter);
520
	};
521
522
	$scope.cancel = function() {
523
		$uibModalInstance.dismiss('cancel');
524
	};
525
526
	$scope.last_energy_category_select_id = null;
527
	$scope.change_energyitems = function(selected_energy_category_id){
528
		var i = 0;
529
		var j = 0;
530
		$scope.energyitems = [];
531
		for (; i < params.energyitems.length; i++){
532
			if (params.energyitems[i]['energy_category']['id'] == selected_energy_category_id){
533
				$scope.energyitems[j] = params.energyitems[i];
534
				j = j + 1;
535
			}
536
		}
537
538
		if ($scope.last_energy_category_select_id == null){
539
			$scope.last_energy_category_select_id = selected_energy_category_id;
540
		}
541
		else{
542
			if($scope.last_energy_category_select_id != selected_energy_category_id){
543
				$scope.last_energy_category_select_id = selected_energy_category_id;
544
				delete $scope.meter.energy_item;
545
			}
546
		}
547
	};
548
	$scope.change_energyitems($scope.meter.energy_category.id);
549
});
550