From 2c83ec33e432defdeb0fc06bf71c649f789b233b Mon Sep 17 00:00:00 2001 From: Sam Reed Date: Wed, 28 Dec 2011 15:42:06 +0000 Subject: [PATCH] Reverting r107496, r107497 Seems there is reasonable reason for it to be in core, and it will be becoming more used in the near future --- languages/messages/MessagesEn.php | 17 ++ languages/messages/MessagesQqq.php | 19 ++ maintenance/language/messages.inc | 15 ++ resources/Resources.php | 24 +++ resources/mediawiki/mediawiki.feedback.js | 242 ++++++++++++++++++++++ 5 files changed, 317 insertions(+) create mode 100644 resources/mediawiki/mediawiki.feedback.js diff --git a/languages/messages/MessagesEn.php b/languages/messages/MessagesEn.php index 134270afc7..12ebe7e56a 100644 --- a/languages/messages/MessagesEn.php +++ b/languages/messages/MessagesEn.php @@ -4660,4 +4660,21 @@ This site is experiencing technical difficulties.', 'logentry-newusers-create2' => '$1 {{GENDER:$2|created}} {{GENDER:$4|a user account}} $3', 'logentry-newusers-autocreate' => 'Account $1 was {{GENDER:$2|created}} automatically', 'newuserlog-byemail' => 'password sent by e-mail', + +# Feedback +'feedback-bugornote' => 'If you are ready to describe a technical problem in detail please [$1 report a bug]. +Otherwise, you can use the easy form below. Your comment will be added to the page "[$3 $2]", along with your username and what browser you are using.', +'feedback-subject' => 'Subject:', +'feedback-message' => 'Message:', +'feedback-cancel' => 'Cancel', +'feedback-submit' => 'Submit Feedback', +'feedback-adding' => 'Adding feedback to page...', +'feedback-error1' => 'Error: Unrecognized result from API', +'feedback-error2' => 'Error: Edit failed', +'feedback-error3' => 'Error: No response from API', +'feedback-thanks' => 'Thanks! Your feedback has been posted to the page "[$2 $1]".', +'feedback-close' => 'Done', +'feedback-bugcheck' => 'Great! Just check that it is not already one of the [$1 known bugs].', +'feedback-bugnew' => 'I checked. Report a new bug', + ); diff --git a/languages/messages/MessagesQqq.php b/languages/messages/MessagesQqq.php index 5fd15765bc..b054884455 100644 --- a/languages/messages/MessagesQqq.php +++ b/languages/messages/MessagesQqq.php @@ -4489,4 +4489,23 @@ Parameter $4, the target page, is also not visible to parser functions.', $4 is the gender of the target user.', +# Feedback +'feedback-bugornote' => 'When feedback dialog box is opened, this introductory message in small print explains the options to report a bug or add simple feedback. We expect that people in a hurry will not read this.', +'feedback-subject' => 'Label for a text input +{{Identical|Subject}}', +'feedback-message' => 'Label for a textarea; signature referrs to a Wikitext signature.', +'feedback-cancel' => 'Button label +{{Identical|Cancel}}', +'feedback-submit' => 'Button label +{{Identical|Submit}}', +'feedback-adding' => 'Progress notice', +'feedback-error1' => 'Error message, appears when an unknown error occurs submitting feedback', +'feedback-error2' => 'Error message, appears when we could not add feedback', +'feedback-error3' => 'Error message, appears when we lose our connection to the wiki', +'feedback-thanks' => 'Thanks message, appears if feedback was successful', +'feedback-close' => 'Button label +{{Identical|Done}}', +'feedback-bugcheck' => 'Message that appears before the user submits a bug, reminding them to check for known bugs.', +'feedback-bugnew' => 'Button label - asserts that the user has checked for existing bugs. When clicked will launch a bugzilla form to add a new bug in a new tab or window', + ); diff --git a/maintenance/language/messages.inc b/maintenance/language/messages.inc index 60d86e73de..6fa2a6c867 100644 --- a/maintenance/language/messages.inc +++ b/maintenance/language/messages.inc @@ -3531,6 +3531,21 @@ $wgMessageStructure = array( 'logentry-newusers-autocreate', 'newuserlog-byemail', ), + 'feedback' => array( + 'feedback-bugornote', + 'feedback-subject', + 'feedback-message', + 'feedback-cancel', + 'feedback-submit', + 'feedback-adding', + 'feedback-error1', + 'feedback-error2', + 'feedback-error3', + 'feedback-thanks', + 'feedback-close', + 'feedback-bugcheck', + 'feedback-bugnew', + ), ); /** Comments for each block */ diff --git a/resources/Resources.php b/resources/Resources.php index 9b51d662e7..8edbc24b64 100644 --- a/resources/Resources.php +++ b/resources/Resources.php @@ -534,6 +534,30 @@ return array( 'scripts' => 'resources/mediawiki/mediawiki.debug.js', 'styles' => 'resources/mediawiki/mediawiki.debug.css', ), + 'mediawiki.feedback' => array( + 'scripts' => 'resources/mediawiki/mediawiki.feedback.js', + 'dependencies' => array( + 'mediawiki.api.edit', + 'mediawiki.Title', + 'mediawiki.jqueryMsg', + 'jquery.ui.dialog', + ), + 'messages' => array( + 'feedback-bugornote', + 'feedback-subject', + 'feedback-message', + 'feedback-cancel', + 'feedback-submit', + 'feedback-adding', + 'feedback-error1', + 'feedback-error2', + 'feedback-error3', + 'feedback-thanks', + 'feedback-close', + 'feedback-bugcheck', + 'feedback-bugnew', + ), + ), 'mediawiki.htmlform' => array( 'scripts' => 'resources/mediawiki/mediawiki.htmlform.js', ), diff --git a/resources/mediawiki/mediawiki.feedback.js b/resources/mediawiki/mediawiki.feedback.js new file mode 100644 index 0000000000..e280a93622 --- /dev/null +++ b/resources/mediawiki/mediawiki.feedback.js @@ -0,0 +1,242 @@ +/** + * mediawiki.Feedback + * + * @author Ryan Kaldari, 2010 + * @author Neil Kandalgaonkar, 2010-11 + * @since 1.19 + * + * This is a way of getting simple feedback from users. It's useful + * for testing new features -- users can give you feedback without + * the difficulty of opening a whole new talk page. For this reason, + * it also tends to collect a wider range of both positive and negative + * comments. However you do need to tend to the feedback page. It will + * get long relatively quickly, and you often get multiple messages + * reporting the same issue. + * + * It takes the form of thing on your page which, when clicked, opens a small + * dialog box. Submitting that dialog box appends its contents to a + * wiki page that you specify, as a new section. + * + * Not compatible with LiquidThreads. + * + * Minimal example in how to use it: + * + * var feedback = new mw.Feedback(); + * $( '#myButton' ).click( function() { feedback.launch(); } ); + * + * You can also launch the feedback form with a prefilled subject and body. + * See the docs for the launch() method. + */ +( function( mw, $, undefined ) { + /** + * Thingy for collecting user feedback on a wiki page + * @param {Array} options -- optional, all properties optional. + * api: {mw.Api} if omitted, will just create a standard API + * title: {mw.Title} the title of the page where you collect feedback. Defaults to "Feedback". + * dialogTitleMessageKey: {String} message key for the title of the dialog box + * bugsLink: {mw.Uri|String} url where bugs can be posted + * bugsListLink: {mw.Uri|String} url where bugs can be listed + */ + mw.Feedback = function( options ) { + if ( options === undefined ) { + options = {}; + } + + if ( options.api === undefined ) { + options.api = new mw.Api(); + } + + if ( options.title === undefined ) { + options.title = new mw.Title( 'Feedback' ); + } + + if ( options.dialogTitleMessageKey === undefined ) { + options.dialogTitleMessageKey = 'feedback-submit'; + } + + if ( options.bugsLink === undefined ) { + options.bugsLink = '//bugzilla.wikimedia.org/enter_bug.cgi'; + } + + if ( options.bugsListLink === undefined ) { + options.bugsListLink = '//bugzilla.wikimedia.org/query.cgi'; + } + + $.extend( this, options ); + this.setup(); + }; + + mw.Feedback.prototype = { + setup: function() { + var _this = this; + + var $feedbackPageLink = $( '' ) + .attr( { 'href': _this.title.getUrl(), 'target': '_blank' } ) + .css( { 'white-space': 'nowrap' } ); + + var $bugNoteLink = $( '' ).attr( { 'href': '#' } ).click( function() { _this.displayBugs(); } ); + + var $bugsListLink = $( '' ).attr( { 'href': _this.bugsListLink, 'target': '_blank' } ); + + this.$dialog = + $( '
' ).append( + $( '
' ).append( + $( '' ).append( + $( '

' ).msg( + 'feedback-bugornote', + $bugNoteLink, + _this.title.getNameText(), + $feedbackPageLink.clone() + ) + ), + $( '
' ).append( + mw.msg( 'feedback-subject' ), + $( '
' ), + $( '' ) + ), + $( '
' ).append( + mw.msg( 'feedback-message' ), + $( '
' ), + $( '' ) + ) + ), + $( '
' ).append( + $( '

' ).msg( 'feedback-bugcheck', $bugsListLink ) + ), + $( '

' ).append( + mw.msg( 'feedback-adding' ), + $( '
' ), + $( '' ) + ), + $( '
' ).msg( + 'feedback-thanks', _this.title.getNameText(), $feedbackPageLink.clone() + ), + $( '
' ).append( + $( '
' ) + ) + ); + + // undo some damage from dialog css + this.$dialog.find( 'a' ).css( { 'color': '#0645ad' } ); + + this.$dialog.dialog({ + width: 500, + autoOpen: false, + title: mw.msg( this.dialogTitleMessageKey ), + modal: true, + buttons: _this.buttons + }); + + this.subjectInput = this.$dialog.find( 'input.feedback-subject' ).get(0); + this.messageInput = this.$dialog.find( 'textarea.feedback-message' ).get(0); + + }, + + display: function( s ) { + this.$dialog.dialog( { buttons:{} } ); // hide the buttons + this.$dialog.find( '.feedback-mode' ).hide(); // hide everything + this.$dialog.find( '.feedback-' + s ).show(); // show the desired div + }, + + displaySubmitting: function() { + this.display( 'submitting' ); + }, + + displayBugs: function() { + var _this = this; + this.display( 'bugs' ); + var bugsButtons = {}; + bugsButtons[ mw.msg( 'feedback-bugnew' ) ] = function() { window.open( _this.bugsLink, '_blank' ); }; + bugsButtons[ mw.msg( 'feedback-cancel' ) ] = function() { _this.cancel(); }; + this.$dialog.dialog( { buttons: bugsButtons } ); + }, + + displayThanks: function() { + var _this = this; + this.display( 'thanks' ); + var closeButton = {}; + closeButton[ mw.msg( 'feedback-close' ) ] = function() { _this.$dialog.dialog( 'close' ); }; + this.$dialog.dialog( { buttons: closeButton } ); + }, + + /** + * Display the feedback form + * @param {Object} optional prefilled contents for the feedback form. Object with properties: + * subject: {String} + * message: {String} + */ + displayForm: function( contents ) { + var _this = this; + this.subjectInput.value = (contents && contents.subject) ? contents.subject : ''; + this.messageInput.value = (contents && contents.message) ? contents.message : ''; + + this.display( 'form' ); + + // Set up buttons for dialog box. We have to do it the hard way since the json keys are localized + var formButtons = {}; + formButtons[ mw.msg( 'feedback-submit' ) ] = function() { _this.submit(); }; + formButtons[ mw.msg( 'feedback-cancel' ) ] = function() { _this.cancel(); }; + this.$dialog.dialog( { buttons: formButtons } ); // put the buttons back + }, + + displayError: function( message ) { + var _this = this; + this.display( 'error' ); + this.$dialog.find( '.feedback-error-msg' ).msg( message ); + var closeButton = {}; + closeButton[ mw.msg( 'feedback-close' ) ] = function() { _this.$dialog.dialog( 'close' ); }; + this.$dialog.dialog( { buttons: closeButton } ); + }, + + cancel: function() { + this.$dialog.dialog( 'close' ); + }, + + submit: function() { + var _this = this; + + // get the values to submit + var subject = this.subjectInput.value; + + var message = "User agent: " + navigator.userAgent + "\n\n" + + this.messageInput.value; + if ( message.indexOf( '~~~' ) == -1 ) { + message += " ~~~~"; + } + + this.displaySubmitting(); + + var ok = function( result ) { + if ( result.edit !== undefined ) { + if ( result.edit.result === 'Success' ) { + _this.displayThanks(); + } else { + _this.displayError( 'feedback-error1' ); // unknown API result + } + } else { + _this.displayError( 'feedback-error2' ); // edit failed + } + }; + + var err = function( code, info ) { + _this.displayError( 'feedback-error3' ); // ajax request failed + }; + + this.api.newSection( this.title, subject, message, ok, err ); + }, // close submit button function + + /** + * Modify the display form, and then open it, focusing interface on the subject. + * @param {Object} optional prefilled contents for the feedback form. Object with properties: + * subject: {String} + * message: {String} + */ + launch: function( contents ) { + this.displayForm( contents ); + this.$dialog.dialog( 'open' ); + this.subjectInput.focus(); + } + + }; + +} )( window.mediaWiki, jQuery ); -- 2.20.1