2007-12-16 10:36:53 +00:00
// $Id$
2007-11-14 09:50:00 +00:00
/ * *
* Move a block in the blocks table from one region to another via select list .
*
* This behavior is dependent on the tableDrag behavior , since it uses the
* objects initialized in that behavior to update the row .
* /
2008-10-29 10:01:28 +00:00
Drupal . behaviors . blockDrag = {
attach : function ( context ) {
var table = $ ( 'table#blocks' ) ;
var tableDrag = Drupal . tableDrag . blocks ; // Get the blocks tableDrag object.
2007-11-14 09:50:00 +00:00
2008-10-29 10:01:28 +00:00
// Add a handler for when a row is swapped, update empty regions.
tableDrag . row . prototype . onSwap = function ( swappedRow ) {
checkEmptyRegions ( table , this ) ;
} ;
2007-11-14 09:50:00 +00:00
2008-10-29 10:01:28 +00:00
// A custom message for the blocks page specifically.
Drupal . theme . tableDragChangedWarning = function ( ) {
return '<div class="warning">' + Drupal . theme ( 'tableDragChangedMarker' ) + ' ' + Drupal . t ( "The changes to these blocks will not be saved until the <em>Save blocks</em> button is clicked." ) + '</div>' ;
} ;
2007-11-14 09:50:00 +00:00
2008-10-29 10:01:28 +00:00
// Add a handler so when a row is dropped, update fields dropped into new regions.
tableDrag . onDrop = function ( ) {
dragObject = this ;
if ( $ ( dragObject . rowObject . element ) . prev ( 'tr' ) . is ( '.region-message' ) ) {
var regionRow = $ ( dragObject . rowObject . element ) . prev ( 'tr' ) . get ( 0 ) ;
var regionName = regionRow . className . replace ( /([^ ]+[ ]+)*region-([^ ]+)-message([ ]+[^ ]+)*/ , '$2' ) ;
var regionField = $ ( 'select.block-region-select' , dragObject . rowObject . element ) ;
var weightField = $ ( 'select.block-weight' , dragObject . rowObject . element ) ;
var oldRegionName = weightField [ 0 ] . className . replace ( /([^ ]+[ ]+)*block-weight-([^ ]+)([ ]+[^ ]+)*/ , '$2' ) ;
2007-11-14 09:50:00 +00:00
2008-10-29 10:01:28 +00:00
if ( ! regionField . is ( '.block-region-' + regionName ) ) {
regionField . removeClass ( 'block-region-' + oldRegionName ) . addClass ( 'block-region-' + regionName ) ;
weightField . removeClass ( 'block-weight-' + oldRegionName ) . addClass ( 'block-weight-' + regionName ) ;
regionField . val ( regionName ) ;
}
2007-11-14 09:50:00 +00:00
}
2008-10-29 10:01:28 +00:00
} ;
2007-11-14 09:50:00 +00:00
2008-10-29 10:01:28 +00:00
// Add the behavior to each region select list.
$ ( 'select.block-region-select:not(.blockregionselect-processed)' , context ) . each ( function ( ) {
$ ( this ) . change ( function ( event ) {
// Make our new row and select field.
var row = $ ( this ) . parents ( 'tr:first' ) ;
var select = $ ( this ) ;
tableDrag . rowObject = new tableDrag . row ( row ) ;
2007-11-14 09:50:00 +00:00
2008-10-29 10:01:28 +00:00
// Find the correct region and insert the row as the first in the region.
$ ( 'tr.region-message' , table ) . each ( function ( ) {
if ( $ ( this ) . is ( '.region-' + select [ 0 ] . value + '-message' ) ) {
// Add the new row and remove the old one.
$ ( this ) . after ( row ) ;
// Manually update weights and restripe.
tableDrag . updateFields ( row . get ( 0 ) ) ;
tableDrag . rowObject . changed = true ;
if ( tableDrag . oldRowElement ) {
$ ( tableDrag . oldRowElement ) . removeClass ( 'drag-previous' ) ;
}
tableDrag . oldRowElement = row . get ( 0 ) ;
tableDrag . restripeTable ( ) ;
tableDrag . rowObject . markChanged ( ) ;
tableDrag . oldRowElement = row ;
$ ( row ) . addClass ( 'drag-previous' ) ;
2007-11-14 09:50:00 +00:00
}
2008-10-29 10:01:28 +00:00
} ) ;
2007-11-14 09:50:00 +00:00
2008-10-29 10:01:28 +00:00
// Modify empty regions with added or removed fields.
checkEmptyRegions ( table , row ) ;
// Remove focus from selectbox.
select . get ( 0 ) . blur ( ) ;
} ) ;
$ ( this ) . addClass ( 'blockregionselect-processed' ) ;
2007-11-14 09:50:00 +00:00
} ) ;
2008-10-29 10:01:28 +00:00
var checkEmptyRegions = function ( table , rowObject ) {
$ ( 'tr.region-message' , table ) . each ( function ( ) {
// If the dragged row is in this region, but above the message row, swap it down one space.
if ( $ ( this ) . prev ( 'tr' ) . get ( 0 ) == rowObject . element ) {
// Prevent a recursion problem when using the keyboard to move rows up.
if ( ( rowObject . method != 'keyboard' || rowObject . direction == 'down' ) ) {
rowObject . swap ( 'after' , this ) ;
}
2007-11-14 09:50:00 +00:00
}
2008-10-29 10:01:28 +00:00
// This region has become empty.
if ( $ ( this ) . next ( 'tr' ) . is ( ':not(.draggable)' ) || $ ( this ) . next ( 'tr' ) . size ( ) == 0 ) {
$ ( this ) . removeClass ( 'region-populated' ) . addClass ( 'region-empty' ) ;
}
// This region has become populated.
else if ( $ ( this ) . is ( '.region-empty' ) ) {
$ ( this ) . removeClass ( 'region-empty' ) . addClass ( 'region-populated' ) ;
}
} ) ;
} ;
}
2007-11-14 09:50:00 +00:00
} ;