diff options
Diffstat (limited to 'www/wiki/extensions/UploadWizard/resources/ui/steps/uw.ui.Details.js')
-rw-r--r-- | www/wiki/extensions/UploadWizard/resources/ui/steps/uw.ui.Details.js | 252 |
1 files changed, 252 insertions, 0 deletions
diff --git a/www/wiki/extensions/UploadWizard/resources/ui/steps/uw.ui.Details.js b/www/wiki/extensions/UploadWizard/resources/ui/steps/uw.ui.Details.js new file mode 100644 index 00000000..0f27b24e --- /dev/null +++ b/www/wiki/extensions/UploadWizard/resources/ui/steps/uw.ui.Details.js @@ -0,0 +1,252 @@ +/* + * This file is part of the MediaWiki extension UploadWizard. + * + * UploadWizard is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * UploadWizard is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with UploadWizard. If not, see <http://www.gnu.org/licenses/>. + */ + +( function ( mw, $, uw, OO ) { + /** + * Represents the UI for the wizard's Details step. + * + * @class uw.ui.Details + * @extends uw.ui.Step + * @constructor + */ + uw.ui.Details = function UWUIDetails() { + var details = this; + + function startDetails() { + details.emit( 'start-details' ); + } + + uw.ui.Step.call( + this, + 'details' + ); + + this.$errorCount = $( '<div>' ) + .attr( 'id', 'mwe-upwiz-details-error-count' ); + this.$warningCount = $( '<div>' ) + .attr( 'id', 'mwe-upwiz-details-warning-count' ); + + this.nextButton = new OO.ui.ButtonWidget( { + label: mw.message( 'mwe-upwiz-next-details' ).text(), + flags: [ 'progressive', 'primary' ] + } ).on( 'click', startDetails ); + + this.nextButtonDespiteFailures = new OO.ui.ButtonWidget( { + label: mw.message( 'mwe-upwiz-next-file-despite-failures' ).text(), + flags: [ 'progressive' ] + } ).on( 'click', function () { + details.emit( 'finalize-details-after-removal' ); + } ); + + this.retryButtonSomeFailed = new OO.ui.ButtonWidget( { + label: mw.message( 'mwe-upwiz-file-retry' ).text(), + flags: [ 'progressive', 'primary' ] + } ).on( 'click', startDetails ); + + this.retryButtonAllFailed = new OO.ui.ButtonWidget( { + label: mw.message( 'mwe-upwiz-file-retry' ).text(), + flags: [ 'progressive', 'primary' ] + } ).on( 'click', startDetails ); + + this.$buttons.append( this.$errorCount, this.$warningCount ); + this.addPreviousButton(); + this.addNextButton(); + }; + + OO.inheritClass( uw.ui.Details, uw.ui.Step ); + + uw.ui.Details.prototype.load = function ( uploads ) { + uw.ui.Step.prototype.load.call( this, uploads ); + + if ( uploads.filter( this.needsPatentAgreement.bind( this ) ).length > 0 ) { + this.$div.prepend( + $( '<div>' ) + .addClass( 'mwe-upwiz-patent-weapon-policy ui-corner-all' ) + .append( + $( '<p>' ).append( mw.msg( 'mwe-upwiz-patent-weapon-policy' ) ), + $( '<p>' ).append( + $( '<a>' ) + .text( mw.msg( 'mwe-upwiz-patent-weapon-policy-link' ) ) + .attr( { target: '_blank', href: mw.UploadWizard.config.patents.url.weapons } ) + ) + ) + ); + } + + this.$div.prepend( + $( '<div>' ) + .attr( 'id', 'mwe-upwiz-macro-files' ) + .addClass( 'mwe-upwiz-filled-filelist ui-corner-all' ) + ); + + // set default buttons visibility (can be altered in controller later) + this.$div.find( '.mwe-upwiz-file-next-some-failed' ).hide(); + this.$div.find( '.mwe-upwiz-file-next-all-failed' ).hide(); + this.$div.find( '.mwe-upwiz-file-next-all-ok' ).show(); + }; + + uw.ui.Details.prototype.addNextButton = function () { + var ui = this; + + this.nextButtonPromise.done( function () { + ui.$buttons.append( + $( '<div>' ) + .addClass( 'mwe-upwiz-file-next-all-ok mwe-upwiz-file-endchoice' ) + .append( ui.nextButton.$element ) + ); + + ui.$buttons.append( + $( '<div>' ) + .addClass( 'mwe-upwiz-file-next-some-failed mwe-upwiz-file-endchoice' ) + .append( + new OO.ui.HorizontalLayout( { + items: [ + new OO.ui.LabelWidget( { + label: mw.message( 'mwe-upwiz-file-some-failed' ).text() + } ), + ui.nextButtonDespiteFailures, + ui.retryButtonSomeFailed + ] + } ).$element + ) + ); + + ui.$buttons.append( + $( '<div>' ) + .addClass( 'mwe-upwiz-file-next-all-failed mwe-upwiz-file-endchoice' ) + .append( + new OO.ui.HorizontalLayout( { + items: [ + new OO.ui.LabelWidget( { + label: mw.message( 'mwe-upwiz-file-all-failed' ).text() + } ), + ui.retryButtonAllFailed + ] + } ).$element + ) + ); + } ); + }; + + /** + * Hide buttons for moving to the next step. + */ + uw.ui.Details.prototype.hideEndButtons = function () { + this.$errorCount.empty(); + this.$warningCount.empty(); + this.$div + .find( '.mwe-upwiz-buttons .mwe-upwiz-file-endchoice' ) + .hide(); + }; + + /** + * Disable edits to the details. + */ + uw.ui.Details.prototype.disableEdits = function () { + this.$div + .find( '.mwe-upwiz-data' ) + .morphCrossfade( '.mwe-upwiz-submitting' ); + + this.previousButton.$element.hide(); + this.$div.find( '.mwe-upwiz-patent-weapon-policy' ).hide(); + }; + + /** + * Re-enabled edits to the details. + */ + uw.ui.Details.prototype.enableEdits = function () { + this.previousButton.$element.show(); + this.$div.find( '.mwe-upwiz-patent-weapon-policy' ).show(); + }; + + /** + * Show errors in the form. + * The details page can be vertically long so sometimes it is not obvious there are errors above. This counts them and puts the count + * right next to the submit button, so it should be obvious to the user they need to fix things. + * This is a bit of a hack. We should already know how many errors there are, and where. + * This method also opens up "more info" if the form has errors. + */ + uw.ui.Details.prototype.showErrors = function () { + var $errorElements = this.$div + // TODO Evil + .find( '.oo-ui-fieldLayout-messages-error' ), + errorCount = $errorElements.length; + + // Open "more info" if that part of the form has errors + $errorElements.each( function () { + var $collapsibleWrapper = $( this ).closest( '.mwe-more-details' ); + if ( $collapsibleWrapper.length ) { + $collapsibleWrapper.data( 'mw-collapsible' ).expand(); + } + } ); + + if ( errorCount > 0 ) { + // Errors supersede warnings, so stop any animating to the warnings before we animate to the errors + $( 'html, body' ).stop(); + + this.$errorCount + .msg( 'mwe-upwiz-details-error-count', errorCount, this.uploads.length ) + // TODO The IconWidget and 'warning' flag is specific to MediaWiki theme, looks weird in Apex + .prepend( new OO.ui.IconWidget( { icon: 'alert', flags: [ 'warning' ] } ).$element, ' ' ); + // Scroll to the first error + $( 'html, body' ).animate( { scrollTop: $( $errorElements[ 0 ] ).offset().top - 50 }, 'slow' ); + } else { + this.$errorCount.empty(); + } + }; + + /** + * Show warnings in the form. + * See #showErrors for details. + */ + uw.ui.Details.prototype.showWarnings = function () { + var $warningElements = this.$div + // TODO Evil + .find( '.oo-ui-fieldLayout-messages-notice' ), + warningCount = $warningElements.length; + + // Open "more info" if that part of the form has warnings + $warningElements.each( function () { + var $collapsibleWrapper = $( this ).closest( '.mwe-more-details' ); + if ( $collapsibleWrapper.length ) { + $collapsibleWrapper.data( 'mw-collapsible' ).expand(); + } + } ); + + if ( warningCount > 0 ) { + this.$warningCount + .msg( 'mwe-upwiz-details-warning-count', warningCount, this.uploads.length ) + // TODO The IconWidget is specific to MediaWiki theme, looks weird in Apex + .prepend( new OO.ui.IconWidget( { icon: 'info' } ).$element, ' ' ); + // Scroll to the first warning + $( 'html, body' ).animate( { scrollTop: $( $warningElements[ 0 ] ).offset().top - 50 }, 'slow' ); + } else { + this.$warningCount.empty(); + } + }; + + /** + * @param {mw.UploadWizardUpload} upload + * @return {boolean} + */ + uw.ui.Details.prototype.needsPatentAgreement = function ( upload ) { + var extensions = mw.UploadWizard.config.patents.extensions; + + return $.inArray( upload.title.getExtension().toLowerCase(), extensions ) >= 0; + }; + +}( mediaWiki, jQuery, mediaWiki.uploadWizard, OO ) ); |