Implement verified curriculum, video review, watch sessions, ledger safeguards, and remove demo data
This commit is contained in:
@@ -114,15 +114,13 @@ class GuardianPortal
|
||||
<div class="hero-card">
|
||||
<div>
|
||||
<span style="font-size: 12px; font-weight: 800; color: var(--accent-cyan); display: block; margin-bottom: 6px;">متابعة التحصيل الأكاديمي والجاهزية الوزارية 📊</span>
|
||||
<h1 style="font-size: 24px; font-weight: 900; color: #FFF;" id="selected_child_name">الابن: أحمد (الفرع العلمي)</h1>
|
||||
<p style="font-size: 13px; color: var(--text-secondary); margin-top: 4px;">مدرسة الثقافة العسكرية المعتمدة • الرقم الوطني: 2008XXXX12</p>
|
||||
<h1 style="font-size: 24px; font-weight: 900; color: #FFF;" id="selected_child_name">لا توجد بيانات طالب مرتبطة بعد</h1>
|
||||
<p style="font-size: 13px; color: var(--text-secondary); margin-top: 4px;">اربط حساب الطالب المصرح به لعرض بياناته الفعلية.</p>
|
||||
</div>
|
||||
|
||||
<!-- Multi-Child Switching Pill -->
|
||||
<div class="child-selector-pill">
|
||||
<button class="child-btn active" onclick="switchChildProfile(0, 'أحمد (علمي)', '2008XXXX12', '94.2%')">أحمد (توجيهي)</button>
|
||||
<button class="child-btn" onclick="switchChildProfile(1, 'سارة (توجيهي 2008)', '2008XXXX34', '96.8%')">سارة</button>
|
||||
<button class="child-btn" onclick="switchChildProfile(2, 'عمر (الصف العاشر)', '2010XXXX56', '89.5%')">عمر</button>
|
||||
<span style="font-size:12px;color:var(--text-muted);">لا يوجد طلاب مرتبطون بالحساب</span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -130,8 +128,8 @@ class GuardianPortal
|
||||
<div class="grid-3">
|
||||
<div class="card">
|
||||
<span style="font-size: 12px; color: var(--text-muted); display: block; margin-bottom: 6px;">مؤشر الجاهزية للوزاري (Socratic Readiness)</span>
|
||||
<div class="metric-val val-cyan" id="metric_readiness">94.2%</div>
|
||||
<span style="font-size: 12px; color: var(--accent-green); display: block; margin-top: 8px;">✓ مستوى متقدم جداً ومؤهل لعلامة كاملة</span>
|
||||
<div class="metric-val val-cyan" id="metric_readiness">غير متاح</div>
|
||||
<span style="font-size: 12px; color: var(--text-muted); display: block; margin-top: 8px;">تظهر القراءة بعد وصول بيانات الطالب الفعلية.</span>
|
||||
</div>
|
||||
|
||||
<div class="card">
|
||||
|
||||
@@ -727,8 +727,8 @@ class StudentPortal
|
||||
<div style="display: grid; grid-template-columns: 1fr 1fr; gap: 8px; margin: 14px 0;">
|
||||
<div style="background: rgba(255,255,255,0.03); border: 1px solid var(--border); border-radius: 10px; padding: 8px 12px;">
|
||||
<span style="font-size: 10px; color: var(--text-muted); display: block;">مؤشر الجدارة الكلي</span>
|
||||
<span style="font-size: 15px; font-weight: 900; color: var(--accent-gold);"><?= number_format((float)($t['composite_merit_score'] ?? 96.5), 1) ?>%</span>
|
||||
<span style="font-size: 10px; color: var(--accent-gold);">★ <?= number_format((float)($t['star_equivalent'] ?? 4.9), 1) ?></span>
|
||||
<span style="font-size: 15px; font-weight: 900; color: var(--accent-gold);"><?= isset($t['composite_merit_score']) ? number_format((float)$t['composite_merit_score'], 1) . '%' : 'غير متاح' ?></span>
|
||||
<span style="font-size: 10px; color: var(--accent-gold);"><?= isset($t['star_equivalent']) ? '★ ' . number_format((float)$t['star_equivalent'], 1) : 'لا توجد تقييمات موثقة' ?></span>
|
||||
</div>
|
||||
<div style="background: rgba(255,255,255,0.03); border: 1px solid var(--border); border-radius: 10px; padding: 8px 12px;">
|
||||
<span style="font-size: 10px; color: var(--text-muted); display: block;">سرعة الرد (Workerman)</span>
|
||||
@@ -2501,8 +2501,8 @@ class StudentPortal
|
||||
<div style="display: grid; grid-template-columns: 1fr 1fr; gap: 8px; margin: 14px 0;">
|
||||
<div style="background: rgba(255,255,255,0.03); border: 1px solid var(--border); border-radius: 10px; padding: 8px 12px;">
|
||||
<span style="font-size: 10px; color: var(--text-muted); display: block;">مؤشر الجدارة الكلي</span>
|
||||
<span style="font-size: 15px; font-weight: 900; color: var(--accent-gold);">${parseFloat(t.composite_merit_score || 96.5).toFixed(1)}%</span>
|
||||
<span style="font-size: 10px; color: var(--accent-gold);">★ ${parseFloat(t.star_equivalent || 4.9).toFixed(1)}</span>
|
||||
<span style="font-size: 15px; font-weight: 900; color: var(--accent-gold);">${t.composite_merit_score == null ? 'غير متاح' : `${parseFloat(t.composite_merit_score).toFixed(1)}%`}</span>
|
||||
<span style="font-size: 10px; color: var(--accent-gold);">${t.star_equivalent == null ? 'لا توجد تقييمات موثقة' : `★ ${parseFloat(t.star_equivalent).toFixed(1)}`}</span>
|
||||
</div>
|
||||
<div style="background: rgba(255,255,255,0.03); border: 1px solid var(--border); border-radius: 10px; padding: 8px 12px;">
|
||||
<span style="font-size: 10px; color: var(--text-muted); display: block;">سرعة الرد (Workerman)</span>
|
||||
|
||||
@@ -418,15 +418,15 @@ class TeacherPortal
|
||||
<div class="stats-grid">
|
||||
<div class="stat-card">
|
||||
<span class="stat-label">الكورسات المنشورة</span>
|
||||
<span class="stat-val val-cyan" id="stat_courses_count"><?= max(1, $coursesCount) ?></span>
|
||||
<span class="stat-val val-cyan" id="stat_courses_count"><?= (int)$coursesCount ?></span>
|
||||
</div>
|
||||
<div class="stat-card">
|
||||
<span class="stat-label">الطلاب المتفاعلون</span>
|
||||
<span class="stat-val val-purple" id="stat_students_count"><?= max(1, $studentsCount) ?></span>
|
||||
<span class="stat-val val-purple" id="stat_students_count"><?= (int)$studentsCount ?></span>
|
||||
</div>
|
||||
<div class="stat-card gold-glow">
|
||||
<span class="stat-label">متوسط إتقان الطلاب</span>
|
||||
<span class="stat-val val-gold" id="stat_mastery_avg">94.6%</span>
|
||||
<span class="stat-val val-gold" id="stat_mastery_avg">غير متاح</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@@ -494,25 +494,25 @@ class TeacherPortal
|
||||
<div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(220px, 1fr)); gap: 16px; margin-bottom: 24px;">
|
||||
<div style="background: rgba(11,19,43,0.8); border: 1px solid var(--border); border-radius: 16px; padding: 18px;">
|
||||
<span style="font-size: 11px; color: var(--text-muted); display: block; margin-bottom: 4px;">مؤشر الجدارة الكلي المركب</span>
|
||||
<span style="font-size: 24px; font-weight: 900; color: var(--accent-gold);" id="rep_merit_score">96.8%</span>
|
||||
<span style="font-size: 11px; color: var(--accent-cyan); display: block; margin-top: 4px;" id="rep_tier_badge">معلم نخبوي معتمد 💎</span>
|
||||
<span style="font-size: 24px; font-weight: 900; color: var(--accent-gold);" id="rep_merit_score">غير متاح</span>
|
||||
<span style="font-size: 11px; color: var(--accent-cyan); display: block; margin-top: 4px;" id="rep_tier_badge">قيد بناء سجل التقييم</span>
|
||||
</div>
|
||||
|
||||
<div style="background: rgba(11,19,43,0.8); border: 1px solid var(--border); border-radius: 16px; padding: 18px;">
|
||||
<span style="font-size: 11px; color: var(--text-muted); display: block; margin-bottom: 4px;">سرعة الاستجابة (Workerman SLA)</span>
|
||||
<span style="font-size: 24px; font-weight: 900; color: #34D399;" id="rep_response_speed">3 دقائق ⚡</span>
|
||||
<span style="font-size: 11px; color: var(--text-muted); display: block; margin-top: 4px;" id="rep_response_rate">نسبة التجاوب: 99.2%</span>
|
||||
<span style="font-size: 24px; font-weight: 900; color: #34D399;" id="rep_response_speed">غير متاح</span>
|
||||
<span style="font-size: 11px; color: var(--text-muted); display: block; margin-top: 4px;" id="rep_response_rate">نسبة التجاوب: غير متاحة</span>
|
||||
</div>
|
||||
|
||||
<div style="background: rgba(11,19,43,0.8); border: 1px solid var(--border); border-radius: 16px; padding: 18px;">
|
||||
<span style="font-size: 11px; color: var(--text-muted); display: block; margin-bottom: 4px;">تقييم الطلاب المعاير والموزون</span>
|
||||
<span style="font-size: 24px; font-weight: 900; color: #A78BFA;" id="rep_weighted_rating">★ 4.90 / 5.0</span>
|
||||
<span style="font-size: 24px; font-weight: 900; color: #A78BFA;" id="rep_weighted_rating">لا توجد تقييمات موثقة</span>
|
||||
<span style="font-size: 11px; color: var(--text-muted); display: block; margin-top: 4px;" id="rep_reviews_count">بناءً على التقييمات الموثقة</span>
|
||||
</div>
|
||||
|
||||
<div style="background: rgba(11,19,43,0.8); border: 1px solid var(--border); border-radius: 16px; padding: 18px;">
|
||||
<span style="font-size: 11px; color: var(--text-muted); display: block; margin-bottom: 4px;">معدل رفع إتقان الطلاب (Mastery)</span>
|
||||
<span style="font-size: 24px; font-weight: 900; color: var(--accent-cyan);" id="rep_mastery_gain">+94.6%</span>
|
||||
<span style="font-size: 24px; font-weight: 900; color: var(--accent-cyan);" id="rep_mastery_gain">غير متاح</span>
|
||||
<span style="font-size: 11px; color: var(--text-muted); display: block; margin-top: 4px;">في الكويزات السقراطية والامتحانات</span>
|
||||
</div>
|
||||
</div>
|
||||
@@ -1517,13 +1517,13 @@ class TeacherPortal
|
||||
const data = await res.json();
|
||||
if (res.ok && data.status === 'success' && data.data) {
|
||||
const m = data.data;
|
||||
document.getElementById('rep_merit_score').textContent = `${parseFloat(m.composite_merit_score || 96.8).toFixed(1)}%`;
|
||||
document.getElementById('rep_tier_badge').textContent = m.reputation_tier || 'معلم نخبوي معتمد 💎';
|
||||
document.getElementById('rep_response_speed').textContent = `${parseInt(m.avg_response_minutes || 3)} دقائق ⚡`;
|
||||
document.getElementById('rep_response_rate').textContent = `نسبة التجاوب: ${parseFloat(m.response_rate_percentage || 99.2).toFixed(1)}%`;
|
||||
document.getElementById('rep_weighted_rating').textContent = `★ ${parseFloat(m.star_equivalent || 4.9).toFixed(2)} / 5.0`;
|
||||
document.getElementById('rep_merit_score').textContent = m.composite_merit_score == null ? 'غير متاح' : `${parseFloat(m.composite_merit_score).toFixed(1)}%`;
|
||||
document.getElementById('rep_tier_badge').textContent = m.reputation_tier || 'قيد بناء سجل التقييم';
|
||||
document.getElementById('rep_response_speed').textContent = m.avg_response_minutes == null ? 'غير متاح' : `${parseInt(m.avg_response_minutes)} دقائق ⚡`;
|
||||
document.getElementById('rep_response_rate').textContent = m.response_rate_percentage == null ? 'نسبة التجاوب: غير متاحة' : `نسبة التجاوب: ${parseFloat(m.response_rate_percentage).toFixed(1)}%`;
|
||||
document.getElementById('rep_weighted_rating').textContent = m.star_equivalent == null ? 'لا توجد تقييمات موثقة' : `★ ${parseFloat(m.star_equivalent).toFixed(2)} / 5.0`;
|
||||
document.getElementById('rep_reviews_count').textContent = `بناءً على ${m.total_reviews_count || 0} تقييم موثق`;
|
||||
document.getElementById('rep_mastery_gain').textContent = `+${parseFloat(m.mastery_impact_score || 94.6).toFixed(1)}%`;
|
||||
document.getElementById('rep_mastery_gain').textContent = m.mastery_impact_score == null ? 'غير متاح' : `+${parseFloat(m.mastery_impact_score).toFixed(1)}%`;
|
||||
}
|
||||
} catch (e) {
|
||||
console.error('Load rep data notice:', e);
|
||||
|
||||
Reference in New Issue
Block a user