38676-vm/admin.php
2026-02-22 10:20:30 +00:00

676 lines
36 KiB
PHP

<?php
require_once 'db/config.php';
session_start();
$db = db();
// Auth Check: Must be logged in and be admin
if (!isset($_SESSION['user_id'])) {
header("Location: auth.php?page=login");
exit;
}
$user_id = $_SESSION['user_id'];
$user_stmt = $db->prepare("SELECT role FROM users WHERE id = ?");
$user_stmt->execute([$user_id]);
$current_user = $user_stmt->fetch();
if (!$current_user || $current_user['role'] !== 'admin') {
die("Accès refusé. Cette console est réservée aux Administrateurs.");
}
$tab = isset($_GET['tab']) ? $_GET['tab'] : 'users';
// --- HANDLERS ---
// Handle User Role Update
if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['action']) && $_POST['action'] === 'update_user_role') {
$target_user_id = (int)$_POST['target_user_id'];
$new_role = $_POST['new_role'];
if (in_array($new_role, ['user', 'gm', 'admin'])) {
$stmt = $db->prepare("UPDATE users SET role = ? WHERE id = ?");
$stmt->execute([$new_role, $target_user_id]);
}
header("Location: admin.php?tab=users&success=1");
exit;
}
// Handle Celestial Object Type CRUD
if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['action']) && $_POST['action'] === 'upsert_object_type') {
$id = (int)$_POST['id'];
$name = $_POST['name'];
$slug = $_POST['slug'];
$icon = $_POST['icon'];
$description = $_POST['description'];
$modifier_ids = isset($_POST['modifiers']) ? $_POST['modifiers'] : [];
$image_url = null;
if ($id > 0) {
$stmt_img = $db->prepare("SELECT image_url FROM celestial_object_types 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 = $slug . "_" . time() . "." . $ext;
$target = "assets/images/celestial/" . $filename;
if (move_uploaded_file($_FILES['image']['tmp_name'], $target)) {
$image_url = $target;
}
}
if ($id > 0) {
$stmt = $db->prepare("UPDATE celestial_object_types SET name = ?, slug = ?, icon = ?, description = ?, image_url = ? WHERE id = ?");
$stmt->execute([$name, $slug, $icon, $description, $image_url, $id]);
} else {
$stmt = $db->prepare("INSERT INTO celestial_object_types (name, slug, icon, description, image_url) VALUES (?, ?, ?, ?, ?)");
$stmt->execute([$name, $slug, $icon, $description, $image_url]);
$id = $db->lastInsertId();
}
// Sync modifiers
$db->prepare("DELETE FROM celestial_object_type_modifiers WHERE celestial_object_type_id = ?")->execute([$id]);
if (!empty($modifier_ids)) {
$ins = $db->prepare("INSERT INTO celestial_object_type_modifiers (celestial_object_type_id, modifier_id) VALUES (?, ?)");
foreach ($modifier_ids as $mid) {
$ins->execute([$id, (int)$mid]);
}
}
header("Location: admin.php?tab=objects&success=1");
exit;
}
if (isset($_GET['delete_object'])) {
$id = (int)$_GET['delete_object'];
$db->prepare("DELETE FROM celestial_object_types WHERE id = ?")->execute([$id]);
header("Location: admin.php?tab=objects&success=1");
exit;
}
// Handle Status CRUD
if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['action']) && $_POST['action'] === 'upsert_status') {
$id = (int)$_POST['id'];
$name = $_POST['name'];
$slug = $_POST['slug'];
$color = $_POST['color'];
$description = $_POST['description'];
if ($id > 0) {
$stmt = $db->prepare("UPDATE celestial_object_statuses SET name = ?, slug = ?, color = ?, description = ? WHERE id = ?");
$stmt->execute([$name, $slug, $color, $description, $id]);
} else {
$stmt = $db->prepare("INSERT INTO celestial_object_statuses (name, slug, color, description) VALUES (?, ?, ?, ?)");
$stmt->execute([$name, $slug, $color, $description]);
}
header("Location: admin.php?tab=statuses&success=1");
exit;
}
if (isset($_GET['delete_status'])) {
$id = (int)$_GET['delete_status'];
$db->prepare("DELETE FROM celestial_object_statuses WHERE id = ?")->execute([$id]);
header("Location: admin.php?tab=statuses&success=1");
exit;
}
// Handle Settlement Type CRUD
if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['action']) && $_POST['action'] === 'upsert_settlement_type') {
$id = (int)$_POST['id'];
$name = $_POST['name'];
$slug = $_POST['slug'];
$description = $_POST['description'];
if ($id > 0) {
$stmt = $db->prepare("UPDATE settlement_types SET name = ?, slug = ?, description = ? WHERE id = ?");
$stmt->execute([$name, $slug, $description, $id]);
} else {
$stmt = $db->prepare("INSERT INTO settlement_types (name, slug, description) VALUES (?, ?, ?)");
$stmt->execute([$name, $slug, $description]);
}
header("Location: admin.php?tab=settlement_types&success=1");
exit;
}
if (isset($_GET['delete_settlement_type'])) {
$id = (int)$_GET['delete_settlement_type'];
$db->prepare("DELETE FROM settlement_types WHERE id = ?")->execute([$id]);
header("Location: admin.php?tab=settlement_types&success=1");
exit;
}
// Handle Modifiers CRUD
if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['action']) && $_POST['action'] === 'upsert_modifier') {
$id = (int)$_POST['id'];
$name = $_POST['name'];
$type = $_POST['type'];
$description = $_POST['description'];
if ($id > 0) {
$stmt = $db->prepare("UPDATE modifiers SET name = ?, type = ?, description = ? WHERE id = ?");
$stmt->execute([$name, $type, $description, $id]);
} else {
$stmt = $db->prepare("INSERT INTO modifiers (name, type, description) VALUES (?, ?, ?)");
$stmt->execute([$name, $type, $description]);
}
header("Location: admin.php?tab=modifiers&success=1");
exit;
}
if (isset($_GET['delete_modifier'])) {
$id = (int)$_GET['delete_modifier'];
$db->prepare("DELETE FROM modifiers WHERE id = ?")->execute([$id]);
header("Location: admin.php?tab=modifiers&success=1");
exit;
}
// Handle Faction CRUD
if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['action']) && $_POST['action'] === 'upsert_faction') {
$id = (int)$_POST['id'];
$name = $_POST['name'];
$fa_icon = $_POST['fa_icon'];
$image_url = null;
if ($id > 0) {
$stmt_img = $db->prepare("SELECT image_url FROM factions 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 = "faction_" . time() . "." . $ext;
$target = "assets/images/factions/" . $filename;
if (move_uploaded_file($_FILES['image']['tmp_name'], $target)) {
$image_url = $target;
}
}
if ($id > 0) {
$stmt = $db->prepare("UPDATE factions SET name = ?, image_url = ?, fa_icon = ? WHERE id = ?");
$stmt->execute([$name, $image_url, $fa_icon, $id]);
} else {
$stmt = $db->prepare("INSERT INTO factions (name, image_url, fa_icon) VALUES (?, ?, ?)");
$stmt->execute([$name, $image_url, $fa_icon]);
}
header("Location: admin.php?tab=factions&success=1");
exit;
}
if (isset($_GET['delete_faction'])) {
$id = (int)$_GET['delete_faction'];
$db->prepare("DELETE FROM factions WHERE id = ?")->execute([$id]);
header("Location: admin.php?tab=factions&success=1");
exit;
}
// --- DATA FETCHING ---
$users_list = [];
$objects_list = [];
$statuses_list = [];
$settlement_types_list = [];
$modifiers_list = [];
$factions_list = [];
if ($tab === 'users') {
$users_list = $db->query("SELECT id, username, email, role FROM users ORDER BY username ASC")->fetchAll();
} elseif ($tab === 'objects') {
$objects_list = $db->query("SELECT * FROM celestial_object_types ORDER BY name ASC")->fetchAll();
// For each object, get its modifiers
foreach ($objects_list as &$obj) {
$stmt = $db->prepare("SELECT modifier_id FROM celestial_object_type_modifiers WHERE celestial_object_type_id = ?");
$stmt->execute([$obj['id']]);
$obj['modifier_ids'] = $stmt->fetchAll(PDO::FETCH_COLUMN);
}
$modifiers_list = $db->query("SELECT * FROM modifiers ORDER BY type, name ASC")->fetchAll();
} elseif ($tab === 'statuses') {
$statuses_list = $db->query("SELECT * FROM celestial_object_statuses ORDER BY name ASC")->fetchAll();
} elseif ($tab === 'settlement_types') {
$settlement_types_list = $db->query("SELECT * FROM settlement_types ORDER BY name ASC")->fetchAll();
} elseif ($tab === 'modifiers') {
$modifiers_list = $db->query("SELECT * FROM modifiers ORDER BY type, name ASC")->fetchAll();
} elseif ($tab === 'factions') {
$factions_list = $db->query("SELECT * FROM factions ORDER BY name ASC")->fetchAll();
}
?>
<!DOCTYPE html>
<html lang="fr">
<head>
<meta charset="UTF-8">
<title>Console Admin - Nexus</title>
<link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css" rel="stylesheet">
<link href="assets/css/custom.css?v=<?php echo time(); ?>" rel="stylesheet">
<style>
body { background: #000; color: #fff; font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif; margin: 0; }
header { background: #1a202c; padding: 10px 20px; border-bottom: 2px solid #2d3545; display: flex; justify-content: space-between; align-items: center; }
.nav-links a { color: #88c0d0; text-decoration: none; margin-right: 20px; font-weight: bold; font-size: 14px; }
.nav-links a:hover { color: #fff; }
.container { padding: 40px; max-width: 1200px; margin: 0 auto; }
.tabs { display: flex; gap: 5px; margin-bottom: 20px; border-bottom: 2px solid #2d3545; flex-wrap: wrap; }
.tab-link { padding: 10px 20px; text-decoration: none; color: #8c92a3; background: #0a0f1d; border: 1px solid #2d3545; border-bottom: none; font-weight: bold; font-size: 14px; }
.tab-link.active { background: #1a202c; color: #88c0d0; border-bottom: 2px solid #88c0d0; }
table { width: 100%; border-collapse: collapse; background: #0a0f1d; margin-top: 20px; }
th, td { border: 1px solid #2d3545; padding: 12px; text-align: left; }
th { background: #1a202c; color: #88c0d0; font-size: 13px; text-transform: uppercase; }
.form-card { background: #1e293b; padding: 20px; border: 1px solid #334155; margin-bottom: 30px; }
.form-group { margin-bottom: 15px; }
.form-group label { display: block; font-size: 12px; color: #8c92a3; margin-bottom: 5px; }
.form-group input, .form-group select, .form-group textarea { width: 100%; background: #0f172a; border: 1px solid #334155; color: #fff; padding: 8px; box-sizing: border-box; }
.btn { border: none; padding: 8px 15px; cursor: pointer; font-weight: bold; border-radius: 4px; font-size: 12px; }
.btn-add { background: #a3be8c; color: #000; }
.btn-edit { background: #ebcb8b; color: #000; }
.btn-del { background: #bf616a; color: #fff; text-decoration: none; }
.btn-ok { background: #88c0d0; color: #000; }
.success-msg { background: #a3be8c; color: #000; padding: 10px; margin-bottom: 20px; border-radius: 4px; font-weight: bold; }
.modifier-tag { display: inline-block; padding: 2px 8px; border-radius: 4px; font-size: 10px; font-weight: bold; margin-right: 5px; margin-bottom: 5px; }
.tag-bonus { background: #a3be8c; color: #000; }
.tag-malus { background: #bf616a; color: #fff; }
</style>
</head>
<body>
<header>
<div style="display: flex; align-items: center; gap: 20px;">
<h2 style="margin: 0; color: #bf616a;"><i class="fa-solid fa-shield-halved"></i> CONSOLE ADMIN</h2>
<nav class="nav-links">
<a href="index.php"><i class="fa-solid fa-eye"></i> Vue Joueur</a>
<a href="gm_console.php" target="_blank"><i class="fa-solid fa-headset"></i> Console MJ</a>
</nav>
</div>
<div>
<span style="font-weight: bold; color: #88c0d0;"><?php echo htmlspecialchars($_SESSION['username']); ?></span>
</div>
</header>
<div class="container">
<?php if (isset($_GET['success'])): ?>
<div class="success-msg"><i class="fa-solid fa-check-circle"></i> Opération effectuée avec succès.</div>
<?php endif; ?>
<div class="tabs">
<a href="?tab=users" class="tab-link <?php echo $tab === 'users' ? 'active' : ''; ?>"><i class="fa-solid fa-users"></i> Utilisateurs</a>
<a href="?tab=objects" class="tab-link <?php echo $tab === 'objects' ? 'active' : ''; ?>"><i class="fa-solid fa-earth-europe"></i> Objets Célestes</a>
<a href="?tab=modifiers" class="tab-link <?php echo $tab === 'modifiers' ? 'active' : ''; ?>"><i class="fa-solid fa-bolt"></i> Bonus & Malus</a>
<a href="?tab=statuses" class="tab-link <?php echo $tab === 'statuses' ? 'active' : ''; ?>"><i class="fa-solid fa-signal"></i> Statuts / États</a>
<a href="?tab=settlement_types" class="tab-link <?php echo $tab === 'settlement_types' ? 'active' : ''; ?>"><i class="fa-solid fa-city"></i> Types d'Établissements</a>
<a href="?tab=factions" class="tab-link <?php echo $tab === 'factions' ? 'active' : ''; ?>"><i class="fa-solid fa-flag"></i> Factions</a>
</div>
<?php if ($tab === 'users'): ?>
<h3 style="color: #88c0d0;">Gestion des Rôles</h3>
<table>
<thead>
<tr><th>Utilisateur</th><th>Email</th><th>Rôle Actuel</th><th>Nouveau Rôle</th></tr>
</thead>
<tbody>
<?php foreach ($users_list as $u): ?>
<tr>
<td><strong><?php echo htmlspecialchars($u['username']); ?></strong></td>
<td><?php echo htmlspecialchars($u['email']); ?></td>
<td>
<span style="background: <?php echo $u['role'] === 'admin' ? '#bf616a' : ($u['role'] === 'gm' ? '#ebcb8b' : '#4c566a'); ?>; padding: 2px 8px; border-radius: 10px; font-size: 11px; color: #000; font-weight: bold;">
<?php echo strtoupper($u['role']); ?>
</span>
</td>
<td>
<form method="POST" style="display: flex; gap: 10px;">
<input type="hidden" name="action" value="update_user_role">
<input type="hidden" name="target_user_id" value="<?php echo $u['id']; ?>">
<select name="new_role">
<option value="user" <?php echo $u['role'] === 'user' ? 'selected' : ''; ?>>Utilisateur</option>
<option value="gm" <?php echo $u['role'] === 'gm' ? 'selected' : ''; ?>>Maître du Jeu (MJ)</option>
<option value="admin" <?php echo $u['role'] === 'admin' ? 'selected' : ''; ?>>Administrateur</option>
</select>
<button type="submit" class="btn btn-ok">Modifier</button>
</form>
</td>
</tr>
<?php endforeach; ?>
</tbody>
</table>
<?php elseif ($tab === 'objects'): ?>
<h3 style="color: #88c0d0;">Objets Célestes</h3>
<div class="form-card">
<h4>Ajouter / Modifier un Objet</h4>
<form method="POST" id="objectForm" enctype="multipart/form-data">
<input type="hidden" name="action" value="upsert_object_type">
<input type="hidden" name="id" id="obj_id" value="0">
<div style="display: flex; gap: 20px;">
<div class="form-group" style="flex: 1;">
<label>Nom (Affichage)</label>
<input type="text" name="name" id="obj_name" required placeholder="Ex: Planète">
</div>
<div class="form-group" style="flex: 1;">
<label>Slug (Identifiant technique)</label>
<input type="text" name="slug" id="obj_slug" required placeholder="Ex: planet">
</div>
<div class="form-group" style="flex: 1;">
<label>Icône (FontAwesome)</label>
<input type="text" name="icon" id="obj_icon" required placeholder="Ex: fa-earth-europe">
</div>
<div class="form-group" style="flex: 1;">
<label>Image (PNG/JPG) - Optionnel</label>
<input type="file" name="image" accept="image/*">
</div>
</div>
<div style="display: flex; gap: 20px;">
<div style="flex: 1;">
<label style="font-size: 12px; color: #8c92a3;">Bonus / Malus attribués</label>
<div style="background: #0f172a; border: 1px solid #334155; padding: 10px; max-height: 150px; overflow-y: auto; display: flex; flex-wrap: wrap; gap: 10px; margin-top: 5px;">
<?php foreach ($modifiers_list as $m): ?>
<label style="font-size: 11px; display: flex; align-items: center; gap: 5px; cursor: pointer;">
<input type="checkbox" name="modifiers[]" value="<?php echo $m['id']; ?>" class="modifier-checkbox" data-id="<?php echo $m['id']; ?>">
<span class="modifier-tag <?php echo $m['type'] === 'bonus' ? 'tag-bonus' : 'tag-malus'; ?>">
<?php echo htmlspecialchars($m['name']); ?>
</span>
</label>
<?php endforeach; ?>
</div>
</div>
</div>
<div class="form-group" style="margin-top: 15px;">
<label>Description</label>
<textarea name="description" id="obj_desc" rows="2"></textarea>
</div>
<button type="submit" class="btn btn-add">ENREGISTRER L'OBJET</button>
<button type="button" class="btn" style="background: #4c566a; color: #fff;" onclick="resetObjectForm()">ANNULER</button>
</form>
</div>
<table>
<thead><tr><th>Visuel</th><th>Nom</th><th>Slug</th><th>Bonus/Malus</th><th>Actions</th></tr></thead>
<tbody>
<?php foreach ($objects_list as $o): ?>
<tr>
<td style="text-align: center;">
<?php if (!empty($o['image_url'])): ?>
<img src="<?php echo htmlspecialchars($o['image_url']); ?>?v=<?php echo time(); ?>" style="max-width: 40px; max-height: 40px; display: block; margin: 0 auto;">
<?php else: ?>
<i class="fa-solid <?php echo htmlspecialchars($o['icon']); ?> fa-lg"></i>
<?php endif; ?>
</td>
<td><strong><?php echo htmlspecialchars($o['name']); ?></strong></td>
<td><code><?php echo htmlspecialchars($o['slug']); ?></code></td>
<td>
<?php
$stmt = $db->prepare("SELECT m.name, m.type FROM modifiers m JOIN celestial_object_type_modifiers cotm ON m.id = cotm.modifier_id WHERE cotm.celestial_object_type_id = ?");
$stmt->execute([$o['id']]);
$m_list = $stmt->fetchAll();
foreach ($m_list as $ml): ?>
<span class="modifier-tag <?php echo $ml['type'] === 'bonus' ? 'tag-bonus' : 'tag-malus'; ?>">
<?php echo htmlspecialchars($ml['name']); ?>
</span>
<?php endforeach; ?>
</td>
<td>
<button class="btn btn-edit" onclick='editObject(<?php echo json_encode($o, JSON_HEX_APOS); ?>)'>Editer</button>
<a href="?tab=objects&delete_object=<?php echo $o['id']; ?>" class="btn btn-del" onclick="return confirm('Supprimer cet objet ?')">Suppr</a>
</td>
</tr>
<?php endforeach; ?>
</tbody>
</table>
<?php elseif ($tab === 'modifiers'): ?>
<h3 style="color: #88c0d0;">Gestion des Bonus & Malus</h3>
<div class="form-card">
<h4>Ajouter / Modifier un Modificateur</h4>
<form method="POST" id="modifierForm">
<input type="hidden" name="action" value="upsert_modifier">
<input type="hidden" name="id" id="mod_id" value="0">
<div style="display: flex; gap: 20px;">
<div class="form-group" style="flex: 2;">
<label>Nom du Bonus/Malus</label>
<input type="text" name="name" id="mod_name" required placeholder="Ex: Chaleur Extrême">
</div>
<div class="form-group" style="flex: 1;">
<label>Type</label>
<select name="type" id="mod_type">
<option value="bonus">Bonus</option>
<option value="malus">Malus</option>
</select>
</div>
</div>
<div class="form-group">
<label>Description (Effet en jeu)</label>
<textarea name="description" id="mod_desc" rows="2" placeholder="Ex: Vitesse de déplacement divisée par 2"></textarea>
</div>
<button type="submit" class="btn btn-add">ENREGISTRER</button>
<button type="button" class="btn" style="background: #4c566a; color: #fff;" onclick="resetModifierForm()">ANNULER</button>
</form>
</div>
<table>
<thead><tr><th>Type</th><th>Nom</th><th>Description</th><th>Actions</th></tr></thead>
<tbody>
<?php foreach ($modifiers_list as $m): ?>
<tr>
<td>
<span class="modifier-tag <?php echo $m['type'] === 'bonus' ? 'tag-bonus' : 'tag-malus'; ?>">
<?php echo strtoupper($m['type']); ?>
</span>
</td>
<td><strong><?php echo htmlspecialchars($m['name']); ?></strong></td>
<td><small><?php echo htmlspecialchars($m['description']); ?></small></td>
<td>
<button class="btn btn-edit" onclick='editModifier(<?php echo json_encode($m, JSON_HEX_APOS); ?>)'>Editer</button>
<a href="?tab=modifiers&delete_modifier=<?php echo $m['id']; ?>" class="btn btn-del" onclick="return confirm('Supprimer ce modificateur ?')">Suppr</a>
</td>
</tr>
<?php endforeach; ?>
</tbody>
</table>
<?php elseif ($tab === 'statuses'): ?>
<h3 style="color: #88c0d0;">Statuts / États</h3>
<div class="form-card">
<h4>Ajouter / Modifier un Statut</h4>
<form method="POST" id="statusForm">
<input type="hidden" name="action" value="upsert_status">
<input type="hidden" name="id" id="st_id" value="0">
<div style="display: flex; gap: 20px;">
<div class="form-group" style="flex: 1;">
<label>Nom du Statut</label>
<input type="text" name="name" id="st_name" required>
</div>
<div class="form-group" style="flex: 1;">
<label>Slug</label>
<input type="text" name="slug" id="st_slug" required>
</div>
<div class="form-group" style="flex: 1;">
<label>Couleur (Hex ou CSS)</label>
<input type="text" name="color" id="st_color" required placeholder="Ex: #ef4444">
</div>
</div>
<div class="form-group">
<label>Description</label>
<textarea name="description" id="st_desc" rows="2"></textarea>
</div>
<button type="submit" class="btn btn-add">ENREGISTRER LE STATUT</button>
<button type="button" class="btn" style="background: #4c566a; color: #fff;" onclick="resetStatusForm()">ANNULER</button>
</form>
</div>
<table>
<thead><tr><th>Couleur</th><th>Nom</th><th>Slug</th><th>Actions</th></tr></thead>
<tbody>
<?php foreach ($statuses_list as $s): ?>
<tr>
<td><div style="width: 20px; height: 20px; background: <?php echo $s['color']; ?>; border: 1px solid #fff;"></div></td>
<td><strong><?php echo htmlspecialchars($s['name']); ?></strong></td>
<td><code><?php echo htmlspecialchars($s['slug']); ?></code></td>
<td>
<button class="btn btn-edit" onclick='editStatus(<?php echo json_encode($s, JSON_HEX_APOS); ?>)'>Editer</button>
<a href="?tab=statuses&delete_status=<?php echo $s['id']; ?>" class="btn btn-del" onclick="return confirm('Supprimer ce statut ?')">Suppr</a>
</td>
</tr>
<?php endforeach; ?>
</tbody>
</table>
<?php elseif ($tab === 'settlement_types'): ?>
<h3 style="color: #88c0d0;">Types d'Établissements</h3>
<div class="form-card">
<h4>Ajouter / Modifier un Type d'Établissement</h4>
<form method="POST" id="settlementTypeForm">
<input type="hidden" name="action" value="upsert_settlement_type">
<input type="hidden" name="id" id="set_t_id" value="0">
<div style="display: flex; gap: 20px;">
<div class="form-group" style="flex: 1;">
<label>Nom</label>
<input type="text" name="name" id="set_t_name" required placeholder="Ex: Ville, Avant-poste...">
</div>
<div class="form-group" style="flex: 1;">
<label>Slug</label>
<input type="text" name="slug" id="set_t_slug" required placeholder="Ex: ville, avant_poste...">
</div>
</div>
<div class="form-group">
<label>Description</label>
<textarea name="description" id="set_t_desc" rows="2"></textarea>
</div>
<button type="submit" class="btn btn-add">ENREGISTRER</button>
<button type="button" class="btn" style="background: #4c566a; color: #fff;" onclick="resetSettlementTypeForm()">ANNULER</button>
</form>
</div>
<table>
<thead><tr><th>Nom</th><th>Slug</th><th>Description</th><th>Actions</th></tr></thead>
<tbody>
<?php foreach ($settlement_types_list as $st): ?>
<tr>
<td><strong><?php echo htmlspecialchars($st['name']); ?></strong></td>
<td><code><?php echo htmlspecialchars($st['slug']); ?></code></td>
<td><small><?php echo htmlspecialchars($st['description']); ?></small></td>
<td>
<button class="btn btn-edit" onclick='editSettlementType(<?php echo json_encode($st, JSON_HEX_APOS); ?>)'>Editer</button>
<a href="?tab=settlement_types&delete_settlement_type=<?php echo $st['id']; ?>" class="btn btn-del" onclick="return confirm('Supprimer ce type ?')">Suppr</a>
</td>
</tr>
<?php endforeach; ?>
</tbody>
</table>
<?php elseif ($tab === 'factions'): ?>
<h3 style="color: #88c0d0;">Gestion des Factions</h3>
<div class="form-card">
<h4>Ajouter / Modifier une Faction</h4>
<form method="POST" id="factionForm" enctype="multipart/form-data">
<input type="hidden" name="action" value="upsert_faction">
<input type="hidden" name="id" id="fac_id" value="0">
<div style="display: flex; gap: 20px;">
<div class="form-group" style="flex: 2;">
<label>Nom de la Faction</label>
<input type="text" name="name" id="fac_name" required placeholder="Ex: Fédération, Empire...">
</div>
<div class="form-group" style="flex: 1;">
<label>Icône (FontAwesome)</label>
<input type="text" name="fa_icon" id="fac_fa_icon" placeholder="Ex: fa-users">
</div>
<div class="form-group" style="flex: 1;">
<label>PNG (Prioritaire)</label>
<input type="file" name="image" accept="image/png">
</div>
</div>
<button type="submit" class="btn btn-add">ENREGISTRER LA FACTION</button>
<button type="button" class="btn" style="background: #4c566a; color: #fff;" onclick="resetFactionForm()">ANNULER</button>
</form>
</div>
<table>
<thead><tr><th>Visuel</th><th>Nom</th><th>Actions</th></tr></thead>
<tbody>
<?php foreach ($factions_list as $f): ?>
<tr>
<td style="text-align: center;">
<?php if (!empty($f['image_url'])): ?>
<img src="<?php echo htmlspecialchars($f['image_url']); ?>?v=<?php echo time(); ?>" style="max-width: 40px; max-height: 40px;">
<?php elseif (!empty($f['fa_icon'])): ?>
<i class="fa-solid <?php echo htmlspecialchars($f['fa_icon']); ?> fa-lg"></i>
<?php else: ?>
<i class="fa-solid fa-flag fa-lg" style="color: #4c566a;"></i>
<?php endif; ?>
</td>
<td><strong><?php echo htmlspecialchars($f['name']); ?></strong></td>
<td>
<button class="btn btn-edit" onclick='editFaction(<?php echo json_encode($f, JSON_HEX_APOS); ?>)'>Editer</button>
<?php if ($f['name'] !== 'Aucune'): ?>
<a href="?tab=factions&delete_faction=<?php echo $f['id']; ?>" class="btn btn-del" onclick="return confirm('Supprimer cette faction ?')">Suppr</a>
<?php endif; ?>
</td>
</tr>
<?php endforeach; ?>
</tbody>
</table>
<?php endif; ?>
</div>
<script>
function editObject(data) {
document.getElementById('obj_id').value = data.id;
document.getElementById('obj_name').value = data.name;
document.getElementById('obj_slug').value = data.slug;
document.getElementById('obj_icon').value = data.icon;
document.getElementById('obj_desc').value = data.description;
// Reset checkboxes
document.querySelectorAll('.modifier-checkbox').forEach(cb => cb.checked = false);
// Check assigned modifiers
if (data.modifier_ids) {
data.modifier_ids.forEach(mid => {
const cb = document.querySelector(`.modifier-checkbox[value="${mid}"]`);
if (cb) cb.checked = true;
});
}
window.scrollTo(0,0);
}
function resetObjectForm() {
document.getElementById('objectForm').reset();
document.getElementById('obj_id').value = 0;
document.querySelectorAll('.modifier-checkbox').forEach(cb => cb.checked = false);
}
function editStatus(data) {
document.getElementById('st_id').value = data.id;
document.getElementById('st_name').value = data.name;
document.getElementById('st_slug').value = data.slug;
document.getElementById('st_color').value = data.color;
document.getElementById('st_desc').value = data.description;
window.scrollTo(0,0);
}
function resetStatusForm() { document.getElementById('statusForm').reset(); document.getElementById('st_id').value = 0; }
function editSettlementType(data) {
document.getElementById('set_t_id').value = data.id;
document.getElementById('set_t_name').value = data.name;
document.getElementById('set_t_slug').value = data.slug;
document.getElementById('set_t_desc').value = data.description;
window.scrollTo(0,0);
}
function resetSettlementTypeForm() { document.getElementById('settlementTypeForm').reset(); document.getElementById('set_t_id').value = 0; }
function editModifier(data) {
document.getElementById('mod_id').value = data.id;
document.getElementById('mod_name').value = data.name;
document.getElementById('mod_type').value = data.type;
document.getElementById('mod_desc').value = data.description;
window.scrollTo(0,0);
}
function resetModifierForm() { document.getElementById('modifierForm').reset(); document.getElementById('mod_id').value = 0; }
function editFaction(data) {
document.getElementById('fac_id').value = data.id;
document.getElementById('fac_name').value = data.name;
document.getElementById('fac_fa_icon').value = data.fa_icon || '';
window.scrollTo(0,0);
}
function resetFactionForm() { document.getElementById('factionForm').reset(); document.getElementById('fac_id').value = 0; }
</script>
</body>
</html>