sensor-insert-popup.component.ts 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131
  1. import {Component, EventEmitter, Input, OnInit, Output} from '@angular/core';
  2. import {UntypedFormArray, UntypedFormBuilder, UntypedFormGroup, Validators} from '@angular/forms';
  3. import {ManagementService} from '../../../shared/api/endpoints/services/management.service';
  4. import {InsertUnit} from '../../../shared/api/endpoints/models/insert-unit';
  5. import {InsertSensor} from '../../../shared/api/endpoints/models/insert-sensor';
  6. import {map} from 'rxjs/operators';
  7. import {HttpResponse} from '@angular/common/http';
  8. import {ToastService} from '../../../shared/services/toast.service';
  9. import {SensorType} from '../../../shared/api/endpoints/models/sensor-type';
  10. import {Phenomenon} from '../../../shared/api/endpoints/models/phenomenon';
  11. @Component({
  12. selector: 'app-sensor-insert-popup',
  13. templateUrl: './sensor-insert-popup.component.html',
  14. styleUrls: ['./sensor-insert-popup.component.scss']
  15. })
  16. export class SensorInsertPopupComponent implements OnInit {
  17. insertForm: UntypedFormGroup;
  18. items: UntypedFormArray;
  19. sensors = 0;
  20. @Input() phenomenons: Phenomenon[];
  21. @Input() isVisible;
  22. @Input() unit;
  23. @Input() sensorTypes: SensorType[];
  24. @Output() isVisibleChange: EventEmitter<boolean> = new EventEmitter<boolean>();
  25. @Output() emitNewSensor: EventEmitter<{unit: InsertUnit, sensors: InsertSensor[]}> =
  26. new EventEmitter<{unit: InsertUnit, sensors: InsertSensor[]}>()
  27. constructor(
  28. private formBuilder: UntypedFormBuilder,
  29. private managementService: ManagementService,
  30. private toastService: ToastService
  31. ) {
  32. this.initForm();
  33. }
  34. ngOnInit(): void {
  35. }
  36. close() {
  37. this.isVisibleChange.emit(false);
  38. }
  39. initForm() {
  40. this.insertForm = this.formBuilder.group({
  41. sensors: this.formBuilder.array([this.createSensor()])
  42. });
  43. }
  44. /**
  45. * Prepare form object for sensor
  46. */
  47. createSensor(): UntypedFormGroup {
  48. return this.formBuilder.group({
  49. sensorId: ['', Validators.required],
  50. sensorName: ['', Validators.required],
  51. sensorType: ['null', Validators.required],
  52. phenomenons: ['null', Validators.required]
  53. });
  54. }
  55. /**
  56. * Add sensor to form
  57. */
  58. addSensor(): void {
  59. this.items = this.insertForm.get('sensors') as UntypedFormArray;
  60. this.items.push(this.createSensor());
  61. this.sensors++;
  62. }
  63. /**
  64. * Remove last sensor from form
  65. */
  66. removeSensor() {
  67. this.items = this.insertForm.get('sensors') as UntypedFormArray;
  68. this.items.removeAt(this.items.length - 1);
  69. this.sensors--;
  70. }
  71. /**
  72. * Clearing form
  73. */
  74. clearFormArray() {
  75. const frmArray = this.insertForm?.get('sensors') as UntypedFormArray;
  76. if (frmArray) {
  77. frmArray.clear();
  78. }
  79. this.addSensor();
  80. this.insertForm.reset();
  81. }
  82. /**
  83. * Send insert sensors request to backend. Iterate over all sensors in form.
  84. */
  85. processSensorInsertion() {
  86. if (this.insertForm.valid) {
  87. const unit: InsertUnit = {
  88. unit_id: this.unit.unitId
  89. }
  90. const sensors: InsertSensor[] = [];
  91. const frmArray = this.insertForm?.get('sensors') as UntypedFormArray;
  92. frmArray.controls.forEach(control => {
  93. if (control.get('sensorId').value !== '') {
  94. const sensor: InsertSensor = {
  95. sensor_id: control.get('sensorId').value,
  96. sensor_name: control.get('sensorName').value,
  97. sensor_type: control.get('sensorType').value,
  98. phenomenon: {
  99. phenomenon_id: control.get('phenomenons').value
  100. },
  101. }
  102. sensors.push(sensor);
  103. }
  104. });
  105. this.managementService.insertSensor$Response({body: {unit, sensors}}).pipe(
  106. map((response: HttpResponse<any>) => {
  107. if (response.status === 200) {
  108. this.toastService.showSuccessMessage('Sensors inserted to unit!');
  109. this.emitNewSensor.emit({unit, sensors});
  110. this.close();
  111. } else {
  112. }
  113. })
  114. ).toPromise().then().catch(err => this.toastService.showError(err.error.message));
  115. }
  116. }
  117. }