recuperation push

pull/18/head^2
kentin.brongniart 4 months ago
commit 2cecc2b68d

@ -1,21 +0,0 @@
using Microsoft.AspNetCore.Components;
using WF_WebAdmin.Model;
namespace WF_WebAdmin.Pages
{
public partial class DeleteUser
{
private User[] users;
[Inject]
public HttpClient Http { get; set; }
[Inject]
public NavigationManager NavigationManager { get; set; }
protected override async Task OnInitializedAsync()
{
users = await Http.GetFromJsonAsync<User[]>($"{NavigationManager.BaseUri}fake-dataUser.json");
}
}
}

@ -2,12 +2,13 @@
<PageTitle>Gestion utilisateur</PageTitle>
@if(users != null)
{
<h3>Gestion des utilisateurs</h3>
<h3>Gestion des utilisateurs</h3>
<p>Utilisateurs présents:</p>
@if (users != null)
{
<p>Utilisateurs présents:</p>
@foreach (var user in users)
{
<div class="userDiv">
@ -16,10 +17,28 @@
<p class="pseudo"><strong>Nom d'utilisateur :</strong> @user.Name</p>
<p class="mail"><strong>Email de l'utilisateur :</strong> @user.Email</p>
<p class="dateCrea"><strong>Date de création de l'utilisateur :</strong> @user.DateCreation.ToShortDateString()</p>
<button>Supprimer l'utilisateur</button>
<button id="DeleteButton" @onclick="() => ShowConfirmation(user)">Supprimer l'utilisateur</button>
</div>
}
<!-- Fenêtre de confirmation -->
@if (showPopup)
{
<div class="divPopup">
<div class="contentPopup">
<p>Êtes-vous sûr de vouloir supprimer cet utilisateur ?</p>
<button @onclick="() => RemoveUser()">Confirmer</button>
<button @onclick="ClosePopup">Annuler</button>
</div>
</div>
}
}
else
{
<p><strong>Aucun utilisateurs présents sur le site</strong></p>
}
@code {

@ -0,0 +1,52 @@
using Microsoft.AspNetCore.Components;
using Microsoft.Extensions.Configuration.UserSecrets;
using WF_WebAdmin.Model;
namespace WF_WebAdmin.Pages
{
public partial class DeleteUser
{
private List<User> users;
private bool showPopup = false;
private User userToDelete = null;
[Inject]
public HttpClient Http { get; set; }
[Inject]
public NavigationManager NavigationManager { get; set; }
protected override async Task OnInitializedAsync()
{
users = await Http.GetFromJsonAsync<List<User>>($"{NavigationManager.BaseUri}fake-dataUser.json");
}
private void ShowConfirmation(User user)
{
// Afficher la modale et mémoriser l'utilisateur à supprimer
userToDelete = user;
showPopup = true;
}
private async Task RemoveUser()
{
if (userToDelete != null)
{
users.RemoveAll(u => u.Id == userToDelete.Id);
ClosePopup();
}
}
private void ClosePopup()
{
showPopup = false;
}
}
}

@ -0,0 +1,24 @@
@using WF_WebAdmin.Model
@page "/modifquote"
<PageTitle>Corection des citation</PageTitle>
<h3>Corection des citation</h3>
<p>Ajouter une recherche</p>
@if (quotes != null)
{
<DataGrid TItem="Quote"
Data="@quotes"
PageSize="int.MaxValue"
Responsive>
<DataGridColumn TItem="Quote" Field="@nameof(Quote.Id)" Caption="Id"/>
<DataGridColumn TItem="Quote" Field="@nameof(Quote.Content)" Caption="Citation"/>
<DataGridColumn TItem="Quote" Field="@nameof(Quote.Charac)" Caption="Personage"/>
<DataGridColumn TItem="Quote" Field="@nameof(Quote.TitleSrc)" Caption="Source" />
<DataGridColumn TItem="Quote" Field="@nameof(Quote.Langue)" Caption="Langue" />
<DataGridColumn TItem="Quote" Field="@nameof(Quote.DateSrc)" Caption="Date" DisplayFormat="{0:d}" DisplayFormatProvider="@System.Globalization.CultureInfo.GetCultureInfo("fr-FR")" />
</DataGrid>
}

@ -1,12 +1,14 @@
using Microsoft.AspNetCore.Components;
using Microsoft.AspNetCore.Components;
using WF_WebAdmin.Model;
namespace WF_WebAdmin.Pages
{
public partial class ValidQuote
public partial class ModifQuote
{
private Quote[] quotes;
private int MaxValue = 5;
[Inject]
public HttpClient Http { get; set; }
@ -15,7 +17,7 @@ namespace WF_WebAdmin.Pages
protected override async Task OnInitializedAsync()
{
quotes = await Http.GetFromJsonAsync<Quote[]>($"{NavigationManager.BaseUri}fake-dataValidQuote.json");
quotes = await Http.GetFromJsonAsync<Quote[]>($"{NavigationManager.BaseUri}fake-dataModifQuote.json");
}
}
}

@ -1,26 +1,36 @@
@page "/ValidQuote"
@using WF_WebAdmin.Model
@if(quotes != null){
<h3>Citations non validées</h3>
<p>Citations en attente de validation:</p>
<h3>Citations non validées</h3>
@foreach(var quote in quotes)
@if (quotes is null)
{
<p>Chargement des citations...</p>
}
else if (quotes.Count == 0)
{
<p>Aucune citation en attente de validation.</p>
}
else
{
<p>Citations en attente de validation :</p>
@foreach (var quote in quotes)
{
<div class="QuoteDiv">
<img class="imgQuote" src="@quote.ImgPath" />
<p class="idQuote"><strong>Identifiant de la citation :</strong>@quote.Id </p>
<p class="contentQuote"><strong>Citation:</strong>@quote.Content</p>
<p class="CaracterQuote"><strong>Personnage :</strong> @quote.Charac</p>
<p class="SourceQuote"><strong>Source :</strong> @quote.TitleSrc</p>
<p class="langueQuote"><strong>Langue :</strong> @quote.Langue</p>
<p class="UserPropositionQuote">@quote.UserProposition a proposé cette citation</p>
<button>Valider la citation</button>
<button>Rejetter la citation</button>
<p><strong>ID :</strong> @quote.Id</p>
<p><strong>Contenu :</strong> @quote.Content</p>
<p><strong>Langue :</strong> @quote.Langue</p>
<p><strong>Likes :</strong> @quote.Like</p>
<p><strong>Personnage :</strong> @quote.Charac</p>
<p><strong>Image :</strong> @quote.ImgPath</p>
<p><strong>Source :</strong> @quote.TitleSrc</p>
<p><strong>Date de source :</strong> @quote.DateSrc.ToShortDateString()</p>
<p><strong>Utilisateur proposition :</strong> @quote.UserProposition</p>
<button @onclick="() => ValiderQuote(quote.Id)">Valider</button>
<button @onclick="() => RejeterQuote(quote.Id)">Rejeter</button>
</div>
}
}

@ -0,0 +1,139 @@
using Microsoft.AspNetCore.Components;
using Npgsql;
using System.Data;
using WF_WebAdmin.Model;
using System.Collections.Generic;
using System;
using System.Threading.Tasks;
using System.Linq;
namespace WF_WebAdmin.Pages
{
public partial class ValidQuote
{
// Chaîne de connexion à adapter
private const string connectionString =
"Host=localhost;Port=5432;Database=wikifantasy3;Username=postgres;Password=postgres";
private List<Quote> quotes;
protected override async Task OnInitializedAsync()
{
// On charge toutes les citations dont isValide = false
quotes = await LoadNotValidatedQuotesAsync();
}
/// <summary>
/// Charge toutes les citations non validées (isValide = false)
/// et mappe les colonnes vers ton modèle.
/// </summary>
private async Task<List<Quote>> LoadNotValidatedQuotesAsync()
{
var result = new List<Quote>();
try
{
using var con = new NpgsqlConnection(connectionString);
await con.OpenAsync();
// Sélection des colonnes réellement présentes en DB
// + placeholders pour les autres
var sql = @"
SELECT
id_quote AS Id,
content AS Content,
likes AS ""Like"",
langue AS Langue,
-- Champs pas vraiment en DB : placeholders
'' AS Charac,
'' AS ImgPath,
'' AS TitleSrc,
now() AS DateSrc,
'' AS UserProposition
FROM quote
WHERE isValide = false
";
using var cmd = new NpgsqlCommand(sql, con);
using var reader = await cmd.ExecuteReaderAsync();
while (await reader.ReadAsync())
{
var q = new Quote
{
Id = reader.GetInt32(reader.GetOrdinal("Id")),
Content = reader.GetString(reader.GetOrdinal("Content")),
Like = reader.GetInt32(reader.GetOrdinal("Like")),
Langue = reader.GetString(reader.GetOrdinal("Langue")),
// placeholders
Charac = reader.GetString(reader.GetOrdinal("Charac")),
ImgPath = reader.GetString(reader.GetOrdinal("ImgPath")),
TitleSrc = reader.GetString(reader.GetOrdinal("TitleSrc")),
DateSrc = reader.GetDateTime(reader.GetOrdinal("DateSrc")),
UserProposition = reader.GetString(reader.GetOrdinal("UserProposition"))
};
result.Add(q);
}
}
catch (Exception ex)
{
Console.WriteLine($"[Erreur] LoadNotValidatedQuotesAsync : {ex.Message}");
}
return result;
}
/// <summary>
/// Met à jour isValide = true pour la citation.
/// </summary>
private async Task ValiderQuote(int quoteId)
{
try
{
using var con = new NpgsqlConnection(connectionString);
await con.OpenAsync();
var sql = "UPDATE quote SET isValide = true WHERE id_quote = @Id";
using var cmd = new NpgsqlCommand(sql, con);
cmd.Parameters.AddWithValue("Id", quoteId);
int rowsAffected = await cmd.ExecuteNonQueryAsync();
if (rowsAffected > 0)
{
// Supprime la quote de la liste pour l'enlever de l'affichage
quotes.RemoveAll(q => q.Id == quoteId);
}
}
catch (Exception ex)
{
Console.WriteLine($"[Erreur] ValiderQuote : {ex.Message}");
}
}
/// <summary>
/// Supprime complètement la citation de la base.
/// </summary>
private async Task RejeterQuote(int quoteId)
{
try
{
using var con = new NpgsqlConnection(connectionString);
await con.OpenAsync();
var sql = "DELETE FROM quote WHERE id_quote = @Id";
using var cmd = new NpgsqlCommand(sql, con);
cmd.Parameters.AddWithValue("Id", quoteId);
int rowsAffected = await cmd.ExecuteNonQueryAsync();
if (rowsAffected > 0)
{
quotes.RemoveAll(q => q.Id == quoteId);
}
}
catch (Exception ex)
{
Console.WriteLine($"[Erreur] RejeterQuote : {ex.Message}");
}
}
}
}

@ -29,5 +29,9 @@
<script src="_framework/blazor.server.js"></script>
<link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.15.4/css/all.css">
<link href="_content/Blazorise/blazorise.css" rel="stylesheet" />
<link href="_content/Blazorise.Bootstrap/blazorise.bootstrap.css" rel="stylesheet" />
</body>
</html>

@ -1,4 +1,6 @@
using Blazored.LocalStorage;
using Blazorise;
using Blazorise.Bootstrap;
using Blazorise.Icons.FontAwesome;
using Microsoft.AspNetCore.Components;
using Microsoft.AspNetCore.Components.Web;
using WF_WebAdmin.Data;
@ -12,7 +14,11 @@ builder.Services.AddSingleton<WeatherForecastService>();
builder.Services.AddHttpClient();
builder.Services.AddBlazoredLocalStorage();
builder.Services
.AddBlazorise()
.AddBootstrapProviders()
.AddFontAwesomeIcons();
var app = builder.Build();

@ -31,6 +31,13 @@
</NavLink>
</div>
<div class="nav-item px-3">
<NavLink class="nav-link" href="modifquote">
<span class="oi oi-list-rich" aria-hidden="true"></span> Corection des citation
</NavLink>
</div>
</nav>
</div>

@ -8,10 +8,11 @@
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Blazored.LocalStorage" Version="4.5.0" />
<PackageReference Include="Blazorise.Bootstrap" Version="1.7.2" />
<PackageReference Include="Blazorise.DataGrid" Version="1.7.2" />
<PackageReference Include="Blazorise.Icons.FontAwesome" Version="1.7.2" />
<PackageReference Include="bootstrap" Version="5.3.3" />
<PackageReference Include="Npgsql" Version="9.0.2" />
</ItemGroup>
</Project>

@ -7,4 +7,5 @@
@using Microsoft.AspNetCore.Components.Web.Virtualization
@using Microsoft.JSInterop
@using WF_WebAdmin
@using WF_WebAdmin.Shared
@using WF_WebAdmin.Shared
@using Blazorise.DataGrid

@ -88,4 +88,37 @@ button {
.pseudo, .mail, .idUser, .dateCrea, .idQuote, .contentQuote, .CaracterQuote, .SourceQuote, .langueQuote, .UserPropositionQuote {
margin-left: 10px;
}
/*ModifQuote*/
.imgTab{
width: 5vw;
height: 5vw;
object-fit: contain;
}
/*Popup DeleteUser*/
.divPopup {
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 100%;
background-color: white border-radius:20px;
display: flex;
justify-content: center;
align-items: center;
z-index: 2;
}
.contentPopup {
background-color: white;
padding: 20px;
border-radius: 20px;
display: flex;
flex-direction: column;
gap: 10px;
width: 300px;
text-align: center;
}

@ -0,0 +1,90 @@
[
{
"Id": 1,
"ImgPath": "https://tse2.mm.bing.net/th/id/OIP.MMpXBB5RDRYQm05FJmevGAHaKl?w=137&h=195&c=7&r=0&o=5&pid=1.7",
"Content": "Harry POTTER JE SUIS TON PERE",
"Charac": "Sirius Black",
"TitleSrc": "Harry Potter",
"Langue": "fr",
"UserProposition": "demo",
"DateSrc": "2001-01-01",
"Like": 20
},
{
"Id": 2,
"ImgPath": "https://tse2.mm.bing.net/th/id/OIP.zR4rzkK7q2wCcNwZd6jjegHaIC?w=163&h=180&c=7&r=0&o=5&pid=1.7",
"Content": "'Une autre citation'",
"Charac": "Un personnage",
"TitleSrc": "Un super film",
"Langue": "fr",
"DateSrc": "2002-02-02",
"Like": 0,
"UserProposition": "exploit"
},
{
"Id": 1,
"ImgPath": "https://tse2.mm.bing.net/th/id/OIP.MMpXBB5RDRYQm05FJmevGAHaKl?w=137&h=195&c=7&r=0&o=5&pid=1.7",
"Content": "Harry POTTER JE SUIS TON PERE",
"Charac": "Sirius Black",
"TitleSrc": "Harry Potter",
"Langue": "fr",
"UserProposition": "demo",
"DateSrc": "2001-01-01",
"Like": 20
},
{
"Id": 2,
"ImgPath": "https://tse2.mm.bing.net/th/id/OIP.zR4rzkK7q2wCcNwZd6jjegHaIC?w=163&h=180&c=7&r=0&o=5&pid=1.7",
"Content": "'Une autre citation'",
"Charac": "Un personnage",
"TitleSrc": "Un super film",
"Langue": "fr",
"DateSrc": "2002-02-02",
"Like": 0,
"UserProposition": "exploit"
},
{
"Id": 1,
"ImgPath": "https://tse2.mm.bing.net/th/id/OIP.MMpXBB5RDRYQm05FJmevGAHaKl?w=137&h=195&c=7&r=0&o=5&pid=1.7",
"Content": "Harry POTTER JE SUIS TON PERE",
"Charac": "Sirius Black",
"TitleSrc": "Harry Potter",
"Langue": "fr",
"UserProposition": "demo",
"DateSrc": "2001-01-01",
"Like": 20
},
{
"Id": 2,
"ImgPath": "https://tse2.mm.bing.net/th/id/OIP.zR4rzkK7q2wCcNwZd6jjegHaIC?w=163&h=180&c=7&r=0&o=5&pid=1.7",
"Content": "'Une autre citation'",
"Charac": "Un personnage",
"TitleSrc": "Un super film",
"Langue": "fr",
"DateSrc": "2002-02-02",
"Like": 0,
"UserProposition": "exploit"
},
{
"Id": 1,
"ImgPath": "https://tse2.mm.bing.net/th/id/OIP.MMpXBB5RDRYQm05FJmevGAHaKl?w=137&h=195&c=7&r=0&o=5&pid=1.7",
"Content": "Harry POTTER JE SUIS TON PERE",
"Charac": "Sirius Black",
"TitleSrc": "Harry Potter",
"Langue": "fr",
"UserProposition": "demo",
"DateSrc": "2001-01-01",
"Like": 20
},
{
"Id": 2,
"ImgPath": "https://tse2.mm.bing.net/th/id/OIP.zR4rzkK7q2wCcNwZd6jjegHaIC?w=163&h=180&c=7&r=0&o=5&pid=1.7",
"Content": "'Une autre citation'",
"Charac": "Un personnage",
"TitleSrc": "Un super film",
"Langue": "fr",
"DateSrc": "2002-02-02",
"Like": 0,
"UserProposition": "exploit"
}
]
Loading…
Cancel
Save