diff --git a/ogWebconsole/src/app/app-routing.module.ts b/ogWebconsole/src/app/app-routing.module.ts index 084a8e1..35e5640 100644 --- a/ogWebconsole/src/app/app-routing.module.ts +++ b/ogWebconsole/src/app/app-routing.module.ts @@ -9,6 +9,7 @@ import { AdminComponent } from './components/pages/admin/admin.component'; import { UsersComponent } from './components/pages/admin/users/users/users.component'; import { RolesComponent } from './components/pages/admin/roles/roles/roles.component'; import { GroupsComponent } from './components/groups/groups.component'; +import { ImagesComponent } from './components/images/images/images.component'; const routes: Routes = [ { path: '', redirectTo: 'auth/login', pathMatch: 'full' }, { @@ -20,6 +21,7 @@ const routes: Routes = [ { path: 'users', component: UsersComponent }, { path: 'user-groups', component: RolesComponent }, { path: 'groups', component: GroupsComponent }, + { path: 'images', component: ImagesComponent }, ], }, { diff --git a/ogWebconsole/src/app/app.module.ts b/ogWebconsole/src/app/app.module.ts index 9ac672f..355f949 100644 --- a/ogWebconsole/src/app/app.module.ts +++ b/ogWebconsole/src/app/app.module.ts @@ -71,6 +71,8 @@ import { ClassroomViewDialogComponent } from './components/groups/classroom-view import {MatPaginator} from "@angular/material/paginator"; import { SaveFiltersDialogComponent } from './components/groups/save-filters-dialog/save-filters-dialog.component'; import { AcctionsModalComponent } from './components/groups/acctions-modal/acctions-modal.component'; +import { ImagesComponent } from './components/images/images/images.component'; +import { CreateImageComponent } from './components/images/images/create-image/create-image/create-image.component'; @NgModule({ declarations: [ @@ -104,7 +106,9 @@ import { AcctionsModalComponent } from './components/groups/acctions-modal/accti LegendComponent, ClassroomViewDialogComponent, SaveFiltersDialogComponent, - AcctionsModalComponent + AcctionsModalComponent, + ImagesComponent, + CreateImageComponent ], bootstrap: [AppComponent], imports: [BrowserModule, diff --git a/ogWebconsole/src/app/components/images/images/create-image/create-image/create-image.component.css b/ogWebconsole/src/app/components/images/images/create-image/create-image/create-image.component.css new file mode 100644 index 0000000..4525d20 --- /dev/null +++ b/ogWebconsole/src/app/components/images/images/create-image/create-image/create-image.component.css @@ -0,0 +1,4 @@ +.full-width { + width: 100%; + } + \ No newline at end of file diff --git a/ogWebconsole/src/app/components/images/images/create-image/create-image/create-image.component.html b/ogWebconsole/src/app/components/images/images/create-image/create-image/create-image.component.html new file mode 100644 index 0000000..5f6cfc4 --- /dev/null +++ b/ogWebconsole/src/app/components/images/images/create-image/create-image/create-image.component.html @@ -0,0 +1,15 @@ +

Añadir imagen ogLive

+ + + Nombre + + + + URL + + + + + + + diff --git a/ogWebconsole/src/app/components/images/images/create-image/create-image/create-image.component.spec.ts b/ogWebconsole/src/app/components/images/images/create-image/create-image/create-image.component.spec.ts new file mode 100644 index 0000000..3949532 --- /dev/null +++ b/ogWebconsole/src/app/components/images/images/create-image/create-image/create-image.component.spec.ts @@ -0,0 +1,23 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { CreateImageComponent } from './create-image.component'; + +describe('CreateImageComponent', () => { + let component: CreateImageComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + declarations: [CreateImageComponent] + }) + .compileComponents(); + + fixture = TestBed.createComponent(CreateImageComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/ogWebconsole/src/app/components/images/images/create-image/create-image/create-image.component.ts b/ogWebconsole/src/app/components/images/images/create-image/create-image/create-image.component.ts new file mode 100644 index 0000000..227a730 --- /dev/null +++ b/ogWebconsole/src/app/components/images/images/create-image/create-image/create-image.component.ts @@ -0,0 +1,45 @@ +import { HttpClient } from '@angular/common/http'; +import { Component, Inject } from '@angular/core'; +import { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog'; +import { ToastrService } from 'ngx-toastr'; + +@Component({ + selector: 'app-create-image', + templateUrl: './create-image.component.html', + styleUrl: './create-image.component.css' +}) +export class CreateImageComponent { + name: string = ''; + downloadUrl: string = ''; + + constructor( + private toastService: ToastrService, + private http: HttpClient, + public dialogRef: MatDialogRef, + @Inject(MAT_DIALOG_DATA) public data: any + ) { } + + onNoClick(): void { + this.dialogRef.close(); + } + + addOgLive(): void { + const payload = { + name: this.name, + downloadUrl: this.downloadUrl + }; + + this.http.post('http://127.0.0.1:8080/og-lives', payload) + .subscribe({ + next: (response) => { + console.log('Success:', response); + this.toastService.success('Image created successfully'); + this.dialogRef.close(); + }, + error: (error) => { + console.error('Error:', error); + this.toastService.error(' Error creating image'); + } + }); + } +} diff --git a/ogWebconsole/src/app/components/images/images/images.component.css b/ogWebconsole/src/app/components/images/images/images.component.css new file mode 100644 index 0000000..ae89817 --- /dev/null +++ b/ogWebconsole/src/app/components/images/images/images.component.css @@ -0,0 +1,60 @@ +.header-container { + display: flex; + justify-content: space-between; + align-items: center; + height: 100px; + padding: 10px; +} + +.title { + font-size: 24px; +} + +.images-button-row { + display: flex; + justify-content: flex-start; + margin-top: 16px; +} + +button { + margin-left: 10px; + margin-bottom: 20px; +} + +.divider { + margin: 20px 0; +} + +.lists-container { + padding: 16px; +} + +.imagesLists-container { + flex: 1; +} + +.card.unidad-card { + height: 100%; + box-sizing: border-box; +} + +.image-container { + display: flex; + align-items: center; + margin-bottom: 16px; + border-bottom: 1px solid rgba(122, 122, 122, 0.555); +} + +.image-container h4 { + margin: 0; + flex: 1; +} + +.mat-icon-button { + margin-left: 16px; + align-self: center; +} + +.mat-menu { + min-width: 160px; +} diff --git a/ogWebconsole/src/app/components/images/images/images.component.html b/ogWebconsole/src/app/components/images/images/images.component.html new file mode 100644 index 0000000..8018cd8 --- /dev/null +++ b/ogWebconsole/src/app/components/images/images/images.component.html @@ -0,0 +1,32 @@ +
+

Administrar imágenes

+
+ +
+
+ + +
+
+ + Imágenes + +
No hay imágenes disponibles.
+
+
+

{{ image.name }}

+ + + + + + + +
+
+
+
+
+
diff --git a/ogWebconsole/src/app/components/images/images/images.component.spec.ts b/ogWebconsole/src/app/components/images/images/images.component.spec.ts new file mode 100644 index 0000000..53bd222 --- /dev/null +++ b/ogWebconsole/src/app/components/images/images/images.component.spec.ts @@ -0,0 +1,23 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { ImagesComponent } from './images.component'; + +describe('ImagesComponent', () => { + let component: ImagesComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + declarations: [ImagesComponent] + }) + .compileComponents(); + + fixture = TestBed.createComponent(ImagesComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/ogWebconsole/src/app/components/images/images/images.component.ts b/ogWebconsole/src/app/components/images/images/images.component.ts new file mode 100644 index 0000000..196b020 --- /dev/null +++ b/ogWebconsole/src/app/components/images/images/images.component.ts @@ -0,0 +1,74 @@ +import { Component, OnInit } from '@angular/core'; +import { MatDialog } from '@angular/material/dialog'; +import { HttpClient } from '@angular/common/http'; +import { CreateImageComponent } from './create-image/create-image/create-image.component'; + +@Component({ + selector: 'app-images', + templateUrl: './images.component.html', + styleUrls: ['./images.component.css'] +}) +export class ImagesComponent implements OnInit { + images: { downloadUrl: string; name: string; uuid: string }[] = []; + + private apiUrl = 'http://127.0.0.1:8080/og-lives'; + + constructor(public dialog: MatDialog, private http: HttpClient) {} + + ngOnInit(): void { + this.loadImages(); + } + + loadImages(): void { + this.http.get(`${this.apiUrl}?page=1&itemsPerPage=30`).subscribe({ + next: (response) => { + this.images = response['hydra:member'].map((item: any) => ({ + downloadUrl: item.downloadUrl, + name: item.name, + uuid: item.uuid + })); + }, + error: (error) => { + console.error('Error al cargar las imágenes:', error); + } + }); + } + + addImage(): void { + const dialogRef = this.dialog.open(CreateImageComponent, { + width: '400px' + }); + + dialogRef.afterClosed().subscribe(result => { + console.log('The dialog was closed'); + this.loadImages(); // Opcional: recargar imágenes después de añadir una nueva + }); + } + + showInfo(image: any): void { + // Implementar lógica para mostrar información + console.log('Mostrar info:', image); + } + + toggleStatus(image: any): void { + // Implementar lógica para montar/desmontar + console.log('Montar/Desmontar:', image); + } + + deleteImage(uuid: string): void { + this.http.delete(`${this.apiUrl}/${uuid}`).subscribe({ + next: () => { + console.log('Imagen eliminada'); + this.loadImages(); // Recargar imágenes después de eliminar + }, + error: (error) => { + console.error('Error al eliminar la imagen:', error); + } + }); + } + + editImage(image: any): void { + // Implementar lógica para editar imagen + console.log('Editar:', image); + } +} diff --git a/ogWebconsole/src/app/components/layout/sidebar/sidebar.component.css b/ogWebconsole/src/app/components/layout/sidebar/sidebar.component.css index d1640bb..23b5659 100644 --- a/ogWebconsole/src/app/components/layout/sidebar/sidebar.component.css +++ b/ogWebconsole/src/app/components/layout/sidebar/sidebar.component.css @@ -41,4 +41,17 @@ mat-icon { mat-nav-list { width: 0px; } -} \ No newline at end of file +} + +.mat-nav-list .mat-list-item .entry { + display: flex; + align-items: center; +} + +.mat-nav-list .mat-list-item .entry mat-icon { + margin-right: 8px; +} + +.mat-nav-list .mat-list-item .sub-menu-item { + padding-left: 32px; +} diff --git a/ogWebconsole/src/app/components/layout/sidebar/sidebar.component.html b/ogWebconsole/src/app/components/layout/sidebar/sidebar.component.html index ef5da5d..ed96218 100644 --- a/ogWebconsole/src/app/components/layout/sidebar/sidebar.component.html +++ b/ogWebconsole/src/app/components/layout/sidebar/sidebar.component.html @@ -13,44 +13,68 @@ Grupos + chevron_right Acciones - - + + + + desktop_windows - Imágenes + ogBoot + + + + + + chevron_right + ogLive + + + + + chevron_right + PXE + + + + - + settings_input_component Componentes + - + warehouse Repositorios + - + list Menús + - + search Buscar + - + calendar_month Calendarios diff --git a/ogWebconsole/src/app/components/layout/sidebar/sidebar.component.ts b/ogWebconsole/src/app/components/layout/sidebar/sidebar.component.ts index 4beab49..46b38dd 100644 --- a/ogWebconsole/src/app/components/layout/sidebar/sidebar.component.ts +++ b/ogWebconsole/src/app/components/layout/sidebar/sidebar.component.ts @@ -14,6 +14,11 @@ export class SidebarComponent { isSuperAdmin: boolean = false; username: string = ""; decodedToken: any = ""; + showSubList: boolean = false; + + toggleSubList() { + this.showSubList = !this.showSubList; + } constructor(public dialog: MatDialog) {} ngOnInit(): void {