Merge pull request 'J1/feat/admin_page_style' (#68) from J1/feat/admin_page_style into dev

Reviewed-on: http://10.4.0.131/DI1-P4-E1/Webzine/pulls/68
Reviewed-by: Loic Masi <loic.masi@diiage.org>
This commit is contained in:
c.bobin
2026-03-06 14:28:45 +01:00
6 changed files with 234 additions and 19 deletions

View File

@@ -64,6 +64,36 @@ namespace Webzine.WebApplication.Areas.Administration.Controllers
return View(viewModel); return View(viewModel);
} }
// GET: Administration/Styles/Create
public ActionResult Create()
{
return View();
}
// POST: Administration/Styles/Create
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Create(StyleCreateViewModel model)
{
if (!ModelState.IsValid)
{
return View(model);
}
try
{
_logger.LogInformation("Nouveau style créé : {Libelle}", model.Libelle);
return RedirectToAction(nameof(Index));
}
catch (Exception e)
{
_logger.LogError(e, "Erreur lors de la création du style");
ModelState.AddModelError("", "Une erreur est survenue lors de la création.");
return View(model);
}
}
// GET: Administration/Styles/Delete/5 // GET: Administration/Styles/Delete/5
public ActionResult Delete(int id) public ActionResult Delete(int id)
@@ -101,5 +131,50 @@ namespace Webzine.WebApplication.Areas.Administration.Controllers
return View(model); return View(model);
} }
} }
// GET: Administration/Styles/Edit/5
[HttpGet]
public ActionResult Edit(int id)
{
// Recherche du style (simulation avec la liste _styles)
var style = _styles.FirstOrDefault(s => s.IdStyle == id);
if (style == null)
{
return NotFound();
}
// Mapping vers le ViewModel
var model = new StyleEditViewModel
{
IdStyle = style.IdStyle,
Libelle = style.Libelle
};
return View(model);
}
// POST: Administration/Styles/Edit/5
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Edit(int id, StyleEditViewModel model)
{
if (!ModelState.IsValid)
{
return View(model);
}
try
{
_logger.LogInformation("Style {Id} mis à jour : {Libelle}", id, model.Libelle);
return RedirectToAction(nameof(Index));
}
catch (Exception e)
{
_logger.LogError(e, "Erreur lors de la modification du style {Id}", id);
ModelState.AddModelError("", "Une erreur est survenue lors de la modification.");
return View(model);
}
}
} }
} }

View File

@@ -0,0 +1,20 @@
// <copyright file="StyleDeleteViewModel.cs" company="Webzine">
// Copyright (c) Webzine. Tout droit réservé.
// </copyright>
namespace Webzine.WebApplication.Areas.Administration.ViewModels.Style
{
/// <summary>
/// ViewModel pour la création d'un style en administration.
/// </summary>
public class StyleCreateViewModel
{
/// <summary>
/// Obtient ou définit le libellé du style.
/// </summary>
public string Libelle { get; set; }
}
}

View File

@@ -0,0 +1,27 @@
// <copyright file="StyleDeleteViewModel.cs" company="Webzine">
// Copyright (c) Webzine. Tout droit réservé.
// </copyright>
namespace Webzine.WebApplication.Areas.Administration.ViewModels.Style
{
/// <summary>
/// ViewModel pour la modification d'un style en administration.
/// </summary>
public class StyleEditViewModel
{
/// <summary>
/// Obtient ou définit le libellé du style.
/// </summary>
public int IdStyle { get; set; }
/// <summary>
/// Obtient ou définit le libellé du style.
/// </summary>
public string Libelle { get; set; }
}
}

View File

@@ -0,0 +1,46 @@
@model Webzine.WebApplication.Areas.Administration.ViewModels.Style.StyleCreateViewModel
@{
ViewData["Title"] = "Créer un style";
}
<div class="container mt-4">
<h1 class="mb-3">Créer un style</h1>
<hr />
<form asp-action="Create" method="post" class="mt-4">
@* Utilisation de d-flex pour aligner les éléments sur une ligne *@
<div class="d-flex align-items-center">
@* Label *@
<div class="me-3">
<label asp-for="Libelle" class="col-form-label fw-bold">
Libellé<span class="text-danger">*</span>
</label>
</div>
@* Input *@
<div class="me-3">
<input asp-for="Libelle" class="form-control" style="width: 250px;" />
</div>
@* Bouton *@
<div>
<button type="submit" class="btn btn-primary">Sauvegarder</button>
</div>
</div>
@* Zone d'erreur en dessous *@
<div class="mt-2">
<span asp-validation-for="Libelle" class="text-danger"></span>
</div>
</form>
<div class="mt-4">
<a asp-action="Index" class="btn-link">Retour à l'administration des styles</a>
</div>
</div>

View File

@@ -0,0 +1,47 @@
@model Webzine.WebApplication.Areas.Administration.ViewModels.Style.StyleEditViewModel
@{
ViewData["Title"] = "Editer un style";
}
<div class="container mt-4">
<h1 class="mb-3">Editer un style</h1>
<hr />
<form asp-action="Edit" method="post" class="mt-4">
@* Champ caché pour l'ID *@
<input type="hidden" asp-for="IdStyle" />
@* Conteneur Flex pour alignement horizontal (Label - Input - Bouton) *@
<div class="d-flex align-items-center">
@* Label *@
<div class="me-3">
<label asp-for="Libelle" class="col-form-label fw-bold">
Libellé<span class="text-danger">*</span>
</label>
</div>
@* Input *@
<div class="me-3">
<input asp-for="Libelle" class="form-control" style="width: 250px;" />
</div>
@* Bouton *@
<div>
<button type="submit" class="btn btn-primary">Sauvegarder</button>
</div>
</div>
@* Zone d'erreur spécifique au champ *@
<div class="mt-2">
<span asp-validation-for="Libelle" class="text-danger"></span>
</div>
</form>
<div class="mt-4">
<a asp-action="Index" class="btn-link">Retour à l'administration des styles</a>
</div>
</div>

View File

@@ -4,22 +4,23 @@
ViewData["Title"] = "Styles"; ViewData["Title"] = "Styles";
} }
<div class="justify-content-center m-5"> <div class="container mt-4">
<div class="d-flex justify-content-between align-items-center mb-4">
<h1>Gestion des Styles</h1> <h1 class="mb-3">Styles</h1>
@* Lien vers la création (optionnel si vous n'avez pas encore fait l'action Create) *@ <hr />
<div class="mb-3">
<a asp-action="Create" class="btn btn-primary"> <a asp-action="Create" class="btn btn-primary">
<i class="fas fa-plus"></i> Nouveau Style <i class="fas fa-plus"></i> Ajouter un nouvel style
</a> </a>
</div> </div>
<div class="table-responsive"> <div class="table-responsive">
<table class="table table-striped table-hover table-bordered"> <table class="table table-striped table-hover table-bordered table-sm">
<thead class="table-light"> <thead class="table-active">
<tr> <tr>
<th scope="col" style="width: 10%;">#</th> <th scope="col" class="p-2">Libellé</th>
<th scope="col">Libellé</th> <th scope="col" class="text-center p-2" style="width: 100px;">Actions</th>
<th scope="col" class="text-center" style="width: 15%;">Actions</th>
</tr> </tr>
</thead> </thead>
<tbody> <tbody>
@@ -28,15 +29,14 @@
@foreach (Webzine.Entity.Style style in Model.Styles) @foreach (Webzine.Entity.Style style in Model.Styles)
{ {
<tr class="align-middle"> <tr class="align-middle">
<td> <td class="p-2">
@style.IdStyle
</td>
<td>
@style.Libelle @style.Libelle
</td> </td>
<td class="text-center"> <td class="text-center p-2">
@* Bouton Supprimer (correspond à votre action Delete) *@ <a asp-action="Edit" asp-route-id="@style.IdStyle" class="text-primary me-2" title="Éditer">
<a asp-action="Delete" asp-route-id="@style.IdStyle" class="d-inline btn btn-link text-main" title="Supprimer"> <i class="fas fa-edit"></i>
</a>
<a asp-action="Delete" asp-route-id="@style.IdStyle" class="text-primary" title="Supprimer">
<i class="fas fa-trash"></i> <i class="fas fa-trash"></i>
</a> </a>
</td> </td>
@@ -46,7 +46,7 @@
else else
{ {
<tr> <tr>
<td colspan="3" class="text-center">Aucun style disponible.</td> <td colspan="2" class="text-center p-2">Aucun style disponible.</td>
</tr> </tr>
} }
</tbody> </tbody>