LittleDemon WebShell


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/
File Upload :
Command :
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>

LittleDemon - FACEBOOK
[ KELUAR ]