wikimedia/mediawiki-extensions-UploadWizard

View on GitHub
resources/details/uw.CategoriesDetailsWidget.js

Summary

Maintainability
B
4 hrs
Test Coverage
( function ( uw ) {

    var NS_CATEGORY = mw.config.get( 'wgNamespaceIds' ).category;

    /**
     * A categories field in UploadWizard's "Details" step form.
     *
     * @param config
     * @extends uw.DetailsWidget
     */
    uw.CategoriesDetailsWidget = function UWCategoriesDetailsWidget( config ) {
        var categories, catDetails = this;

        uw.CategoriesDetailsWidget.super.call( this );

        this.categoriesWidget = new mw.widgets.CategoryMultiselectWidget( config );

        this.categoriesWidget.createTagItemWidget = function ( data ) {
            var widget = this.constructor.prototype.createTagItemWidget.call( this, data );
            if ( !widget ) {
                return null;
            }
            widget.setMissing = function ( missing ) {
                this.constructor.prototype.setMissing.call( this, missing );
                // Aggregate 'change' event
                catDetails.emit( 'change' );
            };
            return widget;
        };

        categories = ( mw.UploadWizard.config.defaults.categories || [] ).filter( ( cat ) =>
            // Keep only valid titles
             !!mw.Title.makeTitle( NS_CATEGORY, cat )
         );
        this.categoriesWidget.setValue( categories );

        this.$element.addClass( 'mwe-upwiz-categoriesDetailsWidget' );
        this.$element.append( this.categoriesWidget.$element );

        // Aggregate 'change' event
        this.categoriesWidget.connect( this, { change: [ 'emit', 'change' ] } );
    };
    OO.inheritClass( uw.CategoriesDetailsWidget, uw.DetailsWidget );

    /**
     * @inheritdoc
     */
    uw.CategoriesDetailsWidget.prototype.getErrors = function () {
        return $.Deferred().resolve( [] ).promise();
    };

    /**
     * @inheritdoc
     */
    uw.CategoriesDetailsWidget.prototype.getWarnings = function () {
        var warnings = [],
            missing = this.categoriesWidget.getItems().filter( ( item ) => item.missing );

        if ( missing.length > 0 ) {
            warnings.push( mw.message( 'mwe-upwiz-categories-missing', missing.length ) );
        }

        return $.Deferred().resolve( warnings ).promise();
    };

    /**
     * @inheritdoc
     */
    uw.CategoriesDetailsWidget.prototype.getWikiText = function () {
        var hiddenCats, missingCatsWikiText, categories, wikiText;

        hiddenCats = [];
        if ( mw.UploadWizard.config.autoAdd.categories ) {
            hiddenCats = hiddenCats.concat( mw.UploadWizard.config.autoAdd.categories );
        }
        if ( mw.UploadWizard.config.trackingCategory ) {
            if ( mw.UploadWizard.config.trackingCategory.all ) {
                hiddenCats.push( mw.UploadWizard.config.trackingCategory.all );
            }
            if ( mw.UploadWizard.config.trackingCategory.campaign ) {
                hiddenCats.push( mw.UploadWizard.config.trackingCategory.campaign );
            }
        }
        hiddenCats = hiddenCats.filter( ( cat ) =>
            // Keep only valid titles
             !!mw.Title.makeTitle( NS_CATEGORY, cat )
         );

        missingCatsWikiText = null;
        if (
            typeof mw.UploadWizard.config.missingCategoriesWikiText === 'string' &&
            mw.UploadWizard.config.missingCategoriesWikiText.length > 0
        ) {
            missingCatsWikiText = mw.UploadWizard.config.missingCategoriesWikiText;
        }

        categories = this.categoriesWidget.getItems().map( ( item ) => item.data );

        // add all categories
        wikiText = categories.concat( hiddenCats )
            .map( ( cat ) => '[[' + mw.Title.makeTitle( NS_CATEGORY, cat ).getPrefixedText() + ']]' )
            .join( '\n' );

        // if so configured, and there are no user-visible categories, add warning
        if ( missingCatsWikiText !== null && categories.length === 0 ) {
            wikiText += '\n\n' + missingCatsWikiText;
        }

        return wikiText;
    };

    /**
     * @inheritdoc
     * @return {Object} See #setSerialized
     */
    uw.CategoriesDetailsWidget.prototype.getSerialized = function () {
        return {
            value: this.categoriesWidget.getItems().map( ( item ) => item.data )
        };
    };

    /**
     * @inheritdoc
     * @param {Object} serialized
     * @param {string[]} serialized.value List of categories
     */
    uw.CategoriesDetailsWidget.prototype.setSerialized = function ( serialized ) {
        this.categoriesWidget.setValue( serialized.value );
    };

}( mw.uploadWizard ) );