wikimedia/mediawiki-extensions-MobileFrontend

View on GitHub
src/mobile.editor.overlay/BlockMessageDetails.js

Summary

Maintainability
C
7 hrs
Test Coverage
'use strict';
const Button = require( '../mobile.startup/Button' ),
    View = require( '../mobile.startup/View' ),
    Icon = require( '../mobile.startup/Icon' ),
    util = require( '../mobile.startup/util' );

/**
 * Renders a block message details.
 *
 * @extends module:mobile.startup/View
 * @private
 */
class BlockMessageDetails extends View {
    /** @inheritdoc */
    get isTemplateMode() {
        return true;
    }

    /**
     * @inheritdoc
     */
    get defaults() {
        return {
            createDetailsAnchorHref: function () {
                return function ( blockId, render ) {
                    return mw.util.getUrl( 'Special:BlockList', { wpTarget: '#' + render( blockId ) } );
                };
            },
            createDetailsAnchorLabel: function () {
                return mw.msg( 'mobile-frontend-editor-blocked-drawer-help' );
            },
            createTitle: function () {
                let msgKey = 'mobile-frontend-editor-blocked-drawer-title';
                if ( mw.user.isAnon() ) {
                    msgKey += '-ip';
                }
                if ( this.partial ) {
                    msgKey += '-partial';
                }
                // The following messages can be passed here:
                // * mobile-frontend-editor-blocked-drawer-title
                // * mobile-frontend-editor-blocked-drawer-title-partial
                // * mobile-frontend-editor-blocked-drawer-title-ip
                // * mobile-frontend-editor-blocked-drawer-title-ip-partial
                return mw.msg( msgKey );
            },
            createBody: function () {
                let msgKey = '';
                if ( mw.user.isAnon() && this.anonOnly ) {
                    msgKey = 'mobile-frontend-editor-blocked-drawer-body';
                    if ( this.noCreateAccount ) {
                        msgKey += '-login';
                    } else {
                        msgKey += '-login-createaccount';
                    }
                    if ( this.partial ) {
                        msgKey += '-partial';
                    }
                } else {
                    if ( this.partial ) {
                        msgKey = 'mobile-frontend-editor-blocked-drawer-body-partial';
                    }
                }
                // The following messages can be passed here:
                // * mobile-frontend-editor-blocked-drawer-body-partial
                // * mobile-frontend-editor-blocked-drawer-body-login
                // * mobile-frontend-editor-blocked-drawer-body-login-partial
                // * mobile-frontend-editor-blocked-drawer-body-login-createaccount
                // * mobile-frontend-editor-blocked-drawer-body-login-createaccount-partial
                return msgKey ? mw.msg( msgKey ) : msgKey;
            },
            seeMoreLink: mw.msg( 'mobile-frontend-editor-blocked-drawer-body-link' ),
            reasonHeader: mw.msg( 'mobile-frontend-editor-blocked-drawer-reason-header' ),
            creatorHeader: function () {
                // The gender is the subject (the blockee) not the object (the blocker).
                return mw.msg( 'mobile-frontend-editor-blocked-drawer-creator-header',
                    mw.user.options.get( 'gender' ) );
            },
            expiryHeader: mw.msg( 'mobile-frontend-editor-blocked-drawer-expiry-header' )
        };
    }

    /**
     * Configure the call to action depending on the type of block.
     *
     * @return {Object} Configuration options
     */
    getButtonConfig() {
        let cta = true;
        const config = {
                progressive: true
            },
            wiki = mw.config.get( 'wgDBname' );

        if ( mw.user.isAnon() && this.options.anonOnly ) {
            // The user can avoid the block by logging in
            config.label = mw.msg( 'mobile-frontend-editor-blocked-drawer-action-login' );
            config.href = new mw.Title( 'Special:UserLogin' ).getUrl();
        } else if ( this.options.partial ) {
            // The user can avoid the block by editing a different page
            config.label = mw.msg( 'mobile-frontend-editor-blocked-drawer-action-randompage' );
            config.href = new mw.Title( 'Special:Random' ).getUrl();
            config.quiet = true;
        } else {
            // The user cannot avoid the block
            config.tagName = 'button';
            config.label = mw.msg( 'mobile-frontend-editor-blocked-drawer-action-ok' );
            config.additionalClassNames = 'cancel';
            cta = false;
        }

        if ( cta && mw.config.get( 'wgMFTrackBlockNotices' ) ) {
            mw.track( 'counter.MediaWiki.BlockNotices.' + wiki + '.MobileFrontend.ctaShown', 1 );
            config.events = {
                click: function () {
                    mw.track( 'counter.MediaWiki.BlockNotices.' + wiki + '.MobileFrontend.ctaClicked', 1 );
                }
            };
        }

        return config;
    }

    /**
     * @inheritdoc
     */
    postRender() {
        const drawer = this;
        this.$el.find( '.block-message-buttons' ).prepend(
            new Button( this.getButtonConfig() ).$el
        );
        this.$el.find( '.block-message-icon' ).prepend(
            ( new Icon( {
                icon: 'block-destructive'
            } ) ).$el
        );
        this.options.parsedReason.then( function ( htmlReason ) {
            drawer.$el.find( '.block-message-reason div' ).html( htmlReason );
        } );
    }

    /**
     * @inheritdoc
     */
    get template() {
        return util.template( `
<div class="block-message block-message-container">
  <div class="block-message-icon"></div>
  <div class="block-message-info">
    <div class="block-message-item block-message-title">
      <h5>{{ createTitle }}</h5>
    </div>
    <div class="block-message-data">
      <div class="block-message-item">
        <p>
          {{ createBody }}
          <a class ="block-message-see-more" href="#">{{ seeMoreLink }}</a>
        </p>
      </div>
      <div class="block-message-item block-message-creator">
        {{#creator.name}}
          <p>
            {{ creatorHeader }}
            <strong>
              {{#creator.url}}
                <a href="{{ creator.url }}">{{ creator.name }}</a>
              {{/creator.url}}
              {{^creator.url}}
                {{ creator.name }}
              {{/creator.url}}
            </strong>
          </p>
        {{/creator.name}}
      </div>
      {{#duration}}
        <div class="block-message-item">
          <p>
            {{ expiryHeader }}
            <strong>{{ duration }}</strong>
          </p>
        </div>
      {{/duration}}
      {{#blockId}}
        <div class="block-message-item">
          <a href="{{#createDetailsAnchorHref}}{{ blockId }}{{/createDetailsAnchorHref}}">
            {{ createDetailsAnchorLabel }}
          </a>
        </div>
      {{/blockId}}
    </div>
  </div>
  {{#reason}}
    <div class="block-message-item block-message-reason">
      <h5>{{ reasonHeader }}</h5>
      <div><p>{{{ reason }}}</p></div>
    </div>
  {{/reason}}
  <div class="block-message-buttons">
  </div>
</div>` );
    }
}

module.exports = BlockMessageDetails;