154 lines
9.2 KiB
PHP
154 lines
9.2 KiB
PHP
<?php
|
|
declare(strict_types=1);
|
|
require_once __DIR__ . '/includes/app.php';
|
|
|
|
$flash = consume_flash();
|
|
$applicationId = filter_input(INPUT_GET, 'id', FILTER_VALIDATE_INT) ?: 0;
|
|
$requestedCycleId = filter_input(INPUT_GET, 'cycle', FILTER_VALIDATE_INT) ?: 0;
|
|
$search = clean_text($_GET['search'] ?? '', 255);
|
|
$application = $applicationId > 0 ? get_application($applicationId) : null;
|
|
$isApprovedSchool = $application && (string) $application['status'] === 'approved';
|
|
$cycleContext = ['cycles' => [], 'selected' => null, 'active' => null, 'read_only' => false];
|
|
$selectedCycle = null;
|
|
$selectedCycleId = 0;
|
|
$cycleLabel = 'لا توجد دورة بعد';
|
|
|
|
if ($application && $isApprovedSchool) {
|
|
$cycleContext = resolve_school_cycle_context((int) $application['id'], $application, $requestedCycleId);
|
|
$selectedCycle = $cycleContext['selected'];
|
|
$selectedCycleId = $selectedCycle ? (int) ($selectedCycle['id'] ?? 0) : 0;
|
|
$cycleLabel = $selectedCycle ? (string) $selectedCycle['cycle_name'] : $cycleLabel;
|
|
}
|
|
|
|
$assessmentOptions = $isApprovedSchool && $selectedCycleId > 0
|
|
? school_assessment_type_options_by_cycle((int) $application['id'], $selectedCycleId, false)
|
|
: [];
|
|
|
|
if ($search !== '') {
|
|
$assessmentOptions = array_filter(
|
|
$assessmentOptions,
|
|
static function (array $assessment) use ($search): bool {
|
|
$haystack = implode(' ', [
|
|
(string) ($assessment['label'] ?? ''),
|
|
(string) ($assessment['title'] ?? ''),
|
|
(string) ($assessment['subject_label'] ?? ''),
|
|
(string) ($assessment['category'] ?? ''),
|
|
]);
|
|
return stripos($haystack, $search) !== false;
|
|
}
|
|
);
|
|
}
|
|
|
|
$pageTitle = $application ? 'اختيار ورقة رصد الدرجات: ' . (string) $application['center_name'] . ($selectedCycle ? ' — ' . $cycleLabel : '') : 'اختيار ورقة رصد الدرجات';
|
|
$pageDescription = 'اختر التقييم أولاً ثم افتح صفحة رصد مستقلة ونظيفة لإدخال درجات الطلاب.';
|
|
$approvedSchoolUrl = $application ? school_page_url('approved_school.php', (int) $application['id'], $selectedCycleId) : 'approved_school.php';
|
|
$assessmentsUrl = $application ? school_page_url('assessments.php', (int) $application['id'], $selectedCycleId) : 'assessments.php';
|
|
$scoreSheetBaseUrl = $application ? school_page_url('assessment_score_sheet.php', (int) $application['id'], $selectedCycleId) : 'assessment_score_sheet.php';
|
|
$criteriaBaseUrl = $application ? school_page_url('assessment_criteria.php', (int) $application['id'], $selectedCycleId) : 'assessment_criteria.php';
|
|
|
|
if (!$application) {
|
|
http_response_code(404);
|
|
}
|
|
|
|
render_page_start($pageTitle, 'approved', $pageDescription, (string) ($application['favicon'] ?? ''));
|
|
render_flash($flash);
|
|
?>
|
|
<section class="py-4 py-lg-5">
|
|
<div class="container-xxl">
|
|
<div class="admin-layout row g-4 align-items-start">
|
|
<div class="col-lg-3 layout-sidebar-column">
|
|
<?php if ($application) { require __DIR__ . '/includes/center_sidebar.php'; } else { require __DIR__ . '/includes/sidebar.php'; } ?>
|
|
</div>
|
|
<div class="col-lg-9 layout-content-column">
|
|
<?php if (!$application): ?>
|
|
<div class="app-card text-center py-5">
|
|
<div class="empty-title mb-2">المدرسة غير موجودة</div>
|
|
<p class="text-muted mb-3">تحقق من رابط المدرسة أو ارجع إلى قائمة المراكز المعتمدة.</p>
|
|
<a class="btn btn-primary" href="applications.php?status=approved">المراكز المعتمدة</a>
|
|
</div>
|
|
<?php elseif (!$isApprovedSchool): ?>
|
|
<div class="app-card text-center py-5">
|
|
<div class="empty-title mb-2">الدرجات تُفتح بعد الاعتماد</div>
|
|
<p class="text-muted mb-3">اعتمد المركز أولاً حتى تظهر أوراق الرصد الخاصة به.</p>
|
|
<a class="btn btn-outline-secondary" href="application_detail.php?id=<?= e((string) $application['id']) ?>">ملف الاعتماد</a>
|
|
</div>
|
|
<?php else: ?>
|
|
<div class="page-banner approved-hero mb-4">
|
|
<div class="row g-4 align-items-center">
|
|
<div class="col-lg-8">
|
|
<span class="approved-kicker mb-3">الخطوة 1</span>
|
|
<h1 class="page-title mb-3">اختر التقييم ثم افتح صفحة الرصد</h1>
|
|
<p class="page-copy mb-3">بدلاً من شاشة مزدحمة، أصبحت عملية إدخال الدرجات على خطوتين: <strong>اختيار التقييم</strong> ثم فتح <strong>صفحة مستقلة</strong> لكل ورقة رصد داخل دورة <strong><?= e($cycleLabel) ?></strong>.</p>
|
|
<div class="hero-meta">
|
|
<span><?= e((string) count($assessmentOptions)) ?> تقييمات متاحة</span>
|
|
<span><?= e($cycleLabel) ?></span>
|
|
</div>
|
|
</div>
|
|
<div class="col-lg-4">
|
|
<div class="app-card h-100">
|
|
<div class="section-title mb-2">اختصار العمل</div>
|
|
<div class="section-copy mb-3">1) افتح التقييم 2) أدخل الدرجات 3) احفظ</div>
|
|
<div class="cta-stack">
|
|
<a class="btn btn-outline-secondary" href="<?= e($assessmentsUrl) ?>">إدارة التقييمات</a>
|
|
<a class="btn btn-outline-secondary" href="<?= e($approvedSchoolUrl) ?>">صفحة المركز</a>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="app-card mb-4">
|
|
<form method="get" class="row g-2 align-items-center">
|
|
<input type="hidden" name="id" value="<?= e((string) $application['id']) ?>">
|
|
<input type="hidden" name="cycle" value="<?= e((string) $selectedCycleId) ?>">
|
|
<div class="col-md-9">
|
|
<input type="text" name="search" class="form-control" placeholder="ابحث باسم التقييم أو المادة" value="<?= e($search) ?>">
|
|
</div>
|
|
<div class="col-md-3 d-grid">
|
|
<button type="submit" class="btn btn-primary">بحث</button>
|
|
</div>
|
|
</form>
|
|
</div>
|
|
|
|
<div class="row g-4">
|
|
<?php if ($assessmentOptions === []): ?>
|
|
<div class="col-12">
|
|
<div class="app-card text-center py-5">
|
|
<div class="empty-title mb-2">لا توجد تقييمات جاهزة للرصد</div>
|
|
<p class="text-muted mb-3">أضف نوع تقييم أولاً من صفحة التقييمات، ثم ارجع هنا لفتح ورقة الرصد.</p>
|
|
<a class="btn btn-primary" href="<?= e($assessmentsUrl) ?>">إضافة تقييم</a>
|
|
</div>
|
|
</div>
|
|
<?php else: ?>
|
|
<?php foreach ($assessmentOptions as $assessmentId => $assessment): ?>
|
|
<div class="col-md-6 col-xl-4">
|
|
<article class="app-card h-100 d-flex flex-column">
|
|
<div class="d-flex justify-content-between gap-3 align-items-start mb-3">
|
|
<div>
|
|
<div class="section-title mb-1"><?= e((string) ($assessment['title'] ?: 'تقييم غير مسمى')) ?></div>
|
|
<div class="section-subtle"><?= e((string) ($assessment['subject_label'] !== '' ? $assessment['subject_label'] : 'بدون مادة محددة')) ?></div>
|
|
</div>
|
|
<?= assessment_active_badge((int) ($assessment['is_active'] ? 1 : 0)) ?>
|
|
</div>
|
|
<div class="row g-2 mb-4">
|
|
<div class="col-6"><div class="school-data-item"><strong>الفئة</strong><span><?= e((string) $assessment['category']) ?></span></div></div>
|
|
<div class="col-6"><div class="school-data-item"><strong>الدرجة</strong><span><?= e(rtrim(rtrim(number_format((float) $assessment['max_score'], 2, '.', ''), '0'), '.')) ?></span></div></div>
|
|
<div class="col-6"><div class="school-data-item"><strong>الوزن</strong><span><?= e(rtrim(rtrim(number_format((float) $assessment['weight_percentage'], 2, '.', ''), '0'), '.')) ?>%</span></div></div>
|
|
<div class="col-6"><div class="school-data-item"><strong>البنود</strong><span><?= e((string) ((int) ($assessment['criteria_count'] ?? 0))) ?></span></div></div>
|
|
</div>
|
|
<div class="mt-auto d-grid gap-2">
|
|
<a class="btn btn-primary" href="<?= e($scoreSheetBaseUrl . '&assessment_id=' . urlencode((string) $assessmentId)) ?>">فتح صفحة الرصد</a>
|
|
<a class="btn btn-outline-secondary" href="<?= e($criteriaBaseUrl . '&assessment_id=' . urlencode((string) $assessmentId)) ?>">إعداد البنود</a>
|
|
</div>
|
|
</article>
|
|
</div>
|
|
<?php endforeach; ?>
|
|
<?php endif; ?>
|
|
</div>
|
|
<?php endif; ?>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</section>
|
|
<?php render_page_end();
|