diff --git a/front-public/src/app/core/api.service.ts b/front-public/src/app/core/api.service.ts index 9ce0575..0c3e4c8 100644 --- a/front-public/src/app/core/api.service.ts +++ b/front-public/src/app/core/api.service.ts @@ -22,7 +22,18 @@ export class ApiService { return this.http.get(`${this.baseUrl}/${id}`); } - update(id: string, data: { title?: string; version?: string; description?: string }): Observable { + update(id: string, data: { + title?: string; + version?: string; + description?: string; + categoryId?: string | null; + functionalDoc?: string | null; + technicalDoc?: string | null; + externalDocUrl?: string | null; + contactFunctional?: string | null; + contactTechnical?: string | null; + accessRights?: string | null; + }): Observable { return this.http.patch(`${this.baseUrl}/${id}`, data); } diff --git a/front-public/src/app/pages/api-detail/api-detail.component.ts b/front-public/src/app/pages/api-detail/api-detail.component.ts index e63fad1..a78d279 100644 --- a/front-public/src/app/pages/api-detail/api-detail.component.ts +++ b/front-public/src/app/pages/api-detail/api-detail.component.ts @@ -9,7 +9,8 @@ import { import { CommonModule } from '@angular/common'; import { ActivatedRoute, Router, RouterLink } from '@angular/router'; import { ApiService } from '../../core/api.service'; -import { ApiEntry } from '@datacat/shared'; +import { CategoryService } from '../../core/category.service'; +import { ApiEntry, Category } from '@datacat/shared'; @Component({ selector: 'app-api-detail', @@ -196,6 +197,9 @@ import { ApiEntry } from '@datacat/shared'; > Voir la documentation + } + + + @if (showEditModal()) { +
+
+
+
+
+

Modifier l'API

+
+
+ +
+
+ @if (editError()) { +

{{ editError() }}

+ } +
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+
+
+ } `, }) export class ApiDetailComponent implements OnInit, OnDestroy { private route = inject(ActivatedRoute); private router = inject(Router); private apiService = inject(ApiService); + private categoryService = inject(CategoryService); api = signal(null); loading = signal(false); @@ -233,6 +311,22 @@ export class ApiDetailComponent implements OnInit, OnDestroy { regenerating = signal(false); deleting = signal(false); + /* Modale édition */ + showEditModal = signal(false); + editLoading = signal(false); + editError = signal(null); + categories = signal([]); + editTitle = signal(''); + editVersion = signal(''); + editCategoryId = signal(null); + editDescription = signal(''); + editFunctionalDoc = signal(''); + editTechnicalDoc = signal(''); + editExternalDocUrl = signal(''); + editContactFunctional = signal(''); + editContactTechnical = signal(''); + editAccessRights = signal(''); + private pollInterval: ReturnType | null = null; private id = ''; @@ -257,6 +351,58 @@ export class ApiDetailComponent implements OnInit, OnDestroy { }); } + openEdit() { + const entry = this.api(); + if (!entry) return; + this.editTitle.set(entry.title); + this.editVersion.set(entry.version); + this.editCategoryId.set(entry.categoryId ?? null); + this.editDescription.set(entry.description ?? ''); + this.editFunctionalDoc.set(entry.functionalDoc ?? ''); + this.editTechnicalDoc.set(entry.technicalDoc ?? ''); + this.editExternalDocUrl.set(entry.externalDocUrl ?? ''); + this.editContactFunctional.set(entry.contactFunctional ?? ''); + this.editContactTechnical.set(entry.contactTechnical ?? ''); + this.editAccessRights.set(entry.accessRights ?? ''); + this.editError.set(null); + this.categoryService.list().subscribe((res) => this.categories.set(res.items)); + this.showEditModal.set(true); + } + + closeEdit() { + this.showEditModal.set(false); + } + + submitEdit() { + if (!this.editTitle().trim() || !this.editVersion().trim()) { + this.editError.set('Le titre et la version sont obligatoires.'); + return; + } + this.editLoading.set(true); + this.apiService.update(this.id, { + title: this.editTitle().trim(), + version: this.editVersion().trim(), + categoryId: this.editCategoryId() || null, + description: this.editDescription().trim() || undefined, + functionalDoc: this.editFunctionalDoc().trim() || null, + technicalDoc: this.editTechnicalDoc().trim() || null, + externalDocUrl: this.editExternalDocUrl().trim() || null, + contactFunctional: this.editContactFunctional().trim() || null, + contactTechnical: this.editContactTechnical().trim() || null, + accessRights: this.editAccessRights().trim() || null, + }).subscribe({ + next: (entry) => { + this.api.set(entry); + this.editLoading.set(false); + this.showEditModal.set(false); + }, + error: (err: { error?: { message?: string } }) => { + this.editLoading.set(false); + this.editError.set(err?.error?.message ?? 'Une erreur est survenue.'); + }, + }); + } + onDelete() { if (!confirm('Supprimer cette API ?')) return; this.deleting.set(true); diff --git a/front-public/src/app/pages/browse/browse.component.ts b/front-public/src/app/pages/browse/browse.component.ts index 25fa76c..7fb4166 100644 --- a/front-public/src/app/pages/browse/browse.component.ts +++ b/front-public/src/app/pages/browse/browse.component.ts @@ -248,7 +248,7 @@ import { forkJoin } from 'rxjs'; }