| Linux in-mum-web1499.main-hosting.eu 5.14.0-503.40.1.el9_5.x86_64 #1 SMP PREEMPT_DYNAMIC Mon May 5 06:06:04 EDT 2025 x86_64 Path : /home/u901718425/domains/task.urbanpillar.in/public_html/dashboard/ |
| Current File : /home/u901718425/domains/task.urbanpillar.in/public_html/dashboard/leave.php |
<?php
require_once "../db.php";
include('aside.php');
if (!isset($_SESSION['user_id']) && !isset($_SESSION['role'])) {
header('location: /');
exit;
} else if (isset($_SESSION['role']) && $_SESSION['role'] === 'user') {
header('location: /');
exit;
}
?>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<title>Admin Dashboard</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css" rel="stylesheet" />
<link href="https://fonts.googleapis.com/css2?family=Material+Symbols+Outlined" rel="stylesheet" />
<link href="/style.css" rel="stylesheet" />
<style>
body {
font-family: Arial, sans-serif;
}
</style>
</head>
<body>
<div class="row m-0">
<?= aside('Leave'); ?>
<div class="col-12 px-4">
<table id="adminLeaveTable" class="table">
<thead>
<tr>
<th>#</th>
<th>User</th>
<th>Requested Summary</th>
<th>Previous Used</th>
<th>Remaining</th>
<th>Reason</th>
<th>Status</th>
<th>Status Reason</th>
<th>Actions</th>
</tr>
</thead>
<tbody></tbody>
</table>
</div>
<script src="https://code.jquery.com/jquery-3.7.1.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/js/bootstrap.bundle.min.js"></script>
<script>
function formatLeaveSummary(leaveDataJson) {
let entries = [];
try {
entries = JSON.parse(leaveDataJson);
} catch (e) {
return 'Invalid data';
}
const grouped = {};
entries.forEach(entry => {
const { date, type } = entry;
if (!grouped[type]) grouped[type] = [];
grouped[type].push(date);
});
const summaryParts = [];
let leave, wfh = 0;
for (const type in grouped) {
const dates = grouped[type].sort();
const formattedDays = dates.map(d => new Date(d).getDate());
const monthYear = new Date(dates[0]).toLocaleDateString('en-US', {
month: 'long', year: 'numeric'
});
type === 'leave' ? leave = dates.length : wfh = dates.length;
summaryParts.push(`${dates.length} ${type} on ${formattedDays.join(', ')} ${monthYear}`);
}
let obj = {
summaryParts: summaryParts.join(', '),
leave,
wfh
}
return obj;
}
function loadAdminPendingLeaves() {
$.get('/dashboard/admin_get_pending_leaves.php', function(data) {
try {
if (typeof data === 'string') {
data = JSON.parse(data);
}
const tbody = $('#adminLeaveTable tbody');
tbody.empty();
if (!Array.isArray(data) || data.length === 0) {
tbody.append('<tr><td colspan="9">No pending leave applications.</td></tr>');
return;
}
data.forEach((leave, index) => {
const requested = JSON.parse(leave.leave_data_json);
const leaveCount = requested.filter(e => e.type === 'Leave').length;
const wfhCount = requested.filter(e => e.type === 'WFH').length;
// Total used from approved applications - assume backend returns this in leave.used_summary
const usedLeave = leave.used_leave || 0;
const usedWFH = leave.used_wfh || 0;
const requestedSummary = formatLeaveSummary(leave.leave_data_json);
const remainingLeave = 10 - usedLeave;
const remainingWFH = 10 - usedWFH;
const row = `
<tr>
<td>${index + 1}</td>
<td>${leave.user_name}</td>
<td>${requestedSummary.summaryParts}</td>
<td>${usedLeave} Leave, ${usedWFH} WFH</td>
<td>${remainingLeave} Leave, ${remainingWFH} WFH</td>
<td>${leave.reason}</td>
<td><span class="badge bg-warning">Pending</span></td>
<td>
<input type="text" id="reason-${leave.id}" class="form-control" placeholder="Optional rejection reason">
</td>
<td>
<button class="btn btn-success btn-sm d-flex justify-content-center align-items-center" id="approved${leave.id}" onclick="updateLeaveStatus(${leave.id}, 'approved')">Approve</button>
<button class="btn btn-danger btn-sm d-flex justify-content-center align-items-center" id="rejected${leave.id}" onclick="updateLeaveStatus(${leave.id}, 'rejected')">Reject</button>
</td>
</tr>
`;
tbody.append(row);
});
} catch (err) {
console.error('Admin leave load failed:', err);
$('#adminLeaveTable tbody').html('<tr><td colspan="9">Error loading data.</td></tr>');
}
});
}
function getStatusColor(status) {
switch (status.toLowerCase()) {
case 'approved': return 'success';
case 'pending': return 'warning';
case 'rejected': return 'danger';
default: return 'secondary';
}
}
function updateLeaveStatus(id, newStatus) {
const reason = $(`#reason-${id}`).val();
$('#'+newStatus+id).html(` <div class="spinner-border text-light" role="status">
<span class="visually-hidden">Loading...</span>
</div>`);
$.post('/dashboard/update_leave_status.php', {
id: id,
status: newStatus,
status_reason: reason
}, function(response) {
let obj = JSON.parse(response);
if(obj.success){
loadAdminPendingLeaves(); // reload table
$('#'+newStatus).html(`newStatus`);
}
});
}
$(document).ready(loadAdminPendingLeaves);
</script>
</body>
</html>