404 Not Found

404 Not Found


nginx

مشروع التخرج: تطبيق المهام

تهانينا على الوصول إلى الدرس الأخير! خلال الدروس الـ 27 السابقة تعلمت المتغيرات، الدوال، المصفوفات، DOM، الأحداث، JSON، البرمجة غير المتزامنة، الفئات، والمزيد. الآن حان الوقت لجمع كل شيء معاً وبناء تطبيق صغير كامل. هذا المشروع سيكون تتويجاً لكل ما تعلمته.


نظرة عامة على المشروع

سنبني تطبيق مهام (Todo App) — قد يبدو بسيطاً، لكنه يلامس幾乎 كل مفهوم درسته. عندما تنتهي، سيكون لديك أداة إنتاجية حقيقية قابلة للاستخدام.


متطلبات الميزات

  1. إضافة عناصر مهام — حقل إدخال + زر؛ الضغط على Enter أو النقر يُضيف عنصراً جديداً
  2. تبديل مكتمل/غير مكتمل — انقر على مهمة لتبديل حالتها (تأثير الشطب)
  3. حذف عناصر مهام — كل عنصر لديه زر حذف بجانبه
  4. التصفية — ثلاثة أزرار: الكل / النشط / المكتمل
  5. التخزين المحلي — استخدم localStorage لحفظ البيانات عبر تحديثات الصفحة
  6. عدد العناصر المتبقية — اعرض "X عناصر متبقية" في الأسفل

المتطلبات التقنية

المفهوم أين يُستخدم
الفئة فئة TodoApp تنظم كل المنطق
async/await لف قراءة/كتابة localStorage كدوال غير متزامنة
التلاعب بـ DOM إنشاء عناصر القائمة ديناميكياً، تحديث المحتوى، إزالة العناصر
معالجة الأحداث نموذج submit، قائمة click، زر التصفية click
JSON JSON.stringify للحفظ، JSON.parse للتحميل
طرق المصفوفات filter، map، find لإدارة بيانات المهام
النصوص القالبية بناء سلاسل HTML

معايير القبول


أفكار تنفيذ مرجعية

أدناه تلميحات واتجاهات — وليس كوداً كاملاً. كتابته بنفسك هو حيث يحدث التعلم الحقيقي.

هيكل البيانات

HTML
<script>
// كل عنصر مهمة هو كائن
const todo = {
  id: Date.now(),      // معرّف فريد
  text: 'تعلم JavaScript',
  completed: false
};
console.log(todo);

// جميع عناصر المهام تُخزن في مصفوفة
let todos = [];
</script>

هيكل الفئة

HTML
<script>
class TodoApp {
  constructor() {
    this.todos = [];         // البيانات
    this.filter = 'all';     // التصفية الحالية
    this.init();             // التهيئة
  }

  async init() {
    // 1. تحميل البيانات من localStorage
    // 2. ربط الأحداث
    // 3. عرض القائمة
  }

  async save() {
    // JSON.stringify → localStorage.setItem
  }

  async load() {
    // localStorage.getItem → JSON.parse
  }

  addTodo(text) { /* إنشاء كائن، دفع، حفظ، عرض */ }
  toggleTodo(id) { /* العثور على العنصر، قلب completed، حفظ، عرض */ }
  deleteTodo(id) { /* تصفية العنصر، حفظ، عرض */ }

  render() {
    // 1. تصفية المهام بناءً على this.filter
    // 2. مسح حاوية القائمة
    // 3. المرور على المصفوفة المصفاة، إنشاء عقد DOM
    // 4. تحديث عرض العدد
  }
}
</script>

استراتيجية ربط الأحداث

استراتيجية العرض

HTML
<script>
render() {
  const filtered = this.todos.filter(function(todo) {
    if (this.filter === 'active') return !todo.completed;
    if (this.filter === 'completed') return todo.completed;
    return true;  // 'all'
  }.bind(this));

  // مسح الحاوية
  this.listEl.innerHTML = '';

  filtered.forEach(function(todo) {
    var li = document.createElement('li');
    // تعيين المحتوى، الأنماط، سمات البيانات
    // ربط أحداث التبديل والحذف
    this.listEl.appendChild(li);
  }.bind(this));

  // تحديث العدد
  var activeCount = this.todos.filter(function(t) { return !t.completed; }).length;
  this.countEl.textContent = activeCount + ' عنصر متبقي';
}
</script>

أفكار توسعة

بمجرد عمل الميزات الأساسية، جرب هذه التحديات المتقدمة:


الواجب

أكمل تطبيق المهام أعلاه بجميع الميزات، واجتاز جميع معايير القبول.

خطوات مقترحة:

  1. ابدأ بهيكل HTML ونمط CSS
  2. ابنِ هياكل فئة TodoApp (constructor، init)
  3. نفّذ addTodo و render — اجعل الإضافة تعمل أولاً
  4. نفّذ toggleTodo — تبديل مكتمل/غير مكتمل
  5. نفّذ deleteTodo — إزالة العناصر
  6. نفّذ التصفية
  7. نفّذ save و load — حفظ البيانات
  8. اعرض عدد العناصر المتبقية
  9. اللمسات الأخيرة: التحقق من الإدخال الفارغ، تعديلات الأنماط
💡 لا تحاول بناء كل شيء دفعة واحدة. اجعل أصغر شيء يعمل أولاً، ثم أضف قطعة واحدة في كل مرة. تطوير البرمجيات هو "اجعله يعمل، اجعله صحيحاً، اجعله سريعاً."


📝 تمارين

  1. أساسي: أكمل ميزات المهام الأساسية — إضافة، تبديل مكتمل، حذف — باستخدام مصفوفة للتخزين (بدون حاجة لـ localStorage).
  2. متوسط: أضف localStorage للحفظ والتصفية (الكل / النشط / المكتمل) للنسخة الأساسية؛ البيانات يجب أن تبقى بعد تحديث الصفحة.
  3. تحدي: نفّذ ميزة توسعة واحدة على الأقل (السحب والإفلات للتحرير، التحرير، علامات التصنيف، تبديل السمة، أو تذكيرات تاريخ الاستحقاق)، واكتب شريحاً مختصراً لنهجك.
100%