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 0000000..ff6d040 Binary files /dev/null and b/assets/images/grades/grade_1772755173.png differ diff --git a/assets/images/grades/grade_1772755195.png b/assets/images/grades/grade_1772755195.png new file mode 100644 index 0000000..8d7afbf Binary files /dev/null and b/assets/images/grades/grade_1772755195.png differ diff --git a/assets/images/grades/grade_1772755214.png b/assets/images/grades/grade_1772755214.png new file mode 100644 index 0000000..81744c0 Binary files /dev/null and b/assets/images/grades/grade_1772755214.png differ diff --git a/assets/images/grades/grade_1772755251.png b/assets/images/grades/grade_1772755251.png new file mode 100644 index 0000000..81744c0 Binary files /dev/null and b/assets/images/grades/grade_1772755251.png differ diff --git a/assets/images/grades/grade_1772755257.png b/assets/images/grades/grade_1772755257.png new file mode 100644 index 0000000..b8f59f9 Binary files /dev/null and b/assets/images/grades/grade_1772755257.png differ diff --git a/assets/images/grades/grade_1772755269.png b/assets/images/grades/grade_1772755269.png new file mode 100644 index 0000000..ff6d040 Binary files /dev/null and b/assets/images/grades/grade_1772755269.png differ diff --git a/assets/images/grades/grade_1772755276.png b/assets/images/grades/grade_1772755276.png new file mode 100644 index 0000000..b4cbb6e Binary files /dev/null and b/assets/images/grades/grade_1772755276.png differ 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') {
-
- -
- - -
- - - +
+ + +
+ + +
+