add bug reports to feedback
authorNeil Kandalgaonkar <neilk@users.mediawiki.org>
Wed, 14 Dec 2011 01:26:28 +0000 (01:26 +0000)
committerNeil Kandalgaonkar <neilk@users.mediawiki.org>
Wed, 14 Dec 2011 01:26:28 +0000 (01:26 +0000)
languages/messages/MessagesEn.php
maintenance/language/messages.inc
resources/Resources.php
resources/mediawiki/mediawiki.feedback.js

index 058bf71..85df932 100644 (file)
@@ -4630,14 +4630,18 @@ This site is experiencing technical difficulties.',
 'newuserlog-byemail'                  => 'password sent by e-mail',
 
 # Feedback
-'feedback-note'    => 'Your feedback will be posted publicly to the page "[$2 $1]", along with your user name, browser version and operating system.',
+'feedback-note' => 'This form publicly posts a simple comment or suggestion to the page "[$2 $1]", along with your user name, browser version and operating system.',
+'feedback-bugnote' => 'Or, you can [$1 post a technical bug report] instead.',
 '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-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 ef96c38..c1a26c6 100644 (file)
@@ -3500,14 +3500,19 @@ $wgMessageStructure = array(
        ),
        'feedback' => array(
                'feedback-note',
+               'feedback-bugnote',
                'feedback-subject',
-               'feedback-message',
-               'feedback-cancel',
-               'feedback-submit',
-               'feedback-adding',
-               'feedback-error1',
-               'feedback-error2',
-               'feedback-error3',
+               'feedback-message',
+               'feedback-cancel',
+               'feedback-submit',
+               'feedback-adding',
+               'feedback-error1',
+               'feedback-error2',
+               'feedback-error3',
+               'feedback-thanks',
+               'feedback-close',
+               'feedback-bugcheck',
+               'feedback-bugnew',
        ),
 );
 
index 197df98..73a8613 100644 (file)
@@ -539,6 +539,7 @@ return array(
                ),
                'messages' => array( 
                        'feedback-note',
+                       'feedback-bugnote',
                        'feedback-subject',
                        'feedback-message',
                        'feedback-cancel',
@@ -547,6 +548,10 @@ return array(
                        'feedback-error1',
                        'feedback-error2',
                        'feedback-error3',
+                       'feedback-thanks',
+                       'feedback-close',
+                       'feedback-bugcheck',
+                       'feedback-bugnew',
                ),
        ),
        'mediawiki.htmlform' => array(
index 041cd91..258a891 100644 (file)
@@ -19,9 +19,9 @@
  *
  * Not compatible with LiquidThreads.
  * 
- * How to use it:
+ * Minimal example in how to use it:
  * 
- *    var feedback = new mw.Feedback( api, myFeedbackPageTitle );
+ *    var feedback = new mw.Feedback();
  *    $( '#myButton' ).click( function() { feedback.launch(); } ); 
  * 
  * You can also launch the feedback form with a prefilled subject and body. 
@@ -35,6 +35,8 @@
         *              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 ) {
 
                        options.dialogTitleMessageKey = 'feedback-submit';
                }
 
-               this.api = options.api;
-               this.feedbackTitle = options.title;
-               this.dialogTitleMessageKey = options.dialogTitleMessageKey;
+               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();
        };
 
                setup: function() {
                        var _this = this;
 
-                       // Set up buttons for dialog box. We have to do it the hard way since the json keys are localized
-                       _this.buttons = {};
-                       _this.buttons[ mw.msg( 'feedback-cancel' ) ] = function() { _this.cancel(); };
-                       _this.buttons[ mw.msg( 'feedback-submit' ) ] = function() { _this.submit(); };
-                               
-                       var $feedbackPageLink = $j( '<a></a>' ).attr( { 'href': _this.feedbackTitle.getUrl(), 'target': '_blank' } );
+                       
+                       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( 
-                                               $( '<div style="margin-top:0.4em;"></div>' ).append( 
-                                                       $( '<small></small>' ).msg( 'feedback-note', 
-                                                                                   _this.feedbackTitle.getNameText(), 
-                                                                                   $feedbackPageLink ) 
+                                       $( '<div class="feedback-mode feedback-form"></div>' ).append(
+                                               $( '<small></small>' ).append(  
+                                                       $( '<p></p>' ).msg( 
+                                                               'feedback-note', 
+                                                               _this.title.getNameText(), 
+                                                               $feedbackPageLink.clone() 
+                                                       ),
+                                                       $( '<p></p>' ).msg( 'feedback-bugnote', $bugNoteLink )
                                                ),
                                                $( '<div style="margin-top:1em;"></div>' ).append( 
                                                        mw.msg( 'feedback-subject' ), 
                                                        $( '<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>' )
-
                                        )
-                               ).dialog({
+                               );
+
+                               // 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 ),
 
                        this.subjectInput = this.$dialog.find( 'input.feedback-subject' ).get(0);
                        this.messageInput = this.$dialog.find( 'textarea.feedback-message' ).get(0);
-                       this.displayForm();             
+
                },
 
                display: function( s ) {
                        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:
                 *                                              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' ); 
-                       this.$dialog.dialog( { buttons: this.buttons } ); // put the buttons back
+
+                       // 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 ok = function( result ) {
                                if ( result.edit !== undefined ) {
                                        if ( result.edit.result === 'Success' ) {
-                                               _this.$dialog.dialog( 'close' ); // edit complete, close dialog box
+                                               _this.displayThanks();
                                        } else {
                                                _this.displayError( 'feedback-error1' ); // unknown API result
                                        }
                                displayError( 'feedback-error3' ); // ajax request failed
                        };
                
-                       this.api.newSection( this.feedbackTitle, subject, message, ok, err );
+                       this.api.newSection( this.title, subject, message, ok, err );
 
                }, // close submit button function