2015-08-17 17:00:26 -07:00
/ * *
2018-11-23 12:29:20 +00:00
* DO NOT EDIT THIS FILE .
* See the following change record for more information ,
* https : //www.drupal.org/node/2815083
* @ preserve
* * /
2015-08-17 17:00:26 -07:00
2016-04-20 09:56:34 -07:00
( function ( $ , Drupal ) {
2018-11-23 12:29:20 +00:00
var states = {
2015-08-17 17:00:26 -07:00
postponed : [ ]
} ;
2018-11-23 12:29:20 +00:00
Drupal . states = states ;
function invert ( a , invertState ) {
return invertState && typeof a !== 'undefined' ? ! a : a ;
}
function _compare2 ( a , b ) {
if ( a === b ) {
return typeof a === 'undefined' ? a : true ;
}
return typeof a === 'undefined' || typeof b === 'undefined' ;
}
function ternary ( a , b ) {
if ( typeof a === 'undefined' ) {
return b ;
}
if ( typeof b === 'undefined' ) {
return a ;
}
return a && b ;
}
2015-08-17 17:00:26 -07:00
Drupal . behaviors . states = {
2018-11-23 12:29:20 +00:00
attach : function attach ( context , settings ) {
2015-08-17 17:00:26 -07:00
var $states = $ ( context ) . find ( '[data-drupal-states]' ) ;
var il = $states . length ;
2018-11-23 12:29:20 +00:00
var _loop = function _loop ( i ) {
var config = JSON . parse ( $states [ i ] . getAttribute ( 'data-drupal-states' ) ) ;
Object . keys ( config || { } ) . forEach ( function ( state ) {
new states . Dependent ( {
element : $ ( $states [ i ] ) ,
state : states . State . sanitize ( state ) ,
constraints : config [ state ]
} ) ;
} ) ;
} ;
2015-08-17 17:00:26 -07:00
for ( var i = 0 ; i < il ; i ++ ) {
2018-11-23 12:29:20 +00:00
_loop ( i ) ;
2015-08-17 17:00:26 -07:00
}
while ( states . postponed . length ) {
2018-11-23 12:29:20 +00:00
states . postponed . shift ( ) ( ) ;
2015-08-17 17:00:26 -07:00
}
}
} ;
states . Dependent = function ( args ) {
2018-11-23 12:29:20 +00:00
var _this = this ;
$ . extend ( this , { values : { } , oldValue : null } , args ) ;
2015-08-17 17:00:26 -07:00
this . dependees = this . getDependees ( ) ;
2018-11-23 12:29:20 +00:00
Object . keys ( this . dependees || { } ) . forEach ( function ( selector ) {
_this . initializeDependee ( selector , _this . dependees [ selector ] ) ;
} ) ;
2015-08-17 17:00:26 -07:00
} ;
states . Dependent . comparisons = {
2018-11-23 12:29:20 +00:00
RegExp : function RegExp ( reference , value ) {
2015-08-17 17:00:26 -07:00
return reference . test ( value ) ;
} ,
2018-11-23 12:29:20 +00:00
Function : function Function ( reference , value ) {
2015-08-17 17:00:26 -07:00
return reference ( value ) ;
} ,
2018-11-23 12:29:20 +00:00
Number : function Number ( reference , value ) {
return typeof value === 'string' ? _compare2 ( reference . toString ( ) , value ) : _compare2 ( reference , value ) ;
2015-08-17 17:00:26 -07:00
}
} ;
states . Dependent . prototype = {
2018-11-23 12:29:20 +00:00
initializeDependee : function initializeDependee ( selector , dependeeStates ) {
var _this2 = this ;
2015-08-17 17:00:26 -07:00
this . values [ selector ] = { } ;
2018-11-23 12:29:20 +00:00
Object . keys ( dependeeStates ) . forEach ( function ( i ) {
var state = dependeeStates [ i ] ;
2015-08-17 17:00:26 -07:00
2018-11-23 12:29:20 +00:00
if ( $ . inArray ( state , dependeeStates ) === - 1 ) {
return ;
}
2015-08-17 17:00:26 -07:00
2018-11-23 12:29:20 +00:00
state = states . State . sanitize ( state ) ;
2015-08-17 17:00:26 -07:00
2018-11-23 12:29:20 +00:00
_this2 . values [ selector ] [ state . name ] = null ;
2015-08-17 17:00:26 -07:00
2018-11-23 12:29:20 +00:00
$ ( selector ) . on ( 'state:' + state , { selector : selector , state : state } , function ( e ) {
_this2 . update ( e . data . selector , e . data . state , e . value ) ;
} ) ;
2015-08-17 17:00:26 -07:00
2018-11-23 12:29:20 +00:00
new states . Trigger ( { selector : selector , state : state } ) ;
} ) ;
} ,
compare : function compare ( reference , selector , state ) {
2015-08-17 17:00:26 -07:00
var value = this . values [ selector ] [ state . name ] ;
if ( reference . constructor . name in states . Dependent . comparisons ) {
return states . Dependent . comparisons [ reference . constructor . name ] ( reference , value ) ;
}
2018-11-23 12:29:20 +00:00
return _compare2 ( reference , value ) ;
} ,
update : function update ( selector , state , value ) {
2015-08-17 17:00:26 -07:00
if ( value !== this . values [ selector ] [ state . name ] ) {
this . values [ selector ] [ state . name ] = value ;
this . reevaluate ( ) ;
}
} ,
2018-11-23 12:29:20 +00:00
reevaluate : function reevaluate ( ) {
2015-08-17 17:00:26 -07:00
var value = this . verifyConstraints ( this . constraints ) ;
if ( value !== this . oldValue ) {
this . oldValue = value ;
value = invert ( value , this . state . invert ) ;
2018-11-23 12:29:20 +00:00
this . element . trigger ( {
type : 'state:' + this . state ,
value : value ,
trigger : true
} ) ;
2015-08-17 17:00:26 -07:00
}
} ,
2018-11-23 12:29:20 +00:00
verifyConstraints : function verifyConstraints ( constraints , selector ) {
var result = void 0 ;
2015-08-17 17:00:26 -07:00
if ( $ . isArray ( constraints ) ) {
var hasXor = $ . inArray ( 'xor' , constraints ) === - 1 ;
var len = constraints . length ;
for ( var i = 0 ; i < len ; i ++ ) {
if ( constraints [ i ] !== 'xor' ) {
var constraint = this . checkConstraints ( constraints [ i ] , selector , i ) ;
2018-11-23 12:29:20 +00:00
2015-08-17 17:00:26 -07:00
if ( constraint && ( hasXor || result ) ) {
return hasXor ;
}
result = result || constraint ;
}
}
2018-11-23 12:29:20 +00:00
} else if ( $ . isPlainObject ( constraints ) ) {
for ( var n in constraints ) {
if ( constraints . hasOwnProperty ( n ) ) {
result = ternary ( result , this . checkConstraints ( constraints [ n ] , selector , n ) ) ;
if ( result === false ) {
return false ;
}
}
2015-08-17 17:00:26 -07:00
}
}
return result ;
} ,
2018-11-23 12:29:20 +00:00
checkConstraints : function checkConstraints ( value , selector , state ) {
if ( typeof state !== 'string' || /[0-9]/ . test ( state [ 0 ] ) ) {
2015-08-17 17:00:26 -07:00
state = null ;
2018-11-23 12:29:20 +00:00
} else if ( typeof selector === 'undefined' ) {
2015-08-17 17:00:26 -07:00
selector = state ;
state = null ;
}
if ( state !== null ) {
state = states . State . sanitize ( state ) ;
return invert ( this . compare ( value , selector , state ) , state . invert ) ;
}
2018-11-23 12:29:20 +00:00
return this . verifyConstraints ( value , selector ) ;
} ,
getDependees : function getDependees ( ) {
2015-08-17 17:00:26 -07:00
var cache = { } ;
2018-11-23 12:29:20 +00:00
2015-08-17 17:00:26 -07:00
var _compare = this . compare ;
this . compare = function ( reference , selector , state ) {
( cache [ selector ] || ( cache [ selector ] = [ ] ) ) . push ( state . name ) ;
} ;
this . verifyConstraints ( this . constraints ) ;
2018-11-23 12:29:20 +00:00
2015-08-17 17:00:26 -07:00
this . compare = _compare ;
return cache ;
}
} ;
states . Trigger = function ( args ) {
$ . extend ( this , args ) ;
if ( this . state in states . Trigger . states ) {
this . element = $ ( this . selector ) ;
if ( ! this . element . data ( 'trigger:' + this . state ) ) {
this . initialize ( ) ;
}
}
} ;
states . Trigger . prototype = {
2018-11-23 12:29:20 +00:00
initialize : function initialize ( ) {
var _this3 = this ;
2015-08-17 17:00:26 -07:00
var trigger = states . Trigger . states [ this . state ] ;
if ( typeof trigger === 'function' ) {
trigger . call ( window , this . element ) ;
2018-11-23 12:29:20 +00:00
} else {
Object . keys ( trigger || { } ) . forEach ( function ( event ) {
_this3 . defaultTrigger ( event , trigger [ event ] ) ;
} ) ;
2015-08-17 17:00:26 -07:00
}
this . element . data ( 'trigger:' + this . state , true ) ;
} ,
2018-11-23 12:29:20 +00:00
defaultTrigger : function defaultTrigger ( event , valueFn ) {
2015-08-17 17:00:26 -07:00
var oldValue = valueFn . call ( this . element ) ;
this . element . on ( event , $ . proxy ( function ( e ) {
var value = valueFn . call ( this . element , e ) ;
2018-11-23 12:29:20 +00:00
2015-08-17 17:00:26 -07:00
if ( oldValue !== value ) {
2018-11-23 12:29:20 +00:00
this . element . trigger ( {
type : 'state:' + this . state ,
value : value ,
oldValue : oldValue
} ) ;
2015-08-17 17:00:26 -07:00
oldValue = value ;
}
} , this ) ) ;
states . postponed . push ( $ . proxy ( function ( ) {
2018-11-23 12:29:20 +00:00
this . element . trigger ( {
type : 'state:' + this . state ,
value : oldValue ,
oldValue : null
} ) ;
2015-08-17 17:00:26 -07:00
} , this ) ) ;
}
} ;
states . Trigger . states = {
empty : {
2018-11-23 12:29:20 +00:00
keyup : function keyup ( ) {
2015-08-17 17:00:26 -07:00
return this . val ( ) === '' ;
}
} ,
checked : {
2018-11-23 12:29:20 +00:00
change : function change ( ) {
2015-08-17 17:00:26 -07:00
var checked = false ;
this . each ( function ( ) {
checked = $ ( this ) . prop ( 'checked' ) ;
2018-11-23 12:29:20 +00:00
2015-08-17 17:00:26 -07:00
return ! checked ;
} ) ;
return checked ;
}
} ,
value : {
2018-11-23 12:29:20 +00:00
keyup : function keyup ( ) {
2015-08-17 17:00:26 -07:00
if ( this . length > 1 ) {
return this . filter ( ':checked' ) . val ( ) || false ;
}
return this . val ( ) ;
} ,
2018-11-23 12:29:20 +00:00
change : function change ( ) {
2015-08-17 17:00:26 -07:00
if ( this . length > 1 ) {
return this . filter ( ':checked' ) . val ( ) || false ;
}
return this . val ( ) ;
}
} ,
collapsed : {
2018-11-23 12:29:20 +00:00
collapsed : function collapsed ( e ) {
return typeof e !== 'undefined' && 'value' in e ? e . value : ! this . is ( '[open]' ) ;
2015-08-17 17:00:26 -07:00
}
}
} ;
states . State = function ( state ) {
2018-11-23 12:29:20 +00:00
this . pristine = state ;
this . name = state ;
2015-08-17 17:00:26 -07:00
var process = true ;
do {
while ( this . name . charAt ( 0 ) === '!' ) {
this . name = this . name . substring ( 1 ) ;
this . invert = ! this . invert ;
}
if ( this . name in states . State . aliases ) {
this . name = states . State . aliases [ this . name ] ;
2018-11-23 12:29:20 +00:00
} else {
2015-08-17 17:00:26 -07:00
process = false ;
}
} while ( process ) ;
} ;
states . State . sanitize = function ( state ) {
if ( state instanceof states . State ) {
return state ;
}
2018-11-23 12:29:20 +00:00
return new states . State ( state ) ;
2015-08-17 17:00:26 -07:00
} ;
states . State . aliases = {
2015-09-04 13:20:09 -07:00
enabled : '!disabled' ,
invisible : '!visible' ,
invalid : '!valid' ,
untouched : '!touched' ,
optional : '!required' ,
filled : '!empty' ,
unchecked : '!checked' ,
irrelevant : '!relevant' ,
expanded : '!collapsed' ,
open : '!collapsed' ,
closed : 'collapsed' ,
readwrite : '!readonly'
2015-08-17 17:00:26 -07:00
} ;
states . State . prototype = {
invert : false ,
2018-11-23 12:29:20 +00:00
toString : function toString ( ) {
2015-08-17 17:00:26 -07:00
return this . name ;
}
} ;
2016-04-20 09:56:34 -07:00
var $document = $ ( document ) ;
$document . on ( 'state:disabled' , function ( e ) {
2015-08-17 17:00:26 -07:00
if ( e . trigger ) {
2018-11-23 12:29:20 +00:00
$ ( e . target ) . prop ( 'disabled' , e . value ) . closest ( '.js-form-item, .js-form-submit, .js-form-wrapper' ) . toggleClass ( 'form-disabled' , e . value ) . find ( 'select, input, textarea' ) . prop ( 'disabled' , e . value ) ;
2015-08-17 17:00:26 -07:00
}
} ) ;
2016-04-20 09:56:34 -07:00
$document . on ( 'state:required' , function ( e ) {
2015-08-17 17:00:26 -07:00
if ( e . trigger ) {
if ( e . value ) {
2015-10-08 11:40:12 -07:00
var label = 'label' + ( e . target . id ? '[for=' + e . target . id + ']' : '' ) ;
2018-11-23 12:29:20 +00:00
var $label = $ ( e . target ) . attr ( { required : 'required' , 'aria-required' : 'aria-required' } ) . closest ( '.js-form-item, .js-form-wrapper' ) . find ( label ) ;
2015-09-04 13:20:09 -07:00
if ( ! $label . hasClass ( 'js-form-required' ) . length ) {
$label . addClass ( 'js-form-required form-required' ) ;
2015-08-17 17:00:26 -07:00
}
2018-11-23 12:29:20 +00:00
} else {
2015-10-08 11:40:12 -07:00
$ ( e . target ) . removeAttr ( 'required aria-required' ) . closest ( '.js-form-item, .js-form-wrapper' ) . find ( 'label.js-form-required' ) . removeClass ( 'js-form-required form-required' ) ;
2015-08-17 17:00:26 -07:00
}
}
} ) ;
2016-04-20 09:56:34 -07:00
$document . on ( 'state:visible' , function ( e ) {
2015-08-17 17:00:26 -07:00
if ( e . trigger ) {
2015-10-08 11:40:12 -07:00
$ ( e . target ) . closest ( '.js-form-item, .js-form-submit, .js-form-wrapper' ) . toggle ( e . value ) ;
2015-08-17 17:00:26 -07:00
}
} ) ;
2016-04-20 09:56:34 -07:00
$document . on ( 'state:checked' , function ( e ) {
2015-08-17 17:00:26 -07:00
if ( e . trigger ) {
$ ( e . target ) . prop ( 'checked' , e . value ) ;
}
} ) ;
2016-04-20 09:56:34 -07:00
$document . on ( 'state:collapsed' , function ( e ) {
2015-08-17 17:00:26 -07:00
if ( e . trigger ) {
if ( $ ( e . target ) . is ( '[open]' ) === e . value ) {
2016-01-06 16:31:26 -08:00
$ ( e . target ) . find ( '> summary' ) . trigger ( 'click' ) ;
2015-08-17 17:00:26 -07:00
}
}
} ) ;
2018-11-23 12:29:20 +00:00
} ) ( jQuery , Drupal ) ;