diff --git a/src/services/SharedService.ts b/src/services/SharedService.ts
index 2a87382..ed14e47 100644
--- a/src/services/SharedService.ts
+++ b/src/services/SharedService.ts
@@ -20,7 +20,7 @@
  */
 import { HttpErrorResponse, HttpHeaders } from '@angular/common/http';
 import { EventEmitter, Injectable, Output } from '@angular/core';
-import { FormArray, FormGroup } from '@angular/forms';
+import { FormArray, FormControl, FormGroup } from '@angular/forms';
 import { Router } from '@angular/router';
 import { TranslateService } from '@ngx-translate/core';
 import {
@@ -370,24 +370,27 @@
     }
 
     /** Clean the form before submit @public */
-    public cleanForm(formGroup: FormGroup, formName?: String): void {
+    public cleanForm(formGroup: FormGroup | FormArray, formName?: string): void {
         Object.keys(formGroup.controls).forEach((key: string) => {
-            if ((!isNullOrUndefined((formGroup.get(key) as FormArray | FormGroup).controls)) && key !== 'config') {
-                // eslint-disable-next-line @typescript-eslint/no-shadow
-                for (const { item, index } of (formGroup.get(key).value).map((item: {}, index: number) => ({ item, index }))) {
-                    // eslint-disable-next-line security/detect-object-injection
-                    const newFormGroup: FormGroup = (formGroup.get(key) as FormArray).controls[index] as FormGroup;
-                    this.cleanForm(newFormGroup);
-                }
-            } else if (formGroup.get(key).value !== undefined && formGroup.get(key).value !== null && key !== 'config') {
-                if (!Array.isArray(formGroup.get(key).value)) {
-                    if (typeof formGroup.get(key).value === 'string') {
-                        formGroup.get(key).setValue(formGroup.get(key).value.trim());
+            const control = formGroup.get(key);
+            if (control instanceof FormArray && key !== 'config') {
+                control.controls.forEach((ctrl, index) => {
+                    if (ctrl instanceof FormGroup) {
+                        this.cleanForm(ctrl);
+                    } else if (ctrl instanceof FormControl) {
+                        if (typeof ctrl.value === 'string') {
+                            ctrl.setValue(ctrl.value.trim());
+                        }
                     }
+                });
+            } else if (control instanceof FormGroup && key !== 'config') {
+                this.cleanForm(control);
+            } else if (control instanceof FormControl && control.value !== undefined && control.value !== null) {
+                if (typeof control.value === 'string') {
+                    control.setValue(control.value.trim());
                 }
             } else if (key === 'config' && formName === 'vim') {
-                const newFormGroup: FormGroup = formGroup.get(key) as FormGroup;
-                this.cleanForm(newFormGroup);
+                this.cleanForm(control as FormGroup);
             }
         });
     }
