לדלג לתוכן

שיחת משתמש:1Or/undo.js

תוכן הדף אינו נתמך בשפות אחרות.
הוספת נושא
מתוך ויקיפדיה, האנציקלופדיה החופשית
תגובה אחרונה: לפני 7 שנים מאת 1Or

קיפודנחש, תוכל לקרוא את הסקריפט ולבצע תיקונים? אני רוצה לפרסם אותו בחדשות. בברכה, אורשיחה14:16, 12 בנובמבר 2016 (IST)תגובה

ראיתי כמה בעיות:
  1. שוב, הפונקציה undoEdit נוספת לסקופ הגלובלי. בגדול, רצוי לא להוסיף דברים לסקופ הגלובלי, ואם כבר עושים זאת, צריך לבחור שם יותר ספציפי - עם שם כללי כמו "undoEdit", הסיכוי להתנגשות הוא לא מבוטל.
  2. פעולת הסקריפט תלויה בקיום פרמטר 'diff' - בלעדיו הסקריפט כנראה יעשה שטויות, אבל בשום מקום אינך בודק שיש בכלל פרמטר כזה, כלומר הסעיף בתפריט יתווסף גם את הפרמטר לא קיים בכלל, ולחיצה עליו אולי תעשה משהו ואולי לא, אבל בוודאי לא את מה שהמשתמש מתכוון.
  3. פעולת הסקריפט תלויה בשני מודולים אופציונליים (mediawiki.util ו-mediawiki.api), אבל הסקריפט לא מנסה לטעון אותם או לבדוק אם הם נטענו, והוא עובד אצלך בשיטת "מצליח", בגלל שסקריפטים או גאדג'טים אחרים טענו אותם. אפשר לתקן את כל הבעיות די בקלות, למשל כך:
mw.loader.using( [ 'mediawiki.util', 'mediawiki.api' ] ).then( function() {
function undoEdit() {
	var message = prompt( "תקציר עריכה (לא חובה)", "" );
    if (message !== ''){
    	message = ': ' + message;
    }
    if (message == ': null'){
    	message = '';
    }
	new mw.Api().post ({
		action : 'edit',
		title : mw.config.get('wgPageName'),
		summary : 'ביטול גרסה ' + mw.util.getParamValue('diff') + message,
		undo : mw.util.getParamValue('diff'),
		minor : 1,
		token : mw.user.tokens.values.editToken
	});
}
if ( mw.util.getParamValue('diff') && mw.config.get( 'wgAction' ) === 'view'){
mw.util.addPortletLink('mw-diff-ntitle3', '#', 'ביטול גרסה ' + mw.util.getParamValue('diff')).onclick = undoEdit;}
} );
  1. הקטע
    if (message !== ''){
    	message = ': ' + message;
    }
    if (message == ': null'){
    	message = '';
    }

מופרך. אתה בודק אם התוצאה היא _בדיוק_ מחרוזת ריקה, ואם לא, אתה מדביק נקודתיים, אבל זו לא ההתנהגות שמשתמש סביר מצפה: המשתמש מצפה שלחיצה על "ביטול" תבטל את כל הפעולה, כך שאתה צריך קודם כל לבדוק null, ואם זה המצב לא לעשות כלום (כלומר לוותר על ביטול העריכה). ורק אחר כך להמשיך.

קיפודנחש 18:50, 14 בנובמבר 2016 (IST)תגובה
תודה רבה קיפודנחש! החלק של הnull בכוונה ככה, אין בכוונתי לאפשר לבטל, אלא בעצם "לבטל" מבעוד מועד את התקציר הלא אוטומטי. תודה על ההתייחסות ועל הפתרון! בברכה, אורשיחה19:15, 14 בנובמבר 2016 (IST)תגובה

זה שזה בכוונה לא עושה את זה נכון. כשמשתמש לוחץ על ביטול, ואתה מבצע את הפעולה בכל זאת, אתה יוצר הפתעה מאד לא נעימה. זה מה שקוראים שירות דוב. ( אפרופו, אם זה היה הדבר הנכון, אז הקוד גרוע: במקום לבדוק אם התוצאה היא מחרוזת ריקה, אפשר פשוט לשאול על התוצאה. בjs, מחרוזת ריקה ו null מתנהגים אותו דבר כשמתייחסים אליהם כ boolean.) כאמור, זו התנהגות מפתיעה ורעה מבחינת ממשק משתמש. קיפודנחש 20:45, 14 בנובמבר 2016 (IST)תגובה

אז איך מבטלים כשלוחצים ביטול? אורשיחה20:46, 14 בנובמבר 2016 (IST)תגובה

פשוט תעשה return מהפונקציה אם הקריאה לprompt מחזירה null. קיפודנחש 20:50, 14 בנובמבר 2016 (IST)תגובה

בוצע בוצע תודה! אורשיחה20:54, 14 בנובמבר 2016 (IST)תגובה
לא ממש. זה משונה להדביק ל-null נקודתיים, ואז לבדוק אם התוצאה היא המחרוזת ": null". הדבר הטבעי הוא לבדוק את הערך המוחזר עצמו:
    if (message == null) 
        return;
    if ($.trim(message)) 
    	message = ': ' + message;
אבל זו לא הנקודה. ראיתי שהתחלת לבדוק את הפרמטר diff, ואם הוא prev או next, אתה לא עושה כלום (אם כי בצורה משונה), אבל אתה מתעלם מהמקרה הנפוץ, בו הפרמטר בכלל לא קיים, והסקריפט שלך יעשה שטויות. קיפודנחש 02:26, 15 בנובמבר 2016 (IST)תגובה
הקטע של הnull בוצע, החלק של הdiff: אני לא יודע מה לעשות כאשר יש next או prev, כי אני צריך את המספר של הdiff וזה רושם לי prev או next במקום. לא יצא לי לראות מקרה בו הפרמטר לא קיים בכלל בדפי השוואה בין גרסאות. תוכל לתת דוגמה? תודה רבה! בברכה, אורשיחה05:36, 15 בנובמבר 2016 (IST)תגובה

הסקריפט שלך לא מוגבל לדפי השוואת גרסאות. הגבלה כזו היא בדיוק מה שחסר. קיפודנחש 15:28, 15 בנובמבר 2016 (IST)תגובה

אז מה השורה
mw.config.get( 'wgAction' ) === 'view')

עושה? בברכה, אורשיחה15:47, 15 בנובמבר 2016 (IST)תגובה

לא מה שאתה חושב. כשאתה קורא דף כלשהו (לא עורך ולא תצוגה מקדימה - פשוט קורא), התנאי הזה מחזיר ערך אמת. גם בדפי השוואת גרסאות, אבל בהחלט לא רק. הסקריפט מייצר את הסעיף בתפריט בכל דף. נכון שאתה מדביק את השורה "ביטול גרסה XXX" לאלמנט שקיים רק בדפי השוואת גרסאות ("mw-diff-ntitle3"), ולכן נראה כאילו הסקריפט לא עושה כלום בדפים אחרים, אבל הסקריפט _מייצר_ את כל זה בכל דף. (על הדרך: המנהג להדביק addPortletLink לאלמנטים כלשהם הוא לא נאה ויכול להפסיק לעבוד. הפונקציה הזו מיועדת לשימוש עם אלמנטים שמדיה ויקי קוראת להם "portlet", כמו ca-view או p-cactions, לא לאלמנט כלשהו בדף). יש עוד כמה בעיות קטנות: למשל הדרך למצוא את ה-token שגויה: ראה למשל עריכה זו (krinkle הוא אחד ממפתחי מדיה ויקי). ולסיכום, זה נחמד בתור שעשוע ולימוד, אבל בתור סקריפט שימושי זה נראה מיותר - בהיסטוריית הגרסאות ובדף השוואת גרסאות יש כפתור "ביטול", שעדיף על הסקריפט הזה. קיפודנחש 18:17, 15 בנובמבר 2016 (IST)תגובה
זה שהוא מייצר את זה בכל דף זה טוב או רע? אני כותב addPortletLink כי אני לא יודע איך לעשות את זה באופן אחר. החלק של הtoken טופל, תודה. למה מיותר? זה חוסך זמן ומשתמש בAPI כך שלא צריך לעבור דף, גם התקציר לדעתי טוב יותר. בברכה, אורשיחה18:34, 15 בנובמבר 2016 (IST)תגובה