diff --git a/ogWebconsole/src/app/app.module.ts b/ogWebconsole/src/app/app.module.ts index bbdb13b..633da32 100644 --- a/ogWebconsole/src/app/app.module.ts +++ b/ogWebconsole/src/app/app.module.ts @@ -205,7 +205,7 @@ export function HttpLoaderFactory(http: HttpClient) { EnvVarsComponent, MenusComponent, CreateMenuComponent, - CreateMultipleClientComponent, + CreateMultipleClientComponent ], bootstrap: [AppComponent], imports: [BrowserModule, diff --git a/ogWebconsole/src/app/components/commands/main-commands/execute-command/execute-command.component.spec.ts b/ogWebconsole/src/app/components/commands/main-commands/execute-command/execute-command.component.spec.ts index 62231e0..df1a797 100644 --- a/ogWebconsole/src/app/components/commands/main-commands/execute-command/execute-command.component.spec.ts +++ b/ogWebconsole/src/app/components/commands/main-commands/execute-command/execute-command.component.spec.ts @@ -10,11 +10,13 @@ import { MatDialogModule, MatDialogRef, MAT_DIALOG_DATA } from '@angular/materia import { MatFormFieldModule } from '@angular/material/form-field'; import { MatInputModule } from '@angular/material/input'; import { MatTableModule } from '@angular/material/table'; -import { MatSelectModule } from '@angular/material/select'; +import { MatSelectModule } from '@angular/material/select'; import { BrowserAnimationsModule } from '@angular/platform-browser/animations'; import { TranslateModule } from '@ngx-translate/core'; import { ToastrModule, ToastrService } from 'ngx-toastr'; import { DataService } from '../data.service'; +import {MatIconModule} from "@angular/material/icon"; +import {MatMenu, MatMenuModule} from "@angular/material/menu"; describe('ExecuteCommandComponent', () => { let component: ExecuteCommandComponent; @@ -31,9 +33,11 @@ describe('ExecuteCommandComponent', () => { MatInputModule, MatCheckboxModule, MatButtonModule, + MatMenuModule, BrowserAnimationsModule, MatTableModule, MatSelectModule, + MatIconModule, ToastrModule.forRoot(), TranslateModule.forRoot() ], diff --git a/ogWebconsole/src/app/components/groups/components/client-main-view/create-image/create-image.component.spec.ts b/ogWebconsole/src/app/components/groups/components/client-main-view/create-image/create-image.component.spec.ts index a8d5c56..1cb70ef 100644 --- a/ogWebconsole/src/app/components/groups/components/client-main-view/create-image/create-image.component.spec.ts +++ b/ogWebconsole/src/app/components/groups/components/client-main-view/create-image/create-image.component.spec.ts @@ -16,7 +16,6 @@ import { ActivatedRoute } from '@angular/router'; import { TranslateModule } from '@ngx-translate/core'; import { ToastrModule, ToastrService } from 'ngx-toastr'; import { of } from 'rxjs'; -import { DataService } from '../../client-tab-view/data.service'; describe('CreateImageComponent', () => { let component: CreateImageComponent; @@ -42,7 +41,6 @@ describe('CreateImageComponent', () => { providers: [ FormBuilder, ToastrService, - DataService, provideHttpClient(), provideHttpClientTesting(), { diff --git a/ogWebconsole/src/app/components/groups/components/client-main-view/deploy-image/deploy-image.component.spec.ts b/ogWebconsole/src/app/components/groups/components/client-main-view/deploy-image/deploy-image.component.spec.ts index 5703e5a..a6a2e2b 100644 --- a/ogWebconsole/src/app/components/groups/components/client-main-view/deploy-image/deploy-image.component.spec.ts +++ b/ogWebconsole/src/app/components/groups/components/client-main-view/deploy-image/deploy-image.component.spec.ts @@ -15,7 +15,6 @@ import { MatRadioModule } from '@angular/material/radio'; // Importar MatRadioMo import { BrowserAnimationsModule } from '@angular/platform-browser/animations'; import { TranslateModule } from '@ngx-translate/core'; import { ToastrModule, ToastrService } from 'ngx-toastr'; -import { DataService } from '../../client-tab-view/data.service'; import { provideRouter } from '@angular/router'; import { MatSelectModule } from '@angular/material/select'; @@ -28,7 +27,7 @@ describe('DeployImageComponent', () => { declarations: [DeployImageComponent], imports: [ ReactiveFormsModule, - FormsModule, + FormsModule, MatDialogModule, MatFormFieldModule, MatInputModule, @@ -36,7 +35,7 @@ describe('DeployImageComponent', () => { MatButtonModule, MatTableModule, MatDividerModule, - MatRadioModule, + MatRadioModule, MatSelectModule, BrowserAnimationsModule, ToastrModule.forRoot(), @@ -45,7 +44,6 @@ describe('DeployImageComponent', () => { providers: [ FormBuilder, ToastrService, - DataService, provideHttpClient(), provideHttpClientTesting(), provideRouter([]), diff --git a/ogWebconsole/src/app/components/groups/groups.component.spec.ts b/ogWebconsole/src/app/components/groups/groups.component.spec.ts index b5646bf..1dd83f5 100644 --- a/ogWebconsole/src/app/components/groups/groups.component.spec.ts +++ b/ogWebconsole/src/app/components/groups/groups.component.spec.ts @@ -22,9 +22,6 @@ import { MatTabsModule } from '@angular/material/tabs'; import { MatCardModule } from '@angular/material/card'; import { TranslateModule } from '@ngx-translate/core'; import { JoyrideModule } from 'ngx-joyride'; -import { AdvancedSearchComponent } from './components/advanced-search/advanced-search.component'; -import { ClientTabViewComponent } from './components/client-tab-view/client-tab-view.component'; -import { OrganizationalUnitTabViewComponent } from './components/organizational-unit-tab-view/organizational-unit-tab-view.component'; import { MatMenuModule } from '@angular/material/menu'; describe('GroupsComponent', () => { @@ -33,7 +30,7 @@ describe('GroupsComponent', () => { beforeEach(async () => { await TestBed.configureTestingModule({ - declarations: [GroupsComponent, AdvancedSearchComponent, ClientTabViewComponent, OrganizationalUnitTabViewComponent], + declarations: [GroupsComponent], imports: [ HttpClientTestingModule, ToastrModule.forRoot(), @@ -99,13 +96,6 @@ describe('GroupsComponent', () => { expect(component.getFilters).toHaveBeenCalled(); }); - it('should call onTabChange method', () => { - spyOn(component, 'onTabChange'); - const event = { index: 2 } as any; - component.onTabChange(event); - expect(component.onTabChange).toHaveBeenCalledWith(event); - }); - it('should call onSelectUnidad method', () => { spyOn(component, 'onSelectUnidad'); const unidad = { id: '1', name: 'Test' } as any; diff --git a/ogWebconsole/src/app/components/groups/shared/clients/create-client/create-client.component.ts b/ogWebconsole/src/app/components/groups/shared/clients/create-client/create-client.component.ts index d7f7e45..dbc6f6b 100644 --- a/ogWebconsole/src/app/components/groups/shared/clients/create-client/create-client.component.ts +++ b/ogWebconsole/src/app/components/groups/shared/clients/create-client/create-client.component.ts @@ -5,7 +5,6 @@ import { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog'; import { MatSnackBar } from '@angular/material/snack-bar'; import { ToastrService } from 'ngx-toastr'; import { DataService } from '../../../services/data.service'; -import * as Papa from 'papaparse'; @Component({ selector: 'app-create-client', @@ -158,62 +157,6 @@ export class CreateClientComponent implements OnInit { ); } - onFileUpload(event: any): void { - const file = event.target.files[0]; - if (file) { - const reader = new FileReader(); - - reader.onload = (e: any) => { - const textData = e.target.result; - const regex = /host\s+(\S+)\s+\{\s+hardware\s+ethernet\s+([\da-fA-F:]+);\s+fixed-address\s+([\d.]+);\s+\}/g; - let match; - const clients = []; - - while ((match = regex.exec(textData)) !== null) { - clients.push({ - name: match[1], - mac: match[2], - ip: match[3] - }); - } - - if (clients.length > 0) { - this.uploadedClients = clients; - this.toastService.success('Archivo cargado correctamente, los datos están listos para enviarse.', 'Éxito'); - this.showTextarea = false; - } else { - this.toastService.error('No se encontraron datos válidos', 'Error'); - this.showTextarea = true; - } - }; - - reader.readAsText(file); - } - } - - onTextarea(text: string): void { - const regex = /host\s+(\S+)\s+\{\s+hardware\s+ethernet\s+([\da-fA-F:]+);\s+fixed-address\s+([\d.]+);\s+\}/g; - let match; - const clients = []; - - while ((match = regex.exec(text)) !== null) { - clients.push({ - name: match[1], - mac: match[2], - ip: match[3] - }); - } - - if (clients.length > 0) { - this.uploadedClients = clients; - this.toastService.success('Datos cargados correctamente, los datos están listos para enviarse.', 'Éxito'); - this.showTextarea = false; - } else { - this.toastService.error('No se encontraron datos válidos', 'Error'); - this.showTextarea = true; - } - } - onSubmit(): void { if (this.isSingleClientForm) { if (this.clientForm.valid) { @@ -266,10 +209,6 @@ export class CreateClientComponent implements OnInit { } } - toggleClientForm(): void { - this.isSingleClientForm = !this.isSingleClientForm; - } - onNoClick(): void { this.dialogRef.close(); } diff --git a/ogWebconsole/src/app/components/groups/shared/clients/create-multiple-client/create-multiple-client.component.html b/ogWebconsole/src/app/components/groups/shared/clients/create-multiple-client/create-multiple-client.component.html index 91955c9..fd678aa 100644 --- a/ogWebconsole/src/app/components/groups/shared/clients/create-multiple-client/create-multiple-client.component.html +++ b/ogWebconsole/src/app/components/groups/shared/clients/create-multiple-client/create-multiple-client.component.html @@ -3,10 +3,10 @@
-
+ {{ 'organizationalUnitLabel' | translate }} - +
{{ unit.name }}
@@ -53,6 +53,6 @@
- +
diff --git a/ogWebconsole/src/app/components/groups/shared/clients/create-multiple-client/create-multiple-client.component.spec.ts b/ogWebconsole/src/app/components/groups/shared/clients/create-multiple-client/create-multiple-client.component.spec.ts deleted file mode 100644 index bae410d..0000000 --- a/ogWebconsole/src/app/components/groups/shared/clients/create-multiple-client/create-multiple-client.component.spec.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { ComponentFixture, TestBed } from '@angular/core/testing'; - -import { CreateMultipleClientComponent } from './create-multiple-client.component'; - -describe('CreateMultipleClientComponent', () => { - let component: CreateMultipleClientComponent; - let fixture: ComponentFixture; - - beforeEach(async () => { - await TestBed.configureTestingModule({ - declarations: [CreateMultipleClientComponent] - }) - .compileComponents(); - - fixture = TestBed.createComponent(CreateMultipleClientComponent); - component = fixture.componentInstance; - fixture.detectChanges(); - }); - - it('should create', () => { - expect(component).toBeTruthy(); - }); -}); diff --git a/ogWebconsole/src/app/components/groups/shared/clients/create-multiple-client/create-multiple-client.component.ts b/ogWebconsole/src/app/components/groups/shared/clients/create-multiple-client/create-multiple-client.component.ts index 517bbc2..e07eaeb 100644 --- a/ogWebconsole/src/app/components/groups/shared/clients/create-multiple-client/create-multiple-client.component.ts +++ b/ogWebconsole/src/app/components/groups/shared/clients/create-multiple-client/create-multiple-client.component.ts @@ -1,75 +1,34 @@ -import {Component, Inject} from '@angular/core'; -import {FormBuilder, FormGroup, Validators} from "@angular/forms"; -import {MAT_DIALOG_DATA, MatDialogRef} from "@angular/material/dialog"; +import {Component, Inject, OnInit, Optional} from '@angular/core'; +import {MatDialogRef} from "@angular/material/dialog"; import {HttpClient} from "@angular/common/http"; import {MatSnackBar} from "@angular/material/snack-bar"; import {ToastrService} from "ngx-toastr"; -import {DataService} from "../../../services/data.service"; @Component({ selector: 'app-create-multiple-client', templateUrl: './create-multiple-client.component.html', styleUrl: './create-multiple-client.component.css' }) -export class CreateMultipleClientComponent { +export class CreateMultipleClientComponent implements OnInit{ baseUrl: string = import.meta.env.NG_APP_BASE_API_URL; - clientForm!: FormGroup; parentUnits: any[] = []; - hardwareProfiles: any[] = []; - ogLives: any[] = []; - menus: any[] = []; - templates: any[] = []; uploadedClients: any[] = []; - repositories: any[] = []; loading: boolean = false; displayedColumns: string[] = ['name', 'ip', 'mac']; showTextarea: boolean = true; - protected netifaceTypes = [ - { name: 'Eth0', value: 'eth0' }, - { name: 'Eth1', value: 'eth1' }, - { name: 'Eth2', value: 'eth2' } - ]; - protected netDriverTypes = [ - { name: 'Generic', value: 'generic' } - ]; + organizationalUnit: any; constructor( - private fb: FormBuilder, - private dialogRef: MatDialogRef, + @Optional() private dialogRef: MatDialogRef, private http: HttpClient, private snackBar: MatSnackBar, - private toastService: ToastrService, - private dataService: DataService, - @Inject(MAT_DIALOG_DATA) public data: any + private toastService: ToastrService ) {} ngOnInit(): void { - this.initForm(); this.loadParentUnits(); } - initForm(): void { - this.clientForm = this.fb.group({ - organizationalUnit: [ - this.data.organizationalUnit ? this.data.organizationalUnit['@id'] : null, - Validators.required - ], - name: ['', Validators.required], - serialNumber: [''], - netiface: null, - netDriver: null, - mac: ['', Validators.required], - ip: ['', Validators.required], - template: [null], - hardwareProfile: [ - this.data.organizationalUnit?.networkSettings?.hardwareProfile?.['@id'] || null - ], - ogLive: [null], - repository: [null], - menu: [null] - }); - } - loadParentUnits(): void { this.loading = true; const url = `${this.baseUrl}/organizational-units?page=1&itemsPerPage=10000`; @@ -86,6 +45,11 @@ export class CreateMultipleClientComponent { ); } + setOrganizationalUnit(organizationalUnit: any): void { + console.log('Organizational unit selected:', organizationalUnit.value); + this.organizationalUnit = organizationalUnit.value; + } + onFileUpload(event: any): void { const file = event.target.files[0]; if (file) { @@ -146,17 +110,10 @@ export class CreateMultipleClientComponent { if (this.uploadedClients.length > 0) { this.uploadedClients.forEach(client => { const formData = { - organizationalUnit: this.clientForm.value.organizationalUnit || null, + organizationalUnit: this.organizationalUnit, name: client.name || null, mac: client.mac || null, ip: client.ip || null, - template: this.clientForm.value.template || null, - hardwareProfile: this.clientForm.value.hardwareProfile || null, - ogLive: this.clientForm.value.ogLive || null, - repository: this.clientForm.value.repository || null, - serialNumber: null, - netiface: null, - netDriver: null }; this.http.post(`${this.baseUrl}/clients`, formData).subscribe( @@ -164,8 +121,7 @@ export class CreateMultipleClientComponent { this.toastService.success(`Cliente ${client.name} creado exitosamente`, 'Éxito'); }, error => { - console.error(`Error al crear el cliente ${client.name}:`, error); - this.toastService.error(`Error al crear el cliente ${client.name}`, 'Error'); + this.toastService.error(error.error['hydra:description'], `Error al crear el cliente ${client.name}`); } ); }); diff --git a/ogWebconsole/src/app/components/menus/create-menu/create-menu.component.html b/ogWebconsole/src/app/components/menus/create-menu/create-menu.component.html index b423d7b..c15e7a8 100644 --- a/ogWebconsole/src/app/components/menus/create-menu/create-menu.component.html +++ b/ogWebconsole/src/app/components/menus/create-menu/create-menu.component.html @@ -27,7 +27,7 @@ {{ 'defaultMenuLabel' | translate }} diff --git a/ogWebconsole/src/app/components/menus/create-menu/create-menu.component.spec.ts b/ogWebconsole/src/app/components/menus/create-menu/create-menu.component.spec.ts deleted file mode 100644 index ec55d04..0000000 --- a/ogWebconsole/src/app/components/menus/create-menu/create-menu.component.spec.ts +++ /dev/null @@ -1,78 +0,0 @@ -import { ComponentFixture, TestBed } from '@angular/core/testing'; -import { CreateMenuComponent } from './create-menu.component'; -import { HttpClientTestingModule } from '@angular/common/http/testing'; -import { FormsModule, ReactiveFormsModule } from '@angular/forms'; -import { MatAutocompleteModule } from '@angular/material/autocomplete'; -import { MatButtonModule } from '@angular/material/button'; -import { MatCardModule } from '@angular/material/card'; -import { MatDialogModule, MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dialog'; -import { MatDividerModule } from '@angular/material/divider'; -import { MatFormFieldModule } from '@angular/material/form-field'; -import { MatIconModule } from '@angular/material/icon'; -import { MatInputModule } from '@angular/material/input'; -import { MatListModule } from '@angular/material/list'; -import { MatMenuModule } from '@angular/material/menu'; -import { MatPaginatorModule } from '@angular/material/paginator'; -import { MatProgressSpinnerModule } from '@angular/material/progress-spinner'; -import { MatSelectModule } from '@angular/material/select'; -import { MatTableModule } from '@angular/material/table'; -import { MatTabsModule } from '@angular/material/tabs'; -import { MatTooltipModule } from '@angular/material/tooltip'; -import { BrowserAnimationsModule } from '@angular/platform-browser/animations'; -import { TranslateModule } from '@ngx-translate/core'; -import { JoyrideModule } from 'ngx-joyride'; -import { ToastrModule } from 'ngx-toastr'; - -describe('CreateMenuComponent', () => { - let component: CreateMenuComponent; - let fixture: ComponentFixture; - - beforeEach(async () => { - await TestBed.configureTestingModule({ - declarations: [CreateMenuComponent], - imports: [ - HttpClientTestingModule, - ToastrModule.forRoot(), - BrowserAnimationsModule, - MatDividerModule, - MatFormFieldModule, - MatInputModule, - MatIconModule, - MatButtonModule, - MatTableModule, - MatPaginatorModule, - MatTooltipModule, - FormsModule, - ReactiveFormsModule, - MatProgressSpinnerModule, - MatDialogModule, - MatSelectModule, - MatTabsModule, - MatAutocompleteModule, - MatListModule, - MatCardModule, - MatMenuModule, - TranslateModule.forRoot(), - JoyrideModule.forRoot(), - ], - providers: [ - { - provide: MatDialogRef, - useValue: {}, - }, - { - provide: MAT_DIALOG_DATA, - useValue: {}, - }, - ], - }).compileComponents(); - - fixture = TestBed.createComponent(CreateMenuComponent); - component = fixture.componentInstance; - fixture.detectChanges(); - }); - - it('should create', () => { - expect(component).toBeTruthy(); - }); -}); diff --git a/ogWebconsole/src/app/components/menus/create-menu/create-menu.component.ts b/ogWebconsole/src/app/components/menus/create-menu/create-menu.component.ts index bb33a3c..0a591a1 100644 --- a/ogWebconsole/src/app/components/menus/create-menu/create-menu.component.ts +++ b/ogWebconsole/src/app/components/menus/create-menu/create-menu.component.ts @@ -1,9 +1,9 @@ -import {Component, Inject} from '@angular/core'; +import {Component, Inject, OnInit} from '@angular/core'; import {FormBuilder, FormGroup, Validators} from "@angular/forms"; import {HttpClient} from "@angular/common/http"; import {MAT_DIALOG_DATA, MatDialogRef} from "@angular/material/dialog"; import {ToastrService} from "ngx-toastr"; -import {DataService} from "../../images/data.service"; +import {DataService} from "../data.service"; import { DomSanitizer, SafeResourceUrl } from '@angular/platform-browser'; @Component({ @@ -11,7 +11,7 @@ import { DomSanitizer, SafeResourceUrl } from '@angular/platform-browser'; templateUrl: './create-menu.component.html', styleUrl: './create-menu.component.css' }) -export class CreateMenuComponent { +export class CreateMenuComponent implements OnInit{ baseUrl: string = import.meta.env.NG_APP_BASE_API_URL; menuForm: FormGroup; menuId: string | null = null; @@ -52,7 +52,7 @@ export class CreateMenuComponent { } load(): void { - this.dataService.getImage(this.data).subscribe({ + this.dataService.getMenu(this.data).subscribe({ next: (response) => { this.menuForm = this.fb.group({ name: [response.name, Validators.required], diff --git a/ogWebconsole/src/app/components/menus/data.service.ts b/ogWebconsole/src/app/components/menus/data.service.ts new file mode 100644 index 0000000..8973388 --- /dev/null +++ b/ogWebconsole/src/app/components/menus/data.service.ts @@ -0,0 +1,54 @@ + +import { Injectable } from '@angular/core'; +import {HttpClient, HttpParams} from '@angular/common/http'; +import { Observable, throwError } from 'rxjs'; +import { catchError, map } from 'rxjs/operators'; + +@Injectable({ + providedIn: 'root' +}) +export class DataService { + baseUrl: string = import.meta.env.NG_APP_BASE_API_URL; + private apiUrl = `${this.baseUrl}/menus?page=1&itemsPerPage=1000`; + + constructor(private http: HttpClient) {} + + getMenus(filters: { [key: string]: string }): Observable<{ totalItems: any; data: any }> { + const params = new HttpParams({ fromObject: filters }); + + return this.http.get(this.apiUrl, { params }).pipe( + map(response => { + if (response['hydra:member'] && Array.isArray(response['hydra:member'])) { + return { + data: response['hydra:member'], + totalItems: response['hydra:totalItems'] + } + } else { + throw new Error('Unexpected response format'); + } + }), + catchError(error => { + console.error('Error fetching commands', error); + return throwError(error); + }) + ); + } + + getMenu(id: string): Observable { + return this.http.get(`${this.baseUrl}${id}`).pipe( + map(response => { + if (response.name) { + return response; + } else { + throw new Error('Unexpected response format'); + } + }), + catchError(error => { + console.error('Error fetching menus', error); + return throwError(error); + }) + ); + } + + +} diff --git a/ogWebconsole/src/app/components/menus/menus.component.ts b/ogWebconsole/src/app/components/menus/menus.component.ts index 364a4c8..29b1fba 100644 --- a/ogWebconsole/src/app/components/menus/menus.component.ts +++ b/ogWebconsole/src/app/components/menus/menus.component.ts @@ -1,4 +1,4 @@ -import { Component } from '@angular/core'; +import {Component, OnInit} from '@angular/core'; import {MatTableDataSource} from "@angular/material/table"; import {DatePipe} from "@angular/common"; import {MatDialog} from "@angular/material/dialog"; @@ -14,7 +14,7 @@ import {CreateMenuComponent} from "./create-menu/create-menu.component"; templateUrl: './menus.component.html', styleUrl: './menus.component.css' }) -export class MenusComponent { +export class MenusComponent implements OnInit { baseUrl: string = import.meta.env.NG_APP_BASE_API_URL; dataSource = new MatTableDataSource(); length: number = 0; @@ -27,32 +27,32 @@ export class MenusComponent { { columnDef: 'id', header: 'Id', - cell: (repository: any) => `${repository.id}` + cell: (menu: any) => `${menu.id}` }, { columnDef: 'name', header: 'Nombre de menú', - cell: (repository: any) => `${repository.name}` + cell: (menu: any) => `${menu.name}` }, { columnDef: 'publicUrl', header: 'Url pública', - cell: (repository: any) => `${this.baseUrl}/menu/${repository.publicUrl}` + cell: (menu: any) => `${this.baseUrl}/menu/${menu.publicUrl}` }, { columnDef: 'isDefault', header: 'Por defecto', - cell: (repository: any) => `${repository.isDefault}` + cell: (menu: any) => `${menu.isDefault}` }, { columnDef: 'resolution', header: 'Resolución', - cell: (repository: any) => `${repository.resolution}` + cell: (menu: any) => `${menu.resolution}` }, { columnDef: 'createdAt', header: 'Fecha de creación', - cell: (repository: any) => `${this.datePipe.transform(repository.createdAt, 'dd/MM/yyyy hh:mm:ss')}` + cell: (menu: any) => `${this.datePipe.transform(menu.createdAt, 'dd/MM/yyyy hh:mm:ss')}` } ]; displayedColumns = [...this.columns.map(column => column.columnDef), 'actions'];