From 10d482f1d3deb4c717fbb87f523428196634a326 Mon Sep 17 00:00:00 2001 From: Thomas Steur <thomas.steur@gmail.com> Date: Wed, 9 Sep 2015 14:53:39 +0000 Subject: [PATCH] Left menu design --- config/global.ini.php | 2 - core/Menu/MenuAbstract.php | 11 + core/Period.php | 1 + core/Plugin/Controller.php | 1 - core/Updates/2.15.0-b13.php | 45 ++ lang/en.json | 2 +- plugins/API/templates/listAllAPI.twig | 11 +- plugins/CoreAdminHome/CoreAdminHome.php | 1 - plugins/CoreAdminHome/Menu.php | 10 +- .../stylesheets/generalSettings.less | 16 +- plugins/CoreAdminHome/stylesheets/menu.less | 71 ---- plugins/CoreAdminHome/templates/_menu.twig | 3 - plugins/CoreHome/CoreHome.php | 19 +- plugins/CoreHome/Menu.php | 14 +- .../enrichedheadline.directive.less | 10 + .../menudropdown/menudropdown.directive.less | 8 +- .../quick-access/quick-access.controller.js | 78 ++++ .../quick-access/quick-access.directive.html | 36 ++ .../quick-access/quick-access.directive.js | 258 ++++++++++++ .../quick-access/quick-access.directive.less | 55 +++ .../angularjs/selector/selector.directive.js | 86 ++++ .../selector/selector.directive.less | 59 +++ .../siteselector/siteselector.directive.html | 23 +- .../siteselector/siteselector.directive.js | 8 +- .../siteselector/siteselector.directive.less | 227 +++++----- plugins/CoreHome/javascripts/calendar.js | 15 - plugins/CoreHome/javascripts/corehome.js | 17 +- plugins/CoreHome/javascripts/menu.js | 118 ++++-- plugins/CoreHome/javascripts/menu_init.js | 15 +- plugins/CoreHome/javascripts/top_controls.js | 34 +- plugins/CoreHome/lang/en.json | 4 +- plugins/CoreHome/stylesheets/coreHome.less | 62 +-- .../stylesheets/dataTable/_dataTable.less | 4 +- .../stylesheets/jquery.ui.autocomplete.css | 2 +- plugins/CoreHome/stylesheets/layout.less | 390 ++++++++++++++++++ plugins/CoreHome/stylesheets/menu.less | 177 -------- .../CoreHome/stylesheets/notification.less | 5 +- plugins/CoreHome/stylesheets/zen-mode.less | 10 +- .../_reportsByDimension.twig | 2 +- .../CoreHome/templates/_headerMessage.twig | 46 ++- plugins/CoreHome/templates/_indexContent.twig | 19 - plugins/CoreHome/templates/_menu.twig | 65 ++- plugins/CoreHome/templates/_periodSelect.twig | 10 +- .../CoreHome/templates/_siteSelectHeader.twig | 4 +- plugins/CoreHome/templates/_topBar.twig | 36 +- .../CoreHome/templates/_topBarTopMenu.twig | 37 -- plugins/CoreHome/templates/_topScreen.twig | 20 +- plugins/CoreHome/templates/_uiControl.twig | 1 + plugins/CoreHome/templates/_userMenu.twig | 3 - .../templates/getDefaultIndexView.twig | 22 +- plugins/CoreHome/templates/macros.twig | 26 -- plugins/CorePluginsAdmin/Menu.php | 4 +- .../CoreVisualizations/javascripts/jqplot.js | 2 +- plugins/Dashboard/Dashboard.php | 1 + plugins/Dashboard/DashboardManagerControl.php | 2 +- .../DashboardSettingsControlBase.php | 2 +- plugins/Dashboard/Menu.php | 21 +- plugins/Dashboard/javascripts/dashboard.js | 14 +- .../Dashboard/javascripts/dashboardObject.js | 14 +- plugins/Dashboard/javascripts/widgetMenu.js | 9 +- plugins/Dashboard/stylesheets/dashboard.less | 47 +-- plugins/Dashboard/stylesheets/standalone.css | 9 +- plugins/Dashboard/stylesheets/widget.less | 2 +- .../templates/_dashboardSettings.twig | 8 +- plugins/Dashboard/templates/index.twig | 5 +- .../SimpleUITest_simplePage.png | Bin 15196 -> 15064 bytes .../SimpleUITest_simplePagePartial.png | Bin 9676 -> 10004 bytes plugins/Goals/templates/manageGoals.twig | 6 +- .../ImageGraph/templates/testAllSizes.twig | 8 +- .../Installation/stylesheets/installation.css | 4 +- plugins/LeftMenu/API.php | 44 -- plugins/LeftMenu/LeftMenu.php | 35 -- plugins/LeftMenu/Settings.php | 67 --- plugins/LeftMenu/lang/bg.json | 5 - plugins/LeftMenu/lang/cs.json | 11 - plugins/LeftMenu/lang/da.json | 10 - plugins/LeftMenu/lang/de.json | 11 - plugins/LeftMenu/lang/el.json | 11 - plugins/LeftMenu/lang/en.json | 11 - plugins/LeftMenu/lang/es.json | 11 - plugins/LeftMenu/lang/fi.json | 8 - plugins/LeftMenu/lang/fr.json | 11 - plugins/LeftMenu/lang/hi.json | 11 - plugins/LeftMenu/lang/it.json | 11 - plugins/LeftMenu/lang/ja.json | 10 - plugins/LeftMenu/lang/nl.json | 11 - plugins/LeftMenu/lang/pl.json | 6 - plugins/LeftMenu/lang/pt-br.json | 11 - plugins/LeftMenu/lang/pt.json | 11 - plugins/LeftMenu/lang/ro.json | 10 - plugins/LeftMenu/lang/ru.json | 9 - plugins/LeftMenu/lang/sr.json | 11 - plugins/LeftMenu/lang/sv.json | 11 - plugins/LeftMenu/lang/tl.json | 10 - plugins/LeftMenu/lang/tr.json | 5 - plugins/LeftMenu/lang/zh-cn.json | 6 - plugins/LeftMenu/stylesheets/theme.less | 150 ------- .../LeftMenu/tests/Integration/APITest.php | 149 ------- plugins/Morpheus/Menu.php | 22 + plugins/Morpheus/fonts/piwik.eot | Bin 15684 -> 20640 bytes plugins/Morpheus/fonts/piwik.ttf | Bin 15528 -> 20484 bytes plugins/Morpheus/images/logo.svg | 10 +- plugins/Morpheus/images/signout.png | Bin 0 -> 345 bytes plugins/Morpheus/javascripts/piwikHelper.js | 16 + plugins/Morpheus/stylesheets/base/colors.less | 1 - plugins/Morpheus/stylesheets/base/icons.css | 156 ++++--- plugins/Morpheus/stylesheets/base/mixins.less | 2 +- .../Morpheus/stylesheets/general/_admin.less | 50 --- .../Morpheus/stylesheets/general/_forms.less | 38 +- plugins/Morpheus/stylesheets/ieonly.css | 6 +- plugins/Morpheus/stylesheets/main.less | 171 ++------ plugins/Morpheus/stylesheets/theme.less | 4 +- .../Morpheus/stylesheets/ui/_components.less | 59 +-- .../Morpheus/stylesheets/uibase/_header.less | 34 +- .../stylesheets/uibase/_headerMessage.less | 32 +- .../stylesheets/uibase/_languageSelect.less | 13 + .../Morpheus/stylesheets/uibase/_loading.less | 13 +- .../stylesheets/uibase/_periodSelect.less | 21 +- plugins/Morpheus/templates/admin.twig | 32 +- plugins/Morpheus/templates/dashboard.twig | 33 +- plugins/Morpheus/templates/demo.twig | 5 + plugins/Morpheus/templates/user.twig | 31 +- .../dashboard/dashboard.directive.less | 11 +- .../MultiSites/templates/getSitesInfo.twig | 17 +- plugins/Overlay/stylesheets/overlay.css | 10 +- plugins/ScheduledReports/templates/index.twig | 12 +- .../SegmentEditor/SegmentSelectorControl.php | 2 +- .../SegmentEditor/javascripts/Segmentation.js | 14 +- .../stylesheets/segmentation.less | 92 ++--- .../templates/_segmentSelector.twig | 11 +- .../stylesheets/SitesManager.less | 3 +- .../templates/siteWithoutData.twig | 6 +- .../javascripts/realtime-map.js | 11 +- .../stylesheets/realtime-map.less | 4 + plugins/UsersManager/templates/index.twig | 2 - .../UsersManager/templates/userSettings.twig | 2 +- plugins/Widgetize/Menu.php | 1 - plugins/Widgetize/templates/index.twig | 11 +- plugins/ZenMode/ZenMode.php | 51 --- .../quick-access/quick-access.directive.html | 41 -- .../quick-access/quick-access.directive.js | 140 ------- .../quick-access/quick-access.directive.less | 20 - .../zen-mode/zen-mode-switcher.directive.js | 54 --- .../ZenMode/angularjs/zen-mode/zen-mode.less | 93 ----- plugins/ZenMode/javascripts/zen-mode.js | 138 ------- plugins/ZenMode/lang/cs.json | 10 - plugins/ZenMode/lang/da.json | 9 - plugins/ZenMode/lang/de.json | 10 - plugins/ZenMode/lang/el.json | 10 - plugins/ZenMode/lang/en.json | 10 - plugins/ZenMode/lang/es.json | 10 - plugins/ZenMode/lang/fa.json | 5 - plugins/ZenMode/lang/fr.json | 10 - plugins/ZenMode/lang/hi.json | 8 - plugins/ZenMode/lang/it.json | 10 - plugins/ZenMode/lang/ja.json | 9 - plugins/ZenMode/lang/nb.json | 6 - plugins/ZenMode/lang/nl.json | 10 - plugins/ZenMode/lang/pl.json | 8 - plugins/ZenMode/lang/pt-br.json | 10 - plugins/ZenMode/lang/ro.json | 9 - plugins/ZenMode/lang/ru.json | 9 - plugins/ZenMode/lang/sr.json | 10 - plugins/ZenMode/lang/sv.json | 9 - plugins/ZenMode/lang/ta.json | 6 - plugins/ZenMode/lang/tl.json | 9 - tests/UI/expected-ui-screenshots | 2 +- tests/UI/specs/DashboardManager_spec.js | 2 +- tests/UI/specs/Dashboard_spec.js | 24 +- tests/UI/specs/EmptySite_spec.js | 2 +- tests/UI/specs/Login_spec.js | 4 +- tests/UI/specs/MeasurableManager_spec.js | 2 +- tests/UI/specs/Menus_spec.js | 29 +- tests/UI/specs/MultiSites_spec.js | 2 +- tests/UI/specs/QuickAccess_spec.js | 75 ++++ tests/UI/specs/SegmentSelectorEditor_spec.js | 14 +- tests/UI/specs/SiteSelector_spec.js | 2 +- tests/UI/specs/UIIntegration_spec.js | 59 ++- .../support/page-renderer.js | 48 ++- .../screenshot-override/override.css | 4 +- 180 files changed, 2171 insertions(+), 2804 deletions(-) create mode 100644 core/Updates/2.15.0-b13.php delete mode 100644 plugins/CoreAdminHome/stylesheets/menu.less delete mode 100644 plugins/CoreAdminHome/templates/_menu.twig create mode 100644 plugins/CoreHome/angularjs/quick-access/quick-access.controller.js create mode 100644 plugins/CoreHome/angularjs/quick-access/quick-access.directive.html create mode 100644 plugins/CoreHome/angularjs/quick-access/quick-access.directive.js create mode 100644 plugins/CoreHome/angularjs/quick-access/quick-access.directive.less create mode 100644 plugins/CoreHome/angularjs/selector/selector.directive.js create mode 100644 plugins/CoreHome/angularjs/selector/selector.directive.less create mode 100644 plugins/CoreHome/stylesheets/layout.less delete mode 100644 plugins/CoreHome/stylesheets/menu.less delete mode 100644 plugins/CoreHome/templates/_indexContent.twig delete mode 100644 plugins/CoreHome/templates/_topBarTopMenu.twig delete mode 100644 plugins/CoreHome/templates/_userMenu.twig delete mode 100644 plugins/CoreHome/templates/macros.twig delete mode 100644 plugins/LeftMenu/API.php delete mode 100755 plugins/LeftMenu/LeftMenu.php delete mode 100644 plugins/LeftMenu/Settings.php delete mode 100644 plugins/LeftMenu/lang/bg.json delete mode 100644 plugins/LeftMenu/lang/cs.json delete mode 100644 plugins/LeftMenu/lang/da.json delete mode 100644 plugins/LeftMenu/lang/de.json delete mode 100644 plugins/LeftMenu/lang/el.json delete mode 100644 plugins/LeftMenu/lang/en.json delete mode 100644 plugins/LeftMenu/lang/es.json delete mode 100644 plugins/LeftMenu/lang/fi.json delete mode 100644 plugins/LeftMenu/lang/fr.json delete mode 100644 plugins/LeftMenu/lang/hi.json delete mode 100644 plugins/LeftMenu/lang/it.json delete mode 100644 plugins/LeftMenu/lang/ja.json delete mode 100644 plugins/LeftMenu/lang/nl.json delete mode 100644 plugins/LeftMenu/lang/pl.json delete mode 100644 plugins/LeftMenu/lang/pt-br.json delete mode 100644 plugins/LeftMenu/lang/pt.json delete mode 100644 plugins/LeftMenu/lang/ro.json delete mode 100644 plugins/LeftMenu/lang/ru.json delete mode 100644 plugins/LeftMenu/lang/sr.json delete mode 100644 plugins/LeftMenu/lang/sv.json delete mode 100644 plugins/LeftMenu/lang/tl.json delete mode 100644 plugins/LeftMenu/lang/tr.json delete mode 100644 plugins/LeftMenu/lang/zh-cn.json delete mode 100644 plugins/LeftMenu/stylesheets/theme.less delete mode 100644 plugins/LeftMenu/tests/Integration/APITest.php mode change 100644 => 100755 plugins/Morpheus/fonts/piwik.eot mode change 100644 => 100755 plugins/Morpheus/fonts/piwik.ttf create mode 100644 plugins/Morpheus/images/signout.png delete mode 100644 plugins/ZenMode/ZenMode.php delete mode 100644 plugins/ZenMode/angularjs/quick-access/quick-access.directive.html delete mode 100644 plugins/ZenMode/angularjs/quick-access/quick-access.directive.js delete mode 100644 plugins/ZenMode/angularjs/quick-access/quick-access.directive.less delete mode 100644 plugins/ZenMode/angularjs/zen-mode/zen-mode-switcher.directive.js delete mode 100644 plugins/ZenMode/angularjs/zen-mode/zen-mode.less delete mode 100644 plugins/ZenMode/javascripts/zen-mode.js delete mode 100644 plugins/ZenMode/lang/cs.json delete mode 100644 plugins/ZenMode/lang/da.json delete mode 100644 plugins/ZenMode/lang/de.json delete mode 100644 plugins/ZenMode/lang/el.json delete mode 100755 plugins/ZenMode/lang/en.json delete mode 100644 plugins/ZenMode/lang/es.json delete mode 100644 plugins/ZenMode/lang/fa.json delete mode 100644 plugins/ZenMode/lang/fr.json delete mode 100644 plugins/ZenMode/lang/hi.json delete mode 100644 plugins/ZenMode/lang/it.json delete mode 100644 plugins/ZenMode/lang/ja.json delete mode 100644 plugins/ZenMode/lang/nb.json delete mode 100644 plugins/ZenMode/lang/nl.json delete mode 100644 plugins/ZenMode/lang/pl.json delete mode 100644 plugins/ZenMode/lang/pt-br.json delete mode 100644 plugins/ZenMode/lang/ro.json delete mode 100644 plugins/ZenMode/lang/ru.json delete mode 100644 plugins/ZenMode/lang/sr.json delete mode 100644 plugins/ZenMode/lang/sv.json delete mode 100644 plugins/ZenMode/lang/ta.json delete mode 100644 plugins/ZenMode/lang/tl.json create mode 100644 tests/UI/specs/QuickAccess_spec.js diff --git a/config/global.ini.php b/config/global.ini.php index 2b86a1c131..cb49709b37 100644 --- a/config/global.ini.php +++ b/config/global.ini.php @@ -780,8 +780,6 @@ Plugins[] = MobileMessaging Plugins[] = Overlay Plugins[] = SegmentEditor Plugins[] = Insights -Plugins[] = ZenMode -Plugins[] = LeftMenu Plugins[] = Morpheus Plugins[] = Contents Plugins[] = TestRunner diff --git a/core/Menu/MenuAbstract.php b/core/Menu/MenuAbstract.php index 7651a1199d..a742df41ab 100644 --- a/core/Menu/MenuAbstract.php +++ b/core/Menu/MenuAbstract.php @@ -30,6 +30,7 @@ abstract class MenuAbstract extends Singleton protected $edits = array(); protected $renames = array(); protected $orderingApplied = false; + protected $menuIcons = array(); protected static $menus = array(); /** @@ -48,6 +49,11 @@ abstract class MenuAbstract extends Singleton return $this->menu; } + public function registerMenuIcon($menuName, $icon) + { + $this->menuIcons[$menuName] = $icon; + } + /** * Returns a list of available plugin menu instances. * @@ -164,6 +170,11 @@ abstract class MenuAbstract extends Singleton $this->menu[$menuName]['_order'] = $order; $this->menu[$menuName]['_name'] = $menuName; $this->menu[$menuName]['_tooltip'] = $tooltip; + if (!empty($this->menuIcons[$menuName])) { + $this->menu[$menuName]['_icon'] = $this->menuIcons[$menuName]; + } else { + $this->menu[$menuName]['_icon'] = 'icon-arrow-right'; + } } if (!empty($subMenuName)) { $this->menu[$menuName][$subMenuName]['_url'] = $url; diff --git a/core/Period.php b/core/Period.php index 11ddb9c7c2..80dc9f6f21 100644 --- a/core/Period.php +++ b/core/Period.php @@ -104,6 +104,7 @@ abstract class Period if (self::isMultiplePeriod($dateString, 'day')) { return; } + Date::factory($dateString); } diff --git a/core/Plugin/Controller.php b/core/Plugin/Controller.php index 3aab8374fb..df56b4a8da 100644 --- a/core/Plugin/Controller.php +++ b/core/Plugin/Controller.php @@ -15,7 +15,6 @@ use Piwik\API\Request; use Piwik\Common; use Piwik\Config as PiwikConfig; use Piwik\Config; -use Piwik\Container\StaticContainer; use Piwik\DataTable\Filter\CalculateEvolutionFilter; use Piwik\Date; use Piwik\Exception\NoPrivilegesException; diff --git a/core/Updates/2.15.0-b13.php b/core/Updates/2.15.0-b13.php new file mode 100644 index 0000000000..2420eeaecc --- /dev/null +++ b/core/Updates/2.15.0-b13.php @@ -0,0 +1,45 @@ +<?php +/** + * Piwik - free/libre analytics platform + * + * @link http://piwik.org + * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later + * + */ + +namespace Piwik\Updates; + +use Piwik\Plugin\Manager; +use Piwik\Updater; +use Piwik\Updates; + +class Updates_2_15_0_b13 extends Updates +{ + + public function doUpdate(Updater $updater) + { + $this->uninstallPlugin('LeftMenu'); + $this->uninstallPlugin('ZenMode'); + } + + private function uninstallPlugin($plugin) + { + $pluginManager = Manager::getInstance(); + + if ($pluginManager->isPluginInstalled($plugin)) { + if ($pluginManager->isPluginActivated($plugin)) { + $pluginManager->deactivatePlugin($plugin); + } + + $pluginManager->unloadPlugin($plugin); + $pluginManager->uninstallPlugin($plugin); + } else { + $this->makeSurePluginIsRemovedFromFilesystem($plugin); + } + } + + private function makeSurePluginIsRemovedFromFilesystem($plugin) + { + Manager::deletePluginFromFilesystem($plugin); + } +} diff --git a/lang/en.json b/lang/en.json index 8e954f711f..3925c960e7 100644 --- a/lang/en.json +++ b/lang/en.json @@ -402,7 +402,7 @@ "YearsDays": "%1$s years %2$s days", "Yes": "Yes", "YouAreCurrentlyUsing": "You are currently using Piwik %s.", - "YouAreViewingDemoShortMessage": "You are currently viewing the demo of Piwik", + "YouAreViewingDemoShortMessage": "You are viewing the demo of Piwik", "YouMustBeLoggedIn": "You must be logged in to access this functionality.", "YourChangesHaveBeenSaved": "Your changes have been saved." }, diff --git a/plugins/API/templates/listAllAPI.twig b/plugins/API/templates/listAllAPI.twig index 47a1327c36..d3c551c997 100644 --- a/plugins/API/templates/listAllAPI.twig +++ b/plugins/API/templates/listAllAPI.twig @@ -2,18 +2,17 @@ {% set title %}{{ 'API_ReportingApiReference'|translate }}{% endset %} +{% block topcontrols %} + {% include "@CoreHome/_siteSelectHeader.twig" %} + {% include "@CoreHome/_periodSelect.twig" %} +{% endblock %} + {% block content %} <div class="api-list"> <h2>{{ title }}</h2> - {% include "@CoreHome/_siteSelectHeader.twig" %} - - <div class="top_controls"> - {% include "@CoreHome/_periodSelect.twig" %} - </div> - <p>{{ 'API_PluginDescription'|translate }}</p> <p> diff --git a/plugins/CoreAdminHome/CoreAdminHome.php b/plugins/CoreAdminHome/CoreAdminHome.php index 75f1230cd6..305506038a 100644 --- a/plugins/CoreAdminHome/CoreAdminHome.php +++ b/plugins/CoreAdminHome/CoreAdminHome.php @@ -38,7 +38,6 @@ class CoreAdminHome extends \Piwik\Plugin public function getStylesheetFiles(&$stylesheets) { $stylesheets[] = "libs/jquery/themes/base/jquery-ui.min.css"; - $stylesheets[] = "plugins/CoreAdminHome/stylesheets/menu.less"; $stylesheets[] = "plugins/Morpheus/stylesheets/base.less"; $stylesheets[] = "plugins/Morpheus/stylesheets/main.less"; $stylesheets[] = "plugins/CoreAdminHome/stylesheets/generalSettings.less"; diff --git a/plugins/CoreAdminHome/Menu.php b/plugins/CoreAdminHome/Menu.php index 7994979450..91d8ac8197 100644 --- a/plugins/CoreAdminHome/Menu.php +++ b/plugins/CoreAdminHome/Menu.php @@ -23,10 +23,10 @@ class Menu extends \Piwik\Plugin\Menu $hasAdminAccess = Piwik::isUserHasSomeAdminAccess(); if ($hasAdminAccess) { - $menu->addManageItem(null, "", $order = 1); - $menu->addSettingsItem(null, "", $order = 5); - $menu->addDiagnosticItem(null, "", $order = 10); - $menu->addDevelopmentItem(null, "", $order = 15); + $menu->addManageItem(null, array(), $order = 1); + $menu->addSettingsItem(null, array(), $order = 5); + $menu->addDiagnosticItem(null, array(), $order = 10); + $menu->addDevelopmentItem(null, array(), $order = 15); if (Piwik::hasUserSuperUserAccess()) { $menu->addSettingsItem('General_General', @@ -51,7 +51,7 @@ class Menu extends \Piwik\Plugin\Menu $url = $this->urlForAction('generalSettings'); } - $menu->addItem('CoreAdminHome_Administration', null, $url, 10); + $menu->addItem('icon-configure', null, $url, 980, Piwik::translate('CoreAdminHome_Administration')); } } diff --git a/plugins/CoreAdminHome/stylesheets/generalSettings.less b/plugins/CoreAdminHome/stylesheets/generalSettings.less index eac16b6c4c..9d232f789b 100644 --- a/plugins/CoreAdminHome/stylesheets/generalSettings.less +++ b/plugins/CoreAdminHome/stylesheets/generalSettings.less @@ -13,9 +13,6 @@ } #content.admin { - margin: 0 0 0 260px; - padding: 0 0 40px; - display: table; font-size: 13px; // Fix the <pre> blocks because of the display: table @@ -25,8 +22,8 @@ } .admin #header_message { - margin-top: 10px; - margin-right: 10px; + margin-top: 8px; + margin-right: 8px; } table.admin { @@ -92,9 +89,9 @@ table.admin tbody td:hover, table.admin tbody th:hover { width: 100%; &:first-of-type:not(.secondary) { - margin-top: 17px; + margin-top: 7px; margin-bottom: 16px; - border-bottom: 1px solid #DADADA; + border-bottom: 1px solid @theme-color-background-tinyContrast; } } @@ -162,11 +159,6 @@ table.admin tbody td:hover, table.admin tbody th:hover { margin-left: 0px; } -/* to override .admin a */ -.admin .sites_autocomplete a { - color: #255792; -} - /* trusted host styles */ #trustedHostSettings input { width: 238px; diff --git a/plugins/CoreAdminHome/stylesheets/menu.less b/plugins/CoreAdminHome/stylesheets/menu.less deleted file mode 100644 index af76bc8281..0000000000 --- a/plugins/CoreAdminHome/stylesheets/menu.less +++ /dev/null @@ -1,71 +0,0 @@ -#container { - clear: left; -} - -.Menu--admin { - padding: 0; - float: left; - width: 240px; -} - -.Menu--admin > .Menu-tabList { - -moz-background-size: 5px 100%; - background-size: 5px 100%; - background-position: 0 0, 100% 0; - background-repeat: no-repeat; -} - -.Menu--admin > .Menu-tabList { - padding-left: 5px; - margin-bottom: 0; - margin-top: 0.1em; - border: 1px solid @theme-color-background-lowContrast; - border-radius: 5px; - border-left: 0px; -} - -.Menu--admin > .Menu-tabList li { - list-style: none; - margin: 0; -} - -.Menu--admin > .Menu-tabList > li { - padding-bottom: 5px; -} - -.Menu--admin > .Menu-tabList > li > a, -.Menu--admin > .Menu-tabList > li > span { - text-decoration: none; - border-bottom: 1px dotted #778; - display: block; - padding: 5px 10px; - font-size: 18px; - color: #7E7363; -} - -.Menu--admin > .Menu-tabList li li a { - text-decoration: none; - padding: 0.6em 0.9em; - font-size: 14px; - display: block; -} - -.Menu--admin > .Menu-tabList li li a:link, -.Menu--admin > .Menu-tabList li li a:visited { - color: #000; -} - -.Menu--admin > .Menu-tabList li li a:hover, -.Menu--admin > .Menu-tabList li li a.active { - color: @theme-color-menu-contrast-textActive !important; - background: @theme-color-menu-contrast-background; - border-color: #000; -} - -.Menu--admin > .Menu-tabList li li a:hover { - text-decoration: underline; -} - -.Menu--admin > .Menu-tabList li li a.current { - background: #defdbb; -} diff --git a/plugins/CoreAdminHome/templates/_menu.twig b/plugins/CoreAdminHome/templates/_menu.twig deleted file mode 100644 index 080f36e93c..0000000000 --- a/plugins/CoreAdminHome/templates/_menu.twig +++ /dev/null @@ -1,3 +0,0 @@ -{% import '@CoreHome/macros.twig' as corehome %} - -{{ corehome.sidebarMenu(adminMenu, currentModule, currentAction) }} \ No newline at end of file diff --git a/plugins/CoreHome/CoreHome.php b/plugins/CoreHome/CoreHome.php index 23da8326aa..802c79004b 100644 --- a/plugins/CoreHome/CoreHome.php +++ b/plugins/CoreHome/CoreHome.php @@ -61,7 +61,6 @@ class CoreHome extends \Piwik\Plugin $stylesheets[] = "plugins/Morpheus/stylesheets/base.less"; $stylesheets[] = "plugins/Morpheus/stylesheets/main.less"; $stylesheets[] = "plugins/CoreHome/stylesheets/coreHome.less"; - $stylesheets[] = "plugins/CoreHome/stylesheets/menu.less"; $stylesheets[] = "plugins/CoreHome/stylesheets/dataTable.less"; $stylesheets[] = "plugins/CoreHome/stylesheets/cloud.less"; $stylesheets[] = "plugins/CoreHome/stylesheets/jquery.ui.autocomplete.css"; @@ -72,9 +71,12 @@ class CoreHome extends \Piwik\Plugin $stylesheets[] = "plugins/CoreHome/stylesheets/sparklineColors.less"; $stylesheets[] = "plugins/CoreHome/stylesheets/notification.less"; $stylesheets[] = "plugins/CoreHome/stylesheets/zen-mode.less"; + $stylesheets[] = "plugins/CoreHome/stylesheets/layout.less"; $stylesheets[] = "plugins/CoreHome/angularjs/enrichedheadline/enrichedheadline.directive.less"; $stylesheets[] = "plugins/CoreHome/angularjs/dialogtoggler/ngdialog.less"; $stylesheets[] = "plugins/CoreHome/angularjs/notification/notification.directive.less"; + $stylesheets[] = "plugins/CoreHome/angularjs/quick-access/quick-access.directive.less"; + $stylesheets[] = "plugins/CoreHome/angularjs/selector/selector.directive.less"; } public function getJsFiles(&$jsFiles) @@ -163,6 +165,11 @@ class CoreHome extends \Piwik\Plugin $jsFiles[] = "plugins/CoreHome/angularjs/ajax-form/ajax-form.controller.js"; $jsFiles[] = "plugins/CoreHome/angularjs/ajax-form/ajax-form.directive.js"; + + $jsFiles[] = "plugins/CoreHome/angularjs/quick-access/quick-access.controller.js"; + $jsFiles[] = "plugins/CoreHome/angularjs/quick-access/quick-access.directive.js"; + + $jsFiles[] = "plugins/CoreHome/angularjs/selector/selector.directive.js"; } public function getClientSideTranslationKeys(&$translationKeys) @@ -171,8 +178,11 @@ class CoreHome extends \Piwik\Plugin $translationKeys[] = 'General_Loading'; $translationKeys[] = 'General_Show'; $translationKeys[] = 'General_Hide'; - $translationKeys[] = 'Intl_Year_Short'; + $translationKeys[] = 'General_Website'; + $translationKeys[] = 'General_ChooseWebsite'; + $translationKeys[] = 'Intl_YearShort'; $translationKeys[] = 'General_MultiSitesSummary'; + $translationKeys[] = 'General_SearchNoResults'; $translationKeys[] = 'CoreHome_YouAreUsingTheLatestVersion'; $translationKeys[] = 'CoreHome_IncludeRowsWithLowPopulation'; $translationKeys[] = 'CoreHome_ExcludeRowsWithLowPopulation'; @@ -184,6 +194,7 @@ class CoreHome extends \Piwik\Plugin $translationKeys[] = 'CoreHome_UnFlattenDataTable'; $translationKeys[] = 'CoreHome_ExternalHelp'; $translationKeys[] = 'CoreHome_ClickToEditX'; + $translationKeys[] = 'CoreHome_Menu'; $translationKeys[] = 'SitesManager_NotFound'; $translationKeys[] = 'Annotations_ViewAndAddAnnotations'; $translationKeys[] = 'General_RowEvolutionRowActionTooltipTitle'; @@ -255,8 +266,10 @@ class CoreHome extends \Piwik\Plugin $translationKeys[] = 'General_LoadingData'; $translationKeys[] = 'General_ErrorRequest'; $translationKeys[] = 'General_YourChangesHaveBeenSaved'; + $translationKeys[] = 'General_LearnMore'; $translationKeys[] = 'CoreHome_UndoPivotBySubtable'; $translationKeys[] = 'CoreHome_PivotBySubtable'; - $translationKeys[] = 'General_LearnMore'; + $translationKeys[] = 'CoreHome_QuickAccessTitle'; + $translationKeys[] = 'CoreHome_Segments'; } } diff --git a/plugins/CoreHome/Menu.php b/plugins/CoreHome/Menu.php index 83e5d053d6..03c847ac97 100644 --- a/plugins/CoreHome/Menu.php +++ b/plugins/CoreHome/Menu.php @@ -27,24 +27,24 @@ class Menu extends \Piwik\Plugin\Menu } if (Plugin\Manager::getInstance()->isPluginActivated('Feedback')) { - $menu->addItem('General_Help', null, array('module' => 'Feedback', 'action' => 'index')); + $menu->addItem('icon-help', null, array('module' => 'Feedback', 'action' => 'index'), $order = 990, Piwik::translate('General_Help')); } if (Piwik::isUserIsAnonymous()) { - if (Plugin\Manager::getInstance()->isPluginActivated('Feedback')) { - $menu->addItem($login, null, array('module' => 'Feedback', 'action' => 'index'), 998); + if (Plugin\Manager::getInstance()->isPluginActivated('ScheduledReports')) { + $menu->addItem('icon-user', null, array('module' => 'ScheduledReports', 'action' => 'index'), 970, $login); } else { - $menu->addItem($login, null, array('module' => 'API', 'action' => 'listAllAPI'), 998); + $menu->addItem('icon-user', null, array('module' => 'API', 'action' => 'listAllAPI'), 970, $login); } } else { - $menu->addItem($login, null, array('module' => 'UsersManager', 'action' => 'userSettings'), 998); + $menu->addItem('icon-user', null, array('module' => 'UsersManager', 'action' => 'userSettings'), 970, $login); } $module = $this->getLoginModule(); if (Piwik::isUserIsAnonymous()) { - $menu->addItem('Login_LogIn', null, array('module' => $module, 'action' => false), 999); + $menu->addItem('icon-sign-in', null, array('module' => $module, 'action' => false), 1000, Piwik::translate('Login_LogIn')); } else { - $menu->addItem('General_Logout', null, array('module' => $module, 'action' => 'logout', 'idSite' => null), 999); + $menu->addItem('icon-sign-out', null, array('module' => $module, 'action' => 'logout', 'idSite' => null), 1000, Piwik::translate('General_Logout')); } } diff --git a/plugins/CoreHome/angularjs/enrichedheadline/enrichedheadline.directive.less b/plugins/CoreHome/angularjs/enrichedheadline/enrichedheadline.directive.less index 054c0bdba0..4ffb8326f0 100644 --- a/plugins/CoreHome/angularjs/enrichedheadline/enrichedheadline.directive.less +++ b/plugins/CoreHome/angularjs/enrichedheadline/enrichedheadline.directive.less @@ -2,6 +2,16 @@ display: none; } +[piwik-enriched-headline] { + visibility: hidden; + height: 47px; +} + +[piwik-enriched-headline].ng-isolate-scope { + visibility: visible; + height: auto; +} + .enrichedHeadline { min-height: 22px; diff --git a/plugins/CoreHome/angularjs/menudropdown/menudropdown.directive.less b/plugins/CoreHome/angularjs/menudropdown/menudropdown.directive.less index da8b79a1fc..05d0a0771f 100644 --- a/plugins/CoreHome/angularjs/menudropdown/menudropdown.directive.less +++ b/plugins/CoreHome/angularjs/menudropdown/menudropdown.directive.less @@ -25,7 +25,7 @@ } .items { - z-index: 21; + z-index: 200; position: absolute; border: 1px solid @color-silver-l80 !important; background: @theme-color-background-base; @@ -41,7 +41,7 @@ .search_ico { position: absolute; right: 25px; - top: 22px; + top: 27px; margin: 0px; left: initial; } @@ -74,11 +74,11 @@ text-align: left; &:hover { - background: @color-silver-l80; + background: @theme-color-background-tinyContrast; } &.active { - background-color: @color-silver-l80; + background-color: @theme-color-background-tinyContrast; } &.category { diff --git a/plugins/CoreHome/angularjs/quick-access/quick-access.controller.js b/plugins/CoreHome/angularjs/quick-access/quick-access.controller.js new file mode 100644 index 0000000000..9e1fefba82 --- /dev/null +++ b/plugins/CoreHome/angularjs/quick-access/quick-access.controller.js @@ -0,0 +1,78 @@ +/*! + * Piwik - free/libre analytics platform + * + * @link http://piwik.org + * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later + */ +(function () { + angular.module('piwikApp').controller('QuickAccessController', QuickAccessController); + + QuickAccessController.$inject = ['$scope', '$filter', 'siteSelectorModel']; + + function QuickAccessController($scope, $filter, siteSelectorModel){ + + this.menuItems = []; + this.numMenuItems = 0; + this.sitesModel = siteSelectorModel; + + this.onKeypress = function (event) { + if (38 == event.which) { + $scope.highlightPreviousItem(); + event.preventDefault(); + } else if (40 == event.which) { + $scope.highlightNextItem(); + event.preventDefault(); + } else if (13 == event.which) { + $scope.clickQuickAccessMenuItem(); + } + }; + + this.searchMenu = function (searchTerm) { + searchTerm = searchTerm.toLowerCase(); + + var index = -1; + var menuItemsIndex = {}; + var menuItems = []; + + var moveToCategory = function (i, submenuItem) { + submenuItem = angular.copy(submenuItem); // force rerender of element to prevent weird side effects + submenuItem.menuIndex = ++index; // needed for proper highlighting with arrow keys + + var category = submenuItem.category; + if (!(category in menuItemsIndex)) { + menuItems.push({title: category, items: []}); + menuItemsIndex[category] = menuItems.length - 1; + } + + var indexOfCategory = menuItemsIndex[category]; + menuItems[indexOfCategory].items.push(submenuItem); + }; + + $scope.resetSearchIndex(); + + if ($scope.hasSitesSelector) { + this.sitesModel.searchSite(searchTerm); + } + + var topMenuItems = $filter('filter')($scope.getTopMenuItems(), searchTerm); + var leftMenuItems = $filter('filter')($scope.getLeftMenuItems(), searchTerm); + var segmentItems = $filter('filter')($scope.getSegmentItems(), searchTerm); + + $.each(topMenuItems, moveToCategory); + $.each(leftMenuItems, moveToCategory); + $.each(segmentItems, moveToCategory); + + this.numMenuItems = topMenuItems.length + leftMenuItems.length + segmentItems.length; + this.menuItems = menuItems; + }; + + this.selectSite = function (idsite) { + this.sitesModel.loadSite(idsite); + }; + + this.selectMenuItem = function (index) { + $scope.selectMenuItem(index); + }; + + } +})(); diff --git a/plugins/CoreHome/angularjs/quick-access/quick-access.directive.html b/plugins/CoreHome/angularjs/quick-access/quick-access.directive.html new file mode 100644 index 0000000000..ccf97c14dc --- /dev/null +++ b/plugins/CoreHome/angularjs/quick-access/quick-access.directive.html @@ -0,0 +1,36 @@ +<div class="quick-access" title="{{ 'CoreHome_QuickAccessTitle' | translate }}" + ng-class="{active: view.searchActive, expanded: view.searchActive}" + piwik-focus-anywhere-but-here="view.searchActive = false;"> + <span class="icon-search" ng-hide="search.term || view.searchActive" + ng-mouseenter="view.searchActive=true"></span> + <input ng-keydown="quickAccess.onKeypress($event)" + ng-change="view.searchActive=true;quickAccess.searchMenu(search.term)" + ng-focus="view.searchActive=true" + ng-model="search.term" piwik-focus-if="view.searchActive" + type="text"/> + <ul ng-hide="!search.term || !view.searchActive || (quickAccess.numMenuItems > 0) || (quickAccess.sitesModel.sites | length)"> + <li class="no-result">{{ 'General_SearchNoResults' | translate }}</li> + </ul> + <ul ng-show="search.term && view.searchActive" ng-repeat="subcategory in quickAccess.menuItems"> + <li class="quick-access-category" + ng-click="search.term = subcategory.title;quickAccess.searchMenu(search.term)">{{ subcategory.title }}</li> + <li class="result" + ng-class="{selected: submenuEntry.menuIndex == search.index}" + ng-mouseenter="search.index=submenuEntry.menuIndex" + ng-click="quickAccess.selectMenuItem(submenuEntry.index)" + ng-repeat="submenuEntry in subcategory.items"><a>{{ submenuEntry.name | trim }}</a></li> + </ul> + <ul ng-show="search.term && view.searchActive"> + <li class="quick-access-category websiteCategory" + ng-show="hasSitesSelector && ((quickAccess.sitesModel.sites | length) || quickAccess.sitesModel.isLoading)" + >{{ 'SitesManager_Sites' | translate }}</li> + <li class="no-result" + ng-show="hasSitesSelector && quickAccess.sitesModel.isLoading">{{ 'MultiSites_LoadingWebsites' | translate }}</li> + <li class="result" + ng-show="hasSitesSelector && !quickAccess.sitesModel.isLoading" + ng-mouseenter="search.index=(quickAccess.numMenuItems + $index)" + ng-class="{selected: (quickAccess.numMenuItems + $index) == search.index}" + ng-click="quickAccess.selectSite(site.idsite)" + ng-repeat="site in quickAccess.sitesModel.sites"><a ng-bind-html="site.name"></a></li> + </ul> +</div> \ No newline at end of file diff --git a/plugins/CoreHome/angularjs/quick-access/quick-access.directive.js b/plugins/CoreHome/angularjs/quick-access/quick-access.directive.js new file mode 100644 index 0000000000..226b325ee0 --- /dev/null +++ b/plugins/CoreHome/angularjs/quick-access/quick-access.directive.js @@ -0,0 +1,258 @@ +/*! + * Piwik - free/libre analytics platform + * + * @link http://piwik.org + * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later + */ + +/** + * Usage: + * <div piwik-dialog="showDialog">...</div> + * Will show dialog once showDialog evaluates to true. + * + * Will execute the "executeMyFunction" function in the current scope once the yes button is pressed. + */ +(function () { + angular.module('piwikApp').directive('piwikQuickAccess', QuickAccessDirective); + + QuickAccessDirective.$inject = ['$rootElement', '$timeout', 'piwik']; + + function QuickAccessDirective ($rootElement, $timeout, piwik) { + + return { + restrict: 'A', + replace: true, + scope: {}, + templateUrl: 'plugins/CoreHome/angularjs/quick-access/quick-access.directive.html?cb=' + piwik.cacheBuster, + controller: 'QuickAccessController', + controllerAs: 'quickAccess', + link: function (scope, element, attrs) { + + var menuIndex = -1; // the menu index is used to identify which element to click + var topMenuItems = []; // cache for top menu items + var leftMenuItems = []; // cache for left menu items + var segmentItems = []; // cache for segment items + var hasSegmentSelector = angular.element('.segmentEditorPanel').length; + scope.hasSitesSelector = angular.element('[piwik-siteselector]').length; + + function trim(str) { + return str.replace(/^\s+|\s+$/g,''); + } + + scope.getTopMenuItems = function() + { + if (topMenuItems && topMenuItems.length) { + return topMenuItems; + } + + var category = _pk_translate('CoreHome_Menu'); + + $rootElement.find('#topRightBar .navbar-right li > a').each(function (index, element) { + var $element = $(element); + + if ($element.is('#topmenu-usersmanager')) { + // ignore languages manager + return; + } + + var text = trim($element.text()); + + if (!text) { + text = trim($element.attr('title')); // possibly a icon, use title instead + } + + if (text) { + topMenuItems.push({name: text, index: ++menuIndex, category: category}); + $element.attr('quick_access', menuIndex); + } + }); + + return topMenuItems; + }; + + scope.getLeftMenuItems = function () + { + if (leftMenuItems && leftMenuItems.length) { + return leftMenuItems; + } + + $rootElement.find('#secondNavBar .menuTab').each(function (index, element) { + var $element = angular.element(element); + var category = trim($element.find('> .item').text()); + + if (category && -1 !== category.lastIndexOf("\n")) { + // remove "\n\nMenu" + category = trim(category.substr(0, category.lastIndexOf("\n"))); + } + + $element.find('li .item').each(function (i, element) { + var $element = angular.element(element); + var text = trim($element.text()); + + if (text) { + leftMenuItems.push({name: text, category: category, index: ++menuIndex}); + $element.attr('quick_access', menuIndex); + } + }) + + }); + + return leftMenuItems; + }; + + scope.getSegmentItems = function() + { + if (!hasSegmentSelector) { + return []; + } + + if (segmentItems && segmentItems.length) { + return segmentItems; + } + + var category = _pk_translate('CoreHome_Segments'); + + $rootElement.find('.segmentList [data-idsegment]').each(function (index, element) { + var $element = angular.element(element); + var text = trim($element.find('.segname').text()); + + if (text) { + segmentItems.push({name: text, category: category, index: ++menuIndex}); + $element.attr('quick_access', menuIndex); + } + }); + + return segmentItems; + }; + + scope.activateSearch = function() + { + scope.$eval('view.searchActive = true'); + $timeout(function () { + scope.$apply(); + }, 0); + }; + + scope.deactivateSearch = function() + { + scope.$eval('search.term = ""'); + scope.$eval('view.searchActive = false'); + element.find('input').blur(); + $timeout(function () { + scope.$apply(); + }, 0); + }; + + function isElementInViewport(element) { + + var rect = element.getBoundingClientRect(); + + return ( + rect.top >= 0 && + rect.left >= 0 && + rect.bottom <= $(window).height() && + rect.right <= $(window).width() + ); + } + + function getCurrentlySelectedElement(index) + { + var results = element.find('li.result'); + if (results && results.length && results[scope.search.index]) { + return $(results[scope.search.index]); + } + } + + function makeSureSelectedItemIsInViewport() { + var element = getCurrentlySelectedElement(); + + if (element && element[0] && !isElementInViewport(element[0])) { + scrollFirstElementIntoView(element); + } + } + + function scrollFirstElementIntoView(element) + { + if (element && element[0] && element[0].scrollIntoView) { + // make sure search is visible + element[0].scrollIntoView(); + } + } + + scope.highlightPreviousItem = function() + { + if (0 >= (scope.search.index - 1)) { + scope.search.index = 0; + } else { + scope.search.index--; + } + makeSureSelectedItemIsInViewport(); + }; + + scope.resetSearchIndex = function () { + scope.search.index = 0; + makeSureSelectedItemIsInViewport(); + }; + + scope.highlightNextItem = function() + { + var numTotal = element.find('li.result').length; + + if (numTotal <= (scope.search.index + 1)) { + scope.search.index = numTotal - 1; + } else { + scope.search.index++; + } + + makeSureSelectedItemIsInViewport(); + }; + + scope.clickQuickAccessMenuItem = function() + { + var selectedMenuElement = getCurrentlySelectedElement(); + if (selectedMenuElement) { + $timeout(function () { + selectedMenuElement.click(); + }, 20); + } + }; + + scope.selectMenuItem = function(index) + { + var target = $rootElement.find('[quick_access=' + index + ']'); + + if (target && target.length && target[0]) { + scope.deactivateSearch(); + + var actualTarget = target[0]; + + var href = $(actualTarget).attr('href'); + + if (href && href.length > 10 && actualTarget && actualTarget.click) { + try { + actualTarget.click(); + } catch (e) { + $(actualTarget).click(); + } + } else { + $(actualTarget).click(); + } + } + }; + + Mousetrap.bind('f', function(event) { + if (event.preventDefault) { + event.preventDefault(); + } else { + event.returnValue = false; // IE + } + + scrollFirstElementIntoView(element); + + scope.activateSearch(); + }); + + } + }; + } +})(); \ No newline at end of file diff --git a/plugins/CoreHome/angularjs/quick-access/quick-access.directive.less b/plugins/CoreHome/angularjs/quick-access/quick-access.directive.less new file mode 100644 index 0000000000..1c46c7533d --- /dev/null +++ b/plugins/CoreHome/angularjs/quick-access/quick-access.directive.less @@ -0,0 +1,55 @@ +.quick-access { + position: relative; + + li { + font-size: 11px; + } + + li a { + padding: 10px 19px; + display: inline-block; + text-decoration: none; + word-break: break-all; + } + + .icon-search { + position: absolute; + font-size: 14px; + top: 10px; + left: 10px; + + } + input { + width:100%; + height: 100%; + border: 0 !important; + box-shadow: 0 0 !important; + border-radius: 0 !important; + font-size: 11px; + &:focus { + outline: none; + } + } + .selected { + background-color: @theme-color-background-tinyContrast !important; + } + .quick-access-category { + text-align: left !important; + font-size: 11px; + padding: 5px 5px 5px 10px; + cursor: pointer; + } + .result { + cursor: pointer; + } + .quick-access-category:hover { + background: none !important; + } + .no-result { + padding: 10px 19px; + cursor: default; + } + .websiteCategory { + cursor: default; + } +} \ No newline at end of file diff --git a/plugins/CoreHome/angularjs/selector/selector.directive.js b/plugins/CoreHome/angularjs/selector/selector.directive.js new file mode 100644 index 0000000000..eec9dda6d1 --- /dev/null +++ b/plugins/CoreHome/angularjs/selector/selector.directive.js @@ -0,0 +1,86 @@ +/*! + * Piwik - free/libre analytics platform + * + * @link http://piwik.org + * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later + */ + +/** + * + */ +(function () { + angular.module('piwikApp').directive('piwikExpandOnClick', piwikExpandOnClick); + + piwikExpandOnClick.$inject = ['$document']; + + function piwikExpandOnClick($document){ + + return { + restrict: 'A', + link: function(scope, element, attr) { + element.find('.title').on('click', function () { + element.toggleClass('expanded'); + }); + + function onClickOutsideElement (event) { + if (element.has(event.target).length === 0) { + element.removeClass('expanded'); + } + } + + function onEscapeHandler (event) { + if (event.which === 27) { + element.removeClass('expanded'); + } + } + + $document.on('keyup', onEscapeHandler); + $document.on('mouseup', onClickOutsideElement); + scope.$on('$destroy', function() { + $document.off('mouseup', onClickOutsideElement); + $document.off('keyup', onEscapeHandler); + }); + } + }; + } + + angular.module('piwikApp').directive('piwikExpandOnHover', piwikExpandOnHover); + + piwikExpandOnHover.$inject = ['$document']; + + function piwikExpandOnHover($document){ + + return { + restrict: 'A', + link: function(scope, element, attr) { + + element.on('mouseenter', '.title', function () { + element.addClass('expanded'); + }); + + element.on('mouseleave', function () { + element.removeClass('expanded'); + }); + + function onClickOutsideElement (event) { + if (element.has(event.target).length === 0) { + element.removeClass('expanded'); + } + } + + function onEscapeHandler (event) { + if (event.which === 27) { + element.removeClass('expanded'); + } + } + + $document.on('keyup', onEscapeHandler); + $document.on('mouseup', onClickOutsideElement); + scope.$on('$destroy', function() { + $document.off('mouseup', onClickOutsideElement); + $document.off('keyup', onEscapeHandler); + }); + } + }; + } +})(); diff --git a/plugins/CoreHome/angularjs/selector/selector.directive.less b/plugins/CoreHome/angularjs/selector/selector.directive.less new file mode 100644 index 0000000000..9c0e207d4d --- /dev/null +++ b/plugins/CoreHome/angularjs/selector/selector.directive.less @@ -0,0 +1,59 @@ +.piwikSelector { + display: inline-block; + line-height: 0; + + span.title, + a.title { + .font-default(11px, 12px); + display: inline-block; + width: 100%; + padding: 11px 19px 10px; + white-space: nowrap; + cursor: pointer; + text-transform: uppercase; + text-decoration: none; + color: @theme-color-text; + + &.activityIndicator { + background: url(plugins/Morpheus/images/loading-blue.gif) no-repeat right 9px; + + .icon { + visibility: hidden; + } + } + + .icon { + padding-left: 6px; + display: inline-block; + vertical-align: top; + + &.iconHidden { + visibility: hidden; + } + } + + .icon:not(.icon-fixed) { + float: right; + &:after { + clear:right; + content: ' '; + } + } + + &:hover, &:focus { + text-decoration: none; + } + } + + .dropdown { + .font-default(11px, 15px); + display: none; + padding: 5px 19px 11px 19px; + } + + &.expanded { + .dropdown { + display: block; + } + } +} diff --git a/plugins/CoreHome/angularjs/siteselector/siteselector.directive.html b/plugins/CoreHome/angularjs/siteselector/siteselector.directive.html index 5f6a3cac8a..3a4cbec8f2 100644 --- a/plugins/CoreHome/angularjs/siteselector/siteselector.directive.html +++ b/plugins/CoreHome/angularjs/siteselector/siteselector.directive.html @@ -1,5 +1,6 @@ -<div piwik-focus-anywhere-but-here="view.showSitesList=false" class="custom_select" - ng-class="{'sites_autocomplete--dropdown': (model.hasMultipleWebsites || showAllSitesItem || !model.sites.length)}"> +<div piwik-focus-anywhere-but-here="view.showSitesList=false" + class="siteSelector piwikSelector borderedControl" + ng-class="{'expanded': view.showSitesList}"> <script type="text/ng-template" id="siteselector_allsiteslink.html"> <div ng-click="switchSite({idsite: 'all', name: allSitesText});view.showSitesList=false;" @@ -13,13 +14,19 @@ <input ng-if="inputName" type="hidden" name="{{ inputName }}" ng-value="selectedSite.id"/> <a ng-click="view.showSitesList=!view.showSitesList; view.showSitesList && model.loadInitialSites();" + piwik-onenter="view.showSitesList=!view.showSitesList; view.showSitesList && model.loadInitialSites();" href="javascript:void(0)" - class="custom_select_main_link" - ng-class="{'loading': model.isLoading}"> - <span ng-bind-html="selectedSite.name || model.firstSiteName">?</span> + title="{{ 'General_ChooseWebsite'|translate }}" + ng-class="{'loading': model.isLoading}" + class="title"> + <span class="icon icon-arrow-bottom" + ng-class="{'iconHidden': model.isLoading, 'collapsed': !view.showSitesList}"></span> + <span>{{ 'General_Website'| translate }}: + <span ng-bind-html="selectedSite.name || model.firstSiteName">?</span> + </span> </a> - <div ng-show="view.showSitesList" class="custom_select_block"> + <div ng-show="view.showSitesList" class="dropdown"> <div ng-if="allSitesLocation=='top' && showAllSitesItem" ng-include="'siteselector_allsiteslink.html'"></div> @@ -49,10 +56,8 @@ ng-click="view.searchTerm=''" ng-model="view.searchTerm" ng-change="model.searchSite(view.searchTerm)" + placeholder="{{ 'General_Search' | translate }}" class="websiteSearch inp"/> - <input type="submit" - ng-click="model.searchSite(view.searchTerm)" - value="{{ 'General_Search' | translate }}" class="but"/> <img title="Clear" ng-show="view.searchTerm" ng-click="view.searchTerm=''; model.loadInitialSites()" diff --git a/plugins/CoreHome/angularjs/siteselector/siteselector.directive.js b/plugins/CoreHome/angularjs/siteselector/siteselector.directive.js index 450813f2e1..ba5c492cb8 100644 --- a/plugins/CoreHome/angularjs/siteselector/siteselector.directive.js +++ b/plugins/CoreHome/angularjs/siteselector/siteselector.directive.js @@ -26,9 +26,9 @@ (function () { angular.module('piwikApp').directive('piwikSiteselector', piwikSiteselector); - piwikSiteselector.$inject = ['$document', 'piwik', '$filter']; + piwikSiteselector.$inject = ['$document', 'piwik', '$filter', '$timeout']; - function piwikSiteselector($document, piwik, $filter){ + function piwikSiteselector($document, piwik, $filter, $timeout){ var defaults = { name: '', siteid: piwik.idSite, @@ -85,6 +85,10 @@ scope.$watch('view.showSitesList', function (newValue) { element.toggleClass('expanded', !! newValue); }); + + $timeout(function () { + initTopControls(); + }); }; } }; diff --git a/plugins/CoreHome/angularjs/siteselector/siteselector.directive.less b/plugins/CoreHome/angularjs/siteselector/siteselector.directive.less index 8b38e556df..b0818ac472 100644 --- a/plugins/CoreHome/angularjs/siteselector/siteselector.directive.less +++ b/plugins/CoreHome/angularjs/siteselector/siteselector.directive.less @@ -1,155 +1,137 @@ - -/*sites_autocomplete*/ -.sites_autocomplete { - position: absolute; - font-size: 12px; - display: inline-block; - height: 30px; /* Hack to not push the dashboard widget below */ -} - -table.dataTable tr td .sites_autocomplete a { - width: auto; -} - -.sites_selector_in_dashboard { - margin-top:10px; -} -.top_bar_sites_selector { - float: right -} - -.top_bar_sites_selector > label { - display: inline-block; - padding: 7px 0 6px 0; - float: left; - font-size: 12px; -} - -.top_bar_sites_selector > .sites_autocomplete { - position: static; - margin-left: 12px; -} - .autocompleteMatched { color: #5256BE; font-weight: bold; } - -.sites_autocomplete .custom_select { - float: left; - position: relative; - z-index: 19; - background: @theme-color-background-base url(plugins/Morpheus/images/sites_selection.png) repeat-x 0 0; - border: 1px solid @color-silver-l85; - color: #255792; - border-radius: 4px; - cursor: pointer; - width: 205px; -} - -.sites_autocomplete .custom_select_main_link { - display: block; - text-decoration: none; - background: none; - cursor: default; - padding: 9px 5px 7px 5px; -} - -#content.admin .adminTable .sites_autocomplete a { - text-decoration: none; -} - -.sites_autocomplete .custom_select_ul_list li a, -.sites_autocomplete .custom_select_all a, -.sites_autocomplete .custom_select_main_link > span { +.siteSelector { + a.title { + .icon.collapsed.iconHidden { + visibility: visible; + } + } + .dropdown { + max-width: 210px; + } +} + +#content { + .sites_autocomplete { + position: static !important; + height: 36px; + z-index: 99; + vertical-align: middle; + + > .siteSelector { + position: absolute; + z-index: 9999; + } + + a.title { + text-decoration: none; + } + } +} + +.siteSelector.expanded { + .loading { + background: url(plugins/Morpheus/images/loading-blue.gif) no-repeat right 9px; + } +} + +.siteSelector a.title, +.siteSelector .custom_select_ul_list li a, +.siteSelector .custom_select_all a, +.siteSelector .custom_select_main_link > span { display: inline-block; - max-width: 170px; + max-width: 210px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; - padding: 0 10px 0 4px; -} - -.sites_autocomplete--dropdown .custom_select_main_link:not(.loading):before { - content: " \25BC"; - position: absolute; - right: 0; - font-size: 0.8em; - margin-top: 0.2em; - color: @theme-color-text-light; - margin-top: 9px; + padding: 0; + color: @theme-color-text; + text-transform: uppercase; + width: 100%; } -.sites_autocomplete--dropdown .custom_select_main_link { - cursor: pointer; - position: relative; -} +.siteSelector a.title { + > span { + max-width: 161px; + display: inline-block; + overflow: hidden; + text-overflow: ellipsis; + } -.sites_autocomplete .custom_select_main_link.loading { - background: url(plugins/Morpheus/images/loading-blue.gif) no-repeat right 9px; + span { + vertical-align: top; + } } -.sites_autocomplete .custom_select_ul_list, -.sites_autocomplete ul.ui-autocomplete { +.siteSelector .custom_select_ul_list, +.siteSelector ul.ui-autocomplete { position: relative; list-style: none; line-height: 18px; padding: 0 0 15px 0; + box-shadow: none !important; } -.sites_autocomplete .custom_select_ul_list li a, -.sites_autocomplete .custom_select_all a { +.siteSelector .custom_select_ul_list { + padding: 0 0 5px 0; +} + +.siteSelector .dropdown { + padding-top: 0; +} + +.siteSelector .custom_select_ul_list li a, +.siteSelector .custom_select_all a { line-height: 18px; height: auto; display: block; text-decoration: none; + padding-left: 5px; + margin-left: -5px; } -.sites_autocomplete .custom_select_ul_list li a:hover, -.sites_autocomplete .custom_select_all a:hover { +.siteSelector .custom_select_ul_list li a:hover, +.siteSelector .custom_select_all a:hover { background: #ebeae6; } -.sites_autocomplete .custom_select_all a { +.siteSelector .custom_select_all a { text-decoration: none; - margin: 0 0 5px 0; + margin: 0 0 5px -5px; } -.sites_autocomplete .custom_select_search { - margin: 0 0 0 4px; - height: 26px; +.siteSelector .custom_select_search { + margin: 0; + height: 33px; display: block; white-space: nowrap; - background: url(plugins/Morpheus/images/search_bg.png) no-repeat 0 0; -} - -.sites_autocomplete .custom_select_search .inp { - vertical-align: top; - width: 165px; - padding: 2px 6px !important; - border: 0 !important; - background: transparent !important; - font-size: 10px !important; - color: #454545 !important; - -} -.sites_autocomplete { - width: 205px; -} - -.sites_autocomplete .custom_select_search .but { - vertical-align: top; - font-size: 10px; - border: 0; - background: transparent; - width: 21px; - height: 17px; - overflow: hidden; - opacity: 0; - cursor: pointer; + position: relative; + padding-top: 4px; + + .inp { + vertical-align: top; + width: 100%; + padding: 4px 6px !important; + border: 1px solid #d0d0d0 !important; + background: transparent !important; + font-size: 11px !important; + color: #454545 !important; + } + .reset { + position: absolute; + top: 4px; + right: 4px; + cursor: pointer; + } +} + +.siteSelector { + width: auto; } -.sites_selector_container>.sites_autocomplete { +.sites_selector_container>.siteSelector { padding-left: 12px; } @@ -158,17 +140,6 @@ table.dataTable tr td .sites_autocomplete a { float:none;position:static } -.custom_select_search .reset { - position: relative; top: 3px; left: -50px; cursor: pointer; -} - -.custom_select_block { - overflow: hidden; - max-width: inherit; - visibility: visible; - padding: 0 5px 7px 5px; -} - .custom_select_block_show { height: auto; overflow: visible; diff --git a/plugins/CoreHome/javascripts/calendar.js b/plugins/CoreHome/javascripts/calendar.js index ceb11e4ec4..d4119de31b 100644 --- a/plugins/CoreHome/javascripts/calendar.js +++ b/plugins/CoreHome/javascripts/calendar.js @@ -473,21 +473,6 @@ toggleMonthDropdown(selectedPeriod == 'year'); }); - // reset date/period when opening calendar - $("#periodString").on('click', "#date,.calendar-icon", function () { - var periodMore = $("#periodMore").toggle(); - if (periodMore.is(":visible")) { - periodMore.find(".ui-state-highlight").removeClass('ui-state-highlight'); - } - }); - - $('body').on('click', function(e) { - var target = $(e.target); - if (target.closest('html').length && !target.closest('#periodString').length && !target.is('option') && $("#periodMore").is(":visible")) { - $("#periodMore").hide(); - } - }); - function onDateRangeSelect(dateText, inst) { var toOrFrom = inst.id == 'calendarFrom' ? 'From' : 'To'; $('#inputCalendar' + toOrFrom).val(dateText); diff --git a/plugins/CoreHome/javascripts/corehome.js b/plugins/CoreHome/javascripts/corehome.js index 5bddc23f9e..4580ddca8c 100755 --- a/plugins/CoreHome/javascripts/corehome.js +++ b/plugins/CoreHome/javascripts/corehome.js @@ -16,9 +16,13 @@ var headerMessageParent = $('#header_message').parent(); // when 'check for updates...' link is clicked, force a check & display the result - headerMessageParent.on('click', '#updateCheckLinkContainer', function (e) { + headerMessageParent.on('click', '.title', function (e) { e.preventDefault(); + if (!$(this).find('#updateCheckLinkContainer').length) { + return; + } + var headerMessage = $(this).closest('#header_message'); var ajaxRequest = new ajaxHelper(); @@ -27,16 +31,23 @@ module: 'CoreHome', action: 'checkForUpdates' }, 'get'); + + var $titleElement = $(this); + $titleElement.addClass('activityIndicator'); ajaxRequest.setCallback(function (response) { headerMessage.fadeOut('slow', function () { response = $(response); + $titleElement.removeClass('activityIndicator'); + var newVersionAvailable = response.hasClass('header_alert'); if (newVersionAvailable) { headerMessage.replaceWith(response); + headerMessage.show(); } else { - headerMessage.html(_pk_translate('CoreHome_YouAreUsingTheLatestVersion')).show(); + headerMessage.find('.title').html(_pk_translate('CoreHome_YouAreUsingTheLatestVersion')); + headerMessage.show(); setTimeout(function () { headerMessage.fadeOut('slow', function () { headerMessage.replaceWith(response); @@ -54,7 +65,7 @@ // when clicking the header message, show the long message w/o needing to hover headerMessageParent.on('click', '#header_message', function (e) { if (e.target.tagName.toLowerCase() != 'a') { - $(this).toggleClass('active'); + $(this).toggleClass('expanded'); } }); diff --git a/plugins/CoreHome/javascripts/menu.js b/plugins/CoreHome/javascripts/menu.js index 2f5e16c827..2f3a78a045 100644 --- a/plugins/CoreHome/javascripts/menu.js +++ b/plugins/CoreHome/javascripts/menu.js @@ -16,46 +16,76 @@ menu.prototype = { resetTimer: null, - adaptSubMenuHeight: function() { - var subNavHeight = $('.sfHover > ul').outerHeight(); - $('.nav_sep').height(subNavHeight); - }, - - overMainLI: function () { - var $this = $(this); - $this.siblings().removeClass('sfHover'); - $this.addClass('sfHover'); - menu.prototype.adaptSubMenuHeight(); - clearTimeout(menu.prototype.resetTimer); - }, - - outMainLI: function () { - clearTimeout(menu.prototype.resetTimer); - menu.prototype.resetTimer = setTimeout(function() { - $('.Menu-tabList > .sfHover', this.menuNode).removeClass('sfHover'); - $('.Menu-tabList > .sfActive', this.menuNode).addClass('sfHover'); - menu.prototype.adaptSubMenuHeight(); - }, 2000); - }, - onItemClick: function (e) { if (e.which === 2) { return; } - $('.Menu--dashboard').trigger('piwikSwitchPage', this); - broadcast.propagateAjax( $(this).attr('href').substr(1) ); - return false; + + $('#secondNavBar').trigger('piwikSwitchPage', this); + $('#secondNavBar').removeClass('open fadeInLeft'); + + if (!$('#content.admin').size()) { + broadcast.propagateAjax( $(this).attr('href').substr(1) ); + + return false; + } + + var href = $(this).attr('href'); + return !!href; + }, + + isAdmin: function () { + return !!$('#content.admin').size(); }, init: function () { - this.menuNode = $('.Menu--dashboard'); + this.menuNode = $('#secondNavBar'); - this.menuNode.find("li:has(ul),li#Searchmenu").hover(this.overMainLI, this.outMainLI); - this.menuNode.find("li:has(ul),li#Searchmenu").focusin(this.overMainLI); + // add id to all li menu to support menu identification. + // for all sub menu we want to have a unique id based on their module and action + // for main menu we want to add just the module as its id. + this.menuNode.find('li').each(function () { + var $this = $(this); + var link = $this.find('a'); - this.menuNode.find('a.menuItem').click(this.onItemClick); + var main_menu = $this.parent().hasClass('navbar') ? true : false; - menu.prototype.adaptSubMenuHeight(); + if (!link) { + return; + } + + var href = link.attr('href'); + if (!href) { + if (main_menu && !$this.find('li').length) { + $this.hide(); // no link and no child menu items -> hide it + } + return; + } + var url = href.substr(1); + + var module = broadcast.getValueFromUrl('module', url); + var action = broadcast.getValueFromUrl('action', url); + + var moduleId = broadcast.getValueFromUrl("idGoal", url) || broadcast.getValueFromUrl("idDashboard", url); + + if (main_menu) { + $this.attr({id: module}); + } + // if there's a idGoal or idDashboard, use this in the ID + else if (moduleId != '') { + $(this).attr({id: module + '_' + action + '_' + moduleId}); + } + else { + $(this).attr({id: module + '_' + action}); + } + }); + + this.menuNode.find('a.item').click(this.onItemClick); + + var self = this; + $('#header .toggle-second-menu').click(function () { + self.menuNode.toggleClass('open fadeInLeft'); + }); }, activateMenu: function (module, action, params) { @@ -63,13 +93,17 @@ menu.prototype = params.module = module; params.action = action; - this.menuNode.find('li').removeClass('sfHover').removeClass('sfActive'); + this.menuNode.find('li').removeClass('sfActive'); + + var isAdmin = this.isAdmin(); + var $activeLink = this.menuNode.find('a').filter(function () { var url = $(this).attr('href'); if (!url) { return false; } + var found = false; for (var key in params) { if (!params.hasOwnProperty(key) || !params[key] @@ -77,17 +111,27 @@ menu.prototype = continue; } - var actual = broadcast.getValueFromHash(key, url); + var actual; + + if (isAdmin) { + actual = broadcast.getValueFromUrl(key, url); + } else { + actual = broadcast.getValueFromHash(key, url); + } + if (actual != params[key]) { return false; } + + found = true; + // at least one param must match. Otherwise all menu items might be highlighted if params[key] = null; } - return true; + return found; }); - $activeLink.closest('li').addClass('sfHover'); - $activeLink.closest('li.menuTab').addClass('sfActive').addClass('sfHover'); + $activeLink.closest('li').addClass('sfActive'); + $activeLink.closest('li.menuTab').addClass('sfActive'); }, // getting the right li is a little tricky since goals uses idGoal, and overview is index. @@ -108,7 +152,7 @@ menu.prototype = loadFirstSection: function () { if (broadcast.isHashExists() == false) { - $('li:first a:first', this.menuNode).click().addClass('sfHover').addClass('sfActive'); + $('li:first a:first', this.menuNode).click().addClass('sfActive'); } } -}; +}; \ No newline at end of file diff --git a/plugins/CoreHome/javascripts/menu_init.js b/plugins/CoreHome/javascripts/menu_init.js index 490c859185..88a3fc21ad 100644 --- a/plugins/CoreHome/javascripts/menu_init.js +++ b/plugins/CoreHome/javascripts/menu_init.js @@ -1,14 +1,23 @@ $(function () { - var isPageHasMenu = $('.Menu--dashboard').size(); + var isPageHasMenu = $('#secondNavBar').size(); var isPageIsAdmin = $('#content.admin').size(); + if (isPageHasMenu) { piwikMenu = new menu(); piwikMenu.init(); - piwikMenu.loadFirstSection(); + if (isPageIsAdmin) { + piwikMenu.activateMenu(broadcast.getValueFromUrl('module'), broadcast.getValueFromUrl('action'), ''); + } else { + piwikMenu.loadFirstSection(); + } + } else if (!isPageIsAdmin) { + // eg multisites + initTopControls(); } if(isPageIsAdmin) { - // don't use broadcast in admin pages + // don't use broadcast in admin page + initTopControls(); return; } if(isPageHasMenu) { diff --git a/plugins/CoreHome/javascripts/top_controls.js b/plugins/CoreHome/javascripts/top_controls.js index 62ce3cecca..21947ca813 100644 --- a/plugins/CoreHome/javascripts/top_controls.js +++ b/plugins/CoreHome/javascripts/top_controls.js @@ -5,6 +5,24 @@ * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later */ function initTopControls() { + function getOverlap(element1, element2) + { + if (!element1 || !element1.getBoundingClientRect || !element2 || !element2.getBoundingClientRect) { + return 0; + } + + var rect1 = element1.getBoundingClientRect(); + var rect2 = element2.getBoundingClientRect(); + + var doOverlap = !(rect1.right < rect2.left || rect1.left > rect2.right); + + if (doOverlap) { + return rect1.left - rect2.right; + } + + return 0; + } + var $topControlsContainer = $('.top_controls'), left = 0; @@ -17,11 +35,19 @@ function initTopControls() { $control.css('left', left); - if (!$.contains($topControlsContainer[0], this)) { - $control.detach().appendTo($topControlsContainer); - } - left += $control.outerWidth(true); }); + + var header = $('#header_message.isPiwikDemo'); + if (header.length) { + // make sure isPiwikDemo message is always fully visible, move it to the right if needed + var lastSelector = $('.top_controls .piwikTopControl:last'); + + var overlap = getOverlap(header[0], lastSelector[0]); + if (header[0] !== lastSelector[0] && overlap !== 0) { + header.css('right', (Math.abs(overlap) + 18) * -1); + } + } + } } \ No newline at end of file diff --git a/plugins/CoreHome/lang/en.json b/plugins/CoreHome/lang/en.json index a6bab4a544..300c6fe15b 100644 --- a/plugins/CoreHome/lang/en.json +++ b/plugins/CoreHome/lang/en.json @@ -48,6 +48,8 @@ "YouAreUsingTheLatestVersion": "You are using the latest version of Piwik!", "ClickRowToExpandOrContract": "Click this row to expand or contract the subtable.", "UndoPivotBySubtable": "This report has been pivoted %s Undo pivot", - "PivotBySubtable": "This report is not pivoted %s Pivot by %s" + "PivotBySubtable": "This report is not pivoted %s Pivot by %s", + "QuickAccessTitle": "Search for menu entries, segments and websites. Shortcut: Press 'f' to search.", + "Segments": "Segments" } } diff --git a/plugins/CoreHome/stylesheets/coreHome.less b/plugins/CoreHome/stylesheets/coreHome.less index f9659cb85b..2e0277acf9 100644 --- a/plugins/CoreHome/stylesheets/coreHome.less +++ b/plugins/CoreHome/stylesheets/coreHome.less @@ -1,8 +1,7 @@ .home { h2 { font-size: 18px; - padding: 12px 0 7px 0; - clear: both; + padding: 16px 0 16px 0; border: none; margin: 0; } @@ -18,21 +17,19 @@ } } -.nav_sep { - height: 39px; - border-radius: 0 4px 0 0; - border: 1px solid #DDD; -} - -.pageWrap { - margin-top: 15px; - font-size: 13px; -} - /* Content */ #content.home { - padding-top: 5px; font-size: 14px; + display: inline-block; + width: 100%; + + > h2:first-child { + padding-top: 7px; + } +} + +#content.admin { + display: inline-block; } /* 2 columns reports */ @@ -203,10 +200,6 @@ a.Piwik_Popover_Error_Back { margin: 10px auto 5px !important; } -.header_short #updateCheckLinkContainer .icon { - display: none; -} - .header_full #updateCheckLinkContainer { margin-top: -2px; } @@ -222,39 +215,6 @@ a.Piwik_Popover_Error_Back { width: 160px; } -#updateCheckLinkContainer { - opacity: 0.7; -} - -#updateCheckLinkContainer:hover { - opacity: 1; -} - -#updateCheckLinkContainer { - float: right; - cursor: pointer; -} - -#updateCheckLinkContainer>* { - vertical-align: middle; -} - -#header_message #checkForUpdates { - font-size: 10px; - line-height: 16px; - display: inline-block; - vertical-align: middle; - text-transform: uppercase; -} - -#header_message #checkForUpdates { - text-decoration: none; -} - -#header_message #checkForUpdates:hover { - text-decoration: underline; -} - /* Used to link within content text, without adding visual clutter */ .linkContent { color:#333; text-decoration:none} .linkContent:hover { text-decoration:underline;} diff --git a/plugins/CoreHome/stylesheets/dataTable/_dataTable.less b/plugins/CoreHome/stylesheets/dataTable/_dataTable.less index 3544f17723..4b5f8321b2 100644 --- a/plugins/CoreHome/stylesheets/dataTable/_dataTable.less +++ b/plugins/CoreHome/stylesheets/dataTable/_dataTable.less @@ -168,7 +168,7 @@ div.dataTable, div.dataTable > .dataTableWrapper { color: #888; text-align: left; margin: 10px; - margin-left: 12px; + margin-left: 1px; } .dataTablePages { @@ -593,7 +593,7 @@ tr td.label img.plusMinus { .pk-emptyDataTable { padding-top: 20px; padding-bottom: 10px; - padding-left: 11px; + padding-left: 1px; } .widget .pk-emptyDataTable { diff --git a/plugins/CoreHome/stylesheets/jquery.ui.autocomplete.css b/plugins/CoreHome/stylesheets/jquery.ui.autocomplete.css index c3077b7b5f..8bac824f1c 100644 --- a/plugins/CoreHome/stylesheets/jquery.ui.autocomplete.css +++ b/plugins/CoreHome/stylesheets/jquery.ui.autocomplete.css @@ -59,7 +59,7 @@ } .ui-corner-all { - border-radius: 4px; + border-radius: 0; } .ui-menu .ui-menu-item a.ui-state-focus { diff --git a/plugins/CoreHome/stylesheets/layout.less b/plugins/CoreHome/stylesheets/layout.less new file mode 100644 index 0000000000..7b140d3ab3 --- /dev/null +++ b/plugins/CoreHome/stylesheets/layout.less @@ -0,0 +1,390 @@ + #header { + padding: 0 15px; + background-color: @theme-color-background-base; + height: 50px; + + /* Clear fix */ + &:after { + display: table; + clear: both; + content: ""; + } + + .icon-menu-hamburger { + display: none; + } + + #logo { + } + + #topRightBar { + li { + display: inline-block; + } + + .topBarElem { + color: @theme-color-text; + text-decoration: none; + padding: 14px 12px; + display: inline-block; + height: 100%; + transition: background-color 150ms linear; + + &:hover { + background-color: @theme-color-menu-contrast-background; + } + + &.active { + color: @theme-color-brand; + } + + .menuDropdown { + color: @theme-color-text; + .title:after { + color: @theme-color-text; + border-top-color: @theme-color-text; + } + } + } + + .navbar-right { + height: 48px; + position: absolute; + right: 10px; + font-size: 13px; + } + } +} + + .navbar { + a { + text-decoration: none; + &:hover, &:focus, &:active { + text-decoration: none; + } + } + } + + // start #secondNavBar fadeInLeft animation + @-webkit-keyframes fadeInLeft { + 0% { + opacity: 0; + -webkit-transform: translateX(-20px); + } + 100% { + opacity: 1; + -webkit-transform: translateX(0); + } + } + @keyframes fadeInLeft { + 0% { + opacity: 0; + transform: translateX(-20px); + } + 100% { + opacity: 1; + transform: translateX(0); + } + } + // end #secondNavBar fadeInLeft animation + +#root { + + .pageWrap { + padding-left: 18px; + padding-right: 15px; + } + + #secondNavBar + .pageWrap { + margin-left: 224px; + } + + #root>.top_controls { + margin-left:15px; + margin-right:15px; + } + + @media all and (max-width: 749px) { + .pageWrap { + margin-left: 0 !important; + } + + #header { + min-height: 50px; + height: auto; + } + + #topRightBar { + .navbar-right { + text-align: left; + margin-left: 2px; + display: inline-block; + position: relative; + height: auto; + min-height: 48px; + } + } + + #navbar-collapse1 { + margin-left: 45px; + } + + #secondNavBar { + z-index: 9999; + position: absolute; + border-right: 1px solid @theme-color-background-tinyContrast; + border-top: 1px solid @theme-color-background-tinyContrast; + -webkit-box-shadow: 4px 4px 18px 1px rgba(0,0,0,0.75); + -moz-box-shadow: 4px 4px 18px 1px rgba(0,0,0,0.75); + box-shadow: 4px 4px 18px 1px rgba(0,0,0,0.75); + -webkit-animation-duration: 0.3s; + animation-duration: 0.3s; + -webkit-animation-fill-mode: both; + animation-fill-mode: both; + -webkit-animation-timing-function: linear; + animation-timing-function: linear; + + display: none; + &.open { + display: block; + -webkit-animation-name: fadeInLeft; + animation-name: fadeInLeft; + } + + #search { + display: none; + } + } + + + .top_controls { + height: auto; + } + + .top_controls .piwikTopControl { + position: static !important; + margin: 0 0 10px; + float: none; + } + + .icon-menu-hamburger { + padding: 10px 10px 10px; + display: inline-block; + float: left; + cursor: pointer; + font-size: 23px; + } + + #logo { + display: none; + } + + } + + #ajaxLoadingDiv { + margin-top: 10px; + } + + #secondNavBar { + width: 224px; + float:left; + + #search { + padding: 8px 0 13px 8px; + height: 61px; + + .quick-access { + z-index: 1000; + position: absolute; + width: 216px; + input { + height: 33px; + font-size: 11px; + padding: 10px 12px 10px 10px; + } + } + } + + .navbar { + background-color: @theme-color-menu-contrast-background; + border-bottom: 1px solid @theme-color-menu-contrast-background; + + .menu-icon { + padding-right: 13px; + } + + > li { + display: inline-block; + width: 100%; + .border-radius(0px); + border: 0; + background: none; + + .item { + display: inline-block; + width: 100%; + font-family: Verdana, sans-serif; + .font-default(13px, 21px); + padding: 12px 21px 12px 19px; + color: @theme-color-menu-contrast-text; + decoration: none !important; + word-break: break-word; + + &:hover, &:focus { + decoration: none !important; + } + } + + > .item { + cursor: default; + font-weight: bold; + &:hover { + text-decoration: none; + } + } + + > ul { + + li { + .item { + .font-default(13px, 16px); + padding: 11px 22px 11px 45px; + decoration: none; + transition: background-color 200ms linear; + &:hover { + text-decoration: none; + color: @theme-color-menu-contrast-textActive; + } + } + + &.sfActive { + .item { + background-color: @theme-color-background-base; + decoration: none; + } + } + } + } + } + + + .menuDropdown { + + .items { + width: 224px; + background-color: @theme-color-background-base; + border: 1px solid @theme-color-background-tinyContrast; + box-shadow: 0 1px 2px 0 rgba(0,0,0,.14),0 3px 1px -2px rgba(0,0,0,.2),0 1px 5px 0 rgba(0,0,0,.12); + border: 1px solid #f2f2f2 !important; + + .search { + margin: 15px 16px 10px 17px; + } + + .item { + padding: 10px 16px 4px !important; + min-height: 25px; + height: auto; + } + } + + .title { + color: @theme-color-menu-contrast-text; + display: block; + padding: 15px 22px 11px 45px; + font-size: 13px; + font-weight: normal; + + &:hover { + color: @theme-color-menu-contrast-textActive; + } + + &:after { + color: @theme-color-menu-contrast-text; + border-top: 5px solid @theme-color-menu-contrast-text; + top: 20px; + right: 3px; + } + } + } + } + + &.Menu--dashboard .navbar > li { + > ul { + display: none; + + @media all and (max-width: 749px) { + display: block; + } + } + + > .item { + cursor: pointer; + &:hover { + color: @theme-color-menu-contrast-textActive; + } + } + + &.sfActive { + ul { + display: block; + } + + .icon-arrow-right:before { + content: "\e63b"; + } + } + } + + &.Menu--admin .navbar > li { + > .item { + padding: 14px 21px 6px 14px; + } + .item .icon-arrow-right:before { + content: "\e63b"; + } + } + } +} + +#root { + .top_controls { + .piwikTopControl { + margin-top: 8px; + margin-bottom: 8px; + } + } +} + +#root, #standalone { + .top_controls { + min-height: 51px; + position: relative; + background-color: @theme-color-background-base; + height: auto; + margin-bottom: 10px; + + .piwikTopControl { + display: inline-block; + float: none; + position: absolute; + margin-right: 18px; + vertical-align: top; + font-size: 11px; + } + } + + .borderedControl { + background-color: @theme-color-background-base; + border: 1px solid @theme-color-background-tinyContrast; + transition: box-shadow 150ms linear; + &.expanded, + &:hover { + box-shadow: 0 1px 2px 0 rgba(0,0,0,.14),0 3px 1px -2px rgba(0,0,0,.2),0 1px 5px 0 rgba(0,0,0,.12); + } + } +} + +.widgetize { + width: auto; +} diff --git a/plugins/CoreHome/stylesheets/menu.less b/plugins/CoreHome/stylesheets/menu.less deleted file mode 100644 index 76c8b90238..0000000000 --- a/plugins/CoreHome/stylesheets/menu.less +++ /dev/null @@ -1,177 +0,0 @@ -.Menu--dashboard { - position: relative; - - .menuDropdown { - - .items { - width: 250px; - - .search { - margin: 15px 16px 10px 17px; - } - - .item { - padding: 10px 16px 4px !important; - min-height: 25px; - height: auto; - } - } - - .title { - color: @theme-color-menu-contrast-text; - display: block; - padding: 15px 22px 11px; - font-size: 15px; - font-weight: normal; - - &:hover { - color: @theme-color-menu-contrast-textActive; - } - - &:after { - color: @theme-color-menu-contrast-text; - border-top: 5px solid @theme-color-menu-contrast-text; - top: 20px; - right: 3px; - } - } - } -} - -.Menu--dashboard > .Menu-tabList { - line-height: 1; - display: table; // The nav has the height og his children - margin-bottom: -1px; // Allow tabs to merge with the submenu -} - -.Menu--dashboard > .Menu-tabList ul { - background: @theme-color-background-base; /*IE6 needs this*/ - float: left; - position: relative; -} - -/* LEVEL1 NORMAL */ -.Menu--dashboard > .Menu-tabList > li { - background: #f1f1f1; - float: left; - list-style: none; - z-index: 49; - margin-right: -1px; - border: 1px solid #ddd; - border-bottom: 0; - border-radius: 4px 4px 0 0; -} - -.Menu--dashboard > .Menu-tabList a { - color: @theme-color-text-light; - font-size: 18px; - display: block; - float: left; - padding: 8px 27px 0; - height: 50px; - text-decoration: none; - font-weight: normal; -} - -/* LEVEL1 HOVER */ -.Menu--dashboard > .Menu-tabList > li:hover, -.Menu--dashboard > .Menu-tabList > li.sfHover { - background: @theme-color-background-base; -} - -.Menu--dashboard > .Menu-tabList > li:hover > a, -.Menu--dashboard > .Menu-tabList > li.sfHover > a, -.Menu--dashboard > .Menu-tabList > li.sfActive > a, -.Menu--dashboard > .Menu-tabList a:hover { - color: @theme-color-link; -} - -.Menu--dashboard > .Menu-tabList > li:hover > a { - text-decoration: underline; -} - -.Menu--dashboard > .Menu-tabList > li.sfHover > a { - border-bottom: 1px solid #fff; -} - -/* LEVEL2 NORMAL */ -.Menu--dashboard > .Menu-tabList > li ul { - padding: 9px 0 5px 0; - left: 0; - top: -999em; - position: absolute; - min-height: 25px; - width: 100%; - background: none; -} - -.Menu--dashboard > .Menu-tabList > li li { - float: left; - background: none; - border: 0; - text-align: center; -} - -.Menu--dashboard > .Menu-tabList > li li > a { - padding: 5px 15px; - font-size: 14px; - border: 0; - float: none; - display: inline-block; - height: auto; - background: none; - color: @theme-color-text-light; - text-decoration: none; -} - -/* LEVEL2 HOVER */ -.Menu--dashboard > .Menu-tabList > li.sfHover ul, -.Menu--dashboard > .Menu-tabList > li:hover ul { - z-index: 130; - top: 100%; - opacity: 1; - -webkit-transition: opacity 300ms ease-out 10ms; /* property duration timing-function delay */ - -moz-transition: opacity 300ms ease-out 10ms; - -o-transition: opacity 300ms ease-out 10ms; - transition: opacity 300ms ease-out 10ms; -} - -/* for screen readers */ -.Menu--dashboard a span.hidden { - height: 1px; - width: 1px; - position: absolute; - overflow: hidden; - top: 0; -} - - -.Menu--dashboard > .Menu-tabList > li li:hover > a, -.Menu--dashboard > .Menu-tabList > li li.sfHover > a { - color: @theme-color-link; -} - -.Menu--dashboard > .Menu-tabList > li li.sfHover > a { - font-weight: bold; - text-decoration: none !important; -} - -@media all and (max-width: 949px) { - .nav { - clear: right; - } -} - -@media all and (max-width: 749px) { - .Menu--dashboard > .Menu-tabList a { - padding-left: 8px; - padding-right: 8px; - } -} - -@media all and (max-width: 549px) { - .Menu--dashboard > ul.Menu-tabList > li.sfHover > a, - .Menu--dashboard > ul.Menu-tabList > li.sfActive.sfHover > a { - border-bottom: 0; - } -} \ No newline at end of file diff --git a/plugins/CoreHome/stylesheets/notification.less b/plugins/CoreHome/stylesheets/notification.less index 36f7085f6f..cab47a40a5 100644 --- a/plugins/CoreHome/stylesheets/notification.less +++ b/plugins/CoreHome/stylesheets/notification.less @@ -1,8 +1,5 @@ #content.admin #notificationContainer { - width: 750px; - display: table-header-group; /* no overlap with About Piwik box */ - .notification { - margin: 10px; + margin: 0 0 10px 0; } } \ No newline at end of file diff --git a/plugins/CoreHome/stylesheets/zen-mode.less b/plugins/CoreHome/stylesheets/zen-mode.less index 124c3395ff..0b9f619ea7 100644 --- a/plugins/CoreHome/stylesheets/zen-mode.less +++ b/plugins/CoreHome/stylesheets/zen-mode.less @@ -81,14 +81,20 @@ margin-top: 40px; } + h2 { + padding-left: 0; + font-size: 21px; + padding: 16px 0 12px 0; + } +} + +#root #dashboard .widget { h2 { padding-left: 10px; - font-size: 24px; } } .widget { - h2:nth-of-type(n+2) { padding-top: 40px!important; margin-top: 0!important; diff --git a/plugins/CoreHome/templates/ReportsByDimension/_reportsByDimension.twig b/plugins/CoreHome/templates/ReportsByDimension/_reportsByDimension.twig index 57ec8279d5..6ce760af1d 100644 --- a/plugins/CoreHome/templates/ReportsByDimension/_reportsByDimension.twig +++ b/plugins/CoreHome/templates/ReportsByDimension/_reportsByDimension.twig @@ -17,7 +17,7 @@ {% endfor %} </div> - <div style="float:left;max-width:900px;"> + <div style="float:left;max-width:730px;"> <div class="loadingPiwik" style="display:none;"> <img src="plugins/Morpheus/images/loading-blue.gif" alt=""/>{{ 'General_LoadingData'|translate }} </div> diff --git a/plugins/CoreHome/templates/_headerMessage.twig b/plugins/CoreHome/templates/_headerMessage.twig index c1d81b5cb0..bb4f8e7607 100644 --- a/plugins/CoreHome/templates/_headerMessage.twig +++ b/plugins/CoreHome/templates/_headerMessage.twig @@ -1,47 +1,59 @@ {# testing, remove test_ from var names #} {% set test_latest_version_available="4.0.0" %} {% set test_piwikUrl='http://demo.piwik.org/' %} -{% set isPiwikDemo %}{{ piwikUrl == 'http://demo.piwik.org/' or piwikUrl == 'https://demo.piwik.org/'}}{% endset %} +{% set isPiwikDemo %}{{ piwikUrl == 'http://demo.piwik.org/' or piwikUrl == 'https://demo.piwik.org/' }}{% endset %} {% set updateCheck %} -<div id="updateCheckLinkContainer"> - <span class='loadingPiwik' style="display:none;"><img src='plugins/Morpheus/images/loading-blue.gif'/></span> - <span class="icon icon-reload"></span> - <a href="#" id="checkForUpdates"><em>{{ 'CoreHome_CheckForUpdates'|translate }}</em></a> -</div> + <span id="updateCheckLinkContainer"> + {{ 'CoreHome_CheckForUpdates'|translate }} + <span class="icon icon-fixed icon-reload"></span> + </span> {% endset %} {% if isPiwikDemo or (latest_version_available and hasSomeViewAccess and not isUserIsAnonymous) or (isSuperUser and adminMenu is defined and adminMenu) %} -<span id="header_message" class="{% if isPiwikDemo or not latest_version_available %}header_info{% else %}header_alert{% endif %}"> - <span class="header_short"> +<div piwik-expand-on-hover + id="header_message" + class="piwikSelector borderedControl {% if isPiwikDemo or not latest_version_available %}header_info{% else %}{% endif %} {% if isPiwikDemo %}isPiwikDemo{% else %}piwikTopControl{% endif %} {% if latest_version_available %}update_available{% endif %}" + > + + <a class="title" href="#"> {% if isPiwikDemo %} {{ 'General_YouAreViewingDemoShortMessage'|translate }} {% elseif latest_version_available %} {{ 'General_NewUpdatePiwikX'|translate(latest_version_available) }} + <span class="icon-warning"></span> {% elseif isSuperUser and adminMenu is defined and adminMenu %} {{ updateCheck|raw }} {% endif %} - </span> + </a> - <span class="header_full"> + <div class="dropdown"> {% if isPiwikDemo %} - {{ 'General_YouAreViewingDemoShortMessage'|translate }} - <br /> {{ 'General_DownloadFullVersion'|translate("<a href='http://piwik.org/'>","</a>","<a href='http://piwik.org'>piwik.org</a>")|raw }} <br/> + {% if isSuperUser and adminMenu is defined and adminMenu %} + <br/> + {% endif %} {% endif %} {% if latest_version_available and isSuperUser %} {{ 'General_PiwikXIsAvailablePleaseUpdateNow'|translate(latest_version_available,"<br /><a href='index.php?module=CoreUpdater&action=newVersionAvailable'>","</a>","<a href='?module=Proxy&action=redirect&url=http://piwik.org/changelog/' target='_blank'>","</a>")|raw }} + <br /> {% elseif latest_version_available and not isPiwikDemo and hasSomeViewAccess and not isUserIsAnonymous %} {% set updateSubject = 'General_NewUpdatePiwikX'|translate(latest_version_available)|e('url') %} {{ 'General_PiwikXIsAvailablePleaseNotifyPiwikAdmin'|translate("<a href='?module=Proxy&action=redirect&url=http://piwik.org/' target='_blank'>Piwik</a> <a href='?module=Proxy&action=redirect&url=http://piwik.org/changelog/' target='_blank'>" ~ latest_version_available ~ "</a>", "<a href='mailto:" ~ superUserEmails ~ "?subject=" ~ updateSubject ~ "'>", "</a>")|raw }} - {% endif %} - {% if isSuperUser and adminMenu is defined and adminMenu %} <br /> + {% endif %} + + {% if isPiwikDemo and isSuperUser and adminMenu is defined and adminMenu %} + <br/> {{ updateCheck|raw }} + <br/> + <br/> {% endif %} - <br /> + {{ 'General_YouAreCurrentlyUsing'|translate(piwik_version) }} - </span> -</span> + </div> +</div> + +<div style="clear:right"></div> {% endif %} diff --git a/plugins/CoreHome/templates/_indexContent.twig b/plugins/CoreHome/templates/_indexContent.twig deleted file mode 100644 index 46d2f13579..0000000000 --- a/plugins/CoreHome/templates/_indexContent.twig +++ /dev/null @@ -1,19 +0,0 @@ -{% import 'ajaxMacros.twig' as ajax %} -<div class="pageWrap container-fluid"> -<a name="main"></a> - {% include "@CoreHome/_notifications.twig" %} - <div class="top_controls"> - {% include "@CoreHome/_periodSelect.twig" %} - {{ postEvent("Template.nextToCalendar") }} - {% render dashboardSettingsControl %} - {% include "@CoreHome/_headerMessage.twig" %} - {{ ajax.requestErrorDiv(emailSuperUser|default('')) }} - </div> - - {{ ajax.loadingDiv() }} - - <div id="content" class="home"> - {% if content %}{{ content }}{% endif %} - </div> - <div class="clear"></div> -</div> diff --git a/plugins/CoreHome/templates/_menu.twig b/plugins/CoreHome/templates/_menu.twig index f4bfd7d902..2fee6907e5 100644 --- a/plugins/CoreHome/templates/_menu.twig +++ b/plugins/CoreHome/templates/_menu.twig @@ -1,19 +1,19 @@ -{% macro submenuItem(name, url) %} +{% macro submenuItem(name, url, anchorlink) %} {% if name|slice(0,1) != '_' %} <li> - <a class="menuItem" href='#{{ url|urlRewriteWithParameters|slice(1) }}'> + <a class="item" href="{% if anchorlink %}#{% else %}index.php?{% endif %}{{ url|urlRewriteWithParameters|slice(1) }}"> {{ name|translate }} </a> </li> {% endif %} {% endmacro %} -{% macro groupedItem(name, group) %} +{% macro groupedItem(name, group, anchorlink) %} <li> <div piwik-menudropdown show-search="true" menu-title="{{ name|translate|e('html_attr') }}"> {% for item in group.getItems %} <a class="item menuItem" - href='#?{{ item.url|urlRewriteWithParameters|slice(1) }}' + href='{% if anchorlink %}#?{% else %}index.php?{% endif %}{{ item.url|urlRewriteWithParameters|slice(1) }}' {% if item.tooltip %}title="{{ item.tooltip|e('html_attr') }}"{% endif %}> {{ item.name|translate }} </a> @@ -34,33 +34,32 @@ {%- endif %} {%- endmacro %} -<div class="Menu--dashboard"> - - <ul class="Menu-tabList"> - {% for level1,level2 in menu %} - <li id="{% if level2._url is defined %}{{ _self.getId(level2._url) }}{% endif %}" class="menuTab"> - <a class="menuItem" {% if level2._url is defined %}href="#{{ _self.getFirstUrl(level2._url) }}"{% endif %}> - {{ level1|translate }} - <span class="hidden"> - {{ 'CoreHome_Menu'|translate }} - </span> - </a> - <ul> - {% for name,urlParameters in level2 %} - {% if urlParameters._url is defined and urlParameters._url is not iterable %} - {{ _self.groupedItem(name,urlParameters._url) }} - {% elseif name|slice(0,1) != '_' %} - {{ _self.submenuItem(name,urlParameters._url) }} - {% endif %} - {% endfor %} - - </ul> - </li> - {% endfor %} - <li id="Searchmenu"> - <span piwik-quick-access></span> - </li> - </ul> +{% macro menu(menu, anchorlink, cssClass) %} + <div id="secondNavBar" class="{{ cssClass }}"> + <div id="search"> + <div piwik-quick-access class="borderedControl"></div> + </div> + <ul class="navbar"> + {% for level1,level2 in menu %} + <li id="{% if level2._url is defined and level2._url is not empty %}{{ _self.getId(level2._url) }}{% endif %}" class="menuTab"> -</div> -<div class="nav_sep"></div> + <a class="item" {% if level2._url is defined and level2._url is not empty %}href="{% if anchorlink %}#{% else %}index.php?{% endif %}{{ _self.getFirstUrl(level2._url) }}"{% endif %}> + <span class="menu-icon {{ level2._icon }}"></span>{{ level1|translate }} + <span class="hidden"> + {{ 'CoreHome_Menu'|translate }} + </span> + </a> + <ul> + {% for name,urlParameters in level2 %} + {% if urlParameters._url is defined and urlParameters._url is not iterable %} + {{ _self.groupedItem(name,urlParameters._url, anchorlink) }} + {% elseif name|slice(0,1) != '_' %} + {{ _self.submenuItem(name,urlParameters._url, anchorlink) }} + {% endif %} + {% endfor %} + </ul> + </li> + {% endfor %} + </ul> + </div> +{% endmacro %} diff --git a/plugins/CoreHome/templates/_periodSelect.twig b/plugins/CoreHome/templates/_periodSelect.twig index c99f463eca..67b30183d3 100644 --- a/plugins/CoreHome/templates/_periodSelect.twig +++ b/plugins/CoreHome/templates/_periodSelect.twig @@ -1,7 +1,9 @@ -<div id="periodString" class="piwikTopControl periodSelector"> - <div id="date">{{ 'General_DateRange'|translate }} <strong>{{ prettyDate }}</strong></div> - <div class="calendar-icon"></div> - <div id="periodMore"> +<div id="periodString" piwik-expand-on-click class="piwikTopControl piwikSelector borderedControl periodSelector"> + <a id="date" class="title" title="{{ 'General_ChooseDate'|translate|e('html_attr') }}"> + <span class="icon icon-calendar"></span> + {{ prettyDate }} + </a> + <div id="periodMore" class="dropdown"> <div class="period-date"> <div id="datepicker"></div> </div> diff --git a/plugins/CoreHome/templates/_siteSelectHeader.twig b/plugins/CoreHome/templates/_siteSelectHeader.twig index 547f2e4129..7353e2e07a 100644 --- a/plugins/CoreHome/templates/_siteSelectHeader.twig +++ b/plugins/CoreHome/templates/_siteSelectHeader.twig @@ -1,5 +1,3 @@ -<div class="top_bar_sites_selector {% if currentModule == 'CoreHome' %}sites_selector_in_dashboard{% endif %}"> - <label>{{ 'General_Website'|translate }}</label> +<div class="top_bar_sites_selector piwikTopControl"> <div piwik-siteselector class="sites_autocomplete"></div> - </div> \ No newline at end of file diff --git a/plugins/CoreHome/templates/_topBar.twig b/plugins/CoreHome/templates/_topBar.twig index 41bd5da7a1..c6d7141d92 100644 --- a/plugins/CoreHome/templates/_topBar.twig +++ b/plugins/CoreHome/templates/_topBar.twig @@ -1,4 +1,34 @@ {{ postEvent("Template.beforeTopBar", userAlias, userLogin, topMenu, userMenu) }} -<div id="topBars"> - {% include "@CoreHome/_topBarTopMenu.twig" %} -</div> +<ul class="navbar-right"> + + {% macro menuItemLabel(label) %} + {% if label starts with 'icon-' %} + <span class="{{ label|striptags }}"></span> + {% else %} + {{ label|translate }} + {% endif %} + {% endmacro %} + + {% macro topMenuItem(label, menu, currentModule, currentAction) %} + {% if menu._html is defined %} + {{ menu._html|raw }} + {% else %} + <a {% if menu._tooltip is defined %}title="{{ menu._tooltip }}"{% endif %} + class="topBarElem {% if (menu._url.module == currentModule and (menu._url.action is empty or menu._url.action == currentAction)) %}active{% endif %}" + id="topmenu-{{ menu._url.module|lower }}" + href="index.php{{ menu._url|urlRewriteWithParameters }}">{{ _self.menuItemLabel(label) }}</a> + {% endif %} + {% endmacro %} + + {% if topMenuModule is not defined %} + {% set topMenuModule = currentModule %} + {% set topMenuAction = currentAction %} + {% endif %} + + {% spaceless %} + {% for label,menu in topMenu %} + <li>{{ _self.topMenuItem(label, menu, topMenuModule, topMenuAction) }}</li> + {% endfor %} + {% endspaceless %} + +</ul> \ No newline at end of file diff --git a/plugins/CoreHome/templates/_topBarTopMenu.twig b/plugins/CoreHome/templates/_topBarTopMenu.twig deleted file mode 100644 index 459ccb611e..0000000000 --- a/plugins/CoreHome/templates/_topBarTopMenu.twig +++ /dev/null @@ -1,37 +0,0 @@ -<div id="topRightBar"> - - {% macro topMenuItem(label, menu, currentModule, currentAction) %} - {% if menu._html is defined %} - {{ menu._html|raw }} - {% elseif (menu._url.module == currentModule and (menu._url.action is empty or menu._url.action == currentAction)) %} - <span class="topBarElem topBarElemActive"><strong>{{ label|translate }}</strong></span> - {% else %} - <span class="topBarElem" {% if menu._tooltip is defined %}title="{{ menu._tooltip }}"{% endif %}> - <a id="topmenu-{{ menu._url.module|lower }}" href="index.php{{ menu._url|urlRewriteWithParameters }}">{{ label|translate }}</a> - </span> - {% endif %} - {% endmacro %} - - {% macro userMenuItem(label, menu, currentModule, currentAction) %} - - <a class="item {% if (menu._url.module == currentModule and (menu._url.action is empty or menu._url.action == currentAction)) %}active{% endif %}" - href="index.php{{ menu._url|urlRewriteWithParameters }}" - id="usermenu-{{ menu._url.module|lower }}-{{ menu._url.action|default('index')|lower }}" - {% if menu._tooltip is defined %}title="{{ menu._tooltip }}"{% endif %} - >{{ label|translate }}</a> - - {% endmacro %} - - {% if topMenuModule is not defined %} - {% set topMenuModule = currentModule %} - {% set topMenuAction = currentAction %} - {% endif %} - - {% for label,menu in topMenu %} - {% if not loop.first %} - | - {% endif %} - {{ _self.topMenuItem(label, menu, topMenuModule, topMenuAction) }} - {% endfor %} - -</div> diff --git a/plugins/CoreHome/templates/_topScreen.twig b/plugins/CoreHome/templates/_topScreen.twig index 2aebf1254e..805619814c 100644 --- a/plugins/CoreHome/templates/_topScreen.twig +++ b/plugins/CoreHome/templates/_topScreen.twig @@ -1,5 +1,15 @@ -<div id="header"> - <a href='#main' tabindex="0" class="accessibility-skip-to-content">{{'CoreHome_SkipToContent'|translate}}</a> - {% include "@CoreHome/_logo.twig" %} - {% include "@CoreHome/_topBar.twig" %} -</div> +<div id="header" class="container-fluid"> + <a href="#main" tabindex="0" class="accessibility-skip-to-content">{{'CoreHome_SkipToContent'|translate}}</a> + <div id="topRightBar" class="navbar row"> + <div class="navbar-header col-md-3"> + <span class="toggle-second-menu icon-menu-hamburger"></span> + {% include "@CoreHome/_logo.twig" %} + + <!-- we need to put button to toggle nav for responsiveness here --> + + </div> + <div class="collapse navbar-collapse col-md-9" id="navbar-collapse1"> + {% include "@CoreHome/_topBar.twig" %} + </div> + </div> +</div> \ No newline at end of file diff --git a/plugins/CoreHome/templates/_uiControl.twig b/plugins/CoreHome/templates/_uiControl.twig index 856f1afac0..3be1e17be5 100644 --- a/plugins/CoreHome/templates/_uiControl.twig +++ b/plugins/CoreHome/templates/_uiControl.twig @@ -1,4 +1,5 @@ <div class="{{ cssIdentifier }} {{ cssClass }}" + piwik-expand-on-click data-props="{{ clientSideProperties|json_encode }}" data-params="{{ clientSideParameters|json_encode }}"> {% render implView with implOverride %} diff --git a/plugins/CoreHome/templates/_userMenu.twig b/plugins/CoreHome/templates/_userMenu.twig deleted file mode 100644 index 67076af755..0000000000 --- a/plugins/CoreHome/templates/_userMenu.twig +++ /dev/null @@ -1,3 +0,0 @@ -{% import '@CoreHome/macros.twig' as corehome %} - -{{ corehome.sidebarMenu(userMenu, currentModule, currentAction) }} \ No newline at end of file diff --git a/plugins/CoreHome/templates/getDefaultIndexView.twig b/plugins/CoreHome/templates/getDefaultIndexView.twig index 7b46ca3f76..a09030ff3d 100644 --- a/plugins/CoreHome/templates/getDefaultIndexView.twig +++ b/plugins/CoreHome/templates/getDefaultIndexView.twig @@ -1,14 +1,20 @@ {% extends "dashboard.twig" %} -{% block notification %}{% endblock %} -{% block content %} - -{% include "@CoreHome/_siteSelectHeader.twig" %} +{% import 'ajaxMacros.twig' as ajax %} -{% if (menu is defined and menu) %} - {% include "@CoreHome/_menu.twig" %} -{% endif %} +{% block topcontrols %} + {% include "@CoreHome/_siteSelectHeader.twig" %} + {% include "@CoreHome/_periodSelect.twig" %} + {{ postEvent("Template.nextToCalendar") }} + {% render dashboardSettingsControl %} + {% include "@CoreHome/_headerMessage.twig" %} +{% endblock %} -{% include "@CoreHome/_indexContent.twig" %} +{% block content %} + {{ ajax.requestErrorDiv(emailSuperUser|default('')) }} + {{ ajax.loadingDiv() }} + <div id="content" class="home"> + {% if content %}{{ content }}{% endif %} + </div> {% endblock %} diff --git a/plugins/CoreHome/templates/macros.twig b/plugins/CoreHome/templates/macros.twig deleted file mode 100644 index 0563856856..0000000000 --- a/plugins/CoreHome/templates/macros.twig +++ /dev/null @@ -1,26 +0,0 @@ -{% macro sidebarMenu(sidebarMenu, currentModule, currentAction) %} - {% if sidebarMenu|length > 1 %} - <div class="Menu Menu--admin"> - <ul class="Menu-tabList"> - {% for name,submenu in sidebarMenu %} - {% if submenu._hasSubmenu %} - <li> - <span>{{ name|translate }}</span> - <ul> - {% for sname,url in submenu %} - {% if sname|slice(0,1) != '_' %} - <li> - <a href='index.php{{ url._url|urlRewriteWithParameters }}' - target="_self" - {% if url._url.module == currentModule and (url._url.action is empty or url._url.action == currentAction) %}class='active'{% endif %}>{{ sname|translate }}</a> - </li> - {% endif %} - {% endfor %} - </ul> - </li> - {% endif %} - {% endfor %} - </ul> - </div> - {% endif %} -{% endmacro %} diff --git a/plugins/CorePluginsAdmin/Menu.php b/plugins/CorePluginsAdmin/Menu.php index 97ec818a59..415ace73a6 100644 --- a/plugins/CorePluginsAdmin/Menu.php +++ b/plugins/CorePluginsAdmin/Menu.php @@ -49,7 +49,7 @@ class Menu extends \Piwik\Plugin\Menu if (Piwik::hasUserSuperUserAccess() && CorePluginsAdmin::isMarketplaceEnabled()) { $menu->addManageItem('CorePluginsAdmin_Marketplace', - $this->urlForAction('browsePlugins', array('activated' => '')), + $this->urlForAction('marketplace', array('activated' => '', 'mode' => 'admin')), $order = 12); } } @@ -66,7 +66,7 @@ class Menu extends \Piwik\Plugin\Menu { if ($this->isAllowedToSeeMarketPlace()) { $menu->addPlatformItem('CorePluginsAdmin_Marketplace', - $this->urlForAction('userBrowsePlugins', array('activated' => '')), + $this->urlForAction('marketplace', array('activated' => '', 'mode' => 'user')), $order = 5); } } diff --git a/plugins/CoreVisualizations/javascripts/jqplot.js b/plugins/CoreVisualizations/javascripts/jqplot.js index 5392dc986c..f6914c57be 100644 --- a/plugins/CoreVisualizations/javascripts/jqplot.js +++ b/plugins/CoreVisualizations/javascripts/jqplot.js @@ -384,7 +384,7 @@ // TODO: this code destroys plots when a page is switched. there must be a better way of managing memory. if (typeof $.jqplot.visiblePlots == 'undefined') { $.jqplot.visiblePlots = []; - $('.nav').on('piwikSwitchPage', function () { + $('#secondNavBar').on('piwikSwitchPage', function () { for (var i = 0; i < $.jqplot.visiblePlots.length; i++) { if ($.jqplot.visiblePlots[i] == null) { continue; diff --git a/plugins/Dashboard/Dashboard.php b/plugins/Dashboard/Dashboard.php index 9ccbb822e4..35b94743a3 100644 --- a/plugins/Dashboard/Dashboard.php +++ b/plugins/Dashboard/Dashboard.php @@ -240,6 +240,7 @@ class Dashboard extends \Piwik\Plugin $translationKeys[] = 'Dashboard_LoadingWidget'; $translationKeys[] = 'Dashboard_WidgetNotFound'; $translationKeys[] = 'Dashboard_DashboardCopied'; + $translationKeys[] = 'Dashboard_Dashboard'; $translationKeys[] = 'General_Close'; $translationKeys[] = 'General_Refresh'; } diff --git a/plugins/Dashboard/DashboardManagerControl.php b/plugins/Dashboard/DashboardManagerControl.php index fb119e0083..df573903b3 100644 --- a/plugins/Dashboard/DashboardManagerControl.php +++ b/plugins/Dashboard/DashboardManagerControl.php @@ -20,7 +20,7 @@ class DashboardManagerControl extends DashboardSettingsControlBase parent::__construct(); $this->jsClass = "DashboardManagerControl"; - $this->cssIdentifier = "dashboard-manager"; + $this->cssIdentifier = "dashboard-manager piwikSelector"; $this->addDashboardActions(); $this->addGeneralActions(); diff --git a/plugins/Dashboard/DashboardSettingsControlBase.php b/plugins/Dashboard/DashboardSettingsControlBase.php index 7275224082..dadd780f18 100644 --- a/plugins/Dashboard/DashboardSettingsControlBase.php +++ b/plugins/Dashboard/DashboardSettingsControlBase.php @@ -23,7 +23,7 @@ abstract class DashboardSettingsControlBase extends UIControl { parent::__construct(); - $this->cssClass = "piwikTopControl dashboardSettings"; + $this->cssClass = "borderedControl piwikTopControl dashboardSettings"; $this->dashboardActions = array(); $this->generalActions = array(); } diff --git a/plugins/Dashboard/Menu.php b/plugins/Dashboard/Menu.php index f90c117e10..250807eca5 100644 --- a/plugins/Dashboard/Menu.php +++ b/plugins/Dashboard/Menu.php @@ -23,20 +23,31 @@ class Menu extends \Piwik\Plugin\Menu { $menu->addItem('Dashboard_Dashboard', '', $this->urlForAction('embeddedIndex', array('idDashboard' => 1)), 5); - if (!Piwik::isUserIsAnonymous()) { + if (Piwik::isUserIsAnonymous()) { + $this->addDefaultDashboard($menu); + } else { $login = Piwik::getCurrentUserLogin(); $dashboard = new Dashboard(); $dashboards = $dashboard->getAllDashboards($login); - $pos = 0; - foreach ($dashboards as $dashboard) { - $menu->addItem('Dashboard_Dashboard', $dashboard['name'], $this->urlForAction('embeddedIndex', array('idDashboard' => $dashboard['iddashboard'])), $pos); - $pos++; + if (empty($dashboards)) { + $this->addDefaultDashboard($menu); + } else { + $pos = 0; + foreach ($dashboards as $dashboard) { + $menu->addItem('Dashboard_Dashboard', $dashboard['name'], $this->urlForAction('embeddedIndex', array('idDashboard' => $dashboard['iddashboard'])), $pos); + $pos++; + } } } } + private function addDefaultDashboard(MenuReporting $menu) + { + $menu->addItem('Dashboard_Dashboard', 'Dashboard_Dashboard', $this->urlForAction('embeddedIndex', array('idDashboard' => 1))); + } + public function configureTopMenu(MenuTop $menu) { $userPreferences = new UserPreferences(); diff --git a/plugins/Dashboard/javascripts/dashboard.js b/plugins/Dashboard/javascripts/dashboard.js index 238aca5197..4253069723 100644 --- a/plugins/Dashboard/javascripts/dashboard.js +++ b/plugins/Dashboard/javascripts/dashboard.js @@ -11,9 +11,9 @@ function initDashboard(dashboardId, dashboardLayout) { initTopControls(); // Embed dashboard - if (!$('#topBars').length) { + if (!$('#header .navbar-right').length) { $('.dashboardSettings').after($('#Dashboard')); - $('#Dashboard_embeddedIndex_' + dashboardId).addClass('sfHover'); + $('#Dashboard_embeddedIndex_' + dashboardId).addClass('sfActive'); } widgetsHelper.getAvailableWidgets(); @@ -168,7 +168,7 @@ function copyDashboardToUser() { // on menu item click, trigger action event on this var self = this; this.$element.on('click', 'ul.submenu li[data-action]', function (e) { - self.$element.toggleClass('visible'); + self.$element.toggleClass('expanded'); $(self).trigger($(this).attr('data-action')); }); @@ -176,7 +176,7 @@ function copyDashboardToUser() { // open manager on open this.$element.on('click', function (e) { if ($(e.target).is('.dashboardSettings,.dashboardSettings>span')) { - self.$element.toggleClass('visible'); + self.$element.toggleClass('expanded'); // fix position self.$element @@ -193,7 +193,7 @@ function copyDashboardToUser() { && !$(e.target).is('.dashboardSettings') ) { self.$element.widgetPreview('reset'); - self.$element.removeClass('visible'); + self.$element.removeClass('expanded'); } }; @@ -206,7 +206,7 @@ function copyDashboardToUser() { }, onSelect: function (widgetUniqueId) { var widget = widgetsHelper.getWidgetObjectFromUniqueId(widgetUniqueId); - self.$element.removeClass('visible'); + self.$element.removeClass('expanded'); self.widgetSelected(widget); }, @@ -287,7 +287,7 @@ function copyDashboardToUser() { }, hide: function () { - this.$element.removeClass('visible'); + this.$element.removeClass('expanded'); }, isWidgetAvailable: function (widgetUniqueId) { diff --git a/plugins/Dashboard/javascripts/dashboardObject.js b/plugins/Dashboard/javascripts/dashboardObject.js index 7808d22c11..4c45d5a888 100644 --- a/plugins/Dashboard/javascripts/dashboardObject.js +++ b/plugins/Dashboard/javascripts/dashboardObject.js @@ -477,24 +477,26 @@ return $(this).attr('id').indexOf('Dashboard_embeddedIndex') == 0; }).remove(); + if (dashboards.length === 0) { + dashboards = [{iddashboard: 1, name: _pk_translate('Dashboard_Dashboard')}]; + } + if (dashboards.length > 1 || dashboardMenuListItems.length >= 1 ) { var items = []; for (var i = 0; i < dashboards.length; i++) { - var $link = $('<a/>').attr('data-idDashboard', dashboards[i].iddashboard).text(dashboards[i].name); + var $link = $('<a/>').attr('data-idDashboard', dashboards[i].iddashboard).text(dashboards[i].name).addClass('item title'); var $li = $('<li/>').attr('id', 'Dashboard_embeddedIndex_' + dashboards[i].iddashboard) .addClass('dashboardMenuItem').append($link); items.push($li); if (dashboards[i].iddashboard == dashboardId) { dashboardName = dashboards[i].name; - $li.addClass('sfHover'); + $li.addClass('sfActive'); } } dashboardMenuList.prepend(items); - } else { - dashboardMenuList.hide(); } dashboardMenuList.find('a[data-idDashboard]').click(function (e) { @@ -505,13 +507,13 @@ if (typeof piwikMenu != 'undefined') { piwikMenu.activateMenu('Dashboard', 'embeddedIndex'); } - $('#Dashboard ul li').removeClass('sfHover'); + $('#Dashboard ul li').removeClass('sfActive'); if ($(dashboardElement).length) { $(dashboardElement).dashboard('loadDashboard', idDashboard); } else { broadcast.propagateAjax('module=Dashboard&action=embeddedIndex&idDashboard=' + idDashboard); } - $(this).closest('li').addClass('sfHover'); + $(this).closest('li').addClass('sfActive'); }); }; diff --git a/plugins/Dashboard/javascripts/widgetMenu.js b/plugins/Dashboard/javascripts/widgetMenu.js index 6d58415cb9..66e033cf8e 100644 --- a/plugins/Dashboard/javascripts/widgetMenu.js +++ b/plugins/Dashboard/javascripts/widgetMenu.js @@ -227,7 +227,12 @@ widgetsHelper.loadWidgetAjax = function (widgetUniqueId, widgetParameters, onWid if ($('.' + settings.categorylistClass + ' .' + settings.choosenClass, widgetPreview).length) { var position = $('.' + settings.categorylistClass + ' .' + settings.choosenClass, widgetPreview).position().top - - $('.' + settings.categorylistClass, widgetPreview).position().top; + $('.' + settings.categorylistClass, widgetPreview).position().top + + $('.dashboard-manager .addWidget').outerHeight(); + + if (!$('#content.admin').length) { + position += 10; // + padding defined in dashboard view + } $('.' + settings.widgetlistClass, widgetPreview).css('top', position); $('.' + settings.widgetlistClass, widgetPreview).css('marginBottom', position); @@ -281,6 +286,7 @@ widgetsHelper.loadWidgetAjax = function (widgetUniqueId, widgetParameters, onWid $('li:not(.' + settings.unavailableClass + ')', widgetList).on('click', function () { if (!$('.widgetLoading', widgetPreview).length) { settings.onSelect($(this).attr('uniqueid')); + $(widgetPreview).closest('.dashboard-manager').removeClass('expanded'); if (settings.resetOnSelect) { resetWidgetPreview(widgetPreview); } @@ -341,6 +347,7 @@ widgetsHelper.loadWidgetAjax = function (widgetUniqueId, widgetParameters, onWid settings.onPreviewLoaded(widgetUniqueId, widgetElement); $('.' + settings.widgetpreviewClass + ' .widgetTop', widgetPreview).on('click', function () { settings.onSelect(widgetUniqueId); + $(widgetPreview).closest('.dashboard-manager').removeClass('expanded'); if (settings.resetOnSelect) { resetWidgetPreview(widgetPreview); } diff --git a/plugins/Dashboard/stylesheets/dashboard.less b/plugins/Dashboard/stylesheets/dashboard.less index fad10183e7..cd928a97da 100644 --- a/plugins/Dashboard/stylesheets/dashboard.less +++ b/plugins/Dashboard/stylesheets/dashboard.less @@ -1,40 +1,17 @@ #dashboard { - margin: 0 -7px; + margin: 0 -6px; } -#root>.top_controls { - margin-left:15px; - margin-right:15px; -} -.top_controls { - position: relative; - height: 32px; - clear: left; -} - -@media all and (max-width: 749px) { - .top_controls { - height: auto; - } - - .top_controls #periodString, - .top_controls .dashboardSettings, - .top_controls .segmentEditorPanel { - position: static !important; - margin: 0 0 10px; - float: none; - } -} #dashboard { .col { min-height: 100px; // Customize Bootstrap gutter between columns - padding-right: 7px; - padding-left: 7px; + padding-right: 6px; + padding-left: 6px; >.sortable { - padding: 5px 0 10px 0; + padding: 5px 0 8px 0; } } } @@ -152,10 +129,8 @@ z-index: 120; background: #f7f7f7; border: 1px solid #e4e5e4; - padding: 5px 10px 6px 10px; border-radius: 4px; color: @theme-color-text-light; - font-size: 14px; cursor: pointer; overflow: hidden; } @@ -165,9 +140,9 @@ border-color: #a9a399; } -.dashboardSettings.visible { +.dashboardSettings.expanded { z-index: 1020; /* More than .jqplot-seriespicker-popover (1010) */ - min-width: 700px; + min-width: 800px; } .dashboardSettings > span { @@ -182,10 +157,9 @@ float: left; } -.dashboardSettings.visible ul.submenu { +.dashboardSettings.expanded ul.submenu { display: block; list-style: square outside none; - margin-left: 15px; } .dashboardSettings > ul.submenu > li { @@ -328,7 +302,6 @@ div.widgetpreview-preview { min-height: 0; height: auto; margin-right: 10px; - min-width: 180px; } .dashboardSettings .submenu { @@ -372,8 +345,8 @@ div.widgetpreview-preview { display: none; } -.dashboardSettings.visible .widgetpreview-widgetlist, -.dashboardSettings.visible .widgetpreview-preview { +.dashboardSettings.expanded .widgetpreview-widgetlist, +.dashboardSettings.expanded .widgetpreview-preview { display: block; } @@ -416,7 +389,7 @@ div.widgetpreview-preview { } #dashboardWidgetsArea { - margin-top: 5px; + margin-top: -5px; } @media all and (max-width: 749px) { diff --git a/plugins/Dashboard/stylesheets/standalone.css b/plugins/Dashboard/stylesheets/standalone.css index 5a2b0d90d9..292d3e63c0 100644 --- a/plugins/Dashboard/stylesheets/standalone.css +++ b/plugins/Dashboard/stylesheets/standalone.css @@ -45,17 +45,10 @@ body { } #Dashboard > ul > li:hover, -#Dashboard > ul > li:hover a, -#Dashboard > ul > li.sfHover, -#Dashboard > ul > li.sfHover a { +#Dashboard > ul > li:hover a { color: #e87500; } -#Dashboard > ul > li.sfHover, -#Dashboard > ul > li.sfHover a { - font-weight: bold; -} - .top_controls > #Dashboard, .top_controls > #periodString, .top_controls > .dashboardSettings { diff --git a/plugins/Dashboard/stylesheets/widget.less b/plugins/Dashboard/stylesheets/widget.less index a06564f033..558da41ab9 100644 --- a/plugins/Dashboard/stylesheets/widget.less +++ b/plugins/Dashboard/stylesheets/widget.less @@ -16,7 +16,7 @@ font-weight: normal; font-size: 15px; margin: 0; - color: #0D0D0D; + color: @theme-color-text; text-shadow: none; padding: 15px 15px 10px 12px; } diff --git a/plugins/Dashboard/templates/_dashboardSettings.twig b/plugins/Dashboard/templates/_dashboardSettings.twig index dc05a6dae1..b82e913743 100644 --- a/plugins/Dashboard/templates/_dashboardSettings.twig +++ b/plugins/Dashboard/templates/_dashboardSettings.twig @@ -1,12 +1,12 @@ -<span>{{ 'Dashboard_Dashboard'|translate }}</span> -<ul class="submenu"> +<a class="title" title="{{ 'Dashboard_ManageDashboard'|translate|e('html_attr') }}"><span class="icon icon-arrow-bottom"></span>{{ 'Dashboard_Dashboard'|translate }} </a> +<ul class="dropdown submenu"> <li> - <div class="addWidget">{{ 'Dashboard_AddAWidget'|translate }} ↓</div> + <div class="addWidget">{{ 'Dashboard_AddAWidget'|translate }}</div> <ul class="widgetpreview-categorylist"></ul> </li> {% if dashboardActions|length > 0 %} <li> - <div class="manageDashboard">{{ 'Dashboard_ManageDashboard'|translate }} ↓</div> + <div class="manageDashboard">{{ 'Dashboard_ManageDashboard'|translate }}</div> <ul> {% for action, title in dashboardActions %} <li data-action="{{ action }}">{{ title|translate }}</li> diff --git a/plugins/Dashboard/templates/index.twig b/plugins/Dashboard/templates/index.twig index 0a8831fe3f..ddaac2428c 100644 --- a/plugins/Dashboard/templates/index.twig +++ b/plugins/Dashboard/templates/index.twig @@ -3,11 +3,12 @@ {% include "@CoreHome/_periodSelect.twig" %} {{ postEvent("Template.nextToCalendar") }} {% render dashboardSettingsControl %} - <div id="Dashboard" class="piwikTopControl"> + <div id="Dashboard" class="piwikTopControl borderedControl piwikSelector"> <ul> {% for dashboard in dashboards %} <li class="dashboardMenuItem" id="Dashboard_embeddedIndex_{{ dashboard.iddashboard }}"> - <a href="javascript:$('#dashboardWidgetsArea').dashboard('loadDashboard', {{ dashboard.iddashboard }});">{{ dashboard.name|escape }}</a> + <a href="javascript:$('#dashboardWidgetsArea').dashboard('loadDashboard', {{ dashboard.iddashboard }});" + class="title">{{ dashboard.name|escape }}</a> </li> {% endfor %} </ul> diff --git a/plugins/ExamplePlugin/tests/UI/expected-ui-screenshots/SimpleUITest_simplePage.png b/plugins/ExamplePlugin/tests/UI/expected-ui-screenshots/SimpleUITest_simplePage.png index abda1cb32078cbac45acd55b29b52bfa65ccef68..34830ea4e9a5a02076559fb5a549a018ebcbb29a 100644 GIT binary patch literal 15064 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 literal 15196 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 diff --git a/plugins/ExamplePlugin/tests/UI/expected-ui-screenshots/SimpleUITest_simplePagePartial.png b/plugins/ExamplePlugin/tests/UI/expected-ui-screenshots/SimpleUITest_simplePagePartial.png index 3543e6596a5fe86860832f070e81d5922ad7e2ca..e64af9b12ddd18f480ce35e4cb51a5c2067a4f67 100644 GIT binary patch literal 10004 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 K+{}|Vd;C9Zw#9w` literal 9676 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 R<9AdPqM>&ebNk`r{{fu5E)@U( diff --git a/plugins/Goals/templates/manageGoals.twig b/plugins/Goals/templates/manageGoals.twig index 4e3a4ce855..72124faf72 100644 --- a/plugins/Goals/templates/manageGoals.twig +++ b/plugins/Goals/templates/manageGoals.twig @@ -2,6 +2,10 @@ {% set title %}{{ 'Goals_ManageGoals'|translate }}{% endset %} +{% block topcontrols %} + {% include "@CoreHome/_siteSelectHeader.twig" %} +{% endblock %} + {% block content %} <h2 piwik-enriched-headline> @@ -20,8 +24,6 @@ {{ title }} </h2> - {% include "@CoreHome/_siteSelectHeader.twig" %} - {% include "@Goals/_addEditGoal.twig" %} <style type="text/css"> diff --git a/plugins/ImageGraph/templates/testAllSizes.twig b/plugins/ImageGraph/templates/testAllSizes.twig index c00c023d09..c4df9672ec 100644 --- a/plugins/ImageGraph/templates/testAllSizes.twig +++ b/plugins/ImageGraph/templates/testAllSizes.twig @@ -1,15 +1,15 @@ {% extends 'dashboard.twig' %} +{% block topcontrols %} + {% include '@CoreHome/_periodSelect.twig' %} +{% endblock %} + {% block content %} {% set showSitesSelection=true %} <div> <h2>{{ 'ImageGraph_ImageGraph'|translate }} ::: {{ siteName }}</h2> - <div class="top_controls"> - {% include '@CoreHome/_periodSelect.twig' %} - </div> - <div class="entityContainer" style="width:100%;"> <div class="entityAddContainer"> <table class="dataTable entityTable"> diff --git a/plugins/Installation/stylesheets/installation.css b/plugins/Installation/stylesheets/installation.css index 5621ae98df..feb21be950 100644 --- a/plugins/Installation/stylesheets/installation.css +++ b/plugins/Installation/stylesheets/installation.css @@ -4,7 +4,7 @@ body { /* Header */ .header { - padding: 50px 0 12px; + padding: 50px 0 22px; margin-bottom: 40px; border-bottom: solid 1px #ccc; } @@ -20,7 +20,7 @@ body { } .language-selector { float: left; - margin-left: 15px; + margin-left: 20px; margin-top: 10px; } .installation-progress { diff --git a/plugins/LeftMenu/API.php b/plugins/LeftMenu/API.php deleted file mode 100644 index 3d0d38b646..0000000000 --- a/plugins/LeftMenu/API.php +++ /dev/null @@ -1,44 +0,0 @@ -<?php -/** - * Piwik - free/libre analytics platform - * - * @link http://piwik.org - * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later - * - */ -namespace Piwik\Plugins\LeftMenu; - -/** - * API for plugin LeftMenu - * - * @method static \Piwik\Plugins\LeftMenu\API getInstance() - */ -class API extends \Piwik\Plugin\API -{ - /** - * Returns true if the left menu is enabled for the current user. - * - * @return bool - */ - public function isEnabled() - { - $settings = new Settings('LeftMenu'); - $default = $settings->globalEnabled->getValue(); - - if (!$settings->userEnabled->isReadableByCurrentUser()) { - return $default; - } - - $user = $settings->userEnabled->getValue(); - - if (empty($user) || $user === 'system') { - return $default; - } - - if ($user === 'no') { - return false; - } - - return true; - } -} diff --git a/plugins/LeftMenu/LeftMenu.php b/plugins/LeftMenu/LeftMenu.php deleted file mode 100755 index 522965e6b8..0000000000 --- a/plugins/LeftMenu/LeftMenu.php +++ /dev/null @@ -1,35 +0,0 @@ -<?php -/** - * Piwik - free/libre analytics platform - * - * @link http://piwik.org - * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later - * - */ - -namespace Piwik\Plugins\LeftMenu; - -class LeftMenu extends \Piwik\Plugin -{ - public function registerEvents() - { - return array( - 'AssetManager.getStylesheetFiles' => array('function' => 'getStylesheetFiles', 'after' => true), - 'Template.bodyClass' => 'addClassToBody' - ); - } - - public function addClassToBody(&$str, $layout) - { - if (API::getInstance()->isEnabled() && 'dashboard' === $layout) { - $str .= ' leftMenuPlugin'; - } - } - - public function getStylesheetFiles(&$stylesheets) - { - $stylesheets[] = "plugins/LeftMenu/stylesheets/theme.less"; - } - -} - diff --git a/plugins/LeftMenu/Settings.php b/plugins/LeftMenu/Settings.php deleted file mode 100644 index b22c1bc40a..0000000000 --- a/plugins/LeftMenu/Settings.php +++ /dev/null @@ -1,67 +0,0 @@ -<?php -/** - * Piwik - free/libre analytics platform - * - * @link http://piwik.org - * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later - * - */ -namespace Piwik\Plugins\LeftMenu; - -use Piwik\Piwik; -use Piwik\Settings\SystemSetting; -use Piwik\Settings\UserSetting; - -/** - * Defines Settings for LeftMenu. - */ -class Settings extends \Piwik\Plugin\Settings -{ - /** @var SystemSetting */ - public $globalEnabled; - - /** @var UserSetting */ - public $userEnabled; - - protected function init() - { - $this->setIntroduction($this->t('SettingsIntroduction')); - - $this->createGlobalEnabledSetting(); - - $this->createUserEnabledSetting(); - } - - private function createGlobalEnabledSetting() - { - $this->globalEnabled = new SystemSetting('globalEnabled', $this->t('GlobalSettingTitle')); - $this->globalEnabled->type = static::TYPE_BOOL; - $this->globalEnabled->inlineHelp = $this->t('GlobalSettingDescription') . ' ' . $this->t('GlobalSettingInlineHelp'); - $this->globalEnabled->defaultValue = false; - $this->globalEnabled->readableByCurrentUser = true; - - $this->addSetting($this->globalEnabled); - } - - private function createUserEnabledSetting() - { - $this->userEnabled = new UserSetting('userEnabled', $this->t('UserSettingTitle')); - $this->userEnabled->type = static::TYPE_STRING; - $this->userEnabled->uiControlType = static::CONTROL_RADIO; - $this->userEnabled->defaultValue = 'system'; - $this->userEnabled->inlineHelp = $this->t('UserSettingInlineHelp'); - $this->userEnabled->availableValues = array( - 'system' => Piwik::translate('General_Default'), - 'yes' => Piwik::translate('General_Yes'), - 'no' => Piwik::translate('General_No') - ); - - $this->addSetting($this->userEnabled); - } - - private function t($key) - { - return Piwik::translate('LeftMenu_' . $key); - } - -} diff --git a/plugins/LeftMenu/lang/bg.json b/plugins/LeftMenu/lang/bg.json deleted file mode 100644 index 4c5cc8fc36..0000000000 --- a/plugins/LeftMenu/lang/bg.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "LeftMenu": { - "UserSettingTitle": "Ðктивиране на лÑвото меню за отчет" - } -} \ No newline at end of file diff --git a/plugins/LeftMenu/lang/cs.json b/plugins/LeftMenu/lang/cs.json deleted file mode 100644 index e15938a574..0000000000 --- a/plugins/LeftMenu/lang/cs.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "LeftMenu": { - "PluginDescription": "UmÃstit menu nástÄ›nky nalevo.", - "SettingsIntroduction": "Zásuvný modul levé menu pÅ™esune menu hlášenà na levou stranu (je-li povolen). To je pÅ™edevÅ¡Ãm užiteÄné na velkých displejÃch.", - "GlobalSettingTitle": "Levé menu je ve výchozÃm stavu povoleno", - "GlobalSettingDescription": "Definuje systémovou výchozà hodnotu pro vÅ¡echny uživatele.", - "GlobalSettingInlineHelp": "Uživatelé si mohou zakázat\/povolit levé menu nezávisle na systémové výchozà hodnotÄ›.", - "UserSettingTitle": "Povolit levé menu hlášenÃ", - "UserSettingInlineHelp": "Toto povolà nebo zakáže levé menu jen pro vás bez ohledu na jiné uživatele. Super uživatel může nastavit výchozà systémovou hodnotu." - } -} \ No newline at end of file diff --git a/plugins/LeftMenu/lang/da.json b/plugins/LeftMenu/lang/da.json deleted file mode 100644 index 27da2b1651..0000000000 --- a/plugins/LeftMenu/lang/da.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "LeftMenu": { - "SettingsIntroduction": "Venstre menu udvidelsen vil flytte rapportmenuen fra toppen til venstre, hvis aktiveret. Dette er især nyttigt for store skærme.", - "GlobalSettingTitle": "Venstre menu aktiveret som standard", - "GlobalSettingDescription": "Definerer systemets standard indstillinger for alle brugerne.", - "GlobalSettingInlineHelp": "Brugerne er i stand til at aktivere\/deaktivere venstremenuen uafhængigt af systemets standard indstillinger.", - "UserSettingTitle": "Aktiver rapportmenu til venstre", - "UserSettingInlineHelp": "Dette vil kun aktivere eller deaktivere venstre menuen for dig og pÃ¥virker ikke andre brugere. En superbruger kan ændre standardindstillingen for alle brugere." - } -} \ No newline at end of file diff --git a/plugins/LeftMenu/lang/de.json b/plugins/LeftMenu/lang/de.json deleted file mode 100644 index 997daaca28..0000000000 --- a/plugins/LeftMenu/lang/de.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "LeftMenu": { - "PluginDescription": "Platziert das Dashboardmenü auf die linke Seite", - "SettingsIntroduction": "Das LeftMenu Plug-In verschiebt die Menüs für die Reporte auf die linke Seite. Dies ist für umfangreiche Reporte hilfreich.", - "GlobalSettingTitle": "LeftMenu aktiviert als Voreinstellung", - "GlobalSettingDescription": "Legt die Standardeinstellung für alle Benutzer fest.", - "GlobalSettingInlineHelp": "Die Benutzer können es unabhängig von der Vorgabe aktivieren\/deaktivieren.", - "UserSettingTitle": "LeftMenu aktiviert", - "UserSettingInlineHelp": "Legt die Einstellung für den aktuellen Benutzer fest, ob LeftMenu aktiviert oder deaktiviert sein soll. Ein Administrator kann die Standardeinstellung für alle Benutzer festlegen." - } -} \ No newline at end of file diff --git a/plugins/LeftMenu/lang/el.json b/plugins/LeftMenu/lang/el.json deleted file mode 100644 index e8ef94446e..0000000000 --- a/plugins/LeftMenu/lang/el.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "LeftMenu": { - "PluginDescription": "ΤοποθÎτηση του Î¼ÎµÎ½Î¿Ï Ï„Î¿Ï… πίνακα ελÎγχου στα αÏιστεÏά.", - "SettingsIntroduction": "Το Ï€Ïόσθετο για το αÏιστεÏÏŒ Î¼ÎµÎ½Î¿Ï Î¸Î± μετακινήσει το Î¼ÎµÎ½Î¿Ï Î±Î½Î±Ï†Î¿Ïών από την κοÏυφή Ï€Ïος τα αÏιστεÏά αν ενεÏγοποιηθεί. Αυτό είναι ιδιαίτεÏα χÏήσιμο για μεγάλες οθόνες.", - "GlobalSettingTitle": "Το αÏιστεÏÏŒ Î¼ÎµÎ½Î¿Ï ÎµÎ¯Î½Î±Î¹ εξ' οÏÎ¹ÏƒÎ¼Î¿Ï ÎµÎ½ÎµÏγοποιημÎνο.", - "GlobalSettingDescription": "ΟÏίζει την Ï€Ïοεπιλογή για όλους τους χÏήστες.", - "GlobalSettingInlineHelp": "Οι χÏήστες μποÏοÏν να απενεÏγοποιοÏν\/ενεÏγοποιοÏν το αÏιστεÏÏŒ Î¼ÎµÎ½Î¿Ï Î±Î½ÎµÎ¾Î¬Ïτητα από την Ï€ÏοεπιλεγμÎνη ÏÏθμιση του συστήματος.", - "UserSettingTitle": "ΕνεÏγοποίηση του αÏιστεÏÎ¿Ï Î¼ÎµÎ½Î¿Ï Î±Î½Î±Ï†Î¿Ïών", - "UserSettingInlineHelp": "Αυτό θα ενεÏγοποιήσει ή απενεÏγοποιήσει το αÏιστεÏÏŒ Î¼ÎµÎ½Î¿Ï Î¼ÏŒÎ½Î¿ για εσάς και δε θα επηÏεάσει άλλους χÏήστες. Ένας ΥπεÏχÏήστης μποÏεί να αλλάξει την Ï€ÏοκαθοÏισμÎνη ÏÏθμιση για όλους τους χÏήστες." - } -} \ No newline at end of file diff --git a/plugins/LeftMenu/lang/en.json b/plugins/LeftMenu/lang/en.json deleted file mode 100644 index 2869b86479..0000000000 --- a/plugins/LeftMenu/lang/en.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "LeftMenu": { - "PluginDescription": "Position the dashboard menu to the left.", - "SettingsIntroduction": "The left menu plugin will move the reporting menu from the top to the left if enabled. This is especially useful for large displays.", - "GlobalSettingTitle": "Left menu enabled by default", - "GlobalSettingDescription": "Defines the system default for all of your users.", - "GlobalSettingInlineHelp": "Users are able to disable/enable the left menu independent of the system default.", - "UserSettingTitle": "Enable left reporting menu", - "UserSettingInlineHelp": "This will enable or disable the left menu only for you and not affect any other users. A Super User can change the default for all users." - } -} \ No newline at end of file diff --git a/plugins/LeftMenu/lang/es.json b/plugins/LeftMenu/lang/es.json deleted file mode 100644 index 66a3ed43f7..0000000000 --- a/plugins/LeftMenu/lang/es.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "LeftMenu": { - "PluginDescription": "Ubicar el menú del tablero a la izquierda.", - "SettingsIntroduction": "El menú izquierdo del complemento moverá el menú de información desde la parte superior a la izquierda si es habilitado. Especialmente útil para pantallas grandes.", - "GlobalSettingTitle": "Menú izquierdo activado por defecto", - "GlobalSettingDescription": "Define el sistema predeterminado para todos sus usuarios.", - "GlobalSettingInlineHelp": "Los usuarios están habilitados a habilitar\/deshabilitar el menú izquierdo independientemente del sistema predeterminado.", - "UserSettingTitle": "Habilitar menú izquierdo de información", - "UserSettingInlineHelp": "Esto habilitará o deshabilitará el menú izquierdo solo para usted y no afectará a ningún otro usuario. Un Super Usuario puede cambiar el modo predeterminado para todos los demás usuarios." - } -} \ No newline at end of file diff --git a/plugins/LeftMenu/lang/fi.json b/plugins/LeftMenu/lang/fi.json deleted file mode 100644 index d2007c8cf4..0000000000 --- a/plugins/LeftMenu/lang/fi.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "LeftMenu": { - "GlobalSettingTitle": "Vasen valikko oletuksena käytössä", - "GlobalSettingDescription": "Määrittää järjestelmän oletusasetuksen kaikille käyttäjille.", - "GlobalSettingInlineHelp": "Käyttäjät voivat poistaa käytöstä\/ottaa käyttöön vasemman valikon riippumatta järjestelmän oletusasetuksesta.", - "UserSettingTitle": "Ota vasen raportointivalikko käyttöön" - } -} \ No newline at end of file diff --git a/plugins/LeftMenu/lang/fr.json b/plugins/LeftMenu/lang/fr.json deleted file mode 100644 index 52b8c6b0b8..0000000000 --- a/plugins/LeftMenu/lang/fr.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "LeftMenu": { - "PluginDescription": "Positionne le menu du tableau de bord sur la gauche.", - "SettingsIntroduction": "Le composant de menu à gauche va déplacer le menu de rapport d'en haut vers la gauche s'il est activé. C'est particulièrement utile pour les affichages larges.", - "GlobalSettingTitle": "Menu de gauche activé par défaut", - "GlobalSettingDescription": "Définit les valeurs système par défaut pour tous les utilisateurs.", - "GlobalSettingInlineHelp": "Les utilisateurs peuvent activer\/désactiver le menu de gauche indépendant des valeurs par défaut du système.", - "UserSettingTitle": "Activer le menu de rapport de gauche", - "UserSettingInlineHelp": "Cela va activer ou désactiver le menu de gauche pour vous uniquement et ne pas affecter les autres utilisateurs. Un super utilisateur peut modifier le paramètre par défaut pour tous les utilisateurs." - } -} \ No newline at end of file diff --git a/plugins/LeftMenu/lang/hi.json b/plugins/LeftMenu/lang/hi.json deleted file mode 100644 index b45521c7e6..0000000000 --- a/plugins/LeftMenu/lang/hi.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "LeftMenu": { - "PluginDescription": "बाईं ओर डैशबोरà¥à¤¡ मेनू सà¥à¤¥à¤¿à¤¤à¤¿à¥¤", - "SettingsIntroduction": "अगर सकà¥à¤°à¤¿à¤¯ बाà¤à¤ मेनू पà¥à¤²à¤—इन बाईं ओर ऊपर से रिपोरà¥à¤Ÿà¤¿à¤‚ग मेनू कदम होगा। इस बड़े डिसà¥à¤ªà¥à¤²à¥‡ के लिठविशेष रूप से उपयोगी है।", - "GlobalSettingTitle": "डिफ़ॉलà¥à¤Ÿ रूप से सकà¥à¤·à¤® बाà¤à¤ मेनू", - "GlobalSettingDescription": "आपके सà¤à¥€ उपयोगकरà¥à¤¤à¤¾à¤“ं के लिठसिसà¥à¤Ÿà¤® मूलà¤à¥‚त को परिà¤à¤¾à¤·à¤¿à¤¤ करता है।", - "GlobalSettingInlineHelp": "उपयोगकरà¥à¤¤à¤¾ निषà¥à¤•à¥à¤°à¤¿à¤¯ \/ सिसà¥à¤Ÿà¤® डिफ़ॉलà¥à¤Ÿ के बाईं ओर मेनू सà¥à¤µà¤¤à¤‚तà¥à¤° सकà¥à¤·à¤® करने में सकà¥à¤·à¤® हैं।", - "UserSettingTitle": "छोड़ दिया रिपोरà¥à¤Ÿà¤¿à¤‚ग मेनू सकà¥à¤·à¤® करें", - "UserSettingInlineHelp": "इस सकà¥à¤·à¤® है या केवल आप के लिठछोड़ दिया मेनू को अकà¥à¤·à¤® और किसी à¤à¥€ अनà¥à¤¯ उपयोगकरà¥à¤¤à¤¾à¤“ं को पà¥à¤°à¤à¤¾à¤µà¤¿à¤¤ नहीं करेगा । à¤à¤• सà¥à¤ªà¤° उपयोगकरà¥à¤¤à¤¾ सà¤à¥€ उपयोगकरà¥à¤¤à¤¾à¤“ं के लिठडिफ़ॉलà¥à¤Ÿ बदल सकते हैं।" - } -} \ No newline at end of file diff --git a/plugins/LeftMenu/lang/it.json b/plugins/LeftMenu/lang/it.json deleted file mode 100644 index 844623abbc..0000000000 --- a/plugins/LeftMenu/lang/it.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "LeftMenu": { - "PluginDescription": "Posiziona il menù dashboard sulla sinistra.", - "SettingsIntroduction": "Il plugin menù di sinistra sposta il menu di segnalazione dalla parte superiore a sinistra, se abilitato. Ciò è particolarmente utile per i display di grandi dimensioni.", - "GlobalSettingTitle": "Il menù di sinistra è abilitato di default", - "GlobalSettingDescription": "Definisce le impostazioni predefinite di sistema per tutti gli utenti.", - "GlobalSettingInlineHelp": "Gli utenti possono disabilitare o abilitare il menù di sinistra indipendentemente dalle impostazioni predefinite del sistema.", - "UserSettingTitle": "Abilita il menù di segnalazione di sinistra", - "UserSettingInlineHelp": "Questo abilita o disabilita il menù di sinistra solo per te e non ha effetto per gli altri utenti. Un Super User può cambiare per tutti gli utenti le impostazioni predefinite." - } -} \ No newline at end of file diff --git a/plugins/LeftMenu/lang/ja.json b/plugins/LeftMenu/lang/ja.json deleted file mode 100644 index 6d4e82e5ec..0000000000 --- a/plugins/LeftMenu/lang/ja.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "LeftMenu": { - "SettingsIntroduction": "左メニューã®ãƒ—ラグインã¯ã€æœ‰åŠ¹åŒ–ã•ã‚Œã¦ã„ã‚‹å ´åˆã€ãƒ¬ãƒãƒ¼ãƒˆãƒ¡ãƒ‹ãƒ¥ãƒ¼ã‚’トップã‹ã‚‰å·¦ã«ç§»å‹•ã—ã¾ã™ã€‚ã“ã®ç§»å‹•ã¯ã€ç‰¹ã«å¤§ããªãƒ‡ã‚£ã‚¹ãƒ—レイをãŠä½¿ã„ã®å ´åˆã€ä¾¿åˆ©ã§ã™ã€‚", - "GlobalSettingTitle": "デフォルトã«ã‚ˆã‚Šæœ‰åŠ¹åŒ–ã•ã‚ŒãŸå·¦ãƒ¡ãƒ‹ãƒ¥ãƒ¼", - "GlobalSettingDescription": "全サイトユーザーã®ãŸã‚ã®ã‚·ã‚¹ãƒ†ãƒ デフォルトを定義", - "GlobalSettingInlineHelp": "ユーザーã¯ã€ã‚·ã‚¹ãƒ†ãƒ デフォルトã®å·¦ãƒ¡ãƒ‹ãƒ¥ãƒ¼ã®ç‹¬ç«‹ã‚’無効 \/ 有効ã«ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚", - "UserSettingTitle": "å·¦ã®ãƒ¬ãƒãƒ¼ãƒˆãƒ¡ãƒ‹ãƒ¥ãƒ¼ã‚’有効ã«ã™ã‚‹", - "UserSettingInlineHelp": "ã“ã‚Œã¯ã€å·¦ãƒ¡ãƒ‹ãƒ¥ãƒ¼ã‚’ã‚ãªãŸã®ãŸã‚ã ã‘ã«æœ‰åŠ¹ã¾ãŸã¯ç„¡åŠ¹ã«ã—ã€ä»–ã®ãƒ¦ãƒ¼ã‚¶ãƒ¼ã«ã¯å½±éŸ¿ã—ã¾ã›ã‚“。スーパーユーザーã¯ã€å…¨ã¦ã®ãƒ¦ãƒ¼ã‚¶ãƒ¼ã«å¯¾ã™ã‚‹ãƒ‡ãƒ•ã‚©ãƒ«ãƒˆè¨å®šã‚’変更ã§ãã¾ã™ã€‚" - } -} \ No newline at end of file diff --git a/plugins/LeftMenu/lang/nl.json b/plugins/LeftMenu/lang/nl.json deleted file mode 100644 index f3dcf078a8..0000000000 --- a/plugins/LeftMenu/lang/nl.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "LeftMenu": { - "PluginDescription": "Plaats het dashboard menu aan de linkerzijde", - "SettingsIntroduction": "De linkermenu plugin verplaatst indien ingeschakeld het menu van bovenaan de pagina naar links. Deze optie is vooral handig bij het gebruik van een groot scherm.", - "GlobalSettingTitle": "Linker menu standaard ingeschakeld", - "GlobalSettingDescription": "Definieert het systeem standaard voor al uw gebruikers.", - "GlobalSettingInlineHelp": "De gebruikers hebben de mogelijkheid om het linkermenu in of uit te schakelen los van de algemene instellingen.", - "UserSettingTitle": "Schakel het linker menu in.", - "UserSettingInlineHelp": "Dit zal het linkermenu alleen voor u en niet voor andere gebruikers inschakelen. Een Super User kan de standaard instelling voor alle gebruikers aanpassen." - } -} \ No newline at end of file diff --git a/plugins/LeftMenu/lang/pl.json b/plugins/LeftMenu/lang/pl.json deleted file mode 100644 index c75b2ea5d8..0000000000 --- a/plugins/LeftMenu/lang/pl.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "LeftMenu": { - "GlobalSettingTitle": "Menu po lewej stronie domyÅ›lnie wÅ‚Ä…czone", - "GlobalSettingDescription": "Definiuje domyÅ›lne systemu dla wszystkich użytkowników." - } -} \ No newline at end of file diff --git a/plugins/LeftMenu/lang/pt-br.json b/plugins/LeftMenu/lang/pt-br.json deleted file mode 100644 index 69c7444974..0000000000 --- a/plugins/LeftMenu/lang/pt-br.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "LeftMenu": { - "PluginDescription": "Posiciona o menu do painel de controle à esquerda.", - "SettingsIntroduction": "O plugin de menu lateral irá mover o menu de relatórios do topo para a esquerda, se habilitado. Isto é útil especialmente para telas de grandes proporções.", - "GlobalSettingTitle": "Menu lateral habilitado por padrão", - "GlobalSettingDescription": "Define o padrão do sistema para todos os usuários.", - "GlobalSettingInlineHelp": "Usuários podem habilitar ou desabilitar o menu lateral independentemente do padrão do sistema.", - "UserSettingTitle": "Habilitar o menu lateral de relatórios", - "UserSettingInlineHelp": "Isto irá habilitar ou desabilitar o menu lateral apenas para você, sem afetar nenhum outro usuário. Um superusuário poderá alterar o padrão para todos os usuários." - } -} \ No newline at end of file diff --git a/plugins/LeftMenu/lang/pt.json b/plugins/LeftMenu/lang/pt.json deleted file mode 100644 index 787044a2ec..0000000000 --- a/plugins/LeftMenu/lang/pt.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "LeftMenu": { - "PluginDescription": "Posiçionar o painel do menu na esquerda.", - "SettingsIntroduction": "O plugin menu à esquerda irá mover o menu dos relatórios do topo à esquerda se estiver ativado. Isto é especialmente útil para grandes ecrãs.", - "GlobalSettingTitle": "Menu esquerdo ativo por padrão.", - "GlobalSettingDescription": "Definição do sistema padrão para todos os usuários.", - "GlobalSettingInlineHelp": "Os utilizadores são capazes de ativar ou desativar o menu na esquerda independentemente da preferência padrão do sistema.", - "UserSettingTitle": "Ative o menu relatório na esquerda.", - "UserSettingInlineHelp": "Isso irá ativar ou desativar o menu à esquerda apenas para ti e não afecta quaisquer outros utilizadores. Um super user pode alterar o padrão para todos os utilizadores." - } -} \ No newline at end of file diff --git a/plugins/LeftMenu/lang/ro.json b/plugins/LeftMenu/lang/ro.json deleted file mode 100644 index fa63c4cac6..0000000000 --- a/plugins/LeftMenu/lang/ro.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "LeftMenu": { - "SettingsIntroduction": "Modulul meniului din stânga va muta meniul de raportare din partea de sus în partea stângă dacă este activat. Acesta este folositor în special în cazul ecranelor mari.", - "GlobalSettingTitle": "Meniul din stânnga este activat implicit", - "GlobalSettingDescription": "DefineÈ™te valoarea implicită pentru toÈ›i utilizatorii.", - "GlobalSettingInlineHelp": "Utilizatorii pot dezactiva\/activa meniul din stânga independet de valoare implicită.", - "UserSettingTitle": "Activează meniul de raportare din stânga", - "UserSettingInlineHelp": "Acesta va activa sau dezactiva meniul din stânga doar pentru dumneavoastra È™i nu va afecta alÈ›i utilizatori. Un Super Utilizator va putea schimba modul implicit pentru toÈ›i utilizatorii." - } -} \ No newline at end of file diff --git a/plugins/LeftMenu/lang/ru.json b/plugins/LeftMenu/lang/ru.json deleted file mode 100644 index e0d825348b..0000000000 --- a/plugins/LeftMenu/lang/ru.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "LeftMenu": { - "SettingsIntroduction": "ЕÑли включить плагин LeftMenu, он перемеÑтит главное меню Ñверху налево. Ðто будет удобно Ð´Ð»Ñ Ð±Ð¾Ð»ÑŒÑˆÐ¸Ñ… Ñкранов.", - "GlobalSettingTitle": "Левое меню включено поумолчанию", - "GlobalSettingDescription": "ОпределÑет значение по умолчанию Ð´Ð»Ñ Ð²Ñех пользователей.", - "GlobalSettingInlineHelp": "Пользователи имеют возможноÑÑ‚ÑŒ отключить\/включить левое меню незавиÑимо от Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ð¿Ð¾ умолчанию.", - "UserSettingInlineHelp": "Ðто включает или отключает левое меню только Ð´Ð»Ñ Ð²Ð°Ñ Ð¸ не влиÑет на других пользователей. Суперпользователь может изменить наÑтройки по умолчанию Ð´Ð»Ñ Ð²Ñех пользователей." - } -} \ No newline at end of file diff --git a/plugins/LeftMenu/lang/sr.json b/plugins/LeftMenu/lang/sr.json deleted file mode 100644 index e2aaa6bbc1..0000000000 --- a/plugins/LeftMenu/lang/sr.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "LeftMenu": { - "PluginDescription": "Postavi meni za konzolu na levu stranu.", - "SettingsIntroduction": "Dodatak za levi meni će pomeriti meni za izveÅ¡taje sa vrha na levu stranu. Ovo je praktiÄno od velikih monitora.", - "GlobalSettingTitle": "Levi meni je podrazumevano ukljuÄen", - "GlobalSettingDescription": "Postavljanje podrazumevanih vrednosti za sve korisnike.", - "GlobalSettingInlineHelp": "Korisnici mogu da ukljuÄuju i iskljuÄuju levi meni nezavisno od podrazumevanih sistemskih podeÅ¡avanja.", - "UserSettingTitle": "Omogući meni sa leve strane", - "UserSettingInlineHelp": "Ova opcija će ukljuÄiti ili iskljuÄiti meni sa leve strane samo za vas a ne i za ostale korisnike. Superkorisnik može da promeni podrazumevane vrednosti za sve korisnike." - } -} \ No newline at end of file diff --git a/plugins/LeftMenu/lang/sv.json b/plugins/LeftMenu/lang/sv.json deleted file mode 100644 index aeaa07d522..0000000000 --- a/plugins/LeftMenu/lang/sv.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "LeftMenu": { - "PluginDescription": "Placera menyn till vänster.", - "SettingsIntroduction": "Tillägget för vänstermeny kommer, ifall det är aktiverat, flytta rapportmenyn till den vänstra sidan. Detta är speciellt användbart för större skärmar.", - "GlobalSettingTitle": "Vänster meny aktiverad som standard", - "GlobalSettingDescription": "Definierar systemets standardinställning för alla dina användare.", - "GlobalSettingInlineHelp": "Användare har möjlighet att aktivera\/deaktivera vänstermenyn oavhängigt systeminställningarna.", - "UserSettingTitle": "Aktivera vänster rapporteringsmeny", - "UserSettingInlineHelp": "Detta kommer aktivera\/deaktivera för dig utan att pÃ¥verka andra användare. En Super User kan ändra inställningen för samtliga användare." - } -} \ No newline at end of file diff --git a/plugins/LeftMenu/lang/tl.json b/plugins/LeftMenu/lang/tl.json deleted file mode 100644 index 2a6a0045b6..0000000000 --- a/plugins/LeftMenu/lang/tl.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "LeftMenu": { - "SettingsIntroduction": "Ang kaliwang menu na may plugin ay pwedeng ilipat ang menu kung saan makikita ang ulat mula sa taas papunta sa kaliwa kung ito ay gumagana. Ito ay lalong mapapakinabangan sa malalaking display.", - "GlobalSettingTitle": "Ang kaliwa menu ay gumagana bilang default", - "GlobalSettingDescription": "Tinutukoy ang default system para sa lahat ng iyong mga user.", - "GlobalSettingInlineHelp": "Ang user ay maari makapag pagana o hindi makapag pagana ng menu sa kaliwa na independent sa system default.", - "UserSettingTitle": "Pagahanin ang kaliwang menu na pang ulat", - "UserSettingInlineHelp": "Ang menu sa kaliwa ay pwede mong paganahin o wag paganahin at hindi maapektuhan ang ibang mga user. Ang Super User ay pwedeng baguhin ang lahat pangunahing pagpipilian sa lahat ng users." - } -} \ No newline at end of file diff --git a/plugins/LeftMenu/lang/tr.json b/plugins/LeftMenu/lang/tr.json deleted file mode 100644 index ab8dbb51d8..0000000000 --- a/plugins/LeftMenu/lang/tr.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "LeftMenu": { - "UserSettingTitle": "Sol raporlama menüsünü etkinleÅŸtir" - } -} \ No newline at end of file diff --git a/plugins/LeftMenu/lang/zh-cn.json b/plugins/LeftMenu/lang/zh-cn.json deleted file mode 100644 index fef3e18afd..0000000000 --- a/plugins/LeftMenu/lang/zh-cn.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "LeftMenu": { - "GlobalSettingTitle": "å·¦èœå•é»˜è®¤æ‰“å¼€", - "UserSettingTitle": "å¼€å¯å·¦è¾¹çš„报表èœå•" - } -} \ No newline at end of file diff --git a/plugins/LeftMenu/stylesheets/theme.less b/plugins/LeftMenu/stylesheets/theme.less deleted file mode 100644 index 6c15ee301e..0000000000 --- a/plugins/LeftMenu/stylesheets/theme.less +++ /dev/null @@ -1,150 +0,0 @@ -.leftMenuPlugin { - - #container { - clear: left; - } - - #root .Menu--dashboard { - border: 0px; - - > .Menu-tabList { - margin-left: 5px; - margin-bottom: 0; - margin-top: 0.1em; - border: 1px solid @theme-color-background-lowContrast; - } - - > li { - border-bottom: 1px solid @theme-color-background-lowContrast; - } - } - - #content.home { - padding-top: 15px; - display:inline-block; - width:100%; - } - - .Menu--dashboard { - padding: 0; - float: left; - width: 240px; - padding-top: 24px; - clear: left; - - > .Menu-tabList { - -moz-background-size: 5px 100%; - background-size: 5px 100%; - background-position: 0 0, 100% 0; - background-repeat: no-repeat; - - > li { - > ul { - min-height: 0; - max-height: 0; - padding: 0; - overflow: hidden; - position: static; - float: none; - } - - > span, - > a { - display: block; - padding: 5px 10px; - font-size: 18px; - line-height: 24px; - text-decoration: none; - float: none; - } - } - - > .sfActive > ul { - padding-bottom: 5px; - max-height: 500px; /* That's a hack for CSS transitions */ - } - - li { - list-style: none; - margin: 0; - float: none; - border: 0; - border-radius: 0; - background: transparent; - - a:hover { - text-decoration: underline; - } - - li { - float: none; - text-align: left; - - a { - text-decoration: none; - padding: 0.6em 0.9em; - font: 14px Arial, Helvetica, sans-serif; - display: block; - - &.current { - background: #defdbb; - } - - &:link, - &:visited { - text-decoration: none; - } - } - - } - } - - a { - height: auto; - } - - > .sfActive > a, - > li > a:hover { - background: #f1f1f1; - } - - > .sfActive .sfHover > a { - font-weight: bold; - } - } - } - - .top_controls { - clear: none; - left: 34px; - } - - .nav_sep { - display: none; - } - - .top_bar_sites_selector { - float: left; - } - - .pageWrap { - margin-left: 240px; - margin-top: 0; - max-height: none; - } - - .widget:first-child { - margin-top: 0; - } - - .sites_selector_in_dashboard { - margin-top: 0px; - margin-left: 5px; - } - - .sites_autocomplete .custom_select_main_link { - padding-top: 7px; - padding-bottom: 7px; - } - -} diff --git a/plugins/LeftMenu/tests/Integration/APITest.php b/plugins/LeftMenu/tests/Integration/APITest.php deleted file mode 100644 index c536165905..0000000000 --- a/plugins/LeftMenu/tests/Integration/APITest.php +++ /dev/null @@ -1,149 +0,0 @@ -<?php -/** - * Piwik - free/libre analytics platform - * - * @link http://piwik.org - * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later - */ - -namespace Piwik\Plugins\LeftMenu\tests\Integration; - -use Piwik\Plugins\LeftMenu\API; -use Piwik\Plugins\LeftMenu\Settings; -use Piwik\Tests\Framework\Mock\FakeAccess; -use Piwik\Tests\Framework\TestCase\IntegrationTestCase; - -/** - * @group LeftMenu - * @group APITest - * @group Plugins - */ -class APITest extends IntegrationTestCase -{ - /** - * @var API - */ - private $api; - - /** - * @var Settings - */ - private $settings; - - public function setUp() - { - parent::setUp(); - - $this->api = API::getInstance(); - $this->createSettings(); - } - - public function test_isEnabled_shouldReturnFalse_ByDefault() - { - $this->assertLeftMenuIsDisabled(); - - $this->setUser(); - $this->assertLeftMenuIsDisabled(); - - $this->setSuperUser(); - $this->assertLeftMenuIsDisabled(); - } - - public function test_isEnabled_shouldReturnTrue_IfEnabledSystemWideAndNoUserPreference() - { - $this->enableLeftMenuForAll(); - - $this->assertLeftMenuIsEnabled(); - - $this->setUser(); - $this->assertLeftMenuIsEnabled(); - - $this->setAnonymous(); - $this->assertLeftMenuIsEnabled(); - } - - public function test_isEnabled_AUserPreferenceShouldOverwriteASystemPreference_DefaultDisabled() - { - $this->assertLeftMenuIsDisabled(); - - $this->setUser(); - $this->setUserSettingValue('yes'); - - $this->assertLeftMenuIsEnabled(); - - $this->setAnonymous(); - $this->assertLeftMenuIsDisabled(); - } - - public function test_isEnabled_AUserPreferenceShouldOverwriteASystemPreference_DefaultEnabled() - { - $this->enableLeftMenuForAll(); - - $this->assertLeftMenuIsEnabled(); - - $this->setUser(); - $this->setUserSettingValue('no'); - - $this->assertLeftMenuIsDisabled(); - - $this->setAnonymous(); - $this->assertLeftMenuIsEnabled(); - } - - private function assertLeftMenuIsEnabled() - { - $this->assertTrue($this->api->isEnabled()); - } - - private function assertLeftMenuIsDisabled() - { - $this->assertFalse($this->api->isEnabled()); - } - - private function setSuperUser() - { - FakeAccess::$superUser = true; - FakeAccess::$superUserLogin = 'superUserLogin'; - - $this->createSettings(); - } - - private function setAnonymous() - { - FakeAccess::clearAccess(); - $this->createSettings(); - } - - private function setUser() - { - FakeAccess::$idSitesView = array(1); - FakeAccess::$identity = 'userLogin'; - - $this->createSettings(); - } - - private function enableLeftMenuForAll() - { - $this->setSuperUser(); - $this->settings->globalEnabled->setValue(true); - $this->settings->save(); - } - - private function createSettings() - { - $this->settings = new Settings('LeftMenu'); - } - - private function setUserSettingValue($value) - { - $this->settings->userEnabled->setValue($value); - $this->settings->save(); - } - - public function provideContainerConfig() - { - return array( - 'Piwik\Access' => new FakeAccess() - ); - } -} diff --git a/plugins/Morpheus/Menu.php b/plugins/Morpheus/Menu.php index 740263e381..2ba349a302 100644 --- a/plugins/Morpheus/Menu.php +++ b/plugins/Morpheus/Menu.php @@ -10,6 +10,7 @@ namespace Piwik\Plugins\Morpheus; use Piwik\Development; use Piwik\Menu\MenuAdmin; +use Piwik\Menu\MenuReporting; use Piwik\Menu\MenuUser; use Piwik\Piwik; @@ -17,14 +18,35 @@ class Menu extends \Piwik\Plugin\Menu { public function configureAdminMenu(MenuAdmin $menu) { + $menu->registerMenuIcon('CoreAdminHome_MenuDevelopment', 'icon-admin-development'); + $menu->registerMenuIcon('CoreAdminHome_MenuDiagnostic', 'icon-admin-diagnostic'); + $menu->registerMenuIcon('CorePluginsAdmin_MenuPlatform', 'icon-admin-platform'); + $menu->registerMenuIcon('General_Settings', 'icon-admin-settings'); + $menu->registerMenuIcon('CoreAdminHome_Administration', 'icon-admin-administration'); + if (Development::isEnabled() && Piwik::isUserHasSomeAdminAccess()) { $menu->addDevelopmentItem('UI Demo', $this->urlForAction('demo')); } } + public function configureUserMenu(MenuUser $menu) { + $menu->registerMenuIcon('UsersManager_MenuPersonal', 'icon-user-personal'); + $menu->registerMenuIcon('CoreAdminHome_MenuManage', 'icon-user-manage'); + $menu->registerMenuIcon('CorePluginsAdmin_MenuPlatform', 'icon-user-platform'); + if (Development::isEnabled() && Piwik::isUserHasSomeAdminAccess()) { $menu->addPlatformItem('UI Demo', $this->urlForAction('demo'), $order = 15); } } + + public function configureReportingMenu(MenuReporting $menu) + { + $menu->registerMenuIcon('General_Visitors', 'icon-reporting-visitors'); + $menu->registerMenuIcon('General_Actions', 'icon-reporting-actions'); + $menu->registerMenuIcon('Referrers_Referrers', 'icon-reporting-referer'); + $menu->registerMenuIcon('Goals_Goals', 'icon-reporting-goal'); + $menu->registerMenuIcon('Goals_Ecommerce', 'icon-reporting-ecommerce'); + $menu->registerMenuIcon('Dashboard_Dashboard', 'icon-reporting-dashboard'); + } } diff --git a/plugins/Morpheus/fonts/piwik.eot b/plugins/Morpheus/fonts/piwik.eot old mode 100644 new mode 100755 index bd41afad9edb7d1ea2aa18ac9b0b38e047a5082a..3bda40841acba8c6ab0a9fa6808758a9135b4e7f GIT binary patch delta 5753 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 delta 1359 zcmZ`&TWA|s5S^>FR<hnJ?ds)STaqowl5NSW*G9D?Z`vf-$QHKo1A<E>I{_PFTS-Gu zQd6rm4Iv+;&P_@`Oi3Wn5}LH2e&nN2wJ~k!gFZ+hlzf<^g+M87Aa&gj$-RmYaX);Q znY(k(nVs1?Ggq&njkEN@{Q&RxuhEGnZt!MwO<rae0N@iM*}27B-Z}N{cWY&Sb?(w< zRRB}~kh1f~a!2X+&fW&tcaQKA^W;GFd6NzxX(D#V{NkyC2MiC09V0&7$Cu}F544ZJ z0(dS<@OKt-g*;5dHnE9-Ybm#Q?6<<1I{<xl!e7cSzkCWPf<XU;8V(eN{>3wB03F8b zD2)!69-%Wzjt1B%Hvv@!6L=sD`(Y5qaJS?OMXVf4w|ji?SRxwt&>U-xMiTLuuU)j* ztPx2}#KK6`gCwPeqr6Hy=4c5N<LPv~CZqZMXiemj-lx~=OLDb{L<8bJxLp0Y`Y9#j z-ngT$TCS7hX}QiG%~#7MLiZ5|*SdNI*|XK{bL#+2|4T9mv08#m9N8pJ<=3M2c+?^( zIWNh<$yQ`kE|$y1?BnINKZ^)<pdOB^$TE`UB6&zMS-E;uCaZL)dBwy$`#uXn7=TG! zX!RlnztZZ#U$lB$!6C`zl7@nfy?-Io)00`~Z|oSgb+muIn^9v<?WWYIfPZ&hL@Jz$ z+7y8B_kw4_BGR5P^2Nw?M%s{-Rry6LYecliFZyBwC=s!_8%Tp`Yak6K5=oIPq)H+w z8O73g)Y0;S#n5TM218vV19|TxR!vuC_Jq&@mUr>&Q&qpU=PTvizK3?Z?g{Jw&njFj z&$E?HmM@*;Q<Q@=m<}A^gDA)_0!QF96yXYKRIG3vu`A=TkfPmVPzcC?1VmcR9ZBp* z3B1|nRw!irhU;MPRj)iPic_*LJTRU_*OFsM4*wx#s{f2gQ9EO{>r4TG4;b~-Dz3Qt zl3hV@GS$(MniPYY;mE_}_;~VRWLR@!Nb>uop{idn+wEqdnP-H~PJ!W@fecF-tkh{N zyWRE3FH-8gV+I`zW7iu4ybv(y6tgG9Y1vz2pCHkyU)I8*B#F0`k(QREOywJaaX1)3 z!<&RaKrrzdC~dmEI?{Rw2B;nC0I(2%1oYwUkf^fQkRK@kcZGwhyP-;VNO2cWhI`cL zwYpJy6w+(E5SeQt(VK(ZOUC}cK}-6WtRFX8_-Fgm>Ar(642Mw~-yZ%@Nv0jn;ocD& zetjf|dozyJR_Y{mow`r`rHm+LWkz|CZly2LTdKFzDfPSRC(WtmA2h7yyyj!=p!Sx| zr8}zE=!f;|28AJSxNbadESp%<gz3I%n+Y+q%$v+F<_`1Q=3gzdmRsyTj^%!`2CW6_ ldFy5C6WfY?!d`XEI5wPCr|i7fl4<#fuKfh0OIw*6=s*APN^1ZB diff --git a/plugins/Morpheus/fonts/piwik.ttf b/plugins/Morpheus/fonts/piwik.ttf old mode 100644 new mode 100755 index c81d69e10c28ed59c451ad46f2579a98e269dbb9..7887145303ba8702d9a7b59d1bfc9467cc7990bf GIT binary patch delta 5830 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 Hp1}VB3~7sf delta 1470 zcmZ`(YiJx*6h3z+`^Y|KcXnr=nMrmx$!vDp>^l3Ju6a$MmW17G)0hW@fZ3!;6Ubv@ zOHCx06-tr*&^D8bKZ3MS&=#$Q^@oDsY72^1P^nTRptSl!uxO#y_+uyD$u=Yva))!y zoX5vG_nvd_nM>&1r4>K`V1NP;@XXQYBT=)Jn8ub*FpZAS=JKAw+ur~n2J8JNawqdx zTClE2-HDl{$??_CWUMa&2%}RIx#OC5Uj7K+&|U0LPGN)g^C}}i3S*#QYWCEkAIN)H zk7LZinfdX~+&#m?F9Dt%#Q|^4<`(lX1e;jL1m3ya?8I-2OE&>pTo^EypFepD7m8Qw zYl<HT;@=CU4s>J{rO}aM1}&-W8i1`*6%Zv{rynBF23>GWI-lfLq7FN)srPe<crupo zYwWZm7ELDNTs?1dI-&xfj7N~R83}5eooG}OqKD%=<$}Uhg>s=cpYK&|bGeX6rxOY( zHig8Zi8Gl@MNuvwo<#Qd*5n`LPYH1s@8Js4jhL}TE>)0;v{-@m=H*fmV>yiWuIrYO zYgFDmvkp-8)ILHGSN71BKu*D~4H!^;B4!iR_Qw6oEQ_dAD3uDM59crZSwOG_(&ZRK ziy{)m0{(EVqoRCC#H)B!w``$yGtv-(4j7O&*hWN2KeK)*RO|PKx&^OS=nn13*6D0> zb9TCQM@kd54fS8`jZh*7_l78;ARYCbb84U3UJMSy08GM5c$1AQHeTb8ATEwu60JiH zS{vXUv>9pq0iKI@pk&nP+wtr~I(Ixfk%-5Qw&70mxa|b)`~C-IBb!KxBr6<|BroA# z5}TUH^2q;uyDrp8GhT+?X82%Pv4W`Z=k~((b!-7ctGqPB(B)rfrubt`JK@H2YXmoN z5Cai<U>Hv0yLk~0zcg7lT%%6J!>W2esbUd{ScE6o7frUIBo_!s3%**FN|b)DI~;nY zQ5@p=L6M7e^rg_{)G;JR9tc_apB^FRqO2~XCCD;Cvx!)da^9BIfe=5?-q6rKz=!mi z=>1e*U+R7|qrcWI1Oh_09AK?3mzAw%D7LAIrI>2Kcd!Hw;<S|U`Kq2IuN%?rpEcyB zD3{3`WZ0m^s2W?~hr~uDdI9H?zfcmQ6wdfKE6mLa+49#c<#to7p0TjOAZuatAgz0^ z79aSQ4R}fsbP!uaC(satB(z8)VP0!<q5x8X^hP+Oy%R1U46E))ABUTD=+%l+%!Eyb z1Ik;6DfWJs{RMOD-(bKakJop%YLxfwiQIlYZc2ZoBPcB~nGaA&x}8~;)_UA4wZx0W z6=H+<OC42<>a6;lrdG46d8|FJYuCN4dsN+C{jHwXpVfb8=rUY4dX2|TdQ--<PO8W} zdBr?qE?H<xzh%R+NrkB~>UHWTYlHPo>#w#k+jaVoowk4P2ssuVXB}&fN6uweze{$H ZxNmtJ9?^5RCR=kuqZAM6;&ApF`VV~EXF~u0 diff --git a/plugins/Morpheus/images/logo.svg b/plugins/Morpheus/images/logo.svg index d288e2072e..8c0be81ce9 100644 --- a/plugins/Morpheus/images/logo.svg +++ b/plugins/Morpheus/images/logo.svg @@ -3,22 +3,22 @@ <svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="170.666px" height="45.704px" viewBox="0 0 170.666 45.704" enable-background="new 0 0 170.666 45.704" xml:space="preserve"> -<path fill="#D42A1F" d="M106.995,1.016c-2.57-0.739-5.251,0.751-5.987,3.329l-5.532,19.351L89.943,4.345 +<path fill="#d4291f" d="M106.995,1.016c-2.57-0.739-5.251,0.751-5.987,3.329l-5.532,19.351L89.943,4.345 c-0.592-2.071-2.441-3.417-4.477-3.492c-0.103-0.009-0.203-0.004-0.306-0.007c-0.102,0.003-0.203-0.003-0.306,0.007 c-2.036,0.075-3.885,1.421-4.477,3.492l-5.509,19.27l-5.509-19.27c-0.737-2.578-3.418-4.068-5.987-3.329 c-2.57,0.739-4.056,3.428-3.319,6.005l10.075,35.24c0.583,2.038,2.384,3.376,4.382,3.49c0.121,0.011,0.239,0.006,0.359,0.008 c0.12-0.002,0.238,0.004,0.359-0.008c1.998-0.114,3.799-1.451,4.382-3.49l5.551-19.416l5.551,19.416 c0.588,2.056,2.416,3.398,4.434,3.491c0.111,0.01,0.219,0.005,0.33,0.007c0.11-0.003,0.219,0.003,0.33-0.007 c2.019-0.093,3.846-1.435,4.434-3.491l10.075-35.24C111.05,4.444,109.564,1.756,106.995,1.016z"/> -<path fill="#D42A1F" d="M116.502,40.44c0,2.972,2.35,5.322,5.322,5.322c2.972,0,5.322-2.35,5.322-5.322V6.147 +<path fill="#d4291f" d="M116.502,40.44c0,2.972,2.35,5.322,5.322,5.322c2.972,0,5.322-2.35,5.322-5.322V6.147 c0-2.972-2.35-5.322-5.322-5.322c-2.972,0-5.322,2.35-5.322,5.322V40.44z"/> -<path fill="#D42A1F" d="M43.334,40.457c0,2.972,2.35,5.322,5.322,5.322c2.972,0,5.322-2.35,5.322-5.322V6.164 +<path fill="#d4291f" d="M43.334,40.457c0,2.972,2.35,5.322,5.322,5.322c2.972,0,5.322-2.35,5.322-5.322V6.164 c0-2.972-2.35-5.322-5.322-5.322c-2.972,0-5.322,2.35-5.322,5.322V40.457z"/> -<path fill="#D42A1F" d="M155.406,23.156l13.779-13.779c1.974-1.974,1.974-5.097,0-7.071c-1.974-1.974-5.097-1.974-7.071,0 +<path fill="#d4291f" d="M155.406,23.156l13.779-13.779c1.974-1.974,1.974-5.097,0-7.071c-1.974-1.974-5.097-1.974-7.071,0 l-16.448,16.448V6.147c0-2.972-2.35-5.322-5.322-5.322c-2.972,0-5.322,2.35-5.322,5.322V40.44c0,2.972,2.35,5.322,5.322,5.322 c2.972,0,5.322-2.35,5.322-5.322v-7.544l2.669-2.669l13.618,13.857c1.957,1.992,5.079,2.019,7.071,0.062 c1.992-1.957,2.019-5.079,0.062-7.071L155.406,23.156z"/> -<path fill="#D42A1F" d="M37.292,16.816c0-8.58-6.787-15.557-15.283-15.9l0.007-0.033H5.322C2.35,0.883,0,3.233,0,6.205v34.177 +<path fill="#d4291f" d="M37.292,16.816c0-8.58-6.787-15.557-15.283-15.9l0.007-0.033H5.322C2.35,0.883,0,3.233,0,6.205v34.177 c0,2.972,2.35,5.322,5.322,5.322c2.972,0,5.322-2.35,5.322-5.322v-7.63h11.371l-0.007-0.036 C30.505,32.372,37.292,25.396,37.292,16.816z M20.296,23.284l0-0.002h-9.651V10.491h9.464c3.535,0,6.401,2.866,6.401,6.401 C26.51,20.364,23.744,23.184,20.296,23.284z"/> diff --git a/plugins/Morpheus/images/signout.png b/plugins/Morpheus/images/signout.png new file mode 100644 index 0000000000000000000000000000000000000000..2d377ddf984d5b85c735cccb8c4a022da40df07e GIT binary patch literal 345 zcmV-f0jB<mP)<h;3K|Lk000e1NJLTq000jF000dL0ssI2`Fx`m0003XNkl<ZD3O(t zv5JF05QaxxFk4G1h3zzzsl<RFHa>w^2)=+RECnAy$!iF9*1khX5s0PO*$Ng)h<L>w zix<LiH_hzM|NZk9yPR#?@aICbNs?q)7D5OBZns<4bpU`do~CI_^8gTrVNn#0<Cvyt znx>*C0B|@Qs;bg;{m1UzZWjc>`Fw8Mb}NXYh%wIdJV}!K{r<gMRn>W(-%wW6z!DJ0 zaqGI$%jI%04CAALCh%K9lBC}g_>b~OgX_9zJ1Wak(=>YC@AvE}uGedtrqAaSjpK+h z76f5gmb$L%x~9bOc%(E#0f2AYw(t8WiU=XHEX%TtF=lC76aWN5$m8)iolbEa`@Zja r-Y^VJ)4X0Ugiw}c3<Uu0U;pF_H^_30xS+U-00000NkvXXu0mjfm9U%# literal 0 HcmV?d00001 diff --git a/plugins/Morpheus/javascripts/piwikHelper.js b/plugins/Morpheus/javascripts/piwikHelper.js index 163ea90160..f833b9e15f 100644 --- a/plugins/Morpheus/javascripts/piwikHelper.js +++ b/plugins/Morpheus/javascripts/piwikHelper.js @@ -125,12 +125,28 @@ var piwikHelper = { compileAngularComponents: function (selector) { var $element = $(selector); + if (!$element.length) { + return; + } + angular.element(document).injector().invoke(function($compile) { var scope = angular.element($element).scope(); $compile($element)(scope); }); }, + /** + * Detection works currently only for directives defining an isolated scope. Functionality might need to be + * extended if needed. Under circumstances you might call this method before calling compileAngularComponents() + * to avoid compiling the same element twice. + * @param selector + */ + isAlreadyCompiledAngularComponent: function (selector) { + var $element = $(selector); + + return ($element.length && $element.hasClass('ng-isolate-scope')); + }, + /** * Displays a Modal dialog. Text will be taken from the DOM node domSelector. * Given callback handles will be mapped to the buttons having a role attriute diff --git a/plugins/Morpheus/stylesheets/base/colors.less b/plugins/Morpheus/stylesheets/base/colors.less index 21ac03438d..89ec7ff92d 100644 --- a/plugins/Morpheus/stylesheets/base/colors.less +++ b/plugins/Morpheus/stylesheets/base/colors.less @@ -42,4 +42,3 @@ Qualitative data color series inspired from colorbrewer2.org/ next ones could be: #cab2d6 #ffff99 # #b2df8a */ - diff --git a/plugins/Morpheus/stylesheets/base/icons.css b/plugins/Morpheus/stylesheets/base/icons.css index 3424d8a655..d11c5592e3 100644 --- a/plugins/Morpheus/stylesheets/base/icons.css +++ b/plugins/Morpheus/stylesheets/base/icons.css @@ -26,27 +26,15 @@ .icon-alien:before { content: "\e600"; } -.icon-add:before { - content: "\e630"; -} .icon-annotation:before { content: "\e601"; } -.icon-arrow-bottom:before { - content: "\e63b"; -} -.icon-arrow-collapsed:before { - content: "\e60b"; -} .icon-arrow-left:before { content: "\e602"; } .icon-arrow-right:before { content: "\e603"; } -.icon-arrow-top:before { - content: "\e63a"; -} .icon-business:before { content: "\e604"; } @@ -56,24 +44,30 @@ .icon-chart-bar:before { content: "\e606"; } -.icon-chart-line:before { - content: "\e608"; -} .icon-chart-line-details:before { content: "\e607"; } +.icon-chart-line:before { + content: "\e608"; +} .icon-chart-pie:before { content: "\e609"; } .icon-close:before { content: "\e60a"; } -.icon-code:before { - content: "\e620"; +.icon-arrow-collapsed:before { + content: "\e60b"; } .icon-configure:before { content: "\e60c"; } +.icon-datepicker-arr-l:before { + content: "\e60d"; +} +.icon-datepicker-arr-r:before { + content: "\e60e"; +} .icon-delete:before { content: "\e60f"; } @@ -92,9 +86,6 @@ .icon-ecommerce-order:before { content: "\e614"; } -.icon-edit:before { - content: "\e622"; -} .icon-email:before { content: "\e615"; } @@ -110,26 +101,32 @@ .icon-finance:before { content: "\e619"; } -.icon-folder:before { - content: "\e61b"; -} .icon-folder-charts:before { content: "\e61a"; } +.icon-folder:before { + content: "\e61b"; +} .icon-fullscreen:before { content: "\e61c"; } .icon-goal:before { content: "\e61d"; } +.icon-help-alt:before { + content: "\e61e"; +} .icon-help:before { content: "\e61f"; } -.icon-help-alt:before { - content: "\e61e"; +.icon-code:before { + content: "\e620"; } -.icon-hide:before { - content: "\e638"; +.icon-warning:before { + content: "\e621"; +} +.icon-edit:before { + content: "\e622"; } .icon-image:before { content: "\e623"; @@ -140,13 +137,13 @@ .icon-insights:before { content: "\e625"; } -.icon-locked:before { - content: "\e627"; -} .icon-locked-2:before { content: "\e626"; } .icon-locked-3:before { + content: "\e627"; +} +.icon-locked:before { content: "\e628"; } .icon-locked-4:before { @@ -170,12 +167,12 @@ .icon-open-source:before { content: "\e62f"; } -.icon-play:before { - content: "\e643"; -} .icon-plus:before { content: "\e630"; } +.icon-add:before { + content: "\e630"; +} .icon-puzzle:before { content: "\e631"; } @@ -191,48 +188,115 @@ .icon-segment:before { content: "\e635"; } -.icon-server:before { - content: "\e637"; +.icon-users:before { + content: "\e635"; } .icon-server-alt:before { content: "\e636"; } +.icon-server:before { + content: "\e637"; +} +.icon-hide:before { + content: "\e638"; +} .icon-show:before { content: "\e639"; } +.icon-arrow-top:before { + content: "\e63a"; +} +.icon-arrow-bottom:before { + content: "\e63b"; +} .icon-star:before { content: "\e63c"; } .icon-success:before { content: "\e63d"; } -.icon-table:before { - content: "\e63f"; -} .icon-table-more:before { content: "\e63e"; } +.icon-table:before { + content: "\e63f"; +} .icon-tag-cloud:before { content: "\e640"; } -.icon-user:before { - content: "\e642"; -} .icon-user-add:before { content: "\e641"; } -.icon-users:before { - content: "\e635"; +.icon-user:before { + content: "\e642"; +} +.icon-play:before { + content: "\e643"; } .icon-visitor-profile:before { content: "\e644"; } -.icon-warning:before { - content: "\e621"; -} .icon-zoom-in:before { content: "\e645"; } .icon-zoom-out:before { content: "\e646"; } +.icon-sign-out:before { + content: "\e647"; +} +.icon-sign-in:before { + content: "\e648"; +} +.icon-menu-hamburger:before { + content: "\e649"; +} +.icon-more-horiz:before { + content: "\e64a"; +} +.icon-more-verti:before { + content: "\e64b"; +} +.icon-admin-administration:before { + content: "\e64c"; +} +.icon-admin-development:before { + content: "\e64d"; +} +.icon-admin-diagnostic:before { + content: "\e64e"; +} +.icon-admin-platform:before { + content: "\e64f"; +} +.icon-admin-settings:before { + content: "\e650"; +} +.icon-reporting-actions:before { + content: "\e651"; +} +.icon-reporting-dashboard:before { + content: "\e652"; +} +.icon-reporting-ecommerce:before { + content: "\e653"; +} +.icon-reporting-goal:before { + content: "\e654"; +} +.icon-reporting-referer:before { + content: "\e655"; +} +.icon-reporting-visitors:before { + content: "\e656"; +} +.icon-user-manage:before { + content: "\e657"; +} +.icon-user-personal:before { + content: "\e658"; +} +.icon-user-platform:before { + content: "\e659"; +} + diff --git a/plugins/Morpheus/stylesheets/base/mixins.less b/plugins/Morpheus/stylesheets/base/mixins.less index 88ac7d0c4d..f772e6f2aa 100644 --- a/plugins/Morpheus/stylesheets/base/mixins.less +++ b/plugins/Morpheus/stylesheets/base/mixins.less @@ -3,7 +3,7 @@ &:after { content: ""; display: table; - clear: both; + clear: right; } &:before { content: ""; diff --git a/plugins/Morpheus/stylesheets/general/_admin.less b/plugins/Morpheus/stylesheets/general/_admin.less index 1f81d7797f..c0f34c5e2d 100644 --- a/plugins/Morpheus/stylesheets/general/_admin.less +++ b/plugins/Morpheus/stylesheets/general/_admin.less @@ -1,39 +1,3 @@ -.Menu--admin { - .Menu-tabList { - .border-radius(0px); - border-color: @theme-color-background-lowContrast; - background-image: none; - padding-left: 0; - border-top: 0; - > li:first-child span { - border-bottom: 3px solid @theme-color-brand; - } - > li { - padding-bottom: 0px; - > span { - color: @theme-color-text; - .font-default(18px, 26px); - border-top: 1px solid @theme-color-background-lowContrast; - border-bottom: 1px solid @theme-color-background-lowContrast; - padding: 12px 15px; - } - ul { - background-color: @theme-color-menu-contrast-background; - - li { - a { - color: @theme-color-text-lighter !important; - padding: 0.8em 1.1em; - &:hover { - color: @theme-color-text; - text-decoration: none; - } - } - } - } - } - } -} .ui-state-highlight { border-color: @color-silver-l80 !important; @@ -52,26 +16,12 @@ cursor: pointer; min-height: 30px; } - - .sites_autocomplete { - position: static !important; - } } .sites_autocomplete { vertical-align: middle; } -#loadingError { - color: @theme-color-brand; - font-weight: normal; -} - -.sites_autocomplete .custom_select .custom_select_block .custom_select_container .custom_select_ul_list { - margin-top: 5px; - padding-bottom: 0; -} - .adminTable a { color: @theme-color-link; } diff --git a/plugins/Morpheus/stylesheets/general/_forms.less b/plugins/Morpheus/stylesheets/general/_forms.less index 49c5358f1d..dcbe261807 100644 --- a/plugins/Morpheus/stylesheets/general/_forms.less +++ b/plugins/Morpheus/stylesheets/general/_forms.less @@ -139,6 +139,7 @@ select { } .top_bar_sites_selector { + z-index: 143; .sites_autocomplete .custom_select { z-index: 139; } @@ -148,30 +149,6 @@ select { input { min-height: 0; } - .custom_select { - border-color: @theme-color-background-lowContrast; - .border-radius(0px); - background: @theme-color-background-base; - padding: 0; - color: @theme-color-text; - text-transform: uppercase; - .font-default(10px, 12px); - min-height: 30px; - .box-sizing(border-box); - a { - color: @theme-color-text; - &:hover { - text-decoration: none; - } - } - .custom_select_block { - .custom_select_container { - .custom_select_ul_list { - margin-top: 20px; - } - } - } - } } .ajaxError { @@ -184,19 +161,6 @@ select { font-weight: normal; } -.sites_autocomplete--dropdown { - .custom_select_main_link:not(.loading):before { - color: @theme-color-brand; - font-size: 0.7em; - top: 4px; - right: 10px; - content: ''; - border-left: 4px solid transparent; - border-right: 4px solid transparent; - border-top: 5px solid @theme-color-brand; - } -} - .limitSelection { > ul { position: relative; diff --git a/plugins/Morpheus/stylesheets/ieonly.css b/plugins/Morpheus/stylesheets/ieonly.css index 234631ce71..45523c856a 100644 --- a/plugins/Morpheus/stylesheets/ieonly.css +++ b/plugins/Morpheus/stylesheets/ieonly.css @@ -11,14 +11,10 @@ overflow: hidden; } -#topBars { +#topLeftBar { z-index: 300!important; } -.sites_autocomplete, .sites_autocomplete .custom_select { - z-index: 200!important; -} - .submit { height: 30px; } diff --git a/plugins/Morpheus/stylesheets/main.less b/plugins/Morpheus/stylesheets/main.less index 699fb1d159..d1ffac5d52 100644 --- a/plugins/Morpheus/stylesheets/main.less +++ b/plugins/Morpheus/stylesheets/main.less @@ -72,110 +72,6 @@ table.entityTable tr td a:hover { #root { margin: 0 0 100px 0; padding: 0; - - #header { - margin: 0 15px; - #topBars { - a { - color: @theme-color-link; - text-decoration: none; - } - } - - .topBarElem { - padding: 0 3px; - color: @theme-color-text-lighter; - strong { - font-weight: normal; - color: @theme-color-text; - } - } - } - - .top_bar_sites_selector { - margin-right: 10px; - label { - padding-top: 9px; - .font-default(13px, 15px); - } - } - - .Menu--dashboard { - border-top: 1px solid @theme-color-background-lowContrast; - border-bottom: 0px; - > .Menu-tabList { - margin: 0; - a { - .font-default(18px, 22px); - padding: 14px 28px 11px; - } - > li { - .border-radius(0px); - border: 0; - background: none; - border-right: 1px solid @theme-color-background-lowContrast; - margin-bottom: -1px; - border-bottom: 0px; - - > ul { - li { - a { - color: @theme-color-menu-contrast-text; - .font-default(15px, 18px); - padding: 14px 22px 11px; - } - - &:hover, - &.sfHover { - a { - color: @theme-color-menu-contrast-textActive; - font-weight: normal; - } - - } - } - } - - &.sfActive { - > a { - color: @theme-color-text; - text-decoration: none; - position: relative; - &:after { - content: ''; - position: absolute; - bottom: -3px; - left: 0; - width: 100%; - height: 4px; - background: @theme-color-brand; - } - } - - } - - &.sfHover { - > a { - border: 0; - text-decoration: none; - color: @theme-color-text; - } - } - } - } - } - - .nav_sep { - background: @theme-color-menu-contrast-background; - min-height: 57px; - .border-radius(0px); - border-color: @theme-color-background-lowContrast !important; - border-top: 0px !important; - border-right: 0px !important; - border-left: 0px !important; - box-shadow: inset 0 2px 4px #d8d8d8; - } - .widgetize { width: auto; } @@ -186,9 +82,7 @@ table.entityTable tr td a:hover { border: 1px solid @theme-color-background-lowContrast; background: @theme-color-background-base; z-index: 10; - padding: 8px 10px 8px 10px; .border-radius(0px); - .font-default(10px, 12px); > span { position: relative; background: none; @@ -197,15 +91,16 @@ table.entityTable tr td a:hover { content: ''; border-left: 4px solid transparent; border-right: 4px solid transparent; - border-top: 5px solid @theme-color-brand; + border-top: 5px solid @color-silver-l20; position: absolute; top: 3px; - right: 0; + right: 7px; } } ul.submenu { margin-left: 0; + padding-right: 0; li { list-style-type: none; > div { @@ -236,24 +131,15 @@ table.entityTable tr td a:hover { .segmentEditorPanel { border: 1px solid @theme-color-background-lowContrast; background: @theme-color-background-base; - padding: 8px 10px 8px 10px; .border-radius(0px); - .segmentationTitle { - background: url(plugins/Morpheus/images/segment-users.png) no-repeat right 0; - text-transform: uppercase; - .font-default(10px, 12px); - position: relative; - } .dropdown-body { background:@theme-color-background-base; - padding:0 10px; + padding: 8px 19px 0; .border-radius(0px); - border: 1px solid @color-silver-l80; border-top-width: 0px; } &:hover .dropdown-body { background:@theme-color-background-base; - border-color: @color-silver-l80; } .segmentationContainer { > span > strong { @@ -299,32 +185,37 @@ table.entityTable tr td a:hover { /* Iframed Embed dashboard style */ #standalone { - #Dashboard:hover ul { - background: #f1f0eb; - border-color: #a9a399; - } - #Dashboard { - ul { + position: relative; - background: @theme-color-background-base; - border: 1px solid @color-silver-l80; - padding: 8px 10px 8px 10px; + &:hover ul { + background-color: @theme-color-background-base; + } + ul { + padding: 0 19px; color: @theme-color-text-light; - height: 30px; + min-height: 33px; line-height:0.5em; .border-radius(0px); + border: 0; + background-color: @theme-color-background-base; + } + > ul > li { + white-space: nowrap; + margin-right: 0px; + a { + padding-left: 0; + } + &.sfActive { + a { + color: @theme-color-menu-contrast-textActive; + } + } } > ul > li:hover, - > ul > li:hover a, - > ul > li.sfHover, - > ul > li.sfHover a { + > ul > li:hover a { color: @theme-color-brand; } - > ul > li.sfHover, - > ul > li.sfHover a { - font-weight: normal; - } } } @@ -865,7 +756,7 @@ div.sparkline { #piwik-promo-share { border: 0px; - background: #f2f2f2; + background: @theme-color-background-tinyContrast; .font-default(10px, 16px); } @@ -877,15 +768,11 @@ tr:hover #token_auth { background: #FFFFF7; } -// previous style overrides -#header_message a { +#header_message .dropdown a, +#header_message #updateCheckLinkContainer:hover { text-decoration: underline; } -#header_message a:hover { - text-decoration: none; -} - #multisites table.dataTable { tfoot tr:hover td { background: @theme-color-background-base; diff --git a/plugins/Morpheus/stylesheets/theme.less b/plugins/Morpheus/stylesheets/theme.less index 371b501830..97eb216d2f 100644 --- a/plugins/Morpheus/stylesheets/theme.less +++ b/plugins/Morpheus/stylesheets/theme.less @@ -12,8 +12,8 @@ @theme-color-link: @color-blue-piwik; @theme-color-base-series: #ee3024; -@theme-color-menu-contrast-text: @theme-color-text-lighter; -@theme-color-menu-contrast-textActive: @theme-color-text; +@theme-color-menu-contrast-text: @theme-color-text; +@theme-color-menu-contrast-textActive: @theme-color-brand; @theme-color-menu-contrast-background: @theme-color-background-tinyContrast; @theme-color-widget-title-text: @theme-color-text; diff --git a/plugins/Morpheus/stylesheets/ui/_components.less b/plugins/Morpheus/stylesheets/ui/_components.less index e9e9b8bc46..630fda6fa6 100644 --- a/plugins/Morpheus/stylesheets/ui/_components.less +++ b/plugins/Morpheus/stylesheets/ui/_components.less @@ -45,20 +45,15 @@ .segment-element { background: @color-white; border-color: @color-silver-l80; + line-height: 1.33; .segment-add-row { .border-radius(5px); } - .segment-nav { - h4.visits { - background: url('plugins/Morpheus/images/segment-users.png') no-repeat 3px 0px; - } - } - .custom_select_search { input { - margin-top: -10px; + margin-top: 1px; } } @@ -96,13 +91,13 @@ li { padding: 3px 0; &:hover { - background: #f2f2f2; + background: @theme-color-background-tinyContrast; border: 0; padding: 4px 0 3px; a { border: 0; - background-color: #f2f2f2; + background-color: @theme-color-background-tinyContrast; padding-right: 15px; } @@ -129,11 +124,13 @@ } a.dropdown { + display: inline; color: @theme-color-text; background: url('plugins/Morpheus/images/sort_subtable_desc.png') 100% -2px no-repeat; &.ui-autocomplete-input { background-position: 100% -2px; } + .font-default(10px, 12px); } } .segment-footer { @@ -155,25 +152,12 @@ } #periodString { - border: 1px solid @theme-color-background-lowContrast; - .border-radius(0px); - background: @theme-color-background-base; - &:hover { - background: @theme-color-background-base; - border-color: @color-silver-l80; - } - select { min-height: 0; background-position: 140%; padding-left: 5px; } - .calendar-icon { - width: 17px; - height: 17px; - } - label.selected-period-label { text-decoration: none !important; } @@ -191,34 +175,17 @@ } } } - - #date { - .border-radius(0px); - padding: 8px 10px; - color: @theme-color-text-lighter; - text-transform: uppercase; - .font-default(10px, 12px); - - strong { - color: @theme-color-text; - - } - } } #header_message { - border: 1px solid @theme-color-background-lowContrast; - padding: 8px 10px 8px 10px; height: auto; - background: @theme-color-background-base; .border-radius(0px); - .header_short { - .font-default(10px, 12px); - text-transform: uppercase; - } - .header_full { - .font-default(12px, 18px); + &.isPiwikDemo { + text-align: right; + position: absolute; + right: 0; + top: 8px; } } @@ -235,7 +202,7 @@ .loadingPiwikBelow, .loadingPiwik { - .font-default(10px, 12px); + .font-default(13px, 13px); color: @color-silver-l60; font-weight: normal; } @@ -256,7 +223,7 @@ .border-radius(6px); h2 { - background: #f2f2f2; + background: @theme-color-background-tinyContrast; border-bottom: 1px solid @color-gray; padding: 11px 15px 10px; } diff --git a/plugins/Morpheus/stylesheets/uibase/_header.less b/plugins/Morpheus/stylesheets/uibase/_header.less index b96b1b467a..25ba8be9ff 100644 --- a/plugins/Morpheus/stylesheets/uibase/_header.less +++ b/plugins/Morpheus/stylesheets/uibase/_header.less @@ -1,24 +1,14 @@ -#header { - min-height: 60px; -} - -/* Clear fix */ -#header:after { - display: table; - clear: both; - content: ""; -} #root { #logo { - padding: 5px 0 0; + padding: 9px 0 0 4px; float: left; } #logo { img.default-piwik-logo { width: 82px; - margin-top: 14px; + margin-top: 8px; } img { @@ -53,23 +43,3 @@ padding: 15px; clear: both; } - -#topBars { - right: 0px; - position: absolute; - padding-left: 110px; - color: #acacac; - margin: 4px 10px 8px; - font-size: 13px; - z-index: 140; -} - -#topRightBar { - margin-bottom: 4px; - float: right; -} - -.topBarElem { - padding: 0 5px; - display: inline-block; -} diff --git a/plugins/Morpheus/stylesheets/uibase/_headerMessage.less b/plugins/Morpheus/stylesheets/uibase/_headerMessage.less index 41cdc726b9..1922c721a8 100644 --- a/plugins/Morpheus/stylesheets/uibase/_headerMessage.less +++ b/plugins/Morpheus/stylesheets/uibase/_headerMessage.less @@ -2,15 +2,21 @@ #header_message { z-index: 0; cursor: default; - position: absolute; - right: 0px; + float: right; overflow: hidden; display: block; height: 20px; - line-height: 20px; - padding: 5px 8px 5px 38px; font-size: 14px; border-radius: 4px; + + &.update_available .title { + color: #CA8100; + font-weight: bold; + } + + .icon-warning { + padding-left: 2px; + } } #header_message:hover, @@ -44,24 +50,6 @@ line-height: 1.7em; } -/* Orange alerts box */ -.header_alert { - background: #FFFDF7 url(plugins/Morpheus/images/ico_alert.png) no-repeat 7px 4px; - border: 1px solid #FF7F00; - font-weight: bold; -} - -.header_alert, -.header_alert a { - color: #FF7F00; -} - -/* Blue info box */ -.header_info { - background: #FAFAFA url(plugins/Morpheus/images/ico_info.png) no-repeat 7px 4px; - border: 1px solid #CBD9EB; -} - .header_info, .header_info a { color: @theme-color-text-light; } diff --git a/plugins/Morpheus/stylesheets/uibase/_languageSelect.less b/plugins/Morpheus/stylesheets/uibase/_languageSelect.less index 032516350e..d0a0add9ce 100644 --- a/plugins/Morpheus/stylesheets/uibase/_languageSelect.less +++ b/plugins/Morpheus/stylesheets/uibase/_languageSelect.less @@ -4,4 +4,17 @@ .items { margin-left: -50px; } +} + +#topRightBar .navbar-right .languageSelection { + // make padding of language selection clickable + margin: -14px -12px; + + .title { + padding: 14px 12px; + &:after { + top: 19px; + right: -3px; + } + } } \ No newline at end of file diff --git a/plugins/Morpheus/stylesheets/uibase/_loading.less b/plugins/Morpheus/stylesheets/uibase/_loading.less index e68d0f0a69..e57e3d0a6d 100644 --- a/plugins/Morpheus/stylesheets/uibase/_loading.less +++ b/plugins/Morpheus/stylesheets/uibase/_loading.less @@ -9,17 +9,16 @@ } .loadingSegment { - color: grey; - font-size: 10pt; + color: @color-silver-l60; + font-size: 13px; margin-left: 28px; display:none; } #loadingError { - font-weight: bold; - font-size: 1.1em; - color: #F88D22; - padding: 0.5em; + font-size: 15px; + padding: 8px 0; display: none; - padding-top: 40px; + color: @theme-color-brand; + font-weight: normal; } \ No newline at end of file diff --git a/plugins/Morpheus/stylesheets/uibase/_periodSelect.less b/plugins/Morpheus/stylesheets/uibase/_periodSelect.less index 767a2a70a1..83c21f7999 100644 --- a/plugins/Morpheus/stylesheets/uibase/_periodSelect.less +++ b/plugins/Morpheus/stylesheets/uibase/_periodSelect.less @@ -3,8 +3,6 @@ color: @theme-color-text-light; font-size: 14px; border: 1px solid #e4e5e4; - padding: 5px 30px 6px 10px; - border-radius: 4px; float: left; margin-right: 10px; position: absolute; @@ -22,23 +20,12 @@ height: 15px; display:inline-block; position:absolute; - right:9px; - top:7px; + right: 19px; + top: 9px; background: url("plugins/Morpheus/images/icon-calendar.gif") no-repeat scroll; cursor:pointer; } -#periodString #date{ - cursor:pointer; - padding:5px 10px 6px 10px; - margin:-5px -10px -6px -10px; -} - -#periodString #date img { - vertical-align: middle; - margin: 0 0 0 6px; -} - #periodString strong { color: #255792; } @@ -49,8 +36,6 @@ } #periodMore { - padding: 6px 0 0 0; - display: none; overflow: hidden; } @@ -62,7 +47,7 @@ #periodString .period-type { float: left; - padding: 0 20px 0 0; + padding: 0; } #periodString .period-type label { diff --git a/plugins/Morpheus/templates/admin.twig b/plugins/Morpheus/templates/admin.twig index c51e3d378c..7ebadaad09 100644 --- a/plugins/Morpheus/templates/admin.twig +++ b/plugins/Morpheus/templates/admin.twig @@ -22,27 +22,37 @@ {{ ajax.requestErrorDiv(emailSuperUser|default('')) }} {{ postEvent("Template.beforeContent", "admin", currentModule) }} - <div id="container"> + <div class="page"> {% if showMenu is not defined or showMenu %} - {% include "@CoreAdminHome/_menu.twig" %} + {% import '@CoreHome/_menu.twig' as menu %} + {{ menu.menu(adminMenu, false, 'Menu--admin') }} {% endif %} - <div id="content" class="admin"> + <div class="pageWrap"> - {% include "@CoreHome/_headerMessage.twig" %} - {% include "@CoreHome/_notifications.twig" %} + <div class="top_controls"> + {% block topcontrols %} + {% endblock %} - <div class="ui-confirm" id="alert"> - <h2></h2> - <input role="no" type="button" value="{{ 'General_Ok'|translate }}"/> + {% include "@CoreHome/_headerMessage.twig" %} </div> - {% include "@CoreHome/_warningInvalidHost.twig" %} + <div class="admin" id="content"> + {% include "@CoreHome/_notifications.twig" %} + {% include "@CoreHome/_warningInvalidHost.twig" %} - {% block content %} - {% endblock %} + <div class="ui-confirm" id="alert"> + <h2></h2> + <input role="no" type="button" value="{{ 'General_Ok'|translate }}"/> + </div> + {% block content %} + {% endblock %} + + </div> </div> </div> + + {% endblock %} diff --git a/plugins/Morpheus/templates/dashboard.twig b/plugins/Morpheus/templates/dashboard.twig index 08230e0e9b..afccc7bd4c 100644 --- a/plugins/Morpheus/templates/dashboard.twig +++ b/plugins/Morpheus/templates/dashboard.twig @@ -23,10 +23,6 @@ {% include "@CoreHome/_warningInvalidHost.twig" %} {% include "@CoreHome/_topScreen.twig" %} - {% block notification %} - {% include "@CoreHome/_notifications.twig" %} - {% endblock %} - <div class="ui-confirm" id="alert"> <h2></h2> <input role="yes" type="button" value="{{ 'General_Ok'|translate }}"/> @@ -34,6 +30,31 @@ {{ postEvent("Template.beforeContent", "dashboard", currentModule) }} - {% block content %} - {% endblock %} + <div class="page"> + + {% if (menu is defined and menu) %} + {% import '@CoreHome/_menu.twig' as menuMacro %} + {{ menuMacro.menu(menu, true, 'Menu--dashboard') }} + {% endif %} + + <div class="pageWrap"> + + <a name="main"></a> + + <div class="top_controls"> + {% block topcontrols %} + {% endblock %} + </div> + + {% block notification %} + {% include "@CoreHome/_notifications.twig" %} + {% endblock %} + + {% block content %} + {% endblock %} + + <div class="clear"></div> + </div> + + </div> {% endblock %} diff --git a/plugins/Morpheus/templates/demo.twig b/plugins/Morpheus/templates/demo.twig index 0995add8c3..51cdc9e86f 100644 --- a/plugins/Morpheus/templates/demo.twig +++ b/plugins/Morpheus/templates/demo.twig @@ -497,6 +497,9 @@ 'show', 'hide', 'search', + 'menu-hamburger', + 'more-horiz', + 'more-verti' ], 'Window-Widget': [ 'minimise', @@ -570,6 +573,8 @@ 'server-alt', 'tag-cloud', 'play', + 'sign-in', + 'sign-out' ], }; diff --git a/plugins/Morpheus/templates/user.twig b/plugins/Morpheus/templates/user.twig index 416f12e116..d69823db39 100644 --- a/plugins/Morpheus/templates/user.twig +++ b/plugins/Morpheus/templates/user.twig @@ -6,7 +6,7 @@ {% block body %} {% if userIsAnonymous %} - {% set topMenuModule = 'Feedback' %} + {% set topMenuModule = 'ScheduledReports' %} {% set topMenuAction = 'index' %} {% else %} {% if currentModule != 'Feedback' %} @@ -24,24 +24,33 @@ {{ ajax.requestErrorDiv(emailSuperUser|default('')) }} {{ postEvent("Template.beforeContent", "user", currentModule) }} - <div id="container"> + <div class="page"> {% if showMenu is not defined or showMenu %} - {% include "@CoreHome/_userMenu.twig" %} + {% import '@CoreHome/_menu.twig' as menu %} + {{ menu.menu(userMenu, false, 'Menu--admin') }} {% endif %} - <div id="content" class="admin user"> + <div class="pageWrap"> - {% include "@CoreHome/_notifications.twig" %} - - <div class="ui-confirm" id="alert"> - <h2></h2> - <input role="no" type="button" value="{{ 'General_Ok'|translate }}"/> + <div class="top_controls"> + {% block topcontrols %} + {% endblock %} </div> - {% block content %} - {% endblock %} + <div id="content" class="admin user"> + + {% include "@CoreHome/_notifications.twig" %} + + <div class="ui-confirm" id="alert"> + <h2></h2> + <input role="no" type="button" value="{{ 'General_Ok'|translate }}"/> + </div> + {% block content %} + {% endblock %} + + </div> </div> </div> {% endblock %} diff --git a/plugins/MultiSites/angularjs/dashboard/dashboard.directive.less b/plugins/MultiSites/angularjs/dashboard/dashboard.directive.less index 99683c088f..a200b3d626 100644 --- a/plugins/MultiSites/angularjs/dashboard/dashboard.directive.less +++ b/plugins/MultiSites/angularjs/dashboard/dashboard.directive.less @@ -3,6 +3,12 @@ font-size: 15px; } +.widget { + #multisites { + padding: 15px; + } +} + #multisites { border: 0; padding: 0 15px; @@ -10,6 +16,7 @@ h2 { border-bottom: 0px; + font-size: 24px; } .notification-error { @@ -79,10 +86,6 @@ } } - .top_controls { - height: 10px; - } - th:first-child { text-align:left; } diff --git a/plugins/MultiSites/templates/getSitesInfo.twig b/plugins/MultiSites/templates/getSitesInfo.twig index d1bdb81df0..cca348dfec 100644 --- a/plugins/MultiSites/templates/getSitesInfo.twig +++ b/plugins/MultiSites/templates/getSitesInfo.twig @@ -1,14 +1,17 @@ {% extends isWidgetized ? 'empty.twig' : 'dashboard.twig' %} +{% block topcontrols %} + {% if not isWidgetized %} + <div class="top_controls"> + {% include "@CoreHome/_periodSelect.twig" %} + {% include "@CoreHome/_headerMessage.twig" %} + </div> + {% endif %} +{% endblock %} + {% block content %} -{% if not isWidgetized %} - <div class="top_controls"> - {% include "@CoreHome/_periodSelect.twig" %} - {% include "@CoreHome/_headerMessage.twig" %} - </div> -{% endif %} +<div class="container" id="multisites"> -<div class="pageWrap container" id="multisites"> <div id="main"> <div piwik-multisites-dashboard display-revenue-column="{% if displayRevenueColumn %}true{% else %}false{%endif%}" diff --git a/plugins/Overlay/stylesheets/overlay.css b/plugins/Overlay/stylesheets/overlay.css index d3db1a5126..4e30660775 100644 --- a/plugins/Overlay/stylesheets/overlay.css +++ b/plugins/Overlay/stylesheets/overlay.css @@ -23,7 +23,7 @@ a#overlayTitle { font-size: 12px; text-decoration: none; color: #4d4d4d; - margin-left: 15px; + margin-left: 10px; } a#overlayTitle .icon-help { margin-left: 4px; @@ -146,10 +146,16 @@ body .ui-tooltip.overlayTooltip { font-weight: bold; } -#topBars { +.navbar .navbar-right { + display: none; +} + +.top_controls { display: none; } .overlay-sidebar-container { width: 220px; + margin-left: -16px; + margin-top: 10px; } diff --git a/plugins/ScheduledReports/templates/index.twig b/plugins/ScheduledReports/templates/index.twig index 65ba2ba53a..542fab8e70 100644 --- a/plugins/ScheduledReports/templates/index.twig +++ b/plugins/ScheduledReports/templates/index.twig @@ -1,19 +1,17 @@ {% extends 'user.twig' %} - {% set title %}{{ 'ScheduledReports_PersonalEmailReports'|translate }}{% endset %} +{% block topcontrols %} + {% include "@CoreHome/_siteSelectHeader.twig" %} + {% include "@CoreHome/_periodSelect.twig" %} +{% endblock %} + {% block content %} <div class="emailReports"> <h2 piwik-enriched-headline help-url="http://piwik.org/docs/email-reports/">{{ title }}</h2> - {% include "@CoreHome/_siteSelectHeader.twig" %} - - <div class="top_controls"> - {% include "@CoreHome/_periodSelect.twig" %} - </div> - <span id="reportSentSuccess"></span> <span id="reportUpdatedSuccess"></span> diff --git a/plugins/SegmentEditor/SegmentSelectorControl.php b/plugins/SegmentEditor/SegmentSelectorControl.php index 4e88d2191f..e37354e1cd 100644 --- a/plugins/SegmentEditor/SegmentSelectorControl.php +++ b/plugins/SegmentEditor/SegmentSelectorControl.php @@ -31,7 +31,7 @@ class SegmentSelectorControl extends UIControl $this->jsClass = "SegmentSelectorControl"; $this->cssIdentifier = "segmentEditorPanel"; - $this->cssClass = "piwikTopControl"; + $this->cssClass = "piwikTopControl borderedControl piwikSelector"; $this->idSite = $idSite ?: Common::getRequestVar('idSite', false, 'int'); diff --git a/plugins/SegmentEditor/javascripts/Segmentation.js b/plugins/SegmentEditor/javascripts/Segmentation.js index f8def3655c..ee1c4b532a 100644 --- a/plugins/SegmentEditor/javascripts/Segmentation.js +++ b/plugins/SegmentEditor/javascripts/Segmentation.js @@ -210,7 +210,7 @@ Segmentation = (function($) { if(!$.browser.mozilla) { checkSelected = encodeURIComponent(checkSelected); } - + if( checkSelected == self.currentSegmentStr){ injClass = 'class="segmentSelected"'; } @@ -258,7 +258,7 @@ Segmentation = (function($) { var closeAllOpenLists = function() { $(".segmentationContainer", self.target).each(function() { - if($(this).closest('.segmentEditorPanel').hasClass("visible")) + if($(this).closest('.segmentEditorPanel').hasClass("expanded")) $(this).trigger("click"); }); }; @@ -370,7 +370,7 @@ Segmentation = (function($) { var bindEvents = function () { self.target.on('click', '.segmentationContainer', function (e) { // hide all other modals connected with this widget - if (self.content.closest('.segmentEditorPanel').hasClass("visible")) { + if (self.content.closest('.segmentEditorPanel').hasClass("expanded")) { if ($(e.target).hasClass("jspDrag") === true || $(e.target).hasClass("segmentFilterContainer") === true || $(e.target).parents().hasClass("segmentFilterContainer") === true @@ -378,12 +378,12 @@ Segmentation = (function($) { e.stopPropagation(); } else { self.jscroll.destroy(); - self.target.closest('.segmentEditorPanel').removeClass('visible'); + self.target.closest('.segmentEditorPanel').removeClass('expanded'); } } else { // for each visible segmentationContainer -> trigger click event to close and kill scrollpane - very important ! closeAllOpenLists(); - self.target.closest('.segmentEditorPanel').addClass('visible'); + self.target.closest('.segmentEditorPanel').addClass('expanded'); self.target.find('.segmentFilter').val(self.translations['General_Search']).trigger('keyup'); self.jscroll = self.target.find(".segmentList").jScrollPane({ autoReinitialise: true, @@ -1250,7 +1250,7 @@ $(document).ready(function() { } if ($(e.target).closest('.segmentListContainer').length === 0 - && self.$element.hasClass("visible") + && self.$element.hasClass("expanded") ) { $(".segmentationContainer", self.$element).trigger("click"); } @@ -1258,8 +1258,6 @@ $(document).ready(function() { $('body').on('mouseup', this.onMouseUp); - // re-initialize top controls since the size of the control is not the same after it's - // initialized. initTopControls(); }; diff --git a/plugins/SegmentEditor/stylesheets/segmentation.less b/plugins/SegmentEditor/stylesheets/segmentation.less index 0109d11836..125a0c9f56 100644 --- a/plugins/SegmentEditor/stylesheets/segmentation.less +++ b/plugins/SegmentEditor/stylesheets/segmentation.less @@ -131,11 +131,6 @@ div.scrollable { padding: 0 0 8px 0; } -.segment-element .segment-nav h4.visits { - padding-left: 28px; - background: url(plugins/SegmentEditor/images/icon-users.png) 0 0 no-repeat; -} - .segment-element .segment-nav h4 a { color: #255792; text-decoration: none; @@ -403,7 +398,7 @@ div.scrollable { .segment-element .segment-footer { background: #eae8e3; - border-top: 1px solid #a9a399; + border-top: 1px solid @theme-color-background-tinyContrast; text-align: right; padding: 7px 10px; margin: 0 -4px -6px -4px; @@ -430,11 +425,14 @@ div.scrollable { z-index: 121; /* Should be bigger than 'Dashboard widget selector' (z-index: 120) */ background: #f7f7f7; border: 1px solid #e4e5e4; - padding: 5px 10px 6px 10px; margin-right: 10px; border-radius: 4px; color: @theme-color-text-light; font-size: 14px; + + .segmentListContainer { + line-height: 14px; + } } .top_controls .segmentEditorPanel { @@ -486,7 +484,6 @@ div.scrollable { .segmentationContainer ul.submenu { padding-top: 5px; display: none; - float: left; margin-bottom: 5px; } @@ -501,54 +498,53 @@ div.scrollable { height: 16px; } -.segmentEditorPanel.visible .segmentationContainer { - width: 200px; +.segmentEditorPanel.expanded .segmentationContainer { + width: 240px; border-bottom-left-radius: 0; border-bottom-right-radius: 0; } -.segmentEditorPanel.visible ul.submenu { - display: block; +.segmentEditorPanel.expanded ul.submenu { + display: inline-block; list-style: none; } .segmentFilterContainer { - margin-left: -10px; - margin-right: -10px; margin-bottom: 10px; + display: inline-block; } -.segmentEditorPanel.visible .segmentFilterContainer > input[type="text"] { - font-size: 13px; - width: 100%; +.segmentEditorPanel.expanded .segmentFilterContainer > input[type="text"] { + font-size: 11px; + width: 200px; padding: 0; - border: 1px solid #ccc; - border-width: 1px 0; + border: 1px solid #d0d0d0; + border-width: 1px; color: #999; - padding: 11px 32px 11px 12px; + padding: 7px 10px 7px 10px; } -.segmentEditorPanel.visible .segmentFilterContainer > span { +.segmentEditorPanel.expanded .segmentFilterContainer > span { position: absolute; width: 13px; height: 13px; - right: 12px; - top: 16px; + right: 23px; + top: 48px; cursor: pointer; } -.segmentEditorPanel.visible .segmentFilterContainer:hover > span { +.segmentEditorPanel.expanded .segmentFilterContainer:hover > span { background: url(plugins/SegmentEditor/images/reset_search.png); } -.segmentEditorPanel.visible .filterNoResults { +.segmentEditorPanel.expanded .filterNoResults { font-style: italic; } -.segmentEditorPanel.visible .add_new_segment { +.segmentEditorPanel.expanded .add_new_segment { clear: both; float: right; - margin: 12px 0 10px; + margin: 12px 9px 10px 0; } .segmentationContainer > ul.submenu > li { @@ -557,14 +553,6 @@ div.scrollable { cursor: pointer; } -span.segmentationTitle { - background: url(plugins/Morpheus/images/sort_subtable_desc.png) no-repeat right 0; - padding-right: 20px; - min-width: 180px; - display: block; - cursor: pointer; -} - .segmentList { max-height: 300px; margin-top: 5px; @@ -668,28 +656,26 @@ a.metric_category { z-index: 1000 !important; } +.ui-autocomplete.ui-menu.ui-widget { + box-shadow: 0 1px 2px 0 rgba(0,0,0,0.14), 0 3px 1px -2px rgba(0,0,0,0.2), 0 1px 5px 0 rgba(0,0,0,0.12); +} + @media all and (max-width: 749px) { span.segmentationTitle, - .segmentEditorPanel.visible .segmentationContainer { + .segmentEditorPanel.expanded .segmentationContainer { width: auto; } } .dropdown-body { - position: absolute; - top: 100%; - left: -1px; background-color: #f7f7f7; - padding: 0px 10px; - border: 1px solid #e4e5e4; border-top-width: 0px; display: none; border-bottom-left-radius: 4px; border-bottom-right-radius: 4px; } -.segmentEditorPanel.visible .dropdown-body { - display: block; +.segmentEditorPanel.expanded .dropdown-body { border-top-left-radius: 0; border-top-right-radius: 0; } @@ -699,7 +685,7 @@ a.metric_category { background: #f1f0eb } -.segmentEditorPanel.visible { +.segmentEditorPanel.expanded { border-bottom-left-radius: 0; border-bottom-right-radius: 0; } @@ -711,7 +697,8 @@ a.metric_category { .available_segments { display: inline-block; - width: 160px; + width: 150px; + padding-left: 5px; } .segmentationTitle, @@ -722,7 +709,6 @@ a.metric_category { white-space: nowrap; } -.segmentationTitle, .segment-element .segment-nav a.dropdown { max-width: 180px; } @@ -731,8 +717,18 @@ a.metric_category { max-width: 145px; } -.segmentEditorPanel.visible .segmentationTitle { - max-width: 200px; +.segmentEditorPanel .segmentationTitle { + text-overflow: ellipsis; + display: inline-block; + max-width: 170px; +} + +.segmentEditorPanel a.title { + padding-bottom: 8px; +} + +.segmentEditorPanel.expanded .segmentationTitle { + max-width: 180px; overflow: visible; /* restore default */ white-space: normal; /* restore default */ } diff --git a/plugins/SegmentEditor/templates/_segmentSelector.twig b/plugins/SegmentEditor/templates/_segmentSelector.twig index d9d9f3fb9d..7a8019d37e 100644 --- a/plugins/SegmentEditor/templates/_segmentSelector.twig +++ b/plugins/SegmentEditor/templates/_segmentSelector.twig @@ -1,7 +1,7 @@ <div class="SegmentEditor" style="display:none;"> - <div class="segmentationContainer listHtml"> - <span class="segmentationTitle"></span> - <div class="dropdown-body"> + <div class="segmentationContainer listHtml" title="{{ 'SegmentEditor_ChooseASegment'|translate|e('html_attr') }}"> + <a class="title"><span class="icon icon-segment"></span><span class="segmentationTitle"></span></a> + <div class="dropdown dropdown-body"> <div class="segmentFilterContainer"> <input class="segmentFilter" type="text" value="{{ 'General_Search'|translate }}"/> <span/> @@ -86,9 +86,10 @@ <a href="#">+ {{ 'SegmentEditor_AddANDorORCondition'|translate(andCondition)|raw }}</a> </div> </div> - <div class="segment-element"> + <div class="segment-element borderedControl expanded"> <div class="segment-nav"> - <h4 class="visits"><span class="available_segments"><strong> + <h4 class="visits"> + <span class="icon-segment"></span><span class="available_segments"><strong> <select class="available_segments_select"></select> </strong></span></h4> <div class="scrollable"> diff --git a/plugins/SitesManager/stylesheets/SitesManager.less b/plugins/SitesManager/stylesheets/SitesManager.less index 41d1035bb1..cd3a43f7c8 100644 --- a/plugins/SitesManager/stylesheets/SitesManager.less +++ b/plugins/SitesManager/stylesheets/SitesManager.less @@ -104,9 +104,8 @@ td.editable-site-field:hover { } .site-without-data { - padding: 15px; h2 { - border-bottom: 1px solid #ccc; + border-bottom: 1px solid @theme-color-background-tinyContrast; margin: 25px 0; padding: 0 0 5px 0; font-size: 24px; diff --git a/plugins/SitesManager/templates/siteWithoutData.twig b/plugins/SitesManager/templates/siteWithoutData.twig index 20b6326644..eafb7a287f 100644 --- a/plugins/SitesManager/templates/siteWithoutData.twig +++ b/plugins/SitesManager/templates/siteWithoutData.twig @@ -2,9 +2,11 @@ {% block notification %}{% endblock %} -{% block content %} - +{% block topcontrols %} {% include "@CoreHome/_siteSelectHeader.twig" %} +{% endblock %} + +{% block content %} <div class="site-without-data"> diff --git a/plugins/UserCountryMap/javascripts/realtime-map.js b/plugins/UserCountryMap/javascripts/realtime-map.js index 6096ce3786..f73259c5e7 100644 --- a/plugins/UserCountryMap/javascripts/realtime-map.js +++ b/plugins/UserCountryMap/javascripts/realtime-map.js @@ -57,11 +57,14 @@ }, _initStandaloneMap: function () { - $('.top_controls').hide(); - $('.Menu--dashboard').on('piwikSwitchPage', function (event, item) { - var clickedMenuIsNotMap = ($(item).attr('href').indexOf('module=UserCountryMap&action=realtimeWorldMap') == -1); + $('#periodString').hide(); + initTopControls(); + $('#secondNavBar').on('piwikSwitchPage', function (event, item) { + var href = $(item).attr('href'); + var clickedMenuIsNotMap = (href.indexOf('module=UserCountryMap&action=realtimeWorldMap') == -1); if (clickedMenuIsNotMap) { - $('.top_controls').show(); + $('#periodString').show(); + initTopControls(); } }); $('.realTimeMap_overlay').css('top', '0px'); diff --git a/plugins/UserCountryMap/stylesheets/realtime-map.less b/plugins/UserCountryMap/stylesheets/realtime-map.less index c6c98ffda5..b6dbd8a65b 100644 --- a/plugins/UserCountryMap/stylesheets/realtime-map.less +++ b/plugins/UserCountryMap/stylesheets/realtime-map.less @@ -13,6 +13,10 @@ filter: alpha(opacity=3); } +.RealTimeMap:focus { + outline: none; +} + .RealTimeMap-black { position: absolute; right: 0; diff --git a/plugins/UsersManager/templates/index.twig b/plugins/UsersManager/templates/index.twig index 8c48ad2f33..e2fb24dc9a 100644 --- a/plugins/UsersManager/templates/index.twig +++ b/plugins/UsersManager/templates/index.twig @@ -10,8 +10,6 @@ <section class="sites_selector_container"> <p>{{ 'UsersManager_MainDescription'|translate }}</p> - <div class="sites_selector_title">{{ 'SitesManager_Sites'|translate }}:</div> - {% set applyAllSitesText %} <strong>{{ 'UsersManager_ApplyToAllWebsites'|translate }}</strong> {% endset %} diff --git a/plugins/UsersManager/templates/userSettings.twig b/plugins/UsersManager/templates/userSettings.twig index b202407a07..57e04dff85 100644 --- a/plugins/UsersManager/templates/userSettings.twig +++ b/plugins/UsersManager/templates/userSettings.twig @@ -64,7 +64,7 @@ show-all-sites-item="false" showselectedsite="true" id="defaultReportSiteSelector" - style="position: relative"></div> + ></div> </div> <div class="form-group"> diff --git a/plugins/Widgetize/Menu.php b/plugins/Widgetize/Menu.php index f796faf57e..850df3e2da 100644 --- a/plugins/Widgetize/Menu.php +++ b/plugins/Widgetize/Menu.php @@ -18,7 +18,6 @@ class Menu extends \Piwik\Plugin\Menu $tooltip = Piwik::translate('Widgetize_TopLinkTooltip'); $urlParams = $this->urlForAction('index', array('segment' => false)); - $menu->addPlatformItem(null, $urlParams, 50, $tooltip); $menu->addPlatformItem('General_Widgets', $urlParams, 5, $tooltip); } diff --git a/plugins/Widgetize/templates/index.twig b/plugins/Widgetize/templates/index.twig index 49a2b5f6c1..800c5cafd7 100644 --- a/plugins/Widgetize/templates/index.twig +++ b/plugins/Widgetize/templates/index.twig @@ -2,6 +2,11 @@ {% set title %}{{ 'General_Widgets'|translate }}{% endset %} +{% block topcontrols %} + {% include "@CoreHome/_siteSelectHeader.twig" %} + {% include "@CoreHome/_periodSelect.twig" %} +{% endblock %} + {% block content %} <div> @@ -30,8 +35,6 @@ <h2 piwik-enriched-headline>{{ title }}</h2> -{% include "@CoreHome/_siteSelectHeader.twig" %} - <div class="widgetize"> <p>With Piwik, you can export your Web Analytics reports on your blog, website, or intranet dashboard... in one click. @@ -59,10 +62,6 @@ <h2>Widgetize reports</h2> <p>Select a report, and copy paste in your page the embed code below the widget: - <div class="top_controls"> - {% include "@CoreHome/_periodSelect.twig" %} - </div> - <div id="widgetPreview"></div> <div id='iframeDivToExport' style='display:none;'></div> diff --git a/plugins/ZenMode/ZenMode.php b/plugins/ZenMode/ZenMode.php deleted file mode 100644 index bbacb157c3..0000000000 --- a/plugins/ZenMode/ZenMode.php +++ /dev/null @@ -1,51 +0,0 @@ -<?php -/** - * Piwik - free/libre analytics platform - * - * @link http://piwik.org - * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later - * - */ -namespace Piwik\Plugins\ZenMode; - -/** - */ -class ZenMode extends \Piwik\Plugin -{ - /** - * @see Piwik\Plugin::registerEvents - */ - public function registerEvents() - { - return array( - 'AssetManager.getJavaScriptFiles' => 'getJsFiles', - 'AssetManager.getStylesheetFiles' => 'getStylesheetFiles', - 'Translate.getClientSideTranslationKeys' => 'getClientSideTranslationKeys' - ); - } - - public function getClientSideTranslationKeys(&$translations) - { - $translations[] = 'SitesManager_Sites'; - $translations[] = 'General_Reports'; - $translations[] = 'MultiSites_LoadingWebsites'; - $translations[] = 'ZenMode_SearchForAnything'; - $translations[] = 'ZenMode_QuickAccessTitle'; - $translations[] = 'ZenMode_HowToSearch'; - $translations[] = 'ZenMode_HowToToggleZenMode'; - $translations[] = 'ZenMode_Activated'; - } - - public function getJsFiles(&$jsFiles) - { - $jsFiles[] = "plugins/ZenMode/javascripts/zen-mode.js"; - $jsFiles[] = "plugins/ZenMode/angularjs/quick-access/quick-access.directive.js"; - $jsFiles[] = "plugins/ZenMode/angularjs/zen-mode/zen-mode-switcher.directive.js"; - } - - public function getStylesheetFiles(&$stylesheets) - { - $stylesheets[] = "plugins/ZenMode/angularjs/quick-access/quick-access.directive.less"; - $stylesheets[] = "plugins/ZenMode/angularjs/zen-mode/zen-mode.less"; - } -} diff --git a/plugins/ZenMode/angularjs/quick-access/quick-access.directive.html b/plugins/ZenMode/angularjs/quick-access/quick-access.directive.html deleted file mode 100644 index efc284d9da..0000000000 --- a/plugins/ZenMode/angularjs/quick-access/quick-access.directive.html +++ /dev/null @@ -1,41 +0,0 @@ -<div class="quick-access" title="{{ 'ZenMode_QuickAccessTitle' | translate }}"> - <input ng-keydown="onKeypress($event)" - ng-change="search(search.term)" - ng-model="search.term" - type="text" - placeholder="{{ 'ZenMode_SearchForAnything' | translate }}"/> - <ul ng-show="search.term"> - <li class="quick-access-category" - ng-click="search('menuCategory')">Menu</li> - <li class="no-result" - ng-hide="menuItems | length">---</li> - <li class="result" - ng-class="{selected: $index == search.index}" - ng-click="selectMenuItem(entry.index)" - ng-mouseenter="search.index=$index" - ng-repeat="entry in menuItems"><a>{{ entry.name | trim }}</a></li> - - <li class="quick-access-category" - ng-click="search('reportCategory')">{{ 'General_Reports' | translate }}</li> - <li class="no-result" - ng-hide="reportEntries | length">---</li> - <li class="result" - ng-class="{selected: ((menuItems | length) + $index) == search.index}" - ng-mouseenter="search.index=((menuItems | length) + $index)" - ng-click="selectMenuItem(report.index)" - ng-repeat="report in reportEntries"><a>{{ report.name | trim }}</a></li> - - <li class="quick-access-category" - ng-click="search('%')">{{ 'SitesManager_Sites' | translate }}</li> - <li class="no-result" - ng-hide="(sitesModel.sites | length) || sitesModel.isLoading">---</li> - <li class="no-result" - ng-show="sitesModel.isLoading">{{ 'MultiSites_LoadingWebsites' | translate }}</li> - <li class="result" - ng-show="!sitesModel.isLoading" - ng-mouseenter="search.index=((menuItems | length) + $index + (reportEntries | length))" - ng-class="{selected: ((menuItems | length) + $index + (reportEntries | length)) == search.index}" - ng-click="selectSite(site.idsite)" - ng-repeat="site in sitesModel.sites"><a>{{ site.name | trim }}</a></li> - </ul> -</div> \ No newline at end of file diff --git a/plugins/ZenMode/angularjs/quick-access/quick-access.directive.js b/plugins/ZenMode/angularjs/quick-access/quick-access.directive.js deleted file mode 100644 index c05fb5fbbc..0000000000 --- a/plugins/ZenMode/angularjs/quick-access/quick-access.directive.js +++ /dev/null @@ -1,140 +0,0 @@ -/*! - * Piwik - free/libre analytics platform - * - * @link http://piwik.org - * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later - */ - -/** - * Usage: - * <div piwik-dialog="showDialog">...</div> - * Will show dialog once showDialog evaluates to true. - * - * Will execute the "executeMyFunction" function in the current scope once the yes button is pressed. - */ -(function () { - angular.module('piwikApp').directive('piwikQuickAccess', QuickAccessDirective); - - QuickAccessDirective.$inject = ['$rootElement', '$timeout', '$filter', 'siteSelectorModel', 'piwik']; - - function QuickAccessDirective ($rootElement, $timeout, $filter, siteSelectorModel, piwik) { - - return { - restrict: 'A', - replace: true, - scope: {}, - templateUrl: 'plugins/ZenMode/angularjs/quick-access/quick-access.directive.html?cb=' + piwik.cacheBuster, - link: function (scope, element, attrs) { - - var menuIndex = -1; - var menuItems = []; - var reportEntries = []; - - scope.reportEntries = []; - scope.menuItems = []; - scope.sitesModel = siteSelectorModel; - - function getMenuItems() - { - if (menuItems && menuItems.length) { - return menuItems; - } - - $rootElement.find('#topRightBar .topBarElem a').each(function (index, element) { - menuItems.push({name: $(element).text(), index: ++menuIndex, category: 'menuCategory'}); - $(element).attr('quick_access', menuIndex); - }); - - return menuItems; - } - - function getReportEntries() - { - if (reportEntries && reportEntries.length) { - return reportEntries; - } - - $rootElement.find('.Menu-tabList a').each(function (index, element) { - reportEntries.push({name: $(element).text(), category: 'reportCategory', index: ++menuIndex}); - $(element).attr('quick_access', menuIndex); - }); - - return reportEntries; - } - - function highlightPreviousItem() - { - if (0 >= (scope.search.index - 1)) { - scope.search.index = 0; - } else { - scope.search.index--; - } - } - - function highlightNextItem() - { - var numTotal = element.find('li.result').length; - - if (numTotal <= (scope.search.index + 1)) { - scope.search.index = numTotal - 1; - } else { - scope.search.index++; - } - } - - function executeMenuItem() - { - var results = element.find('li.result'); - if (results && results.length && results[scope.search.index]) { - var selectedMenuElement = $(results[scope.search.index]); - $timeout(function () { - selectedMenuElement.click(); - }, 20); - } - } - - scope.onKeypress = function (event) { - - if (38 == event.which) { - highlightPreviousItem(); - event.preventDefault(); - } else if (40 == event.which) { - highlightNextItem(); - event.preventDefault(); - } else if (13 == event.which) { - executeMenuItem(); - } - }; - - scope.search = function (searchTerm) { - this.search.index = 0; - - this.menuItems = $filter('filter')(getMenuItems(), searchTerm); - this.reportEntries = $filter('filter')(getReportEntries(), searchTerm); - this.sitesModel.searchSite(searchTerm); - }; - - scope.selectSite = function (idsite) { - this.sitesModel.loadSite(idsite); - }; - - scope.selectMenuItem = function (index) { - var target = $rootElement.find('[quick_access=' + index + ']'); - - if (target && target.length && target[0]) { - var actualTarget = target[0]; - - var href = $(actualTarget).attr('href'); - - if (href && href.length > 10) { - actualTarget.click(); - } else { - $(actualTarget).click(); - } - } - }; - - } - }; - } -})(); \ No newline at end of file diff --git a/plugins/ZenMode/angularjs/quick-access/quick-access.directive.less b/plugins/ZenMode/angularjs/quick-access/quick-access.directive.less deleted file mode 100644 index 52d29dafa9..0000000000 --- a/plugins/ZenMode/angularjs/quick-access/quick-access.directive.less +++ /dev/null @@ -1,20 +0,0 @@ -.quick-access { - .selected { - background-color: #f2f2f2 !important; - } - .quick-access-category { - text-align: left !important; - font-size: 14px; - padding: 5px; - cursor: pointer; - } - .result { - cursor: pointer; - } - .quick-access-category:hover { - background: none !important; - } - .no-result { - padding-left: 27px; - } -} \ No newline at end of file diff --git a/plugins/ZenMode/angularjs/zen-mode/zen-mode-switcher.directive.js b/plugins/ZenMode/angularjs/zen-mode/zen-mode-switcher.directive.js deleted file mode 100644 index 36ac43a39a..0000000000 --- a/plugins/ZenMode/angularjs/zen-mode/zen-mode-switcher.directive.js +++ /dev/null @@ -1,54 +0,0 @@ -/*! - * Piwik - free/libre analytics platform - * - * @link http://piwik.org - * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later - */ - -/** - * Usage: - * <div piwik-zen-mode-switcher>...</div> - * Will toggle the zen mode on click on this element. - */ -(function () { - angular.module('piwikApp').directive('piwikZenModeSwitcher', piwikZenModeSwitcher); - - piwikZenModeSwitcher.$inject = ['$rootElement', '$filter']; - - function piwikZenModeSwitcher($rootElement, $filter) { - - function showZenModeIsActivatedNotification() { - var howToSearch = $filter('translate')('ZenMode_HowToSearch'); - var howToToggle = $filter('translate')('ZenMode_HowToToggleZenMode'); - var activated = $filter('translate')('ZenMode_Activated'); - - var message = '<ul><li>' + howToSearch + '</li><li>' + howToToggle + '</li></ul>'; - - var UI = require('piwik/UI'); - var notification = new UI.Notification(); - notification.show(message, { - title: activated, - context: 'info', - id: 'ZenMode_EnabledInfo' - }); - } - - return { - restrict: 'A', - compile: function (element, attrs) { - - element.on('click', function() { - $rootElement.trigger('zen-mode-toggle', {}); - - if ($rootElement.hasClass('zenMode')) { - showZenModeIsActivatedNotification(); - } - }); - - return function () { - }; - } - }; - - } -})(); \ No newline at end of file diff --git a/plugins/ZenMode/angularjs/zen-mode/zen-mode.less b/plugins/ZenMode/angularjs/zen-mode/zen-mode.less deleted file mode 100644 index d637f20241..0000000000 --- a/plugins/ZenMode/angularjs/zen-mode/zen-mode.less +++ /dev/null @@ -1,93 +0,0 @@ -.deactivateZenMode { - float:right; - margin-right: 13px; - margin-top: 4px; - display: none; - img { - width: 16px; - height: 16px; - } -} - -.activateZenMode { - img { - margin-top: -3px; - margin-bottom: -3px; - width: 16px; - height: 16px; - } -} - -.Menu--dashboard #Searchmenu { - display: none; -} - -.zenMode { - - #header { - display: none; - } - - .Menu--dashboard { - border-bottom: 1px solid @theme-color-background-lowContrast !important; - - #Searchmenu { - display: block; - } - } - - .quick-access { - display: inline-block; - color: #999; - padding: 8px 20px 7px 20px; - input { - border:0px; - border-bottom: 1px solid #CCC; - font-size: 11px !important; - } - } - - .deactivateZenMode { - display: block; - } - - .activateZenMode { - display: none; - } - - .nav_sep { - display: none; - } - - /* MENU LEVEL2 HOVER */ - .Menu--dashboard > .Menu-tabList > li li { - float: none; - text-align: left; - } - - .Menu--dashboard > .Menu-tabList > li li:hover { - background-color: #f2f2f2; - } - - .Menu--dashboard > .Menu-tabList > li ul { - display: none; - } - - .Menu--dashboard > .Menu-tabList > li.sfHover ul, - .Menu--dashboard > .Menu-tabList > li:hover ul { - display: none; - z-index: 150; - background-color: @theme-color-background-base; - width: auto; - border: 1px solid #D9D9D9; - padding-top: 0px; - border-top: 4px solid #D3291F; - } - - #root .sites_selector_in_dashboard { - margin-top:0px; - margin-right: 0px; - display: none; - } - -} diff --git a/plugins/ZenMode/javascripts/zen-mode.js b/plugins/ZenMode/javascripts/zen-mode.js deleted file mode 100644 index bc2a793942..0000000000 --- a/plugins/ZenMode/javascripts/zen-mode.js +++ /dev/null @@ -1,138 +0,0 @@ -/*! - * Piwik - free/libre analytics platform - * - * @link http://piwik.org - * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later - */ - -$(document).ready(function () { - - if (!isDashboard()) { - return; - } - - var addedElement = $('#topRightBar').append( - ' | <span class="topBarElem activateZenMode" piwik-zen-mode-switcher>' - + '<img src="plugins/CoreHome/images/navigation_expand.png">' - + ' </span>' - ); - - piwikHelper.compileAngularComponents(addedElement); - - addedElement = $('.Menu--dashboard').prepend( - '<span piwik-zen-mode-switcher class="deactivateZenMode">' - + '<img src="plugins/CoreHome/images/navigation_collapse.png" >' - + '</span>'); - - piwikHelper.compileAngularComponents(addedElement); - - angular.element(document).injector().invoke(handleZenMode); - - function handleZenMode ($rootElement, $cookies) { - - var zenMode = !!parseInt($cookies.zenMode, 10); - - $rootElement.on('zen-mode-toggle', toggleZenMode); - - function toggleZenMode() - { - zenMode = !zenMode; - - updateZenMode(); - } - - function updateZenMode() - { - $cookies.zenMode = zenMode ? '1' : '0'; - - if (zenMode) { - $rootElement.addClass('zenMode'); - initMenu(); - } else { - $rootElement.removeClass('zenMode'); - uninitMenu(); - } - - resetSubmenu(); - } - - if (zenMode) { - updateZenMode(); - } - - Mousetrap.bind('alt+z', function() { - toggleZenMode(); - }); - - Mousetrap.bind('alt+f', function(event) { - if (event.preventDefault) { - event.preventDefault(); - } else { - event.returnValue = false; // IE - } - - $('.quick-access input').focus(); - }); - } - - function isDashboard() - { - return !!$('.Menu--dashboard').length; - } - - function initMenu () { - var menuNode = $('.Menu--dashboard'); - menuNode.on('piwikSwitchPage', resetSubmenu); - menuNode.on('mouseenter', 'li:has(ul)', overMainLI); - menuNode.on('mouseleave', 'li:has(ul)', outMainLI); - - $('#Searchmenu').on('keydown focus', '.quick-access input', showQuickAccessMenu); - $('#Searchmenu').on('blur', '.quick-access input', hideQuickAccessMenu); - } - - function uninitMenu () { - var menuNode = $('.Menu--dashboard'); - menuNode.off('piwikSwitchPage', resetSubmenu); - menuNode.off('mouseenter', 'li:has(ul)', overMainLI); - menuNode.off('mouseleave', 'li:has(ul)', outMainLI); - - $('#Searchmenu').off('keydown focus', '.quick-access input', showQuickAccessMenu); - $('#Searchmenu').off('blur', '.quick-access input', hideQuickAccessMenu); - menu.prototype.adaptSubMenuHeight(); - } - - function overMainLI () { - var $this = $(this); - var position = $this.position(); - var width = $this.width(); - var height = $this.height(); - - $this.find('ul').css({ - left: position.left + 'px', - display: 'block', - minWidth: width + 'px', - position: 'absolute', - top: (position.top + height) + 'px', - maxHeight: 'none' - }); - } - - function outMainLI () { - $(this).find('ul').css({left: '', display: '', minWidth: '', position: '', top: '', maxHeight: ''}); - } - - function resetSubmenu() - { - $('.Menu--dashboard').find('li:has(ul)').mouseleave(); - } - - function showQuickAccessMenu() { - resetSubmenu(); - $('#Searchmenu').mouseenter(); - } - - function hideQuickAccessMenu() { - $('#Searchmenu').mouseleave(); - } -}); - diff --git a/plugins/ZenMode/lang/cs.json b/plugins/ZenMode/lang/cs.json deleted file mode 100644 index 9ff86d3615..0000000000 --- a/plugins/ZenMode/lang/cs.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "ZenMode": { - "PluginDescription": "NebuÄte ruÅ¡eni. Zen režim vÄ›ci zjednoduÅ¡Ã. Je dostupný pÅ™es ikonu v pravém hornÃm rohu obrazovky.", - "SearchForAnything": "Hledat cokoliv", - "QuickAccessTitle": "Hledat hlášenÃ, webové stránky nebo položky menu", - "HowToSearch": "Pokud chcete najÃt hlášenà nebo položky menu, použijte vyhledávacà pole v pravé hornà Äásti, nebo stisknÄ›te 'alt+f'.", - "HowToToggleZenMode": "Pokud chcete pÅ™epnout zen režim, použijte Å¡ipku v pravé hornà oblasti, nebo stisknÄ›te 'alt+z'.", - "Activated": "Zen režim aktivován" - } -} \ No newline at end of file diff --git a/plugins/ZenMode/lang/da.json b/plugins/ZenMode/lang/da.json deleted file mode 100644 index 8275461eaf..0000000000 --- a/plugins/ZenMode/lang/da.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "ZenMode": { - "SearchForAnything": "Søg efter alt", - "QuickAccessTitle": "Søg efter menupunkter, rapporter og hjemmesider", - "HowToSearch": "For at søge efter menupunkter, rapporter eller hjemmesider bruge søgefeltet øverst til højre, eller tryk pÃ¥ 'alt+f'.", - "HowToToggleZenMode": "Forlad eller kom i Zen-tilstand ved at klikke pÃ¥ pilen øverst til højre, eller tryk pÃ¥ 'alt+z'.", - "Activated": "Zen-tilstand aktiveret" - } -} \ No newline at end of file diff --git a/plugins/ZenMode/lang/de.json b/plugins/ZenMode/lang/de.json deleted file mode 100644 index 24ffa53ade..0000000000 --- a/plugins/ZenMode/lang/de.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "ZenMode": { - "PluginDescription": "Bleiben Sie \"Zen\" mit Piwik. Der \"Zen-Modus\" hält die Dinge einfach. Er ist verfügbar über das Icon am rechten, oberen Ende des Bildschirms.", - "SearchForAnything": "Nach etwas suchen", - "QuickAccessTitle": "Nach Menüeinträgen, Berichten oder Websites suchen", - "HowToSearch": "Um nach Menüeinträgen, Berichten oder Websites zu suchen, das Suchfeld oben benutzen oder Alt+f drücken.", - "HowToToggleZenMode": "Auf den oberen rechten Pfeil klicken um den Zen Modus zu verlassen oder Alt+t drücken.", - "Activated": "Zen Modus aktiviert" - } -} \ No newline at end of file diff --git a/plugins/ZenMode/lang/el.json b/plugins/ZenMode/lang/el.json deleted file mode 100644 index 5a29f9805a..0000000000 --- a/plugins/ZenMode/lang/el.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "ZenMode": { - "PluginDescription": "Μείνετε στο Zen με το Piwik. Η κατάσταση Zen τηÏεί τα Ï€Ïάματα σε απλή κατάσταση. Είναι διαθÎσιμη ως εικονίδιο πάνω δεξιά στην οθόνη.", - "SearchForAnything": "Αναζήτηση για όλα", - "QuickAccessTitle": "Αναζήτηση για καταχωÏήσεις μενοÏ, αναφοÏÎÏ‚ και ιστοτόπους", - "HowToSearch": "Για να αναζητήσετε σε καταχωÏήσεις μενοÏ, αναφοÏÎÏ‚ ή ιστοτόπους χÏησιμοποιείστε το πλαίσιο αναζήτηση πάνω δεξιά ή πατήστε 'Alt+F'.", - "HowToToggleZenMode": "Για να βγείτε ή μεταβείτε σε κατάσταση Zen, πατήστε στο βÎλος πάνω δεξιά ή πατήστε 'Alt+Z'.", - "Activated": "Η κατάσταση Zen ενεÏγοποιήθηκε" - } -} \ No newline at end of file diff --git a/plugins/ZenMode/lang/en.json b/plugins/ZenMode/lang/en.json deleted file mode 100755 index 4a3aa78ee8..0000000000 --- a/plugins/ZenMode/lang/en.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "ZenMode": { - "PluginDescription": "Stay Zen with Piwik. Zen mode keeps things simple. It is available via the icon in the top right of the screen.", - "SearchForAnything": "Search for anything", - "QuickAccessTitle": "Search for menu entries, reports and websites", - "HowToSearch": "To search for menu items, reports or websites use the search box on the top right or press 'alt+f'.", - "HowToToggleZenMode": "To leave or enter the zen mode click the arrow on the top right or press 'alt+z'.", - "Activated": "Zen mode activated" - } -} \ No newline at end of file diff --git a/plugins/ZenMode/lang/es.json b/plugins/ZenMode/lang/es.json deleted file mode 100644 index 27fcf38a62..0000000000 --- a/plugins/ZenMode/lang/es.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "ZenMode": { - "PluginDescription": "Permanecer Zen con Piwik. El modo Zen mantiene las cosas simples. Está disponible vÃa el icono en el extremo superior derecho de la pantalla.", - "SearchForAnything": "Buscar lo que quiera", - "QuickAccessTitle": "Buscar entradas de menú, reportes y sitios de internet", - "HowToSearch": "Para buscar entradas de menú, reportes o sitios de internet utilice la caja de búsqueda en la parte superior derecha o presione 'alt+f'.", - "HowToToggleZenMode": "Para salir o ingresar al modo Zen haga clic en la flecha en la parte superior derecha o presione 'alt+z'.", - "Activated": "Modo Zen activado" - } -} \ No newline at end of file diff --git a/plugins/ZenMode/lang/fa.json b/plugins/ZenMode/lang/fa.json deleted file mode 100644 index d221d07b56..0000000000 --- a/plugins/ZenMode/lang/fa.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "ZenMode": { - "SearchForAnything": "جستجوی همه" - } -} \ No newline at end of file diff --git a/plugins/ZenMode/lang/fr.json b/plugins/ZenMode/lang/fr.json deleted file mode 100644 index bd8c99350c..0000000000 --- a/plugins/ZenMode/lang/fr.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "ZenMode": { - "PluginDescription": "Restez zen avec Piwik. Le mode zen conserve les choses simples. Il est disponible via l'icône en haut à droite de l'écran.", - "SearchForAnything": "Rechercher tout", - "QuickAccessTitle": "Rechercher des éléments du menu, rapports et sites web", - "HowToSearch": "Pour rechercher des éléments du menu, rapports ou sites web utilisez la barre de recherche en haut à droite ou pressez 'alt+f'.", - "HowToToggleZenMode": "Pour quitter ou entrer en mode zen cliquez sur la flèche dans le coin supérieur droit ou pressez 'alt+z'.", - "Activated": "Mode zen activé" - } -} \ No newline at end of file diff --git a/plugins/ZenMode/lang/hi.json b/plugins/ZenMode/lang/hi.json deleted file mode 100644 index 44ac4ac168..0000000000 --- a/plugins/ZenMode/lang/hi.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "ZenMode": { - "PluginDescription": "Piwik साथ जेन रहें। ज़ेन मोड सरल बातें करती रहती है। यह सà¥à¤•à¥à¤°à¥€à¤¨ के ऊपर सही में आइकन के माधà¥à¤¯à¤® से उपलबà¥à¤§ है।", - "SearchForAnything": "कà¥à¤› के लिठखोज", - "QuickAccessTitle": "मेनू पà¥à¤°à¤µà¤¿à¤·à¥à¤Ÿà¤¿à¤¯à¥‹à¤‚, रिपोरà¥à¤Ÿà¥‹à¤‚ और वेबसाइटों के लिठखोज", - "Activated": "ज़ेन मोड सकà¥à¤°à¤¿à¤¯" - } -} \ No newline at end of file diff --git a/plugins/ZenMode/lang/it.json b/plugins/ZenMode/lang/it.json deleted file mode 100644 index cb5bcb5295..0000000000 --- a/plugins/ZenMode/lang/it.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "ZenMode": { - "PluginDescription": "Sii Zen con Piwik. La modalità Zen rende le cose facili. È disponibile tramite l'icona che si trova nell'angolo in alto a destra dello schermo.", - "SearchForAnything": "Cerca tutto", - "QuickAccessTitle": "Ricerca elementi di menù, report e siti web", - "HowToSearch": "Per ricercare elementi di menù, report o siti web utilizza la casella di ricerca in alto a destra o premi 'alt+f'.", - "HowToToggleZenMode": "Per lasciare la modalità Zen o entrarvi, clicca sulla freccia in alto a destra o premi 'alt+z'.", - "Activated": "Modalità Zen attivata" - } -} \ No newline at end of file diff --git a/plugins/ZenMode/lang/ja.json b/plugins/ZenMode/lang/ja.json deleted file mode 100644 index 3bc49cdb1e..0000000000 --- a/plugins/ZenMode/lang/ja.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "ZenMode": { - "SearchForAnything": "ãªã‚“ã§ã‚‚検索", - "QuickAccessTitle": "メニューエントリーã€ãƒ¬ãƒãƒ¼ãƒˆã€ã‚¦ã‚§ãƒ–サイトを検索", - "HowToSearch": "ãƒ¡ãƒ‹ãƒ¥ãƒ¼é …ç›®ã‚„ãƒ¬ãƒãƒ¼ãƒˆã€ã‚¦ã‚§ãƒ–サイトをãŠæŽ¢ã—ã®å ´åˆã€å³ä¸Šã®æ¤œç´¢ãƒœãƒƒã‚¯ã‚¹ã‚’ã”利用ã«ãªã‚‹ã‹ã€ã‚ーボード㮠'alt+f' を押ã—ã¦ãã ã•ã„。", - "HowToToggleZenMode": "禅モードを切り替ãˆã‚‹ã«ã¯ã€å³ä¸Šã®çŸ¢å°ã‚’クリックã™ã‚‹ã‹ã€ã‚ーボード㮠'alt+z' を押ã—ã¦ãã ã•ã„。", - "Activated": "禅モードを有効化" - } -} \ No newline at end of file diff --git a/plugins/ZenMode/lang/nb.json b/plugins/ZenMode/lang/nb.json deleted file mode 100644 index 0b5c865c5e..0000000000 --- a/plugins/ZenMode/lang/nb.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "ZenMode": { - "SearchForAnything": "Søk etter noe", - "Activated": "Zen-modus aktivert" - } -} \ No newline at end of file diff --git a/plugins/ZenMode/lang/nl.json b/plugins/ZenMode/lang/nl.json deleted file mode 100644 index 930411c0ed..0000000000 --- a/plugins/ZenMode/lang/nl.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "ZenMode": { - "PluginDescription": "Blijf zen met Piwik. Zen mode houdt de dingen eenvoudig. Het is beschikbaar via het icoon in de rechterbovenhoek van het scherm.", - "SearchForAnything": "Zoeken op alles", - "QuickAccessTitle": "Zoeken op menu-items, rapporten en websites", - "HowToSearch": "Om te zoeken op menu-items, rapporten of websites gebruik het zoekvak rechtsboven of druk op 'alt+f'.", - "HowToToggleZenMode": "Om de zen-modus te betreden of verlaten klik op pijl rechtsboven of druk 'alt+z'.", - "Activated": "Zen-modus geactiveerd" - } -} \ No newline at end of file diff --git a/plugins/ZenMode/lang/pl.json b/plugins/ZenMode/lang/pl.json deleted file mode 100644 index d638e2b004..0000000000 --- a/plugins/ZenMode/lang/pl.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "ZenMode": { - "SearchForAnything": "Szukaj czegokolwiek", - "QuickAccessTitle": "Szukaj wpisów w menu, raportów i stron.", - "HowToToggleZenMode": "Aby wyjść albo wejść do trybu Zen należy kliknąć strzaÅ‚kÄ™ w górnym prawym rogu albo wcisnąć 'alt+z'.", - "Activated": "Tryb Zen zostaÅ‚ aktywowany" - } -} \ No newline at end of file diff --git a/plugins/ZenMode/lang/pt-br.json b/plugins/ZenMode/lang/pt-br.json deleted file mode 100644 index 640da2c93b..0000000000 --- a/plugins/ZenMode/lang/pt-br.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "ZenMode": { - "PluginDescription": "Fique Zen com Piwik. O modo Zen mantém as coisas simples. Está disponÃvel através do Ãcone no canto superior direito da tela.", - "SearchForAnything": "Buscar por qualquer coisa", - "QuickAccessTitle": "Pesquisar por entradas do menu, relatórios e websites", - "HowToSearch": "Para procurar itens do menu, relatórios ou sites utilize a caixa de pesquisa no canto superior direito ou pressione 'alt+f'.", - "HowToToggleZenMode": "Para sair ou entrar no modo zen clique na seta no canto superior direito ou pressione 'alt+z'.", - "Activated": "Modo Zen ativado" - } -} \ No newline at end of file diff --git a/plugins/ZenMode/lang/ro.json b/plugins/ZenMode/lang/ro.json deleted file mode 100644 index 495fd70b9e..0000000000 --- a/plugins/ZenMode/lang/ro.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "ZenMode": { - "SearchForAnything": "Caută orice", - "QuickAccessTitle": "Caută elemente de meniu, rapoarte ÅŸi site-uri", - "HowToSearch": "Pentru a căuta elemente de meniu, rapoarte sau site-uri, foloseÅŸte cutia de căutare din dreapta sus sau apasă 'alt+f'.", - "HowToToggleZenMode": "Pentru a intra sau a părăsi modul zen, dă click pe săgeata din dreapta sus sau apasă 'alt+z'.", - "Activated": "Modul Zen a fost activat" - } -} \ No newline at end of file diff --git a/plugins/ZenMode/lang/ru.json b/plugins/ZenMode/lang/ru.json deleted file mode 100644 index 68799e808c..0000000000 --- a/plugins/ZenMode/lang/ru.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "ZenMode": { - "SearchForAnything": "ПоиÑк везде", - "QuickAccessTitle": "ПоиÑк по пунктам меню, отчетам и Ñайтам", - "HowToSearch": "Ð”Ð»Ñ Ð¿Ð¾Ð¸Ñка Ñлементов меню, отчетов и веб-Ñайтов иÑпользуйте окно поиÑка в правом верхнем углу или нажмите \"alt+f\"", - "HowToToggleZenMode": "Чтобы выйти или войти в Дзен режим нажмите на Ñтрелку в правом верхнем углу или нажмите \"alt+z\".", - "Activated": "Ðктивирован Дзен режим" - } -} \ No newline at end of file diff --git a/plugins/ZenMode/lang/sr.json b/plugins/ZenMode/lang/sr.json deleted file mode 100644 index 4f73c1cf1a..0000000000 --- a/plugins/ZenMode/lang/sr.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "ZenMode": { - "PluginDescription": "Budite u Zenu sa Pivikom. Zen mod Äini stvari jednostavnim. Možete ga omogućiti preko sliÄice u gornjem desnom uglu ekrana.", - "SearchForAnything": "Pretraži sve", - "QuickAccessTitle": "Pretraživanje stavki menija, izveÅ¡taja i sajtova", - "HowToSearch": "Ukoliko želite da pretražujete stavke menija, izveÅ¡taje ili sajtove, upotrebite polje za pretraživanje u gornjem desnom uglu ili pritisnite Alt + f.", - "HowToToggleZenMode": "Ukoliko želite da napustite ili ponovo aktivirate zen mod, kliknite na strelicu u gornjem desnom uglu ili pritisnite Alt + z.", - "Activated": "Zen mod aktiviran" - } -} \ No newline at end of file diff --git a/plugins/ZenMode/lang/sv.json b/plugins/ZenMode/lang/sv.json deleted file mode 100644 index d42ff6428e..0000000000 --- a/plugins/ZenMode/lang/sv.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "ZenMode": { - "SearchForAnything": "Sök efter vad som helst", - "QuickAccessTitle": "Sök efter meny-poster, rapporter och webbplatser", - "HowToSearch": "För att söka efter meny-poster, rapporter eller webbplatser - använd sökfältet uppe till höger eller tryck 'alt+f'.", - "HowToToggleZenMode": "För att gÃ¥ i\/ur zen mode, klicka pÃ¥ pilen uppe till höger eller tryck 'alt+z'.", - "Activated": "Zen mode aktiverat" - } -} \ No newline at end of file diff --git a/plugins/ZenMode/lang/ta.json b/plugins/ZenMode/lang/ta.json deleted file mode 100644 index c9c6a76d75..0000000000 --- a/plugins/ZenMode/lang/ta.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "ZenMode": { - "SearchForAnything": "எதைபறà¯à®±à®¿à®¯à¯à®®à¯ தேடà¯", - "Activated": "ஜென௠நிலை செயறà¯à®ªà®¾à®Ÿà¯à®Ÿà®¿à®²à¯ உளà¯à®³à®¤à¯" - } -} \ No newline at end of file diff --git a/plugins/ZenMode/lang/tl.json b/plugins/ZenMode/lang/tl.json deleted file mode 100644 index 7f738608d1..0000000000 --- a/plugins/ZenMode/lang/tl.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "ZenMode": { - "SearchForAnything": "Paghahanap sa kahit ano", - "QuickAccessTitle": "Maghanap ng mga entry ng menu mga ulat at mga website.", - "HowToSearch": "Para maghanap ng items sa menu ulat o websites gamitin ang search box sa kanang tuktok o pindutin ang 'alt+f'.", - "HowToToggleZenMode": "Upang umalis o ipasok ang Zen mode i-click ang arrow sa kanang tuktok o pindutin ang 'alt + z'.", - "Activated": "Ang Zen mode ay na activate" - } -} \ No newline at end of file diff --git a/tests/UI/expected-ui-screenshots b/tests/UI/expected-ui-screenshots index 226ef830c3..ae43d0c241 160000 --- a/tests/UI/expected-ui-screenshots +++ b/tests/UI/expected-ui-screenshots @@ -1 +1 @@ -Subproject commit 226ef830c369abf63bea6d350c7598fc3e8662e3 +Subproject commit ae43d0c24150d059c9350c89fe20589d171fb40a diff --git a/tests/UI/specs/DashboardManager_spec.js b/tests/UI/specs/DashboardManager_spec.js index 9ada832b83..3dcd33f5ab 100644 --- a/tests/UI/specs/DashboardManager_spec.js +++ b/tests/UI/specs/DashboardManager_spec.js @@ -22,7 +22,7 @@ describe("DashboardManager", function () { it("should expand when clicked", function (done) { expect.screenshot("expanded").to.be.captureSelector(selectorToCapture, function (page) { - page.click('.dashboard-manager'); + page.click('.dashboard-manager .title'); }, done); }); diff --git a/tests/UI/specs/Dashboard_spec.js b/tests/UI/specs/Dashboard_spec.js index e6918417d4..f17e9f4258 100644 --- a/tests/UI/specs/Dashboard_spec.js +++ b/tests/UI/specs/Dashboard_spec.js @@ -84,7 +84,7 @@ describe("Dashboard", function () { }); it("should refresh widget when widget refresh icon clicked", function (done) { - expect.screenshot("widget_move").to.be.capture("widget_refresh", function (page) { + expect.screenshot("widget_move_refresh").to.be.capture(function (page) { page.mouseMove('.widgetTop'); page.click('.button#refresh'); page.mouseMove('.dashboard-manager'); // let widget top hide again @@ -99,7 +99,7 @@ describe("Dashboard", function () { }); it("should unminimise widget when widget maximise icon is clicked after being minimised", function (done) { - expect.screenshot("widget_move").to.be.capture("widget_unminimised", function (page) { + expect.screenshot("widget_move_unminimised").to.be.capture(function (page) { page.mouseMove('.widgetTop'); page.click('.button#maximise'); page.mouseMove('.dashboard-manager'); // let widget top hide again @@ -114,7 +114,7 @@ describe("Dashboard", function () { }); it("should close maximise dialog when minimise icon is clicked", function (done) { - expect.screenshot("widget_move").to.be.capture("widget_unmaximise", function (page) { + expect.screenshot("widget_move_unmaximise").to.be.capture(function (page) { page.mouseMove('.widgetTop'); page.click('.button#minimise'); page.mouseMove('.dashboard-manager'); // let widget top hide again @@ -123,7 +123,7 @@ describe("Dashboard", function () { it("should add a widget when a widget is selected in the dashboard manager", function (done) { expect.screenshot("widget_add_widget").to.be.capture(function (page) { - page.click('.dashboard-manager'); + page.click('.dashboard-manager .title'); page.mouseMove('.widgetpreview-categorylist>li:contains(Live!)'); // have to mouse move twice... otherwise Live! will just be highlighted page.mouseMove('.widgetpreview-categorylist>li:contains(Visits Summary)'); @@ -135,7 +135,7 @@ describe("Dashboard", function () { }); it("should remove widget when remove widget icon is clicked", function (done) { - expect.screenshot("widget_move").to.be.capture("widget_removed", function (page) { + expect.screenshot("widget_move_removed").to.be.capture(function (page) { page.mouseMove('#widgetVisitTimegetVisitInformationPerLocalTime .widgetTop'); page.click('#widgetVisitTimegetVisitInformationPerLocalTime .button#close'); page.click('.ui-dialog button>span:contains(Yes)'); @@ -145,7 +145,7 @@ describe("Dashboard", function () { it("should change dashboard layout when new layout is selected", function (done) { expect.screenshot("change_layout").to.be.capture(function (page) { - page.click('.dashboard-manager'); + page.click('.dashboard-manager .title'); page.click('li[data-action=showChangeDashboardLayoutDialog]'); page.click('div[layout=50-50]'); page.click('.ui-dialog button>span:contains(Save)', 3000); @@ -154,7 +154,7 @@ describe("Dashboard", function () { it("should rename dashboard when dashboard rename process completed", function (done) { expect.screenshot("rename").to.be.capture(function (page) { - page.click('.dashboard-manager'); + page.click('.dashboard-manager .title'); page.click('li[data-action=renameDashboard]'); page.evaluate(function () { $('#newDashboardName:visible').val('newname'); // don't use sendKeys or click, since in this test it appears to trigger a seg fault on travis @@ -165,7 +165,7 @@ describe("Dashboard", function () { it("should copy dashboard successfully when copy dashboard process completed", function (done) { expect.screenshot("copied").to.be.capture(function (page) { - page.click('.dashboard-manager'); + page.click('.dashboard-manager .title'); page.click('li[data-action=copyDashboardToUser]'); page.evaluate(function () { $('#copyDashboardName').val(''); @@ -182,7 +182,7 @@ describe("Dashboard", function () { it("should reset dashboard when reset dashboard process completed", function (done) { expect.screenshot("reset").to.be.capture(function (page) { - page.click('.dashboard-manager'); + page.click('.dashboard-manager .title'); page.click('li[data-action=resetDashboard]'); page.click('.ui-dialog button>span:contains(Yes)', 10000); page.mouseMove('.dashboard-manager'); @@ -191,7 +191,7 @@ describe("Dashboard", function () { it("should remove dashboard when remove dashboard process completed", function (done) { expect.screenshot("removed").to.be.capture(function (page) { - page.click('.dashboard-manager'); + page.click('.dashboard-manager .title'); page.click('li[data-action=removeDashboard]'); page.click('.ui-dialog[aria-describedby=removeDashboardConfirm] button>span:contains(Yes)'); page.mouseMove('.dashboard-manager'); @@ -204,7 +204,7 @@ describe("Dashboard", function () { it("should not fail when default widget selection changed", function (done) { expect.screenshot("default_widget_selection_changed").to.be.capture(function (page) { page.load(url); - page.click('.dashboard-manager'); + page.click('.dashboard-manager .title'); page.click('li[data-action=setAsDefaultWidgets]'); page.click('.ui-dialog button>span:contains(Yes)'); }, done); @@ -212,7 +212,7 @@ describe("Dashboard", function () { it("should create new dashboard with new default widget selection when create dashboard process completed", function (done) { expect.screenshot("create_new").to.be.capture(function (page) { - page.click('.dashboard-manager'); + page.click('.dashboard-manager .title'); page.click('li[data-action=createDashboard]'); page.sendKeys('#createDashboardName', 'newdash2'); page.click('.ui-dialog[aria-describedby=createDashboardConfirm] button>span:contains(Yes)'); diff --git a/tests/UI/specs/EmptySite_spec.js b/tests/UI/specs/EmptySite_spec.js index 704bda8721..31b8524d6f 100644 --- a/tests/UI/specs/EmptySite_spec.js +++ b/tests/UI/specs/EmptySite_spec.js @@ -15,7 +15,7 @@ describe("EmptySite", function () { it('should show the tracking code if the website has no recorded data', function (done) { var urlToTest = "?" + generalParams + "&module=CoreHome&action=index"; - expect.screenshot('emptySiteDashboard').to.be.captureSelector('.site-without-data', function (page) { + expect.screenshot('emptySiteDashboard').to.be.captureSelector('.page', function (page) { page.load(urlToTest); }, done); }); diff --git a/tests/UI/specs/Login_spec.js b/tests/UI/specs/Login_spec.js index c58dd5fc53..ed4ad31ba3 100644 --- a/tests/UI/specs/Login_spec.js +++ b/tests/UI/specs/Login_spec.js @@ -49,7 +49,7 @@ describe("Login", function () { it("should redirect to login when logout link clicked", function (done) { expect.screenshot("login_form").to.be.capture("logout_form", function (page) { - page.click("#topBars a:contains(Sign out)"); + page.click("#topRightBar .icon-sign-out"); }, done); }); @@ -89,7 +89,7 @@ describe("Login", function () { it("should login successfully when formless login used", function (done) { expect.page("").contains('#dashboard', 'formless_login', function (page) { - page.click("#topBars a:contains(Sign out)"); + page.click("#topRightBar .icon-sign-out"); page.load(formlessLoginUrl); }, done); }); diff --git a/tests/UI/specs/MeasurableManager_spec.js b/tests/UI/specs/MeasurableManager_spec.js index 539576a7c1..691af5c436 100644 --- a/tests/UI/specs/MeasurableManager_spec.js +++ b/tests/UI/specs/MeasurableManager_spec.js @@ -31,7 +31,7 @@ describe("MeasurableManager", function () { }); it("should use measurable wording in menu", function (done) { - var selector = '.Menu-tabList *:contains(Administration):first'; + var selector = '#secondNavBar li:contains(Administration):first'; expect.screenshot('measurable_menu_item').to.be.captureSelector(selector, function (page) { }, done); diff --git a/tests/UI/specs/Menus_spec.js b/tests/UI/specs/Menus_spec.js index d3fe6720c0..3124766e79 100644 --- a/tests/UI/specs/Menus_spec.js +++ b/tests/UI/specs/Menus_spec.js @@ -14,48 +14,55 @@ describe("Menus", function () { urlBase = 'module=CoreHome&action=index&' + generalParams ; + function openMenuItem(page, menuItem) + { + page.click('#secondNavBar .navbar a:contains('+ menuItem + ')'); + } + // main menu tests it('should load the main reporting menu correctly', function (done) { - expect.screenshot('mainmenu_loaded').to.be.captureSelector('.Menu--dashboard,.nav_sep', function (page) { + expect.screenshot('mainmenu_loaded').to.be.captureSelector('#secondNavBar', function (page) { page.load("?" + urlBase + "#" + generalParams + "&module=Actions&action=menuGetPageUrls"); }, done); }); it('should change the menu when a upper menu item is clicked in the main menu', function (done) { - expect.screenshot('mainmenu_upper_clicked').to.be.captureSelector('.Menu--dashboard,.nav_sep', function (page) { - page.click('.Menu-tabList > li:eq(1) > a'); + expect.screenshot('mainmenu_upper_clicked').to.be.captureSelector('#secondNavBar', function (page) { + page.click('#secondNavBar .navbar > li:eq(1) > a'); }, done); }); it('should change the menu when a lower menu item is clicked in the main menu', function (done) { - expect.screenshot('mainmenu_lower_clicked').to.be.captureSelector('.Menu--dashboard,.nav_sep', function (page) { - page.click('.Menu-tabList > li:eq(1) > ul > li:eq(1) > a'); + expect.screenshot('mainmenu_lower_clicked').to.be.captureSelector('#secondNavBar', function (page) { + page.click('#secondNavBar .navbar > li:eq(1) > ul > li:eq(1) > a'); }, done); }); // user menu tests it('should load the user reporting menu correctly', function (done) { - expect.screenshot('user_loaded').to.be.captureSelector('.Menu--admin', function (page) { + expect.screenshot('user_loaded').to.be.captureSelector('#secondNavBar', function (page) { page.load("?" + generalParams + "&module=UsersManager&action=userSettings"); }, done); }); it('should change the user page correctly when a user menu item is clicked', function (done) { - expect.screenshot('user_changed').to.be.captureSelector('.Menu--admin', function (page) { - page.click('.Menu--admin a:contains(API)'); + expect.screenshot('user_changed').to.be.captureSelector('#secondNavBar', function (page) { + openMenuItem(page, 'Platform'); + openMenuItem(page, 'API'); }, done); }); // admin menu tests it('should load the admin reporting menu correctly', function (done) { - expect.screenshot('admin_loaded').to.be.captureSelector('.Menu--admin', function (page) { + expect.screenshot('admin_loaded').to.be.captureSelector('#secondNavBar', function (page) { page.load("?" + generalParams + "&module=CoreAdminHome&action=generalSettings"); }, done); }); it('should change the admin page correctly when an admin menu item is clicked', function (done) { - expect.screenshot('admin_changed').to.be.captureSelector('.Menu--admin', function (page) { - page.click('.Menu--admin a:contains(Websites)'); + expect.screenshot('admin_changed').to.be.captureSelector('#secondNavBar', function (page) { + openMenuItem(page, 'Administration'); + openMenuItem(page, 'Websites'); }, done); }); }); \ No newline at end of file diff --git a/tests/UI/specs/MultiSites_spec.js b/tests/UI/specs/MultiSites_spec.js index bab72a1d77..6037a196ef 100644 --- a/tests/UI/specs/MultiSites_spec.js +++ b/tests/UI/specs/MultiSites_spec.js @@ -11,7 +11,7 @@ describe("MultiSitesTest", function () { this.timeout(0); var generalParams = 'idSite=1&period=year&date=2012-08-09'; - var selector = '.pageWrap,.expandDataTableFooterDrawer'; + var selector = '#multisites,.expandDataTableFooterDrawer'; var createdSiteId = null; diff --git a/tests/UI/specs/QuickAccess_spec.js b/tests/UI/specs/QuickAccess_spec.js new file mode 100644 index 0000000000..75879d2729 --- /dev/null +++ b/tests/UI/specs/QuickAccess_spec.js @@ -0,0 +1,75 @@ +/*! + * Piwik - free/libre analytics platform + * + * ActionsDataTable screenshot tests. + * + * @link http://piwik.org + * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later + */ + +describe("QuickAccess", function () { + var selectorToCapture = "#search,.quick-access"; + + this.timeout(0); + + var url = "?module=CoreHome&action=index&idSite=1&period=year&date=2012-08-09"; + + function enterSearchTerm(page, searchTermToAdd) + { + page.sendKeys("#search input", searchTermToAdd); + } + + function captureSelector(screenshotName, done, selector, callback) + { + expect.screenshot(screenshotName).to.be.captureSelector(selector, callback, done); + } + + function capture(screenshotName, done, callback) + { + captureSelector(screenshotName, done, selectorToCapture, callback); + } + + it("should be displayed", function (done) { + capture('initially', done, function (page) { + page.load(url); + }); + }); + + it("should search for something and update view", function (done) { + capture('search_1', done, function (page) { + enterSearchTerm(page, 'b'); + }); + }); + + it("should search again when typing another letter", function (done) { + capture('search_2', done, function (page) { + enterSearchTerm(page, 'a'); + }); + }); + + it("should show message if no results", function (done) { + capture('search_no_result', done, function (page) { + enterSearchTerm(page, 'x'); + }); + }); + + it("should be possible to activate via shortcut", function (done) { + capture('shortcut', done, function (page) { + page.load(url); + page.sendKeys("body", 'f'); + }); + }); + + it("should search for websites", function (done) { + capture('search_sites', done, function (page) { + enterSearchTerm(page, 'si'); + }); + }); + + it("clicking on a category should show all items that belong to that category", function (done) { + capture('search_category', done, function (page) { + page.click('.quick-access-category:first'); + }); + }); + +}); diff --git a/tests/UI/specs/SegmentSelectorEditor_spec.js b/tests/UI/specs/SegmentSelectorEditor_spec.js index 01066c3bbf..f936162841 100644 --- a/tests/UI/specs/SegmentSelectorEditor_spec.js +++ b/tests/UI/specs/SegmentSelectorEditor_spec.js @@ -22,13 +22,13 @@ describe("SegmentSelectorEditorTest", function () { it("should open selector when control clicked", function (done) { expect.screenshot("1_selector_open").to.be.captureSelector(selectorsToCapture, function (page) { - page.click('.segmentationContainer'); + page.click('.segmentationContainer .title'); }, done); }); it("should open segment editor when edit link clicked for existing segment", function (done) { expect.screenshot("2_segment_editor_update").to.be.captureSelector(selectorsToCapture, function (page) { - page.click('.segmentList .editSegment'); + page.click('.segmentList .editSegment:first'); }, done); }); @@ -65,7 +65,7 @@ describe("SegmentSelectorEditorTest", function () { it("should open blank segment editor when create new segment link is clicked", function (done) { expect.screenshot("8_segment_editor_create").to.be.captureSelector(selectorsToCapture, function (page) { - page.click('.segmentationContainer'); + page.click('.segmentationContainer .title'); page.click('.add_new_segment'); }, done); }); @@ -120,7 +120,7 @@ describe("SegmentSelectorEditorTest", function () { it("should show the new segment after page reload", function (done) { expect.screenshot("saved").to.be.captureSelector("saved_reload", selectorsToCapture, function (page) { page.reload(); - page.click('.segmentationContainer'); + page.click('.segmentationContainer .title'); }, done); }); @@ -158,7 +158,7 @@ describe("SegmentSelectorEditorTest", function () { it("should show the updated segment after page reload", function (done) { expect.screenshot("updated").to.be.captureSelector("updated_reload", selectorsToCapture, function (page) { page.reload(); - page.click('.segmentationContainer'); + page.click('.segmentationContainer .title'); }, done); }); @@ -178,14 +178,14 @@ describe("SegmentSelectorEditorTest", function () { expect.screenshot('deleted').to.be.captureSelector(selectorsToCapture + ',.ui-dialog', function (page) { page.click('.ui-dialog button>span:contains(Yes):visible'); - page.click('.segmentationContainer'); + page.click('.segmentationContainer .title'); }, done); }); it("should not show the deleted segment after page reload", function (done) { expect.screenshot('deleted').to.be.captureSelector('deleted_reload', selectorsToCapture, function (page) { page.reload(); - page.click('.segmentationContainer'); + page.click('.segmentationContainer .title'); }, done); }); }); \ No newline at end of file diff --git a/tests/UI/specs/SiteSelector_spec.js b/tests/UI/specs/SiteSelector_spec.js index 71ae799558..08bd950a77 100644 --- a/tests/UI/specs/SiteSelector_spec.js +++ b/tests/UI/specs/SiteSelector_spec.js @@ -22,7 +22,7 @@ describe("SiteSelector", function () { it("should display expanded when clicked", function (done) { expect.screenshot("expanded").to.be.captureSelector(selectorToCapture, function (page) { - page.click('.sites_autocomplete'); + page.click('.sites_autocomplete .title'); }, done); }); diff --git a/tests/UI/specs/UIIntegration_spec.js b/tests/UI/specs/UIIntegration_spec.js index 76b521567f..ab5a5ec6aa 100644 --- a/tests/UI/specs/UIIntegration_spec.js +++ b/tests/UI/specs/UIIntegration_spec.js @@ -237,13 +237,13 @@ describe("UIIntegrationTest", function () { // TODO: Rename to Piwik? // goals pages it('should load the goals > ecommerce page correctly', function (done) { - expect.screenshot('goals_ecommerce').to.be.captureSelector('.pageWrap,.expandDataTableFooterDrawer', function (page) { + expect.screenshot('goals_ecommerce').to.be.captureSelector('.pageWrap,.expandDataTableFooterDrawer,.dataTable', function (page) { page.load("?" + urlBase + "#" + generalParams + "&module=Ecommerce&action=ecommerceReport&idGoal=ecommerceOrder"); }, done); }); it('should load the goals > overview page correctly', function (done) { - expect.screenshot('goals_overview').to.be.captureSelector('.pageWrap,.expandDataTableFooterDrawer', function (page) { + expect.screenshot('goals_overview').to.be.captureSelector('.pageWrap,.expandDataTableFooterDrawer,.dataTable', function (page) { page.load( "?" + urlBase + "#" + generalParams + "&module=Goals&action=index"); }, done); }); @@ -256,7 +256,7 @@ describe("UIIntegrationTest", function () { // TODO: Rename to Piwik? }); it('should load the goals > single goal page correctly', function (done) { - expect.screenshot('goals_individual_goal').to.be.captureSelector('.pageWrap,.expandDataTableFooterDrawer', function (page) { + expect.screenshot('goals_individual_goal').to.be.captureSelector('.pageWrap,.expandDataTableFooterDrawer,.dataTable', function (page) { page.load("?" + urlBase + "#" + generalParams + "&module=Goals&action=goalReport&idGoal=1"); }, done); }); @@ -349,7 +349,7 @@ describe("UIIntegrationTest", function () { // TODO: Rename to Piwik? // Ecommerce it('should load the ecommerce overview page', function (done) { - expect.screenshot('ecommerce_overview').to.be.captureSelector('.pageWrap,.expandDataTableFooterDrawer', function (page) { + expect.screenshot('ecommerce_overview').to.be.captureSelector('.pageWrap,.expandDataTableFooterDrawer,.dataTable', function (page) { page.load("?" + urlBase + "#" + generalParams + "&module=Ecommerce&action=ecommerceReport&idGoal=ecommerceOrder"); }, done); }); @@ -361,20 +361,20 @@ describe("UIIntegrationTest", function () { // TODO: Rename to Piwik? }); it('should load the ecommerce products page', function (done) { - expect.screenshot('ecommerce_products').to.be.captureSelector('.pageWrap,.expandDataTableFooterDrawer', function (page) { + expect.screenshot('ecommerce_products').to.be.captureSelector('.pageWrap,.expandDataTableFooterDrawer,.dataTable', function (page) { page.load("?" + urlBase + "#" + generalParams + "&module=Ecommerce&action=products&idGoal=ecommerceOrder"); }, done); }); it('should load the ecommerce sales page', function (done) { - expect.screenshot('ecommerce_sales').to.be.captureSelector('.pageWrap,.expandDataTableFooterDrawer', function (page) { + expect.screenshot('ecommerce_sales').to.be.captureSelector('.pageWrap,.expandDataTableFooterDrawer,.dataTable', function (page) { page.load("?" + urlBase + "#" + generalParams + "&module=Ecommerce&action=sales&idGoal=ecommerceOrder"); }, done); }); // Admin user settings (plugins not displayed) it('should load the Manage > Websites admin page correctly', function (done) { - expect.screenshot('admin_manage_websites').to.be.captureSelector('#content', function (page) { + expect.screenshot('admin_manage_websites').to.be.captureSelector('.pageWrap', function (page) { page.load("?" + generalParams + "&module=SitesManager&action=index"); page.evaluate(function () { $('.form-help:contains(UTC time is)').hide(); @@ -383,7 +383,7 @@ describe("UIIntegrationTest", function () { // TODO: Rename to Piwik? }); it('should load the Manage > Users admin page correctly', function (done) { - expect.screenshot('admin_manage_users').to.be.captureSelector('#content', function (page) { + expect.screenshot('admin_manage_users').to.be.captureSelector('.pageWrap', function (page) { page.load("?" + generalParams + "&module=UsersManager&action=index"); // remove token auth which can be random @@ -399,25 +399,25 @@ describe("UIIntegrationTest", function () { // TODO: Rename to Piwik? }); it('should load the user settings admin page correctly', function (done) { - expect.screenshot('admin_user_settings').to.be.captureSelector('#content', function (page) { + expect.screenshot('admin_user_settings').to.be.captureSelector('.pageWrap', function (page) { page.load("?" + generalParams + "&module=UsersManager&action=userSettings"); }, done); }); it('should load the Manage > Tracking Code admin page correctly', function (done) { - expect.screenshot('admin_manage_tracking_code').to.be.captureSelector('#content', function (page) { + expect.screenshot('admin_manage_tracking_code').to.be.captureSelector('.pageWrap', function (page) { page.load("?" + generalParams + "&module=CoreAdminHome&action=trackingCodeGenerator"); }, done); }); it('should load the Settings > General Settings admin page correctly', function (done) { - expect.screenshot('admin_settings_general').to.be.captureSelector('#content', function (page) { + expect.screenshot('admin_settings_general').to.be.captureSelector('.pageWrap', function (page) { page.load("?" + generalParams + "&module=CoreAdminHome&action=generalSettings"); }, done); }); it('should load the Settings > Privacy admin page correctly', function (done) { - expect.screenshot('admin_privacy_settings').to.be.captureSelector('#content,.ui-inline-help', function (page) { + expect.screenshot('admin_privacy_settings').to.be.captureSelector('.pageWrap,.ui-inline-help', function (page) { page.load("?" + generalParams + "&module=PrivacyManager&action=privacySettings"); }, done); }); @@ -429,43 +429,43 @@ describe("UIIntegrationTest", function () { // TODO: Rename to Piwik? }); it('should load the Settings > Mobile Messaging admin page correctly', function (done) { - expect.screenshot('admin_settings_mobilemessaging').to.be.captureSelector('#content', function (page) { + expect.screenshot('admin_settings_mobilemessaging').to.be.captureSelector('.pageWrap', function (page) { page.load("?" + generalParams + "&module=MobileMessaging&action=index"); }, done); }); it('should load the Settings > Mobile Messaging user page correctly', function (done) { - expect.screenshot('user_settings_mobilemessaging').to.be.captureSelector('#content', function (page) { + expect.screenshot('user_settings_mobilemessaging').to.be.captureSelector('.pageWrap', function (page) { page.load("?" + generalParams + "&module=MobileMessaging&action=userSettings"); }, done); }); it('should load the themes admin page correctly', function (done) { - expect.screenshot('admin_themes').to.be.captureSelector('#content', function (page) { + expect.screenshot('admin_themes').to.be.captureSelector('.pageWrap', function (page) { page.load("?" + generalParams + "&module=CorePluginsAdmin&action=themes"); }, done); }); it('should load the plugins admin page correctly', function (done) { - expect.screenshot('admin_plugins').to.be.captureSelector('#content', function (page) { + expect.screenshot('admin_plugins').to.be.captureSelector('.pageWrap', function (page) { page.load("?" + generalParams + "&module=CorePluginsAdmin&action=plugins"); }, done); }); it('should load the plugin settings admin page correctly', function (done) { - expect.screenshot('admin_plugin_settings').to.be.captureSelector('#content', function (page) { + expect.screenshot('admin_plugin_settings').to.be.captureSelector('.pageWrap', function (page) { page.load("?" + generalParams + "&module=CoreAdminHome&action=adminPluginSettings"); }, done); }); it('should load the plugin settings user page correctly', function (done) { - expect.screenshot('user_plugin_settings').to.be.captureSelector('#content', function (page) { + expect.screenshot('user_plugin_settings').to.be.captureSelector('.pageWrap', function (page) { page.load("?" + generalParams + "&module=CoreAdminHome&action=userPluginSettings"); }, done); }); it('should load the Settings > Visitor Generator admin page correctly', function (done) { - expect.screenshot('admin_visitor_generator').to.be.captureSelector('#content', function (page) { + expect.screenshot('admin_visitor_generator').to.be.captureSelector('.pageWrap', function (page) { page.load("?" + generalParams + "&module=VisitorGenerator&action=index"); page.evaluate(function () { @@ -477,7 +477,7 @@ describe("UIIntegrationTest", function () { // TODO: Rename to Piwik? // Notifications it('should load the notifications page correctly', function (done) { - expect.screenshot('notifications').to.be.captureSelector('#content', function (page) { + expect.screenshot('notifications').to.be.captureSelector('.pageWrap', function (page) { page.load("?" + generalParams + "&module=ExampleUI&action=notifications&idSite=1&period=day&date=yesterday"); page.evaluate(function () { $('#header').hide(); @@ -517,20 +517,20 @@ describe("UIIntegrationTest", function () { // TODO: Rename to Piwik? // CustomAlerts plugin TODO: move to CustomAlerts plugin it('should load the custom alerts list correctly', function (done) { - expect.screenshot('customalerts_list').to.be.captureSelector('#content', function (page) { + expect.screenshot('customalerts_list').to.be.captureSelector('.pageWrap', function (page) { page.load("?" + generalParams + "&module=CustomAlerts&action=index&idSite=1&period=day&date=yesterday&tests_hide_piwik_version=1"); }, done); }); it('should load the triggered custom alerts list correctly', function (done) { - expect.screenshot('customalerts_list_triggered').to.be.captureSelector('#content', function (page) { + expect.screenshot('customalerts_list_triggered').to.be.captureSelector('.pageWrap', function (page) { page.load("?" + generalParams + "&module=CustomAlerts&action=historyTriggeredAlerts&idSite=1&period=day&date=yesterday&tests_hide_piwik_version=1"); }, done); }); // top bar pages it('should load the widgets listing page correctly', function (done) { - expect.screenshot('widgets_listing').to.be.captureSelector('#content', function (page) { + expect.screenshot('widgets_listing').to.be.captureSelector('.pageWrap', function (page) { page.load("?" + generalParams + "&module=Widgetize&action=index"); page.mouseMove('.widgetpreview-categorylist>li:contains(Visits Summary)'); page.mouseMove('li[uniqueid=widgetVisitsSummarygetEvolutionGraphcolumnsArray]'); @@ -538,7 +538,7 @@ describe("UIIntegrationTest", function () { // TODO: Rename to Piwik? }); it('should load the API listing page correctly', function (done) { - expect.screenshot('api_listing').to.be.captureSelector('#content', function (page) { + expect.screenshot('api_listing').to.be.captureSelector('.pageWrap', function (page) { page.load("?" + generalParams + "&module=API&action=listAllAPI"); page.evaluate(function () { // remove token_auth since it can change on each test run $('span#token_auth>strong').text('dummytokenauth'); @@ -547,7 +547,7 @@ describe("UIIntegrationTest", function () { // TODO: Rename to Piwik? }); it('should load the email reports page correctly', function (done) { - expect.screenshot('email_reports').to.be.captureSelector('#content', function (page) { + expect.screenshot('email_reports').to.be.captureSelector('.pageWrap', function (page) { page.load("?" + generalParams + "&module=ScheduledReports&action=index"); page.evaluate(function () { $('#header').hide(); @@ -556,7 +556,7 @@ describe("UIIntegrationTest", function () { // TODO: Rename to Piwik? }); it('should load the feedback form when the feedback form link is clicked', function (done) { - expect.screenshot('feedback_form').to.be.captureSelector('#content', function (page) { + expect.screenshot('feedback_form').to.be.captureSelector('.pageWrap', function (page) { page.load("?" + generalParams + "&module=Feedback&action=index"); @@ -577,11 +577,8 @@ describe("UIIntegrationTest", function () { // TODO: Rename to Piwik? it('should reload to the correct date when a date range is selected in the period selector', function (done) { expect.screenshot('period_select_date_range_click').to.be.capture(function (page) { page.load("?" + urlBase + "#" + generalParams + "&module=VisitTime&action=index"); - page.evaluate(function () { - $(document).ready(function () { - $('#date').click(); - }); - }); + page.wait(1000); + page.click('#date.title'); // we need to make sure there to wait for a bit till date is opened and period selected page.click('#period_id_range'); page.evaluate(function () { diff --git a/tests/lib/screenshot-testing/support/page-renderer.js b/tests/lib/screenshot-testing/support/page-renderer.js index 3a0ef301d0..c3486ddae5 100644 --- a/tests/lib/screenshot-testing/support/page-renderer.js +++ b/tests/lib/screenshot-testing/support/page-renderer.js @@ -137,6 +137,8 @@ PageRenderer.prototype._sendMouseEvent = function (type, pos, callback) { PageRenderer.prototype._click = function (selector, modifiers, callback) { var position = this._getPosition(selector); + this._makeSurePositionIsInViewPort(position.x, position.y); + if (modifiers.length) { var self = this; modifiers = modifiers.reduce(function (previous, mStr) { @@ -152,6 +154,46 @@ PageRenderer.prototype._click = function (selector, modifiers, callback) { callback(); }; +PageRenderer.prototype._makeSurePositionIsInViewPort = function (width, height) { + + var currentWidth = this._getViewportWidth(); + var currentHeight = this._getViewportHeight(); + + var update = false; + + if (width && width > 0 && width >= currentWidth) { + currentWidth = width + 50; + update = true; + } + + if (height && height > 0 && height >= currentHeight) { + currentHeight = height + 50; + update = true; + } + + if (update) { + this._setCorrectViewportSize({width: currentWidth, height: currentHeight}); + } +}; + +PageRenderer.prototype._getViewportWidth = function () { + var width = 1350; + if (this._viewportSizeOverride && this._viewportSizeOverride.width) { + width = this._viewportSizeOverride.width; + } + + return width; +}; + +PageRenderer.prototype._getViewportHeight = function () { + var height = 768; + if (this._viewportSizeOverride && this._viewportSizeOverride.height) { + height = this._viewportSizeOverride.height; + } + + return height; +}; + PageRenderer.prototype._keypress = function (keys, callback) { this.webpage.sendEvent('keypress', keys); @@ -574,8 +616,10 @@ PageRenderer.prototype._waitForNextEvent = function (events, callback, i, waitTi }, waitTime); }; -PageRenderer.prototype._setCorrectViewportSize = function () { - var viewportSize = this._viewportSizeOverride || {width:1350, height:768}; +PageRenderer.prototype._setCorrectViewportSize = function (viewportSize) { + if (!viewportSize) { + viewportSize = {width: this._getViewportWidth(), height: this._getViewportHeight()}; + } this.webpage.viewportSize = viewportSize; var height = Math.max(viewportSize.height, this.webpage.evaluate(function() { diff --git a/tests/resources/screenshot-override/override.css b/tests/resources/screenshot-override/override.css index 9616c5acb8..f74ae3545f 100644 --- a/tests/resources/screenshot-override/override.css +++ b/tests/resources/screenshot-override/override.css @@ -1,5 +1,5 @@ -#header_message>.header_short { - display:none; +#header_message>.title { + visibility: hidden; } .visitor-profile-widget-link>strong { -- GitLab