2013-04-19 17:20:06 +00:00
/ * *
2017-05-19 22:12:53 +00:00
* DO NOT EDIT THIS FILE .
* See the following change record for more information ,
2017-05-23 14:30:14 +00:00
* https : //www.drupal.org/node/2815083
2017-05-19 22:12:53 +00:00
* @ preserve
* * /
2015-06-08 14:04:39 +00:00
2021-05-05 11:19:27 +00:00
function _toConsumableArray ( arr ) { return _arrayWithoutHoles ( arr ) || _iterableToArray ( arr ) || _unsupportedIterableToArray ( arr ) || _nonIterableSpread ( ) ; }
function _nonIterableSpread ( ) { throw new TypeError ( "Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method." ) ; }
function _unsupportedIterableToArray ( o , minLen ) { if ( ! o ) return ; if ( typeof o === "string" ) return _arrayLikeToArray ( o , minLen ) ; var n = Object . prototype . toString . call ( o ) . slice ( 8 , - 1 ) ; if ( n === "Object" && o . constructor ) n = o . constructor . name ; if ( n === "Map" || n === "Set" ) return Array . from ( o ) ; if ( n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/ . test ( n ) ) return _arrayLikeToArray ( o , minLen ) ; }
function _iterableToArray ( iter ) { if ( typeof Symbol !== "undefined" && iter [ Symbol . iterator ] != null || iter [ "@@iterator" ] != null ) return Array . from ( iter ) ; }
function _arrayWithoutHoles ( arr ) { if ( Array . isArray ( arr ) ) return _arrayLikeToArray ( arr ) ; }
function _arrayLikeToArray ( arr , len ) { if ( len == null || len > arr . length ) len = arr . length ; for ( var i = 0 , arr2 = new Array ( len ) ; i < len ; i ++ ) { arr2 [ i ] = arr [ i ] ; } return arr2 ; }
( function ( $ , Drupal , _ref ) {
var tabbable = _ref . tabbable ,
isTabbable = _ref . isTabbable ;
2014-01-27 21:41:32 +00:00
function TabbingManager ( ) {
this . stack = [ ] ;
}
2013-04-19 17:20:06 +00:00
2018-03-05 09:14:08 +00:00
function TabbingContext ( options ) {
$ . extend ( this , {
level : null ,
$tabbableElements : $ ( ) ,
$disabledElements : $ ( ) ,
released : false ,
active : false
} , options ) ;
}
2017-05-19 22:12:53 +00:00
$ . extend ( TabbingManager . prototype , {
constrain : function constrain ( elements ) {
2015-04-19 15:30:43 +00:00
var il = this . stack . length ;
2020-01-30 09:08:38 +00:00
2015-04-19 15:30:43 +00:00
for ( var i = 0 ; i < il ; i ++ ) {
2014-01-27 21:41:32 +00:00
this . stack [ i ] . deactivate ( ) ;
}
2013-04-19 17:20:06 +00:00
2021-05-05 11:19:27 +00:00
var tabbableElements = [ ] ;
$ ( elements ) . each ( function ( index , rootElement ) {
tabbableElements = [ ] . concat ( _toConsumableArray ( tabbableElements ) , _toConsumableArray ( tabbable ( rootElement ) ) ) ;
if ( isTabbable ( rootElement ) ) {
tabbableElements = [ ] . concat ( _toConsumableArray ( tabbableElements ) , [ rootElement ] ) ;
}
} ) ;
2014-01-27 21:41:32 +00:00
var tabbingContext = new TabbingContext ( {
level : this . stack . length ,
2021-05-05 11:19:27 +00:00
$tabbableElements : $ ( tabbableElements )
2014-01-27 21:41:32 +00:00
} ) ;
this . stack . push ( tabbingContext ) ;
tabbingContext . activate ( ) ;
$ ( document ) . trigger ( 'drupalTabbingConstrained' , tabbingContext ) ;
return tabbingContext ;
} ,
2017-05-19 22:12:53 +00:00
release : function release ( ) {
2014-01-27 21:41:32 +00:00
var toActivate = this . stack . length - 1 ;
2020-01-30 09:08:38 +00:00
2014-01-27 21:41:32 +00:00
while ( toActivate >= 0 && this . stack [ toActivate ] . released ) {
toActivate -- ;
}
2013-04-19 17:20:06 +00:00
2014-01-27 21:41:32 +00:00
this . stack . splice ( toActivate + 1 ) ;
2013-04-19 17:20:06 +00:00
2014-01-27 21:41:32 +00:00
if ( toActivate >= 0 ) {
this . stack [ toActivate ] . activate ( ) ;
}
} ,
2017-05-19 22:12:53 +00:00
activate : function activate ( tabbingContext ) {
2014-01-27 21:41:32 +00:00
var $set = tabbingContext . $tabbableElements ;
var level = tabbingContext . level ;
2021-05-05 11:19:27 +00:00
var $disabledSet = $ ( tabbable ( document . body ) ) . not ( $set ) ;
2014-01-27 21:41:32 +00:00
tabbingContext . $disabledElements = $disabledSet ;
2020-01-28 13:12:54 +00:00
var il = $disabledSet . length ;
2020-01-30 09:08:38 +00:00
2015-04-19 15:30:43 +00:00
for ( var i = 0 ; i < il ; i ++ ) {
2014-01-27 21:41:32 +00:00
this . recordTabindex ( $disabledSet . eq ( i ) , level ) ;
}
2017-05-19 22:12:53 +00:00
$disabledSet . prop ( 'tabindex' , - 1 ) . prop ( 'autofocus' , false ) ;
2014-01-27 21:41:32 +00:00
var $hasFocus = $set . filter ( '[autofocus]' ) . eq ( - 1 ) ;
2017-05-19 22:12:53 +00:00
2014-01-27 21:41:32 +00:00
if ( $hasFocus . length === 0 ) {
$hasFocus = $set . eq ( 0 ) ;
}
2020-01-30 09:08:38 +00:00
2014-01-27 21:41:32 +00:00
$hasFocus . trigger ( 'focus' ) ;
} ,
2017-05-19 22:12:53 +00:00
deactivate : function deactivate ( tabbingContext ) {
2014-01-27 21:41:32 +00:00
var $set = tabbingContext . $disabledElements ;
var level = tabbingContext . level ;
2015-04-19 15:30:43 +00:00
var il = $set . length ;
2020-01-30 09:08:38 +00:00
2015-04-19 15:30:43 +00:00
for ( var i = 0 ; i < il ; i ++ ) {
2014-01-27 21:41:32 +00:00
this . restoreTabindex ( $set . eq ( i ) , level ) ;
}
} ,
2017-05-19 22:12:53 +00:00
recordTabindex : function recordTabindex ( $el , level ) {
2014-01-27 21:41:32 +00:00
var tabInfo = $el . data ( 'drupalOriginalTabIndices' ) || { } ;
tabInfo [ level ] = {
tabindex : $el [ 0 ] . getAttribute ( 'tabindex' ) ,
autofocus : $el [ 0 ] . hasAttribute ( 'autofocus' )
} ;
$el . data ( 'drupalOriginalTabIndices' , tabInfo ) ;
} ,
2017-05-19 22:12:53 +00:00
restoreTabindex : function restoreTabindex ( $el , level ) {
2014-01-27 21:41:32 +00:00
var tabInfo = $el . data ( 'drupalOriginalTabIndices' ) ;
2020-01-30 09:08:38 +00:00
2014-01-27 21:41:32 +00:00
if ( tabInfo && tabInfo [ level ] ) {
var data = tabInfo [ level ] ;
2020-01-30 09:08:38 +00:00
2014-01-27 21:41:32 +00:00
if ( data . tabindex ) {
$el [ 0 ] . setAttribute ( 'tabindex' , data . tabindex ) ;
2017-05-19 22:12:53 +00:00
} else {
$el [ 0 ] . removeAttribute ( 'tabindex' ) ;
}
2020-01-30 09:08:38 +00:00
2014-01-27 21:41:32 +00:00
if ( data . autofocus ) {
$el [ 0 ] . setAttribute ( 'autofocus' , 'autofocus' ) ;
}
2013-04-19 17:20:06 +00:00
2014-01-27 21:41:32 +00:00
if ( level === 0 ) {
$el . removeData ( 'drupalOriginalTabIndices' ) ;
2017-05-19 22:12:53 +00:00
} else {
2014-01-27 21:41:32 +00:00
var levelToDelete = level ;
2020-01-30 09:08:38 +00:00
2014-01-27 21:41:32 +00:00
while ( tabInfo . hasOwnProperty ( levelToDelete ) ) {
delete tabInfo [ levelToDelete ] ;
levelToDelete ++ ;
}
2020-01-30 09:08:38 +00:00
2014-01-27 21:41:32 +00:00
$el . data ( 'drupalOriginalTabIndices' , tabInfo ) ;
2013-04-19 17:20:06 +00:00
}
}
}
2014-01-27 21:41:32 +00:00
} ) ;
2017-05-19 22:12:53 +00:00
$ . extend ( TabbingContext . prototype , {
release : function release ( ) {
2014-01-27 21:41:32 +00:00
if ( ! this . released ) {
this . deactivate ( ) ;
this . released = true ;
Drupal . tabbingManager . release ( this ) ;
$ ( document ) . trigger ( 'drupalTabbingContextReleased' , this ) ;
}
} ,
2017-05-19 22:12:53 +00:00
activate : function activate ( ) {
2014-01-27 21:41:32 +00:00
if ( ! this . active && ! this . released ) {
this . active = true ;
Drupal . tabbingManager . activate ( this ) ;
$ ( document ) . trigger ( 'drupalTabbingContextActivated' , this ) ;
}
} ,
2017-05-19 22:12:53 +00:00
deactivate : function deactivate ( ) {
2014-01-27 21:41:32 +00:00
if ( this . active ) {
this . active = false ;
Drupal . tabbingManager . deactivate ( this ) ;
$ ( document ) . trigger ( 'drupalTabbingContextDeactivated' , this ) ;
}
2013-04-19 17:20:06 +00:00
}
2014-01-27 21:41:32 +00:00
} ) ;
2013-04-19 17:20:06 +00:00
2014-01-27 21:41:32 +00:00
if ( Drupal . tabbingManager ) {
return ;
}
2015-06-08 14:04:39 +00:00
2014-01-27 21:41:32 +00:00
Drupal . tabbingManager = new TabbingManager ( ) ;
2021-05-05 11:19:27 +00:00
} ) ( jQuery , Drupal , window . tabbable ) ;