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/contextual | |
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/contextual')
-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 |
5 files changed, 267 insertions, 0 deletions
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 |