feat: Ajout du contrôleur Titre et des vues associées pour gérer les titres musicaux, y compris les détails, les styles, les likes et les commentaires #16 #18 #19 #20

This commit is contained in:
mirage
2026-03-05 10:29:49 +01:00
parent d13f6113df
commit a5757903ef
18 changed files with 583 additions and 71 deletions

View File

@@ -1,11 +1,14 @@
<!DOCTYPE html>
<html lang="fr">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>@ViewData["Title"] - Mon Application</title>
</head>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>@ViewData["Title"] - Mon Application</title>
<link href="/css/app.css" rel="stylesheet" />
<link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.5.0/css/all.min.css" rel="stylesheet" />
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.8/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-sRIl4kxILFvY47J16cr9ZwB07vP4J8+LH7qKQnuqkuIAvNWLzeN8tE5YBujZqJLB" crossorigin="anonymous">
</head>
<body>
<main>
@RenderBody()

View File

@@ -0,0 +1,193 @@
@model Webzine.WebApplication.ViewsModels.Titre.TitreDetail
@{
ViewData["Title"] = Model.Details.Libelle;
}
<div class="container mt-4">
<div class="mb-3">
<h2>
<a asp-area="" asp-controller="" asp-action="" asp-route-style="@Model.Details.ArtisteNom">@Model.Details.ArtisteNom</a>
- @Model.Details.Libelle
</h2>
<div class="d-flex justify-content-between align-items-center pb-2 mb-3">
<div class="text-muted small d-flex align-items-center gap-4">
<!-- Date -->
<span class="text-dark">
<i class="fa fa-calendar me-1"></i>
Le @Model.Details.DateSortie.ToString("dd/MM/yyyy 'à' HH:mm")
</span>
<!-- Likes -->
<span>
<i class="fa fa-heart text-dark me-1"></i>
@Model.Details.NbLikes
</span>
<!-- Styles -->
<span class="text-dark">
<i class="fa fa-tags me-1"></i>
Styles :
@for (int i = 0; i < Model.Details.Styles.Count; i++)
{
var style = Model.Details.Styles[i];
<a class="text-primary text-decoration-none fw-semibold"
asp-controller="Titre"
asp-action="Style"
asp-route-style="@style.Libelle">
@style.Libelle
</a>
@if (i < Model.Details.Styles.Count - 1)
{
<span>, </span>
}
}
</span>
</div>
<!-- ACTION BUTTONS -->
<div class="d-flex gap-2">
<form asp-action="Like" method="post">
<input type="hidden" name="IdTitre" value="@Model.Details.IdTitre" />
<button type="submit" class="btn btn-outline-primary btn-sm">
<i class="fa fa-thumbs-up me-1"></i> Like
</button>
</form>
<a class="btn text-primary btn-sm">
<i class="fa fa-pen-to-square me-1"></i> Editer
</a>
</div>
</div>
</div>
<!-- CONTENU -->
<div class="row mt-4">
<div class="col-md-8">
<p class="text-justify">
@Model.Details.Chronique
</p>
</div>
<div class="col-md-4 text-center">
<img src="@Model.Details.UrlJaquette"
class="img-fluid rounded shadow"
alt="Jaquette" />
</div>
</div>
<!-- LECTEUR -->
@if (!string.IsNullOrEmpty(Model.Details.UrlEcoute))
{
<div class="mt-4">
<iframe width="100%" height="315"
src="@Model.Details.UrlEcoute"
title="Lecteur"
allowfullscreen>
</iframe>
</div>
}
<!-- FORMULAIRE COMMENTAIRE -->
<div class="mt-4 mb-4">
<div>
<h4 class="mb-4">Donne ton avis sur le titre</h4>
<form asp-action="Comment" method="post">
<input type="hidden" name="IdTitre" value="@Model.Details.IdTitre"/>
<div class="row mb-3 align-items-center">
<label class="col-sm-2 col-form-label">
Nom<span class="text-danger">*</span>
</label>
<div class="col">
<input name="Auteur"
class="form-control input-full"
placeholder="Votre nom"
required />
</div>
</div>
<div class="row mb-3 align-items-start">
<label class="col-sm-2 col-form-label">
Commentaire<span class="text-danger">*</span>
</label>
<div class="col">
<textarea name="Contenu"
rows="3"
class="form-control input-full"
placeholder="Votre commentaire..."
required></textarea>
</div>
</div>
<div class="row">
<div class="col-sm-6 offset-sm-2">
<button type="submit" class="btn btn-primary">
Envoyer
</button>
</div>
</div>
</form>
</div>
</div>
<!-- COMMENTAIRES -->
<div class="mt-4">
<h4 class="mb-4">Commentaires</h4>
@if (Model.Details.Commentaires.Any())
{
foreach (var comment in Model.Details.Commentaires.OrderByDescending(c => c.DateCreation))
{
<div class="row mb-4">
<div class="col-sm-1"></div>
<div class="col-sm-6 d-flex">
<img src="/images/avatar.png"
width="50"
height="50"
class="rounded-circle me-3 shadow-sm"
alt="avatar" />
<div>
<strong>@comment.Auteur</strong>,
<span class="text-muted small">
le @comment.DateCreation.ToString("dd/MM/yyyy HH:mm")
</span>
<p class="mb-0">@comment.Contenu</p>
</div>
</div>
</div>
}
}
else
{
<div class="row">
<div class="col-sm-6 offset-sm-2">
<p class="text-muted">Aucun commentaire pour le moment.</p>
</div>
</div>
}
</div>
</div>

View File

@@ -0,0 +1,50 @@
@model Webzine.WebApplication.ViewsModels.Titre.TitreStyle
@{
ViewData["Title"] = $"Titres - {Model.StyleName}";
Layout = "_Layout";
}
<div class="container mt-4">
<div class="row">
<!-- COLUMN -->
<div class="col-md-8">
<h1 class="mb-4 titre-h1">Titres ayant le style @Model.StyleName</h1>
@if (!Model.Titres.Any())
{
<div class="alert alert-info">
Aucun titre trouvé.
</div>
}
else
{
@foreach (var titre in Model.Titres)
{
<div class="titre-item d-flex align-items-start">
<!-- Image -->
<div class="me-3">
<img src="@titre.UrlJaquette" alt="@titre.Libelle" />
</div>
<!-- Infos -->
<div>
<a asp-action="Details"
asp-route-id="@titre.IdTitre"
class="titre-link">
@titre.ArtisteNom - @titre.Libelle
</a>
<div class="titre-duree">
Durée : @TimeSpan.FromSeconds(titre.Duree).ToString(@"mm\:ss")
</div>
</div>
</div>
}
}
</div>
</div>
</div>