159 lines
9.6 KiB
PHP
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>
|