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

181 lines
8.7 KiB
PHP
Executable File

<?= $this->extend('layout/management_layout') ?>
<?= $this->section('content') ?>
<?php $dateLabel = !empty($date) ? local_date($date, 'm-d-Y') : ''; ?>
<div class="container-xxl py-4">
<div class="d-flex justify-content-between align-items-center mb-3 flex-wrap gap-2">
<h2 class="mb-0">Teacher Attendance</h2>
<div class="d-flex gap-2">
<a class="btn btn-outline-secondary"
href="<?= site_url('admin/teacher-attendance/month?date='.urlencode($date).'&semester='.urlencode($semester).'&school_year='.urlencode($schoolYear)) ?>">
← Back to Monthly Attendance
</a>
</div>
</div>
<?php if (session()->getFlashdata('status')): ?>
<div class="alert alert-success"><?= session()->getFlashdata('status') ?></div>
<?php endif; ?>
<?php if (session()->getFlashdata('error')): ?>
<div class="alert alert-danger"><?= session()->getFlashdata('error') ?></div>
<?php endif; ?>
<div class="d-flex justify-content-between align-items-center mb-3 flex-wrap gap-2">
</div>
<form class="row gy-2 gx-3 align-items-end mb-3" method="get" action="<?= site_url('admin/teacher-attendance') ?>">
<div class="col-sm-3">
<label class="form-label">School Year</label>
<input type="text" name="school_year" class="form-control" value="<?= esc($schoolYear) ?>" placeholder="e.g. 2025-2026">
</div>
<div class="col-sm-2">
<label class="form-label">Semester</label>
<input type="text" name="semester" class="form-control" value="<?= esc($semester) ?>" placeholder="Fall">
</div>
<div class="col-sm-3">
<label class="form-label">Date</label>
<input type="date" name="date" class="form-control" value="<?= esc($date) ?>">
</div>
<div class="col-sm-4">
<label class="form-label">Class Section</label>
<select name="class_section_id" class="form-select">
<option value="0">— Choose Section —</option>
<?php foreach ($sections as $id => $label): ?>
<option value="<?= (int)$id ?>" <?= (int)$id === (int)$class_section_id ? 'selected' : '' ?>>
<?= esc($label) ?> (ID: <?= (int)$id ?>)
</option>
<?php endforeach; ?>
</select>
</div>
<div class="col-12 d-flex gap-2">
<button type="submit" class="btn btn-secondary">Load</button>
<?php if ($class_section_id): ?>
<a class="btn btn-outline-secondary" href="<?= site_url('admin/teacher-attendance') ?>">Reset</a>
<?php endif; ?>
</div>
</form>
<?php if ($class_section_id): ?>
<?php if ($locked): ?>
<div class="alert alert-warning">
<strong>Note:</strong> Student/section attendance for this day appears to be <em>finalized</em>.
Admin edits to teacher attendance here are allowed and will not unlock the section.
</div>
<?php endif; ?>
<form method="post" action="<?= site_url('admin/teacher-attendance/save') ?>" id="adminTeacherAttForm">
<?= csrf_field() ?>
<input type="hidden" name="class_section_id" value="<?= (int)$class_section_id ?>">
<input type="hidden" name="date" value="<?= esc($date) ?>">
<input type="hidden" name="semester" value="<?= esc($semester) ?>">
<input type="hidden" name="school_year" value="<?= esc($schoolYear) ?>">
<div class="card shadow-sm">
<div class="card-header d-flex justify-content-between align-items-center">
<strong>Teachers on <?= esc($dateLabel) ?></strong>
<div class="d-flex gap-2">
<button type="button" class="btn btn-sm btn-outline-success" id="markAllPresent">Mark All Present</button>
<button type="button" class="btn btn-sm btn-outline-secondary" id="clearAll">Clear All</button>
</div>
</div>
<div class="card-body table-responsive">
<table id="teacherAttTable" class="table table-bordered table-striped align-middle">
<thead class="table-light">
<tr>
<th class="text-center" style="width:70px;">#</th>
<th>Name</th>
<th class="text-center" style="width:160px;">Role</th>
<th class="text-center" style="width:200px;">Status</th>
<th>Reason</th>
</tr>
</thead>
<tbody>
<?php if (!empty($grid)): ?>
<?php $i = 1; foreach ($grid as $row): ?>
<?php
$tid = (int)$row['teacher_id'];
$name = trim(($row['firstname'] ?? '') . ' ' . ($row['lastname'] ?? '')) ?: ('User#' . $tid);
$pos = (string)$row['position'];
$stat = strtolower((string)($row['status'] ?? ''));
$reason= (string)($row['reason'] ?? '');
?>
<tr>
<td class="text-center"><?= $i++ ?></td>
<td><?= esc($name) ?></td>
<td class="text-center"><?= esc($pos === 'main' ? 'Main Teacher' : 'Assistant') ?></td>
<td class="text-center">
<input type="hidden" name="teachers[<?= $tid ?>][teacher_id]" value="<?= $tid ?>">
<select name="teachers[<?= $tid ?>][status]" class="form-select form-select-sm status-select">
<option value="">—</option>
<option value="present" <?= $stat === 'present' ? 'selected' : '' ?>>Present</option>
<option value="absent" <?= $stat === 'absent' ? 'selected' : '' ?>>Absent</option>
<option value="late" <?= $stat === 'late' ? 'selected' : '' ?>>Late</option>
</select>
</td>
<td>
<input type="text"
name="teachers[<?= $tid ?>][reason]"
class="form-control form-control-sm"
placeholder="Optional reason"
value="<?= esc($reason) ?>">
</td>
</tr>
<?php endforeach; ?>
<?php else: ?>
<tr><td colspan="5" class="text-center">No teachers found for this section/term.</td></tr>
<?php endif; ?>
</tbody>
</table>
</div>
<div class="card-footer d-flex justify-content-end">
<button type="submit" class="btn btn-primary">Save Changes</button>
</div>
</div>
</form>
<?php endif; ?>
</div>
<?= $this->endSection() ?>
<?= $this->section('scripts') ?>
<script>
document.addEventListener('DOMContentLoaded', function(){
const markAllBtn = document.getElementById('markAllPresent');
const clearBtn = document.getElementById('clearAll');
if (markAllBtn) {
markAllBtn.addEventListener('click', () => {
document.querySelectorAll('#teacherAttTable .status-select').forEach(sel => {
sel.value = 'present';
});
});
}
if (clearBtn) {
clearBtn.addEventListener('click', () => {
document.querySelectorAll('#teacherAttTable .status-select').forEach(sel => {
sel.value = '';
});
document.querySelectorAll('#teacherAttTable input[name$="[reason]"]').forEach(inp => {
inp.value = '';
});
});
}
});
</script>
<!-- DataTables (optional) -->
<script>
$(function(){
$('#teacherAttTable').DataTable({
paging: false, // usually small set; disable paging for editing
searching: false,
info: false,
order: []
});
});
</script>
<?= $this->endSection() ?>