diff --git a/ogWebconsole/src/app/app.module.ts b/ogWebconsole/src/app/app.module.ts index 824c555..ef79fbe 100644 --- a/ogWebconsole/src/app/app.module.ts +++ b/ogWebconsole/src/app/app.module.ts @@ -163,6 +163,7 @@ import { ScrollToTopComponent } from './shared/scroll-to-top/scroll-to-top.compo import { CreateTagModalComponent } from './components/repositories/show-git-images/create-tag-modal/create-tag-modal.component'; import { CreateBranchModalComponent } from './components/repositories/show-git-images/create-branch-modal/create-branch-modal.component'; import { ClientLogsModalComponent } from './components/groups/shared/client-logs-modal/client-logs-modal.component'; +import { BackupRepositoryModalComponent } from './components/repositories/show-git-images/backup-repository-modal/backup-repository-modal.component'; export function HttpLoaderFactory(http: HttpClient) { return new TranslateHttpLoader(http, './locale/', '.json'); @@ -282,7 +283,8 @@ registerLocaleData(localeEs, 'es-ES'); CreateTagModalComponent, CreateBranchModalComponent, ClientLogsModalComponent, - SafePipe + SafePipe, + BackupRepositoryModalComponent ], bootstrap: [AppComponent], imports: [BrowserModule, diff --git a/ogWebconsole/src/app/components/repositories/show-git-images/backup-repository-modal/backup-repository-modal.component.css b/ogWebconsole/src/app/components/repositories/show-git-images/backup-repository-modal/backup-repository-modal.component.css new file mode 100644 index 0000000..22a00e7 --- /dev/null +++ b/ogWebconsole/src/app/components/repositories/show-git-images/backup-repository-modal/backup-repository-modal.component.css @@ -0,0 +1,68 @@ +.dialog-content { + min-width: 500px; + max-width: 600px; +} + +.repository-info { + background-color: #f5f5f5; + padding: 15px; + border-radius: 5px; + margin-bottom: 20px; + border-left: 4px solid #3f51b5; +} + +.repository-info p { + margin: 0; + color: #333; +} + +.backup-form { + display: flex; + flex-direction: column; + gap: 20px; +} + +.form-field { + width: 100%; +} + +.action-container { + display: flex; + justify-content: flex-end; + gap: 10px; + margin-top: 20px; + padding: 0 24px 24px 24px; +} + +.ordinary-button { + background-color: #6c757d; + color: white; + border: none; + padding: 10px 20px; + border-radius: 4px; + cursor: pointer; + font-size: 14px; +} + +.ordinary-button:hover { + background-color: #5a6268; +} + +.submit-button { + background-color: #28a745; + color: white; + border: none; + padding: 10px 20px; + border-radius: 4px; + cursor: pointer; + font-size: 14px; +} + +.submit-button:hover:not(:disabled) { + background-color: #218838; +} + +.submit-button:disabled { + background-color: #6c757d; + cursor: not-allowed; +} diff --git a/ogWebconsole/src/app/components/repositories/show-git-images/backup-repository-modal/backup-repository-modal.component.html b/ogWebconsole/src/app/components/repositories/show-git-images/backup-repository-modal/backup-repository-modal.component.html new file mode 100644 index 0000000..ed5687b --- /dev/null +++ b/ogWebconsole/src/app/components/repositories/show-git-images/backup-repository-modal/backup-repository-modal.component.html @@ -0,0 +1,66 @@ + + +

Crear Backup del Repositorio

+ + +
+

Repositorio: {{ data.repositoryName }}

+
+ +
+ + Servidor SSH + + + El servidor SSH es obligatorio + + + El servidor SSH debe ser una dirección válida (ej: server.com, 192.168.1.100) + + Dirección del servidor SSH donde se enviará el backup + + + + Puerto SSH + + + El puerto SSH es obligatorio + + + El puerto debe estar entre 1 y 65535 + + Puerto del servidor SSH (por defecto: 22) + + + + Usuario SSH + + + El usuario SSH es obligatorio + + + El usuario SSH solo puede contener letras, números, puntos, guiones y guiones bajos + + Usuario para conectarse al servidor SSH + + + + Nombre del archivo + + + El nombre del archivo es obligatorio + + + El archivo debe tener extensión .tar.gz, .zip o .tar + + Nombre del archivo de backup (debe terminar en .tar.gz, .zip o .tar) + +
+
+ +
+ + +
diff --git a/ogWebconsole/src/app/components/repositories/show-git-images/backup-repository-modal/backup-repository-modal.component.ts b/ogWebconsole/src/app/components/repositories/show-git-images/backup-repository-modal/backup-repository-modal.component.ts new file mode 100644 index 0000000..93f7faa --- /dev/null +++ b/ogWebconsole/src/app/components/repositories/show-git-images/backup-repository-modal/backup-repository-modal.component.ts @@ -0,0 +1,66 @@ +import { Component, Inject } from '@angular/core'; +import { FormBuilder, FormGroup, Validators } from '@angular/forms'; +import { HttpClient } from '@angular/common/http'; +import { MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dialog'; +import { ToastrService } from 'ngx-toastr'; +import { ConfigService } from '@services/config.service'; + +@Component({ + selector: 'app-backup-repository-modal', + templateUrl: './backup-repository-modal.component.html', + styleUrl: './backup-repository-modal.component.css' +}) +export class BackupRepositoryModalComponent { + backupForm: FormGroup; + loading: boolean = false; + baseUrl: string; + + constructor( + private fb: FormBuilder, + private http: HttpClient, + public dialogRef: MatDialogRef, + private toastService: ToastrService, + private configService: ConfigService, + @Inject(MAT_DIALOG_DATA) public data: { repositoryName: string, repositoryUuid: string } + ) { + this.baseUrl = this.configService.apiUrl; + this.backupForm = this.fb.group({ + ssh_server: ['', [Validators.required, Validators.pattern(/^[a-zA-Z0-9.-]+$/)]], + ssh_port: ['22', [Validators.required, Validators.min(1), Validators.max(65535)]], + ssh_user: ['', [Validators.required, Validators.pattern(/^[a-zA-Z0-9._-]+$/)]], + filename: ['', [Validators.required, Validators.pattern(/\.(tar\.gz|zip|tar)$/)]] + }); + } + + createBackup(): void { + if (this.backupForm.valid) { + this.loading = true; + const payload = { + repository: this.data.repositoryName, + sshServer: this.backupForm.value.ssh_server, + sshPort: parseInt(this.backupForm.value.ssh_port), + sshUser: this.backupForm.value.ssh_user, + filename: this.backupForm.value.filename + }; + + const url = `${this.baseUrl}/image-repositories/server/git/${this.data.repositoryUuid}/create-backup`; + + this.http.post(url, payload).subscribe({ + next: (response) => { + this.toastService.success('Backup iniciado correctamente'); + this.dialogRef.close(response); + }, + error: (error) => { + this.toastService.error(error.error?.message || 'Error al iniciar el backup'); + this.loading = false; + } + }); + } else { + this.toastService.error('Por favor, complete todos los campos requeridos correctamente'); + } + } + + close(): void { + this.dialogRef.close(); + } +} diff --git a/ogWebconsole/src/app/components/repositories/show-git-images/show-git-images.component.html b/ogWebconsole/src/app/components/repositories/show-git-images/show-git-images.component.html index 2f53ce2..0510216 100644 --- a/ogWebconsole/src/app/components/repositories/show-git-images/show-git-images.component.html +++ b/ogWebconsole/src/app/components/repositories/show-git-images/show-git-images.component.html @@ -10,6 +10,7 @@
+
diff --git a/ogWebconsole/src/app/components/repositories/show-git-images/show-git-images.component.ts b/ogWebconsole/src/app/components/repositories/show-git-images/show-git-images.component.ts index 407c318..77268a1 100644 --- a/ogWebconsole/src/app/components/repositories/show-git-images/show-git-images.component.ts +++ b/ogWebconsole/src/app/components/repositories/show-git-images/show-git-images.component.ts @@ -10,6 +10,7 @@ import {Router} from "@angular/router"; import {ServerInfoDialogComponent} from "../../ogdhcp/server-info-dialog/server-info-dialog.component"; import {CreateTagModalComponent} from "./create-tag-modal/create-tag-modal.component"; import {CreateBranchModalComponent} from "./create-branch-modal/create-branch-modal.component"; +import { BackupRepositoryModalComponent } from './backup-repository-modal/backup-repository-modal.component'; @Component({ selector: 'app-show-git-commits', @@ -267,12 +268,33 @@ export class ShowGitCommitsComponent implements OnInit{ dialogRef.afterClosed().subscribe(result => { if (result) { - // Recargar los datos para mostrar el nuevo tag + this.loadData(); } }); } + openBackupDialog() { + if (!this.selectedRepository) { + this.toastService.warning('Por favor, selecciona un repositorio primero'); + return; + } + + const dialogRef = this.dialog.open(BackupRepositoryModalComponent, { + width: '600px', + data: { + repositoryName: this.selectedRepository, + repositoryUuid: this.data.repositoryUuid + } + }); + + dialogRef.afterClosed().subscribe(result => { + if (result) { + this.toastService.success('Backup iniciado correctamente'); + } + }); + } + openCreateBranchDialog(commit: any) { const dialogRef = this.dialog.open(CreateBranchModalComponent, { width: '500px', @@ -285,7 +307,6 @@ export class ShowGitCommitsComponent implements OnInit{ dialogRef.afterClosed().subscribe(result => { if (result) { - // Recargar los datos para mostrar la nueva rama this.loadBranches(); this.loadData(); }