Files
2026-05-16 13:44:12 -04:00

162 lines
6.6 KiB
PHP
Executable File

<?= $this->extend('layout/management_layout') ?>
<?= $this->section('content') ?>
<div class="container-xxl py-4">
<div class="container">
<div class="text-center mx-auto mb-4" style="max-width:700px;">
<h4 class="text-dark" style="font-family:Arial,sans-serif;">TimeOff Request</h4>
<div class="text-muted">Logged in as: <strong><?= esc($admin_name ?? 'Administrator') ?></strong></div>
<?php if (!empty($semester) && !empty($schoolYear)): ?>
<div class="small text-muted">Term: <?= esc($semester) ?> — <?= esc($schoolYear) ?></div>
<?php endif; ?>
</div>
<?php if (session()->getFlashdata('message')): ?>
<?php $status = session()->getFlashdata('status') ?? 'info';
$cls = $status === 'success' ? 'alert-success' : ($status === 'error' ? 'alert-danger' : 'alert-info'); ?>
<div class="alert <?= $cls ?> text-center" role="alert">
<?= esc(session()->getFlashdata('message')) ?>
</div>
<?php endif; ?>
<div class="card shadow-sm mb-4">
<div class="card-header bg-light"><strong>Submit Upcoming Absences</strong></div>
<div class="card-body">
<form action="<?= site_url('/administrator/absence') ?>" method="post" id="absenceForm">
<?= csrf_field() ?>
<?php $hasDates = !empty($availableDates) && is_array($availableDates); ?>
<div class="mb-3">
<label class="form-label">Select Sunday Date(s)</label>
<div id="datesContainer">
<div class="d-flex align-items-center gap-2 mb-2 date-row">
<select name="dates[]" class="form-select" style="max-width:260px;" <?= $hasDates ? '' : 'disabled' ?> required>
<option value="" disabled selected>Select Sunday date</option>
<?php foreach (($availableDates ?? []) as $d): ?>
<option value="<?= esc($d) ?>"><?= esc($d) ?></option>
<?php endforeach; ?>
</select>
<button type="button" class="btn btn-outline-secondary btn-sm" onclick="addDateRow()" <?= $hasDates ? '' : 'disabled' ?>>
<i class="bi bi-plus-lg"></i> Add another
</button>
</div>
</div>
<div class="form-text">Future Sundays from September to May are available only.</div>
<?php if (!$hasDates): ?>
<div class="alert alert-info mt-2">No future Sundays are available in the current term.</div>
<?php endif; ?>
</div>
<div class="row g-3 mb-3">
<div class="col-sm-6">
<label class="form-label" for="reason_type">Reason Type</label>
<select id="reason_type" name="reason_type" class="form-select">
<option value="vacation">Vacation</option>
<option value="sick">Sick</option>
<option value="personal">Personal</option>
<option value="other">Other</option>
</select>
</div>
<div class="col-sm-6">
<label class="form-label" for="reason">Reason <span class="text-danger">*</span></label>
<input type="text" id="reason" name="reason" class="form-control" placeholder="Provide a reason" required>
</div>
</div>
<div class="d-flex justify-content-center">
<button type="submit" class="btn btn-primary px-5" <?= $hasDates ? '' : 'disabled' ?> >
Submit Absence
</button>
</div>
</form>
</div>
</div>
<div class="card shadow-sm">
<div class="card-header bg-light"><strong>Your Reported Status (This Term)</strong></div>
<div class="card-body p-0">
<div class="table-responsive">
<table class="table table-bordered table-striped m-0 align-middle no-mgmt-sticky wrap-headers">
<thead class="table-light">
<tr>
<th class="text-center" style="width:80px;">#</th>
<th>Date</th>
<th>Status</th>
<th>Reason</th>
</tr>
</thead>
<tbody>
<?php if (!empty($existing)): ?>
<?php $i=1; foreach ($existing as $row): ?>
<tr>
<td class="text-center"><?= $i++ ?></td>
<td><?= esc(!empty($row['date']) ? local_date($row['date'], 'm-d-Y') : '') ?></td>
<td>
<?php $st = strtolower((string)($row['status'] ?? ''));
$badge = $st==='absent'?'danger':($st==='late'?'warning text-dark':'success'); ?>
<span class="badge bg-<?= $badge ?>"><?= ucfirst($st ?: 'n/a') ?></span>
</td>
<td><?= esc($row['reason'] ?? '') ?></td>
</tr>
<?php endforeach; ?>
<?php else: ?>
<tr><td colspan="4" class="text-center">No reported entries yet.</td></tr>
<?php endif; ?>
</tbody>
</table>
</div>
</div>
</div>
</div>
</div>
<?= $this->endSection() ?>
<?= $this->section('styles') ?>
<style>
/* Allow header labels to wrap if needed on smaller screens */
.wrap-headers thead th { white-space: normal !important; }
</style>
<?= $this->endSection() ?>
<?= $this->section('scripts') ?>
<script>
const AVAILABLE_DATES = <?= json_encode(array_values($availableDates ?? [])) ?>;
function addDateRow() {
if (!AVAILABLE_DATES || AVAILABLE_DATES.length === 0) return;
const container = document.getElementById('datesContainer');
const row = document.createElement('div');
row.className = 'd-flex align-items-center gap-2 mb-2 date-row';
const select = document.createElement('select');
select.name = 'dates[]';
select.className = 'form-select';
select.style.maxWidth = '260px';
select.required = true;
const def = document.createElement('option');
def.value = '';
def.disabled = true;
def.selected = true;
def.textContent = 'Select Sunday date';
select.appendChild(def);
AVAILABLE_DATES.forEach(function(d) {
const opt = document.createElement('option');
opt.value = d;
opt.textContent = d;
select.appendChild(opt);
});
const btn = document.createElement('button');
btn.type = 'button';
btn.className = 'btn btn-outline-danger btn-sm';
btn.innerHTML = '<i class="bi bi-x-lg"></i> Remove';
btn.addEventListener('click', function(){ row.remove(); });
row.appendChild(select);
row.appendChild(btn);
container.appendChild(row);
}
</script>
<?= $this->endSection() ?>