Skip to content

window.showNotification אינו מוגדר בשום מקום — שלושה קוראים נופלים אחורה, ואחד מהם לשום מקום #3294

Description

@amirbiron

מה קיים

שלושה מקומות בקוד בודקים אם יש טוסט גלובלי:

קובץ שורה
webapp/static/js/collections.js 124
webapp/templates/dashboard.html 2756
webapp/templates/base.html 4291

כולם בצורה if (typeof window.showNotification === 'function'), עם fallback משלהם.

אף שורה בריפו אינה משימה את window.showNotification. חיפוש אחר השמה (window.showNotification =) מחזיר אפס תוצאות; שלוש התוצאות היחידות הן שלוש הבדיקות עצמן. החוזה מת מלידה, ולכן שלושת ה-fallbacks רצים תמיד.

למה זה משנה

dashboard.html:2754-2769 הוא המקרה החמור:

function showToast(message, type = 'info') {
    if (typeof window.showNotification === 'function') { ... }
    else if (typeof window.Toastify === 'function') { ... }
    else { console.log(`[${type}] ${message}`); }
}

window.Toastify גם הוא אינו קיים בריפו — אין ספריית Toastify מותקנת. כלומר שני התנאים לעולם לא מתקיימים, והפונקציה בפועל היא console.log בלבד. הקוראים שלה הם שמירת ווידג'ט "דורש תשומת לב" (שורות 2578, 2601, 2605) ודחיית תזכורת (2649, 2653). המשתמש לוחץ שמור, השמירה מצליחה או נכשלת, ושום דבר לא מוצג לו.

השניים האחרים פחות חמורים אבל אינם תקינים: הם מציגים טוסט מאולתר עם style.cssText וצבעים קשיחים, שאינו מכיר את ערכות הנושא.

התוצאה הרחבה

מצאתי בריפו 19 מנגנוני טוסט נפרדים, בדרגות שונות של שלמות — חלקם עם CSS חיצוני, חלקם עם <style> מוטבע, חלקם עם style.cssText בלבד, ושניים שמפנים לשמות שלא קיימים ולכן אינם מציגים כלום (json-formatter.js:59, code-tools.js:615). זו התוצאה הישירה של חוזה שכולם כיוונו אליו ואיש לא מימש.

התנגשות נלווית

webapp/static/css/bookmarks.css:342-355 ו-webapp/static/css/multi-select.css:241-320 מגדירים שניהם את .notification, .notification-container ו-#notificationContainer, עם ערכים סותרים לגמרי:

bookmarks.css multi-select.css
מיקום המכל תחתון עליון
רקע טוקני נושא גרדיאנט כהה קשיח
מחלקת סוג .notification-success .notification.success

היום אין עמוד שטוען את שניהם — files.html טוען רק multi-select, view_file.html רק bookmarks. כל טעינה משותפת עתידית שוברת אחד מהם. גם createNotificationContainer בשני הקבצים מחפש את אותו #notificationContainer, כך שהם ישתפו מכל אחד עם CSS של השני.

הצעה

webapp/static/css/toast.css ו-webapp/static/js/toast.js (נוספו ב-#3293) הם רכיב עומד בפני עצמו, ללא תלות בשום קובץ, עם מרחב שמות משלו ובדיקות. הם נטענים כיום רק מ-settings.html.

הצעד המתבקש: להעביר את שני התגים ל-base.html ולהשים window.showNotification = window.ckToast. שלושת הקוראים הקיימים מתחילים לעבוד בלי שינוי אצלם.

זה לא נעשה ב-#3293 בכוונה — הוא היה משנה התנהגות בשלושה עמודים שלא נבדקו באותו PR. ראוי לסבב משלו, עם בדיקה ויזואלית של הדשבורד, האוספים והחלת ערכת נושא.

צריך לשים לב לשני דברים בסבב הזה:

  1. חתימות שונות. bulk-actions.js מקבל options שלישי עם icon ו-duration; ckToast מקבל key ו-duration אבל לא icon (האייקון שם נגזר מהסוג, כמו ב-bookmarks.js). מעבר של bulk-actions.js יאבד את { icon: 'download' } וכדומה.
  2. .notification נשאר של שני הקבצים הישנים. ckToast אינו נוגע בו, ולכן המעבר אינו פותר את ההתנגשות שלמעלה — היא דורשת החלטה נפרדת.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions