Index: includes/common.inc =================================================================== RCS file: /cvs/drupal/drupal/includes/common.inc,v retrieving revision 1.1176 diff -u -p -r1.1176 common.inc --- includes/common.inc 9 Jun 2010 14:55:30 -0000 1.1176 +++ includes/common.inc 9 Jun 2010 15:47:57 -0000 @@ -4277,6 +4277,7 @@ // Add the table drag JavaScript to the page before the module JavaScript // to ensure that table drag behaviors are registered before any module // uses it. + drupal_add_js('misc/jquery.cookie.js', array('weight' => JS_DEFAULT - 2)); drupal_add_js('misc/tabledrag.js', array('weight' => JS_DEFAULT - 1)); $js_added = TRUE; } Index: misc/tabledrag.js =================================================================== RCS file: /cvs/drupal/drupal/misc/tabledrag.js,v retrieving revision 1.38 diff -u -p -r1.38 tabledrag.js --- misc/tabledrag.js 18 May 2010 06:46:45 -0000 1.38 +++ misc/tabledrag.js 9 Jun 2010 18:46:57 -0000 @@ -81,10 +81,29 @@ // Make each applicable row draggable. // Match immediate children of the parent element to allow nesting. - $('> tr.draggable, > tbody > tr.draggable', table).each(function() { self.makeDraggable(this); }); + $('> tr.draggable, > tbody > tr.draggable', table).each(function () { self.makeDraggable(this); }); - // Hide columns containing affected form elements. - this.hideColumns(); + // Add a link before the table for users to show or hide weight columns. + $(table).before($('') + .attr('title', Drupal.t('Accessibility improvement by making certain form fields directly accessible.')) + .click(function () { + if ($.cookie('Drupal.tableDrag.showWeight') == 1) { + self.hideColumns(); + } + else { + self.showColumns(); + } + return false; + }) + .wrap('
') + .parent() + ); + + // Initialize the specified columns (for example, weight or parent columns) + // to show or hide according to user preference. This aids accessibility + // so that, e.g., screen reader users can choose to enter weight values and + // manipulate form elements directly, rather than using drag-and-drop.. + self.initColumns(); // Add mouse bindings to the document. The self variable is passed along // as event handlers do not have direct access to the tableDrag object. @@ -93,10 +112,14 @@ }; /** - * Hide the columns containing form elements according to the settings for - * this tableDrag instance. + * Initialize columns containing form elements to be hidden by default, + * according to the settings for this tableDrag instance. + * + * Identify and mark each cell with a CSS class so we can easily toggle + * show/hide it. Finally, hide columns if user does not have a + * 'Drupal.tableDrag.showWeight' cookie. */ -Drupal.tableDrag.prototype.hideColumns = function () { +Drupal.tableDrag.prototype.initColumns = function () { for (var group in this.tableSettings) { // Find the first field in this group. for (var d in this.tableSettings[group]) { @@ -108,13 +131,13 @@ } } - // Hide the column containing this field. + // Mark the column containing this field so it can be hidden. if (hidden && cell[0] && cell.css('display') != 'none') { // Add 1 to our indexes. The nth-child selector is 1 based, not 0 based. // Match immediate children of the parent element to allow nesting. var columnIndex = $('> td', cell.parent()).index(cell.get(0)) + 1; var headerIndex = $('> td:not(:hidden)', cell.parent()).index(cell.get(0)) + 1; - $('> thead > tr, > tbody > tr, > tr', this.table).each(function(){ + $('> thead > tr, > tbody > tr, > tr', this.table).each(function (){ var row = $(this); var parentTag = row.parent().get(0).tagName.toLowerCase(); var index = (parentTag == 'thead') ? headerIndex : columnIndex; @@ -128,18 +151,86 @@ if (index > 0) { cell = row.children(':nth-child(' + index + ')'); if (cell[0].colSpan > 1) { - // If this cell has a colspan, simply reduce it. - cell[0].colSpan = cell[0].colSpan - 1; + // If this cell has a colspan, mark it so we can reduce the colspan. + $(cell[0]).addClass('tabledrag-has-colspan'); } else { - // Hide table body cells, but remove table header cells entirely - // (Safari doesn't hide properly). - parentTag == 'thead' ? cell.remove() : cell.css('display', 'none'); + // Mark this cell so we can hide it. + $(cell[0]).addClass('tabledrag-hide'); } } }); } } + + // Now hide cells and reduce colspans unless cookie indicates previous choice. + // Set a cookie if it is not already present. + if ($.cookie('Drupal.tableDrag.showWeight') === null) { + $.cookie('Drupal.tableDrag.showWeight', 0, { + path: Drupal.settings.basePath, + // The cookie expires in one year. + expires: 365 + } + ); + this.hideColumns(); + } + // Check cookie value and show/hide weight columns accordingly. + else { + if ($.cookie('Drupal.tableDrag.showWeight') == 1) { + this.showColumns(); + } + else { + this.hideColumns(); + } + } +}; + +/** + * Hide the columns containing weight/parent form elements. + * Undo showColumns(). + */ +Drupal.tableDrag.prototype.hideColumns = function () { + // Hide weight/parent cells and headers. + $('.tabledrag-hide', 'table.tabledrag-processed').css('display', 'none'); + // Show TableDrag handles. + $('.tabledrag-handle', 'table.tabledrag-processed').css('display', ''); + // Reduce the colspan of any effected multi-span columns. + $('.tabledrag-has-colspan', 'table.tabledrag-processed').each(function () { + this.colSpan = this.colSpan - 1; + }); + // Change link text. + $('.tabledrag-toggle-weight').text(Drupal.t('Show row weights')); + // Change cookie. + $.cookie('Drupal.tableDrag.showWeight', 0, { + path: Drupal.settings.basePath, + // The cookie expires in one year. + expires: 365 + } + ); +}; + +/** + * Show the columns containing weight/parent form elements + * Undo hideColumns(). + */ +Drupal.tableDrag.prototype.showColumns = function () { + // Show weight/parent cells and headers. + $('.tabledrag-hide', 'table.tabledrag-processed').css('display', ''); + // Hide TableDrag handles. + $('.tabledrag-handle', 'table.tabledrag-processed').css('display', 'none'); + // Increase the colspan for any columns where it was previously reduced. + $('.tabledrag-has-colspan', 'table.tabledrag-processed').each(function () { + this.colSpan = this.colSpan + 1; + }); + // Change link text. + $('.tabledrag-toggle-weight').text(Drupal.t('Hide row weights')); + // Change cookie. + $.cookie('Drupal.tableDrag.showWeight', 1, { + path: Drupal.settings.basePath, + // The cookie expires in one year. + expires: 365 + } + ); }; /** @@ -442,7 +533,7 @@ // fields in the entire dragged group. for (var group in self.tableSettings) { var rowSettings = self.rowSettings(group, droppedRow); - if (rowSettings.relationship == 'group') { + if (typeof rowSettings != 'undefined' && rowSettings.relationship == 'group') { for (var n in self.rowObject.children) { self.updateField(self.rowObject.children[n], group); } @@ -594,11 +685,11 @@ var rowSettings = this.rowSettings(group, changedRow); // Set the row as it's own target. - if (rowSettings.relationship == 'self' || rowSettings.relationship == 'group') { + if (typeof rowSettings != 'undefined' && (rowSettings.relationship == 'self' || rowSettings.relationship == 'group')) { var sourceRow = changedRow; } // Siblings are easy, check previous and next rows. - else if (rowSettings.relationship == 'sibling') { + else if (typeof rowSettings != 'undefined' && rowSettings.relationship == 'sibling') { var previousRow = $(changedRow).prev('tr').get(0); var nextRow = $(changedRow).next('tr').get(0); var sourceRow = changedRow; @@ -625,7 +716,7 @@ } // Parents, look up the tree until we find a field not in this group. // Go up as many parents as indentations in the changed row. - else if (rowSettings.relationship == 'parent') { + else if (typeof rowSettings != 'undefined' && rowSettings.relationship == 'parent') { var previousRow = $(changedRow).prev('tr'); while (previousRow.length && $('.indentation', previousRow).length >= this.rowObject.indents) { previousRow = previousRow.prev('tr'); @@ -660,8 +751,10 @@ rowSettings.source = rowSettings.target; } - var targetClass = '.' + rowSettings.target; - var targetElement = $(targetClass, changedRow).get(0); + if (typeof rowSettings != 'undefined') { + var targetClass = '.' + rowSettings.target; + var targetElement = $(targetClass, changedRow).get(0); + } // Check if a target element exists in this row. if (targetElement) { Index: modules/block/block.admin.inc =================================================================== RCS file: /cvs/drupal/drupal/modules/block/block.admin.inc,v retrieving revision 1.80 diff -u -p -r1.80 block.admin.inc --- modules/block/block.admin.inc 13 May 2010 07:53:02 -0000 1.80 +++ modules/block/block.admin.inc 1 Jun 2010 16:18:40 -0000 @@ -80,6 +80,8 @@ '#type' => 'weight', '#default_value' => $block['weight'], '#delta' => $weight_delta, + '#title_display' => 'invisible', + '#title' => t('Weight for @row', array('@row' => $block['info'])), ); $form[$key]['region'] = array( '#type' => 'select', Index: modules/field_ui/field_ui.admin.inc =================================================================== RCS file: /cvs/drupal/drupal/modules/field_ui/field_ui.admin.inc,v retrieving revision 1.52 diff -u -p -r1.52 field_ui.admin.inc --- modules/field_ui/field_ui.admin.inc 31 May 2010 18:15:20 -0000 1.52 +++ modules/field_ui/field_ui.admin.inc 9 Jun 2010 18:58:10 -0000 @@ -137,7 +137,9 @@ '#type' => 'textfield', '#default_value' => $weight, '#size' => 3, - ), + '#title_display' => 'invisible', + '#title' => t('Weight for @row', array('@row' => $instance['label'])), + ), 'hidden_name' => array( '#type' => 'hidden', '#default_value' => $instance['field_name'], @@ -159,7 +161,7 @@ $weight = $extra_field['weight']; $form[$name] = array( 'label' => array( - '#markup' => check_plain($extra_field['label']), + '#markup' => $label, ), 'name' => array( '#markup' => $name, @@ -171,6 +173,8 @@ '#type' => 'textfield', '#default_value' => $weight, '#size' => 3, + '#title_display' => 'invisible', + '#title' => t('Weight for @row', array('@row' => $extra_field['label'])), ), 'edit' => array( '#markup' => isset($extra_field['edit']) ? $extra_field['edit'] : '', @@ -226,6 +230,8 @@ '#type' => 'textfield', '#default_value' => $weight, '#size' => 3, + '#title_display' => 'invisible', + '#title' => t('Weight for new field'), ), 'hidden_name' => array( '#type' => 'hidden', @@ -263,6 +269,8 @@ '#type' => 'textfield', '#default_value' => $weight, '#size' => 3, + '#title_display' => 'invisible', + '#title' => t('Weight for added field'), ), 'hidden_name' => array( '#type' => 'hidden', Index: modules/menu/menu.admin.inc =================================================================== RCS file: /cvs/drupal/drupal/modules/menu/menu.admin.inc,v retrieving revision 1.79 diff -u -p -r1.79 menu.admin.inc --- modules/menu/menu.admin.inc 4 May 2010 20:31:53 -0000 1.79 +++ modules/menu/menu.admin.inc 1 Jun 2010 16:18:40 -0000 @@ -106,15 +106,16 @@ '#type' => 'weight', '#delta' => 50, '#default_value' => isset($form_state[$mlid]['weight']) ? $form_state[$mlid]['weight'] : $item['weight'], + '#title_display' => 'invisible', + '#title' => t('Weight for @row', array('@row' => $item['title'])), ); $form[$mlid]['mlid'] = array( '#type' => 'hidden', '#value' => $item['mlid'], ); $form[$mlid]['plid'] = array( - '#type' => 'textfield', + '#type' => 'hidden', '#default_value' => isset($form_state[$mlid]['plid']) ? $form_state[$mlid]['plid'] : $item['plid'], - '#size' => 6, ); // Build a list of operations. $operations = array(); Index: modules/system/system-behavior-rtl.css =================================================================== RCS file: /cvs/drupal/drupal/modules/system/system-behavior-rtl.css,v retrieving revision 1.3 diff -u -p -r1.3 system-behavior-rtl.css --- modules/system/system-behavior-rtl.css 28 Apr 2010 20:08:39 -0000 1.3 +++ modules/system/system-behavior-rtl.css 9 Jun 2010 18:56:48 -0000 @@ -75,6 +75,9 @@ div.tree-child-last { background-position: -65px center; } +.tabledrag-toggle-weight-wrapper { + text-align: left; /* RTL */ +} /** * Multiselect form Index: modules/system/system-behavior.css =================================================================== RCS file: /cvs/drupal/drupal/modules/system/system-behavior.css,v retrieving revision 1.9 diff -u -p -r1.9 system-behavior.css --- modules/system/system-behavior.css 28 Apr 2010 20:08:39 -0000 1.9 +++ modules/system/system-behavior.css 1 Jun 2010 16:18:41 -0000 @@ -130,6 +130,12 @@ div.tree-child-horizontal { background: url(../../misc/tree.png) no-repeat -11px center; } +.tabledrag-toggle-weight-wrapper { + text-align: right; /* LTR */ +} +.tabledrag-toggle-weight { + font-size: 0.9em; +} /** * Progress bar