Compare commits

..

59 Commits

Author SHA1 Message Date
75abb10913 validation HTML 2025-12-13 07:45:59 +01:00
6de5eb546e FAQ + TinyMCE globale 2025-12-12 22:39:03 +01:00
a220868c03 Merge branch 'main' of ssh://git.lalanguebleue.fr:2222/ileauchiens/maquette_backoffi
vendredi 12 au soir
2025-12-12 20:59:09 +01:00
ben
da0dfdc8c7 nettoyage de doucmentation 2025-12-12 17:09:55 +01:00
ben
e37b8c4c7d modifier presta: DOM message + header + chemins. W3C éffectué sur les 3pages commité 2025-12-12 17:03:35 +01:00
ben
946bda115a ajouter slider : DOM message + header + chemins 2025-12-12 16:49:50 +01:00
ben
248bc80da5 Ajouter prestation : DOM message + mise ne place du header+fichier style css prestation 2025-12-12 16:34:45 +01:00
ben
f72b6e9337 mise a jour du dom ajouter catégorie 2025-12-12 15:32:17 +01:00
e40317e726 Merge branch 'main' of ssh://git.lalanguebleue.fr:2222/ileauchiens/maquette_backoffice 2025-12-12 15:06:08 +01:00
dbd1ccee68 script delete 2025-12-12 15:02:57 +01:00
ben
b140b6a4ec Merge branch 'main' of ssh://git.lalanguebleue.fr:2222/ileauchiens/maquette_backoffice 2025-12-12 14:43:16 +01:00
ben
4fe4facd32 mise a jour du Dom de ajouter article et modifier article 2025-12-12 14:38:43 +01:00
f02c69449a feat:creation dossier components 2025-12-12 11:28:09 +01:00
b77f82f216 ups modif prestations accueil 2025-12-12 10:00:08 +01:00
a0ef8c98c9 feat: ajouter une carte 2025-12-12 09:46:52 +01:00
47a1243464 feat: ajouter une categorie mb-4 mt-3 2025-12-12 09:46:01 +01:00
374334de44 feat:modification page prestation 2025-12-12 09:43:17 +01:00
ben
5d86176a97 nettoyage du 12 décembre 2025-12-12 09:35:34 +01:00
f4b7254223 Merge branch 'main' into david 2025-12-12 09:27:16 +01:00
7cebda02ee Merge branch 'main' into david
integration du citations
2025-12-12 09:24:59 +01:00
ce04d847f6 feat:corrections 2025-12-12 09:17:09 +01:00
21dab81e7a citations-modifs 2025-12-12 08:49:08 +01:00
41d739df95 feat:creation delete-composant.html et delete-composant.js 2025-12-12 08:43:43 +01:00
c7aaa923af feat: creation header composant html et js 2025-12-12 08:43:43 +01:00
77f43fff95 citations 2025-12-12 08:33:41 +01:00
c4a6dcf798 Merge branch 'main' into david 2025-12-12 07:40:34 +01:00
c976d4666b Merge avec conservation de ma version locale 2025-12-11 22:29:54 +01:00
ben
63592a114d mise a jour DOM page modifier categorie 2025-12-11 16:34:46 +01:00
ben
74a04ea355 retouche des redirections de page 2025-12-11 16:12:16 +01:00
5b0edbccca feat: modifier chemin js 2025-12-11 15:18:33 +01:00
ad9e8b8308 os : accordeon 2025-12-11 15:07:04 +01:00
fc19007b05 feat:liste_avant_apres modifie 2025-12-11 13:23:21 +01:00
efad1b078e feat: quelques ajustements liste_slider 2025-12-11 12:54:14 +01:00
16ab4707e2 feat:modifier_avant_apres rechangement structure 2025-12-11 12:34:48 +01:00
ben
84d8f1c481 ajout du badge publié sur facebook (bootstrap) dans la page accueil blog 2025-12-11 12:02:29 +01:00
ben
9e80b99abe correction erreur 2025-12-11 11:11:57 +01:00
ben
2125bfb126 Merge branch 'main' of ssh://git.lalanguebleue.fr:2222/ileauchiens/maquette_backoffice 2025-12-11 11:06:44 +01:00
ben
a0e14bfa92 Mise en place tinymce dans accueil blog avec clé et domaine 2025-12-11 11:04:42 +01:00
e2fe18ec04 feat:modifier_avant_apres changement structure 2025-12-11 10:49:11 +01:00
8fe2e99953 feat:liste_avant_apres prête2 2025-12-11 10:10:07 +01:00
417ff38b59 feat:liste_avant_apres prête 2025-12-11 10:06:53 +01:00
aa5f003be8 feat:work in progress 2025-12-11 09:45:48 +01:00
8867ae1b06 travail en cours 2025-12-11 09:45:48 +01:00
2923a9eb52 correction page accueil blog 2025-12-10 20:57:30 +01:00
ben
50b3904af6 mise a jour categorie (liste deroulante et remplissage obligatoire) + mise a jour checkbox + insertion de TinyMCE (pas finis) 2025-12-10 19:24:00 +01:00
55c3b2d050 Merge branch 'david' of ssh://git.lalanguebleue.fr:2222/ileauchiens/maquette_backoffice 2025-12-10 18:13:29 +01:00
ben
7fc3e350d0 suppressions des pages html liste categorie et liste article 2025-12-10 16:56:09 +01:00
ben
5297dcbcc3 ajout de la page accueil blog + page liste categorie_article regroupant les pages articles et categorie 2025-12-10 16:48:28 +01:00
ben
37b1d7ede5 retrait du max-width sur les pages html de blog + integration du header sur les pages html de blog + creation d'une page accueil blog 2025-12-10 15:10:16 +01:00
77310c974e avant validation 2025-12-10 14:17:34 +01:00
ben
e04e29bf48 Ajout du favicon depuis la branche david 2025-12-10 13:18:49 +01:00
bf25a80f43 feat:ajouter avant apres avec header 2025-12-10 13:00:11 +01:00
7fb728fc00 feat:ajouter avant apres corrigé 2025-12-10 12:49:26 +01:00
5ee026f439 ajout du favicon 2025-12-10 12:28:39 +01:00
ben
33b0c0cab8 ajout login page de connexion + mise a jours des pages mdp oublié, page de connxeion 2025-12-10 12:24:00 +01:00
9a8891fc9d feat:avant apres+media queries+modale de suppression 2025-12-10 09:53:45 +01:00
4f85fe3250 amelioration menu burger 2025-12-10 07:09:36 +01:00
a2ecb6bf84 FEAT : ajout du header + npm, bootstrap, tiny* 2025-12-09 21:45:49 +01:00
ben
f79ee1e7b6 refonte arborescence + correction des chemins 2025-12-09 17:14:35 +01:00
84 changed files with 3864 additions and 2003 deletions

1
.gitignore vendored Normal file
View File

@@ -0,0 +1 @@
node_modules/

View File

@@ -1,105 +0,0 @@
<!DOCTYPE html>
<html lang="fr">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Ajouter un article</title>
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/css/bootstrap.min.css">
<script src="https://cdn.ckeditor.com/ckeditor5/39.0.1/classic/ckeditor.js"></script>
<style>
body {
background: #f4f6f9;
}
.container {
max-width: 700px;
margin: 40px auto;
}
</style>
</head>
<body>
<div class="container">
<h2 class="mb-5 text-center">Ajouter un article</h2>
<form id="ajouterArticleForm">
<!--Erreur titre vide-->
<div id="errorEmpty" class="alert alert-danger d-none">Le titre de l'article est obligatoire</div>
<!--Erreur image invalide-->
<div id="errorImage" class="alert alert-danger d-none">
Format d'image invalide. Formats acceptés : JPG, PNG
</div>
<!--Erreur titre existant-->
<div id="errorExists" class="alert alert-danger d-none">Ce titre existe déjà. Choisissez un autre titre.</div>
<!--Succès ajout article-->
<div id="successMsg" class="alert alert-success d-none">Article ajouté avec succès !</div>
<!-- Catégorie -->
<div class="mb-3">
<label class="form-label fw-bold">Catégorie de l'article</label>
<input list="categories" id="articleCategory" class="form-control" placeholder="Entrez une catégorie">
<datalist id="categories">
<option value="actualités">
<option value="chien">
<option value="chat">
<option value="boutique">
</datalist>
</div>
<!-- Titre -->
<div class="mb-4">
<label class="form-label fw-bold">Titre de l'article (obligatoire)</label>
<input type="text" id="articleTitle" class="form-control" placeholder="Entrez le titre de l'article">
</div>
<!-- Contenu -->
<div class="mb-3">
<label class="form-label fw-bold">Contenu de l'article</label>
<textarea id="articleContent" class="form-control" rows="5" placeholder="Entrez le contenu de l'article"></textarea>
</div>
<!-- Image -->
<div class="mb-4">
<label class="form-label fw-bold">Image de l'article</label>
<input type="file" id="articleImage" class="form-control" accept="image/*">
</div>
<!--Publié-->
<div class="form-check mb-3">
<input class="form-check-input" type="checkbox" id="articlePublished">
<label class="form-check-label" for="articlePublished">Publié</label>
</div>
<!--Boutons-->
<div class="d-flex gap-3 mt-4">
<a href="../../../blog/categories/articles/liste_article.html" class="btn btn-secondary w-50">Annuler</a>
<button type="submit" class="btn btn-primary w-50">Ajouter</button>
</div>
</form>
</div>
<script src="ajouter_article.js"></script>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/js/bootstrap.bundle.min.js"></script>
<script>
ClassicEditor
.create(document.querySelector('#articleContent'))
.catch(error => {
console.error(error);
});
</script>
</body>
</html>

View File

@@ -1,52 +0,0 @@
const form = document.getElementById('addArticleForm');
const imgField = document.getElementById('articleImage');
const titleField = document.getElementById('articleTitle');
const contentField = document.getElementById('articleContent');
const categoryField = document.getElementById('articleCategory');
const publishedField = document.getElementById('articlePublished');
const errorEmpty = document.getElementById('errorEmpty');
const errorImage = document.getElementById('errorImage');
const errorExists = document.getElementById('errorExists');
const successMsg = document.getElementById('successMsg');
// Simulation BDD
const titreExistants = ['décoration noel', 'coupe de chien'];
form.addEventListener('submit', function(e) {
e.preventDefault();
const titre = titleField.value.trim() .toLowerCase();
const fichierImage = imgField.files[0];
// Reset messages
errorEmpty.classList.add('d-none');
errorImage.classList.add('d-none');
errorExists.classList.add('d-none');
successMsg.classList.add('d-none');
// Titre obligatoire
if (titre === "") {
errorEmpty.classList.remove('d-none');
return;
}
// Titre déjà existant
if (titreExistants.includes(titre)) {
errorExists.classList.remove('d-none');
return;
}
// Image invalide
if (fichierImage) {
const validFormats = ['image/jpeg', 'image/png'];
if (!validFormats.includes(fichierImage.type)) {
errorImage.classList.remove('d-none');
return;
}
}
// Simuler enregistrement
titreExistants.push(titre);
});

View File

@@ -1,57 +0,0 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Liste des article</title>
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/css/bootstrap.min.css">
<style>
body {
background: #f4f6f9;
}
.container {
margin-top: 60px;
}
</style>
</head>
<body>
<div class="container">
<div class="d-flex justify-content-between align-items-center mb-4">
<h2 class="mb-0">Listes des articles</h2>
<a href="ajouter_article.html" class="btn btn-primary">Ajouter un article</a>
</div>
<table class="table table-bordered table-hover bg-white">
<thead class="table-light">
<tr>
<th>Titre</th>
<th>Catégorie</th>
<th>Publié</th>
<th>Actions</th>
</tr>
</thead>
<tbody>
<!--Exemple d'article-->
<tr>
<td>Mon premier article</td>
<td>Chien</td>
<td>Oui</td>
<td>
<a href="voir_article.html" class="btn btn-sm btn-outline-secondary">Voir</a>
<a href="modifier_article.html" class="btn btn-sm btn-outline-primary">Modifier</a>
<button class="btn btn-sm btn-outline-danger" onclick="confirmerSuppression('Mon premier article')">Supprimer</button>
</td>
</tr>
</tbody>
</table>
</div>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/js/bootstrap.bundle.min.js"></script>
</body>
</html>

View File

@@ -1,7 +0,0 @@
function confirmerSuppression(titre) {
const confirmation = confirm(`Êtes-vous sûr de vouloir supprimer l'article "${titre}" ?`);
if (confirmation) {
alert(`L'article "${titre}" a été supprimé.`);
// Ici tu peux rediriger ou supprimer réellement
}
}

View File

@@ -1,145 +0,0 @@
<!DOCTYPE html>
<html lang="fr">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Modifier un article</title>
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/css/bootstrap.min.css">
<script src="https://cdn.ckeditor.com/ckeditor5/39.0.1/classic/ckeditor.js"></script>
<style>
body {
background: #f4f6f9;
}
.container {
max-width: 700px;
margin-top: 40px;
}
.preview-img {
max-width: 15Opx;
border-radius: 8px
}
</style>
</head>
<body>
<div class="container">
<h2 class="mb-4 text-center">Modifier un article</h2>
<!--Erreur titre vide-->
<div id="errorEmpty" class="alert alert-danger d-none">
g Le titre de l'article est obligatoire.
</div>
<!--Erreur image invalide-->
<div id="errorImage" class="alert alert-danger d-none">
Format d'image invalide. Formats acceptés : JPG, PNG, GIF.
</div>
<!--Erreur titre existant-->
<div id="errorExists" class="alert alert-danger d-none">
Ce titre existe déjà. Veuillez en choisir un autre.
</div>
<!--Succès-->
<div id="successMsg" class="alert alert-success d-none">
L'article a été modifié avec succès !
</div>
<!-- Formulaire -->
<form id="editArticleForm">
<!--Titre-->
<div class="mb-3">
<label class="form-label fw-bold">Titre de l'article (obligatoire)</label>
<input type="text" id="articleTitle" class="form-control" value="Titre de l'article actuel" placeholder="Modifier le titre">
</div>
<!--Contenu-->
<div class="mb-3">
<label class="form-label fw-bold">Contenu de l'article</label>
<textarea id="articleContent" class="form-control" rows="5">Contenu de l'article actuel...</textarea>
</div>
<!--Catégorie-->
<div class="mb-4">
<label class="form-label fw-bold">Catégorie de l'article</label>
<input
type="text"
id="articleCategory"
class="form-control"
list="categories"
placeholder="Entrez une catégorie">
<datalist id="categories">
<option value="actualités">
<option value="chien">
<option value="chat">
<option value="boutique">
</datalist>
</div>
<!-- Image actuelle -->
<label class="fw-bold">Image actuelle</label>
<div class="mb-4">
<img src="/blog/categories/images/article1.jpg" alt="Image actuelle" class="preview-img mb-2">
<input type="file" id="articleImage" class="form-control" accept="image/*">
</div>
<!--Publié-->
<div class="form-check mb-3">
<input class="form-check-input" type="checkbox" id="articlePublished" checked>
<label class="form-check-label">Publié</label>
</div>
<!--Boutons-->
<div class="d-flex gap-3 mt-4">
<a href="../../../blog/categories/articles/liste_article.html" class="btn btn-secondary w-50">Annuler</a>
<button type="submit" class="btn btn-primary w-50">Enregistrer</button>
</div>
</form>
</div>
<script>
ClassicEditor
.create(document.querySelector('#articleContent'))
.catch(error => {
console.error(error);
});
</script>
<script src="modifier_article.js"></script>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/js/bootstrap.bundle.min.js"></script>
</body>
</html>

View File

@@ -1,68 +0,0 @@
const form = document.getElementById('editArticleForm');
const imgField = document.getElementById('articleImage');
const titleField = document.getElementById('articleTitle');
const contentField = document.getElementById('articleContent');
const categoryField = document.getElementById('articleCategory');
const publishedField = document.getElementById('articlePublished');
const errorEmpty = document.getElementById('errorEmpty');
const errorImage = document.getElementById('errorImage');
const errorExists = document.getElementById('errorExists');
const successMsg = document.getElementById('successMsg');
// Simulation BDD pour vérifier doublons
const titresExistants = [
"article de test",
"nouveautés chiens",
"actualité du mois"
];
form.addEventListener('submit', function(e) {
e.preventDefault();
const titre = titleField.value.trim().toLowerCase();
const fichierImage = imgField.files[0];
// Reset messages
errorEmpty.classList.add('d-none');
errorImage.classList.add('d-none');
errorExists.classList.add('d-none');
successMsg.classList.add('d-none');
//Titre obligatoire
if (titre === "") {
errorEmpty.classList.remove('d-none');
return;
}
// Titre déjà existant ?
if (titresExistants.includes(titre)) {
errorExists.classList.remove('d-none');
return;
}
//Vérification image
if (fichierImage) {
const validFormats = ['image/jpeg', 'image/png', 'image/gif'];
if (!validFormats.includes(fichierImage.type)) {
errorImage.classList.remove('d-none');
return;
}
}
// Succès
successMsg.classList.remove('d-none');
console.log("Article modifié :", {
titre,
contenu: contentField.value,
categorie: categoryField.value,
publie: publishedField.checked,
image: fichierImage ? fichierImage.name : "Image inchangée"
});
});

View File

@@ -1,57 +0,0 @@
<!DOCTYPE html>
<html lang="fr">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Ajouter une catégorie</title>
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/css/bootstrap.min.css">
<style>
body{
background: #f4f6f981;
}
.container{
max-width: 600px;
margin-top: 50px;
}
</style>
</head>
<body>
<div class="container">
<h2 class="mb-5 text-center">Ajouter une catégorie</h2>
<!--Erreur champ vide -->
<div id="errorEmpty" class="alert alert-danger d-none">Le nom de catégorie est obligatoire.</div>
<!--Erreur nom deja existant -->
<div id="errorExists" class="alert alert-danger d-none">Cette catégorie existe déjà. Veuillez en choisir une autre.</div>
<!--Succès ajout catégorie -->
<div id="successMessage" class="alert alert-success d-none">Catégorie ajoutée avec succès !</div>
<form id="addCategoryForm">
<div class="mb-4">
<label class="form-label fw-bold">Nom de la catégorie (obligatoire)</label>
<input type="text" id="categoryName" class="form-control" placeholder="Actualité, chien, chat .." required></div>
<div class="mb-3">
<label class="form-label fw-bold">Description</label>
<textarea id="categoryDescription" class="form-control" rows="4" placeholder="Entrez une description (optionnel)"></textarea>
</div>
<div class="d-flex gap-3 mt-4">
<a href="../../../blog/categories/liste_categorie/liste_categorie.html" class="btn btn-secondary w-50">Annuler</a>
<button type="submit" class="btn btn-primary w-50">Ajouter</button>
</div>
</form>
</div>
<script src="ajouter.js"></script>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/js/bootstrap.bundle.min.js"></script>
</body>
</html>

View File

@@ -1,43 +0,0 @@
const form = document.getElementById("addCategoryForm");
const nameField = document.getElementById("categoryName");
const descField = document.getElementById("categoryDescription");
const errorEmpty = document.getElementById("errorEmpty");
const errorExists = document.getElementById("errorExists");
const successMessage = document.getElementById("successMessage");
// Catégories existantes ( à remplacer en BD si besoin)
const existingCategories = ["Actualités", "Chien", "Chat", "Boutique"];
form.addEventListener("submit", function (e) {
e.preventDefault();
const nom = nameField.value.trim();
//Remettre tout a zero
errorEmpty.classList.add("d-none");
errorExists.classList.add("d-none");
successMessage.classList.add("d-none");
//Erreur champs vide
if (nom === "") {
errorEmpty.classList.remove("d-none");
return;
}
//Erreur catégorie existante
if (existingCategories.includes(nom)) {
errorExists.classList.remove("d-none");
return;
}
//Succès
successMessage.classList.remove("d-none");
//Ajout d'une nouvelle catégorie en BDD
existingCategories.push(nom);
});

View File

@@ -1,56 +0,0 @@
<!DOCTYPE html>
<html lang="fr">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Liste des catégories</title>
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/css/bootstrap.min.css">
<style>
body {
background: #f4f6f9;
padding: 30px;
}
.container {
max-width: 800px;
margin-top: 40px;
}
</style>
</head>
<body>
<div class="container">
<h2 class="text-center mb-4">Liste des catégories</h2>
<!-- Message succès -->
<div id="successMsg" class="alert alert-success d-none"></div>
<!-- Bouton ajouter -->
<div class="d-flex justify-content-end mb-4">
<a href="../ajouter_categorie/ajouter_categorie.html" class="btn btn-primary">
Ajouter une catégorie
</a>
</div>
<!-- Tableau -->
<table class="table table-striped table-hover">
<thead class="table-dark">
<tr>
<th>Nom</th>
<th>Description</th>
<th class="text-center">Actions</th>
</tr>
</thead>
<tbody id="categoriesTableBody">
<!-- rempli en JS -->
</tbody>
</table>
</div>
<script src="liste_categorie.js"></script>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/js/bootstrap.bundle.min.js"></script>
</body>
</html>

View File

@@ -1,57 +0,0 @@
<!DOCTYPE html>
<html lang="fr">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Modifier une catégorie</title>
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/css/bootstrap.min.css">
<style>
body {
background: #f4f6f981;
}
.container {
max-width: 600px;
margin: 50px auto;
}
</style>
</head>
<body>
<div class="container">
<h2 class="mb-5 text-center">Modifier une catégorie</h2>
<div id="errorMsg" class="alert alert-danger d-none">Veuillez ezmplir tous les champs obligatoires</div>
<div id="successMsg" class="alert alert-success d-none">La catégorie a été modifiée avec succès !</div>
<form id="modifierCategorie">
<div class="mb-4">
<label class="form-label fw-bold">Nom de la catégorie (obligatoire)</label>
<input type="text" id="categoryName" class="form-control" placeholder="Entrez le nom de la catégorie" required>
</div>
<div class="mb-3">
<label class="form-label fw-bold">Description (optionnel)</label>
<textarea id="categorieDescription" class="form-control" rows="4" placeholder="Entrez une description" required></textarea>
</div>
<div class="d-flex gap-3 mt-4">
<a href="../../categories/liste_categorie/liste_categorie.html" class="btn btn-secondary w-50">Annuler</a>
<button type="submit" class="btn btn-primary w-50">Enregistrer</button>
</div>
</form>
</div>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/js/bootstrap.bundle.min.js"></script>
</body>
</html>

View File

@@ -1,26 +0,0 @@
const form = document.getElementById("modifierCategorie");
const nameField = document.getElementById("categoryName");
const descField = document.getElementById("categorieDescription");
const errorMsg = document.getElementById("errorMsg");
const successMsg = document.getElementById("successMsg");
form.addEventListener("submit", function (e) {
e.preventDefault();
// Vérification des champs obligatoires
if (nameField.value.trim() === "" || descField.value.trim() === "") {
errorMsg.classList.remove("d-none");
successMsg.classList.add("d-none");
return;
}
// Succès
errorMsg.classList.add("d-none");
successMsg.classList.remove("d-none");
// Redirection après succès
setTimeout(() => {
window.location.href = "../../../blog/categories/liste_categorie/liste_categorie.html";
}, 1500);
});

163
blog/html/accueil_blog.html Normal file
View File

@@ -0,0 +1,163 @@
<!DOCTYPE html>
<html lang="fr">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Admin |Modifier le blog</title>
<link href="../../node_modules/bootstrap/dist/css/bootstrap.min.css" rel="stylesheet">
<link rel="stylesheet" href="../../node_modules/bs-icon/icons.css">
<link rel="stylesheet" href="../../css/style.css">
</head>
<body>
<header>
<nav class="navbar navbar-expand-xxl bg-body-tertiary">
<div class="container-fluid align-items-center">
<a class="navbar-brand" href="#">L'Il'eau chiens - Admin</a>
<button class="navbar-toggler" type="button" data-bs-toggle="collapse"
data-bs-target="#navbarSupportedContent" aria-controls="navbarSupportedContent"
aria-expanded="false" aria-label="Toggle navigation">
<span class="navbar-toggler-icon"></span>
</button>
<div class="collapse navbar-collapse" id="navbarSupportedContent">
<ul class="navbar-nav me-auto mb-2 mb-lg-0">
<li class="nav-item">
<a class="nav-link active left-label" aria-current="page" href="#">Blog</a>
</li>
<li class="nav-item">
<a class="nav-link left-label" href="#">Boutique</a>
</li>
<li class="nav-item">
<a class="nav-link left-label" href="#">Prestations</a>
</li>
<li class="nav-item">
<a class="nav-link left-label" href="#">FAQ</a>
</li>
<li class="nav-item">
<a class="nav-link left-label" href="#">Fiche de renseignements</a>
</li>
<li class="nav-item">
<a class="nav-link left-label" href="#">Partenaires</a>
</li>
</ul>
<ul class="navbar-nav ms-auto mb-2 mb-lg-0">
<li class="nav-item">
<a class="nav-link" href="#"><i class="bi bi-megaphone me-1"></i> Message d'actu</a>
</li>
<li class="nav-item">
<a class="nav-link" href="#"><i class="bi bi-box-arrow-up-right me-1"></i> Voir le site</a>
</li>
<li class="nav-item">
<a class="nav-link" href="#"><i class="bi bi-gear me-1"></i> Configuration</a>
</li>
<li class="nav-item dropdown">
<a class="nav-link dropdown-toggle" href="#" id="userMenu" role="button"
data-bs-toggle="dropdown" aria-expanded="false">
<i class="bi bi-person-circle me-1"></i> <span id="userFirstName">Prénom</span>
</a>
<ul class="dropdown-menu dropdown-menu-end" aria-labelledby="userMenu">
<li><a class="dropdown-item" href="#">Profil</a></li>
<li>
<hr class="dropdown-divider">
</li>
<li><a class="dropdown-item" href="#">Sortir</a></li>
</ul>
</li>
</ul>
</div>
</div>
</nav>
</header>
<main class="my-5 fs-6">
<div class="container">
<header>
<h1 class="title fs-2">Modifier la page blog</h1>
</header>
<main>
<section class="mb-5 section-categories">
<h2 class="my-4 fs-3">Liste des catégories</h2>
<!-- Message succès catégories -->
<div id="successCategoriesMsg" class="alert alert-success d-none"></div>
<!-- Bouton ajouter catégorie -->
<div class="d-flex justify-content-start mb-4">
<a href="ajouter_categorie.html" class="btn btn-primary">Ajouter une catégorie</a>
</div>
<!-- Tableau catégories -->
<table class="table table-striped table-hover">
<thead class="table-dark">
<tr>
<th>Nom</th>
<th class="text-end">Actions</th>
</tr>
</thead>
<tbody id="categoriesTableBody">
<!-- rempli en JS -->
</tbody>
</table>
</section>
<section class="section-articles">
<h2 class="my-4 fs-3">Liste des articles</h2>
<!-- Message succès articles -->
<div id="successArticlesMsg" class="alert alert-success d-none"></div>
<!-- Bouton ajouter article -->
<div class="d-flex justify-content-start mb-4">
<a href="ajouter_article.html" class="btn btn-primary">Ajouter un article</a>
</div>
<!-- Tableau articles -->
<table class="table table-striped table-hover">
<thead class="table-dark">
<tr>
<th>Titre</th>
<th class="text-end">Actions</th>
</tr>
</thead>
<tbody id="articlesTableBody">
<tr>
<td>Mon premier article</td>
<td class="text-end">
<a href="modifier_article.html"
class="btn btn-sm btn-outline-primary me-1">Modifier</a>
<button class="btn btn-sm btn-outline-danger delete-btn">Supprimer</button>
</td>
</tr>
<tr>
<td>Mon deuxième article</td>
<td class="text-end">
<a href="modifier_article.html"
class="btn btn-sm btn-outline-primary me-1">Modifier</a>
<button class="btn btn-sm btn-outline-danger delete-btn">Supprimer</button>
</td>
</tr>
</tbody>
</table>
</section>
</main>
</div>
</main>
<script src="../js/liste_categorie.js"></script>
<script src="../js/liste_articles.js"></script>
<script src="../../node_modules/bootstrap/dist/js/bootstrap.bundle.min.js"></script>
</body>

View File

@@ -0,0 +1,133 @@
<!DOCTYPE html>
<html lang="fr">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Ajouter un article</title>
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/css/bootstrap.min.css">
<link rel="stylesheet" href="../../css/blog.css">
<script src="https://cdn.tiny.cloud/1/1up68ybfp3crmpssl9o7pu6d0e8v3okcnsinhoujnmak7wft/tinymce/6/tinymce.min.js" referrerpolicy="origin"></script>
</head>
<body>
<header>
<nav class="navbar navbar-expand-xxl bg-body-tertiary shadow-sm">
<div class="container-fluid align-items-center">
<a class="navbar-brand" href="#">L'Il'eau chiens - Admin</a>
<button class="navbar-toggler" type="button" data-bs-toggle="collapse"
data-bs-target="#navbarSupportedContent" aria-controls="navbarSupportedContent"
aria-expanded="false" aria-label="Toggle navigation">
<span class="navbar-toggler-icon"></span>
</button>
<div class="collapse navbar-collapse" id="navbarSupportedContent">
<!-- MENU GAUCHE -->
<ul class="navbar-nav me-auto mb-2 mb-lg-0">
<li class="nav-item"><a class="nav-link active" href="#">Blog</a></li>
<li class="nav-item"><a class="nav-link" href="#">Boutique</a></li>
<li class="nav-item"><a class="nav-link" href="#">Prestations</a></li>
<li class="nav-item"><a class="nav-link" href="#">FAQ</a></li>
<li class="nav-item"><a class="nav-link" href="#">Fiche de renseignements</a></li>
<li class="nav-item"><a class="nav-link" href="#">Partenaires</a></li>
</ul>
<!-- MENU DROIT -->
<ul class="navbar-nav ms-auto mb-2 mb-lg-0">
<li class="nav-item">
<a class="nav-link" href="#"><i class="bi bi-megaphone me-1"></i> Message d'actu</a>
</li>
<li class="nav-item">
<a class="nav-link" href="#"><i class="bi bi-box-arrow-up-right me-1"></i> Voir le site</a>
</li>
<li class="nav-item">
<a class="nav-link" href="#"><i class="bi bi-gear me-1"></i> Configuration</a>
</li>
<li class="nav-item dropdown">
<a class="nav-link dropdown-toggle" href="#" id="userMenu" data-bs-toggle="dropdown">
<i class="bi bi-person-circle me-1"></i> <span id="userFirstName">Prénom</span>
</a>
<ul class="dropdown-menu dropdown-menu-end">
<li><a class="dropdown-item" href="#">Profil</a></li>
<li><hr class="dropdown-divider"></li>
<li><a class="dropdown-item" href="#">Sortir</a></li>
</ul>
</li>
</ul>
</div>
</div>
</nav>
</header>
<div class="container mt-5">
<h2 class="mb-5 text-center">Ajouter un article</h2>
<form id="ajouterArticleForm">
<div id="messages" class="mb-3"></div>
<!-- Catégorie -->
<div class="mb-3">
<label class="form-label fw-bold">Catégorie *</label>
<select id="articleCategory" class="form-select">
<option value="">Choisissez une catégorie</option>
<option value="actualités">Actualités</option>
<option value="chien">Chien</option>
<option value="chat">Chat</option>
<option value="boutique">Boutique</option>
</select>
</div>
<!-- Titre -->
<div class="mb-4">
<label class="form-label fw-bold">Titre *</label>
<input type="text" id="articleTitle" class="form-control">
</div>
<!-- Contenu -->
<div class="mb-3">
<label class="form-label fw-bold">Contenu</label>
<textarea id="articleContent"></textarea>
</div>
<!-- Image -->
<div class="mb-4">
<label class="form-label fw-bold">Image</label>
<input type="file" id="articleImage" class="form-control">
</div>
<!-- Publié -->
<div class="form-check mb-3">
<input class="form-check-input" type="checkbox" id="articlePublished">
<label class="form-check-label">Publié</label>
</div>
<!-- Boutons -->
<div class="d-flex gap-3 mt-4">
<a href="../html/accueil_blog.html" class="btn btn-secondary w-50">Annuler</a>
<button type="submit" class="btn btn-primary w-50">Ajouter</button>
</div>
</form>
</div>
<script src="../js/ajouter_article.js"></script>
<script src="../../node_modules/bootstrap/dist/js/bootstrap.bundle.min.js"></script>
<script>
tinymce.init({
selector: '#articleContent',
height: 400,
language: 'fr',
plugins: 'lists fullscreen',
toolbar: 'undo redo | bold italic underline | bullist numlist | fullscreen'
});
</script>
</body>
</html>

View File

@@ -0,0 +1,102 @@
<!DOCTYPE html>
<html lang="fr">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Ajouter une catégorie</title>
<link rel="stylesheet" href="/node_modules/bootstrap/dist/css/bootstrap.min.css">
<link rel="stylesheet" href="/css/blog.css">
</head>
<body>
<header>
<nav class="navbar navbar-expand-xxl bg-body-tertiary shadow-sm">
<div class="container-fluid align-items-center">
<a class="navbar-brand" href="#">L'Il'eau chiens - Admin</a>
<button class="navbar-toggler" type="button" data-bs-toggle="collapse"
data-bs-target="#navbarSupportedContent" aria-controls="navbarSupportedContent"
aria-expanded="false" aria-label="Toggle navigation">
<span class="navbar-toggler-icon"></span>
</button>
<div class="collapse navbar-collapse" id="navbarSupportedContent">
<!-- MENU GAUCHE -->
<ul class="navbar-nav me-auto mb-2 mb-lg-0">
<li class="nav-item"><a class="nav-link active" href="#">Blog</a></li>
<li class="nav-item"><a class="nav-link" href="#">Boutique</a></li>
<li class="nav-item"><a class="nav-link" href="#">Prestations</a></li>
<li class="nav-item"><a class="nav-link" href="#">FAQ</a></li>
<li class="nav-item"><a class="nav-link" href="#">Fiche de renseignements</a></li>
<li class="nav-item"><a class="nav-link" href="#">Partenaires</a></li>
</ul>
<!-- MENU DROIT -->
<ul class="navbar-nav ms-auto mb-2 mb-lg-0">
<li class="nav-item">
<a class="nav-link" href="#"><i class="bi bi-megaphone me-1"></i> Message d'actu</a>
</li>
<li class="nav-item">
<a class="nav-link" href="#"><i class="bi bi-box-arrow-up-right me-1"></i> Voir le site</a>
</li>
<li class="nav-item">
<a class="nav-link" href="#"><i class="bi bi-gear me-1"></i> Configuration</a>
</li>
<li class="nav-item dropdown">
<a class="nav-link dropdown-toggle" href="#" id="userMenu" data-bs-toggle="dropdown">
<i class="bi bi-person-circle me-1"></i> <span id="userFirstName">Prénom</span>
</a>
<ul class="dropdown-menu dropdown-menu-end">
<li><a class="dropdown-item" href="#">Profil</a></li>
<li><hr class="dropdown-divider"></li>
<li><a class="dropdown-item" href="#">Sortir</a></li>
</ul>
</li>
</ul>
</div>
</div>
</nav>
</header>
<div class="container">
<h2 class="mb-5 text-center">Ajouter une catégorie</h2>
<div id="messages" class="mb-3"></div>
<form id="addCategoryForm">
<div class="mb-4">
<label class="form-label fw-bold">Nom de la catégorie *</label>
<input
type="text"
id="categoryName"
class="form-control"
placeholder="Actualité, chien, chat…">
</div>
<div class="mb-3">
<label class="form-label fw-bold">Description</label>
<textarea
id="categoryDescription"
class="form-control"
rows="4"
placeholder="Entrez une description (optionnel)">
</textarea>
</div>
<div class="d-flex gap-3 mt-4">
<a href="../html/accueil_blog.html" class="btn btn-secondary w-50">Annuler</a>
<button type="submit" class="btn btn-primary w-50">Ajouter</button>
</div>
</form>
</div>
<script src="../js/ajouter_categorie.js"></script>
<script src="/node_modules/bootstrap/dist/js/bootstrap.bundle.min.js"></script>
</body>
</html>

View File

@@ -0,0 +1,144 @@
<!DOCTYPE html>
<html lang="fr">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Modifier un article</title>
<link rel="stylesheet" href="../../css/blog.css">
<script src="https://cdn.tiny.cloud/1/1up68ybfp3crmpssl9o7pu6d0e8v3okcnsinhoujnmak7wft/tinymce/6/tinymce.min.js" referrerpolicy="origin"></script>
<link rel="stylesheet" href="/node_modules/bootstrap/dist/css/bootstrap.min.css">
</head>
<body>
<header>
<nav class="navbar navbar-expand-xxl bg-body-tertiary shadow-sm">
<div class="container-fluid align-items-center">
<a class="navbar-brand" href="#">L'Il'eau chiens - Admin</a>
<button class="navbar-toggler" type="button" data-bs-toggle="collapse"
data-bs-target="#navbarSupportedContent" aria-controls="navbarSupportedContent"
aria-expanded="false" aria-label="Toggle navigation">
<span class="navbar-toggler-icon"></span>
</button>
<div class="collapse navbar-collapse" id="navbarSupportedContent">
<!-- MENU GAUCHE -->
<ul class="navbar-nav me-auto mb-2 mb-lg-0">
<li class="nav-item"><a class="nav-link active" href="#">Blog</a></li>
<li class="nav-item"><a class="nav-link" href="#">Boutique</a></li>
<li class="nav-item"><a class="nav-link" href="#">Prestations</a></li>
<li class="nav-item"><a class="nav-link" href="#">FAQ</a></li>
<li class="nav-item"><a class="nav-link" href="#">Fiche de renseignements</a></li>
<li class="nav-item"><a class="nav-link" href="#">Partenaires</a></li>
</ul>
<!-- MENU DROIT -->
<ul class="navbar-nav ms-auto mb-2 mb-lg-0">
<li class="nav-item">
<a class="nav-link" href="#"><i class="bi bi-megaphone me-1"></i> Message d'actu</a>
</li>
<li class="nav-item">
<a class="nav-link" href="#"><i class="bi bi-box-arrow-up-right me-1"></i> Voir le site</a>
</li>
<li class="nav-item">
<a class="nav-link" href="#"><i class="bi bi-gear me-1"></i> Configuration</a>
</li>
<li class="nav-item dropdown">
<a class="nav-link dropdown-toggle" href="#" id="userMenu" data-bs-toggle="dropdown">
<i class="bi bi-person-circle me-1"></i> <span id="userFirstName">Prénom</span>
</a>
<ul class="dropdown-menu dropdown-menu-end">
<li><a class="dropdown-item" href="#">Profil</a></li>
<li><hr class="dropdown-divider"></li>
<li><a class="dropdown-item" href="#">Sortir</a></li>
</ul>
</li>
</ul>
</div>
</div>
</nav>
</header>
<div class="container">
<h2 class="mb-4 text-center">Modifier un article</h2>
<div id="messages" class="mb-3"></div>
<form id="editArticleForm">
<!-- Titre -->
<div class="mb-3">
<label class="form-label fw-bold">Titre *</label>
<input type="text" id="articleTitle" class="form-control">
</div>
<!-- Contenu -->
<div class="mb-3">
<label class="form-label fw-bold">Contenu</label>
<textarea id="articleContent"></textarea>
</div>
<!-- Catégorie -->
<div class="mb-4">
<label class="form-label fw-bold">Catégorie</label>
<input type="text" id="articleCategory" class="form-control" list="categories">
<datalist id="categories">
<option value="actualités">
<option value="chien">
<option value="chat">
<option value="boutique">
</datalist>
</div>
<!-- Image -->
<div class="mb-4">
<label class="fw-bold">Image actuelle</label>
<div>
<img id="imagePreview" class="preview-img mb-2 d-none" alt="apercu image">
<input type="file" id="articleImage" class="form-control">
</div>
</div>
<!-- Publié -->
<div class="form-check mb-3">
<input class="form-check-input" type="checkbox" id="articlePublished">
<label class="form-check-label">Publié (sera publié sur facebook)</label>
</div>
<!-- Boutons -->
<div class="d-flex gap-3 mt-4">
<a href="../../blog/html/accueil_blog.html" class="btn btn-secondary w-50">Annuler</a>
<button type="submit" class="btn btn-primary w-50">Enregistrer</button>
</div>
</form>
</div>
<script src="../js/modifier_article.js"></script>
<script src="/node_modules/bootstrap/dist/js/bootstrap.bundle.min.js"></script>
<script>
tinymce.init({
selector: "#articleContent",
height: 400,
language: "fr",
plugins: "lists fullscreen",
toolbar: "undo redo | bold italic underline | bullist numlist | fullscreen",
branding: false,
promotion: false,
menubar: false
});
</script>
</body>
</html>

View File

@@ -0,0 +1,100 @@
<!DOCTYPE html>
<html lang="fr">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Modifier une catégorie</title>
<link rel="stylesheet" href="../../node_modules/bootstrap/dist/css/bootstrap.min.css">
<link rel="stylesheet" href="../../css/blog.css">
</head>
<body>
<!-- HEADER -->
<header>
<nav class="navbar navbar-expand-xxl bg-body-tertiary shadow-sm">
<div class="container-fluid align-items-center">
<a class="navbar-brand" href="#">L'Il'eau chiens - Admin</a>
<button class="navbar-toggler" type="button" data-bs-toggle="collapse"
data-bs-target="#navbarSupportedContent" aria-controls="navbarSupportedContent"
aria-expanded="false" aria-label="Toggle navigation">
<span class="navbar-toggler-icon"></span>
</button>
<div class="collapse navbar-collapse" id="navbarSupportedContent">
<!-- MENU GAUCHE -->
<ul class="navbar-nav me-auto mb-2 mb-lg-0">
<li class="nav-item"><a class="nav-link active" href="#">Blog</a></li>
<li class="nav-item"><a class="nav-link" href="#">Boutique</a></li>
<li class="nav-item"><a class="nav-link" href="#">Prestations</a></li>
<li class="nav-item"><a class="nav-link" href="#">FAQ</a></li>
<li class="nav-item"><a class="nav-link" href="#">Fiche de renseignements</a></li>
<li class="nav-item"><a class="nav-link" href="#">Partenaires</a></li>
</ul>
<!-- MENU DROIT -->
<ul class="navbar-nav ms-auto mb-2 mb-lg-0">
<li class="nav-item">
<a class="nav-link" href="#"><i class="bi bi-megaphone me-1"></i> Message d'actu</a>
</li>
<li class="nav-item">
<a class="nav-link" href="#"><i class="bi bi-box-arrow-up-right me-1"></i> Voir le site</a>
</li>
<li class="nav-item">
<a class="nav-link" href="#"><i class="bi bi-gear me-1"></i> Configuration</a>
</li>
<li class="nav-item dropdown">
<a class="nav-link dropdown-toggle" href="#" id="userMenu" data-bs-toggle="dropdown">
<i class="bi bi-person-circle me-1"></i> <span id="userFirstName">Prénom</span>
</a>
<ul class="dropdown-menu dropdown-menu-end">
<li><a class="dropdown-item" href="#">Profil</a></li>
<li><hr class="dropdown-divider"></li>
<li><a class="dropdown-item" href="#">Sortir</a></li>
</ul>
</li>
</ul>
</div>
</div>
</nav>
</header>
<div class="container">
<h2 class="mb-5 text-center">Modifier une catégorie</h2>
<form id="modifierCategorie">
<div class="mb-4">
<label class="form-label fw-bold">Nom de la catégorie (obligatoire)</label>
<input type="text" id="categoryName" class="form-control" placeholder="Entrez le nom de la catégorie" required>
</div>
<div class="mb-3">
<label class="form-label fw-bold">Description (optionnel)</label>
<textarea id="categorieDescription" class="form-control" rows="4" placeholder="Entrez une description" required></textarea>
</div>
<div class="d-flex gap-3 mt-4">
<a href="../html/accueil_blog.html" class="btn btn-secondary w-50">Annuler</a>
<button type="submit" class="btn btn-primary w-50">Enregistrer</button>
</div>
</form>
</div>
<script src="../js/modifier_categorie.js"></script>
<script src="../../node_modules/bootstrap/dist/js/bootstrap.bundle.min.js"></script>
</body>
</html>

110
blog/js/ajouter_article.js Normal file
View File

@@ -0,0 +1,110 @@
const form = document.getElementById("ajouterArticleForm");
const messages = document.getElementById("messages");
const imgField = document.getElementById("articleImage");
const titleField = document.getElementById("articleTitle");
const categoryField = document.getElementById("articleCategory");
const publishedField = document.getElementById("articlePublished");
// Simulation BDD
const titresExistants = ["décoration noel", "coupe de chien"];
function showMessage(type, text) {
messages.innerHTML = "";
const div = document.createElement("div");
div.className = `alert alert-${type}`;
div.textContent = text;
messages.appendChild(div);
}
function imageValide(file) {
if (!file) return true;
return ["image/jpeg", "image/png"].includes(file.type);
}
form.addEventListener("submit", function (e) {
e.preventDefault();
messages.innerHTML = "";
const titre = titleField.value.trim();
const titreLower = titre.toLowerCase();
const contenu = tinymce.get("articleContent").getContent().trim();
const categorie = categoryField.value;
const image = imgField.files[0];
const published = publishedField.checked;
// Catégorie obligatoire
if (!categorie) {
showMessage("danger", "Veuillez choisir une catégorie.");
return;
}
// Titre obligatoire
if (!titre) {
showMessage("danger", "Le titre de l'article est obligatoire.");
return;
}
// Titre existant
if (titresExistants.includes(titreLower)) {
showMessage("danger", "Ce titre existe déjà. Choisissez-en un autre.");
return;
}
// Contenu obligatoire
if (!contenu) {
showMessage("danger", "Le contenu de l'article ne peut pas être vide.");
return;
}
// Image valide
if (!imageValide(image)) {
showMessage("danger", "Format d'image invalide. JPG ou PNG uniquement.");
return;
}
// Enregistrement titre simulé
titresExistants.push(titreLower);
// Création article
const nouvelArticle = {
id: Date.now(),
titre,
contenu,
categorie,
published,
date: new Date().toISOString()
};
// LocalStorage
const articles = JSON.parse(localStorage.getItem("articles")) || [];
articles.push(nouvelArticle);
localStorage.setItem("articles", JSON.stringify(articles));
showMessage("success", "Article ajouté avec succès !");
// Reset
form.reset();
tinymce.get("articleContent").setContent("");
// Redirection
setTimeout(() => {
window.location.href = "../html/accueil_blog.html";
}, 1500);
});
/* =========================
TinyMCE
========================= */
tinymce.init({
selector: "#articleContent",
height: 400,
language: "fr",
plugins: "lists fullscreen",
toolbar: "undo redo | bold italic underline | bullist numlist | fullscreen"
});

View File

@@ -0,0 +1,52 @@
const form = document.getElementById("addCategoryForm");
const messages = document.getElementById("messages");
const nameField = document.getElementById("categoryName");
const descField = document.getElementById("categoryDescription");
// Catégories existantes (simulation BDD)
const existingCategories = ["Actualités", "Chien", "Chat", "Boutique"];
function showMessage(type, text) {
messages.innerHTML = "";
const div = document.createElement("div");
div.className = `alert alert-${type}`;
div.textContent = text;
messages.appendChild(div);
}
form.addEventListener("submit", function (e) {
e.preventDefault();
messages.innerHTML = "";
const nom = nameField.value.trim();
// Champ obligatoire
if (!nom) {
showMessage("danger", "Le nom de la catégorie est obligatoire.");
return;
}
// Catégorie existante
if (existingCategories.includes(nom)) {
showMessage("danger", "Cette catégorie existe déjà. Veuillez en choisir une autre.");
return;
}
// Ajout catégorie (simulation)
existingCategories.push(nom);
showMessage("success", "Catégorie ajoutée avec succès !");
// Reset formulaire
form.reset();
// Redirection
setTimeout(() => {
window.location.href = "../html/accueil_blog.html";
}, 1500);
});

67
blog/js/liste_articles.js Normal file
View File

@@ -0,0 +1,67 @@
// Sélecteur du tableau
const articlesTableBody = document.getElementById("articlesTableBody");
// Charger les articles depuis le localStorage
let articles = JSON.parse(localStorage.getItem("articles")) || [];
// Fonction d'affichage des articles
function afficherArticles() {
articlesTableBody.innerHTML = ""; // Nettoie le tableau
if (articles.length === 0) {
articlesTableBody.innerHTML = `
<tr>
<td colspan="2" class="text-center text-muted py-3">
Aucun article pour le moment.
</td>
</tr>
`;
return;
}
articles.forEach(article => {
const tr = document.createElement("tr");
tr.innerHTML = `
<td>
${article.titre}
${article.published ? '<span class="badge bg-primary ms-2">Publié Facebook</span>' : ''}
</td>
<td class="text-end">
<a href="modifier_article.html?id=${article.id}"
class="btn btn-sm btn-outline-primary me-1">Modifier</a>
<button class="btn btn-sm btn-outline-danger delete-btn" data-id="${article.id}">
Supprimer
</button>
</td>
`;
articlesTableBody.appendChild(tr);
});
}
// Gestion de suppression
document.addEventListener("click", function (e) {
const btn = e.target.closest(".delete-btn");
if (!btn) return;
const row = btn.closest("tr");
const titre = row.querySelector("td").textContent.trim();
const id = Number(btn.dataset.id);
if (confirm(`Voulez-vous vraiment supprimer l'article : "${titre}" ?`)) {
// Supprimer dans le tableau local
articles = articles.filter(article => article.id !== id);
localStorage.setItem("articles", JSON.stringify(articles));
// Supprimer visuel
row.remove();
alert("Article supprimé !");
}
});
// Lancer l'affichage dès que la page charge
afficherArticles();

View File

@@ -17,14 +17,15 @@ function afficherCategories() {
const row = ` const row = `
<tr> <tr>
<td>${cat.nom}</td> <td>${cat.nom}</td>
<td>${cat.description || "-"}</td>
<td class="text-center"> <td class="text-end">
<a href="../modifier_categorie/modifier_categorie.html?id=${cat.id}" class="btn btn-warning btn-sm"> <a href="../html/modifier_categorie.html?id=${cat.id}"
class="btn btn-sm btn-outline-primary me-1">
Modifier Modifier
</a> </a>
<button class="btn btn-danger btn-sm" onclick="supprimerCategorie(${index})"> <button class="btn btn-sm btn-outline-danger"
onclick="supprimerCategorie(${index})">
Supprimer Supprimer
</button> </button>
</td> </td>

View File

@@ -0,0 +1,74 @@
const form = document.getElementById("editArticleForm");
const messages = document.getElementById("messages");
const imgField = document.getElementById("articleImage");
const titleField = document.getElementById("articleTitle");
const contentField = document.getElementById("articleContent");
const categoryField = document.getElementById("articleCategory");
const publishedField = document.getElementById("articlePublished");
// Simulation BDD pour doublons
const titresExistants = [
"article de test",
"nouveautés chiens",
"actualité du mois"
];
function showMessage(type, text) {
messages.innerHTML = "";
const div = document.createElement("div");
div.className = `alert alert-${type}`;
div.textContent = text;
messages.appendChild(div);
}
function imageValide(file) {
if (!file) return true;
return ["image/jpeg", "image/png", "image/gif"].includes(file.type);
}
form.addEventListener("submit", function (e) {
e.preventDefault();
messages.innerHTML = "";
const titre = titleField.value.trim().toLowerCase();
const contenu = tinymce.get("articleContent").getContent().trim();
const image = imgField.files[0];
// Titre obligatoire
if (!titre) {
showMessage("danger", "Le titre de l'article est obligatoire.");
return;
}
// Titre existant
if (titresExistants.includes(titre)) {
showMessage("danger", "Ce titre existe déjà. Veuillez en choisir un autre.");
return;
}
// Contenu obligatoire
if (!contenu) {
showMessage("danger", "Le contenu de l'article ne peut pas être vide.");
return;
}
// Image valide
if (!imageValide(image)) {
showMessage("danger", "Format d'image invalide. JPG, PNG ou GIF uniquement.");
return;
}
// Succès
showMessage("success", "L'article a été modifié avec succès !");
// Redirection
setTimeout(() => {
window.location.href = "../../blog/html/accueil_blog.html";
}, 1500);
});

View File

@@ -0,0 +1,37 @@
const form = document.getElementById("modifierCategorie");
const nameField = document.getElementById("categoryName");
const descField = document.getElementById("categorieDescription");
// Fonction pour afficher un message Bootstrap
function showMessage(type, message) {
// Création de l'alert
const alert = document.createElement("div");
alert.className = `alert alert-${type} mt-3`;
alert.textContent = message;
// Ajout en haut du formulaire
form.prepend(alert);
// Suppression automatique après 2 secondes
setTimeout(() => {
alert.remove();
}, 2000);
}
form.addEventListener("submit", function (e) {
e.preventDefault();
// Vérification des champs obligatoires
if (nameField.value.trim() === "" || descField.value.trim() === "") {
showMessage("danger", "Veuillez remplir tous les champs obligatoires");
return;
}
// Message succès
showMessage("success", "La catégorie a été modifiée avec succès !");
// Redirection après succès
setTimeout(() => {
window.location.href = "../html/accueil_blog.html";
}, 1500);
});

174
citations/html/accueil.html Normal file
View File

@@ -0,0 +1,174 @@
<!DOCTYPE html>
<html lang="fr">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Citations - L'Il'eau chiens - Admin</title>
<link href="/node_modules/bootstrap/dist/css/bootstrap.min.css" rel="stylesheet">
<link rel="stylesheet" href="/node_modules/bs-icon/icons.css">
<link rel="shortcut icon" href="favicon.png" type="image/png">
<link rel="stylesheet" href="/css/style.css">
<link rel="stylesheet" href="/css/citations.css">
<link rel="shortcut icon" href="/favicon.png" type="image/png">
</head>
<body>
<header>
<nav class="navbar navbar-expand-xxl bg-body-tertiary">
<div class="container-fluid align-items-center">
<a class="navbar-brand" href="#">L'Il'eau chiens - Admin</a>
<button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarSupportedContent" aria-controls="navbarSupportedContent" aria-expanded="false" aria-label="Toggle navigation">
<span class="navbar-toggler-icon"></span>
</button>
<div class="collapse navbar-collapse" id="navbarSupportedContent">
<ul class="navbar-nav me-auto mb-2 mb-lg-0">
<li class="nav-item"><a class="nav-link left-label" aria-current="page" href="#">Blog</a></li>
<li class="nav-item"><a class="nav-link left-label" href="#">Boutique</a></li>
<li class="nav-item"><a class="nav-link left-label" href="#">Prestations</a></li>
<li class="nav-item"><a class="nav-link left-label" href="#">FAQ</a></li>
<li class="nav-item"><a class="nav-link left-label" href="#">Fiche renseignements</a></li>
<li class="nav-item"><a class="nav-link left-label" href="#">Partenaires</a></li>
<li class="nav-item"><a class="nav-link active left-label" href="#">Citations</a></li>
</ul>
<ul class="navbar-nav ms-auto mb-2 mb-lg-0">
<li class="nav-item"><a class="nav-link" href="#"><i class="bi bi-megaphone me-1"></i> Message d'actu</a></li>
<li class="nav-item"><a class="nav-link" href="#"><i class="bi bi-box-arrow-up-right me-1"></i> Voir le site</a></li>
<li class="nav-item"><a class="nav-link" href="#"><i class="bi bi-gear me-1"></i> Configuration</a></li>
<li class="nav-item dropdown">
<a class="nav-link dropdown-toggle" href="#" id="userMenu" role="button" data-bs-toggle="dropdown" aria-expanded="false">
<i class="bi bi-person-circle me-1"></i> <span id="userFirstName">Prénom</span>
</a>
<ul class="dropdown-menu dropdown-menu-end" aria-labelledby="userMenu">
<li><a class="dropdown-item" href="#">Profil</a></li>
<li><hr class="dropdown-divider"></li>
<li><a class="dropdown-item" href="#">Sortir</a></li>
</ul>
</li>
</ul>
</div>
</div>
</nav>
</header>
<main class="my-5 fs-6">
<div class="container">
<header>
<h1 class="title my-4 fs-2">Liste des citations</h1>
</header>
<div class="content">
<div class="ajouter">
<a href="#" class="btn btn-primary">Ajouter une citation</a>
</div>
<section class="chiens my-4">
<h2 class="fs-4">Citations chiens</h2>
<table class="table table-striped table-hover">
<thead class="table-dark">
<tr>
<th>Citations</th>
<th class="text-end">Actions</th>
</tr>
</thead>
<tbody>
<tr>
<td>Le chien est le seul être sur terre qui vous aime plus qu'il ne s'aime lui-même. (Josh Billings)</td>
<td class="text-end">
<a href="#" class="btn btn-sm btn-outline-primary me-2">Modifier</a>
<a href="index.php" class="btn btn-sm btn-outline-danger" role="button" data-bs-toggle="modal" data-bs-target="#confirmDeleteModal">Supprimer</a>
</td>
</tr>
<tr>
<td>Un chien est la seule chose sur terre qui vous aime plus qu'il ne s'aime lui-même. (Josh Billings)</td>
<td class="text-end">
<a href="#" class="btn btn-sm btn-outline-primary me-2">Modifier</a>
<a href="#" class="btn btn-sm btn-outline-danger" role="button" data-bs-toggle="modal" data-bs-target="#confirmDeleteModal">Supprimer</a>
</td>
</tr>
</tbody>
</table>
</section>
<section class="chats my-4">
<h2 class="fs-4">Citations chats</h2>
<table class="table table-striped table-hover">
<thead class="table-dark">
<tr>
<th>Citations</th>
<th class="text-end">Actions</th>
</tr>
</thead>
<tbody>
<tr>
<td>Le chien est le seul être sur terre qui vous aime plus qu'il ne s'aime lui-même. (Josh Billings)</td>
<td class="text-end">
<a href="#" class="btn btn-sm btn-outline-primary me-2">Modifier</a>
<a href="index.php?suppression" class="btn btn-sm btn-outline-danger" role="button" data-bs-toggle="modal" data-bs-target="#confirmDeleteModal">Supprimer</a>
</td>
</tr>
<tr>
<td>Un chien est la seule chose sur terre qui vous aime plus qu'il ne s'aime lui-même. (Josh Billings)</td>
<td class="text-end">
<a href="#" class="btn btn-sm btn-outline-primary me-2">Modifier</a>
<a href="#" class="btn btn-sm btn-outline-danger" role="button" data-bs-toggle="modal" data-bs-target="#confirmDeleteModal">Supprimer</a>
</td>
</tr>
</tbody>
</table>
</section>
<section class="divers my-4">
<h2 class="fs-4">Citations divers</h2>
<table class="table table-striped table-hover">
<thead class="table-dark">
<tr>
<th>Citations</th>
<th class="text-end">Actions</th>
</tr>
</thead>
<tbody>
<tr>
<td>Le chien est le seul être sur terre qui vous aime plus qu'il ne s'aime lui-même. (Josh Billings)</td>
<td class="text-end">
<a href="#" class="btn btn-sm btn-outline-primary me-2">Modifier</a>
<a href="index.php?suppression" class="btn btn-sm btn-outline-danger" role="button" data-bs-toggle="modal" data-bs-target="#confirmDeleteModal">Supprimer</a>
</td>
</tr>
<tr>
<td>Un chien est la seule chose sur terre qui vous aime plus qu'il ne s'aime lui-même. (Josh Billings)</td>
<td class="text-end">
<a href="#" class="btn btn-sm btn-outline-primary me-2">Modifier</a>
<a href="#" class="btn btn-sm btn-outline-danger" role="button" data-bs-toggle="modal" data-bs-target="#confirmDeleteModal">Supprimer</a>
</td>
</tr>
</tbody>
</table>
</section>
</div>
</div>
</main>
<div class="modal fade" id="confirmDeleteModal" tabindex="-1">
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title">Confirmer la suppression</h5>
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
</div>
<div class="modal-body">
Êtes-vous sûr de vouloir supprimer cette citation ? Cette action est définitive.
</div>
<div class="modal-footer">
<button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Annuler</button>
<button type="button" class="btn btn-danger" id="confirmDeleteBtn">Supprimer</button>
</div>
</div>
</div>
</div>
<script src="/node_modules/bootstrap/dist/js/bootstrap.bundle.min.js"></script>
<script src="/js/contentReduct.js"></script>
<script src="/js/confirmDelete.js"></script>
</body>
</html>

View File

@@ -0,0 +1,93 @@
<!DOCTYPE html>
<html lang="fr">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Ajouter une citation - L'Il'eau chiens - Admin</title>
<link href="/node_modules/bootstrap/dist/css/bootstrap.min.css" rel="stylesheet">
<link rel="stylesheet" href="/node_modules/bs-icon/icons.css">
<link rel="shortcut icon" href="favicon.png" type="image/png">
<link rel="stylesheet" href="/css/style.css">
<link rel="shortcut icon" href="/favicon.png" type="image/png">
</head>
<body>
<header>
<nav class="navbar navbar-expand-xxl bg-body-tertiary">
<div class="container-fluid align-items-center">
<a class="navbar-brand" href="#">L'Il'eau chiens - Admin</a>
<button class="navbar-toggler" type="button" data-bs-toggle="collapse"
data-bs-target="#navbarSupportedContent" aria-controls="navbarSupportedContent"
aria-expanded="false" aria-label="Toggle navigation">
<span class="navbar-toggler-icon"></span>
</button>
<div class="collapse navbar-collapse" id="navbarSupportedContent">
<ul class="navbar-nav me-auto mb-2 mb-lg-0">
<li class="nav-item"><a class="nav-link left-label" aria-current="page" href="#">Blog</a></li>
<li class="nav-item"><a class="nav-link left-label" href="#">Boutique</a></li>
<li class="nav-item"><a class="nav-link left-label" href="#">Prestations</a></li>
<li class="nav-item"><a class="nav-link left-label" href="#">FAQ</a></li>
<li class="nav-item"><a class="nav-link left-label" href="#">Fiche renseignements</a></li>
<li class="nav-item"><a class="nav-link left-label" href="#">Partenaires</a></li>
<li class="nav-item"><a class="nav-link active left-label" href="#">Citations</a></li>
</ul>
<ul class="navbar-nav ms-auto mb-2 mb-lg-0">
<li class="nav-item"><a class="nav-link" href="#"><i class="bi bi-megaphone me-1"></i> Message
d'actu</a></li>
<li class="nav-item"><a class="nav-link" href="#"><i class="bi bi-box-arrow-up-right me-1"></i>
Voir le site</a></li>
<li class="nav-item"><a class="nav-link" href="#"><i class="bi bi-gear me-1"></i>
Configuration</a></li>
<li class="nav-item dropdown">
<a class="nav-link dropdown-toggle" href="#" id="userMenu" role="button"
data-bs-toggle="dropdown" aria-expanded="false">
<i class="bi bi-person-circle me-1"></i> <span id="userFirstName">Prénom</span>
</a>
<ul class="dropdown-menu dropdown-menu-end" aria-labelledby="userMenu">
<li><a class="dropdown-item" href="#">Profil</a></li>
<li>
<hr class="dropdown-divider">
</li>
<li><a class="dropdown-item" href="#">Sortir</a></li>
</ul>
</li>
</ul>
</div>
</div>
</nav>
</header>
<main class="my-5 fs-6">
<div class="container">
<header>
<h1 class="title my-4 fs-2">Ajouter une citation</h1>
</header>
<div class="content">
<form id="ajouterArticleForm">
<div class="mb-4 quote-addition">
<label class="form-label fw-bold" for="citation">La citations (obligatoire)</label>
<input type="text" id="citation" class="form-control"
placeholder="Il faut ne jamais abandonner..." required>
</div>
<div class="mb-3 citation-category">
<label class="form-label fw-bold" for="citationCategory">Catégorie de la citation (obligatoire)</label>
<select id="citationCategory" class="form-select" required>
<option value="" disabled selected>Choisissez une catégorie</option>
<option value="chiens">Chiens</option>
<option value="chats">Chats</option>
<option value="divers">Divers</option>
</select>
</div>
<div class="d-flex gap-3 mt-4 confirmation-buttons">
<a href="./accueil.html" class="btn btn-secondary w-50">Annuler</a>
<button type="submit" class="btn btn-primary w-50">Ajouter</button>
</div>
</form>
</div>
</div>
</main>
<script src="/node_modules/bootstrap/dist/js/bootstrap.bundle.min.js"></script>
</body>
</html>

View File

@@ -0,0 +1,93 @@
<!DOCTYPE html>
<html lang="fr">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Modifier une citation - L'Il'eau chiens - Admin</title>
<link href="/node_modules/bootstrap/dist/css/bootstrap.min.css" rel="stylesheet">
<link rel="stylesheet" href="/node_modules/bs-icon/icons.css">
<link rel="shortcut icon" href="favicon.png" type="image/png">
<link rel="stylesheet" href="/css/style.css">
<link rel="shortcut icon" href="/favicon.png" type="image/png">
</head>
<body>
<header>
<nav class="navbar navbar-expand-xxl bg-body-tertiary">
<div class="container-fluid align-items-center">
<a class="navbar-brand" href="#">L'Il'eau chiens - Admin</a>
<button class="navbar-toggler" type="button" data-bs-toggle="collapse"
data-bs-target="#navbarSupportedContent" aria-controls="navbarSupportedContent"
aria-expanded="false" aria-label="Toggle navigation">
<span class="navbar-toggler-icon"></span>
</button>
<div class="collapse navbar-collapse" id="navbarSupportedContent">
<ul class="navbar-nav me-auto mb-2 mb-lg-0">
<li class="nav-item"><a class="nav-link left-label" aria-current="page" href="#">Blog</a></li>
<li class="nav-item"><a class="nav-link left-label" href="#">Boutique</a></li>
<li class="nav-item"><a class="nav-link left-label" href="#">Prestations</a></li>
<li class="nav-item"><a class="nav-link left-label" href="#">FAQ</a></li>
<li class="nav-item"><a class="nav-link left-label" href="#">Fiche renseignements</a></li>
<li class="nav-item"><a class="nav-link left-label" href="#">Partenaires</a></li>
<li class="nav-item"><a class="nav-link active left-label" href="#">Citations</a></li>
</ul>
<ul class="navbar-nav ms-auto mb-2 mb-lg-0">
<li class="nav-item"><a class="nav-link" href="#"><i class="bi bi-megaphone me-1"></i> Message
d'actu</a></li>
<li class="nav-item"><a class="nav-link" href="#"><i class="bi bi-box-arrow-up-right me-1"></i>
Voir le site</a></li>
<li class="nav-item"><a class="nav-link" href="#"><i class="bi bi-gear me-1"></i>
Configuration</a></li>
<li class="nav-item dropdown">
<a class="nav-link dropdown-toggle" href="#" id="userMenu" role="button"
data-bs-toggle="dropdown" aria-expanded="false">
<i class="bi bi-person-circle me-1"></i> <span id="userFirstName">Prénom</span>
</a>
<ul class="dropdown-menu dropdown-menu-end" aria-labelledby="userMenu">
<li><a class="dropdown-item" href="#">Profil</a></li>
<li>
<hr class="dropdown-divider">
</li>
<li><a class="dropdown-item" href="#">Sortir</a></li>
</ul>
</li>
</ul>
</div>
</div>
</nav>
</header>
<main class="my-5 fs-6">
<div class="container">
<header>
<h1 class="title my-4 fs-2">Modifier une citation</h1>
</header>
<div class="content">
<form id="ajouterArticleForm">
<div class="mb-4 quote-addition">
<label class="form-label fw-bold" for="citation">La citations (obligatoire)</label>
<input type="text" id="citation" class="form-control"
placeholder="Il faut ne jamais abandonner..." value="La citation à modifier" required>
</div>
<div class="mb-3 citation-category">
<label class="form-label fw-bold" for="citationCategory">Catégorie de la citation (obligatoire)</label>
<select id="citationCategory" class="form-select" required>
<option value="" disabled>Choisissez une catégorie</option>
<option value="chiens" selected>Chiens</option>
<option value="chats">Chats</option>
<option value="divers">Divers</option>
</select>
</div>
<div class="d-flex gap-3 mt-4 confirmation-buttons">
<a href="./accueil.html" class="btn btn-secondary w-50">Annuler</a>
<button type="submit" class="btn btn-primary w-50">Ajouter</button>
</div>
</form>
</div>
</div>
</main>
<script src="/node_modules/bootstrap/dist/js/bootstrap.bundle.min.js"></script>
</body>
</html>

View File

@@ -0,0 +1,56 @@
<!DOCTYPE html>
<html lang="fr">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Mot de passe oublié</title>
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/css/bootstrap.min.css" />
<style>
body {
background: #f4f6f981;
height: 100vh;
display: flex;
justify-content: center;
align-items: center;
}
.forgot-password-card {
width: 100%;
max-width: 380px;
}
</style>
</head>
<body>
<div class="card shadow forgot-password-card">
<div class="card-body p-4">
<h1 class="text-center mb-4 fs-3">Mot de passe oublié</h1>
<p class="text text-muted mb-4">
Nous avons besoin de votre adresse mail pour pouvoir réinitialiser
votre mot de passe.
</p>
<form>
<div class="mb-3">
<label class="form-label" for="email">Adresse e-mail</label>
<input type="email" class="form-control" placeholder="exemple@mail.com" required />
</div>
<button class="btn btn-primary w-100" type="submit">
Réinitialiser le mot de passe
</button>
<div class="text-center mt-3">
<a href="../html/page_de_connexion.html" class="text-decoration-none">Retour à la connexion</a>
</div>
</form>
</div>
</div>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/js/bootstrap.bundle.min.js"></script>
</body>
</html>

View File

@@ -26,32 +26,45 @@
<body> <body>
<div class="card shadow login-card"> <div class="card shadow login-card">
<div class="card-body p-4"> <div class="card-body p-4">
<h3 class="text-center mb-4">Connexion Admin</h3> <h1 class="text-center mb-4 fs-3">Connexion Admin</h1>
<form> <form>
<div class="mb-3"> <div class="mb-3">
<label class="form-label">Mot de passe</label>
<label class="form-label">Adresse e-mail </label>
<input
type="email"
class="form-control"
id="textInput"
/>
</div>
<div class="mb-3">
<label class="form-label" for="password">Mot de passe</label>
<input <input
type="password" type="password"
class="form-control" class="form-control"
id="password" id="password"
placeholder="••••••••"
/> />
<label for="showPassword"> <label for="showPassword" class="mt-2">
<input type="checkbox" id="showPassword" /> <input type="checkbox" id="showPassword" />
Voir le mot de passe Voir le mot de passe
</label> </label>
</div> </div>
<button class="btn btn-primary w-100">Se connecter</button> <button class="btn btn-primary w-100" type="submit">Se connecter</button>
<div class="text-center mt-3"> <div class="text-center mt-3">
<a href="../mot_de_passe_oublie/mot_de_passe_oublie.html" class="text-decoration-none">Mot de passe oublié ?</a> <a href="../html/mot_de_passe_oublie.html" class="text-decoration-none">Mot de passe oublié ?</a>
</div> </div>
</form> </form>
</div> </div>
</div> </div>
<script src="page_de_connexion.js"></script> <script src="../js/page_de_connexion.js"></script>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/js/bootstrap.bundle.min.js"></script> <script src="../../node_modules/bootstrap/dist/js/bootstrap.bundle.min.js"></script>
</body> </body>
</html> </html>

View File

@@ -26,8 +26,8 @@
<body> <body>
<div class="card shadow reset-password-card"> <div class="card shadow reset-password-card">
<div class="card-body p-4"> <div class="card-body p-4">
<h3 class="text-center mb-4">Nouveau mot de passe</h3> <h1 class="text-center mb-4 fs-3">Nouveau mot de passe</h1>
<p class="text-center text-muted mb-4"> <p class="text text-muted mb-4">
Pour réinitialiser votre mot de passe, veuillez saisir un nouveau mot Pour réinitialiser votre mot de passe, veuillez saisir un nouveau mot
de passe ainsi qu'une confirmation. de passe ainsi qu'une confirmation.
@@ -35,14 +35,14 @@
<div <div
id="errorMsg" id="errorMsg"
class="alert alert-danger text-center" class="alert alert-danger text-center fs-1"
style="display: none" style="display: none"
> >
Les mots de passe ne correspondent pas. Les mots de passe ne correspondent pas.
</div> </div>
<form id="resetForm"> <form id="resetForm">
<div class="mb-3"> <div class="mb-4">
<label class="form-label" <label class="form-label"
>Nouveau mot de passe (minimum 8 caractères)</label >Nouveau mot de passe (minimum 8 caractères)</label
> >
@@ -52,12 +52,12 @@
id="password" id="password"
required required
/> />
<small id="passwordIndicator" class="fw-bold"</small> <small id="passwordIndicator" class="fw-bold"></small>
</div> </div>
<div class="mb-3"> <div class="mb-3">
<label class="form-label" <label class="form-label"
>Confirmer le mot de passe (minimum 8 caractères)</label >Confirmer le mot de passe</label
> >
<input <input
type="password" type="password"
@@ -65,7 +65,7 @@
id="confirmPassword" id="confirmPassword"
required required
/> />
<label for="showPassword"> <label for="showPassword" class="mt-3">
<input type="checkbox" id="showPassword" /> <input type="checkbox" id="showPassword" />
Voir le mot de passe Voir le mot de passe
</label> </label>
@@ -86,10 +86,15 @@
<button class="btn btn-primary w-100" type="submit"> <button class="btn btn-primary w-100" type="submit">
Changer le mot de passe Changer le mot de passe
</button> </button>
<div class="text-center mt-3">
<a
href="../html/page_de_connexion.html"
class="text-decoration-none"
>Retour à la connexion</a
</form> </form>
</div> </div>
</div> </div>
<script src="reinitialisation_du_mot_de_passe.js"></script> <script src="../js/reinitialisation_du_mot_de_passe.js"></script>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/js/bootstrap.bundle.min.js"></script> <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/js/bootstrap.bundle.min.js"></script>
</body> </body>
</html> </html>

View File

@@ -49,6 +49,12 @@ form.addEventListener('submit', function(e) {
errorMsg.textContent = 'Les mots de passe ne correspondent pas.'; errorMsg.textContent = 'Les mots de passe ne correspondent pas.';
return; return;
} }
successMsg.style.display = 'block';
// Redirection après 1 seconde
setTimeout(() => {
window.location.href = "../html/page_de_connexion.html";
}, 1000);
}); });

View File

@@ -1,55 +0,0 @@
<!DOCTYPE html>
<html lang="fr">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Mot de passe oublié</title>
<link
rel="stylesheet"
href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/css/bootstrap.min.css"
/>
<style>
body {
background: #f4f6f981;
height: 100vh;
display: flex;
justify-content: center;
align-items: center;
}
.forgot-password-card {
width: 100%;
max-width: 380px;
}
</style>
</head>
<body>
<div class="card shadow forgot-password-card">
<div class="card-body p-4">
<h3 class="text-center mb-4">Mot de passe oublié</h3>
<form>
<div class="mb-3">
<label class="form-label">Adresse e-mail</label>
<input
type="email"
class="form-control"
placeholder="exemple@mail.com"
/>
</div>
<button class="btn btn-primary w-100">
Réinitialiser le mot de passe
</button>
<div class="text-center mt-3">
<a href="../page_de_connexion/page_de_connexion.html" class="text-decoration-none"
>Retour à la connexion</a
>
</div>
</form>
</div>
</div>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/js/bootstrap.bundle.min.js"></script>
</body>
</html>

10
css/avant_apres.css Normal file
View File

@@ -0,0 +1,10 @@
/*=============================================================================
Image Preview Styles
=============================================================================*/
.img-preview {
max-width: 150px;
border-radius: 8px;
display: none;
/* cachée tant qu'il n'y a pas d'image */
}

11
css/blog.css Normal file
View File

@@ -0,0 +1,11 @@
body {
background: #f4f6f9;
}
.container {
margin: 40px auto;
}
.ck-editor__editable {
min-height: 350px;
}

0
css/citations.css Normal file
View File

2
css/prestation.css Normal file
View File

@@ -0,0 +1,2 @@
body { background: #f4f6f981; }
.container { margin-top: 50px; }

50
css/style.css Normal file
View File

@@ -0,0 +1,50 @@
/*=============================================================================
Header Navbar Styles
=============================================================================*/
a.nav-link{
font-size: .95rem;
}
.navbar-brand {
font-size: 1.1rem;
line-height: 1;
padding-top: 0.25rem;
padding-bottom: 0.25rem;
}
.brand-sep {
height: .8rem;
}
@media (max-width: 1399.98px) {
.navbar .nav-item {
background-color: var(--bs-light);
border: 1px solid var(--bs-border-color);
border-radius: .25rem;
margin-bottom: .375rem;
text-align: center;
}
#navbarSupportedContent>ul:first-child {
margin-top: .5rem;
}
#navbarSupportedContent>ul:last-child {
margin-top: 1rem;
}
.bi {
display: none;
}
}
/*=============================================================================
Divers
=============================================================================*/
a.tox-promotion-link {
display: none !important;
}

169
faq/accueil.html Normal file
View File

@@ -0,0 +1,169 @@
<!DOCTYPE html>
<html lang="fr">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>FAQ - L'Il'eau chiens - Admin</title>
<link href="/node_modules/bootstrap/dist/css/bootstrap.min.css" rel="stylesheet">
<link rel="stylesheet" href="/node_modules/bs-icon/icons.css">
<link rel="stylesheet" href="/css/style.css">
<link rel="stylesheet" href="/css/citations.css">
<link rel="shortcut icon" href="/favicon.png" type="image/png">
</head>
<body>
<header>
<nav class="navbar navbar-expand-xxl bg-body-tertiary">
<div class="container-fluid align-items-center">
<a class="navbar-brand" href="#">L'Il'eau chiens - Admin</a>
<button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarSupportedContent"
aria-controls="navbarSupportedContent" aria-expanded="false" aria-label="Toggle navigation">
<span class="navbar-toggler-icon"></span>
</button>
<div class="collapse navbar-collapse" id="navbarSupportedContent">
<ul class="navbar-nav me-auto mb-2 mb-lg-0">
<li class="nav-item"><a class="nav-link left-label" href="#">Blog</a></li>
<li class="nav-item"><a class="nav-link left-label" href="#">Boutique</a></li>
<li class="nav-item"><a class="nav-link left-label" href="#">Prestations</a></li>
<li class="nav-item"><a class="nav-link active left-label" href="#">FAQ</a></li>
<li class="nav-item"><a class="nav-link left-label" href="#">Fiche renseignements</a></li>
<li class="nav-item"><a class="nav-link left-label" href="#">Partenaires</a></li>
<li class="nav-item"><a class="nav-link left-label" href="#">Citations</a></li>
</ul>
<ul class="navbar-nav ms-auto mb-2 mb-lg-0">
<li class="nav-item"><a class="nav-link" href="#"><i class="bi bi-megaphone me-1"></i> Message d'actu</a>
</li>
<li class="nav-item"><a class="nav-link" href="#"><i class="bi bi-box-arrow-up-right me-1"></i> Voir le
site</a></li>
<li class="nav-item"><a class="nav-link" href="#"><i class="bi bi-gear me-1"></i> Configuration</a></li>
<li class="nav-item dropdown">
<a class="nav-link dropdown-toggle" href="#" id="userMenu" role="button" data-bs-toggle="dropdown"
aria-expanded="false">
<i class="bi bi-person-circle me-1"></i> <span id="userFirstName">Prénom</span>
</a>
<ul class="dropdown-menu dropdown-menu-end" aria-labelledby="userMenu">
<li><a class="dropdown-item" href="#">Profil</a></li>
<li>
<hr class="dropdown-divider">
</li>
<li><a class="dropdown-item" href="#">Sortir</a></li>
</ul>
</li>
</ul>
</div>
</div>
</nav>
</header>
<main class="my-5 fs-6">
<div class="container">
<header>
<h1 class="title my-4 fs-2">Liste des FAQ</h1>
</header>
<div class="content">
<section class="themes my-4">
<h2 class="fs-4">Gérer les thèmes des questions</h2>
<div class="d-flex justify-content-start mb-4">
<a href="ajouter.html" class="btn btn-primary">Ajouter un thème</a>
</div>
<table class="table table-striped table-hover">
<thead class="table-dark">
<tr>
<th>Thème</th>
<th class="text-end">Actions</th>
</tr>
</thead>
<tbody>
<tr>
<td>Chiens</td>
<td class="text-end">
<a href="#" class="btn btn-sm btn-outline-primary me-2">Modifier</a>
<a href="index.php" class="btn btn-sm btn-outline-danger" role="button" data-bs-toggle="modal"
data-bs-target="#confirmDeleteModal">Supprimer</a>
</td>
</tr>
<tr>
<td>Chat</td>
<td class="text-end">
<a href="#" class="btn btn-sm btn-outline-primary me-2">Modifier</a>
<a href="#" class="btn btn-sm btn-outline-danger" role="button" data-bs-toggle="modal"
data-bs-target="#confirmDeleteModal">Supprimer</a>
</td>
</tr>
<tr>
<td>Autres questions</td>
<td class="text-end">
<a href="#" class="btn btn-sm btn-outline-primary me-2">Modifier</a>
<a href="#" class="btn btn-sm btn-outline-danger" role="button" data-bs-toggle="modal"
data-bs-target="#confirmDeleteModal">Supprimer</a>
</td>
</tr>
</tbody>
</table>
</section>
<section class="questions my-5">
<h2 class="fs-4">Gérer les questions</h2>
<div class="d-flex justify-content-start mb-4">
<a href="ajouter.html" class="btn btn-primary">Ajouter une question</a>
</div>
<table class="table table-striped table-hover">
<thead class="table-dark">
<tr>
<th>Questions</th>
<th class="text-end">Actions</th>
</tr>
</thead>
<tbody>
<tr>
<td>Pourquoi les chiens lèvent-ils la patte pour uriner ?</td>
<td class="text-end">
<a href="#" class="btn btn-sm btn-outline-primary me-2">Modifier</a>
<a href="index.php?suppression" class="btn btn-sm btn-outline-danger" role="button"
data-bs-toggle="modal" data-bs-target="#confirmDeleteModal">Supprimer</a>
</td>
</tr>
<tr>
<td>Comment savoir si mon chat est heureux ?</td>
<td class="text-end">
<a href="#" class="btn btn-sm btn-outline-primary me-2">Modifier</a>
<a href="#" class="btn btn-sm btn-outline-danger" role="button" data-bs-toggle="modal"
data-bs-target="#confirmDeleteModal">Supprimer</a>
</td>
</tr>
</tbody>
</table>
</section>
</div>
</div>
</main>
<div class="modal fade" id="confirmDeleteModal" tabindex="-1">
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title">Confirmer la suppression</h5>
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
</div>
<div class="modal-body">
Êtes-vous sûr de vouloir supprimer ce thème ou cette question ? Cette action est irréversible.
<div class="modal-footer">
<button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Annuler</button>
<button type="button" class="btn btn-danger" id="confirmDeleteBtn">Supprimer</button>
</div>
</div>
</div>
</div>
<script src="/node_modules/bootstrap/dist/js/bootstrap.bundle.min.js"></script>
<script src="/js/contentReduct.js"></script>
<script src="/js/confirmDelete.js"></script>
</body>
</html>

103
faq/ajouter_question.html Normal file
View File

@@ -0,0 +1,103 @@
<!DOCTYPE html>
<html lang="fr">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Ajouter une question - L'Il'eau chiens - Admin</title>
<link href="/node_modules/bootstrap/dist/css/bootstrap.min.css" rel="stylesheet">
<link rel="stylesheet" href="/node_modules/bs-icon/icons.css">
<link rel="stylesheet" href="/css/style.css">
<link rel="shortcut icon" href="/favicon.png" type="image/png">
</head>
<body>
<header>
<nav class="navbar navbar-expand-xxl bg-body-tertiary">
<div class="container-fluid align-items-center">
<a class="navbar-brand" href="#">L'Il'eau chiens - Admin</a>
<button class="navbar-toggler" type="button" data-bs-toggle="collapse"
data-bs-target="#navbarSupportedContent" aria-controls="navbarSupportedContent"
aria-expanded="false" aria-label="Toggle navigation">
<span class="navbar-toggler-icon"></span>
</button>
<div class="collapse navbar-collapse" id="navbarSupportedContent">
<ul class="navbar-nav me-auto mb-2 mb-lg-0">
<li class="nav-item"><a class="nav-link left-label" aria-current="page" href="#">Blog</a></li>
<li class="nav-item"><a class="nav-link left-label" href="#">Boutique</a></li>
<li class="nav-item"><a class="nav-link left-label" href="#">Prestations</a></li>
<li class="nav-item"><a class="nav-link left-label" href="#">FAQ</a></li>
<li class="nav-item"><a class="nav-link left-label" href="#">Fiche renseignements</a></li>
<li class="nav-item"><a class="nav-link left-label" href="#">Partenaires</a></li>
<li class="nav-item"><a class="nav-link active left-label" href="#">Citations</a></li>
</ul>
<ul class="navbar-nav ms-auto mb-2 mb-lg-0">
<li class="nav-item"><a class="nav-link" href="#"><i class="bi bi-megaphone me-1"></i> Message
d'actu</a></li>
<li class="nav-item"><a class="nav-link" href="#"><i class="bi bi-box-arrow-up-right me-1"></i>
Voir le site</a></li>
<li class="nav-item"><a class="nav-link" href="#"><i class="bi bi-gear me-1"></i>
Configuration</a></li>
<li class="nav-item dropdown">
<a class="nav-link dropdown-toggle" href="#" id="userMenu" role="button"
data-bs-toggle="dropdown" aria-expanded="false">
<i class="bi bi-person-circle me-1"></i> <span id="userFirstName">Prénom</span>
</a>
<ul class="dropdown-menu dropdown-menu-end" aria-labelledby="userMenu">
<li><a class="dropdown-item" href="#">Profil</a></li>
<li>
<hr class="dropdown-divider">
</li>
<li><a class="dropdown-item" href="#">Sortir</a></li>
</ul>
</li>
</ul>
</div>
</div>
</nav>
</header>
<main class="my-5 fs-6">
<div class="container">
<header>
<h1 class="title my-4 fs-2">Ajouter une question</h1>
</header>
<div class="content">
<form>
<div class="mb-4 question-addition">
<label class="form-label fw-bold" for="question">Question (obligatoire)</label>
<input type="text" id="question" class="form-control" placeholder="Une question" required>
</div>
<div class="mb-4 theme-addition">
<label class="form-label fw-bold" for="theme">Thème (obligatoire)</label>
<select name="theme" id="theme" class="form-select" required>
<option value="" disabled selected>Choisir un thème</option>
<option value="1">Chiens</option>
<option value="2">Thème 2</option>
<option value="3">Thème 3</option>
</select>
</div>
<div class="mb-4 reponse-addition">
<label class="form-label fw-bold" for="reponse">Réponse (obligatoire)</label>
<textarea id="reponse" class="form-control" placeholder="Votre réponse ici..." required></textarea>
</div>
<div class="d-flex gap-3 mt-4 confirmation-buttons">
<a href="./accueil.html" class="btn btn-secondary w-50">Annuler</a>
<button type="submit" class="btn btn-primary w-50">Ajouter</button>
</div>
</form>
</div>
</div>
</main>
<script src="/node_modules/bootstrap/dist/js/bootstrap.bundle.min.js"></script>
<script src="/node_modules/tinymce/tinymce.min.js"></script>
<script src="/node_modules/tinymce-i18n/langs8/fr-FR.js"></script>
<script src="/js/tinyMce.js"></script>
</body>
</html>

83
faq/ajouter_theme.html Normal file
View File

@@ -0,0 +1,83 @@
<!DOCTYPE html>
<html lang="fr">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Ajouter un thème de questions - L'Il'eau chiens - Admin</title>
<link href="/node_modules/bootstrap/dist/css/bootstrap.min.css" rel="stylesheet">
<link rel="stylesheet" href="/node_modules/bs-icon/icons.css">
<link rel="stylesheet" href="/css/style.css">
<link rel="shortcut icon" href="/favicon.png" type="image/png">
</head>
<body>
<header>
<nav class="navbar navbar-expand-xxl bg-body-tertiary">
<div class="container-fluid align-items-center">
<a class="navbar-brand" href="#">L'Il'eau chiens - Admin</a>
<button class="navbar-toggler" type="button" data-bs-toggle="collapse"
data-bs-target="#navbarSupportedContent" aria-controls="navbarSupportedContent"
aria-expanded="false" aria-label="Toggle navigation">
<span class="navbar-toggler-icon"></span>
</button>
<div class="collapse navbar-collapse" id="navbarSupportedContent">
<ul class="navbar-nav me-auto mb-2 mb-lg-0">
<li class="nav-item"><a class="nav-link left-label" aria-current="page" href="#">Blog</a></li>
<li class="nav-item"><a class="nav-link left-label" href="#">Boutique</a></li>
<li class="nav-item"><a class="nav-link left-label" href="#">Prestations</a></li>
<li class="nav-item"><a class="nav-link left-label" href="#">FAQ</a></li>
<li class="nav-item"><a class="nav-link left-label" href="#">Fiche renseignements</a></li>
<li class="nav-item"><a class="nav-link left-label" href="#">Partenaires</a></li>
<li class="nav-item"><a class="nav-link active left-label" href="#">Citations</a></li>
</ul>
<ul class="navbar-nav ms-auto mb-2 mb-lg-0">
<li class="nav-item"><a class="nav-link" href="#"><i class="bi bi-megaphone me-1"></i> Message
d'actu</a></li>
<li class="nav-item"><a class="nav-link" href="#"><i class="bi bi-box-arrow-up-right me-1"></i>
Voir le site</a></li>
<li class="nav-item"><a class="nav-link" href="#"><i class="bi bi-gear me-1"></i>
Configuration</a></li>
<li class="nav-item dropdown">
<a class="nav-link dropdown-toggle" href="#" id="userMenu" role="button"
data-bs-toggle="dropdown" aria-expanded="false">
<i class="bi bi-person-circle me-1"></i> <span id="userFirstName">Prénom</span>
</a>
<ul class="dropdown-menu dropdown-menu-end" aria-labelledby="userMenu">
<li><a class="dropdown-item" href="#">Profil</a></li>
<li>
<hr class="dropdown-divider">
</li>
<li><a class="dropdown-item" href="#">Sortir</a></li>
</ul>
</li>
</ul>
</div>
</div>
</nav>
</header>
<main class="my-5 fs-6">
<div class="container">
<header>
<h1 class="title my-4 fs-2">Ajouter un thème de question</h1>
</header>
<div class="content">
<form>
<div class="mb-4 theme-addition">
<label class="form-label fw-bold" for="theme">Thème (obligatoire)</label>
<input type="text" id="theme" class="form-control" placeholder="Un thème de question" required>
</div>
<div class="d-flex gap-3 mt-4 confirmation-buttons">
<a href="./accueil.html" class="btn btn-secondary w-50">Annuler</a>
<button type="submit" class="btn btn-primary w-50">Ajouter</button>
</div>
</form>
</div>
</div>
</main>
<script src="/node_modules/bootstrap/dist/js/bootstrap.bundle.min.js"></script>
<script src="/js/contentReduct.js"></script>
</body>
</html>

101
faq/modifier_question.html Normal file
View File

@@ -0,0 +1,101 @@
<!DOCTYPE html>
<html lang="fr">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Modifier une question - L'Il'eau chiens - Admin</title>
<link href="/node_modules/bootstrap/dist/css/bootstrap.min.css" rel="stylesheet">
<link rel="stylesheet" href="/node_modules/bs-icon/icons.css">
<link rel="stylesheet" href="/css/style.css">
<link rel="shortcut icon" href="/favicon.png" type="image/png">
</head>
<body>
<header>
<nav class="navbar navbar-expand-xxl bg-body-tertiary">
<div class="container-fluid align-items-center">
<a class="navbar-brand" href="#">L'Il'eau chiens - Admin</a>
<button class="navbar-toggler" type="button" data-bs-toggle="collapse"
data-bs-target="#navbarSupportedContent" aria-controls="navbarSupportedContent"
aria-expanded="false" aria-label="Toggle navigation">
<span class="navbar-toggler-icon"></span>
</button>
<div class="collapse navbar-collapse" id="navbarSupportedContent">
<ul class="navbar-nav me-auto mb-2 mb-lg-0">
<li class="nav-item"><a class="nav-link left-label" aria-current="page" href="#">Blog</a></li>
<li class="nav-item"><a class="nav-link left-label" href="#">Boutique</a></li>
<li class="nav-item"><a class="nav-link left-label" href="#">Prestations</a></li>
<li class="nav-item"><a class="nav-link left-label" href="#">FAQ</a></li>
<li class="nav-item"><a class="nav-link left-label" href="#">Fiche renseignements</a></li>
<li class="nav-item"><a class="nav-link left-label" href="#">Partenaires</a></li>
<li class="nav-item"><a class="nav-link active left-label" href="#">Citations</a></li>
</ul>
<ul class="navbar-nav ms-auto mb-2 mb-lg-0">
<li class="nav-item"><a class="nav-link" href="#"><i class="bi bi-megaphone me-1"></i> Message
d'actu</a></li>
<li class="nav-item"><a class="nav-link" href="#"><i class="bi bi-box-arrow-up-right me-1"></i>
Voir le site</a></li>
<li class="nav-item"><a class="nav-link" href="#"><i class="bi bi-gear me-1"></i>
Configuration</a></li>
<li class="nav-item dropdown">
<a class="nav-link dropdown-toggle" href="#" id="userMenu" role="button"
data-bs-toggle="dropdown" aria-expanded="false">
<i class="bi bi-person-circle me-1"></i> <span id="userFirstName">Prénom</span>
</a>
<ul class="dropdown-menu dropdown-menu-end" aria-labelledby="userMenu">
<li><a class="dropdown-item" href="#">Profil</a></li>
<li>
<hr class="dropdown-divider">
</li>
<li><a class="dropdown-item" href="#">Sortir</a></li>
</ul>
</li>
</ul>
</div>
</div>
</nav>
</header>
<main class="my-5 fs-6">
<div class="container">
<header>
<h1 class="title my-4 fs-2">Modifier une question</h1>
</header>
<div class="content">
<form>
<div class="mb-4 question-addition">
<label class="form-label fw-bold" for="question">Question (obligatoire)</label>
<input type="text" id="question" class="form-control"
value="Pourquoi les chiens lèvent-ils la patte quand ils font pipi ?" required>
</div>
<div class="mb-4 theme-addition">
<label class="form-label fw-bold" for="theme">Thème (obligatoire)</label>
<select name="theme" id="theme" class="form-select" required>
<option value="" disabled>Choisir un thème</option>
<option value="1" selected>Chiens</option>
<option value="2">Thème 2</option>
<option value="3">Thème 3</option>
</select>
</div>
<div class="mb-4 reponse-addition">
<label class="form-label fw-bold" for="reponse">Réponse (obligatoire)</label>
<textarea id="reponse" class="form-control" required>Car si ils lèvent les deux, ils ne peuvent pas se retenir.</textarea>
</div>
<div class="d-flex gap-3 mt-4 confirmation-buttons">
<a href="./accueil.html" class="btn btn-secondary w-50">Annuler</a>
<button type="submit" class="btn btn-primary w-50">Modifier</button>
</div>
</form>
</div>
</div>
</main>
<script src="/node_modules/bootstrap/dist/js/bootstrap.bundle.min.js"></script>
<script src="/js/contentReduct.js"></script>
<script src="/node_modules/tinymce/tinymce.min.js"></script>
<script src="/node_modules/tinymce-i18n/langs8/fr-FR.js"></script>
<script src="/js/tinyMce.js"></script>
</body>
</html>

83
faq/modifier_theme.html Normal file
View File

@@ -0,0 +1,83 @@
<!DOCTYPE html>
<html lang="fr">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Modifier un thème de questions - L'Il'eau chiens - Admin</title>
<link href="/node_modules/bootstrap/dist/css/bootstrap.min.css" rel="stylesheet">
<link rel="stylesheet" href="/node_modules/bs-icon/icons.css">
<link rel="stylesheet" href="/css/style.css">
<link rel="shortcut icon" href="/favicon.png" type="image/png">
</head>
<body>
<header>
<nav class="navbar navbar-expand-xxl bg-body-tertiary">
<div class="container-fluid align-items-center">
<a class="navbar-brand" href="#">L'Il'eau chiens - Admin</a>
<button class="navbar-toggler" type="button" data-bs-toggle="collapse"
data-bs-target="#navbarSupportedContent" aria-controls="navbarSupportedContent"
aria-expanded="false" aria-label="Toggle navigation">
<span class="navbar-toggler-icon"></span>
</button>
<div class="collapse navbar-collapse" id="navbarSupportedContent">
<ul class="navbar-nav me-auto mb-2 mb-lg-0">
<li class="nav-item"><a class="nav-link left-label" aria-current="page" href="#">Blog</a></li>
<li class="nav-item"><a class="nav-link left-label" href="#">Boutique</a></li>
<li class="nav-item"><a class="nav-link left-label" href="#">Prestations</a></li>
<li class="nav-item"><a class="nav-link left-label" href="#">FAQ</a></li>
<li class="nav-item"><a class="nav-link left-label" href="#">Fiche renseignements</a></li>
<li class="nav-item"><a class="nav-link left-label" href="#">Partenaires</a></li>
<li class="nav-item"><a class="nav-link active left-label" href="#">Citations</a></li>
</ul>
<ul class="navbar-nav ms-auto mb-2 mb-lg-0">
<li class="nav-item"><a class="nav-link" href="#"><i class="bi bi-megaphone me-1"></i> Message
d'actu</a></li>
<li class="nav-item"><a class="nav-link" href="#"><i class="bi bi-box-arrow-up-right me-1"></i>
Voir le site</a></li>
<li class="nav-item"><a class="nav-link" href="#"><i class="bi bi-gear me-1"></i>
Configuration</a></li>
<li class="nav-item dropdown">
<a class="nav-link dropdown-toggle" href="#" id="userMenu" role="button"
data-bs-toggle="dropdown" aria-expanded="false">
<i class="bi bi-person-circle me-1"></i> <span id="userFirstName">Prénom</span>
</a>
<ul class="dropdown-menu dropdown-menu-end" aria-labelledby="userMenu">
<li><a class="dropdown-item" href="#">Profil</a></li>
<li>
<hr class="dropdown-divider">
</li>
<li><a class="dropdown-item" href="#">Sortir</a></li>
</ul>
</li>
</ul>
</div>
</div>
</nav>
</header>
<main class="my-5 fs-6">
<div class="container">
<header>
<h1 class="title my-4 fs-2">Modifier un thème de question</h1>
</header>
<div class="content">
<form>
<div class="mb-4 theme-addition">
<label class="form-label fw-bold" for="theme">Thème (obligatoire)</label>
<input type="text" id="theme" class="form-control" value="Le nom du thème à modifier" required>
</div>
<div class="d-flex gap-3 mt-4 confirmation-buttons">
<a href="./accueil.html" class="btn btn-secondary w-50">Annuler</a>
<button type="submit" class="btn btn-primary w-50">Modifier</button>
</div>
</form>
</div>
</div>
</main>
<script src="/node_modules/bootstrap/dist/js/bootstrap.bundle.min.js"></script>
<script src="/js/contentReduct.js"></script>
</body>
</html>

BIN
favicon.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 980 B

60
js/confirmDelete.js Normal file
View File

@@ -0,0 +1,60 @@
/**
* confirmDelete.js
*
* Modal de confirmation générique pour les actions de suppression.
*
* Usage:
* 1. Ajouter data-bs-toggle="modal" et data-bs-target="#confirmDeleteModal" au lien de suppression.
* 2. Lors de la confirmation, l'attribut href du lien est utilisé pour la navigation (GET).
*/
(function(){
let pendingHref = null;
let pendingModalId = '#confirmDeleteModal';
function getBootstrapModal(modalEl){
//retourne l'instance Bootstrap Modal associée à modalEl, ou en crée une nouvelle si nécessaire
if (!modalEl || !window.bootstrap) return null;
return bootstrap.Modal.getInstance(modalEl) || new bootstrap.Modal(modalEl);
}
document.addEventListener('click', function(e){
const btn = e.target.closest('a[data-bs-toggle="modal"][data-bs-target]');
if (!btn) return;
const target = btn.getAttribute('data-bs-target');
// Gérer les boutons de type suppression ; restreindre éventuellement en utilisant une classe CSS spécifique
// Pour un appariement plus strict, ajouter une classe dédiée et la vérifier ici.
e.preventDefault();
pendingHref = btn.getAttribute('href');
pendingModalId = btn.getAttribute('data-confirm-modal') || target || '#confirmDeleteModal';
const modalEl = document.querySelector(pendingModalId);
const modal = getBootstrapModal(modalEl);
if (modal) modal.show();
});
document.addEventListener('click', function(e){
const confirmBtn = e.target.closest('#confirmDeleteBtn');
if (!confirmBtn) return;
if (pendingHref && pendingHref !== '#' && pendingHref.trim() !== ''){
window.location.assign(pendingHref);
return; // la navigation va se produire, arrêter le traitement ici
}
// Si aucun href n'est présent, fermer simplement le modal
const modalEl = document.querySelector(pendingModalId);
const modal = getBootstrapModal(modalEl);
if (modal) modal.hide();
pendingHref = null;
pendingModalId = '#confirmDeleteModal';
});
// Réinitialiser l'état stocké lorsque n'importe quel modal Bootstrap est caché
document.addEventListener('hidden.bs.modal', function(){
pendingHref = null;
pendingModalId = '#confirmDeleteModal';
});
})();

44
js/contentReduct.js Normal file
View File

@@ -0,0 +1,44 @@
/**
* Réduit le contenu des cellules td des tableaux
*/
const BREAKPOINT_SM = 1000;
const NB_CARACTERES = 40;
(() => {
// Récupère les cellules td (premier d'un tr) à traiter
const getTargetCells = () => {
const tbodyRows = Array.from(document.querySelectorAll("tbody tr"));
let cells = tbodyRows.map((row) => row.querySelector("td")).filter(Boolean);
if (cells.length === 0) {
const allRows = Array.from(document.querySelectorAll("tr"));
cells = allRows.map((row) => row.querySelector("td")).filter(Boolean);
}
return cells;
};
const tdElts = getTargetCells();
tdElts.forEach((td) => {
if (!td.dataset.fullText) {
td.dataset.fullText = td.textContent.trim();
}
});
const applyTruncation = () => {
const narrow = window.innerWidth < BREAKPOINT_SM;
tdElts.forEach((td) => {
const full = td.dataset.fullText ?? td.textContent;
const text = (full || "").trim();
if (narrow) {
td.textContent = text.length > 40 ? text.slice(0, NB_CARACTERES) + '...': text;
} else {
td.textContent = full;
}
});
};
applyTruncation();
window.addEventListener("resize", applyTruncation);
})();

50
js/tinyMce.js Normal file
View File

@@ -0,0 +1,50 @@
/**
* Initialisation de TinyMCE avec des boutons personnalisés pour les titres h3 à h6.
*/
tinymce.init({
selector: "textarea",
height: 400,
language: "fr-FR",
branding: false,
menubar: false,
menu: {},
plugins: "link, lists fullscreen",
toolbar: "h3 h4 h5 h6 | undo redo | link | bold | bullist numlist | outdent indent | fullscreen",
license_key: 'gpl',
setup: function (editor) {
['h3', 'h4', 'h5', 'h6'].forEach(function (tag) {
editor.ui.registry.addToggleButton(tag, {
text: tag.toUpperCase(),
tooltip: 'Titre ' + tag.substring(1),
onAction: function () {
try {
if (editor.formatter && typeof editor.formatter.toggle === 'function') {
editor.formatter.toggle(tag);
} else {
editor.execCommand('FormatBlock', false, tag);
}
} catch (e) {
// fallback
editor.execCommand('FormatBlock', false, tag);
}
},
onSetup: function (api) {
var nodeChangeHandler = function () {
try {
api.setActive(editor.formatter ? !!editor.formatter.match(tag) : false);
} catch (e) {
api.setActive(false);
}
};
editor.on('NodeChange', nodeChangeHandler);
return function () {
editor.off('NodeChange', nodeChangeHandler);
};
}
});
});
}
});

100
package-lock.json generated Normal file
View File

@@ -0,0 +1,100 @@
{
"name": "backoffice_il_eau_chien",
"version": "1.0.0",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "backoffice_il_eau_chien",
"version": "1.0.0",
"license": "OSEF",
"dependencies": {
"bootstrap": "^5.3.8",
"bs-icon": "^0.0.8",
"tinymce": "^8.2.2",
"tinymce-i18n": "^25.11.17"
}
},
"node_modules/@popperjs/core": {
"version": "2.11.8",
"resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz",
"integrity": "sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==",
"license": "MIT",
"peer": true,
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/popperjs"
}
},
"node_modules/bootstrap": {
"version": "5.3.8",
"resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-5.3.8.tgz",
"integrity": "sha512-HP1SZDqaLDPwsNiqRqi5NcP0SSXciX2s9E+RyqJIIqGo+vJeN5AJVM98CXmW/Wux0nQ5L7jeWUdplCEf0Ee+tg==",
"funding": [
{
"type": "github",
"url": "https://github.com/sponsors/twbs"
},
{
"type": "opencollective",
"url": "https://opencollective.com/bootstrap"
}
],
"license": "MIT",
"peerDependencies": {
"@popperjs/core": "^2.11.8"
}
},
"node_modules/bs-icon": {
"version": "0.0.8",
"resolved": "https://registry.npmjs.org/bs-icon/-/bs-icon-0.0.8.tgz",
"integrity": "sha512-tL+KDhh5VF/sEDUZquFXxrKrYnj91pGp4XHxSPbmVnTYIigsF9KyA+ts8x4RnjFT+s7HeZqpTB3k6CgmJcwfLw==",
"peerDependencies": {
"react": ">=16.13.1",
"react-dom": ">=16.13.1"
}
},
"node_modules/react": {
"version": "19.2.1",
"resolved": "https://registry.npmjs.org/react/-/react-19.2.1.tgz",
"integrity": "sha512-DGrYcCWK7tvYMnWh79yrPHt+vdx9tY+1gPZa7nJQtO/p8bLTDaHp4dzwEhQB7pZ4Xe3ok4XKuEPrVuc+wlpkmw==",
"license": "MIT",
"peer": true,
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/react-dom": {
"version": "19.2.1",
"resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.1.tgz",
"integrity": "sha512-ibrK8llX2a4eOskq1mXKu/TGZj9qzomO+sNfO98M6d9zIPOEhlBkMkBUBLd1vgS0gQsLDBzA+8jJBVXDnfHmJg==",
"license": "MIT",
"peer": true,
"dependencies": {
"scheduler": "^0.27.0"
},
"peerDependencies": {
"react": "^19.2.1"
}
},
"node_modules/scheduler": {
"version": "0.27.0",
"resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.27.0.tgz",
"integrity": "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==",
"license": "MIT",
"peer": true
},
"node_modules/tinymce": {
"version": "8.3.0",
"resolved": "https://registry.npmjs.org/tinymce/-/tinymce-8.3.0.tgz",
"integrity": "sha512-9IjrEo8HD5mg9QP6/rKcPSIcyRNVSf5eiYTqapb/q1zAIoISRJgI2DJUs4CJgZvio0hmEH394xSHUJuoGf4Msw==",
"license": "SEE LICENSE IN license.md"
},
"node_modules/tinymce-i18n": {
"version": "25.11.17",
"resolved": "https://registry.npmjs.org/tinymce-i18n/-/tinymce-i18n-25.11.17.tgz",
"integrity": "sha512-Fi5hGRDL9o42VsdahgNgHRHO/4ClAAqIew45QMu8sa5LQT2wTaVPf/tAXnVDHxR7c6NWZQmZp/E18LosxLq42A==",
"license": "MIT"
}
}
}

21
package.json Normal file
View File

@@ -0,0 +1,21 @@
{
"name": "backoffice_il_eau_chien",
"version": "1.0.0",
"description": "Le header du back office",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"repository": {
"type": "git",
"url": "ssh://git@git.lalanguebleue.fr:2222/ileauchiens/maquette_backoffice.git"
},
"author": "",
"license": "OSEF",
"dependencies": {
"bootstrap": "^5.3.8",
"bs-icon": "^0.0.8",
"tinymce": "^8.2.2",
"tinymce-i18n": "^25.11.17"
}
}

View File

@@ -1,88 +0,0 @@
<!DOCTYPE html>
<html lang="fr">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Ajouter une catégorie</title>
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/css/bootstrap.min.css">
<style>
body {
background: #f4f6f981;
}
.container {
max-width: 600px;
margin-top: 50px;
}
</style>
</head>
<body>
<div class="container">
<h1 class="mb-5 text-center">Ajouter une prestation</h2>
<!--Erreur champ vide -->
<div id="errorEmpty" class="alert alert-danger d-none">Le titre est obligatoire.</div>
<!--Erreur nom deja existant -->
<div id="errorExists" class="alert alert-danger d-none">Cette prestation existe déjà. Veuillez en choisir
une autre.</div>
<!--Succès ajout catégorie -->
<div id="successMessage" class="alert alert-success d-none">Prestation ajoutée avec succès !</div>
<form id="addCategoryForm">
<div class="mb-4">
<label class="form-label fw-bold">Titre de la prestation (obligatoire)</label>
<input type="text" id="categoryName" class="form-control" required>
</div>
<div class="mb-3">
<label class="form-label fw-bold">Type de prestation</label>
<select id="prestationType" class="form-select">
<option value="chien" selected>Chien</option>
<option value="chat">Chat</option>
</select>
</div>
<!--Description (liste à puces)-->
<div class="mb-3">
<label class="form-label fw-bold">Description de la prestation</label>
<textarea id="prestationDescription" class="form-control" rows="5">
</textarea>
</div>
<!--Tariffs-->
<div class="mb-3">
<label class="form-label fw-bold">Tarif (fourchette)</label>
<div class="d-flex gap-3">
<input type="number" id="priceMin" class="form-control" placeholder="Prix min (€)" value="35">
<input type="number" id="priceMax" class="form-control" placeholder="Prix max (€)" value="60">
</div>
</div>
<div class="d-flex gap-3 mt-4">
<a href="../../prestations/liste_prestation/liste_prestation.html" class="btn btn-secondary w-50">Annuler</a>
<button type="submit" class="btn btn-primary w-50">Ajouter</button>
</div>
</form>
</div>
<script src="ajouter_prestation.js"></script>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/js/bootstrap.bundle.min.js"></script>
</body>
</html>

View File

@@ -1,55 +0,0 @@
// Récupération des éléments
const form = document.getElementById("addCategoryForm");
const titleField = document.getElementById("categoryName");
const typeField = document.getElementById("prestationType");
const descField = document.getElementById("prestationDescription");
const priceMinField = document.getElementById("priceMin");
const priceMaxField = document.getElementById("priceMax");
const errorEmpty = document.getElementById("errorEmpty");
const errorExists = document.getElementById("errorExists");
const successMessage = document.getElementById("successMessage");
// Prestations existantes (simulation)
const existingPrestations = [
"Toilettage complet",
"Coupe ciseaux",
"Toilettage chiot",
"Démêlage poil long"
];
form.addEventListener("submit", function (e) {
e.preventDefault();
// Récupérer le titre
const titre = titleField.value.trim();
// Réinitialiser les alertes
errorEmpty.classList.add("d-none");
errorExists.classList.add("d-none");
successMessage.classList.add("d-none");
// 1. Vérif : titre obligatoire
if (titre === "") {
errorEmpty.classList.remove("d-none");
return;
}
// 2. Vérif : prestation déjà existante (exemple simple)
if (existingPrestations.includes(titre)) {
errorExists.classList.remove("d-none");
return;
}
// 3. Tout est ok → succès
successMessage.classList.remove("d-none");
// Simuler ajout en base
existingPrestations.push(titre);
setTimeout(() => {
window.location.href = "../liste_prestation/liste_prestation.html";
}, 1500);
});

View File

@@ -1,90 +0,0 @@
<!DOCTYPE html>
<html lang="fr">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Ajouter une paire avant/après</title>
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/css/bootstrap.min.css">
<style>
body {
background: #f4f6f9;
padding: 30px;
}
.container {
max-width: 800px;
margin-top: 100px;
}
.img-preview {
max-width: 150px;
border-radius: 8px;
display: none; /* cachée tant qu'il n'y a pas d'image */
}
</style>
</head>
<body>
<div class="container">
<h2 class="mb-5 text-center">Ajouter une paire avant/après</h2>
<!-- Message succès -->
<div id="successMsg" class="alert alert-success d-none">
Nouvelle paire ajoutée avec succès !
</div>
<!-- Message erreur -->
<div id="errorMsg" class="alert alert-danger d-none">
Merci de remplir tous les champs obligatoires.
</div>
<form id="addPairForm">
<!-- Titre / label -->
<div class="mb-3">
<label class="form-label">Titre de la paire *</label>
<input type="text" id="pairTitle" class="form-control" required>
</div>
<!-- Type -->
<div class="mb-3">
<label class="form-label">Type *</label>
<select id="pairType" class="form-select" required>
<option value="">-- Choisir --</option>
<option value="Chien">Chien</option>
<option value="Chat">Chat</option>
<option value="Autre">Autre</option>
</select>
</div>
<!-- Image AVANT -->
<div class="mb-4">
<label class="form-label">Image AVANT *</label>
<input type="file" id="beforeImage" class="form-control" accept="image/*">
<img id="beforePreview" class="img-preview border mt-2">
</div>
<!-- Image APRÈS -->
<div class="mb-4">
<label class="form-label">Image APRÈS *</label>
<input type="file" id="afterImage" class="form-control" accept="image/*">
<img id="afterPreview" class="img-preview border mt-2">
</div>
<!-- Boutons -->
<div class="d-flex justify-content-between">
<a href="../liste_avant_apres/liste_avant_apres.html" class="btn btn-secondary">Annuler</a>
<button type="submit" class="btn btn-primary">Ajouter</button>
</div>
</form>
</div>
<script src="ajouter_avant_apres.js"></script>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/js/bootstrap.bundle.min.js"></script>
</body>
</html>

View File

@@ -1,60 +0,0 @@
<!DOCTYPE html>
<html lang="fr">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Liste des paires avant/apres</title>
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/css/bootstrap.min.css">
<style>
body {
background: #f4f6f9;
padding: 30px;
}
.container {
margin-top: 100px;
}
.action-btns button,
.action-btns a {
margin-right: 100px;
}
</style>
</head>
<body>
<div class="container">
<h2 class="mb-5 text-center">Liste des paires avant/apres</h2>
<!--Message succès-->
<div id="succesDeleteMsg" class="alert alert-success d-none">Paire supprimée avec succès !</div>
<div class="d-flex justify-content-end mb-4">
<a href="../ajouter_avant_apres/ajouter_avant_apres.html" class="btn btn-primary">Ajouter une paire</a>
</div>
<table class="table table-striped table-hover align-middle">
<thead class="table-dark">
<tr>
<th>Titre paire</th>
<th>Type</th>
<th>Avant</th>
<th>Apres</th>
<th class="text-center">Actions</th>
</tr>
</thead>
<tbody id="prestationTableBody">
<!--JS-->
</tbody>
</table>
</div>
<script src="liste_avant_apres.js"></script>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/js/bootstrap.bundle.min.js"></script>
</body>
</html>

View File

@@ -1,90 +0,0 @@
// ===============================
// Données simulées (à remplacer plus tard par une BDD)
// ===============================
let galleryPairs = [
{
id: 1,
titre: "Petit chien poils longs",
type: "Chien",
avant: "../../img/avant1.jpg",
apres: "../../img/apres1.jpg"
},
{
id: 2,
titre: "Coupe ciseaux",
type: "Chat",
avant: "../../img/avant2.jpg",
apres: "../../img/apres2.jpg"
}
];
// Sélecteurs
const tableBody = document.getElementById("prestationTableBody");
const succesDeleteMsg = document.getElementById("succesDeleteMsg");
// ===============================
// Fonction d'affichage
// ===============================
function displayPairs() {
tableBody.innerHTML = ""; // reset tableau
galleryPairs.forEach(pair => {
const row = document.createElement("tr");
row.innerHTML = `
<td>${pair.titre}</td>
<td>${pair.type}</td>
<td>
<img src="${pair.avant}" width="80" class="rounded">
</td>
<td>
<img src="${pair.apres}" width="80" class="rounded">
</td>
<td class="text-center action-btns">
<!-- Bouton Voir -->
<a href="../voir_avant_apres/voir_avant_apres.html?id=${pair.id}"
class="btn btn-info btn-sm">Voir</a>
<!-- Bouton Modifier -->
<a href="../modifier_avant_apres/modifier_avant_apres.html?id=${pair.id}"
class="btn btn-warning btn-sm">Modifier</a>
<!-- Bouton Supprimer -->
<button class="btn btn-danger btn-sm" onclick="deletePair(${pair.id})">
Supprimer
</button>
</td>
`;
tableBody.appendChild(row);
});
}
// ===============================
// Fonction de suppression
// ===============================
function deletePair(id) {
if (!confirm("Voulez-vous vraiment supprimer cette paire ?")) {
return;
}
galleryPairs = galleryPairs.filter(pair => pair.id !== id);
displayPairs();
succesDeleteMsg.classList.remove("d-none");
// Disparaît après 2 secondes
setTimeout(() => {
succesDeleteMsg.classList.add("d-none");
}, 2000);
}
// ===============================
// Chargement initial
// ===============================
displayPairs();

View File

@@ -1,104 +0,0 @@
<!DOCTYPE html>
<html lang="fr">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Modifier une paire avant/après</title>
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/css/bootstrap.min.css">
<style>
body {
background: #f4f6f9;
padding: 30px;
}
.container {
margin-top: 100px;
max-width: 800px;
}
.img-preview {
max-width: 150px;
border-radius: 8px;
}
</style>
</head>
<body>
<div class="container">
<h2 class="mb-5 text-center">Modifier une paire avant/après</h2>
<!-- Messages -->
<div id="successMsg" class="alert alert-success d-none">
La paire avant/après a été modifiée avec succès.
</div>
<div id="errorMsg" class="alert alert-danger d-none">
Une erreur est survenue. Merci de vérifier le formulaire.
</div>
<!-- Formulaire de modification -->
<form id="editPairForm">
<!-- ID caché -->
<input type="hidden" id="pairId">
<!-- Titre / label -->
<div class="mb-3">
<label for="pairTitle" class="form-label">Titre / label de la paire *</label>
<input type="text" class="form-control" id="pairTitle" required>
</div>
<!-- Type -->
<div class="mb-3">
<label for="pairType" class="form-label">Type</label>
<select id="pairType" class="form-select">
<option value="Chien">Chien</option>
<option value="Chat">Chat</option>
<option value="Autre">Autre</option>
</select>
</div>
<!-- Image AVANT -->
<div class="mb-4 row">
<div class="col-md-6">
<label class="form-label" for="beforeImage">Image AVANT</label>
<input type="file" class="form-control" id="beforeImage" accept="image/*">
<div class="form-text">
Laisser vide pour conserver l'image actuelle.
</div>
</div>
<div class="col-md-6 text-center">
<p class="mb-1">Aperçu actuel AVANT</p>
<img id="beforePreview" src="" alt="Image avant" class="img-preview border">
</div>
</div>
<!-- Image APRES -->
<div class="mb-4 row">
<div class="col-md-6">
<label class="form-label" for="afterImage">Image APRÈS</label>
<input type="file" class="form-control" id="afterImage" accept="image/*">
<div class="form-text">
Laisser vide pour conserver l'image actuelle.
</div>
</div>
<div class="col-md-6 text-center">
<p class="mb-1">Aperçu actuel APRÈS</p>
<img id="afterPreview" src="" alt="Image après" class="img-preview border">
</div>
</div>
<!-- Boutons -->
<div class="d-flex justify-content-between">
<a href="../liste_avant_apres/liste_avant_apres.html" class="btn btn-secondary">
Annuler
</a>
<button type="submit" class="btn btn-primary">
Enregistrer les modifications
</button>
</div>
</form>
</div>
<script src="modifier_avant_apres.js"></script>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/js/bootstrap.bundle.min.js"></script>
</body>
</html>

View File

@@ -1,70 +0,0 @@
<!DOCTYPE html>
<html lang="fr">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Voir la paire avant/après</title>
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/css/bootstrap.min.css">
<style>
body {
background: #f4f6f9;
padding: 30px;
}
.container {
max-width: 800px;
margin-top: 100px;
}
.img-preview {
max-width: 250px;
border-radius: 10px;
}
</style>
</head>
<body>
<div class="container">
<h2 class="mb-5 text-center">Détails de la paire avant/après</h2>
<!-- Message erreur -->
<div id="errorMsg" class="alert alert-danger d-none">
Impossible d'afficher cette paire.
</div>
<div id="detailsSection">
<!-- Titre -->
<h4 id="pairTitle" class="text-center mb-4"></h4>
<div class="d-flex justify-content-around align-items-center mb-4">
<div class="text-center">
<p class="fw-bold">AVANT</p>
<img id="beforePreview" class="img-preview border" src="">
</div>
<div class="text-center">
<p class="fw-bold">APRÈS</p>
<img id="afterPreview" class="img-preview border" src="">
</div>
</div>
<!-- Bouton retour -->
<div class="text-center mt-4">
<a href="../liste_avant_apres/liste_avant_apres.html" class="btn btn-secondary">
Retour à la liste
</a>
</div>
</div>
</div>
<script src="voir_avant_apres.js"></script>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/js/bootstrap.bundle.min.js"></script>
</body>
</html>

View File

@@ -1,58 +0,0 @@
// ===============================
// Données simulées (à remplacer plus tard par BDD / API)
// ===============================
let galleryPairs = [
{
id: 1,
titre: "Petit chien poils longs",
type: "Chien",
avant: "../../img/avant1.jpg",
apres: "../../img/apres1.jpg"
},
{
id: 2,
titre: "Coupe ciseaux",
type: "Chat",
avant: "../../img/avant2.jpg",
apres: "../../img/apres2.jpg"
}
];
// Sélecteurs
const titleEl = document.getElementById("pairTitle");
const beforePreview = document.getElementById("beforePreview");
const afterPreview = document.getElementById("afterPreview");
const errorMsg = document.getElementById("errorMsg");
const detailsSection = document.getElementById("detailsSection");
// ===============================
// Récup ID dans l'URL
// ===============================
function getIdFromUrl() {
const params = new URLSearchParams(window.location.search);
return parseInt(params.get("id"));
}
// ===============================
// Charger les infos de la paire
// ===============================
function loadPairDetails() {
const id = getIdFromUrl();
const pair = galleryPairs.find(p => p.id === id);
if (!pair) {
errorMsg.classList.remove("d-none");
detailsSection.classList.add("d-none");
return;
}
// Affichage du titre
titleEl.textContent = pair.titre;
// Affichage des images
beforePreview.src = pair.avant;
afterPreview.src = pair.apres;
}
// Initialisation
loadPairDetails();

View File

@@ -0,0 +1,25 @@
<!-- Modale de suppression -->
<div class="modal fade" id="deleteModal" tabindex="-1" aria-labelledby="deleteModalLabel" aria-hidden="true">
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
<h2 class="modal-title fs-5" id="deleteModalLabel">Confirmer la suppression</h2>
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Fermer"></button>
</div>
<div class="modal-body">
Voulez-vous vraiment supprimer <strong id="itemName">cet élément</strong> ?
</div>
<div class="modal-footer">
<button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Annuler</button>
<button type="button" class="btn btn-danger" id="confirmDeleteBtn">Supprimer</button>
</div>
</div>
</div>
</div>

View File

@@ -0,0 +1,100 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Header- composant</title>
<style>
.navbar-brand { font-size: 1.2rem; line-height: 1; padding-top: 0.25rem; padding-bottom: 0.25rem; }
.brand-sep { height: 1.2rem; }
@media (max-width: 1399.98px) {
.navbar .nav-item {
background-color: var(--bs-light);
border: 1px solid var(--bs-border-color);
border-radius: .25rem;
margin-bottom: .375rem;
text-align: center;
}
#navbarSupportedContent > ul:first-child { margin-top: .5rem; }
#navbarSupportedContent > ul:last-child { margin-top: 1rem; }
.bi{
display: none;
}
}
</style>
</head>
<body>
<header>
<nav class="navbar navbar-expand-xxl bg-body-tertiary">
<div class="container-fluid align-items-center">
<a class="navbar-brand" href="#">L'Il'eau chiens - Admin</a>
<button class="navbar-toggler" type="button" data-bs-toggle="collapse"
data-bs-target="#navbarSupportedContent" aria-controls="navbarSupportedContent"
aria-expanded="false" aria-label="Toggle navigation">
<span class="navbar-toggler-icon"></span>
</button>
<div class="collapse navbar-collapse" id="navbarSupportedContent">
<ul class="navbar-nav me-auto mb-2 mb-lg-0">
<li class="nav-item">
<a class="nav-link active left-label" aria-current="page" href="#">Blog</a>
</li>
<li class="nav-item">
<a class="nav-link left-label" href="#">Boutique</a>
</li>
<li class="nav-item">
<a class="nav-link left-label" href="#">Prestations</a>
</li>
<li class="nav-item">
<a class="nav-link left-label" href="#">FAQ</a>
</li>
<li class="nav-item">
<a class="nav-link left-label" href="#">Fiche de renseignements</a>
</li>
<li class="nav-item">
<a class="nav-link left-label" href="#">Partenaires</a>
</li>
</ul>
<ul class="navbar-nav ms-auto mb-2 mb-lg-0">
<li class="nav-item">
<a class="nav-link" href="#"><i class="bi bi-megaphone me-1"></i> Message d'actu</a>
</li>
<li class="nav-item">
<a class="nav-link" href="#"><i class="bi bi-box-arrow-up-right me-1"></i> Voir le site</a>
</li>
<li class="nav-item">
<a class="nav-link" href="#"><i class="bi bi-gear me-1"></i> Configuration</a>
</li>
<li class="nav-item dropdown">
<a class="nav-link dropdown-toggle" href="#" id="userMenu" role="button" data-bs-toggle="dropdown" aria-expanded="false">
<i class="bi bi-person-circle me-1"></i> <span id="userFirstName">Prénom</span>
</a>
<ul class="dropdown-menu dropdown-menu-end" aria-labelledby="userMenu">
<li><a class="dropdown-item" href="#">Profil</a></li>
<li><hr class="dropdown-divider"></li>
<li><a class="dropdown-item" href="#">Sortir</a></li>
</ul>
</li>
</ul>
</div>
</div>
</nav>
</header>
</body>
</html>

View File

@@ -0,0 +1,42 @@
// Injection du modal
fetch("../components/html/delete-composant.html")
.then(res => {
if (!res.ok) throw new Error("Modal HTML introuvable");
return res.text();
})
.then(html => {
document.getElementById("modal-placeholder").innerHTML = html;
initDeleteModalLogic();
})
.catch(err => console.error(err));
// Logique du modal
function initDeleteModalLogic() {
let rowToDelete = null;
const modalElement = document.getElementById("deleteModal");
const itemNameSpan = document.getElementById("itemName");
const confirmBtn = document.getElementById("confirmDeleteBtn");
const deleteModal = new bootstrap.Modal(modalElement);
document.body.addEventListener("click", (event) => {
const button = event.target.closest(".delete-btn");
if (!button) return;
rowToDelete = button.closest("tr");
const firstCell = rowToDelete.querySelector("td");
const itemName = firstCell ? firstCell.textContent.trim() : "cet élément";
itemNameSpan.textContent = itemName;
deleteModal.show();
});
confirmBtn.addEventListener("click", () => {
if (rowToDelete) rowToDelete.remove();
rowToDelete = null;
deleteModal.hide();
});
}

View File

@@ -0,0 +1,5 @@
fetch("../components/html/header-composant.html")
.then(response => response.text())
.then(data => {
document.getElementById("header-placeholder").innerHTML = data;
});

View File

@@ -0,0 +1,107 @@
<!DOCTYPE html>
<html lang="fr">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Ajouter un résultat avant/après</title>
<link href="../../node_modules/bootstrap/dist/css/bootstrap.min.css" rel="stylesheet">
<link rel="stylesheet" href="../../node_modules/bs-icon/icons.css">
<link rel="stylesheet" href="../../css/style.css">
<link rel="stylesheet" href="../../css/avant_apres.css">
</head>
<body>
<div id="header-placeholder"></div>
<main class="my-5 fs-6">
<div class="container">
<header>
<h1 class="title fs-2">Ajouter un résultat en images (Avant / Après)</h1>
<!-- Message succès -->
<div id="successMsg" class="alert alert-success d-none">
Nouveau résultat ajouté avec succès !
</div>
<!-- Message erreur -->
<div id="errorMsg" class="alert alert-danger d-none">
Merci de remplir tous les champs obligatoires.
</div>
<!-- Erreur : format invalide -->
<div id="errorFormat" class="alert alert-danger d-none">
Format d'image invalide. Formats acceptés : JPG, PNG, WEBP.
</div>
</header>
<div class="section">
<form id="addPairForm" class="mt-3">
<!-- Titre -->
<div class="mb-3">
<label class="form-label fw-bold" for="pairTitle">Titre du résultat (obligatoire)</label>
<input type="text" id="pairTitle" class="form-control" required>
</div>
<!-- Type -->
<div class="mb-3">
<label class="form-label fw-bold" for="pairType">Type (obligatoire)</label>
<select id="pairType" class="form-select" required>
<option value="">-- Choisir --</option>
<option value="Chien">Chien</option>
<option value="Chat">Chat</option>
</select>
</div>
<!-- Image AVANT -->
<div class="mb-4">
<label class="form-label fw-bold" for="beforeImage">Image AVANT (obligatoire, formats acceptés :
jpg,
png, webp)</label>
<input type="file" id="beforeImage" class="form-control" accept="image/*" required>
<img id="beforePreview" class="img-preview border mt-2" src="#" alt="image avant">
</div>
<!-- Image APRÈS -->
<div class="mb-4">
<label class="form-label fw-bold" for="afterImage">Image APRÈS (obligatoire, formats acceptés :
jpg,
png, webp)</label>
<input type="file" id="afterImage" class="form-control" accept="image/*" required>
<img id="afterPreview" class="img-preview border mt-2" src="#" alt="image après">
</div>
<!-- Boutons : empilés en mobile, côte à côte en md+ -->
<div class="row mt-4 g-3">
<div class="col-12 col-md-6">
<a href="../html/liste_avant_apres.html" class="btn btn-secondary w-100">
Annuler
</a>
</div>
<div class="col-12 col-md-6">
<button type="submit" class="btn btn-primary w-100">
Ajouter
</button>
</div>
</div>
</form>
</div>
</div>
</main>
<script src="../js/ajouter_avant_apres.js"></script>
<script src="../../node_modules/bootstrap/dist/js/bootstrap.bundle.min.js"></script>
<script src="../../header-composant.js"></script>
</body>
</html>

View File

@@ -0,0 +1,117 @@
<!DOCTYPE html>
<html lang="fr">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Ajouter une prestation</title>
<link rel="stylesheet" href="/css/prestation.css">
<link rel="stylesheet" href="/node_modules/bootstrap/dist/css/bootstrap.min.css">
</head>
<body>
<header>
<nav class="navbar navbar-expand-xxl bg-body-tertiary shadow-sm">
<div class="container-fluid align-items-center">
<a class="navbar-brand" href="#">L'Il'eau chiens - Admin</a>
<button class="navbar-toggler" type="button" data-bs-toggle="collapse"
data-bs-target="#navbarSupportedContent" aria-controls="navbarSupportedContent"
aria-expanded="false" aria-label="Toggle navigation">
<span class="navbar-toggler-icon"></span>
</button>
<div class="collapse navbar-collapse" id="navbarSupportedContent">
<!-- MENU GAUCHE -->
<ul class="navbar-nav me-auto mb-2 mb-lg-0">
<li class="nav-item"><a class="nav-link active" href="#">Blog</a></li>
<li class="nav-item"><a class="nav-link" href="#">Boutique</a></li>
<li class="nav-item"><a class="nav-link" href="#">Prestations</a></li>
<li class="nav-item"><a class="nav-link" href="#">FAQ</a></li>
<li class="nav-item"><a class="nav-link" href="#">Fiche de renseignements</a></li>
<li class="nav-item"><a class="nav-link" href="#">Partenaires</a></li>
</ul>
<!-- MENU DROIT -->
<ul class="navbar-nav ms-auto mb-2 mb-lg-0">
<li class="nav-item">
<a class="nav-link" href="#"><i class="bi bi-megaphone me-1"></i> Message d'actu</a>
</li>
<li class="nav-item">
<a class="nav-link" href="#"><i class="bi bi-box-arrow-up-right me-1"></i> Voir le site</a>
</li>
<li class="nav-item">
<a class="nav-link" href="#"><i class="bi bi-gear me-1"></i> Configuration</a>
</li>
<li class="nav-item dropdown">
<a class="nav-link dropdown-toggle" href="#" id="userMenu" data-bs-toggle="dropdown">
<i class="bi bi-person-circle me-1"></i> <span id="userFirstName">Prénom</span>
</a>
<ul class="dropdown-menu dropdown-menu-end">
<li><a class="dropdown-item" href="#">Profil</a></li>
<li><hr class="dropdown-divider"></li>
<li><a class="dropdown-item" href="#">Sortir</a></li>
</ul>
</li>
</ul>
</div>
</div>
</nav>
</header>
<div class="container">
<h1 class="mb-5 text-center">Ajouter une prestation</h1>
<!-- Messages DOM -->
<div id="messages" class="mb-3"></div>
<form id="addCategoryForm">
<div class="mb-4">
<label class="form-label fw-bold">Titre de la prestation (obligatoire)</label>
<input type="text" id="categoryName" class="form-control">
</div>
<div class="mb-3">
<label class="form-label fw-bold">Type de prestation</label>
<select id="prestationType" class="form-select">
<option value="chien" selected>Chien</option>
<option value="chat">Chat</option>
</select>
</div>
<div class="mb-3">
<label class="form-label fw-bold">Description de la prestation</label>
<textarea id="prestationDescription" class="form-control" rows="5">
</textarea>
</div>
<div class="mb-3">
<label class="form-label fw-bold">Tarif (fourchette)</label>
<div class="d-flex gap-3">
<input type="number" id="priceMin" class="form-control" placeholder="Prix min (€)" value="35">
<input type="number" id="priceMax" class="form-control" placeholder="Prix max (€)" value="60">
</div>
</div>
<div class="d-flex gap-3 mt-4">
<a href="../liste_prestation/liste_prestation.html" class="btn btn-secondary w-50">Annuler</a>
<button type="submit" class="btn btn-primary w-50">Ajouter</button>
</div>
</form>
</div>
<script src="ajouter_prestation.js"></script>
<script src="/node_modules/bootstrap/dist/js/bootstrap.bundle.min.js"></script>
</body>
</html>

View File

@@ -0,0 +1,147 @@
<!DOCTYPE html>
<html lang="fr">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Ajouter un slide</title>
<link
rel="stylesheet"
href="/node_modules/bootstrap/dist/css/bootstrap.min.css"
/>
<link rel="stylesheet" href="/css/prestation.css" />
</head>
<body>
<header>
<nav class="navbar navbar-expand-xxl bg-body-tertiary shadow-sm">
<div class="container-fluid align-items-center">
<a class="navbar-brand" href="#">L'Il'eau chiens - Admin</a>
<button
class="navbar-toggler"
type="button"
data-bs-toggle="collapse"
data-bs-target="#navbarSupportedContent"
aria-controls="navbarSupportedContent"
aria-expanded="false"
aria-label="Toggle navigation"
>
<span class="navbar-toggler-icon"></span>
</button>
<div class="collapse navbar-collapse" id="navbarSupportedContent">
<!-- MENU GAUCHE -->
<ul class="navbar-nav me-auto mb-2 mb-lg-0">
<li class="nav-item">
<a class="nav-link active" href="#">Blog</a>
</li>
<li class="nav-item">
<a class="nav-link" href="#">Boutique</a>
</li>
<li class="nav-item">
<a class="nav-link" href="#">Prestations</a>
</li>
<li class="nav-item"><a class="nav-link" href="#">FAQ</a></li>
<li class="nav-item">
<a class="nav-link" href="#">Fiche de renseignements</a>
</li>
<li class="nav-item">
<a class="nav-link" href="#">Partenaires</a>
</li>
</ul>
<!-- MENU DROIT -->
<ul class="navbar-nav ms-auto mb-2 mb-lg-0">
<li class="nav-item">
<a class="nav-link" href="#"
><i class="bi bi-megaphone me-1"></i> Message d'actu</a
>
</li>
<li class="nav-item">
<a class="nav-link" href="#"
><i class="bi bi-box-arrow-up-right me-1"></i> Voir le site</a
>
</li>
<li class="nav-item">
<a class="nav-link" href="#"
><i class="bi bi-gear me-1"></i> Configuration</a
>
</li>
<li class="nav-item dropdown">
<a
class="nav-link dropdown-toggle"
href="#"
id="userMenu"
data-bs-toggle="dropdown"
>
<i class="bi bi-person-circle me-1"></i>
<span id="userFirstName">Prénom</span>
</a>
<ul class="dropdown-menu dropdown-menu-end">
<li><a class="dropdown-item" href="#">Profil</a></li>
<li><hr class="dropdown-divider" /></li>
<li><a class="dropdown-item" href="#">Sortir</a></li>
</ul>
</li>
</ul>
</div>
</div>
</nav>
</header>
<div id="header-placeholder"></div>
<div class="container">
<h2 class="text-center mb-4">Ajouter une image au slider</h2>
<!-- Messages DOM -->
<div id="messages" class="mb-3"></div>
<form id="addSlideForm">
<!-- Image -->
<div class="mb-3">
<label class="form-label fw-bold">Image du slide *</label>
<input
type="file"
id="slideImage"
class="form-control"
accept="image/*"
/>
</div>
<!-- ALT -->
<div class="mb-3">
<label class="form-label fw-bold">Texte ALT *</label>
<input
type="text"
id="slideAlt"
class="form-control"
placeholder="Description de limage"
/>
</div>
<!-- Titre -->
<div class="mb-3">
<label class="form-label fw-bold">Titre (optionnel)</label>
<input type="text" id="slideTitle" class="form-control" />
</div>
<!-- Boutons -->
<div class="d-flex gap-3 mt-4">
<a
href="/prestations/html/prestation_accueil.html"
class="btn btn-secondary w-50"
>Annuler</a
>
<button type="submit" class="btn btn-primary w-50">Ajouter</button>
</div>
</form>
</div>
<script src="/prestations/js/ajouter_slider.js"></script>
<script src="/node_modules/bootstrap/dist/js/bootstrap.bundle.min.js"></script>
</body>
</html>
<!--<script src="../../header-composant.js"></script>-->

View File

@@ -0,0 +1,111 @@
<!DOCTYPE html>
<html lang="fr">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Modifier un résultat avant/après</title>
<link href="/node_modules/bootstrap/dist/css/bootstrap.min.css" rel="stylesheet">
<link rel="stylesheet" href="/node_modules/bs-icon/icons.css">
<link rel="stylesheet" href="/css/style.css">
<link rel="stylesheet" href="/css/avant_apres.css">
</head>
<body>
<div id="header-placeholder"></div>
<main class="my-5 fs-6">
<div class="container">
<header>
<h1 class="title fs-2">Modifier un résultat en images (Avant / Après)</h1>
<!-- Messages -->
<div id="successMsg" class="alert alert-success d-none">
Le résultat a été modifié avec succès.
</div>
<div id="errorMsg" class="alert alert-danger d-none">
Une erreur est survenue. Merci de vérifier le formulaire.
</div>
<!-- Erreur : format invalide -->
<div id="errorFormat" class="alert alert-danger d-none">
Format d'image invalide. Formats acceptés : JPG, PNG, WEBP.
</div>
</header>
<div class="section">
<!-- Formulaire de modification -->
<form id="editPairForm" class="mt-3">
<!-- ID caché -->
<input type="hidden" id="pairId">
<!-- Titre-->
<div class="mb-3">
<label for="pairTitle" class="form-label fw-bold">Titre du résultat
(obligatoire)</label>
<input type="text" class="form-control" id="pairTitle" required>
</div>
<!-- Type -->
<div class="mb-3">
<label class="form-label fw-bold" for="pairType">Type (obligatoire)</label>
<select id="pairType" class="form-select" required>
<option value="">-- Choisir --</option>
<option value="Chien">Chien</option>
<option value="Chat">Chat</option>
</select>
</div>
<!-- Images AVANT / APRÈS -->
<div class="row gy-4 mb-4">
<!-- Image AVANT -->
<div class="col-12">
<label class="form-label fw-bold" for="beforeImage">
Image AVANT (obligatoire, formats acceptés : jpg, png, webp)
</label>
<input type="file" class="form-control" id="beforeImage" accept="image/*" required>
<img id="beforePreview" class="img-preview mt-2 d-none" src="#" alt="Aperçu avant">
</div>
<!-- Image APRÈS -->
<div class="col-12">
<label class="form-label fw-bold" for="afterImage">
Image APRÈS (obligatoire, formats acceptés : jpg, png, webp)
</label>
<input type="file" class="form-control" id="afterImage" accept="image/*" required>
<img id="afterPreview" class="img-preview mt-2 d-none" src="#" alt="Aperçu après">
</div>
</div>
<!-- Boutons -->
<div class="row mt-4 g-3">
<div class="col-12 col-md-6">
<a href="../html/liste_avant_apres.html" class="btn btn-secondary w-100">
Annuler
</a>
</div>
<div class="col-12 col-md-6">
<button type="submit" class="btn btn-primary w-100">
Enregistrer les modifications
</button>
</div>
</div>
</form>
</div>
</div>
</main>
<script src="../../node_modules/bootstrap/dist/js/bootstrap.bundle.min.js"></script>
<script src="../js/modifier_avant_apres.js"></script>
<script src="../../header-composant.js"></script>
</body>
</html>

View File

@@ -0,0 +1,98 @@
<!DOCTYPE html>
<html lang="fr">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Modifier une prestation</title>
<link
rel="stylesheet"
href="/node_modules/bootstrap/dist/css/bootstrap.min.css"
/>
<link rel="stylesheet" href="/css/prestation.css" />
</head>
<body>
<header>
<nav class="navbar navbar-expand-xxl bg-body-tertiary shadow-sm">
<div class="container-fluid align-items-center">
<a class="navbar-brand" href="#">L'Il'eau chiens - Admin</a>
</div>
</nav>
</header>
<div class="container">
<h2 class="mb-4 text-center">Modifier une prestation</h2>
<div id="messages" class="mb-3"></div>
<form id="editPrestationForm">
<!-- Titre -->
<div class="mb-3">
<label class="form-label fw-bold">Titre de la prestation *</label>
<input
type="text"
id="prestationTitle"
class="form-control"
value="Toilettage complet pour chien"
/>
</div>
<!-- Type -->
<div class="mb-3">
<label class="form-label fw-bold">Type de prestation</label>
<select id="prestationType" class="form-select">
<option value="chien" selected>Chien</option>
<option value="chat">Chat</option>
</select>
</div>
<!-- Description -->
<div class="mb-3">
<label class="form-label fw-bold">Description de la prestation</label>
<textarea id="prestationDescription" class="form-control" rows="5">
• Bain complet
• Séchage
• Coupe aux ciseaux
• Nettoyage des oreilles
</textarea
>
</div>
<!-- Tarifs -->
<div class="mb-3">
<label class="form-label fw-bold">Tarif (fourchette)</label>
<div class="d-flex gap-3">
<input
type="number"
id="priceMin"
class="form-control"
value="35"
/>
<input
type="number"
id="priceMax"
class="form-control"
value="60"
/>
</div>
</div>
<!-- Boutons -->
<div class="d-flex gap-3 mt-4">
<a
href="/prestations/html/prestation_accueil.html"
class="btn btn-secondary w-50"
>Annuler</a
>
<button type="submit" class="btn btn-primary w-50">
Enregistrer les modifications
</button>
</div>
</form>
</div>
<script src="/prestations/js/modifier_prestation.js"></script>
<script src="/node_modules/bootstrap/dist/js/bootstrap.bundle.min.js"></script>
</body>
</html>

View File

@@ -8,6 +8,9 @@
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/css/bootstrap.min.css" rel="stylesheet"> <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/css/bootstrap.min.css" rel="stylesheet">
<style> <style>
body { body {
background: #f4f6f9; background: #f4f6f9;
} }
@@ -27,6 +30,9 @@
<body> <body>
<div id="header-placeholder"></div>
<div class="container"> <div class="container">
<h2 class="text-center mb-5">Modifier une image du slider</h2> <h2 class="text-center mb-5">Modifier une image du slider</h2>
@@ -71,6 +77,7 @@
<script src="modifier_slider.js"></script> <script src="modifier_slider.js"></script>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/js/bootstrap.bundle.min.js"></script> <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/js/bootstrap.bundle.min.js"></script>
<script src="../../header-composant.js"></script>
</body> </body>
</html> </html>

View File

@@ -0,0 +1,257 @@
<!DOCTYPE html>
<html lang="fr">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Gérer les prestations</title>
<link href="../../node_modules/bootstrap/dist/css/bootstrap.min.css" rel="stylesheet">
<link rel="stylesheet" href="../../node_modules/bs-icon/icons.css">
<link rel="stylesheet" href="../../css/style.css">
</head>
<body>
<div id="header-placeholder"></div>
<main class="my-5 fs-6">
<div class="container">
<header>
<h1 class="title fs-2 my-4">Gérer la page prestations</h1>
</header>
<div class="section">
<div class="accordion" id="accordionExample">
<!-- ACCORDÉON 1 -->
<div class="accordion-item">
<h2 class="accordion-header">
<button class="accordion-button" type="button" data-bs-toggle="collapse"
data-bs-target="#collapseOne" aria-expanded="true" aria-controls="collapseOne">
Gérer les prestations et leurs catégories
</button>
</h2>
<div id="collapseOne" class="accordion-collapse collapse show"
data-bs-parent="#accordionExample">
<div class="accordion-body">
<section class="presta my-3">
<h3 class="fs-4">Prestations</h3>
<div class="mb-4 mt-2">
<a href="../html/ajouter_avant_apres.html" class="btn btn-primary btn-sm">
Ajouter une prestation
</a>
</div>
<table class="table table-striped table-hover align-middle">
<thead class="table-dark">
<tr>
<th>Titre</th>
<th class="text-end">Actions</th>
</tr>
</thead>
<tbody>
<!-- Prestation 1 -->
<tr>
<td>Toilettage complet</td>
<td class="text-end">
<a href="#" class="btn btn-sm btn-outline-primary me-1">Modifier</a>
<button
class="btn btn-sm btn-outline-danger delete-btn">Supprimer</button>
</td>
</tr>
<!-- Prestation 2 -->
<tr>
<td>Toilettage express</td>
<td class="text-end">
<a href="#" class="btn btn-sm btn-outline-primary me-1">Modifier</a>
<button
class="btn btn-sm btn-outline-danger delete-btn">Supprimer</button>
</td>
</tr>
</tbody>
</table>
</section>
<section class="carte my-3">
<h3 class="fs-4 mt-4">Cartes</h3>
<div class="mb-4 mt-2">
<a href="../html/ajouter_avant_apres.html" class="btn btn-primary btn-sm">
Ajouter une carte
</a>
</div>
<table class="table table-striped table-hover align-middle">
<thead class="table-dark">
<tr>
<th>Titre</th>
<th class="text-end">Actions</th>
</tr>
</thead>
<tbody>
<tr>
<td>Coupe ciseaux</td>
<td class="text-end">
<a href="#" class="btn btn-sm btn-outline-primary me-1">Modifier</a>
<button
class="btn btn-sm btn-outline-danger delete-btn">Supprimer</button>
</tr>
<tr>
<td>Coupe griffes</td>
<td class="text-end">
<a href="#" class="btn btn-sm btn-outline-primary me-1">Modifier</a>
<button
class="btn btn-sm btn-outline-danger delete-btn">Supprimer</button>
</td>
</tr>
</tbody>
</table>
</section>
</div>
</div>
</div>
<!-- ACCORDÉON 2 -->
<div class="accordion-item">
<h2 class="accordion-header">
<button class="accordion-button collapsed" type="button" data-bs-toggle="collapse"
data-bs-target="#collapseTwo" aria-expanded="false" aria-controls="collapseTwo">
Gérer le slider
</button>
</h2>
<div id="collapseTwo" class="accordion-collapse collapse" data-bs-parent="#accordionExample">
<div class="accordion-body">
<div class="mb-4 mt-2">
<a href="../html/ajouter_avant_apres.html" class="btn btn-primary btn-sm">
Ajouter un slider
</a>
</div>
<table class="table table-striped table-hover align-middle">
<thead class="table-dark">
<tr>
<th>Titre</th>
<th class="text-end">Actions</th>
</tr>
</thead>
<tbody>
<tr>
<td><img src="slide1.webp" alt="Chien toiletté" class="img-thumbnail"></td>
<td class="text-end">
<a href="#" class="btn btn-sm btn-outline-primary me-1">Modifier</a>
<button
class="btn btn-sm btn-outline-danger delete-btn">Supprimer</button>
</td>
</tr>
<tr>
<td>Avant / Après</td>
<td class="text-end">
<a href="#" class="btn btn-sm btn-outline-primary me-1">Modifier</a>
<button
class="btn btn-sm btn-outline-danger delete-btn">Supprimer</button>
</td>
</tr>
<tr>
<td>Nouveauté</td>
<td class="text-end">
<a href="#" class="btn btn-sm btn-outline-primary me-1">Modifier</a>
<button
class="btn btn-sm btn-outline-danger delete-btn">Supprimer</button>
</td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
<!-- ACCORDÉON 3 -->
<div class="accordion-item">
<h2 class="accordion-header">
<button class="accordion-button collapsed" type="button" data-bs-toggle="collapse"
data-bs-target="#collapseThree" aria-expanded="false" aria-controls="collapseThree">
Gérer la galerie avant/après
</button>
</h2>
<div id="collapseThree" class="accordion-collapse collapse" data-bs-parent="#accordionExample">
<div class="accordion-body">
<div class="mb-4 mt-2">
<a href="../html/ajouter_avant_apres.html" class="btn btn-primary btn-sm">
Ajouter un résultat
</a>
</div>
<table class="table table-striped table-hover align-middle">
<thead class="table-dark">
<tr>
<th>Titre</th>
<th class="text-end">Actions</th>
</tr>
</thead>
<tbody>
<tr>
<td>Toilettage complet</td>
<td class="text-end">
<a href="../html/modifier_avant_apres.html"
class="btn btn-sm btn-outline-primary me-1">Modifier</a>
<button
class="btn btn-sm btn-outline-danger delete-btn">Supprimer</button>
</td>
</tr>
<tr>
<td>Toilettage complet</td>
<td class="text-end">
<a href="../html/modifier_avant_apres.html"
class="btn btn-sm btn-outline-primary me-1">Modifier</a>
<button
class="btn btn-sm btn-outline-danger delete-btn">Supprimer</button>
</td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
</div> <!-- /#accordionExample -->
</div>
</div>
<div id="modal-placeholder"></div>
</main>
<script src="../../node_modules/bootstrap/dist/js/bootstrap.bundle.min.js"></script>
<script src="../components/js/header-composant.js"></script>
<script src="../components/js/delete-composant.js"></script>
</body>
</html>

111
prestations/html/verif.html Normal file
View File

@@ -0,0 +1,111 @@
<!DOCTYPE html>
<html lang="fr">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Modifier un résultat avant/après</title>
<link href="/node_modules/bootstrap/dist/css/bootstrap.min.css" rel="stylesheet">
<link rel="stylesheet" href="/node_modules/bs-icon/icons.css">
<link rel="stylesheet" href="/css/style.css">
<link rel="stylesheet" href="/css/avant_apres.css">
</head>
<body>
<div id="header-placeholder"></div>
<main class="my-5 fs-6">
<div class="container">
<header>
<h1 class="title fs-2">Modifier un résultat en images (Avant / Après)</h1>
<!-- Messages -->
<div id="successMsg" class="alert alert-success d-none">
Le résultat a été modifié avec succès.
</div>
<div id="errorMsg" class="alert alert-danger d-none">
Une erreur est survenue. Merci de vérifier le formulaire.
</div>
<!-- Erreur : format invalide -->
<div id="errorFormat" class="alert alert-danger d-none">
Format d'image invalide. Formats acceptés : JPG, PNG, WEBP.
</div>
</header>
<div class="section">
<!-- Formulaire de modification -->
<form id="editPairForm" class="mt-3">
<!-- ID caché -->
<input type="hidden" id="pairId">
<!-- Titre-->
<div class="mb-3">
<label for="pairTitle" class="form-label fw-bold">Titre du résultat
(obligatoire)</label>
<input type="text" class="form-control" id="pairTitle" required>
</div>
<!-- Type -->
<div class="mb-3">
<label class="form-label fw-bold" for="pairType">Type (obligatoire)</label>
<select id="pairType" class="form-select" required>
<option value="">-- Choisir --</option>
<option value="Chien">Chien</option>
<option value="Chat">Chat</option>
</select>
</div>
<!-- Images AVANT / APRÈS -->
<div class="row gy-4 mb-4">
<!-- Image AVANT -->
<div class="col-12">
<label class="form-label fw-bold" for="beforeImage">
Image AVANT (obligatoire, formats acceptés : jpg, png, webp)
</label>
<input type="file" class="form-control" id="beforeImage" accept="image/*" required>
<img id="beforePreview" class="img-preview mt-2 d-none" src="#" alt="Aperçu avant">
</div>
<!-- Image APRÈS -->
<div class="col-12">
<label class="form-label fw-bold" for="afterImage">
Image APRÈS (obligatoire, formats acceptés : jpg, png, webp)
</label>
<input type="file" class="form-control" id="afterImage" accept="image/*" required>
<img id="afterPreview" class="img-preview mt-2 d-none" src="#" alt="Aperçu après">
</div>
</div>
<!-- Boutons -->
<div class="row mt-4 g-3">
<div class="col-12 col-md-6">
<a href="../html/liste_avant_apres.html" class="btn btn-secondary w-100">
Annuler
</a>
</div>
<div class="col-12 col-md-6">
<button type="submit" class="btn btn-primary w-100">
Enregistrer les modifications
</button>
</div>
</div>
</form>
</div>
</div>
</main>
<script src="/node_modules/bootstrap/dist/js/bootstrap.bundle.min.js"></script>
<script src="../js/modifier_avant_apres.js"></script>
</body>
</html>

View File

@@ -30,13 +30,48 @@ const afterPreview = document.getElementById("afterPreview");
const successMsg = document.getElementById("successMsg"); const successMsg = document.getElementById("successMsg");
const errorMsg = document.getElementById("errorMsg"); const errorMsg = document.getElementById("errorMsg");
const errorFormat = document.getElementById("errorFormat");
// Formats autorisés
const allowedTypes = ["image/jpeg", "image/png", "image/webp"];
// =============================== // ===============================
// Prévisualisation images // Fonctions utilitaires
// ===============================
function hideMessages() {
successMsg.classList.add("d-none");
errorMsg.classList.add("d-none");
errorFormat.classList.add("d-none");
}
function isValidFormat(file) {
if (!file) return false;
return allowedTypes.includes(file.type);
}
// ===============================
// Prévisualisation image AVANT
// + contrôle du format
// =============================== // ===============================
beforeInput.addEventListener("change", function () { beforeInput.addEventListener("change", function () {
hideMessages();
const file = this.files[0]; const file = this.files[0];
if (!file) return;
if (!file) {
beforePreview.style.display = "none";
beforePreview.src = "#";
return;
}
// Vérif format
if (!isValidFormat(file)) {
errorFormat.classList.remove("d-none");
this.value = ""; // reset le champ
beforePreview.style.display = "none";
beforePreview.src = "#";
return;
}
const reader = new FileReader(); const reader = new FileReader();
reader.onload = e => { reader.onload = e => {
@@ -46,9 +81,29 @@ beforeInput.addEventListener("change", function () {
reader.readAsDataURL(file); reader.readAsDataURL(file);
}); });
// ===============================
// Prévisualisation image APRÈS
// + contrôle du format
// ===============================
afterInput.addEventListener("change", function () { afterInput.addEventListener("change", function () {
hideMessages();
const file = this.files[0]; const file = this.files[0];
if (!file) return;
if (!file) {
afterPreview.style.display = "none";
afterPreview.src = "#";
return;
}
// Vérif format
if (!isValidFormat(file)) {
errorFormat.classList.remove("d-none");
this.value = ""; // reset le champ
afterPreview.style.display = "none";
afterPreview.src = "#";
return;
}
const reader = new FileReader(); const reader = new FileReader();
reader.onload = e => { reader.onload = e => {
@@ -64,23 +119,35 @@ afterInput.addEventListener("change", function () {
form.addEventListener("submit", function (e) { form.addEventListener("submit", function (e) {
e.preventDefault(); e.preventDefault();
// Reset messages hideMessages();
errorMsg.classList.add("d-none");
successMsg.classList.add("d-none");
// Validation simple // Champs obligatoires
if (!titleInput.value.trim() || !typeInput.value.trim() || !beforeInput.files[0] || !afterInput.files[0]) { if (
!titleInput.value.trim() ||
!typeInput.value.trim() ||
!beforeInput.files[0] ||
!afterInput.files[0]
) {
errorMsg.classList.remove("d-none"); errorMsg.classList.remove("d-none");
return; return;
} }
const beforeFile = beforeInput.files[0];
const afterFile = afterInput.files[0];
// Vérification format des deux images
if (!isValidFormat(beforeFile) || !isValidFormat(afterFile)) {
errorFormat.classList.remove("d-none");
return;
}
// Nouvelle entrée (simulation) // Nouvelle entrée (simulation)
const newPair = { const newPair = {
id: galleryPairs.length + 1, id: galleryPairs.length + 1,
titre: titleInput.value.trim(), titre: titleInput.value.trim(),
type: typeInput.value.trim(), type: typeInput.value.trim(),
avant: URL.createObjectURL(beforeInput.files[0]), avant: URL.createObjectURL(beforeFile),
apres: URL.createObjectURL(afterInput.files[0]) apres: URL.createObjectURL(afterFile)
}; };
galleryPairs.push(newPair); galleryPairs.push(newPair);

View File

@@ -0,0 +1,57 @@
// Éléments
const form = document.getElementById("addCategoryForm");
const messages = document.getElementById("messages");
const titleField = document.getElementById("categoryName");
const typeField = document.getElementById("prestationType");
const descField = document.getElementById("prestationDescription");
const priceMinField = document.getElementById("priceMin");
const priceMaxField = document.getElementById("priceMax");
// Prestations existantes (simulation BDD)
const existingPrestations = [
"Toilettage complet",
"Coupe ciseaux",
"Toilettage chiot",
"Démêlage poil long"
];
function showMessage(type, text) {
messages.innerHTML = "";
const div = document.createElement("div");
div.className = `alert alert-${type}`;
div.textContent = text;
messages.appendChild(div);
}
form.addEventListener("submit", function (e) {
e.preventDefault();
messages.innerHTML = "";
const titre = titleField.value.trim();
// Titre obligatoire
if (!titre) {
showMessage("danger", "Le titre de la prestation est obligatoire.");
return;
}
// Doublon
if (existingPrestations.includes(titre)) {
showMessage("danger", "Cette prestation existe déjà. Veuillez en choisir une autre.");
return;
}
// Succès
existingPrestations.push(titre);
showMessage("success", "Prestation ajoutée avec succès !");
// Redirection
setTimeout(() => {
window.location.href = "../liste_prestation/liste_prestation.html";
}, 1500);
});

View File

@@ -0,0 +1,71 @@
const form = document.getElementById("addSlideForm");
const messages = document.getElementById("messages");
const imgField = document.getElementById("slideImage");
const altField = document.getElementById("slideAlt");
const titleField = document.getElementById("slideTitle");
// Simulation BDD
let slides = [];
function showMessage(type, text) {
messages.innerHTML = "";
const div = document.createElement("div");
div.className = `alert alert-${type}`;
div.textContent = text;
messages.appendChild(div);
}
form.addEventListener("submit", function (e) {
e.preventDefault();
messages.innerHTML = "";
const image = imgField.files[0];
const alt = altField.value.trim();
const title = titleField.value.trim();
// Image obligatoire
if (!image) {
showMessage("danger", "Merci de sélectionner une image.");
return;
}
// ALT obligatoire
if (!alt) {
showMessage("danger", "Le texte ALT est obligatoire.");
return;
}
// Vérification format
const validFormats = ["image/jpeg", "image/png", "image/webp"];
if (!validFormats.includes(image.type)) {
showMessage(
"danger",
"Format d'image invalide. Formats acceptés : JPG, PNG, WEBP."
);
return;
}
// Enregistrement simulé
slides.push({
id: Date.now(),
image: image.name,
alt,
title,
order: slides.length + 1
});
console.log("Nouveau slide ajouté :", slides);
// Succès
showMessage("success", "Slide ajouté avec succès !");
// Redirection
setTimeout(() => {
window.location.href = "/prestations/html/prestation_accueil.html";
}, 1500);
});

View File

@@ -19,6 +19,11 @@ const galleryPairs = [
} }
]; ];
// ===============================
// Formats d'images autorisés
// ===============================
const allowedTypes = ["image/jpeg", "image/png", "image/webp"];
// Sélecteurs // Sélecteurs
const editForm = document.getElementById("editPairForm"); const editForm = document.getElementById("editPairForm");
const pairIdInput = document.getElementById("pairId"); const pairIdInput = document.getElementById("pairId");
@@ -31,6 +36,7 @@ const afterPreview = document.getElementById("afterPreview");
const successMsg = document.getElementById("successMsg"); const successMsg = document.getElementById("successMsg");
const errorMsg = document.getElementById("errorMsg"); const errorMsg = document.getElementById("errorMsg");
const errorFormat = document.getElementById("errorFormat");
// =============================== // ===============================
// Récup ID dans l'URL // Récup ID dans l'URL
@@ -71,23 +77,39 @@ function loadPairData() {
afterPreview.src = pair.apres; afterPreview.src = pair.apres;
} }
// Prévisu des nouvelles images // ===============================
beforeInput.addEventListener("change", function () { // Gestion du changement d'image
const file = this.files[0]; // ===============================
function handleImageChange(inputEl, previewEl) {
const file = inputEl.files[0];
if (!file) return; if (!file) return;
// Vérification format
if (!allowedTypes.includes(file.type)) {
// Format non autorisé
errorFormat.classList.remove("d-none");
inputEl.value = ""; // reset du champ
previewEl.src = ""; // reset de la prévisu
return;
}
// Format OK → on cache le message d'erreur
errorFormat.classList.add("d-none");
const reader = new FileReader(); const reader = new FileReader();
reader.onload = e => beforePreview.src = e.target.result; reader.onload = e => {
previewEl.src = e.target.result;
};
reader.readAsDataURL(file); reader.readAsDataURL(file);
}
// Prévisu des nouvelles images + contrôle format
beforeInput.addEventListener("change", function () {
handleImageChange(beforeInput, beforePreview);
}); });
afterInput.addEventListener("change", function () { afterInput.addEventListener("change", function () {
const file = this.files[0]; handleImageChange(afterInput, afterPreview);
if (!file) return;
const reader = new FileReader();
reader.onload = e => afterPreview.src = e.target.result;
reader.readAsDataURL(file);
}); });
// Soumission // Soumission
@@ -96,6 +118,7 @@ editForm.addEventListener("submit", function (e) {
errorMsg.classList.add("d-none"); errorMsg.classList.add("d-none");
successMsg.classList.add("d-none"); successMsg.classList.add("d-none");
errorFormat.classList.add("d-none");
if (!titleInput.value.trim()) { if (!titleInput.value.trim()) {
errorMsg.textContent = "Le titre est obligatoire."; errorMsg.textContent = "Le titre est obligatoire.";
@@ -103,7 +126,16 @@ editForm.addEventListener("submit", function (e) {
return; return;
} }
// Ici ce serait un fetch vers l'API en vrai. // Double check format côté submit (au cas où)
const filesToCheck = [beforeInput.files[0], afterInput.files[0]];
for (const file of filesToCheck) {
if (!file || !allowedTypes.includes(file.type)) {
errorFormat.classList.remove("d-none");
return;
}
}
successMsg.classList.remove("d-none"); successMsg.classList.remove("d-none");
setTimeout(() => { setTimeout(() => {

View File

@@ -0,0 +1,56 @@
const form = document.getElementById("editPrestationForm");
const messages = document.getElementById("messages");
const titleField = document.getElementById("prestationTitle");
const descriptionField = document.getElementById("prestationDescription");
const typeField = document.getElementById("prestationType");
const priceMinField = document.getElementById("priceMin");
const priceMaxField = document.getElementById("priceMax");
function showMessage(type, text) {
messages.innerHTML = "";
const div = document.createElement("div");
div.className = `alert alert-${type}`;
div.textContent = text;
messages.appendChild(div);
}
form.addEventListener("submit", function (e) {
e.preventDefault();
messages.innerHTML = "";
const title = titleField.value.trim();
// Champ obligatoire
if (!title) {
showMessage("danger", "Le titre de la prestation est obligatoire.");
return;
}
// Simulation erreur technique
const erreurTechnique = false; // mettre true pour tester
if (erreurTechnique) {
showMessage("danger", "Une erreur est survenue. Veuillez réessayer plus tard.");
return;
}
// Succès
showMessage("success", "Prestation modifiée avec succès !");
console.log("Nouvelles données :", {
titre: title,
type: typeField.value,
description: descriptionField.value,
prixMin: priceMinField.value,
prixMax: priceMaxField.value
});
// Redirection
setTimeout(() => {
window.location.href = "/prestations/html/prestation_accueil.html";
}, 1500);
});

View File

@@ -1,59 +0,0 @@
<!DOCTYPE html>
<html lang="fr">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Liste des prestations</title>
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/css/bootstrap.min.css">
<style>
body {
background: #f4f6f9;
padding: 30px;
}
.container {
margin-top: 100px;
}
.action-btns button,
.action-btns a {
margin-right: 100px;
}
</style>
</head>
<body>
<div class="container">
<h2 class="mb-5 text-center">Liste des prestations</h2>
<!--Message succès-->
<div id="succesDeleteMsg" class="alert alert-success d-none">Prestation supprimée avec succès !</div>
<div class="d-flex justify-content-end mb-4">
<a href="../ajouter_prestation/ajouter_prestation.html" class="btn btn-primary">Ajouter une prestation</a>
</div>
<table class="table table-striped table-hover align-middle">
<thead class="table-dark">
<tr>
<th>Titre</th>
<th>Type</th>
<th>Description</th>
<th>Tarif</th>
<th class="text-center">Actions</th>
</tr>
</thead>
<tbody id="prestationTableBody">
<!--Rempli en JS-->
</tbody>
</table>
</div>
<script src="../../prestations/liste_prestation/liste_prestation.js"></script>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/js/bootstrap.bundle.min.js"></script>
</body>
</html>

View File

@@ -1,61 +0,0 @@
// Exemple BDD
const prestations = [
{
id: 1,
titre: "Toilettage complet",
type: "Chien",
description: "• Bain complet \n• Séchage \n• Coupe aux ciseaux\n• Nettoyage des oreilles",
prixMin: 35,
prixMax: 60
},
{
id: 2,
titre: "Toilettage express",
type: "Chat",
description: "• Bain rapide\n• Séchage\n• Brossage",
prixMin: 20,
prixMax: 35
}
];
// Sélection des éléments
const tableBody = document.getElementById('prestationTableBody');
const successDeleteMsg = document.getElementById('successDeleteMsg');
// Fonction pour extrait description
function extrait(desc, limite = 60) {
return desc.length > limite ? desc.substring(0, limite) + '...' : desc;
}
// Affichage du tableau
function afficherPrestations() {
tableBody.innerHTML = '';
prestations.forEach((p, index) => {
const row = `
<tr>
<td>${p.titre}</td>
<td>${p.type}</td>
<td>${extrait(p.description.replace(/\n/g, " "))}</td>
<td>${p.prixMin}€ - ${p.prixMax}€</td>
<td class="text-center action-btns">
<a href="consulter_prestation.html?id=${p.id}" class="btn btn-info btn-sm">Voir</a>
<a href="../../prestations/modifier_prestation/modifier_prestation.html?id=${p.id}" class="btn btn-warning btn-sm">Modifier</a>
<button class="btn btn-danger btn-sm" onclick="supprimerPrestation(${index})">Supprimer</button>
</td>
</tr>
`;
tableBody.innerHTML += row;
});
}
afficherPrestations();
// Suppression
function supprimerPrestation(index) {
prestations.splice(index, 1);
afficherPrestations();
successDeleteMsg.classList.remove("d-none");
}

View File

@@ -1,84 +0,0 @@
<!DOCTYPE html>
<html lang="fr">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Modifier une prestation</title>
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/css/bootstrap.min.css">
<style>
body {
background: #f4f6f9;
}
.container {
max-width: 700px;
margin-top: 40px;
}
</style>
</head>
<body>
<div class="container">
<h2 class="mb-4 text-center">Modifier une prestation</h2>
<!--Erreur-->
<div id="errorEmpty" class="alert alert-danger d-none">Le titre est obligatoire.</div>
<div id="errorTechnical" class="alert alert-danger d-none">Une erreur est survenue. Veuillez réessayer plus tard.</div>
<!--Succès-->
<div id="successMsg" class="alert alert-success d-none">Prestation modifiée avec succès !</div>
<form id="editPrestationForm">
<!--Titre-->
<div class="mb-3">
<label class="form-label fw-bold">Titre de la prestation (obligatoire)</label>
<input type="text" id="prestationTitle" class="form-control" value="Toilettage complet pour chien">
</div>
<!--Type-->
<div class="mb-3">
<label class="form-label fw-bold">Type de prestation</label>
<select id="prestationType" class="form-select">
<option value="chien" selected>Chien</option>
<option value="chat">Chat</option>
</select>
</div>
<!--Description (liste à puces)-->
<div class="mb-3">
<label class="form-label fw-bold">Description de la prestation</label>
<textarea id="prestationDescription" class="form-control" rows="5">
• Bain complet
• Séchage
• Coupe aux ciseaux
• Nettoyage des oreilles</textarea>
</div>
<!--Tariffs-->
<div class="mb-3">
<label class="form-label fw-bold">Tarif (fourchette)</label>
<div class="d-flex gap-3">
<input type="number" id="priceMin" class="form-control" placeholder="Prix min (€)" value="35">
<input type="number" id="priceMax" class="form-control" placeholder="Prix max (€)" value="60">
</div>
</div>
<!-- Boutons -->
<div class="d-flex gap-3 mt-4">
<a href="../../prestations/liste_prestation/liste_prestation.html" class="btn btn-secondary w-50">Annuler</a>
<button type="submit" class="btn btn-primary w-50">Enregistrer les modifications</button>
</div>
</form>
</div>
<script src="modifier_prestation.js"></script>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/js/bootstrap.bundle.min.js"></script>
</body>
</html>

View File

@@ -1,52 +0,0 @@
const form = document.getElementById('editPrestationForm');
const titleField = document.getElementById('prestationTitle');
const descriptionField = document.getElementById('prestationDescription');
const typeField = document.getElementById('prestationType');
const priceMinField = document.getElementById('priceMin');
const priceMaxField = document.getElementById('priceMax');
const errorEmpty = document.getElementById('errorEmpty');
const errorTechnical = document.getElementById('errorTechnical');
const successMsg = document.getElementById('successMsg');
form.addEventListener('submit', function (e) {
e.preventDefault();
errorEmpty.classList.add('d-none');
errorTechnical.classList.add('d-none');
successMsg.classList.add('d-none');
const title = titleField.value.trim();
// champ obligatoire manquant
if (title === '') {
errorEmpty.classList.remove('d-none');
return;
}
// 2 Simulation derreur technique
const erreurTechnique = false; // mettre true pour tester
if (erreurTechnique) {
errorTechnical.classList.remove('d-none');
return;
}
//Succès
successMsg.classList.remove('d-none');
console.log("Nouvelles données :", {
titre: title,
type: typeField.value,
description: descriptionField.value,
prixMin: priceMinField.value,
prixMax: priceMaxField.value
});
// Redirection après un court délai
setTimeout(() => {
window.location.href = "../liste_prestation/liste_prestation.html";
}, 1500);
});

View File

@@ -1,74 +0,0 @@
<!DOCTYPE html>
<html lang="fr">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Admin - Prestations</title>
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/css/bootstrap.min.css" rel="stylesheet">
<style>
body {
background: #f4f6f9;
padding: 40px;
}
.menu-card {
transition: 0.2s;
cursor: pointer;
}
.menu-card:hover {
transform: scale(1.03);
box-shadow: 0 4px 15px rgba(0, 0, 0, 0.12);
}
.menu-icon {
font-size: 40px;
}
</style>
</head>
<body>
<div class="container text-center">
<h2 class="mb-5">Gestion des prestations</h2>
<div class="row g-4">
<!-- Prestations -->
<div class="col-md-4">
<a href="../liste_prestation/liste_prestation.html" class="text-decoration-none">
<div class="card p-4 menu-card">
<div class="menu-icon">💼</div>
<h4 class="mt-3 text-dark">Gérer les prestations</h4>
<p class="text-muted">Ajouter, modifier, supprimer les prestations.</p>
</div>
</a>
</div>
<!-- Slider -->
<div class="col-md-4">
<a href="../slider/liste_slider/liste_slider.html" class="text-decoration-none">
<div class="card p-4 menu-card">
<div class="menu-icon">🎞️</div>
<h4 class="mt-3 text-dark">Gérer le slider</h4>
<p class="text-muted">Images du slider de la page Prestations chiens.</p>
</div>
</a>
</div>
<!-- Avant / Après -->
<div class="col-md-4">
<a href="../avant_apres/liste_avant_apres/liste_avant_apres.html" class="text-decoration-none">
<div class="card p-4 menu-card">
<div class="menu-icon">🖼️</div>
<h4 class="mt-3 text-dark">Galerie Avant / Après</h4>
<p class="text-muted">Ajouter, modifier ou supprimer les photos.</p>
</div>
</a>
</div>
</div>
</div>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/js/bootstrap.bundle.min.js"></script>
</body>
</html>

View File

@@ -1,74 +0,0 @@
<!DOCTYPE html>
<html lang="fr">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Ajouter un slide</title>
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/css/bootstrap.min.css" rel="stylesheet">
<style>
body {
background: #f4f6f9;
padding: 40px;
}
.container {
max-width: 600px;
}
</style>
</head>
<body>
<div class="container">
<h2 class="text-center mb-4">Ajouter une image au slider</h2>
<!-- Erreur : image manquante -->
<div id="errorEmpty" class="alert alert-danger d-none">
Merci de sélectionner une image.
</div>
<!-- Erreur : format invalide -->
<div id="errorFormat" class="alert alert-danger d-none">
Format d'image invalide. Formats acceptés : JPG, PNG, WEBP.
</div>
<!-- Succès -->
<div id="successMsg" class="alert alert-success d-none">
Slide ajouté avec succès !
</div>
<form id="addSlideForm">
<!-- Image -->
<div class="mb-3">
<label class="form-label fw-bold">Image du slide (obligatoire)</label>
<input type="file" id="slideImage" class="form-control" accept="image/*">
</div>
<!-- ALT -->
<div class="mb-3">
<label class="form-label fw-bold">Texte ALT (obligatoire)</label>
<input type="text" id="slideAlt" class="form-control" placeholder="Description de limage">
</div>
<!-- Titre -->
<div class="mb-3">
<label class="form-label fw-bold">Titre (optionnel)</label>
<input type="text" id="slideTitle" class="form-control">
</div>
<!-- Boutons -->
<div class="d-flex gap-3 mt-4">
<a href="../../../slider/liste_slider/liste_slider.html" class="btn btn-secondary w-50">Annuler</a>
<button type="submit" class="btn btn-primary w-50">Ajouter</button>
</div>
</form>
</div>
<script src="ajouter_slider.js"></script>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/js/bootstrap.bundle.min.js"></script>
</body>
</html>

View File

@@ -1,63 +0,0 @@
const form = document.getElementById('addSlideForm');
const imgField = document.getElementById('slideImage');
const altField = document.getElementById('slideAlt');
const titleField = document.getElementById('slideTitle');
const errorEmpty = document.getElementById('errorEmpty');
const errorFormat = document.getElementById('errorFormat');
const successMsg = document.getElementById('successMsg');
// Création du tableau simulant la BDD
let slides = [];
form.addEventListener('submit', function (e) {
e.preventDefault();
// Reset messages
errorEmpty.classList.add('d-none');
errorFormat.classList.add('d-none');
successMsg.classList.add('d-none');
const image = imgField.files[0];
const alt = altField.value.trim();
// Image obligatoire
if (!image) {
errorEmpty.textContent = "Merci de sélectionner une image.";
errorEmpty.classList.remove('d-none');
return;
}
// ALT obligatoire
if (alt === "") {
errorEmpty.textContent = "Le texte ALT est obligatoire.";
errorEmpty.classList.remove('d-none');
return;
}
// Vérification format
const validFormats = ["image/jpeg", "image/png", "image/webp"];
if (!validFormats.includes(image.type)) {
errorFormat.classList.remove('d-none');
return;
}
// Enregistrement simulé
slides.push({
id: Date.now(),
image: image.name,
alt: alt,
title: titleField.value.trim(),
order: slides.length + 1
});
console.log("Nouveau slide ajouté :", slides);
// Succès
successMsg.classList.remove('d-none');
// Redirection
setTimeout(() => {
window.location.href = "../../../slider/liste_slider/liste_slider.html";
}, 1500);
});

View File

@@ -1,65 +0,0 @@
<!DOCTYPE html>
<html lang="fr">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Liste des slides</title>
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/css/bootstrap.min.css" rel="stylesheet">
<style>
body {
background: #f4f6f9;
padding: 40px;
}
.container {
max-width: 900px;
}
.miniature {
width: 90px;
height: 60px;
object-fit: cover;
border-radius: 5px;
}
.action-buttons button,
.action-buttons a {
margin-right: 8px;
}
</style>
</head>
<body>
<div class="container">
<h2 class="text-center mb-4">Slider Liste des images</h2>
<!-- Message succès (suppression / ordre) -->
<div id="successMsg" class="alert alert-success d-none"></div>
<!-- Bouton ajouter -->
<div class="d-flex justify-content-end mb-4">
<a href="../../slider/ajouter_slider/ajouter_slider.html" class="btn btn-primary">Ajouter une image au slider</a>
</div>
<table class="table table-striped table-hover align-middle">
<thead class="table-dark">
<tr>
<th>Image</th>
<th>Texte ALT</th>
<th>Titre</th>
<th>Ordre</th>
<th class="text-center">Actions</th>
</tr>
</thead>
<tbody id="sliderTableBody">
<!-- rempli en JS -->
</tbody>
</table>
</div>
<script src="liste_slider.js"></script>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/js/bootstrap.bundle.min.js"></script>
</body>
</html>

View File

@@ -1,87 +0,0 @@
// Simulation BDD slider
let slides = [
{ id: 1, image: "slide1.webp", alt: "Chien toiletté", title: "Promo du mois", order: 1 },
{ id: 2, image: "slide2.webp", alt: "Avant / Après", title: "", order: 2 },
{ id: 3, image: "slide3.webp", alt: "Coupe ciseaux", title: "Nouveauté", order: 3 }
];
const tableBody = document.getElementById("sliderTableBody");
const successMsg = document.getElementById("successMsg");
function afficherSlides() {
// trier par ordre
slides.sort((a, b) => a.order - b.order);
tableBody.innerHTML = "";
slides.forEach((slide, index) => {
const row = `
<tr>
<td><img src="#" alt="${slide.alt}" class="miniature"></td>
<td>${slide.alt}</td>
<td>${slide.title || "-"}</td>
<td>${slide.order}</td>
<td class="text-center action-buttons">
<button class="btn btn-secondary btn-sm" onclick="monter(${index})">↑</button>
<button class="btn btn-secondary btn-sm" onclick="descendre(${index})">↓</button>
<a href="../../slider/modifier_slider/modifier_slider.html?id=${slide.id}"
class="btn btn-warning btn-sm">Modifier</a>
<button class="btn btn-danger btn-sm" onclick="supprimerSlide(${index})">Supprimer</button>
</td>
</tr>
`;
tableBody.innerHTML += row;
});
}
afficherSlides();
// Suppression
function supprimerSlide(index) {
if (confirm("Voulez-vous vraiment supprimer cette image du slider ?")) {
slides.splice(index, 1);
// Réordonner après suppression
slides.forEach((s, i) => s.order = i + 1);
afficherSlides();
successMsg.textContent = "Image du slider supprimée avec succès.";
successMsg.classList.remove("d-none");
}
}
// Monter
function monter(index) {
if (index === 0) return; // déjà en haut
[slides[index - 1], slides[index]] = [slides[index], slides[index - 1]];
// recalcul ordre
slides.forEach((s, i) => s.order = i + 1);
afficherSlides();
successMsg.textContent = "Ordre mis à jour.";
successMsg.classList.remove("d-none");
}
// Descendre
function descendre(index) {
if (index === slides.length - 1) return; // déjà en bas
[slides[index], slides[index + 1]] = [slides[index + 1], slides[index]];
slides.forEach((s, i) => s.order = i + 1);
afficherSlides();
successMsg.textContent = "Ordre mis à jour.";
successMsg.classList.remove("d-none");
}

102
template.html Normal file
View File

@@ -0,0 +1,102 @@
<!DOCTYPE html>
<html lang="fr">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>CE sera le titre de la page</title>
<link href="node_modules/bootstrap/dist/css/bootstrap.min.css" rel="stylesheet">
<link rel="stylesheet" href="node_modules/bs-icon/icons.css">
<link rel="shortcut icon" href="/favicon.png" type="image/png">
<link rel="stylesheet" href="/css/style.css">
</head>
<body>
<header>
<nav class="navbar navbar-expand-xxl bg-body-tertiary">
<div class="container-fluid align-items-center">
<a class="navbar-brand" href="#">L'Il'eau chiens - Admin</a>
<button class="navbar-toggler" type="button" data-bs-toggle="collapse"
data-bs-target="#navbarSupportedContent" aria-controls="navbarSupportedContent"
aria-expanded="false" aria-label="Toggle navigation">
<span class="navbar-toggler-icon"></span>
</button>
<div class="collapse navbar-collapse" id="navbarSupportedContent">
<ul class="navbar-nav me-auto mb-2 mb-lg-0">
<li class="nav-item">
<a class="nav-link active left-label" aria-current="page" href="#">Blog</a>
</li>
<li class="nav-item">
<a class="nav-link left-label" href="#">Boutique</a>
</li>
<li class="nav-item">
<a class="nav-link left-label" href="#">Prestations</a>
</li>
<li class="nav-item">
<a class="nav-link left-label" href="#">FAQ</a>
</li>
<li class="nav-item">
<a class="nav-link left-label" href="#">Fiche renseignements</a>
</li>
<li class="nav-item">
<a class="nav-link left-label" href="#">Partenaires</a>
</li>
<li class="nav-item">
<a class="nav-link left-label" href="#">Citations</a>
</li>
</ul>
<ul class="navbar-nav ms-auto mb-2 mb-lg-0">
<li class="nav-item">
<a class="nav-link" href="#"><i class="bi bi-megaphone me-1"></i> Message d'actu</a>
</li>
<li class="nav-item">
<a class="nav-link" href="#"><i class="bi bi-box-arrow-up-right me-1"></i> Voir le site</a>
</li>
<li class="nav-item">
<a class="nav-link" href="#"><i class="bi bi-gear me-1"></i> Configuration</a>
</li>
<li class="nav-item dropdown">
<a class="nav-link dropdown-toggle" href="#" id="userMenu" role="button"
data-bs-toggle="dropdown" aria-expanded="false">
<i class="bi bi-person-circle me-1"></i> <span id="userFirstName">Prénom</span>
</a>
<ul class="dropdown-menu dropdown-menu-end" aria-labelledby="userMenu">
<li><a class="dropdown-item" href="#">Profil</a></li>
<li>
<hr class="dropdown-divider">
</li>
<li><a class="dropdown-item" href="#">Sortir</a></li>
</ul>
</li>
</ul>
</div>
</div>
</nav>
</header>
<main class="my-5 fs-6">
<div class="container">
<header>
<h1 class="title my-4 fs-2">Titre de la page</h1>
</header>
<div class="content">
Contenu de la page
</div>
</div>
</main>
</body>
<script src="node_modules/bootstrap/dist/js/bootstrap.bundle.min.js"></script>
</html>