From 386719b74f3fb279f4d6b328de0ed6f147e2a2c2 Mon Sep 17 00:00:00 2001 From: Flatlogic Bot Date: Fri, 6 Mar 2026 00:09:45 +0000 Subject: [PATCH] Autosave: 20260306-000945 --- admin.php | 608 +++++----------------- assets/images/grades/grade_1772755173.png | Bin 0 -> 6594 bytes assets/images/grades/grade_1772755195.png | Bin 0 -> 2634 bytes assets/images/grades/grade_1772755214.png | Bin 0 -> 2040 bytes assets/images/grades/grade_1772755251.png | Bin 0 -> 2040 bytes assets/images/grades/grade_1772755257.png | Bin 0 -> 3961 bytes assets/images/grades/grade_1772755269.png | Bin 0 -> 6594 bytes assets/images/grades/grade_1772755276.png | Bin 0 -> 10175 bytes auth.php | 2 +- index.php | 2 +- profile.php | 147 +++--- 11 files changed, 220 insertions(+), 539 deletions(-) create mode 100644 assets/images/grades/grade_1772755173.png create mode 100644 assets/images/grades/grade_1772755195.png create mode 100644 assets/images/grades/grade_1772755214.png create mode 100644 assets/images/grades/grade_1772755251.png create mode 100644 assets/images/grades/grade_1772755257.png create mode 100644 assets/images/grades/grade_1772755269.png create mode 100644 assets/images/grades/grade_1772755276.png diff --git a/admin.php b/admin.php index 396cb88..bfb4070 100644 --- a/admin.php +++ b/admin.php @@ -408,7 +408,8 @@ if (isset($_GET['delete_resource'])) { exit; } -// Handle Lootbox CRUD + +// Handle Grade CRUD if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['action']) && $_POST['action'] === 'upsert_grade') { $id = (int)$_POST['id']; $name = trim($_POST['name']); @@ -422,6 +423,22 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['action']) && $_POST[' exit; } + $image_url = null; + if ($id > 0) { + $stmt_img = $db->prepare("SELECT image_url FROM grades WHERE id = ?"); + $stmt_img->execute([$id]); + $image_url = $stmt_img->fetchColumn(); + } + if (isset($_FILES["image"]) && $_FILES["image"]["error"] === UPLOAD_ERR_OK) { + $ext = pathinfo($_FILES["image"]["name"], PATHINFO_EXTENSION); + $filename = "grade_" . time() . "." . $ext; + if (!is_dir("assets/images/grades")) mkdir("assets/images/grades", 0775, true); + $target = "assets/images/grades/" . $filename; + if (move_uploaded_file($_FILES["image"]["tmp_name"], $target)) { + $image_url = $target; + } + } + // Check for overlap if user_type is 'utilisateur' if ($user_type === 'utilisateur') { $check = db()->prepare("SELECT id FROM grades WHERE user_type = 'utilisateur' AND id != ? AND NOT (max_level < ? OR min_level > ?)"); @@ -434,11 +451,11 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['action']) && $_POST[' try { if ($id > 0) { - $stmt = db()->prepare("UPDATE grades SET name = ?, slug = ?, user_type = ?, min_level = ?, max_level = ? WHERE id = ?"); - $stmt->execute([$name, $slug, $user_type, $min_level, $max_level, $id]); + $stmt = db()->prepare("UPDATE grades SET name = ?, slug = ?, user_type = ?, min_level = ?, max_level = ?, image_url = ? WHERE id = ?"); + $stmt->execute([$name, $slug, $user_type, $min_level, $max_level, $image_url, $id]); } else { - $stmt = db()->prepare("INSERT INTO grades (name, slug, user_type, min_level, max_level) VALUES (?, ?, ?, ?, ?)"); - $stmt->execute([$name, $slug, $user_type, $min_level, $max_level]); + $stmt = db()->prepare("INSERT INTO grades (name, slug, user_type, min_level, max_level, image_url) VALUES (?, ?, ?, ?, ?, ?)"); + $stmt->execute([$name, $slug, $user_type, $min_level, $max_level, $image_url]); } header('Location: ?tab=ranks&success=1'); exit; @@ -447,7 +464,7 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['action']) && $_POST[' exit; } } -if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['action']) && $_POST['action'] === 'upsert_lootbox') { +if ($_SERVER["REQUEST_METHOD"] === "POST" && isset($_POST["action"]) && $_POST["action"] === "upsert_lootbox") { $id = (int)$_POST['id']; $name = $_POST['name']; $slug = $_POST['slug']; @@ -695,7 +712,7 @@ if ($tab === 'users') {
- +
@@ -842,7 +859,7 @@ if ($tab === 'users') {

Ajouter / Modifier un Grade

-
+
@@ -862,6 +879,10 @@ if ($tab === 'users') {
+
+ + +
@@ -883,6 +904,7 @@ if ($tab === 'users') { + @@ -892,14 +914,21 @@ if ($tab === 'users') { - + +
Image Nom Slug Type
Aucun grade configuré.
Aucun grade configuré.
+ + ?v=" style="max-width: 40px; max-height: 40px;"> + + - + + - @@ -1650,475 +1679,12 @@ if ($tab === 'users') { document.getElementById('log_id').value = 0; document.getElementById('logForm').reset(); } - - function toggleMS(id) { - const d = document.getElementById(id); - d.style.display = d.style.display === 'block' ? 'none' : 'block'; - } - function updateMSLabel(containerId) { - const container = document.getElementById(containerId); - const checkboxes = container.querySelectorAll('input[type="checkbox"]:checked'); - const display = container.querySelector('.ms-display'); - if (checkboxes.length === 0) { - display.innerText = "Toutes / Peu importe"; - } else { - const labels = Array.from(checkboxes).map(cb => cb.parentElement.innerText.trim()); - display.innerText = labels.join(', '); - } - } - document.addEventListener('click', function(e) { - if (!e.target.closest('.ms-container')) { - document.querySelectorAll('.ms-dropdown').forEach(d => d.style.display = 'none'); - } - }); - - function editLevel(data) { - document.getElementById("level_id").value = data.id; - document.getElementById("level_name").value = data.name; - document.getElementById("level_slug").value = data.slug; - document.getElementById("level_resource_id").value = data.resource_id; - document.getElementById("level_required_quantity").value = data.required_quantity; - window.scrollTo(0,0); - } - function resetLevelForm() { - document.getElementById("levelForm").reset(); - document.getElementById("level_id").value = 0; - const select = document.getElementById("level_resource_id"); - for (let i = 0; i < select.options.length; i++) { - if (select.options[i].text.toLowerCase().includes("expérience") || select.options[i].text.toLowerCase().includes("experience")) { - select.selectedIndex = i; - break; - } - } - } - -function updateRankFields() { - const type = document.getElementById('rank_type').value; - const min = document.getElementById('rank_min'); - const max = document.getElementById('rank_max'); - if (type === 'utilisateur') { - min.disabled = false; - max.disabled = false; - min.required = true; - max.required = true; - min.style.opacity = '1'; - max.style.opacity = '1'; - } else { - min.disabled = true; - max.disabled = true; - min.required = false; - max.required = false; - min.style.opacity = '0.5'; - max.style.opacity = '0.5'; - min.value = ''; - max.value = ''; - } -} - -function editRank(rank) { - document.getElementById('rank_id').value = rank.id; - document.getElementById('rank_name').value = rank.name; - document.getElementById('rank_slug').value = rank.slug; - document.getElementById('rank_type').value = rank.user_type; - document.getElementById('rank_min').value = rank.min_level || ''; - document.getElementById('rank_max').value = rank.max_level || ''; - updateRankFields(); - window.scrollTo({ top: 0, behavior: 'smooth' }); -} - -function resetRankForm() { - document.getElementById('rankForm').reset(); - document.getElementById('rank_id').value = '0'; - updateRankFields(); -} - -// Initial call to set fields on load -document.addEventListener('DOMContentLoaded', function() { - if (document.getElementById('rank_type')) { - updateRankFields(); - } -}); - - - - -

Système de Lootboxes

-
-

Créer / Modifier une Lootbox

- - - -
-
- - -
-
- - -
-
-
- - -
- -
- -
- - -
-
Nb Total
-
Chance (%)
-
-
- -
- -
- -
- - -
- - -
-
Type
-
Ressource / Objet
-
Chance (%)
-
Qté Min
-
Qté Max
-
-
- -
- -
- -
-
- -
- - -
- -
- - - - - - - - - - - - - - - -
NomSlugObjets Directs (100%)Nb Total (%)Pool Aléatoire (%)Actions
- - $i['is_guaranteed']); - foreach ($directs as $d): ?> -
- - (Qté: -) -
- Aucun"; ?> -
-
- - -
- objet(s): - % -
- -
-
- - !$i['is_guaranteed']); - foreach ($pool as $i): ?> -
- (Rien)'; ?>: - % - (Qté: -) -
- -
-
- - Suppr -
+ - \ No newline at end of file + diff --git a/assets/images/grades/grade_1772755173.png b/assets/images/grades/grade_1772755173.png new file mode 100644 index 0000000000000000000000000000000000000000..ff6d040aac8506dfc8b0fa332823353c6d97d480 GIT binary patch literal 6594 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%0AvdXd zz&opVGw@_8`*Y--BliFS()hOdO%E`wiGaH4Y-7uYT!7Tl{(m3(mhC3?g?S_k#JFyL|AO z^h}T1!!Q35`2P|(@ntB#J?mGtS;T!Dqp#J4Ido!i&|DJbRDM;Op2DWaiMo||t{-Uv zoL}`VM=L@H$M{~>Gf*#}i8&Ny#$RC0w1J!_X^0#;$ocqAk(H$a9mLKzMdaw=fb87o z#c5P$WP^^oBglDadSEX8pz)_D$$1=FaQt10+LFQ@v+JC=D6cj+m;9*ZD_R4y;%tMi zm+@_Ccpk7^j!*9sVYsMc)IGSvkArI;_AG+g*u+L@s=0c?VB-#U zEFS#Gq-VbkLMv8ljbhD{10z(Amve)lDNQ5U4VvNRs3>Tv=8@dxRm}XpM=H zQ|RpXXko@K5bWxnjY80r-RaWZgWds8$K7@tN%$mhM6TMzg7kKydRRwnWpSB}Iczf2y@JTm*Vj^YqPp&c|7~ zOlA1^5j0y(gKClGD?5k5o1cV>mgH+2?y89?cs*H3X6@&p47HphRV8KB2G2C(#F#b+ z1Q69eU6q%epmKwn;b`(I;uEtdSwej@3s(B+S{3;m*!&O#VYwHOU52 zTiYto7rR7L42!-v#@(Jag-Pj3NJzG-5{Z6|H6WJ~>a|dk>Sa??GxlzKP(I&Aqqhzr zER0)c;M>2hbS6Npvx2`~<9{NYIWEau$l2T9M;GM2cd(nW*e&oFFYwec@t7}8UYI28 z95S=Bvs+`^Mw$uzIyo26`RP=#1X)Z+(i|s4bru%QHxa$00&`Irj%k23_dcYC%KZuM iv)jw^+bQ7V#8jN!yyD#jW1oDf0k+rett&0v9{&fSbHMHZ literal 0 HcmV?d00001 diff --git a/assets/images/grades/grade_1772755269.png b/assets/images/grades/grade_1772755269.png new file mode 100644 index 0000000000000000000000000000000000000000..ff6d040aac8506dfc8b0fa332823353c6d97d480 GIT binary patch literal 6594 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 literal 0 HcmV?d00001 diff --git a/auth.php b/auth.php index 72517ac..d6099da 100644 --- a/auth.php +++ b/auth.php @@ -52,7 +52,7 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST') { if ($user && password_verify($password, $user['password'])) { $_SESSION['user_id'] = $user['id']; - $_SESSION['username'] = $user['username']; + $_SESSION["username"] = $user["username"]; $_SESSION["display_name"] = $user["display_name"]; $_SESSION['role'] = $user['role']; $db->prepare("UPDATE users SET last_login = CURRENT_TIMESTAMP WHERE id = ?")->execute([$user['id']]); diff --git a/index.php b/index.php index 5191a7e..371b03b 100644 --- a/index.php +++ b/index.php @@ -557,7 +557,7 @@ function getStatusColor($status, $statuses_map) {
- Bienvenue, @ + Bienvenue, @ Journal Profil Déconnexion diff --git a/profile.php b/profile.php index 86ffd69..3b2fba7 100644 --- a/profile.php +++ b/profile.php @@ -12,8 +12,13 @@ $user_id = $_SESSION['user_id']; $error = ''; $success = ''; -// Fetch current user data -$stmt = $db->prepare("SELECT * FROM users WHERE id = ?"); +// Fetch current user data + join for stats +$stmt = $db->prepare(" + SELECT u.*, l.level_name, g.grade_name + FROM users u + LEFT JOIN levels l ON u.level_id = l.id + LEFT JOIN grades g ON u.level_id = g.level_id + WHERE u.id = ?"); $stmt->execute([$user_id]); $user = $stmt->fetch(); @@ -33,27 +38,41 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST') { } elseif (!password_verify($current_password, $user['password'])) { $error = 'Mot de passe actuel incorrect.'; } else { - // Update password if provided + $sql = "UPDATE users SET email = ?"; + $params = [$email]; + if (!empty($new_password)) { if ($new_password !== $confirm_password) { $error = 'Les nouveaux mots de passe ne correspondent pas.'; } else { - $hashed_password = password_hash($new_password, PASSWORD_DEFAULT); - $stmt = $db->prepare("UPDATE users SET email = ?, password = ? WHERE id = ?"); - $stmt->execute([$email, $hashed_password, $user_id]); - $success = 'Profil et mot de passe mis à jour avec succès.'; + $sql .= ", password = ?"; + $params[] = password_hash($new_password, PASSWORD_DEFAULT); } - } else { - $stmt = $db->prepare("UPDATE users SET email = ? WHERE id = ?"); - $stmt->execute([$email, $user_id]); - $success = 'Profil mis à jour avec succès.'; } + $sql .= " WHERE id = ?"; + $params[] = $user_id; + + $stmt = $db->prepare($sql); + $stmt->execute($params); + $success = 'Profil mis à jour avec succès.'; - // Refresh user data - $stmt = $db->prepare("SELECT * FROM users WHERE id = ?"); + $stmt = $db->prepare("SELECT u.*, l.level_name, g.grade_name FROM users u LEFT JOIN levels l ON u.level_id = l.id LEFT JOIN grades g ON u.level_id = g.level_id WHERE u.id = ?"); $stmt->execute([$user_id]); $user = $stmt->fetch(); } + } elseif ($action === 'update_display_name') { + $display_name = trim($_POST['display_name'] ?? ''); + if (!empty($display_name)) { + $stmt = $db->prepare("UPDATE users SET display_name = ? WHERE id = ?"); + $stmt->execute([$display_name, $user_id]); + $_SESSION["display_name"] = $display_name; $success = "Nom affiché mis à jour avec succès.";; + + $stmt = $db->prepare("SELECT u.*, l.level_name, g.grade_name FROM users u LEFT JOIN levels l ON u.level_id = l.id LEFT JOIN grades g ON u.level_id = g.level_id WHERE u.id = ?"); + $stmt->execute([$user_id]); + $user = $stmt->fetch(); + } else { + $error = 'Le nom affiché ne peut pas être vide.'; + } } } ?> @@ -65,65 +84,65 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST') { Mon Profil - Nexus
-

Gestion du Compte

- -
- @ +
+ +
-
- +
+

Vue d\'ensemble

+
Pseudo de compte: @
-
- - -
+ + + +
+ + +
+ -
-

Changer le mot de passe (Optionnel)

+
Niveau:
+
Grade:
+
+ +
+

Gestion du Compte

+
+ +
+ + +
@@ -132,20 +151,26 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST') {
-
- -
- - -
- - - +
+ + +
+ + +
+