Reverting r107496, r107497
authorSam Reed <reedy@users.mediawiki.org>
Wed, 28 Dec 2011 15:42:06 +0000 (15:42 +0000)
committerSam Reed <reedy@users.mediawiki.org>
Wed, 28 Dec 2011 15:42:06 +0000 (15:42 +0000)
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
languages/messages/MessagesQqq.php
maintenance/language/messages.inc
resources/Resources.php
resources/mediawiki/mediawiki.feedback.js [new file with mode: 0644]

index 134270a..12ebe7e 100644 (file)
@@ -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',
+
 );
index 5fd1576..b054884 100644 (file)
@@ -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',
+
 );
index 60d86e7..6fa2a6c 100644 (file)
@@ -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 */
index 9b51d66..8edbc24 100644 (file)
@@ -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 (file)
index 0000000..e280a93
--- /dev/null
@@ -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 = $( '<a></a>' )
+                               .attr( { 'href': _this.title.getUrl(), 'target': '_blank' } )
+                               .css( { 'white-space': 'nowrap' } );
+
+                       var $bugNoteLink = $( '<a></a>' ).attr( { 'href': '#' } ).click( function() { _this.displayBugs(); } );
+
+                       var $bugsListLink = $( '<a></a>' ).attr( { 'href': _this.bugsListLink, 'target': '_blank' } );
+
+                       this.$dialog =
+                               $( '<div style="position:relative;"></div>' ).append(
+                                       $( '<div class="feedback-mode feedback-form"></div>' ).append(
+                                               $( '<small></small>' ).append(
+                                                       $( '<p></p>' ).msg(
+                                                               'feedback-bugornote',
+                                                               $bugNoteLink,
+                                                               _this.title.getNameText(),
+                                                               $feedbackPageLink.clone()
+                                                       )
+                                               ),
+                                               $( '<div style="margin-top:1em;"></div>' ).append(
+                                                       mw.msg( 'feedback-subject' ),
+                                                       $( '<br/>' ),
+                                                       $( '<input type="text" class="feedback-subject" name="subject" maxlength="60" style="width:99%;"/>' )
+                                               ),
+                                               $( '<div style="margin-top:0.4em;"></div>' ).append(
+                                                       mw.msg( 'feedback-message' ),
+                                                       $( '<br/>' ),
+                                                       $( '<textarea name="message" class="feedback-message" style="width:99%;" rows="5" cols="60"></textarea>' )
+                                               )
+                                       ),
+                                       $( '<div class="feedback-mode feedback-bugs"></div>' ).append(
+                                               $( '<p>' ).msg( 'feedback-bugcheck', $bugsListLink )
+                                       ),
+                                       $( '<div class="feedback-mode feedback-submitting" style="text-align:center;margin:3em 0;"></div>' ).append(
+                                               mw.msg( 'feedback-adding' ),
+                                               $( '<br/>' ),
+                                               $( '<img src="http://upload.wikimedia.org/wikipedia/commons/4/42/Loading.gif" />' )
+                                       ),
+                                       $( '<div class="feedback-mode feedback-thanks" style="text-align:center;margin:1em"></div>' ).msg(
+                                               'feedback-thanks', _this.title.getNameText(), $feedbackPageLink.clone()
+                                       ),
+                                       $( '<div class="feedback-mode feedback-error" style="position:relative;"></div>' ).append(
+                                               $( '<div class="feedback-error-msg style="color:#990000;margin-top:0.4em;"></div>' )
+                                       )
+                               );
+
+                               // 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 = "<small>User agent: " + navigator.userAgent + "</small>\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 );