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
* * /
var _typeof = typeof Symbol === "function" && typeof Symbol . iterator === "symbol" ? function ( obj ) { return typeof obj ; } : function ( obj ) { return obj && typeof Symbol === "function" && obj . constructor === Symbol && obj !== Symbol . prototype ? "symbol" : typeof obj ; } ;
2015-08-17 17:00:26 -07:00
( function ( $ , Drupal , drupalSettings ) {
var showWeight = JSON . parse ( localStorage . getItem ( 'Drupal.tableDrag.showWeight' ) ) ;
Drupal . behaviors . tableDrag = {
2018-11-23 12:29:20 +00:00
attach : function attach ( context , settings ) {
2015-08-17 17:00:26 -07:00
function initTableDrag ( table , base ) {
if ( table . length ) {
Drupal . tableDrag [ base ] = new Drupal . tableDrag ( table [ 0 ] , settings . tableDrag [ base ] ) ;
}
}
2018-11-23 12:29:20 +00:00
Object . keys ( settings . tableDrag || { } ) . forEach ( function ( base ) {
initTableDrag ( $ ( context ) . find ( '#' + base ) . once ( 'tabledrag' ) , base ) ;
} ) ;
2015-08-17 17:00:26 -07:00
}
} ;
Drupal . tableDrag = function ( table , tableSettings ) {
2018-11-23 12:29:20 +00:00
var _this = this ;
2015-08-17 17:00:26 -07:00
var self = this ;
var $table = $ ( table ) ;
this . $table = $ ( table ) ;
this . table = table ;
this . tableSettings = tableSettings ;
this . dragObject = null ;
this . rowObject = null ;
this . oldRowElement = null ;
this . oldY = 0 ;
this . changed = false ;
this . maxDepth = 0 ;
this . rtl = $ ( this . table ) . css ( 'direction' ) === 'rtl' ? - 1 : 1 ;
this . striping = $ ( this . table ) . data ( 'striping' ) === 1 ;
2018-11-23 12:29:20 +00:00
this . scrollSettings = { amount : 4 , interval : 50 , trigger : 70 } ;
2015-08-17 17:00:26 -07:00
this . scrollInterval = null ;
this . scrollY = 0 ;
this . windowHeight = 0 ;
this . indentEnabled = false ;
2018-11-23 12:29:20 +00:00
Object . keys ( tableSettings || { } ) . forEach ( function ( group ) {
Object . keys ( tableSettings [ group ] || { } ) . forEach ( function ( n ) {
if ( tableSettings [ group ] [ n ] . relationship === 'parent' ) {
_this . indentEnabled = true ;
2015-08-17 17:00:26 -07:00
}
2018-11-23 12:29:20 +00:00
if ( tableSettings [ group ] [ n ] . limit > 0 ) {
_this . maxDepth = tableSettings [ group ] [ n ] . limit ;
}
} ) ;
} ) ;
2015-08-17 17:00:26 -07:00
if ( this . indentEnabled ) {
this . indentCount = 1 ;
2018-11-23 12:29:20 +00:00
2015-08-17 17:00:26 -07:00
var indent = Drupal . theme ( 'tableDragIndentation' ) ;
var testRow = $ ( '<tr/>' ) . addClass ( 'draggable' ) . appendTo ( table ) ;
var testCell = $ ( '<td/>' ) . appendTo ( testRow ) . prepend ( indent ) . prepend ( indent ) ;
var $indentation = testCell . find ( '.js-indentation' ) ;
this . indentAmount = $indentation . get ( 1 ) . offsetLeft - $indentation . get ( 0 ) . offsetLeft ;
testRow . remove ( ) ;
}
2018-11-23 12:29:20 +00:00
$table . find ( '> tr.draggable, > tbody > tr.draggable' ) . each ( function ( ) {
self . makeDraggable ( this ) ;
} ) ;
$table . before ( $ ( '<button type="button" class="link tabledrag-toggle-weight"></button>' ) . attr ( 'title' , Drupal . t ( 'Re-order rows by numerical weight instead of dragging.' ) ) . on ( 'click' , $ . proxy ( function ( e ) {
e . preventDefault ( ) ;
this . toggleColumns ( ) ;
} , this ) ) . wrap ( '<div class="tabledrag-toggle-weight-wrapper"></div>' ) . parent ( ) ) ;
2015-08-17 17:00:26 -07:00
self . initColumns ( ) ;
2018-11-23 12:29:20 +00:00
$ ( document ) . on ( 'touchmove' , function ( event ) {
return self . dragRow ( event . originalEvent . touches [ 0 ] , self ) ;
} ) ;
$ ( document ) . on ( 'touchend' , function ( event ) {
return self . dropRow ( event . originalEvent . touches [ 0 ] , self ) ;
} ) ;
$ ( document ) . on ( 'mousemove pointermove' , function ( event ) {
return self . dragRow ( event , self ) ;
} ) ;
$ ( document ) . on ( 'mouseup pointerup' , function ( event ) {
return self . dropRow ( event , self ) ;
} ) ;
2015-08-17 17:00:26 -07:00
$ ( window ) . on ( 'storage' , $ . proxy ( function ( e ) {
if ( e . originalEvent . key === 'Drupal.tableDrag.showWeight' ) {
showWeight = JSON . parse ( e . originalEvent . newValue ) ;
this . displayColumns ( showWeight ) ;
}
} , this ) ) ;
} ;
Drupal . tableDrag . prototype . initColumns = function ( ) {
2018-11-23 12:29:20 +00:00
var _this2 = this ;
2015-08-17 17:00:26 -07:00
var $table = this . $table ;
2018-11-23 12:29:20 +00:00
var hidden = void 0 ;
var cell = void 0 ;
var columnIndex = void 0 ;
Object . keys ( this . tableSettings || { } ) . forEach ( function ( group ) {
Object . keys ( _this2 . tableSettings [ group ] ) . some ( function ( tableSetting ) {
var field = $table . find ( '.' + _this2 . tableSettings [ group ] [ tableSetting ] . target ) . eq ( 0 ) ;
if ( field . length && _this2 . tableSettings [ group ] [ tableSetting ] . hidden ) {
hidden = _this2 . tableSettings [ group ] [ tableSetting ] . hidden ;
cell = field . closest ( 'td' ) ;
return true ;
2015-08-17 17:00:26 -07:00
}
2018-11-23 12:29:20 +00:00
return false ;
} ) ;
2015-08-17 17:00:26 -07:00
2018-11-23 12:29:20 +00:00
if ( hidden && cell [ 0 ] ) {
columnIndex = cell . parent ( ) . find ( '> td' ) . index ( cell . get ( 0 ) ) + 1 ;
$table . find ( '> thead > tr, > tbody > tr, > tr' ) . each ( _this2 . addColspanClass ( columnIndex ) ) ;
2015-08-17 17:00:26 -07:00
}
2018-11-23 12:29:20 +00:00
} ) ;
2015-08-17 17:00:26 -07:00
this . displayColumns ( showWeight ) ;
} ;
Drupal . tableDrag . prototype . addColspanClass = function ( columnIndex ) {
return function ( ) {
var $row = $ ( this ) ;
var index = columnIndex ;
var cells = $row . children ( ) ;
2018-11-23 12:29:20 +00:00
var cell = void 0 ;
2015-08-17 17:00:26 -07:00
cells . each ( function ( n ) {
if ( n < index && this . colSpan && this . colSpan > 1 ) {
index -= this . colSpan - 1 ;
}
} ) ;
if ( index > 0 ) {
cell = cells . filter ( ':nth-child(' + index + ')' ) ;
if ( cell [ 0 ] . colSpan && cell [ 0 ] . colSpan > 1 ) {
cell . addClass ( 'tabledrag-has-colspan' ) ;
2018-11-23 12:29:20 +00:00
} else {
2015-08-17 17:00:26 -07:00
cell . addClass ( 'tabledrag-hide' ) ;
}
}
} ;
} ;
Drupal . tableDrag . prototype . displayColumns = function ( displayWeight ) {
if ( displayWeight ) {
this . showColumns ( ) ;
2018-11-23 12:29:20 +00:00
} else {
this . hideColumns ( ) ;
}
2015-08-17 17:00:26 -07:00
$ ( 'table' ) . findOnce ( 'tabledrag' ) . trigger ( 'columnschange' , ! ! displayWeight ) ;
} ;
Drupal . tableDrag . prototype . toggleColumns = function ( ) {
showWeight = ! showWeight ;
this . displayColumns ( showWeight ) ;
if ( showWeight ) {
localStorage . setItem ( 'Drupal.tableDrag.showWeight' , showWeight ) ;
2018-11-23 12:29:20 +00:00
} else {
2015-08-17 17:00:26 -07:00
localStorage . removeItem ( 'Drupal.tableDrag.showWeight' ) ;
}
} ;
Drupal . tableDrag . prototype . hideColumns = function ( ) {
var $tables = $ ( 'table' ) . findOnce ( 'tabledrag' ) ;
2018-11-23 12:29:20 +00:00
2015-08-17 17:00:26 -07:00
$tables . find ( '.tabledrag-hide' ) . css ( 'display' , 'none' ) ;
2018-11-23 12:29:20 +00:00
2015-08-17 17:00:26 -07:00
$tables . find ( '.tabledrag-handle' ) . css ( 'display' , '' ) ;
2018-11-23 12:29:20 +00:00
2015-08-17 17:00:26 -07:00
$tables . find ( '.tabledrag-has-colspan' ) . each ( function ( ) {
this . colSpan = this . colSpan - 1 ;
} ) ;
2018-11-23 12:29:20 +00:00
2015-08-17 17:00:26 -07:00
$ ( '.tabledrag-toggle-weight' ) . text ( Drupal . t ( 'Show row weights' ) ) ;
} ;
Drupal . tableDrag . prototype . showColumns = function ( ) {
var $tables = $ ( 'table' ) . findOnce ( 'tabledrag' ) ;
2018-11-23 12:29:20 +00:00
2015-08-17 17:00:26 -07:00
$tables . find ( '.tabledrag-hide' ) . css ( 'display' , '' ) ;
2018-11-23 12:29:20 +00:00
2015-08-17 17:00:26 -07:00
$tables . find ( '.tabledrag-handle' ) . css ( 'display' , 'none' ) ;
2018-11-23 12:29:20 +00:00
2015-08-17 17:00:26 -07:00
$tables . find ( '.tabledrag-has-colspan' ) . each ( function ( ) {
this . colSpan = this . colSpan + 1 ;
} ) ;
2018-11-23 12:29:20 +00:00
2015-08-17 17:00:26 -07:00
$ ( '.tabledrag-toggle-weight' ) . text ( Drupal . t ( 'Hide row weights' ) ) ;
} ;
Drupal . tableDrag . prototype . rowSettings = function ( group , row ) {
var field = $ ( row ) . find ( '.' + group ) ;
var tableSettingsGroup = this . tableSettings [ group ] ;
2018-11-23 12:29:20 +00:00
return Object . keys ( tableSettingsGroup ) . map ( function ( delta ) {
var targetClass = tableSettingsGroup [ delta ] . target ;
var rowSettings = void 0 ;
if ( field . is ( '.' + targetClass ) ) {
rowSettings = { } ;
Object . keys ( tableSettingsGroup [ delta ] ) . forEach ( function ( n ) {
rowSettings [ n ] = tableSettingsGroup [ delta ] [ n ] ;
} ) ;
2015-08-17 17:00:26 -07:00
}
2018-11-23 12:29:20 +00:00
return rowSettings ;
} ) . filter ( function ( rowSetting ) {
return rowSetting ;
} ) [ 0 ] ;
2015-08-17 17:00:26 -07:00
} ;
Drupal . tableDrag . prototype . makeDraggable = function ( item ) {
var self = this ;
var $item = $ ( item ) ;
2018-11-23 12:29:20 +00:00
2015-08-17 17:00:26 -07:00
$item . find ( 'td:first-of-type' ) . find ( 'a' ) . addClass ( 'menu-item__link' ) ;
2018-11-23 12:29:20 +00:00
2015-08-17 17:00:26 -07:00
var handle = $ ( '<a href="#" class="tabledrag-handle"><div class="handle"> </div></a>' ) . attr ( 'title' , Drupal . t ( 'Drag to re-order' ) ) ;
2018-11-23 12:29:20 +00:00
2015-08-17 17:00:26 -07:00
var $indentationLast = $item . find ( 'td:first-of-type' ) . find ( '.js-indentation' ) . eq ( - 1 ) ;
if ( $indentationLast . length ) {
$indentationLast . after ( handle ) ;
2018-11-23 12:29:20 +00:00
2015-08-17 17:00:26 -07:00
self . indentCount = Math . max ( $item . find ( '.js-indentation' ) . length , self . indentCount ) ;
2018-11-23 12:29:20 +00:00
} else {
2015-08-17 17:00:26 -07:00
$item . find ( 'td' ) . eq ( 0 ) . prepend ( handle ) ;
}
2015-11-17 13:42:33 -08:00
handle . on ( 'mousedown touchstart pointerdown' , function ( event ) {
event . preventDefault ( ) ;
if ( event . originalEvent . type === 'touchstart' ) {
2015-08-17 17:00:26 -07:00
event = event . originalEvent . touches [ 0 ] ;
2015-11-17 13:42:33 -08:00
}
self . dragStart ( event , self , item ) ;
} ) ;
2015-08-17 17:00:26 -07:00
handle . on ( 'click' , function ( e ) {
e . preventDefault ( ) ;
} ) ;
handle . on ( 'focus' , function ( ) {
self . safeBlur = true ;
} ) ;
handle . on ( 'blur' , function ( event ) {
if ( self . rowObject && self . safeBlur ) {
self . dropRow ( event , self ) ;
}
} ) ;
handle . on ( 'keydown' , function ( event ) {
if ( event . keyCode !== 9 && ! self . rowObject ) {
self . rowObject = new self . row ( item , 'keyboard' , self . indentEnabled , self . maxDepth , true ) ;
}
var keyChange = false ;
2018-11-23 12:29:20 +00:00
var groupHeight = void 0 ;
2016-10-06 15:16:20 -07:00
2015-08-17 17:00:26 -07:00
switch ( event . keyCode ) {
case 37 :
case 63234 :
keyChange = true ;
self . rowObject . indent ( - 1 * self . rtl ) ;
break ;
case 38 :
case 63232 :
2018-11-23 12:29:20 +00:00
{
var $previousRow = $ ( self . rowObject . element ) . prev ( 'tr:first-of-type' ) ;
var previousRow = $previousRow . get ( 0 ) ;
while ( previousRow && $previousRow . is ( ':hidden' ) ) {
$previousRow = $ ( previousRow ) . prev ( 'tr:first-of-type' ) ;
previousRow = $previousRow . get ( 0 ) ;
}
if ( previousRow ) {
self . safeBlur = false ;
self . rowObject . direction = 'up' ;
keyChange = true ;
if ( $ ( item ) . is ( '.tabledrag-root' ) ) {
groupHeight = 0 ;
while ( previousRow && $previousRow . find ( '.js-indentation' ) . length ) {
$previousRow = $ ( previousRow ) . prev ( 'tr:first-of-type' ) ;
previousRow = $previousRow . get ( 0 ) ;
groupHeight += $previousRow . is ( ':hidden' ) ? 0 : previousRow . offsetHeight ;
}
if ( previousRow ) {
self . rowObject . swap ( 'before' , previousRow ) ;
window . scrollBy ( 0 , - groupHeight ) ;
}
} else if ( self . table . tBodies [ 0 ] . rows [ 0 ] !== previousRow || $previousRow . is ( '.draggable' ) ) {
2015-08-17 17:00:26 -07:00
self . rowObject . swap ( 'before' , previousRow ) ;
2018-11-23 12:29:20 +00:00
self . rowObject . interval = null ;
self . rowObject . indent ( 0 ) ;
window . scrollBy ( 0 , - parseInt ( item . offsetHeight , 10 ) ) ;
2015-08-17 17:00:26 -07:00
}
2018-11-23 12:29:20 +00:00
handle . trigger ( 'focus' ) ;
2015-08-17 17:00:26 -07:00
}
2018-11-23 12:29:20 +00:00
break ;
2015-08-17 17:00:26 -07:00
}
case 39 :
case 63235 :
keyChange = true ;
self . rowObject . indent ( self . rtl ) ;
break ;
case 40 :
case 63233 :
2018-11-23 12:29:20 +00:00
{
var $nextRow = $ ( self . rowObject . group ) . eq ( - 1 ) . next ( 'tr:first-of-type' ) ;
var nextRow = $nextRow . get ( 0 ) ;
while ( nextRow && $nextRow . is ( ':hidden' ) ) {
$nextRow = $ ( nextRow ) . next ( 'tr:first-of-type' ) ;
nextRow = $nextRow . get ( 0 ) ;
2015-08-17 17:00:26 -07:00
}
2018-11-23 12:29:20 +00:00
if ( nextRow ) {
self . safeBlur = false ;
self . rowObject . direction = 'down' ;
keyChange = true ;
if ( $ ( item ) . is ( '.tabledrag-root' ) ) {
groupHeight = 0 ;
var nextGroup = new self . row ( nextRow , 'keyboard' , self . indentEnabled , self . maxDepth , false ) ;
if ( nextGroup ) {
$ ( nextGroup . group ) . each ( function ( ) {
groupHeight += $ ( this ) . is ( ':hidden' ) ? 0 : this . offsetHeight ;
} ) ;
var nextGroupRow = $ ( nextGroup . group ) . eq ( - 1 ) . get ( 0 ) ;
self . rowObject . swap ( 'after' , nextGroupRow ) ;
window . scrollBy ( 0 , parseInt ( groupHeight , 10 ) ) ;
}
} else {
self . rowObject . swap ( 'after' , nextRow ) ;
self . rowObject . interval = null ;
self . rowObject . indent ( 0 ) ;
window . scrollBy ( 0 , parseInt ( item . offsetHeight , 10 ) ) ;
}
handle . trigger ( 'focus' ) ;
2015-08-17 17:00:26 -07:00
}
2018-11-23 12:29:20 +00:00
break ;
2015-08-17 17:00:26 -07:00
}
}
if ( self . rowObject && self . rowObject . changed === true ) {
$ ( item ) . addClass ( 'drag' ) ;
if ( self . oldRowElement ) {
$ ( self . oldRowElement ) . removeClass ( 'drag-previous' ) ;
}
self . oldRowElement = item ;
if ( self . striping === true ) {
self . restripeTable ( ) ;
}
self . onDrag ( ) ;
}
if ( keyChange ) {
return false ;
}
} ) ;
handle . on ( 'keypress' , function ( event ) {
2016-10-06 15:16:20 -07:00
2015-08-17 17:00:26 -07:00
switch ( event . keyCode ) {
case 37 :
case 38 :
case 39 :
case 40 :
return false ;
}
} ) ;
} ;
Drupal . tableDrag . prototype . dragStart = function ( event , self , item ) {
self . dragObject = { } ;
self . dragObject . initOffset = self . getPointerOffset ( item , event ) ;
self . dragObject . initPointerCoords = self . pointerCoords ( event ) ;
if ( self . indentEnabled ) {
self . dragObject . indentPointerPos = self . dragObject . initPointerCoords ;
}
if ( self . rowObject ) {
$ ( self . rowObject . element ) . find ( 'a.tabledrag-handle' ) . trigger ( 'blur' ) ;
}
self . rowObject = new self . row ( item , 'pointer' , self . indentEnabled , self . maxDepth , true ) ;
self . table . topY = $ ( self . table ) . offset ( ) . top ;
self . table . bottomY = self . table . topY + self . table . offsetHeight ;
$ ( item ) . addClass ( 'drag' ) ;
$ ( 'body' ) . addClass ( 'drag' ) ;
if ( self . oldRowElement ) {
$ ( self . oldRowElement ) . removeClass ( 'drag-previous' ) ;
}
} ;
Drupal . tableDrag . prototype . dragRow = function ( event , self ) {
if ( self . dragObject ) {
self . currentPointerCoords = self . pointerCoords ( event ) ;
var y = self . currentPointerCoords . y - self . dragObject . initOffset . y ;
var x = self . currentPointerCoords . x - self . dragObject . initOffset . x ;
if ( y !== self . oldY ) {
self . rowObject . direction = y > self . oldY ? 'down' : 'up' ;
2018-11-23 12:29:20 +00:00
2015-08-17 17:00:26 -07:00
self . oldY = y ;
2018-11-23 12:29:20 +00:00
2015-08-17 17:00:26 -07:00
var scrollAmount = self . checkScroll ( self . currentPointerCoords . y ) ;
2018-11-23 12:29:20 +00:00
2015-08-17 17:00:26 -07:00
clearInterval ( self . scrollInterval ) ;
2018-11-23 12:29:20 +00:00
2015-08-17 17:00:26 -07:00
if ( scrollAmount > 0 && self . rowObject . direction === 'down' || scrollAmount < 0 && self . rowObject . direction === 'up' ) {
self . setScroll ( scrollAmount ) ;
}
var currentRow = self . findDropTargetRow ( x , y ) ;
if ( currentRow ) {
if ( self . rowObject . direction === 'down' ) {
self . rowObject . swap ( 'after' , currentRow , self ) ;
2018-11-23 12:29:20 +00:00
} else {
2015-08-17 17:00:26 -07:00
self . rowObject . swap ( 'before' , currentRow , self ) ;
}
if ( self . striping === true ) {
self . restripeTable ( ) ;
}
}
}
if ( self . indentEnabled ) {
var xDiff = self . currentPointerCoords . x - self . dragObject . indentPointerPos . x ;
2018-11-23 12:29:20 +00:00
2015-08-17 17:00:26 -07:00
var indentDiff = Math . round ( xDiff / self . indentAmount ) ;
2018-11-23 12:29:20 +00:00
2015-08-17 17:00:26 -07:00
var indentChange = self . rowObject . indent ( indentDiff ) ;
2018-11-23 12:29:20 +00:00
2015-08-17 17:00:26 -07:00
self . dragObject . indentPointerPos . x += self . indentAmount * indentChange * self . rtl ;
self . indentCount = Math . max ( self . indentCount , self . rowObject . indents ) ;
}
return false ;
}
} ;
Drupal . tableDrag . prototype . dropRow = function ( event , self ) {
2018-11-23 12:29:20 +00:00
var droppedRow = void 0 ;
var $droppedRow = void 0 ;
2015-08-17 17:00:26 -07:00
if ( self . rowObject !== null ) {
droppedRow = self . rowObject . element ;
$droppedRow = $ ( droppedRow ) ;
2018-11-23 12:29:20 +00:00
2015-08-17 17:00:26 -07:00
if ( self . rowObject . changed === true ) {
self . updateFields ( droppedRow ) ;
2018-11-23 12:29:20 +00:00
Object . keys ( self . tableSettings || { } ) . forEach ( function ( group ) {
var rowSettings = self . rowSettings ( group , droppedRow ) ;
if ( rowSettings . relationship === 'group' ) {
Object . keys ( self . rowObject . children || { } ) . forEach ( function ( n ) {
self . updateField ( self . rowObject . children [ n ] , group ) ;
} ) ;
2015-08-17 17:00:26 -07:00
}
2018-11-23 12:29:20 +00:00
} ) ;
2015-08-17 17:00:26 -07:00
self . rowObject . markChanged ( ) ;
if ( self . changed === false ) {
$ ( Drupal . theme ( 'tableDragChangedWarning' ) ) . insertBefore ( self . table ) . hide ( ) . fadeIn ( 'slow' ) ;
self . changed = true ;
}
}
if ( self . indentEnabled ) {
self . rowObject . removeIndentClasses ( ) ;
}
if ( self . oldRowElement ) {
$ ( self . oldRowElement ) . removeClass ( 'drag-previous' ) ;
}
$droppedRow . removeClass ( 'drag' ) . addClass ( 'drag-previous' ) ;
self . oldRowElement = droppedRow ;
self . onDrop ( ) ;
self . rowObject = null ;
}
if ( self . dragObject !== null ) {
self . dragObject = null ;
$ ( 'body' ) . removeClass ( 'drag' ) ;
clearInterval ( self . scrollInterval ) ;
}
} ;
Drupal . tableDrag . prototype . pointerCoords = function ( event ) {
if ( event . pageX || event . pageY ) {
2018-11-23 12:29:20 +00:00
return { x : event . pageX , y : event . pageY } ;
2015-08-17 17:00:26 -07:00
}
return {
x : event . clientX + document . body . scrollLeft - document . body . clientLeft ,
y : event . clientY + document . body . scrollTop - document . body . clientTop
} ;
} ;
Drupal . tableDrag . prototype . getPointerOffset = function ( target , event ) {
var docPos = $ ( target ) . offset ( ) ;
var pointerPos = this . pointerCoords ( event ) ;
2018-11-23 12:29:20 +00:00
return { x : pointerPos . x - docPos . left , y : pointerPos . y - docPos . top } ;
2015-08-17 17:00:26 -07:00
} ;
Drupal . tableDrag . prototype . findDropTargetRow = function ( x , y ) {
2018-11-23 12:29:20 +00:00
var _this3 = this ;
2015-08-17 17:00:26 -07:00
var rows = $ ( this . table . tBodies [ 0 ] . rows ) . not ( ':hidden' ) ;
2018-11-23 12:29:20 +00:00
var _loop = function _loop ( n ) {
2015-08-17 17:00:26 -07:00
var row = rows [ n ] ;
var $row = $ ( row ) ;
var rowY = $row . offset ( ) . top ;
2018-11-23 12:29:20 +00:00
var rowHeight = void 0 ;
2015-08-17 17:00:26 -07:00
if ( row . offsetHeight === 0 ) {
rowHeight = parseInt ( row . firstChild . offsetHeight , 10 ) / 2 ;
2018-11-23 12:29:20 +00:00
} else {
rowHeight = parseInt ( row . offsetHeight , 10 ) / 2 ;
}
2015-08-17 17:00:26 -07:00
2018-11-23 12:29:20 +00:00
if ( y > rowY - rowHeight && y < rowY + rowHeight ) {
if ( _this3 . indentEnabled ) {
if ( Object . keys ( _this3 . rowObject . group ) . some ( function ( o ) {
return _this3 . rowObject . group [ o ] === row ;
} ) ) {
return {
v : null
} ;
2015-08-17 17:00:26 -07:00
}
2018-11-23 12:29:20 +00:00
} else if ( row === _this3 . rowObject . element ) {
return {
v : null
} ;
2015-08-17 17:00:26 -07:00
}
2018-11-23 12:29:20 +00:00
if ( ! _this3 . rowObject . isValidSwap ( row ) ) {
return {
v : null
} ;
2015-08-17 17:00:26 -07:00
}
while ( $row . is ( ':hidden' ) && $row . prev ( 'tr' ) . is ( ':hidden' ) ) {
$row = $row . prev ( 'tr:first-of-type' ) ;
row = $row . get ( 0 ) ;
}
2018-11-23 12:29:20 +00:00
return {
v : row
} ;
2015-08-17 17:00:26 -07:00
}
2018-11-23 12:29:20 +00:00
} ;
for ( var n = 0 ; n < rows . length ; n ++ ) {
var _ret = _loop ( n ) ;
if ( ( typeof _ret === 'undefined' ? 'undefined' : _typeof ( _ret ) ) === "object" ) return _ret . v ;
2015-08-17 17:00:26 -07:00
}
return null ;
} ;
Drupal . tableDrag . prototype . updateFields = function ( changedRow ) {
2018-11-23 12:29:20 +00:00
var _this4 = this ;
Object . keys ( this . tableSettings || { } ) . forEach ( function ( group ) {
_this4 . updateField ( changedRow , group ) ;
} ) ;
2015-08-17 17:00:26 -07:00
} ;
Drupal . tableDrag . prototype . updateField = function ( changedRow , group ) {
var rowSettings = this . rowSettings ( group , changedRow ) ;
var $changedRow = $ ( changedRow ) ;
2018-11-23 12:29:20 +00:00
var sourceRow = void 0 ;
var $previousRow = void 0 ;
var previousRow = void 0 ;
var useSibling = void 0 ;
2015-08-17 17:00:26 -07:00
if ( rowSettings . relationship === 'self' || rowSettings . relationship === 'group' ) {
sourceRow = changedRow ;
2018-11-23 12:29:20 +00:00
} else if ( rowSettings . relationship === 'sibling' ) {
$previousRow = $changedRow . prev ( 'tr:first-of-type' ) ;
previousRow = $previousRow . get ( 0 ) ;
var $nextRow = $changedRow . next ( 'tr:first-of-type' ) ;
var nextRow = $nextRow . get ( 0 ) ;
sourceRow = changedRow ;
if ( $previousRow . is ( '.draggable' ) && $previousRow . find ( '.' + group ) . length ) {
if ( this . indentEnabled ) {
if ( $previousRow . find ( '.js-indentations' ) . length === $changedRow . find ( '.js-indentations' ) . length ) {
sourceRow = previousRow ;
}
} else {
2015-08-17 17:00:26 -07:00
sourceRow = previousRow ;
}
2018-11-23 12:29:20 +00:00
} else if ( $nextRow . is ( '.draggable' ) && $nextRow . find ( '.' + group ) . length ) {
if ( this . indentEnabled ) {
if ( $nextRow . find ( '.js-indentations' ) . length === $changedRow . find ( '.js-indentations' ) . length ) {
sourceRow = nextRow ;
}
} else {
2015-08-17 17:00:26 -07:00
sourceRow = nextRow ;
}
}
2018-11-23 12:29:20 +00:00
} else if ( rowSettings . relationship === 'parent' ) {
$previousRow = $changedRow . prev ( 'tr' ) ;
previousRow = $previousRow ;
while ( $previousRow . length && $previousRow . find ( '.js-indentation' ) . length >= this . rowObject . indents ) {
$previousRow = $previousRow . prev ( 'tr' ) ;
previousRow = $previousRow ;
}
if ( $previousRow . length ) {
sourceRow = $previousRow . get ( 0 ) ;
} else {
sourceRow = $ ( this . table ) . find ( 'tr.draggable:first-of-type' ) . get ( 0 ) ;
if ( sourceRow === this . rowObject . element ) {
sourceRow = $ ( this . rowObject . group [ this . rowObject . group . length - 1 ] ) . next ( 'tr.draggable' ) . get ( 0 ) ;
}
useSibling = true ;
}
2015-08-17 17:00:26 -07:00
}
this . copyDragClasses ( sourceRow , changedRow , group ) ;
rowSettings = this . rowSettings ( group , changedRow ) ;
if ( useSibling ) {
rowSettings . relationship = 'sibling' ;
rowSettings . source = rowSettings . target ;
}
var targetClass = '.' + rowSettings . target ;
var targetElement = $changedRow . find ( targetClass ) . get ( 0 ) ;
if ( targetElement ) {
var sourceClass = '.' + rowSettings . source ;
var sourceElement = $ ( sourceClass , sourceRow ) . get ( 0 ) ;
switch ( rowSettings . action ) {
case 'depth' :
targetElement . value = $ ( sourceElement ) . closest ( 'tr' ) . find ( '.js-indentation' ) . length ;
break ;
case 'match' :
targetElement . value = sourceElement . value ;
break ;
case 'order' :
2018-11-23 12:29:20 +00:00
{
var siblings = this . rowObject . findSiblings ( rowSettings ) ;
if ( $ ( targetElement ) . is ( 'select' ) ) {
var values = [ ] ;
$ ( targetElement ) . find ( 'option' ) . each ( function ( ) {
values . push ( this . value ) ;
} ) ;
var maxVal = values [ values . length - 1 ] ;
$ ( siblings ) . find ( targetClass ) . each ( function ( ) {
if ( values . length > 0 ) {
this . value = values . shift ( ) ;
} else {
this . value = maxVal ;
}
} ) ;
} else {
var weight = parseInt ( $ ( siblings [ 0 ] ) . find ( targetClass ) . val ( ) , 10 ) || 0 ;
$ ( siblings ) . find ( targetClass ) . each ( function ( ) {
this . value = weight ;
weight ++ ;
} ) ;
}
break ;
2015-08-17 17:00:26 -07:00
}
}
}
} ;
Drupal . tableDrag . prototype . copyDragClasses = function ( sourceRow , targetRow , group ) {
var sourceElement = $ ( sourceRow ) . find ( '.' + group ) ;
var targetElement = $ ( targetRow ) . find ( '.' + group ) ;
if ( sourceElement . length && targetElement . length ) {
targetElement [ 0 ] . className = sourceElement [ 0 ] . className ;
}
} ;
Drupal . tableDrag . prototype . checkScroll = function ( cursorY ) {
var de = document . documentElement ;
var b = document . body ;
2018-11-23 12:29:20 +00:00
var windowHeight = window . innerHeight || ( de . clientHeight && de . clientWidth !== 0 ? de . clientHeight : b . offsetHeight ) ;
this . windowHeight = windowHeight ;
var scrollY = void 0 ;
2015-08-17 17:00:26 -07:00
if ( document . all ) {
2018-11-23 12:29:20 +00:00
scrollY = ! de . scrollTop ? b . scrollTop : de . scrollTop ;
} else {
scrollY = window . pageYOffset ? window . pageYOffset : window . scrollY ;
2015-08-17 17:00:26 -07:00
}
2018-11-23 12:29:20 +00:00
this . scrollY = scrollY ;
2015-08-17 17:00:26 -07:00
var trigger = this . scrollSettings . trigger ;
var delta = 0 ;
if ( cursorY - scrollY > windowHeight - trigger ) {
delta = trigger / ( windowHeight + scrollY - cursorY ) ;
2018-11-23 12:29:20 +00:00
delta = delta > 0 && delta < trigger ? delta : trigger ;
2015-08-17 17:00:26 -07:00
return delta * this . scrollSettings . amount ;
}
2018-11-23 12:29:20 +00:00
if ( cursorY - scrollY < trigger ) {
2015-08-17 17:00:26 -07:00
delta = trigger / ( cursorY - scrollY ) ;
2018-11-23 12:29:20 +00:00
delta = delta > 0 && delta < trigger ? delta : trigger ;
2015-08-17 17:00:26 -07:00
return - delta * this . scrollSettings . amount ;
}
} ;
Drupal . tableDrag . prototype . setScroll = function ( scrollAmount ) {
var self = this ;
this . scrollInterval = setInterval ( function ( ) {
self . checkScroll ( self . currentPointerCoords . y ) ;
var aboveTable = self . scrollY > self . table . topY ;
var belowTable = self . scrollY + self . windowHeight < self . table . bottomY ;
if ( scrollAmount > 0 && belowTable || scrollAmount < 0 && aboveTable ) {
window . scrollBy ( 0 , scrollAmount ) ;
}
} , this . scrollSettings . interval ) ;
} ;
Drupal . tableDrag . prototype . restripeTable = function ( ) {
2018-11-23 12:29:20 +00:00
$ ( this . table ) . find ( '> tbody > tr.draggable, > tr.draggable' ) . filter ( ':visible' ) . filter ( ':odd' ) . removeClass ( 'odd' ) . addClass ( 'even' ) . end ( ) . filter ( ':even' ) . removeClass ( 'even' ) . addClass ( 'odd' ) ;
2015-08-17 17:00:26 -07:00
} ;
Drupal . tableDrag . prototype . onDrag = function ( ) {
return null ;
} ;
Drupal . tableDrag . prototype . onDrop = function ( ) {
return null ;
} ;
Drupal . tableDrag . prototype . row = function ( tableRow , method , indentEnabled , maxDepth , addClasses ) {
var $tableRow = $ ( tableRow ) ;
this . element = tableRow ;
this . method = method ;
this . group = [ tableRow ] ;
this . groupDepth = $tableRow . find ( '.js-indentation' ) . length ;
this . changed = false ;
this . table = $tableRow . closest ( 'table' ) [ 0 ] ;
this . indentEnabled = indentEnabled ;
this . maxDepth = maxDepth ;
2018-11-23 12:29:20 +00:00
2015-08-17 17:00:26 -07:00
this . direction = '' ;
if ( this . indentEnabled ) {
this . indents = $tableRow . find ( '.js-indentation' ) . length ;
this . children = this . findChildren ( addClasses ) ;
this . group = $ . merge ( this . group , this . children ) ;
2018-11-23 12:29:20 +00:00
2015-08-17 17:00:26 -07:00
for ( var n = 0 ; n < this . group . length ; n ++ ) {
this . groupDepth = Math . max ( $ ( this . group [ n ] ) . find ( '.js-indentation' ) . length , this . groupDepth ) ;
}
}
} ;
Drupal . tableDrag . prototype . row . prototype . findChildren = function ( addClasses ) {
var parentIndentation = this . indents ;
var currentRow = $ ( this . element , this . table ) . next ( 'tr.draggable' ) ;
var rows = [ ] ;
var child = 0 ;
function rowIndentation ( indentNum , el ) {
var self = $ ( el ) ;
2018-11-23 12:29:20 +00:00
if ( child === 1 && indentNum === parentIndentation ) {
2015-08-17 17:00:26 -07:00
self . addClass ( 'tree-child-first' ) ;
}
if ( indentNum === parentIndentation ) {
self . addClass ( 'tree-child' ) ;
2018-11-23 12:29:20 +00:00
} else if ( indentNum > parentIndentation ) {
2015-08-17 17:00:26 -07:00
self . addClass ( 'tree-child-horizontal' ) ;
}
}
while ( currentRow . length ) {
if ( currentRow . find ( '.js-indentation' ) . length > parentIndentation ) {
child ++ ;
rows . push ( currentRow [ 0 ] ) ;
if ( addClasses ) {
currentRow . find ( '.js-indentation' ) . each ( rowIndentation ) ;
}
2018-11-23 12:29:20 +00:00
} else {
2015-08-17 17:00:26 -07:00
break ;
}
currentRow = currentRow . next ( 'tr.draggable' ) ;
}
if ( addClasses && rows . length ) {
$ ( rows [ rows . length - 1 ] ) . find ( '.js-indentation:nth-child(' + ( parentIndentation + 1 ) + ')' ) . addClass ( 'tree-child-last' ) ;
}
return rows ;
} ;
Drupal . tableDrag . prototype . row . prototype . isValidSwap = function ( row ) {
var $row = $ ( row ) ;
if ( this . indentEnabled ) {
2018-11-23 12:29:20 +00:00
var prevRow = void 0 ;
var nextRow = void 0 ;
2015-08-17 17:00:26 -07:00
if ( this . direction === 'down' ) {
prevRow = row ;
nextRow = $row . next ( 'tr' ) . get ( 0 ) ;
2018-11-23 12:29:20 +00:00
} else {
2015-08-17 17:00:26 -07:00
prevRow = $row . prev ( 'tr' ) . get ( 0 ) ;
nextRow = row ;
}
this . interval = this . validIndentInterval ( prevRow , nextRow ) ;
if ( this . interval . min > this . interval . max ) {
return false ;
}
}
if ( this . table . tBodies [ 0 ] . rows [ 0 ] === row && $row . is ( ':not(.draggable)' ) ) {
return false ;
}
return true ;
} ;
Drupal . tableDrag . prototype . row . prototype . swap = function ( position , row ) {
this . group . forEach ( function ( row ) {
Drupal . detachBehaviors ( row , drupalSettings , 'move' ) ;
} ) ;
$ ( row ) [ position ] ( this . group ) ;
2018-11-23 12:29:20 +00:00
2015-08-17 17:00:26 -07:00
this . group . forEach ( function ( row ) {
Drupal . attachBehaviors ( row , drupalSettings ) ;
} ) ;
this . changed = true ;
this . onSwap ( row ) ;
} ;
Drupal . tableDrag . prototype . row . prototype . validIndentInterval = function ( prevRow , nextRow ) {
var $prevRow = $ ( prevRow ) ;
2018-11-23 12:29:20 +00:00
var maxIndent = void 0 ;
2015-08-17 17:00:26 -07:00
2018-11-23 12:29:20 +00:00
var minIndent = nextRow ? $ ( nextRow ) . find ( '.js-indentation' ) . length : 0 ;
2015-08-17 17:00:26 -07:00
if ( ! prevRow || $prevRow . is ( ':not(.draggable)' ) || $ ( this . element ) . is ( '.tabledrag-root' ) ) {
maxIndent = 0 ;
2018-11-23 12:29:20 +00:00
} else {
2015-08-17 17:00:26 -07:00
maxIndent = $prevRow . find ( '.js-indentation' ) . length + ( $prevRow . is ( '.tabledrag-leaf' ) ? 0 : 1 ) ;
2018-11-23 12:29:20 +00:00
2015-08-17 17:00:26 -07:00
if ( this . maxDepth ) {
maxIndent = Math . min ( maxIndent , this . maxDepth - ( this . groupDepth - this . indents ) ) ;
}
}
2018-11-23 12:29:20 +00:00
return { min : minIndent , max : maxIndent } ;
2015-08-17 17:00:26 -07:00
} ;
Drupal . tableDrag . prototype . row . prototype . indent = function ( indentDiff ) {
var $group = $ ( this . group ) ;
2018-11-23 12:29:20 +00:00
2015-08-17 17:00:26 -07:00
if ( ! this . interval ) {
var prevRow = $ ( this . element ) . prev ( 'tr' ) . get ( 0 ) ;
var nextRow = $group . eq ( - 1 ) . next ( 'tr' ) . get ( 0 ) ;
this . interval = this . validIndentInterval ( prevRow , nextRow ) ;
}
var indent = this . indents + indentDiff ;
indent = Math . max ( indent , this . interval . min ) ;
indent = Math . min ( indent , this . interval . max ) ;
indentDiff = indent - this . indents ;
for ( var n = 1 ; n <= Math . abs ( indentDiff ) ; n ++ ) {
if ( indentDiff < 0 ) {
$group . find ( '.js-indentation:first-of-type' ) . remove ( ) ;
this . indents -- ;
2018-11-23 12:29:20 +00:00
} else {
2015-08-17 17:00:26 -07:00
$group . find ( 'td:first-of-type' ) . prepend ( Drupal . theme ( 'tableDragIndentation' ) ) ;
this . indents ++ ;
}
}
if ( indentDiff ) {
this . changed = true ;
this . groupDepth += indentDiff ;
this . onIndent ( ) ;
}
return indentDiff ;
} ;
Drupal . tableDrag . prototype . row . prototype . findSiblings = function ( rowSettings ) {
var siblings = [ ] ;
var directions = [ 'prev' , 'next' ] ;
var rowIndentation = this . indents ;
2018-11-23 12:29:20 +00:00
var checkRowIndentation = void 0 ;
2015-08-17 17:00:26 -07:00
for ( var d = 0 ; d < directions . length ; d ++ ) {
var checkRow = $ ( this . element ) [ directions [ d ] ] ( ) ;
while ( checkRow . length ) {
if ( checkRow . find ( '.' + rowSettings . target ) ) {
if ( this . indentEnabled ) {
checkRowIndentation = checkRow . find ( '.js-indentation' ) . length ;
}
2018-11-23 12:29:20 +00:00
if ( ! this . indentEnabled || checkRowIndentation === rowIndentation ) {
2015-08-17 17:00:26 -07:00
siblings . push ( checkRow [ 0 ] ) ;
2018-11-23 12:29:20 +00:00
} else if ( checkRowIndentation < rowIndentation ) {
2015-08-17 17:00:26 -07:00
break ;
}
2018-11-23 12:29:20 +00:00
} else {
2015-08-17 17:00:26 -07:00
break ;
}
checkRow = checkRow [ directions [ d ] ] ( ) ;
}
2018-11-23 12:29:20 +00:00
2015-08-17 17:00:26 -07:00
if ( directions [ d ] === 'prev' ) {
siblings . reverse ( ) ;
siblings . push ( this . element ) ;
}
}
return siblings ;
} ;
Drupal . tableDrag . prototype . row . prototype . removeIndentClasses = function ( ) {
2018-11-23 12:29:20 +00:00
var _this5 = this ;
Object . keys ( this . children || { } ) . forEach ( function ( n ) {
$ ( _this5 . children [ n ] ) . find ( '.js-indentation' ) . removeClass ( 'tree-child' ) . removeClass ( 'tree-child-first' ) . removeClass ( 'tree-child-last' ) . removeClass ( 'tree-child-horizontal' ) ;
} ) ;
2015-08-17 17:00:26 -07:00
} ;
Drupal . tableDrag . prototype . row . prototype . markChanged = function ( ) {
var marker = Drupal . theme ( 'tableDragChangedMarker' ) ;
var cell = $ ( this . element ) . find ( 'td:first-of-type' ) ;
if ( cell . find ( 'abbr.tabledrag-changed' ) . length === 0 ) {
cell . append ( marker ) ;
}
} ;
Drupal . tableDrag . prototype . row . prototype . onIndent = function ( ) {
return null ;
} ;
Drupal . tableDrag . prototype . row . prototype . onSwap = function ( swappedRow ) {
return null ;
} ;
2018-11-23 12:29:20 +00:00
$ . extend ( Drupal . theme , {
tableDragChangedMarker : function tableDragChangedMarker ( ) {
2015-08-17 17:00:26 -07:00
return '<abbr class="warning tabledrag-changed" title="' + Drupal . t ( 'Changed' ) + '">*</abbr>' ;
} ,
2018-11-23 12:29:20 +00:00
tableDragIndentation : function tableDragIndentation ( ) {
2015-08-17 17:00:26 -07:00
return '<div class="js-indentation indentation"> </div>' ;
} ,
2018-11-23 12:29:20 +00:00
tableDragChangedWarning : function tableDragChangedWarning ( ) {
2015-08-17 17:00:26 -07:00
return '<div class="tabledrag-changed-warning messages messages--warning" role="alert">' + Drupal . theme ( 'tableDragChangedMarker' ) + ' ' + Drupal . t ( 'You have unsaved changes.' ) + '</div>' ;
}
} ) ;
2018-11-23 12:29:20 +00:00
} ) ( jQuery , Drupal , drupalSettings ) ;