מה קיים
שלושה מקומות בקוד בודקים אם יש טוסט גלובלי:
| קובץ |
שורה |
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. ראוי לסבב משלו, עם בדיקה ויזואלית של הדשבורד, האוספים והחלת ערכת נושא.
צריך לשים לב לשני דברים בסבב הזה:
- חתימות שונות.
bulk-actions.js מקבל options שלישי עם icon ו-duration; ckToast מקבל key ו-duration אבל לא icon (האייקון שם נגזר מהסוג, כמו ב-bookmarks.js). מעבר של bulk-actions.js יאבד את { icon: 'download' } וכדומה.
.notification נשאר של שני הקבצים הישנים. ckToast אינו נוגע בו, ולכן המעבר אינו פותר את ההתנגשות שלמעלה — היא דורשת החלטה נפרדת.
מה קיים
שלושה מקומות בקוד בודקים אם יש טוסט גלובלי:
webapp/static/js/collections.jswebapp/templates/dashboard.htmlwebapp/templates/base.htmlכולם בצורה
if (typeof window.showNotification === 'function'), עם fallback משלהם.אף שורה בריפו אינה משימה את
window.showNotification. חיפוש אחר השמה (window.showNotification =) מחזיר אפס תוצאות; שלוש התוצאות היחידות הן שלוש הבדיקות עצמן. החוזה מת מלידה, ולכן שלושת ה-fallbacks רצים תמיד.למה זה משנה
dashboard.html:2754-2769הוא המקרה החמור: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.cssmulti-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. ראוי לסבב משלו, עם בדיקה ויזואלית של הדשבורד, האוספים והחלת ערכת נושא.
צריך לשים לב לשני דברים בסבב הזה:
bulk-actions.jsמקבלoptionsשלישי עםiconו-duration;ckToastמקבלkeyו-durationאבל לאicon(האייקון שם נגזר מהסוג, כמו ב-bookmarks.js). מעבר שלbulk-actions.jsיאבד את{ icon: 'download' }וכדומה..notificationנשאר של שני הקבצים הישנים.ckToastאינו נוגע בו, ולכן המעבר אינו פותר את ההתנגשות שלמעלה — היא דורשת החלטה נפרדת.