diff --git includes/common.inc includes/common.inc index 397e522..f3bbe27 100644 --- includes/common.inc +++ includes/common.inc @@ -4271,6 +4271,7 @@ function drupal_add_tabledrag($table_id, $action, $relationship, $group, $subgro // 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; } diff --git misc/farbtastic/Thumbs.db misc/farbtastic/Thumbs.db new file mode 100755 index 0000000..b658297 Binary files /dev/null and misc/farbtastic/Thumbs.db differ diff --git misc/tabledrag.js misc/tabledrag.js index 7220b78..a3b5d9e 100644 --- misc/tabledrag.js +++ misc/tabledrag.js @@ -83,8 +83,29 @@ Drupal.tableDrag = function (table, tableSettings) { // Match immediate children of the parent element to allow nesting. $('> tr.draggable, > tbody > tr.draggable', table).each(function() { self.makeDraggable(this); }); - // Hide columns containing affected form elements. - this.hideColumns(); + // Hide or show weight and parent columns according to user preference. + // This aids screenreader accessibility so users can enter weight values. + // Initialize the weight columns for the show/hide toggle. + self.initColumns(); + + // Retrieve the tableDrag status from a stored cookie. + var show = $.cookie('Drupal.tableDrag.showWeight'); + var displayShow = Drupal.t('Show weight'); + + if (show == 1) { + displayShow = Drupal.t('Hide weight'); + } + + // Add a link before the table for users to show or hide weight columns. + $(table).before($('') + .append(displayShow) + .click(function () { + self.toggleShowWeight(self); + return false; + }) + .wrap('
') + .parent() + ); // 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 +114,12 @@ Drupal.tableDrag = function (table, tableSettings) { }; /** - * Hide the columns containing form elements according to the settings for - * this tableDrag instance. + * Initialize weight/parent columns to be hidden by default. + * + * 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 '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,7 +131,7 @@ Drupal.tableDrag.prototype.hideColumns = function () { } } - // 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. @@ -128,21 +151,90 @@ Drupal.tableDrag.prototype.hideColumns = function () { 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-reduce-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 user cookie is set. + var show = $.cookie('Drupal.tableDrag.showWeight'); + if (show != 1) { + $.cookie('Drupal.tableDrag.showWeight', 0, { + path: Drupal.settings.basePath, + // The cookie should "never" expire. + expires: 36500 + } + ); + Drupal.tableDrag.prototype.hideColumns(); + } + else { + Drupal.tableDrag.prototype.showColumns(); + } }; /** + * Hide the columns containing weight/parent form elements. + * Undo showColumns(). + */ +Drupal.tableDrag.prototype.hideColumns = function () { + // Turn off display of weight/parent cells and headers. + $('.tabledrag-hide').css('display', 'none'); + // Reduce colspan of any effected multi-span columns. + $('.tabledrag-reduce-colspan').each(function() { this.colSpan = this.colSpan - 1; }); + $('.tabledrag-handle').css('display', ''); +} + +/** + * Show the columns containing weight/parent form elements + * Undo hideColumns(). + */ +Drupal.tableDrag.prototype.showColumns = function () { + // Increase colspan back to columns it was reduced. + $('.tabledrag-reduce-colspan').each(function() { this.colSpan = this.colSpan + 1; }); + // Turn on display of weight/parent cells and headers. + $('.tabledrag-hide').css('display', ''); + $('.tabledrag-handle').css('display', 'none'); +} + +/** + * Toggle visibility of weight/parent columns. Use a saved cookie to store the + * user preference. + */ +Drupal.tableDrag.prototype.toggleShowWeight = function (self) { + // Retrieve the tableDrag status from a stored cookie. + var show = $.cookie('Drupal.tableDrag.showWeight'); + + // Show or hide columns with weight fields and toggle the cookie value. + if (show == 1) { + $.cookie('Drupal.tableDrag.showWeight', 0, { + path: Drupal.settings.basePath, + // The cookie should "never" expire. + expires: 36500 + } + ); + this.hideColumns(); + $('#toggle-weight').text(Drupal.t('Show weight')); + } + else { + $.cookie('Drupal.tableDrag.showWeight', 1, { + path: Drupal.settings.basePath, + // The cookie should "never" expire. + expires: 36500 + } + ); + this.showColumns(); + $('#toggle-weight').text(Drupal.t('Hide weight')); + } +} + +/** * Find the target used within a particular row and group. */ Drupal.tableDrag.prototype.rowSettings = function (group, row) { @@ -442,7 +534,7 @@ Drupal.tableDrag.prototype.dropRow = function (event, self) { // fields in the entire dragged group. for (var group in self.tableSettings) { var rowSettings = self.rowSettings(group, droppedRow); - if (rowSettings.relationship == 'group') { + if (rowSettings !== undefined && rowSettings.relationship == 'group') { for (var n in self.rowObject.children) { self.updateField(self.rowObject.children[n], group); } @@ -594,11 +686,11 @@ Drupal.tableDrag.prototype.updateField = function (changedRow, group) { var rowSettings = this.rowSettings(group, changedRow); // Set the row as it's own target. - if (rowSettings.relationship == 'self' || rowSettings.relationship == 'group') { + if (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 (rowSettings !== undefined && rowSettings.relationship == 'sibling') { var previousRow = $(changedRow).prev('tr').get(0); var nextRow = $(changedRow).next('tr').get(0); var sourceRow = changedRow; @@ -625,7 +717,7 @@ Drupal.tableDrag.prototype.updateField = function (changedRow, group) { } // 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 (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 +752,10 @@ Drupal.tableDrag.prototype.updateField = function (changedRow, group) { rowSettings.source = rowSettings.target; } - var targetClass = '.' + rowSettings.target; - var targetElement = $(targetClass, changedRow).get(0); + if(rowSettings !== undefined) { + var targetClass = '.' + rowSettings.target; + var targetElement = $(targetClass, changedRow).get(0); + } // Check if a target element exists in this row. if (targetElement) { diff --git modules/block/block.admin.inc modules/block/block.admin.inc index d07f06e..1a744d8 100644 --- modules/block/block.admin.inc +++ modules/block/block.admin.inc @@ -80,6 +80,8 @@ function block_admin_display_form($form, &$form_state, $blocks, $theme) { '#type' => 'weight', '#default_value' => $block['weight'], '#delta' => $weight_delta, + '#title_display' => 'invisible', + '#title' => t('Weight for') . ' ' . check_plain($block['info']), ); $form[$key]['region'] = array( '#type' => 'select', diff --git modules/field_ui/field_ui.admin.inc modules/field_ui/field_ui.admin.inc index 629abcc..5daea83 100644 --- modules/field_ui/field_ui.admin.inc +++ modules/field_ui/field_ui.admin.inc @@ -137,7 +137,9 @@ function field_ui_field_overview_form($form, &$form_state, $entity_type, $bundle '#type' => 'textfield', '#default_value' => $weight, '#size' => 3, - ), + '#title_display' => 'invisible', + '#title' => t('Weight for') . ' ' . check_plain($instance['label']), + ), 'hidden_name' => array( '#type' => 'hidden', '#default_value' => $instance['field_name'], diff --git modules/menu/menu.admin.inc modules/menu/menu.admin.inc index 5e391ae..54a3397 100644 --- modules/menu/menu.admin.inc +++ modules/menu/menu.admin.inc @@ -106,13 +106,15 @@ function _menu_overview_tree_form($tree) { '#type' => 'weight', '#delta' => 50, '#default_value' => isset($form_state[$mlid]['weight']) ? $form_state[$mlid]['weight'] : $item['weight'], + '#title_display' => 'invisible', + '#title' => t('Weight for') . ' ' . $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, ); diff --git modules/system/system-behavior-rtl.css modules/system/system-behavior-rtl.css index 06c03fb..7ddfd88 100644 --- modules/system/system-behavior-rtl.css +++ modules/system/system-behavior-rtl.css @@ -75,6 +75,9 @@ div.tree-child, div.tree-child-last { background-position: -65px center; } +.tabledrag-accessibility-wrapper { + text-align: left; /* LTR */ +} /** * Multiselect form diff --git modules/system/system-behavior.css modules/system/system-behavior.css index 14ed433..2422705 100644 --- modules/system/system-behavior.css +++ modules/system/system-behavior.css @@ -130,6 +130,12 @@ div.tree-child-last { div.tree-child-horizontal { background: url(../../misc/tree.png) no-repeat -11px center; } +.tabledrag-accessibility-wrapper { + text-align: right; +} +.tabledrag-accessibility { + font-size: 0.9em; +} /** * Progress bar diff --git sites/default/settings.php sites/default/settings.php new file mode 100644 index 0000000..9e96f03 --- /dev/null +++ sites/default/settings.php @@ -0,0 +1,422 @@ + 'mysql', + * 'database' => 'databasename', + * 'username' => 'username', + * 'password' => 'password', + * 'host' => 'localhost', + * 'port' => 3306, + * ); + * + * The "driver" property indicates what Drupal database driver the + * connection should use. This is usually the same as the name of the + * database type, such as mysql or sqlite, but not always. The other + * properties will vary depending on the driver. For SQLite, you must + * specify a database file name in a directory that is writable by the + * webserver. For most other drivers, you must specify a + * username, password, host, and database name. + * + * Some database engines support transactions. In order to enable + * transaction support for a given database, set the 'transactions' key + * to TRUE. To disable it, set it to FALSE. Note that the default value + * varies by driver. For MySQL, the default is FALSE since MyISAM tables + * do not support transactions. + * + * For each database, you may optionally specify multiple "target" databases. + * A target database allows Drupal to try to send certain queries to a + * different database if it can but fall back to the default connection if not. + * That is useful for master/slave replication, as Drupal may try to connect + * to a slave server when appropriate and if one is not available will simply + * fall back to the single master server. + * + * The general format for the $databases array is as follows: + * + * $databases['default']['default'] = $info_array; + * $databases['default']['slave'][] = $info_array; + * $databases['default']['slave'][] = $info_array; + * $databases['extra']['default'] = $info_array; + * + * In the above example, $info_array is an array of settings described above. + * The first line sets a "default" database that has one master database + * (the second level default). The second and third lines create an array + * of potential slave databases. Drupal will select one at random for a given + * request as needed. The fourth line creates a new database with a name of + * "extra". + * + * For a single database configuration, the following is sufficient: + * + * $databases['default']['default'] = array( + * 'driver' => 'mysql', + * 'database' => 'databasename', + * 'username' => 'username', + * 'password' => 'password', + * 'host' => 'localhost', + * ); + * + * You can optionally set prefixes for some or all database table names + * by using the $db_prefix setting. If a prefix is specified, the table + * name will be prepended with its value. Be sure to use valid database + * characters only, usually alphanumeric and underscore. If no prefixes + * are desired, leave it as an empty string ''. + * + * To have all database names prefixed, set $db_prefix as a string: + * + * $db_prefix = 'main_'; + * + * To provide prefixes for specific tables, set $db_prefix as an array. + * The array's keys are the table names and the values are the prefixes. + * The 'default' element holds the prefix for any tables not specified + * elsewhere in the array. Example: + * + * $db_prefix = array( + * 'default' => 'main_', + * 'users' => 'shared_', + * 'sessions' => 'shared_', + * 'role' => 'shared_', + * 'authmap' => 'shared_', + * ); + * + * You can also use db_prefix as a reference to a schema/database. This maybe + * useful if your Drupal installation exists in a schema that is not the default + * or you want to access several databases from the same code base at the same + * time. + * Example: + * + * $db_prefix = array( + * 'default' => 'main.', + * 'users' => 'shared.', + * 'sessions' => 'shared.', + * 'role' => 'shared.', + * 'authmap' => 'shared.', + * ); + * + * NOTE: MySQL and SQLite's definition of a schema is a database. + * + * Database configuration format: + * $databases['default']['default'] = array( + * 'driver' => 'mysql', + * 'database' => 'databasename', + * 'username' => 'username', + * 'password' => 'password', + * 'host' => 'localhost', + * ); + * $databases['default']['default'] = array( + * 'driver' => 'pgsql', + * 'database' => 'databasename', + * 'username' => 'username', + * 'password' => 'password', + * 'host' => 'localhost', + * ); + * $databases['default']['default'] = array( + * 'driver' => 'sqlite', + * 'database' => '/path/to/databasefilename', + * ); + */ +$databases = array ( + 'default' => + array ( + 'default' => + array ( + 'driver' => 'mysql', + 'database' => 'fresh', + 'username' => 'root', + 'password' => '', + 'host' => 'localhost', + 'port' => '', + ), + ), +); +$db_prefix = ''; + +/** + * Access control for update.php script. + * + * If you are updating your Drupal installation using the update.php script but + * are not logged in using either an account with the "Administer software + * updates" permission or the site maintenance account (the account that was + * created during installation), you will need to modify the access check + * statement below. Change the FALSE to a TRUE to disable the access check. + * After finishing the upgrade, be sure to open this file again and change the + * TRUE back to a FALSE! + */ +$update_free_access = FALSE; + +/** + * Salt for one-time login links and cancel links, form tokens, etc. + * + * This variable will be set to a random value by the installer. All one-time + * login links will be invalidated if the value is changed. Note that this + * variable must have the same value on every web server. If this variable is + * empty, a hash of the serialized database credentials will be used as a + * fallback salt. + * + * For enhanced security, you may set this variable to a value using the + * contents of a file outside your docroot that is never saved together + * with any backups of your Drupal files and database. + * + * Example: + * $drupal_hash_salt = file_get_contents('/home/example/salt.txt'); + * + */ +$drupal_hash_salt = 'HhJxcdLAfUKzdj_8EG5MAWv47Heg8zAeVuelDZjFiBE'; + +/** + * Base URL (optional). + * + * If you are experiencing issues with different site domains, + * uncomment the Base URL statement below (remove the leading hash sign) + * and fill in the absolute URL to your Drupal installation. + * + * You might also want to force users to use a given domain. + * See the .htaccess file for more information. + * + * Examples: + * $base_url = 'http://www.example.com'; + * $base_url = 'http://www.example.com:8888'; + * $base_url = 'http://www.example.com/drupal'; + * $base_url = 'https://www.example.com:8888/drupal'; + * + * It is not allowed to have a trailing slash; Drupal will add it + * for you. + */ +# $base_url = 'http://www.example.com'; // NO trailing slash! + +/** + * PHP settings: + * + * To see what PHP settings are possible, including whether they can be set at + * runtime (by using ini_set()), read the PHP documentation: + * http://www.php.net/manual/en/ini.list.php + * See drupal_initialize_variables() in includes/bootstrap.inc for required + * runtime settings and the .htaccess file for non-runtime settings. Settings + * defined there should not be duplicated here so as to avoid conflict issues. + */ + +/** + * Some distributions of Linux (most notably Debian) ship their PHP + * installations with garbage collection (gc) disabled. Since Drupal depends on + * PHP's garbage collection for clearing sessions, ensure that garbage + * collection occurs by using the most common settings. + */ +ini_set('session.gc_probability', 1); +ini_set('session.gc_divisor', 100); + +/** + * Set session lifetime (in seconds), i.e. the time from the user's last visit + * to the active session may be deleted by the session garbage collector. When + * a session is deleted, authenticated users are logged out, and the contents + * of the user's $_SESSION variable is discarded. + */ +ini_set('session.gc_maxlifetime', 200000); + +/** + * Set session cookie lifetime (in seconds), i.e. the time from the session is + * created to the cookie expires, i.e. when the browser is expected to discard + * the cookie. The value 0 means "until the browser is closed". + */ +ini_set('session.cookie_lifetime', 2000000); + +/** + * Drupal automatically generates a unique session cookie name for each site + * based on on its full domain name. If you have multiple domains pointing at + * the same Drupal site, you can either redirect them all to a single domain + * (see comment in .htaccess), or uncomment the line below and specify their + * shared base domain. Doing so assures that users remain logged in as they + * cross between your various domains. + */ +# $cookie_domain = 'example.com'; + +/** + * Variable overrides: + * + * To override specific entries in the 'variable' table for this site, + * set them here. You usually don't need to use this feature. This is + * useful in a configuration file for a vhost or directory, rather than + * the default settings.php. Any configuration setting from the 'variable' + * table can be given a new value. Note that any values you provide in + * these variable overrides will not be modifiable from the Drupal + * administration interface. + * + * The following overrides are examples: + * - site_name: Defines the site's name. + * - theme_default: Defines the default theme for this site. + * - anonymous: Defines the human-readable name of anonymous users. + * Remove the leading hash signs to enable. + */ +# $conf['site_name'] = 'My Drupal site'; +# $conf['theme_default'] = 'garland'; +# $conf['anonymous'] = 'Visitor'; + +/** + * A custom theme can be set for the offline page. This applies when the site + * is explicitly set to maintenance mode through the administration page or when + * the database is inactive due to an error. It can be set through the + * 'maintenance_theme' key. The template file should also be copied into the + * theme. It is located inside 'modules/system/maintenance-page.tpl.php'. + * Note: This setting does not apply to installation and update pages. + */ +# $conf['maintenance_theme'] = 'garland'; + +/** + * Enable this setting to determine the correct IP address of the remote + * client by examining information stored in the X-Forwarded-For headers. + * X-Forwarded-For headers are a standard mechanism for identifying client + * systems connecting through a reverse proxy server, such as Squid or + * Pound. Reverse proxy servers are often used to enhance the performance + * of heavily visited sites and may also provide other site caching, + * security or encryption benefits. If this Drupal installation operates + * behind a reverse proxy, this setting should be enabled so that correct + * IP address information is captured in Drupal's session management, + * logging, statistics and access management systems; if you are unsure + * about this setting, do not have a reverse proxy, or Drupal operates in + * a shared hosting environment, this setting should remain commented out. + */ +# $conf['reverse_proxy'] = TRUE; + +/** + * Set this value if your proxy server sends the client IP in a header other + * than X-Forwarded-For. + * + * The "X-Forwarded-For" header is a comma+space separated list of IP addresses, + * only the last one (the left-most) will be used. + */ +# $conf['reverse_proxy_header'] = 'HTTP_X_CLUSTER_CLIENT_IP'; + +/** + * reverse_proxy accepts an array of IP addresses. + * + * Each element of this array is the IP address of any of your reverse + * proxies. Filling this array Drupal will trust the information stored + * in the X-Forwarded-For headers only if Remote IP address is one of + * these, that is the request reaches the web server from one of your + * reverse proxies. Otherwise, the client could directly connect to + * your web server spoofing the X-Forwarded-For headers. + */ +# $conf['reverse_proxy_addresses'] = array('a.b.c.d', ...); + +/** + * Page caching: + * + * By default, Drupal sends a "Vary: Cookie" HTTP header for anonymous page + * views. This tells a HTTP proxy that it may return a page from its local + * cache without contacting the web server, if the user sends the same Cookie + * header as the user who originally requested the cached page. Without "Vary: + * Cookie", authenticated users would also be served the anonymous page from + * the cache. If the site has mostly anonymous users except a few known + * editors/administrators, the Vary header can be omitted. This allows for + * better caching in HTTP proxies (including reverse proxies), i.e. even if + * clients send different cookies, they still get content served from the cache + * if aggressive caching is enabled and the minimum cache time is non-zero. + * However, authenticated users should access the site directly (i.e. not use an + * HTTP proxy, and bypass the reverse proxy if one is used) in order to avoid + * getting cached pages from the proxy. + */ +# $conf['omit_vary_cookie'] = TRUE; + +/** + * String overrides: + * + * To override specific strings on your site with or without enabling locale + * module, add an entry to this list. This functionality allows you to change + * a small number of your site's default English language interface strings. + * + * Remove the leading hash signs to enable. + */ +# $conf['locale_custom_strings_en'][''] = array( +# 'forum' => 'Discussion board', +# '@count min' => '@count minutes', +# ); + +/** + * + * IP blocking: + * + * To bypass database queries for denied IP addresses, use this setting. + * Drupal queries the {blocked_ips} table by default on every page request + * for both authenticated and anonymous users. This allows the system to + * block IP addresses from within the administrative interface and before any + * modules are loaded. However on high traffic websites you may want to avoid + * this query, allowing you to bypass database access altogether for anonymous + * users under certain caching configurations. + * + * If using this setting, you will need to add back any IP addresses which + * you may have blocked via the administrative interface. Each element of this + * array represents a blocked IP address. Uncommenting the array and leaving it + * empty will have the effect of disabling IP blocking on your site. + * + * Remove the leading hash signs to enable. + */ +# $conf['blocked_ips'] = array( +# 'a.b.c.d', +# ); + +/** + * Authorized file system operations: + * + * The Update manager module included with Drupal provides a mechanism for + * site administrators to securely install missing updates for the site + * directly through the web user interface by providing either SSH or FTP + * credentials. This allows the site to update the new files as the user who + * owns all the Drupal files, instead of as the user the webserver is running + * as. However, some sites might wish to disable this functionality, and only + * update the code directly via SSH or FTP themselves. This setting completely + * disables all functionality related to these authorized file operations. + * + * Remove the leading hash signs to disable. + */ +# $conf['allow_authorize_operations'] = FALSE;