Index: includes/menu.inc =================================================================== RCS file: /cvs/drupal/drupal/includes/menu.inc,v retrieving revision 1.353 diff -u -p -r1.353 menu.inc --- includes/menu.inc 15 Oct 2009 14:07:26 -0000 1.353 +++ includes/menu.inc 15 Oct 2009 15:52:41 -0000 @@ -2257,6 +2257,72 @@ function _menu_navigation_links_rebuild( } /** + * Clone an array of menu links. + * + * @param $links + * An array of menu links to clone. + * @param $menu_name + * (optional) The name of a menu that the links will be cloned for. If not + * set, the cloned links will be in the same menu as the original set of + * links that were passed in. + * @return + * An array of menu links with the same properties as the passed-in array, + * but with the link identifiers removed so that a new link will be created + * when any of them is passed in to menu_link_save(). + * + * @see menu_link_save() + */ +function menu_links_clone($links, $menu_name = NULL) { + foreach ($links as &$link) { + unset($link['mlid']); + if (isset($menu_name)) { + $link['menu_name'] = $menu_name; + } + } + return $links; +} + +/** + * Returns an array containing all links for a menu. + * + * @param $menu_name + * The name of the menu whose links should be returned. + * @return + * An array of menu links. + */ +function menu_load_links($menu_name) { + $links = db_select('menu_links', 'ml', array('fetch' => PDO::FETCH_ASSOC)) + ->fields('ml') + ->condition('ml.menu_name', $menu_name) + ->orderBy('weight') + ->execute() + ->fetchAll(); + + foreach ($links as $key => &$link) { + $link['options'] = unserialize($link['options']); + } + return $links; +} + +/** + * Deletes all links for a menu. + * + * @param $menu_name + * The name of the menu whose links will be deleted. + */ +function menu_delete_links($menu_name) { + $links = menu_load_links($menu_name); + foreach ($links as $link) { + // To speed up the deletion process, we reset some link properties that + // would trigger re-parenting logic in _menu_delete_item() and + // _menu_update_parental_status(). + $link['has_children'] = FALSE; + $link['plid'] = 0; + _menu_delete_item($link); + } +} + +/** * Delete one or several menu links. * * @param $mlid Index: modules/shortcut/shortcut.admin.css =================================================================== RCS file: modules/shortcut/shortcut.admin.css diff -N modules/shortcut/shortcut.admin.css --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ modules/shortcut/shortcut.admin.css 15 Oct 2009 15:52:41 -0000 @@ -0,0 +1,14 @@ +/* $Id$ */ + +h4.shortcuts-set, +div.shortcuts-change-set { + display: inline; +} + +.toolbar-slot-hidden { + display: none; +} + +div.form-item-set div.form-item-new { + display: inline; +} Index: modules/shortcut/shortcut.admin.inc =================================================================== RCS file: modules/shortcut/shortcut.admin.inc diff -N modules/shortcut/shortcut.admin.inc --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ modules/shortcut/shortcut.admin.inc 15 Oct 2009 15:52:41 -0000 @@ -0,0 +1,425 @@ + $set) { + $options[$name] = check_plain($set->title); + } + + // Only administrators can add shortcut sets. + $add_access = user_access('administer shortcuts'); + if ($add_access) { + $options['new'] = t('New set'); + } + + $form['account'] = array( + '#type' => 'value', + '#value' => $account, + ); + + $form['set'] = array( + '#type' => 'radios', + '#title' => t('Choose a set'), + '#options' => $options, + '#default_value' => $current_set->set_name, + ); + + $form['new'] = array( + '#type' => 'textfield', + '#description' => t('The new set is created by copying items from the @default set.', array('@default' => $default_set->title)), + '#access' => $add_access, + ); + + $form['submit'] = array( + '#type' => 'submit', + '#value' => t('Save configuration'), + ); + + return $form; +} + +/** + * Submit handler for the form that switches shortcut sets. + */ +function shortcut_set_switch_submit($form, &$form_state) { + global $user; + $account = $form_state['values']['account']; + + if ($form_state['values']['set'] == 'new') { + // Save a new shortcut set with links copied from the default set. + $default_set = shortcut_default_set(); + $set = array( + 'title' => $form_state['values']['new'], + 'links' => menu_links_clone($default_set->links), + ); + shortcut_set_save($set); + $replacements = array( + '%user' => $account->name, + '%set_name' => $set->title, + ); + drupal_set_message($account->uid == $user->uid ? t('A new shortcut set called %set_name was created with the default shortcut items. You are now using this set.', $replacements) : t('%user is now using a new shortcut set called %set_name with the default shortcut items.', $replacements)); + $form_state['redirect'] = 'admin/config/system/shortcut/' . $set->set_name; + } + else { + // Switch to a different shortcut set. + $set = shortcut_set_load($form_state['values']['set']); + $replacements = array( + '%user' => $account->name, + '%set_name' => $set->title, + ); + drupal_set_message($account->uid == $user->uid ? t('You are now using the %set_name shortcut set.', $replacements) : t('%user is now using the %set_name shortcut set.', $replacements)); + } + + // Assign the shortcut set to the provided user account. + shortcut_set_assign_user($set, $account); +} + +/** + * Theme function for the form that switches shortcut sets. + * + * @param $variables + * An associative array containing: + * - form: An array representing the form. + * @return + * A themed HTML string representing the content of the form. + * + * @ingroup themeable + * @see shortcut_set_switch() + */ +function theme_shortcut_set_switch($variables) { + $form = $variables['form']; + drupal_add_css(drupal_get_path('module', 'shortcut') . '/shortcut.admin.css'); + drupal_add_js(drupal_get_path('module', 'shortcut') . '/shortcut.admin.js'); + $form['set']['new']['#title'] = t('New set: !textfield', array('!textfield' => drupal_render($form['new']))); + return drupal_render_children($form); +} + +/** + * Menu callback; Build the form for customizing shortcut sets. + * + * @param $form + * An associative array containing the structure of the form. + * @param $form_state + * An associative array containing the current state of the form. + * @param $shortcut_set + * An array representing the shortcut set which is being edited. + * @return + * An array representing the form definition. + * + * @ingroup forms + * @see shortcut_set_customize_submit() + */ +function shortcut_set_customize($form, &$form_state, $shortcut_set) { + $form['set'] = array( + '#markup' => t('Using set "@set"', array('@set' => $shortcut_set->title)), + '#prefix' => '

', + '#suffix' => '

', + '#weight' => -100, + ); + + $form['change_set'] = array( + '#markup' => l(t('Change set'), 'admin/config/system/shortcut'), + '#prefix' => '
(', + '#suffix' => ')
', + '#weight' => -99, + '#access' => user_access('switch shortcut sets'), + ); + + $form['shortcuts']['#tree'] = TRUE; + $form['shortcuts']['enabled'] = $form['shortcuts']['disabled'] = array(); + foreach ($shortcut_set->links as $link) { + $mlid = $link['mlid']; + $status = $link['hidden'] ? 'disabled' : 'enabled'; + $form['shortcuts'][$status][$mlid]['name']['#markup'] = l($link['link_title'], $link['link_path']); + $form['shortcuts'][$status][$mlid]['weight'] = array( + '#type' => 'weight', + '#title' => t('Weight'), + '#delta' => 50, + '#default_value' => $link['weight'], + '#attributes' => array('class' => array('shortcut-weight')), + ); + $form['shortcuts'][$status][$mlid]['status'] = array( + '#type' => 'select', + '#title' => t('Status'), + '#options' => array('disabled' => t('Disabled'), 'enabled' => t('Enabled')), + '#default_value' => $status, + '#attributes' => array('class' => array('shortcut-status-select')), + ); + + $form['shortcuts'][$status][$mlid]['edit']['#markup'] = l(t('edit'), 'admin/config/system/shortcut/link/' . $mlid); + $form['shortcuts'][$status][$mlid]['delete']['#markup'] = l(t('delete'), 'admin/config/system/shortcut/link/' . $mlid . '/delete'); + } + $form['submit'] = array( + '#type' => 'submit', + '#value' => t('Save Changes'), + ); + + return $form; +} + +/** + * Submit handler for the shortcut set customization form. + */ +function shortcut_set_customize_submit($form, &$form_state) { + foreach ($form_state['values']['shortcuts'] as $status => $links) { + foreach ($links as $mlid => $data) { + $link = menu_link_load($mlid); + $link['hidden'] = $status == 'enabled' ? 0 : 1; + $link['weight'] = $data['weight']; + menu_link_save($link); + } + } +/* +TODO: + // Knock an enabled one out if we have to. + $set = toolbar_set_load(shortcut_max_slots(), TRUE); + // Too many, knock one out. + while (count($set['shortcuts']) >= TOOLBAR_MAX_SLOTS) { + $disable = array_pop($set['shortcuts']); + $disable['status'] = 0; + toolbar_shortcut_save($disable); + } + $largest_weight = -50; + foreach ($set['shortcuts'] as $shortcut) { + $largest_weight = max($shortcut['weight'], $largest_weight); + } + toolbar_shortcut_save(array( + 'sid' => toolbar_current_set(), + 'weight' => $largest_weight + 1, + 'path' => $_GET['link'], + 'name' => $_GET['name'], + 'status' => 1, + )); + drupal_goto('admin/config/system/shortcuts'); +*/ + +} + +/** + * Theme function for the shortcut set customization form. + * + * @param $variables + * An associative array containing: + * - form: An array representing the form. + * @return + * A themed HTML string representing the content of the form. + * + * @ingroup themeable + * @see shortcut_set_customize() + */ +function theme_shortcut_set_customize($variables) { + $form = $variables['form']; + drupal_add_css(drupal_get_path('module', 'shortcut') . '/shortcut.admin.css'); + drupal_add_js(drupal_get_path('module', 'shortcut') . '/shortcut.admin.js'); + $map = array('disabled' => t('Disabled'), 'enabled' => t('Enabled')); + + $rows = array(); + foreach (array('enabled', 'disabled') as $status) { + drupal_add_tabledrag('shortcuts', 'match', 'sibling', 'shortcut-status-select'); + drupal_add_tabledrag('shortcuts', 'order', 'sibling', 'shortcut-weight'); + $rows[] = array( + 'data' => array(array( + 'colspan' => 5, + 'data' => '' . $map[$status] . '', + )), + 'class' => array('toolbar-status', 'toolbar-status-' . $status), + ); + foreach (element_children($form['shortcuts'][$status]) as $key) { + $shortcut = &$form['shortcuts'][$status][$key]; + $row = array(); + $row[] = drupal_render($shortcut['name']); + $row[] = drupal_render($shortcut['weight']); + $row[] = drupal_render($shortcut['status']); + $row[] = drupal_render($shortcut['edit']); + $row[] = drupal_render($shortcut['delete']); + $rows[] = array( + 'data' => $row, + 'class' => array('draggable'), + ); + } + if ($status == 'enabled') { + for ($i = 0; $i < shortcut_max_slots(); $i++) { + $rows['empty-' . $i] = array( + 'data' => array(array( + 'colspan' => 5, + 'data' => '' . t('Empty') . '', + )), + 'class' => array('toolbar-slot-empty'), + ); + } + $count_shortcuts = count(element_children($form['shortcuts'][$status])); + if (!empty($count_shortcuts)) { + for ($i = 0; $i < min($count_shortcuts, shortcut_max_slots()); $i++) { + $rows['empty-' . $i]['class'][] = 'toolbar-slot-hidden'; + } + } + } + } + $header = array(t('Name'), t('Weight'), t('Status'), array('data' => t('Operations'), 'colspan' => 2)); + $output = theme('table', array('header' => $header, 'rows' => $rows, 'attributes' => array('id' => 'shortcuts'))); + $output .= drupal_render($form['submit']); + $output = drupal_render_children($form) . $output; + return $output; +} + + +/** + * Menu callback; Build the form for adding or editing a shortcut link. + * + * @param $form + * An associative array containing the structure of the form. + * @param $form_state + * An associative array containing the current state of the form. + * @param $shortcut_set + * (optional) + * An object representing the shortcut set that the link is assigned to. + * @param $shortcut_link + * (optional) An array representing the link that is being edited. If not + * set, the form will allow a new link to be created. + * @return + * An array representing the form definition. + * + * @ingroup forms + * @see shortcut_link_edit_submit() + */ +function shortcut_link_edit($form, &$form_state, $shortcut_set = NULL, $shortcut_link = NULL) { + if (!isset($shortcut_link)) { + $shortcut_link = array('link_title' => t(''), 'link_path' => ''); + drupal_set_title(t('Add new shortcut')); + } + else { + drupal_set_title(t('Editing @shortcut', array('@shortcut' => $shortcut_link['link_title']))); + } + + $form['link_title'] = array( + '#type' => 'textfield', + '#title' => t('Name'), + '#description' => t('The name of the shortcut.'), + '#size' => 40, + '#maxlength' => 255, + '#default_value' => $shortcut_link['link_title'], + ); + + $form['link_path'] = array( + '#type' => 'textfield', + '#title' => t('Path'), + '#description' => t('The path to the shortcut.'), + '#size' => 40, + '#maxlength' => 255, + '#field_prefix' => url(NULL, array('absolute' => TRUE)) . (variable_get('clean_url', 0) ? '' : '?q='), + '#default_value' => $shortcut_link['link_path'], + ); + + $form['submit'] = array( + '#type' => 'submit', + '#value' => t('Save'), + ); + + $form_state['shortcut_link'] = $shortcut_link; + return $form; +} + +/** + * Submit handler for the shortcut link editing form. + */ +function shortcut_link_edit_submit($form, &$form_state) { + $form_state['shortcut_link'] = array_merge($form_state['shortcut_link'], $form_state['values']); + menu_link_save($form_state['shortcut_link']); + $form_state['redirect'] = 'admin/config/system/shortcut'; +} + +/** + * Menu callback; Build the form for deleting a shortcut link. + * + * @param $form + * An associative array containing the structure of the form. + * @param $form_state + * An associative array containing the current state of the form. + * @param $shortcut_link + * An array representing the link that will be deleted. + * @return + * An array representing the form definition. + * + * @ingroup forms + * @see shortcut_link_delete_submit() + */ +function shortcut_link_delete($form, &$form_state, $shortcut_link) { + // TODO: Copy code here. +} + +/** + * Submit handler for the shortcut link deletion form. + */ +function shortcut_link_delete_submit($form, &$form_state) { + // TODO: Copy code here. +} + +/** + * Menu callback; Creates a new link in the provided shortcut set + * + * After completion, redirects the user back to where they came from. + * + * @param $shortcut_set + * Returned from shortcut_set_load(). + */ +function shortcut_add_link($shortcut_set) { + if (isset($_REQUEST['token']) && drupal_valid_token($_REQUEST['token'], 'shortcut-add-link')) { + $link = array( + 'link_title' => $_GET['name'], + 'link_path' => $_GET['link'], + ); + // Really we should test for a dupe here. + $shortcut_set->links[] = $link; + + if (shortcut_set_save($shortcut_set)) { + drupal_set_message(t('Added a shortcut for %title.', array('%title' => $link['link_title']))); + drupal_goto(); + } + else { + drupal_set_message(t('Unable to add a shortcut for %title.', array('%title' => $link['link_title']))); + } + } +} Index: modules/shortcut/shortcut.admin.js =================================================================== RCS file: modules/shortcut/shortcut.admin.js diff -N modules/shortcut/shortcut.admin.js --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ modules/shortcut/shortcut.admin.js 15 Oct 2009 15:52:41 -0000 @@ -0,0 +1,100 @@ +// $Id$ +(function ($) { + +/** + * Handle the concept of a fixed number of slots. + * + * This behavior is dependent on the tableDrag behavior, since it uses the + * objects initialized in that behavior to update the row. + */ +Drupal.behaviors.shortcutDrag = { + attach: function (context, settings) { + if (Drupal.tableDrag) { + var table = $('table#shortcuts'), + visibleLength = 0, + slots = 0, + tableDrag = Drupal.tableDrag.shortcuts; + $('> tbody > tr, > tr', table) + .filter(':visible') + .filter(':odd').filter('.odd') + .removeClass('odd').addClass('even') + .end().end() + .filter(':even').filter('.even') + .removeClass('even').addClass('odd') + .end().end() + .end() + .filter('.toolbar-slot-empty').each(function(index) { + if ($(this).is(':visible')) { + visibleLength++; + } + slots++; + }); + + // Add a handler for when a row is swapped. + tableDrag.row.prototype.onSwap = function (swappedRow) { + var disabledIndex = $(table).find('tr').index($(table).find('tr.toolbar-status-disabled')) - slots - 2, + count = 0; + $(table).find('tr.toolbar-status-enabled').nextAll().filter(':not(.toolbar-slot-empty)').each(function(index) { + if (index < disabledIndex) { + count++; + } + }); + var total = slots - count; + if (total == -1) { + var disabled = $(table).find('tr.toolbar-status-disabled'); + disabled.after(disabled.prevAll().filter(':not(.toolbar-slot-empty)').get(0)); + } + else if (total != visibleLength) { + if (total > visibleLength) { + // Less slots on screen than needed. + $('.toolbar-slot-empty:hidden:last').show(); + visibleLength++; + } + else { + // More slots on screen than needed. + $('.toolbar-slot-empty:visible:last').hide(); + visibleLength--; + } + } + }; + + // Add a handler so when a row is dropped, update fields dropped into new regions. + tableDrag.onDrop = function () { + // Use "status-message" row instead of "status" row because + // "status-{status_name}-message" is less prone to regexp match errors. + var statusRow = $(this.rowObject.element).prevAll('tr.toolbar-status').get(0); + var statusName = statusRow.className.replace(/([^ ]+[ ]+)*toolbar-status-([^ ]+)([ ]+[^ ]+)*/, '$2'); + var statusField = $('select.shortcut-status-select', this.rowObject.element); + statusField.val(statusName); + return true; + }; + + tableDrag.restripeTable = function () { + // :even and :odd are reversed because jQuery counts from 0 and + // we count from 1, so we're out of sync. + // Match immediate children of the parent element to allow nesting. + $('> tbody > tr:visible, > tr:visible', this.table) + .filter(':odd').filter('.odd') + .removeClass('odd').addClass('even') + .end().end() + .filter(':even').filter('.even') + .removeClass('even').addClass('odd'); + }; + } + } +}; + +/** + * Make it so when you enter text into the "New set" textfield, the + * corresponding radio button gets selected. + */ +Drupal.behaviors.newSet = { + attach: function (context, settings) { + var selectDefault = function() { + $($(this).parents('div.form-item').get(1)).find('> label > input').attr('checked', 'checked'); + }; + $('div.form-item-new input').focus(selectDefault).keyup(selectDefault); + } +}; + +})(jQuery); Index: modules/shortcut/shortcut.api.php =================================================================== RCS file: modules/shortcut/shortcut.api.php diff -N modules/shortcut/shortcut.api.php --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ modules/shortcut/shortcut.api.php 15 Oct 2009 15:52:41 -0000 @@ -0,0 +1,40 @@ +roles)) { + return variable_get('mymodule_admin_shortcut_default_set_name'); + } +} + +/** + * @} End of "addtogroup hooks". + */ Index: modules/shortcut/shortcut.css =================================================================== RCS file: modules/shortcut/shortcut.css diff -N modules/shortcut/shortcut.css --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ modules/shortcut/shortcut.css 15 Oct 2009 15:52:41 -0000 @@ -0,0 +1,75 @@ +/* $Id$ */ +div#toolbar a#toolbar-customize { + float: right; +} + +div#toolbar div.toolbar-shortcuts ul { + padding: 5px 0; + height: 40px; + line-height: 30px; + overflow: hidden; + float: left; + margin-left:5px; +} + +div#toolbar div.toolbar-shortcuts ul li a { + -moz-border-radius: 5px; + -webkit-border-radius: 5px; + padding: 5px 10px 5px 5px; + margin-right: 5px; +} + +div#toolbar div.toolbar-shortcuts ul li a:focus, +div#toolbar div.toolbar-shortcuts ul li a:hover, +div#toolbar div.toolbar-shortcuts ul li a.active:focus { + background: #555; +} + +div#toolbar div.toolbar-shortcuts ul li a.active:hover, +div#toolbar div.toolbar-shortcuts ul li a.active { + background: url(../toolbar/toolbar.png) 0 -20px repeat-x; +} + +div#toolbar div.toolbar-shortcuts span.icon { + float: left; + background: #444; + width: 30px; + height: 30px; + margin-right: 5px; + -moz-border-radius: 5px; + -webkit-border-radius: 5px; +} + +div.toolbar-add-to-shortcuts a span.icon { + display: block; + width: 12px; + background: url(../toolbar/toolbar.png) no-repeat -50px -60px; + height: 12px; + float: left; + margin-left:8px; +} + +div.toolbar-add-to-shortcuts a:hover span.icon { + background-position: -50px -72px; +} + +div.toolbar-add-to-shortcuts a span.text { + float: left; + padding-left:10px; + display: none; +} + +div.toolbar-add-to-shortcuts a:hover span.text { + font-size: 10px; + line-height: 12px; + color: #fff; + background-color: #5f605b; + display: block; + padding-right: 6px; + cursor: pointer; + -moz-border-radius-topright: 5px; + -moz-border-radius-bottomright: 5px; + -webkit-border-top-right-radius: 5px; + -webkit-border-bottom-right-radius: 5px; +} + Index: modules/shortcut/shortcut.info =================================================================== RCS file: modules/shortcut/shortcut.info diff -N modules/shortcut/shortcut.info --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ modules/shortcut/shortcut.info 15 Oct 2009 15:52:41 -0000 @@ -0,0 +1,9 @@ +; $Id$ +name = Shortcut +description = Allows users to manage customizable lists of shortcut links. +package = Core +version = VERSION +core = 7.x +files[] = shortcut.module +files[] = shortcut.admin.inc +files[] = shortcut.install Index: modules/shortcut/shortcut.install =================================================================== RCS file: modules/shortcut/shortcut.install diff -N modules/shortcut/shortcut.install --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ modules/shortcut/shortcut.install 15 Oct 2009 15:52:41 -0000 @@ -0,0 +1,109 @@ +title = $t('Default'); + $shortcut_set->links = array( + array( + 'link_path' => 'node/add', + 'link_title' => $t('Add content'), + 'weight' => -20, + ), + array( + 'link_path' => 'admin/content', + 'link_title' => $t('Find content'), + 'weight' => -19, + ), + array( + 'link_path' => 'admin/dashboard', + 'link_title' => $t('Dashboard'), + 'weight' => -18, + ), + ); + shortcut_set_save($shortcut_set); +} + +/** + * Implement hook_uninstall(). + */ +function shortcut_uninstall() { + // Delete the menu links associated with each shortcut set. + foreach (shortcut_sets() as $shortcut_set) { + menu_delete_links($shortcut_set['set_name']); + } +} + +/** + * Implement hook_schema(). + */ +function shortcut_schema() { + $schema['shortcut_set'] = array( + 'description' => 'Stores information about sets of shortcuts links.', + 'fields' => array( + 'set_name' => array( + 'type' => 'varchar', + 'length' => 32, + 'not null' => TRUE, + 'default' => '', + 'description' => "Primary Key: The {menu_links}.menu_name under which the set's links are stored.", + ), + 'title' => array( + 'type' => 'varchar', + 'length' => 255, + 'not null' => TRUE, + 'default' => '', + 'description' => 'The title of the set.', + ), + ), + 'primary key' => array('set_name'), + 'foreign keys' => array( + 'set_name' => array('menu_links' => 'menu_name'), + ), + ); + + $schema['shortcut_set_users'] = array( + 'description' => 'Maps users to shortcut sets.', + 'fields' => array( + 'uid' => array( + 'type' => 'int', + 'unsigned' => TRUE, + 'not null' => TRUE, + 'default' => 0, + 'description' => 'The {users}.uid for this set.', + ), + 'set_name' => array( + 'type' => 'varchar', + 'length' => 32, + 'not null' => TRUE, + 'default' => '', + 'description' => "The {shortcut_set}.set_name that will be displayed for this user.", + ), + ), + 'primary key' => array('uid'), + 'indexes' => array( + 'set_name' => array('set_name'), + ), + 'foreign keys' => array( + 'uid' => array('users' => 'uid'), + 'set_name' => array('shortcut_set' => 'set_name'), + ), + ); + + return $schema; +} Index: modules/shortcut/shortcut.module =================================================================== RCS file: modules/shortcut/shortcut.module diff -N modules/shortcut/shortcut.module --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ modules/shortcut/shortcut.module 15 Oct 2009 15:52:41 -0000 @@ -0,0 +1,471 @@ + array( + 'title' => t('Administer shortcuts'), + 'description' => t('Manage shortcuts and shortcut sets regardless of which user they are assigned to.'), + ), + 'customize shortcut links' => array( + 'title' => t('Customize shortcut links'), + 'description' => t("Edit, add and delete the links in the user's currently displayed shortcut set."), + ), + 'switch shortcut sets' => array( + 'title' => t('Choose a different shortcut set'), + 'description' => t('Choose which set of shortcuts are displayed for the user.') + ), + ); +} + +/** + * Implement hook_menu(). + */ +function shortcut_menu() { + $items['admin/config/system/shortcut'] = array( + 'title' => 'Shortcuts', + 'description' => 'List the available shortcut sets and switch between them.', + 'page callback' => 'drupal_get_form', + 'page arguments' => array('shortcut_set_switch'), + 'access arguments' => array('administer shortcuts'), + 'file' => 'shortcut.admin.inc', + ); + $items['admin/config/system/shortcut/%shortcut_set'] = array( + 'title' => 'Customize shortcuts', + 'page callback' => 'drupal_get_form', + 'page arguments' => array('shortcut_set_customize', 4), + 'access callback' => 'shortcut_set_access', + 'access arguments' => array(4), + 'type' => MENU_CALLBACK, + 'file' => 'shortcut.admin.inc', + ); + $items['admin/config/system/shortcut/%shortcut_set/add-link'] = array( + 'title' => 'Add shortcut', + 'page callback' => 'shortcut_link_edit', + 'page arguments' => array(4), + 'access callback' => 'shortcut_set_access', + 'access arguments' => array(4), + 'type' => MENU_LOCAL_ACTION, + 'file' => 'shortcut.admin.inc', + ); + $items['admin/config/system/shortcut/%shortcut_set/add-link-inline'] = array( + 'title' => 'Add shortcut', + 'page callback' => 'shortcut_add_link', + 'page arguments' => array(4), + 'access callback' => 'shortcut_set_access', + 'access arguments' => array(4), + 'type' => MENU_CALLBACK, + 'file' => 'shortcut.admin.inc', + ); + $items['admin/config/system/shortcut/link/%menu_link'] = array( + 'title' => 'Edit shortcut', + 'page callback' => 'drupal_get_form', + 'page arguments' => array('shortcut_link_edit', NULL, 5), + 'access callback' => 'shortcut_set_access', + 'access arguments' => array(4), + 'type' => MENU_CALLBACK, + 'file' => 'shortcut.admin.inc', + ); + $items['admin/config/system/shortcut/link/%menu_link/delete'] = array( + 'title' => 'Delete shortcut', + 'page callback' => 'drupal_get_form', + 'page arguments' => array('shortcut_link_delete', 5), + 'access callback' => 'shortcut_set_access', + 'access arguments' => array(4), + 'type' => MENU_CALLBACK, + 'file' => 'shortcut.admin.inc', + ); + $items['user/%user/shortcuts'] = array( + 'title' => 'Shortcuts', + 'page callback' => 'drupal_get_form', + 'page arguments' => array('shortcut_set_switch', 1), + 'access callback' => 'shortcut_switch_access', + 'access arguments' => array(1), + 'type' => MENU_LOCAL_TASK, + 'file' => 'shortcut.admin.inc', + ); + return $items; +} + +/** + * Implement hook_theme(). + */ +function shortcut_theme() { + return array( + 'shortcut_set_switch' => array( + 'arguments' => array('form' => NULL), + 'file' => 'shortcut.admin.inc', + ), + 'shortcut_set_customize' => array( + 'arguments' => array('form' => NULL), + 'file' => 'shortcut.admin.inc', + ), + ); +} + +/** + * Implement hook_block_info(). + */ +function shortcut_block_info() { + $blocks['shortcuts']['info'] = t('Shortcuts'); + // Shortcut blocks can't be cached because each menu item can have a custom + // access callback. menu.inc manages its own caching. + $blocks['shortcuts']['cache'] = DRUPAL_NO_CACHE; + return $blocks; +} + +/** + * Implement hook_block_view(). + */ +function shortcut_block_view($delta = '') { + if ($delta == 'shortcuts') { + $shortcut_set = shortcut_current_displayed_set(); + $data['subject'] = t('@shortcut_set shortcuts', array('@shortcut_set' => $shortcut_set->title)); + $data['content'] = shortcut_renderable_links($shortcut_set); + return $data; + } +} + +/** + * Access callback for editing a shortcut set. + */ +function shortcut_set_access($shortcut_set) { + // Sufficiently-privileged users can edit their currently displayed shortcut + // set, but not other sets. Shortcut administrators can edit any set. + return user_access('administer shortcuts') || (user_access('customize shortcut links') && ($current_set = shortcut_current_displayed_set()) && $current_set->set_name == $shortcut_set->set_name); +} + +/** + * Access callback for switching the shortcut set assigned to a user account. + */ +function shortcut_switch_access($account) { + global $user; + // Sufficiently-privileged users can switch their own shortcut sets, but not + // those of other users. Shortcut administrators can switch any user's set. + return user_access('administer shortcuts') || (user_access('switch shortcut sets') && $user->uid == $account->uid); +} + +/** + * Loads the data for a shortcut set. + * + * @param $set_name + * The name of the shortcut set to load. + * @return + * If the shortcut set exists, a StdClass containing the following properties: + * - 'set_name': The internal name of the shortcut set. + * - 'title': The title of the shortcut set. + * - 'links': An array of links associated with this shortcut set. + * If the shortcut set does not exist, the function returns FALSE. + */ +function shortcut_set_load($set_name) { + $set = db_query("SELECT * FROM {shortcut_set} WHERE set_name = :set_name", array(':set_name' => $set_name))->fetchObject(); + if (!$set) { + return FALSE; + } + $set->links = menu_load_links($set_name); + return $set; +} + +/** + * Saves a shortcut set. + * + * @param $shortcut_set + * An object containing the following properties: + * - 'title': The title of the shortcut set. + * - 'set_name': (optional) The internal name of the shortcut set. If + * omitted, a new shortcut set will be created, and the 'set_name' key + * will be added to the passed-in array. + * - 'links': (optional) An array of menu links to save for the shortcut set. + * Each link is an array containing at least the following keys (which will + * be expanded to fill in other default values after the shortcut set is + * saved): + * - 'link_path': The Drupal path or external path that the link points to. + * - 'link_title': The title of the link. + * Any other keys accepted by menu_link_save() may also be provided. + * @return + * A constant which is either SAVED_NEW or SAVED_UPDATED depending on whether + * a new set was created or an existing one was updated. + * + * @see menu_link_save() + */ +function shortcut_set_save(&$shortcut_set) { + // First save the shortcut set itself. + if (isset($shortcut_set->set_name)) { + $return = drupal_write_record('shortcut_set', $shortcut_set, 'set_name'); + } + else { + $shortcut_set->set_name = shortcut_set_get_unique_name(); + $return = drupal_write_record('shortcut_set', $shortcut_set); + } + // If links were provided for the set, save them, replacing any that were + // there before. + if (isset($shortcut_set->links)) { + menu_delete_links($shortcut_set->set_name); + foreach ($shortcut_set->links as &$link) { + // Do not specifically associate these links with the shortcut module, + // since other modules may make them editable via the menu system. + // However, we do need to specify the correct menu name. + $link['menu_name'] = $shortcut_set->set_name; + menu_link_save($link); + } + // Make sure that we have a return value, since if the links were updated + // but the shortcut set was not, the call to drupal_write_record() above + // would not return an indication that anything had changed. + if (empty($return)) { + $return = SAVED_UPDATED; + } + } + return $return; +} + +/** + * Deletes a shortcut set. + * + * Note that the default set cannot be deleted. + * + * @param $shortcut_set + * An array representing the shortcut set to delete. + * @return + * TRUE if the set was deleted, FALSE otherwise. + */ +function shortcut_set_delete($shortcut_set) { + // Make sure not to delete the default set. + $default_set = shortcut_default_set(); + if ($shortcut_set->set_name == $default_set->set_name) { + return FALSE; + } + // First, delete any user assignments for this set, so that each of these + // users will go back to using whatever default set applies. + db_delete('shortcut_set_users') + ->condition('set_name', $shortcut_set->set_name) + ->execute(); + // Next, delete the menu links for this set. + menu_delete_links($shortcut_set->set_name); + // Finally, delete the set itself. + $deleted = db_delete('shortcut_set') + ->condition('set_name', $shortcut_set->set_name) + ->execute(); + return (bool) $deleted; +} + +/** + * Assign a user to a particular shortcut set. + * + * @param $shortcut_set + * An array representing the shortcut set. + * @param $account + * A user account that will be assigned to use the set. + */ +function shortcut_set_assign_user($shortcut_set, $account) { + db_merge('shortcut_set_users') + ->key(array('uid' => $account->uid)) + ->fields(array('set_name' => $shortcut_set->set_name)) + ->execute(); +} + +/** + * Unassign a user from any shortcut set they may have been assigned to. + * + * The user will go back to using whatever default set applies. + * + * @param $account + * A user account that will be removed from the shortcut set assignment. + * @return + * TRUE if the user was previously assigned to a shortcut set and has been + * successfully removed from it. FALSE if the user was already not assigned + * to any set. + */ +function shortcut_set_unassign_user($account) { + $deleted = db_delete('shortcut_set') + ->condition('uid', $account->uid) + ->execute(); + return (bool) $deleted; +} + +/** + * Returns the current displayed shortcut set for the provided user account. + * + * @param $account + * (optional) The user account whose shortcuts will be returned. Defaults to + * the current logged-in user. + * @return + * An array representing the shortcut set that should be displayed to the + * current user. If the user does not have an explicit shortcut set defined, + * the default set is returned. + */ +function shortcut_current_displayed_set($account = NULL) { + $shortcut_sets = &drupal_static(__FUNCTION__, array()); + global $user; + if (!isset($account)) { + $account = $user; + } + // Try to return a shortcut set from the static cache. + if (isset($shortcut_sets[$account->uid])) { + return $shortcut_sets[$account->uid]; + } + // If none was found, try to find a shortcut set that is explicitly assigned + // to this user. + $query = db_select('shortcut_set', 's'); + $query->fields('s'); + $query->join('shortcut_set_users', 'u', 's.set_name = u.set_name'); + $query->condition('u.uid', $account->uid); + $shortcut_set = $query->execute()->fetchObject(); + // Otherwise, use the default set. + if (!$shortcut_set) { + $shortcut_set = shortcut_default_set($account); + } + $shortcut_sets[$account->uid] = $shortcut_set; + return $shortcut_set; +} + +/** + * Returns the default shortcut set for a given user account. + * + * @param $account + * (optional) The user account whose shortcuts will be returned. Defaults to + * the current logged-in user. + * @return + * An array representing the default shortcut set. + */ +function shortcut_default_set($account = NULL) { + global $user; + if (!isset($account)) { + $account = $user; + } + // Allow modules to return a default shortcut set name. Since we can only + // have one, we take the first valid result we get. If we don't find one, + // fall back on the site-wide default. + $shortcut_set_names = array_merge(module_invoke_all('shortcut_default_set_name', $account), array(SHORTCUT_DEFAULT_SET_NAME)); + foreach ($shortcut_set_names as $name) { + if ($shortcut_set = shortcut_set_load($name)) { + break; + } + } + return $shortcut_set; +} + +/** + * Returns a unique, machine-readable shortcut set name. + */ +function shortcut_set_get_unique_name() { + // Shortcut sets are numbered sequentially, so we keep trying until we find + // one that is available. For better performance, we start with a number + // equal to one more than the current number of shortcut sets, so that if + // no shortcut sets have been deleted from the database, this will + // automatically give us the correct one. + $number = db_query("SELECT COUNT(*) FROM {shortcut_set}")->fetchField() + 1; + do { + $name = shortcut_set_name($number); + $number++; + } while ($shortcut_set = shortcut_set_load($name)); + return $name; +} + +/** + * Returns the name of a shortcut set, based on a provided number. + * + * All shortcut sets have names like "shortcut-set-N" so that they can be + * matched with a properly-namespaced entry in the {menu_links} table. + * + * @param $number + * A number representing the shortcut set whose name should be retrieved. + * @return + * A string representing the expected shortcut name. + */ +function shortcut_set_name($number) { + return "shortcut-set-$number"; +} + +/** + * Returns an array of all shortcut sets, keyed by the set name. + */ +function shortcut_sets() { + return db_query("SELECT * FROM {shortcut_set}")->fetchAllAssoc('set_name'); +} + +/** + * Returns an array of shortcut links, suitable for rendering. + * + * @param $shortcut_set + * (optional) An array representing the set whose links will be displayed. + * If not provided, the user's current set will be displayed. + * @return + * An array of shortcut links, in the format returned by the menu system. + * + * @see menu_tree() + */ +function shortcut_renderable_links($shortcut_set = NULL) { + if (!isset($shortcut_set)) { + $shortcut_set = shortcut_current_displayed_set(); + } + return menu_tree($shortcut_set->set_name); +} + +/** + * Implement hook_page_build(). + */ +function shortcut_page_build(&$page) { + if (user_access('customize shortcut links')) { + // $_GET['q'] is the unaliased version. + $get = $_GET; + unset($get['q']); + $link = $_GET['q']; + if (!empty($get)) { + $link .= '?' . drupal_http_build_query($get); + } + $query = array( + 'link' => $link, + 'name' => drupal_get_title(), + 'token' => drupal_get_token('shortcut-add-link'), + ); + $query += drupal_get_destination(); + + $shortcut_set = shortcut_current_displayed_set(); + + $page['add_to_shortcuts'] = array( + '#prefix' => '
', + '#markup' => l('' . t('Add to %shortcut_set shortcuts', array('%shortcut_set' => $shortcut_set->title)) . '', 'admin/config/system/shortcut/' . $shortcut_set->set_name . '/add-link-inline', array('query' => $query, 'html' => TRUE)), + '#suffix' => '
', + ); + } + + $links = shortcut_renderable_links(); + $links['#attached'] = array('css' => array(drupal_get_path('module', 'shortcut') . '/shortcut.css')); + $links['#prefix'] = '
'; + $links['#suffix'] = '
'; + $configure_link = array('#markup' => l(t('edit shortcuts'), 'admin/config/system/shortcut/' . $shortcut_set->set_name, array('attributes' => array('id' => 'toolbar-customize')))); + + $drawrer = array ( + 'shortcuts' => $links, + 'configure' => $configure_link, + ); + + + + $page['toolbar_drawer'] = $drawrer; +} + +/** + * Implement hook_preprocess_page(). + */ +function shortcut_preprocess_page(&$vars) { + if (user_access('customize toolbar shortcuts')) { + $vars['add_to_shortcuts'] = drupal_render($vars['page']['add_to_shortcuts']); + } +} Index: modules/menu/menu.module =================================================================== RCS file: /cvs/drupal/drupal/modules/menu/menu.module,v retrieving revision 1.209 diff -u -p -r1.209 menu.module --- modules/menu/menu.module 13 Oct 2009 01:24:07 -0000 1.209 +++ modules/menu/menu.module 15 Oct 2009 15:52:41 -0000 @@ -271,21 +271,13 @@ function menu_save($menu) { * * @see menu_load() * - * _menu_delete_item() will take care of clearing the page cache. Other modules + * menu_delete_links() will take care of clearing the page cache. Other modules * should take care of their menu-related data by implementing * hook_menu_delete(). */ function menu_delete($menu) { // Delete all links from the menu. - $links = db_query("SELECT * FROM {menu_links} WHERE menu_name = :menu_name", array(':menu_name' => $menu['menu_name'])); - foreach ($links as $link) { - // To speed up the deletion process, we reset some link properties that - // would trigger re-parenting logic in _menu_delete_item() and - // _menu_update_parental_status(). - $link['has_children'] = FALSE; - $link['plid'] = 0; - _menu_delete_item($link); - } + menu_delete_links($menu['menu_name']); // Delete the custom menu. db_delete('menu_custom') Index: modules/toolbar/toolbar.css =================================================================== RCS file: /cvs/drupal/drupal/modules/toolbar/toolbar.css,v retrieving revision 1.4 diff -u -p -r1.4 toolbar.css --- modules/toolbar/toolbar.css 15 Sep 2009 03:38:06 -0000 1.4 +++ modules/toolbar/toolbar.css 15 Oct 2009 15:52:41 -0000 @@ -4,7 +4,7 @@ body.toolbar { padding-top: 30px; } -body.toolbar-shortcuts { +body.toolbar-drawer { padding-top: 80px; } @@ -118,49 +118,13 @@ div#toolbar div.toolbar-menu ul li a.act } /** - * Administration shortcuts. + * Collapsed drawer of additional toolbar content. */ -div#toolbar div.toolbar-shortcuts { +div#toolbar div.toolbar-drawer { position: relative; padding: 0 10px; } -div#toolbar div.toolbar-shortcuts ul { - padding: 5px 0; - height: 40px; - line-height: 30px; - overflow: hidden; - float: left; -} - -div#toolbar div.toolbar-shortcuts ul li a { - -moz-border-radius: 5px; - -webkit-border-radius: 5px; - padding: 5px 10px 5px 5px; - margin-right: 5px; -} - -div#toolbar div.toolbar-shortcuts ul li a:focus, -div#toolbar div.toolbar-shortcuts ul li a:hover, -div#toolbar div.toolbar-shortcuts ul li a.active:focus { - background: #555; -} - -div#toolbar div.toolbar-shortcuts ul li a.active:hover, -div#toolbar div.toolbar-shortcuts ul li a.active { - background: url(toolbar.png) 0 -20px repeat-x; -} - -div#toolbar div.toolbar-shortcuts span.icon { - float: left; - background: #444; - width: 30px; - height: 30px; - margin-right: 5px; - -moz-border-radius: 5px; - -webkit-border-radius: 5px; -} - /** * IE 6 Fixes. * @@ -168,7 +132,7 @@ div#toolbar div.toolbar-shortcuts span.i * the behavior of the admin toolbar entirely to static positioning. */ * html body.toolbar, -* html body.toolbar-shortcuts { +* html body.toolbar-drawer { padding-top: 0; } Index: modules/toolbar/toolbar.info =================================================================== RCS file: /cvs/drupal/drupal/modules/toolbar/toolbar.info,v retrieving revision 1.2 diff -u -p -r1.2 toolbar.info --- modules/toolbar/toolbar.info 6 Jul 2009 13:54:21 -0000 1.2 +++ modules/toolbar/toolbar.info 15 Oct 2009 15:52:41 -0000 @@ -1,9 +1,7 @@ ; $Id: toolbar.info,v 1.2 2009/07/06 13:54:21 dries Exp $ name = Toolbar -description = Toolbar exposing the top level administration menu items +description = Toolbar exposing the top level administration menu items. core = 7.x package = Core version = VERSION -files[] = toolbar.install files[] = toolbar.module -dependencies[] = menu Index: modules/toolbar/toolbar.install =================================================================== RCS file: modules/toolbar/toolbar.install diff -N modules/toolbar/toolbar.install --- modules/toolbar/toolbar.install 13 Oct 2009 13:54:55 -0000 1.6 +++ /dev/null 1 Jan 1970 00:00:00 -0000 @@ -1,56 +0,0 @@ - 'admin_shortcuts', - 'title' => $t('Administration shortcuts'), - 'description' => $t('The Administration shortcuts menu contains commonly used links for administrative tasks.'), - ); - menu_save($menu); - - // Add starter convenience shortcuts. - menu_rebuild(); - $items = array( - 'node/add' => 'Add content', - 'admin/content' => 'Find content', - 'admin/dashboard' => 'Dashboard', - ); - $weight = -20; - foreach ($items as $path => $title) { - $link = array( - 'mlid' => 0, - 'link_title' => $title, - 'link_path' => $path, - 'router_path' => $path, - 'menu_name' => 'admin_shortcuts', - 'module' => 'menu', - 'weight' => $weight, - ); - - // Check for an existing menu item before attempting to create a new one. - $menu_link = db_query("SELECT mlid FROM {menu_links} WHERE link_path = :path AND menu_name = :menu_name", array( - ':path' => $link['link_path'], - ':menu_name' => $link['menu_name'] - )) - ->fetchField(); - if (!$menu_link) { - menu_link_save($link); - } - - // Increment weight so items can be displayed in desired order. - $weight++; - } -} Index: modules/toolbar/toolbar.js =================================================================== RCS file: /cvs/drupal/drupal/modules/toolbar/toolbar.js,v retrieving revision 1.6 diff -u -p -r1.6 toolbar.js --- modules/toolbar/toolbar.js 15 Sep 2009 20:50:48 -0000 1.6 +++ modules/toolbar/toolbar.js 15 Oct 2009 15:52:41 -0000 @@ -10,7 +10,7 @@ Drupal.behaviors.admin = { // Set the intial state of the toolbar. $('#toolbar', context).once('toolbar', Drupal.admin.toolbar.init); - // Toggling of admin shortcuts visibility. + // Toggling toolbar drawer. $('#toolbar span.toggle', context).once('toolbar-toggle').click(function() { Drupal.admin.toolbar.toggle(); return false; @@ -44,9 +44,9 @@ Drupal.admin.toolbar.init = function() { * Collapse the admin toolbar. */ Drupal.admin.toolbar.collapse = function() { - $('#toolbar div.toolbar-shortcuts').addClass('collapsed'); + $('#toolbar div.toolbar-drawer').addClass('collapsed'); $('#toolbar span.toggle').removeClass('toggle-active'); - $('body').removeClass('toolbar-shortcuts'); + $('body').removeClass('toolbar-drawer'); $.cookie( 'Drupal.admin.toolbar.collapsed', 1, @@ -58,9 +58,9 @@ Drupal.admin.toolbar.collapse = function * Expand the admin toolbar. */ Drupal.admin.toolbar.expand = function() { - $('#toolbar div.toolbar-shortcuts').removeClass('collapsed'); + $('#toolbar div.toolbar-drawer').removeClass('collapsed'); $('#toolbar span.toggle').addClass('toggle-active'); - $('body').addClass('toolbar-shortcuts'); + $('body').addClass('toolbar-drawer'); $.cookie( 'Drupal.admin.toolbar.collapsed', 0, @@ -72,7 +72,7 @@ Drupal.admin.toolbar.expand = function() * Toggle the admin toolbar. */ Drupal.admin.toolbar.toggle = function() { - if ($('#toolbar div.toolbar-shortcuts').is('.collapsed')) { + if ($('#toolbar .toolbar-drawer').is('.collapsed')) { Drupal.admin.toolbar.expand(); } else { Index: modules/toolbar/toolbar.module =================================================================== RCS file: /cvs/drupal/drupal/modules/toolbar/toolbar.module,v retrieving revision 1.13 diff -u -p -r1.13 toolbar.module --- modules/toolbar/toolbar.module 15 Sep 2009 20:50:48 -0000 1.13 +++ modules/toolbar/toolbar.module 15 Oct 2009 15:52:41 -0000 @@ -38,17 +38,18 @@ function toolbar_theme($existing, $type, function toolbar_page_build(&$page) { if (user_access('access toolbar')) { $page['page_top']['toolbar'] = toolbar_build(); + $page['page_top']['toolbar']['toolbar_drawer'] = isset($page['toolbar_drawer']) ? $page['toolbar_drawer'] : array(); } } /** - * Implement hook_preprocess_page(). + * Implement hook_preprocess_html(). * * Add some page classes, so global page theming can adjust to the toolbar. */ function toolbar_preprocess_html(&$vars) { if (user_access('access toolbar')) { - $vars['classes_array'][] = 'toolbar toolbar-shortcuts'; + $vars['classes_array'][] = 'toolbar toolbar-drawer'; } } @@ -100,16 +101,6 @@ function toolbar_build() { ), '#attributes' => array('id' => 'toolbar-user'), ); - - // Add convenience shortcut links. - $shortcuts = menu_tree_all_data('admin_shortcuts'); - $shortcuts = toolbar_menu_navigation_links($shortcuts); - $build['toolbar_shortcuts'] = array( - '#theme' => 'links', - '#links' => $shortcuts, - '#attributes' => array('id' => 'toolbar-shortcuts'), - ); - return $build; } Index: modules/toolbar/toolbar.tpl.php =================================================================== RCS file: /cvs/drupal/drupal/modules/toolbar/toolbar.tpl.php,v retrieving revision 1.4 diff -u -p -r1.4 toolbar.tpl.php --- modules/toolbar/toolbar.tpl.php 15 Sep 2009 03:38:06 -0000 1.4 +++ modules/toolbar/toolbar.tpl.php 15 Oct 2009 15:52:41 -0000 @@ -8,7 +8,7 @@ * Available variables: * - $toolbar['toolbar_user']: User account / logout links. * - $toolbar['toolbar_menu']: Top level management menu links. - * - $toolbar['toolbar_shortcuts']: Convenience shortcuts. + * - $toolbar['toolbar_drawer']: A place for extended toolbar content. * * @see template_preprocess() * @see template_preprocess_admin_toolbar() @@ -21,8 +21,8 @@ -
- +
+
Index: profiles/default/default.info =================================================================== RCS file: /cvs/drupal/drupal/profiles/default/default.info,v retrieving revision 1.5 diff -u -p -r1.5 default.info --- profiles/default/default.info 13 Oct 2009 13:54:55 -0000 1.5 +++ profiles/default/default.info 15 Oct 2009 15:52:41 -0000 @@ -14,6 +14,7 @@ dependencies[] = path dependencies[] = taxonomy dependencies[] = dblog dependencies[] = search +dependencies[] = shortcut dependencies[] = toolbar dependencies[] = field_ui dependencies[] = file Index: themes/seven/page.tpl.php =================================================================== RCS file: /cvs/drupal/drupal/themes/seven/page.tpl.php,v retrieving revision 1.5 diff -u -p -r1.5 page.tpl.php --- themes/seven/page.tpl.php 11 Oct 2009 06:05:53 -0000 1.5 +++ themes/seven/page.tpl.php 15 Oct 2009 15:52:41 -0000 @@ -4,6 +4,7 @@

+
Index: themes/seven/style.css =================================================================== RCS file: /cvs/drupal/drupal/themes/seven/style.css,v retrieving revision 1.18 diff -u -p -r1.18 style.css --- themes/seven/style.css 11 Sep 2009 13:48:44 -0000 1.18 +++ themes/seven/style.css 15 Oct 2009 15:52:41 -0000 @@ -735,3 +735,10 @@ body.overlay #page { body.overlay #block-system-main { padding: 20px; } + +/* Shortcut theming */ +div.toolbar-add-to-shortcuts { + float: left; + margin-left: 6px; + margin-top: 6px; +}