diff options
author | Dries Buytaert <dries@buytaert.net> | 2009-12-06 01:00:27 +0000 |
---|---|---|
committer | Dries Buytaert <dries@buytaert.net> | 2009-12-06 01:00:27 +0000 |
commit | 66f740c58475b84b907326a0e50e4d91c2fc03ee (patch) | |
tree | 9e43dac217331cf78042de4edfefe7b56308086a /modules | |
parent | 882fa0ab33cec0aaa9ebe942cbfe759fcf8f4a4e (diff) | |
download | brdo-66f740c58475b84b907326a0e50e4d91c2fc03ee.tar.gz brdo-66f740c58475b84b907326a0e50e4d91c2fc03ee.tar.bz2 |
- Patch #626286 by sun, David_Rothstein, Rob Loach: make contextual links a module.
Diffstat (limited to 'modules')
-rw-r--r-- | modules/block/block.tpl.php | 2 | ||||
-rw-r--r-- | modules/contextual/contextual.css | 75 | ||||
-rw-r--r-- | modules/contextual/contextual.info | 7 | ||||
-rw-r--r-- | modules/contextual/contextual.js | 42 | ||||
-rw-r--r-- | modules/contextual/contextual.module | 143 | ||||
-rw-r--r-- | modules/contextual/images/cog-select.png | bin | 0 -> 1218 bytes | |||
-rw-r--r-- | modules/node/node.tpl.php | 2 | ||||
-rw-r--r-- | modules/system/system.module | 121 |
8 files changed, 269 insertions, 123 deletions
diff --git a/modules/block/block.tpl.php b/modules/block/block.tpl.php index c77d57e32..beb54687b 100644 --- a/modules/block/block.tpl.php +++ b/modules/block/block.tpl.php @@ -38,7 +38,7 @@ ?> <div id="block-<?php print $block->module . '-' . $block->delta; ?>" class="<?php print $classes; ?>"<?php print $attributes; ?>> -<?php if ($contextual_links): ?> +<?php if (!empty($contextual_links)): ?> <?php print render($contextual_links); ?> <?php endif; ?> diff --git a/modules/contextual/contextual.css b/modules/contextual/contextual.css new file mode 100644 index 000000000..eafc809da --- /dev/null +++ b/modules/contextual/contextual.css @@ -0,0 +1,75 @@ +/* $Id$ */ + +/** + * Contextual links regions. + */ +.contextual-links-region { + outline: none; + position: relative; +} +.contextual-links-region-active { + outline: #999 dashed 1px; +} + +/** + * Contextual links. + */ +div.contextual-links-wrapper { + display: none; + font-size: 90%; + position: absolute; + right: 5px; + top: 0px; + z-index: 999; +} +html.js div.contextual-links-wrapper { + display: block; +} +a.contextual-links-trigger { + background: transparent url(images/cog-select.png) no-repeat center center; + display: none; + height: 20px; + margin-top: 2px; + outline: none; + text-indent: 34px; + width: 30px; + overflow: hidden; +} +a.contextual-links-trigger:hover, +div.contextual-links-active a.contextual-links-trigger { + background-color: #fff; +} +div.contextual-links-wrapper ul.contextual-links { + display: none; + margin: 0; + padding: 5px 10px; + position: absolute; + right: 0; + top: 20px; + white-space: nowrap; +} +.contextual-links-region:hover a.contextual-links-trigger, +div.contextual-links-active a.contextual-links-trigger, +div.contextual-links-active ul.contextual-links { + display: block; +} +ul.contextual-links li { + line-height: 100%; + list-style: none; + list-style-image: none; + margin: 0; + padding: 0; +} +div.contextual-links-wrapper a { + text-decoration: none; +} +ul.contextual-links li a { + background: #fff; + color: #666; + display: block; + margin: 0.5em 0; + padding: 0.3em; +} +ul.contextual-links li a:hover { + text-decoration: underline; +} diff --git a/modules/contextual/contextual.info b/modules/contextual/contextual.info new file mode 100644 index 000000000..71f465bc1 --- /dev/null +++ b/modules/contextual/contextual.info @@ -0,0 +1,7 @@ +; $Id$ +name = Contextual links +description = Provides contextual links to perform actions related to elements on a page. +package = Core +version = VERSION +core = 7.x +files[] = contextual.module diff --git a/modules/contextual/contextual.js b/modules/contextual/contextual.js new file mode 100644 index 000000000..0dfc9ddfa --- /dev/null +++ b/modules/contextual/contextual.js @@ -0,0 +1,42 @@ +// $Id$ +(function ($) { + +Drupal.contextualLinks = Drupal.contextualLinks || {}; + +/** + * Attach outline behavior for regions associated with contextual links. + */ +Drupal.behaviors.contextualLinks = { + attach: function (context) { + $('div.contextual-links-wrapper', context).once('contextual-links', function () { + var $wrapper = $(this); + var $trigger = $('<a class="contextual-links-trigger" href="#" />').text(Drupal.t('Configure')).click( + function () { + $wrapper.find('ul.contextual-links').slideToggle(100); + $wrapper.toggleClass('contextual-links-active'); + return false; + } + ); + $wrapper.prepend($trigger) + .closest('.contextual-links-region').hover(Drupal.contextualLinks.hover, Drupal.contextualLinks.hoverOut); + }); + } +}; + +/** + * Enables outline for the region contextual links are associated with. + */ +Drupal.contextualLinks.hover = function () { + $(this).closest('.contextual-links-region').addClass('contextual-links-region-active'); +}; + +/** + * Disables outline for the region contextual links are associated with. + */ +Drupal.contextualLinks.hoverOut = function () { + $(this).closest('.contextual-links-region').removeClass('contextual-links-region-active') + .find('.contextual-links-active').removeClass('contextual-links-active') + .find('ul.contextual-links').hide(); +}; + +})(jQuery); diff --git a/modules/contextual/contextual.module b/modules/contextual/contextual.module new file mode 100644 index 000000000..f174047be --- /dev/null +++ b/modules/contextual/contextual.module @@ -0,0 +1,143 @@ +<?php +// $Id$ + +/** + * @file + * Adds contextual links to perform actions related to elements on a page. + */ + +/** + * Implements hook_permission(). + */ +function contextual_permission() { + return array( + 'access contextual links' => array( + 'title' => t('Use contextual links'), + 'description' => t('Use contextual links to perform actions related to elements on a page.'), + ), + ); +} + +/** + * Implements hook_library(). + */ +function contextual_library() { + $path = drupal_get_path('module', 'contextual'); + $libraries['contextual-links'] = array( + 'title' => 'Contextual links', + 'website' => 'http://drupal.org/node/473268', + 'version' => '1.0', + 'js' => array( + $path . '/contextual.js' => array(), + ), + 'css' => array( + $path . '/contextual.css' => array(), + ), + ); + return $libraries; +} + +/** + * Template variable preprocessor for contextual links. + * + * @see contextual_links_build() + */ +function contextual_preprocess(&$variables, $hook) { + static $hooks; + + // Initialize the $contextual_links template variable. + $variables['contextual_links'] = array(); + + // Nothing to do here if the user is not permitted to access contextual links. + if (!user_access('access contextual links')) { + return; + } + + if (!isset($hooks)) { + $hooks = theme_get_registry(); + } + + // Determine the primary theme function argument. + if (isset($hooks[$hook]['variables'])) { + $keys = array_keys($hooks[$hook]['variables']); + $key = $keys[0]; + } + else { + $key = $hooks[$hook]['render element']; + } + if (isset($variables[$key])) { + $element = $variables[$key]; + } + + if (isset($element) && is_array($element) && !empty($element['#contextual_links'])) { + $variables['contextual_links'] = contextual_links_build($element); + if (!empty($variables['contextual_links'])) { + $variables['classes_array'][] = 'contextual-links-region'; + } + } +} + +/** + * Build a renderable array for contextual links. + * + * @param $element + * A renderable array containing a #contextual_links property, which is a + * keyed array. Each key is the name of the implementing module, and each + * value is an array that forms the function arguments for + * menu_contextual_links(). For example: + * @code + * array('#contextual_links' => array( + * 'block' => array('admin/structure/block/manage', array('system', 'navigation')), + * 'menu' => array('admin/structure/menu/manage', array('navigation')), + * )) + * @endcode + * + * @return + * A renderable array representing contextual links. + * + * @see menu_contextual_links() + */ +function contextual_links_build($element) { + static $destination; + + // Retrieve contextual menu links. + $items = array(); + foreach ($element['#contextual_links'] as $module => $args) { + $items += menu_contextual_links($module, $args[0], $args[1]); + } + + // Transform contextual links into parameters suitable for theme_link(). + if (!isset($destination)) { + $destination = drupal_get_destination(); + } + + $links = array(); + foreach ($items as $class => $item) { + $class = drupal_html_class($class); + $links[$class] = array( + 'title' => $item['title'], + 'href' => $item['href'], + ); + // @todo theme_links() should *really* use the same parameters as l()... + if (!isset($item['localized_options']['query'])) { + $item['localized_options']['query'] = array(); + } + $item['localized_options']['query'] += $destination; + $links[$class] += $item['localized_options']; + } + $build = array(); + if ($links) { + $build = array( + '#prefix' => '<div class="contextual-links-wrapper">', + '#suffix' => '</div>', + '#theme' => 'links', + '#links' => $links, + '#attributes' => array('class' => array('contextual-links')), + '#attached' => array( + 'library' => array(array('contextual', 'contextual-links')), + ), + ); + } + return $build; +} + diff --git a/modules/contextual/images/cog-select.png b/modules/contextual/images/cog-select.png Binary files differnew file mode 100644 index 000000000..e30217cd9 --- /dev/null +++ b/modules/contextual/images/cog-select.png diff --git a/modules/node/node.tpl.php b/modules/node/node.tpl.php index 34b0c4bf1..6435cdf94 100644 --- a/modules/node/node.tpl.php +++ b/modules/node/node.tpl.php @@ -75,7 +75,7 @@ <?php print $user_picture; ?> - <?php if (!$page && $contextual_links): ?> + <?php if (!$page && !empty($contextual_links)): ?> <?php print render($contextual_links); ?> <?php endif; ?> diff --git a/modules/system/system.module b/modules/system/system.module index aacd5a35c..0493afea2 100644 --- a/modules/system/system.module +++ b/modules/system/system.module @@ -226,10 +226,6 @@ function system_permission() { 'access administration pages' => array( 'title' => t('Use the administration pages and help'), ), - 'access contextual links' => array( - 'title' => t('Use contextual links'), - 'description' => t('Use contextual links to perform actions related to elements on a page.'), - ), 'access site in maintenance mode' => array( 'title' => t('Use the site in maintenance mode'), ), @@ -1102,19 +1098,6 @@ function system_library() { ), ); - // Contextual links. - $libraries['contextual-links'] = array( - 'title' => 'Contextual links', - 'website' => 'http://drupal.org/node/473268', - 'version' => '1.0', - 'js' => array( - 'misc/contextual_links.js' => array(), - ), - 'css' => array( - 'misc/contextual_links.css' => array(), - ), - ); - // Vertical Tabs. $libraries['vertical-tabs'] = array( 'title' => 'Vertical Tabs', @@ -3580,110 +3563,6 @@ function theme_system_settings_form($variables) { } /** - * Template variable preprocessor for contextual links. - * - * @see system_build_contextual_links() - */ -function system_preprocess(&$variables, $hook) { - static $hooks; - - // Initialize the $contextual_links template variable. - $variables['contextual_links'] = array(); - - // Nothing to do here if the user is not permitted to access contextual links. - if (!user_access('access contextual links')) { - return; - } - - if (!isset($hooks)) { - $hooks = theme_get_registry(); - } - - // Determine the primary theme function argument. - if (isset($hooks[$hook]['variables'])) { - $keys = array_keys($hooks[$hook]['variables']); - $key = $keys[0]; - } - else { - $key = $hooks[$hook]['render element']; - } - if (isset($variables[$key])) { - $element = $variables[$key]; - } - - if (isset($element) && is_array($element) && !empty($element['#contextual_links'])) { - $variables['contextual_links'] = system_build_contextual_links($element); - if (!empty($variables['contextual_links'])) { - $variables['classes_array'][] = 'contextual-links-region'; - } - } -} - -/** - * Build a renderable array for contextual links. - * - * @param $element - * A renderable array containing a #contextual_links property, which is a - * keyed array. Each key is the name of the implementing module, and each - * value is an array that forms the function arguments for - * menu_contextual_links(). For example: - * @code - * array('#contextual_links' => array( - * 'block' => array('admin/structure/block/manage', array('system', 'navigation')), - * 'menu' => array('admin/structure/menu/manage', array('navigation')), - * )) - * @endcode - * - * @return - * A renderable array representing contextual links. - * - * @see menu_contextual_links() - */ -function system_build_contextual_links($element) { - static $destination; - - // Retrieve contextual menu links. - $items = array(); - foreach ($element['#contextual_links'] as $module => $args) { - $items += menu_contextual_links($module, $args[0], $args[1]); - } - - // Transform contextual links into parameters suitable for theme_link(). - if (!isset($destination)) { - $destination = drupal_get_destination(); - } - - $links = array(); - foreach ($items as $class => $item) { - $class = drupal_html_class($class); - $links[$class] = array( - 'title' => $item['title'], - 'href' => $item['href'], - ); - // @todo theme_links() should *really* use the same parameters as l()... - if (!isset($item['localized_options']['query'])) { - $item['localized_options']['query'] = array(); - } - $item['localized_options']['query'] += $destination; - $links[$class] += $item['localized_options']; - } - $build = array(); - if ($links) { - $build = array( - '#prefix' => '<div class="contextual-links-wrapper">', - '#suffix' => '</div>', - '#theme' => 'links', - '#links' => $links, - '#attributes' => array('class' => array('contextual-links')), - '#attached' => array( - 'library' => array(array('system', 'contextual-links')), - ), - ); - } - return $build; -} - -/** * Implements hook_admin_paths(). */ function system_admin_paths() { |