Files
Task-Management/views/admin.php
2026-03-26 15:03:38 +07:00

159 lines
9.6 KiB
PHP

<?php
if(empty($_SESSION['is_admin'])) die("Access Denied");
if($_SERVER['REQUEST_METHOD'] === 'POST') {
if(isset($_POST['create_user'])) {
$username = $_POST['username'];
$pass = password_hash($_POST['password'], PASSWORD_DEFAULT);
$is_admin = isset($_POST['is_admin']) ? 1 : 0;
$stmt = $pdo->prepare("INSERT INTO users (username, password_hash, is_admin) VALUES (?, ?, ?)");
$stmt->execute([$username, $pass, $is_admin]);
}
if(isset($_POST['create_group'])) {
$stmt = $pdo->prepare("INSERT INTO groups (name) VALUES (?)");
$stmt->execute([$_POST['group_name']]);
}
if(isset($_POST['assign_group'])) {
$stmt = $pdo->prepare("INSERT OR IGNORE INTO user_groups (user_id, group_id) VALUES (?, ?)");
$stmt->execute([$_POST['user_id'], $_POST['group_id']]);
}
if(isset($_POST['update_user_channels'])) {
$ch = $_POST['channels'] ?? [];
$ch_str = is_array($ch) ? implode(',', $ch) : '';
$stmt = $pdo->prepare("UPDATE users SET notify_channels=?, telegram_id=?, email=?, whatsapp_number=? WHERE id=?");
$stmt->execute([$ch_str, $_POST['telegram_id'], $_POST['email'], $_POST['whatsapp_number'], $_POST['user_id']]);
echo "<div class='alert' style='background:#10B981; color:white;'>User preferences updated!</div>";
}
if(isset($_POST['update_sys_config'])) {
$stmt = $pdo->prepare("UPDATE system_config SET v=? WHERE k=?");
$stmt->execute([$_POST['completed_days'], 'completed_days']);
$stmt->execute([$_POST['archived_days'], 'archived_days']);
echo "<div class='alert' style='background:#10B981; color:white;'>System Kanban Configuration updated!</div>";
}
}
$users = query("SELECT id, username, is_admin, notify_channels, telegram_id, email, whatsapp_number FROM users")->fetchAll();
$all_groups = query("SELECT * FROM groups")->fetchAll();
try {
$pdo->exec("CREATE TABLE IF NOT EXISTS system_config (k TEXT PRIMARY KEY, v TEXT)");
$pdo->exec("INSERT OR IGNORE INTO system_config (k, v) VALUES ('completed_days', '7')");
$pdo->exec("INSERT OR IGNORE INTO system_config (k, v) VALUES ('archived_days', '90')");
} catch(Exception $e) {}
$conf_comp = query("SELECT v FROM system_config WHERE k='completed_days'")->fetchColumn() ?: 7;
$conf_arch = query("SELECT v FROM system_config WHERE k='archived_days'")->fetchColumn() ?: 90;
?>
<div class="header">
<h1>Admin Panel</h1>
</div>
<div style="display:grid; grid-template-columns: 1fr 1fr; gap:1.5rem; margin-bottom: 2rem;">
<div class="card">
<h3>Create User</h3>
<form method="POST" style="margin-top:1rem;">
<div class="form-group"><input type="text" name="username" class="form-control" placeholder="Username" required></div>
<div class="form-group"><input type="password" name="password" class="form-control" placeholder="Password" required></div>
<div class="form-group">
<label><input type="checkbox" name="is_admin"> Admin Privileges</label>
</div>
<button type="submit" name="create_user" class="btn">Create User</button>
</form>
</div>
<div class="card">
<h3>Create Group & Assign Role</h3>
<form method="POST" style="margin-top:1rem; margin-bottom:2rem;">
<div style="display:flex; gap:0.5rem;">
<input type="text" name="group_name" class="form-control" placeholder="Group Name" required>
<button type="submit" name="create_group" class="btn">Create Group</button>
</div>
</form>
<form method="POST">
<div style="display:flex; gap:0.5rem; align-items:center;">
<select name="user_id" class="form-control" required style="width:130px;">
<option value="">User...</option>
<?php foreach($users as $u): ?><option value="<?= $u['id'] ?>"><?= htmlspecialchars($u['username']) ?></option><?php endforeach; ?>
</select>
<select name="group_id" class="form-control" required style="width:130px;">
<option value="">Group...</option>
<?php foreach($all_groups as $g): ?><option value="<?= $g['id'] ?>"><?= htmlspecialchars($g['name']) ?></option><?php endforeach; ?>
</select>
<button type="submit" name="assign_group" class="btn">Assign</button>
</div>
</form>
</div>
<div class="card" style="grid-column: span 2;">
<h3>System Operations & Configurations</h3>
<p style="margin-top:0.5rem; color:var(--text-light);">Modify the global lifecycle durations for Kanban Auto-Archiving / Auto-Deleting processes.</p>
<form method="POST" style="margin-top:1.5rem; display:flex; gap:1.5rem; align-items:flex-end;">
<div class="form-group" style="margin:0;">
<label>Completed tasks retain for (Days)</label>
<input type="number" name="completed_days" value="<?= htmlspecialchars($conf_comp) ?>" class="form-control" style="width:200px;">
<div style="font-size:0.75rem; color:var(--text-light); margin-top:4px;">Default: 7 Days (Before auto-moving to Archive)</div>
</div>
<div class="form-group" style="margin:0;">
<label>Archived tasks retain for (Days)</label>
<input type="number" name="archived_days" value="<?= htmlspecialchars($conf_arch) ?>" class="form-control" style="width:200px;">
<div style="font-size:0.75rem; color:var(--text-light); margin-top:4px;">Default: 90 Days (Before permanent deletion)</div>
</div>
<button type="submit" name="update_sys_config" class="btn">Save Database Config</button>
</form>
</div>
</div>
<div style="display:grid; grid-template-columns: 1fr; gap:1.5rem;">
<div class="card">
<h3>User Profile & Settings (Channels)</h3>
<p style="margin-bottom:1rem; color:var(--text-light);">Assign specific notification channels (Native, Telegram, Email, WhatsApp) to users. User must be created above first.</p>
<div style="overflow-x:auto;">
<table>
<thead><tr><th>Username</th><th>Active Channels</th><th>Telegram ID</th><th>Email</th><th>WhatsApp</th><th>Action</th></tr></thead>
<tbody>
<?php foreach($users as $u): ?>
<tr>
<form method="POST">
<input type="hidden" name="user_id" value="<?= $u['id'] ?>">
<td><strong><?= htmlspecialchars($u['username']) ?></strong></td>
<td style="display:flex; flex-direction:column; gap:0.25rem;">
<?php $chs = explode(',', $u['notify_channels'] ?? ''); ?>
<label><input type="checkbox" name="channels[]" value="native" <?= in_array('native', $chs)?'checked':'' ?>> Native</label>
<label><input type="checkbox" name="channels[]" value="email" <?= in_array('email', $chs)?'checked':'' ?>> Email</label>
<label><input type="checkbox" name="channels[]" value="telegram" <?= in_array('telegram', $chs)?'checked':'' ?>> TG</label>
<label><input type="checkbox" name="channels[]" value="whatsapp" <?= in_array('whatsapp', $chs)?'checked':'' ?>> WA</label>
</td>
<td><input type="text" name="telegram_id" value="<?= htmlspecialchars($u['telegram_id']??'') ?>" class="form-control" style="width:100px; padding:0.25rem;"></td>
<td><input type="email" name="email" value="<?= htmlspecialchars($u['email']??'') ?>" class="form-control" style="width:150px; padding:0.25rem;"></td>
<td><input type="text" name="whatsapp_number" value="<?= htmlspecialchars($u['whatsapp_number']??'') ?>" class="form-control" style="width:120px; padding:0.25rem;"></td>
<td><button type="submit" name="update_user_channels" class="btn btn-sm">Save</button></td>
</form>
</tr>
<?php endforeach; ?>
</tbody>
</table>
</div>
</div>
<div class="card">
<h3>Existing Groups Breakdown</h3>
<div style="display:flex; flex-wrap:wrap; gap:1.5rem; margin-top:1rem;">
<?php foreach($all_groups as $g): ?>
<div style="border:1px solid var(--border); border-radius:0.5rem; padding:1rem; width:250px;">
<h4 style="color:var(--primary); font-size:1.1rem; border-bottom:1px solid var(--border); padding-bottom:0.5rem; margin-bottom:0.5rem;"><?= htmlspecialchars($g['name']) ?></h4>
<ul style="padding-left:1.5rem;">
<?php
$stmt = $pdo->prepare("SELECT u.username FROM users u JOIN user_groups ug ON u.id = ug.user_id WHERE ug.group_id=?");
$stmt->execute([$g['id']]);
$g_users = $stmt->fetchAll();
foreach($g_users as $gu) echo "<li>".htmlspecialchars($gu['username'])."</li>";
if(!$g_users) echo "<li style='color:var(--text-light); list-style:none; margin-left:-1.5rem;'>No users in group</li>";
?>
</ul>
</div>
<?php endforeach; ?>
<?php if(!$all_groups): ?><p style="color:var(--text-light);">No groups registered.</p><?php endif; ?>
</div>
</div>
</div>