Index: install.php =================================================================== RCS file: /cvs/drupal/drupal/install.php,v retrieving revision 1.212 diff -u -p -r1.212 install.php --- install.php 9 Oct 2009 00:59:53 -0000 1.212 +++ install.php 10 Oct 2009 02:15:16 -0000 @@ -1422,6 +1422,14 @@ function install_finished(&$install_stat $output .= '
' . st('For more information on configuring Drupal, refer to the help section.', array('@help' => url('admin/help'))) . '
'; } + // Rebuild the module and theme data, in case any newly-installed modules + // need to modify it via hook_system_info_alter(). We need to clear the + // theme static cache first, to make sure that the theme data is actually + // rebuilt. + drupal_static_reset('_system_get_theme_data'); + system_get_module_data(); + system_get_theme_data(); + // Rebuild menu and registry to get content type links registered by the // profile, and possibly any other menu items created through the tasks. menu_rebuild(); Index: modules/dashboard/dashboard.css =================================================================== RCS file: modules/dashboard/dashboard.css diff -N modules/dashboard/dashboard.css --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ modules/dashboard/dashboard.css 10 Oct 2009 02:15:16 -0000 @@ -0,0 +1,115 @@ +/* $Id$ */ + +#dashboard div.dashboard-region { + float: left; + min-height: 1px; +} + +#dashboard div#dashboard_main { + width: 65%; +} + +#dashboard div#dashboard_sidebar { + width: 35%; +} + +#dashboard div.block { + margin-bottom: 20px; +} + +#dashboard .dashboard-region .block { + clear: both; +} + +#dashboard div.block h2 { + background-color:#e2e1dc; + padding: 3px 5px; +} + +#dashboard div.block div.content { + padding: 10px 5px 5px 5px; +} + +#dashboard div.block div.content ul.menu { + margin-left:20px; +} + +#dashboard #disabled-blocks .block, #dashboard .block-placeholder { + background: #e2e1dc; + padding: 6px 4px; + margin: 3px 3px 3px 0; + float: left; + -moz-border-radius: 4px; +} + +#dashboard .ui-sortable { + border: 3px dashed #ccc; + padding: 10px; +} + +#dashboard .canvas-content { + background-color: #4d4d4d; + padding: 10px; + color: #fff; +} + +#dashboard .canvas-content a { + color: #fff; + text-decoration: underline; +} + +#dashboard #disabled-blocks .ui-sortable { + padding: 0; + background-color: #4d4d4d; + border: 0; +} + +#dashboard .canvas-content input { + float: right; + margin: 0 0 0 10px; +} + +#dashboard .region { + margin: 5px; +} + +#dashboard #disabled-blocks .section { + margin: 0 7em 0 0; + height: 100px; + overflow: auto; +} +#dashboard #disabled-blocks { + padding: 5px 0; +} + +#dashboard div.dragging { + width: 30%; +} + +#dashboard #disabled-blocks h2 { + display: inline; + font-weight: normal; + white-space: nowrap; + color: #000; +} + +#dashboard #disabled-blocks .block .content, #dashboard .ui-sortable-helper .content { + display: none; +} + +#dashboard .ui-sortable .block { + cursor: move; +} + +#dashboard .dashboard-region .block-placeholder { + margin: 0 0 20px 0; + padding: 0; + display: block; + height: 1.6em; + width: 100%; +} + +#dashboard #disabled-blocks .block-placeholder { + width: 30px; + height: 1.6em; +} Index: modules/dashboard/dashboard.info =================================================================== RCS file: modules/dashboard/dashboard.info diff -N modules/dashboard/dashboard.info --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ modules/dashboard/dashboard.info 10 Oct 2009 02:15:16 -0000 @@ -0,0 +1,8 @@ +; $Id$ +name = Dashboard +description = A module that provides a dashboard interface for organizing and tracking various information within your site. +core = 7.x +package = Core +version = VERSION +files[] = dashboard.module +dependencies[] = block Index: modules/dashboard/dashboard.js =================================================================== RCS file: modules/dashboard/dashboard.js diff -N modules/dashboard/dashboard.js --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ modules/dashboard/dashboard.js 10 Oct 2009 02:15:16 -0000 @@ -0,0 +1,139 @@ +// $Id: toolbar.js,v 1.1 2009/07/04 05:37:30 dries Exp $ +(function ($) { + +/** + * Implementation of Drupal.behaviors for dashboard. + */ +Drupal.behaviors.dashboard = { + attach: function () { + $('#dashboard').prepend(''); + $('#dashboard .customize .action-links a').click(Drupal.behaviors.dashboard.enterCustomizeMode); + if (Drupal.settings.dashboard.launchCustomize) { + Drupal.behaviors.dashboard.enterCustomizeMode(); + } + }, + + /** + * Enter "customize" mode by displaying disabled blocks. + */ + enterCustomizeMode: function () { + $('#dashboard .customize .action-links').hide(); + $('div.customize .canvas').load(Drupal.settings.dashboard.drawer, Drupal.behaviors.dashboard.setupDrawer); + }, + + /** + * Exit "customize" mode by simply forcing a page refresh. + */ + exitCustomizeMode: function () { + location.href = Drupal.settings.dashboard.dashboard; + }, + + /** + * Helper for enterCustomizeMode; sets up drag-and-drop and close button. + */ + setupDrawer: function () { + $('div.customize .canvas-content').prepend(''); + $('div.customize .canvas-content input').click(Drupal.behaviors.dashboard.exitCustomizeMode); + + // Initialize drag-and-drop. + var regions = $('#dashboard div.region'); + regions.sortable({ + connectWith: regions, + cursor: 'move', + cursorAt: {top:0}, + dropOnEmpty: true, + items: '>div.block, div.disabled-block', + opacity: 0.8, + helper: 'block-dragging', + placeholder: 'block-placeholder clearfix', + start: Drupal.behaviors.dashboard.start, + update: Drupal.behaviors.dashboard.update + }); + }, + + /** + * While dragging, make the block appear as a disabled block + * + * This function is called on the jQuery UI Sortable "start" event. + * + * @param event + * The event that triggered this callback. + * @param ui + * An object containing information about the item that is being dragged. + */ + start: function (event, ui) { + var item = $(ui.item); + + // If the block is already in disabled state, don't do anything. + if (!item.hasClass('disabled-block')) { + item.css({height: 'auto'}); + } + }, + + /** + * Send block order to the server, and expand previously disabled blocks. + * + * This function is called on the jQuery UI Sortable "update" event. + * + * @param event + * The event that triggered this callback. + * @param ui + * An object containing information about the item that was just dropped. + */ + update: function (event, ui) { + var item = $(ui.item); + + // If the user dragged a disabled block, load the block contents. + if (item.hasClass('disabled-block')) { + var module, delta, itemClass; + itemClass = item.attr('class'); + // Determine the block module and delta. + module = itemClass.match(/\bmodule-(\S+)\b/)[1]; + delta = itemClass.match(/\bdelta-(\S+)\b/)[1]; + + // Load the newly enabled block's content. + $.get(Drupal.settings.dashboard.blockContent + '/' + module + '/' + delta, {}, + function (block) { + // Soemtimes, when a block has no content and the user drags it somewhere + // that they are not supposed to, it can cause a bug. + if (!block) { + return; + } + var blockContent = $("div.content", $(block)); + $("div.content", item).after(blockContent).remove(); + }, + 'html' + ); + // Remove the "disabled-block" class, so we don't reload its content the + // next time it's dragged. + item.removeClass("disabled-block"); + } + + // Let the server know what the new block order is. + $.post(Drupal.settings.dashboard.updatePath, { + 'form_token': Drupal.settings.dashboard.formToken, + 'regions': Drupal.behaviors.dashboard.getOrder + } + ); + }, + + /** + * Return the current order of the blocks in each of the sortable regions, + * in query string format. + */ + getOrder: function () { + var order = []; + $('#dashboard div.region').each(function () { + var region = $(this).parent().attr('id').replace(/-/g, '_'); + var blocks = $(this).sortable('toArray'); + var i; + for (i = 0; i < blocks.length; i++) { + order.push(region + '[]=' + blocks[i]); + } + }); + order = order.join('&'); + return order; + } +}; + +})(jQuery); Index: modules/dashboard/dashboard.module =================================================================== RCS file: modules/dashboard/dashboard.module diff -N modules/dashboard/dashboard.module --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ modules/dashboard/dashboard.module 10 Oct 2009 02:15:16 -0000 @@ -0,0 +1,402 @@ + 'Dashboard', + 'page callback' => 'dashboard_admin', + 'access arguments' => array('access dashboard'), + // Make this appear first, so for example, in admin menus, it shows up on + // the top corner of the window as a convinient "home link". + 'weight' => -100, + ); + $items['admin/dashboard/customize'] = array( + 'title' => 'Dashboard', + 'page callback' => 'dashboard_admin', + 'page arguments' => array(TRUE), + 'access arguments' => array('access dashboard'), + 'type' => MENU_CALLBACK, + ); + $items['admin/dashboard/drawer'] = array( + 'page callback' => 'dashboard_show_disabled', + 'access arguments' => array('administer blocks'), + 'type' => MENU_CALLBACK, + ); + $items['admin/dashboard/block-content/%/%'] = array( + 'page callback' => 'dashboard_show_block_content', + 'page arguments' => array(3, 4), + 'access arguments' => array('administer blocks'), + 'type' => MENU_CALLBACK, + ); + $items['admin/dashboard/update'] = array( + 'page callback' => 'dashboard_update', + 'access arguments' => array('administer blocks'), + 'type' => MENU_CALLBACK, + ); + return $items; +} + +/** + * Implement hook_block_info_alter(). + * + * Skip rendering dashboard blocks when not on the dashboard page itself. This + * prevents expensive dashboard blocks from causing performance issues on pages + * where they will never be displayed. + */ +function dashboard_block_info_alter(&$blocks) { + if (!dashboard_is_visible()) { + foreach ($blocks as $key => $block) { + if (in_array($block->region, dashboard_regions())) { + unset($blocks[$key]); + } + } + } +} + +/** + * Implement hook_page_alter(). + * + * Display dashboard blocks in the main content region. + */ +function dashboard_page_alter(&$page) { + global $theme_key; + + if (dashboard_is_visible()) { + $block_info = array(); + + // Create a wrapper for the dashboard itself, then insert each dashboard + // region into it. + $page['content']['dashboard'] = array('#theme_wrappers' => array('dashboard')); + foreach (dashboard_regions() as $region) { + // Insert regions even when they are empty, so that they will be + // displayed when the dashboard is being configured. + $page['content']['dashboard'][$region] = !empty($page[$region]) ? $page[$region] : array(); + $page['content']['dashboard'][$region]['#dashboard_region'] = $region; + // Allow each dashboard region to be themed differently, or fall back on + // the generic theme wrapper function for dashboard regions. + $page['content']['dashboard'][$region]['#theme_wrappers'][] = array($region, 'dashboard_region'); + unset($page[$region]); + $blocks_found = array(); + foreach ($page['content']['dashboard'][$region] as $item) { + if (isset($item['#theme_wrappers']) && is_array($item['#theme_wrappers']) && in_array('block', $item['#theme_wrappers'])) { + // If this item is a block, ensure it has a subject. + if (empty($item['#block']->subject)) { + // Locally cache info data for the object for all blocks, in case + // we find a block similarly missing title from the same module. + if (!isset($block_info[$item['#block']->module])) { + $block_info[$item['#block']->module] = module_invoke($item['#block']->module, 'block_info'); + } + $item['#block']->subject = $block_info[$item['#block']->module][$item['#block']->delta]['info']; + } + $blocks_found[$item['#block']->module . '_' . $item['#block']->delta] = TRUE; + } + } + + // Find blocks which were not yet displayed on the page (were empty), and + // add placeholder items in their place for rendering. + $block_list = db_select('block') + ->condition('theme', $theme_key) + ->condition('status', 1) + ->condition('region', $region) + ->fields('block') + ->execute(); + foreach ($block_list as $block) { + if (!isset($blocks_found[$block->module . '_' . $block->delta])) { + $block->enabled = $block->page_match = TRUE; + $block->content = array('#markup' => ''); + if (!isset($block_info[$block->module])) { + $block_info[$block->module] = module_invoke($block->module, 'block_info'); + } + $block->subject = t('(x) @title', array('@title' => $block_info[$block->module][$block->delta]['info'])); + $block_render = array($block->module . '_' . $block->delta => $block); + $build = _block_get_renderable_array($block_render); + $page['content']['dashboard'][$block->region][] = $build; + } + } + } + } +} + +/** + * Implement hook_permission(). + */ +function dashboard_permission() { + return array( + 'access dashboard' => array( + 'title' => t('View the administrative dashboard'), + 'description' => t('Access the site-wide dashboard. Modifying the dashboard requires the "Administer blocks" permission.'), + ), + ); +} + +/** + * Implement hook_system_info_alter(). + * + * Add regions to each theme to store the dashboard blocks. + */ +function dashboard_system_info_alter(&$info, $file, $type) { + if ($type == 'theme') { + $info['regions'] += dashboard_region_descriptions(); + if (module_exists('overlay')) { + $info['overlay_regions'] = !empty($info['overlay_regions']) ? array_merge($info['overlay_regions'], dashboard_regions()) : dashboard_regions(); + } + } +} + +/** + * Implement hook_theme(). + */ +function dashboard_theme() { + return array( + 'dashboard' => array( + 'arguments' => array('element' => NULL), + ), + 'dashboard_region' => array( + 'arguments' => array('element' => NULL), + ), + 'dashboard_disabled_blocks' => array( + 'arguments' => array('blocks' => NULL), + ), + 'dashboard_disabled_block' => array( + 'arguments' => array('block' => NULL), + ), + ); +} + +/** + * Dashboard page callback. + * + * @param $launch_customize + * Whether to launch in customization mode right away. TRUE or FALSE. + */ +function dashboard_admin($launch_customize = FALSE) { + $output = ''; + if (user_access('administer blocks')) { + $output .= '' . t('Drag and drop dashboard blocks to their place. Changes are automatically saved. You can also add a custom block.', array('@add-block' => url('admin/structure/block/add', array('query' => array('destination' => 'admin/dashboard/customize'))))) . '
'; + $output .= '