# all files / src/mixins/ AccessKeyedElement.js

87.18% Statements 34/39
73.33% Branches 22/30
100% Functions 5/5
87.18% Lines 34/39

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144

    1×

    39576×

    39576×
    39576×

    39576×
    39576×

    39576×
    37607×

    1×

    1×

    1×
    39576×

    39576×
    39576×
    1564×

    1×
    39576×

    39576×
    1564×

    1564×

    1564×
    1564×

    39576×

    1×
    5520×

    1×
    9996×

    9996×

    4476×

    5520×

    5520×

    5520×
    144×

    5520×

     /**
     * AccessKeyedElement is mixed into other classes to provide an `accesskey` attribute.
     * Accesskeys allow an user to go to a specific element by using
     * a shortcut combination of a browser specific keys + the key
     * set to the field.
     *
     *     @example
     *     // AccessKeyedElement provides an 'accesskey' attribute to the
     *     // ButtonWidget class
     *     var button = new OO.ui.ButtonWidget( {
     *         label: 'Button with Accesskey',
     *         accessKey: 'k'
     *     } );
     *     $( 'body' ).append( button.$element );
     *
     * @abstract
     * @class
     *
     * @constructor
     * @param {Object} [config] Configuration options
     * @cfg {jQuery} [$accessKeyed] The element to which the `accesskey` attribute is applied.
     *  If this config is omitted, the accesskey functionality is applied to $element, the
     *  element created by the class.
     * @cfg {string|Function} [accessKey] The key or a function that returns the key. If
     *  this config is omitted, no accesskey will be added.
     */
    OO.ui.mixin.AccessKeyedElement = function OoUiMixinAccessKeyedElement( config ) {
    	// Configuration initialization
    	config = config || {};

    	// Properties
    	this.$accessKeyed = null;
    	this.accessKey = null;

    	// Initialization
    	this.setAccessKey( config.accessKey || null );
    	this.setAccessKeyedElement( config.$accessKeyed || this.$element );

    	// If this is also a TitledElement and it initialized before we did, we may have
    	// to update the title with the access key
    	if ( this.updateTitle ) {
    		this.updateTitle();
    	}
    };

    /* Setup */

    OO.initClass( OO.ui.mixin.AccessKeyedElement );

    /* Static Properties */

    /**
     * The access key, a function that returns a key, or `null` for no accesskey.
     *
     * @static
     * @inheritable
     * @property {string|Function|null}
     */
    OO.ui.mixin.AccessKeyedElement.static.accessKey = null;

    /* Methods */

    /**
     * Set the accesskeyed element.
     *
     * This method is used to retarget a AccessKeyedElement mixin so that its functionality applies to the specified element.
     * If an element is already set, the mixin's effect on that element is removed before the new element is set up.
     *
     * @param {jQuery} $accessKeyed Element that should use the 'accesskeyes' functionality
     */
    OO.ui.mixin.AccessKeyedElement.prototype.setAccessKeyedElement = function ( $accessKeyed ) {
    	Iif ( this.$accessKeyed ) {
    		this.$accessKeyed.removeAttr( 'accesskey' );
    	}

    	this.$accessKeyed = $accessKeyed;
    	if ( this.accessKey ) {
    		this.$accessKeyed.attr( 'accesskey', this.accessKey );
    	}
    };

    /**
     * Set accesskey.
     *
     * @param {string|Function|null} accessKey Key, a function that returns a key, or `null` for no accesskey
     * @chainable
     */
    OO.ui.mixin.AccessKeyedElement.prototype.setAccessKey = function ( accessKey ) {
    	accessKey = typeof accessKey === 'string' ? OO.ui.resolveMsg( accessKey ) : null;

    	if ( this.accessKey !== accessKey ) {
    		Iif ( this.$accessKeyed ) {
    			if ( accessKey !== null ) {
    				this.$accessKeyed.attr( 'accesskey', accessKey );
    			} else {
    				this.$accessKeyed.removeAttr( 'accesskey' );
    			}
    		}
    		this.accessKey = accessKey;

    		// Only if this is a TitledElement
    		Eif ( this.updateTitle ) {
    			this.updateTitle();
    		}
    	}

    	return this;
    };

    /**
     * Get accesskey.
     *
     * @return {string} accessKey string
     */
    OO.ui.mixin.AccessKeyedElement.prototype.getAccessKey = function () {
    	return this.accessKey;
    };

    /**
     * Add information about the access key to the element's tooltip label.
     * (This is only public for hacky usage in FieldLayout.)
     *
     * @param {string} title Tooltip label for `title` attribute
     * @return {string}
     */
    OO.ui.mixin.AccessKeyedElement.prototype.formatTitleWithAccessKey = function ( title ) {
    	var accessKey;

    	if ( !this.$accessKeyed ) {
    		// Not initialized yet; the constructor will call updateTitle() which will rerun this function
    		return title;
    	}
    	// Use jquery.accessKeyLabel if available to show modifiers, otherwise just display the single key
    	Iif ( $.fn.updateTooltipAccessKeys && $.fn.updateTooltipAccessKeys.getAccessKeyLabel ) {
    		accessKey = $.fn.updateTooltipAccessKeys.getAccessKeyLabel( this.$accessKeyed[ 0 ] );
    	} else {
    		accessKey = this.getAccessKey();
    	}
    	if ( accessKey ) {
    		title += ' [' + accessKey + ']';
    	}
    	return title;
    };