diff --git a/core/Menu/MenuAdmin.php b/core/Menu/MenuAdmin.php index 13e84805967c0eed3b95c608614e15e98f99462b..53350912852b29e30f87235b0734b1349a7c79e5 100644 --- a/core/Menu/MenuAdmin.php +++ b/core/Menu/MenuAdmin.php @@ -117,7 +117,7 @@ class MenuAdmin extends MenuAbstract */ public function addManageItem($menuName, $url, $order = 50, $tooltip = false) { - $this->addItem('CoreAdminHome_MenuManage', $menuName, $url, $order, $tooltip); + $this->addItem('CoreAdminHome_Administration', $menuName, $url, $order, $tooltip); } /** @@ -143,29 +143,6 @@ class MenuAdmin extends MenuAbstract return parent::getMenu(); } - /** - * Returns the current AdminMenu name - * - * @return boolean - */ - public function getCurrentAdminMenuName() - { - $menu = MenuAdmin::getInstance()->getMenu(); - $currentModule = Piwik::getModule(); - $currentAction = Piwik::getAction(); - foreach ($menu as $submenu) { - foreach ($submenu as $subMenuName => $parameters) { - if (strpos($subMenuName, '_') !== 0 && - $parameters['_url']['module'] == $currentModule - && $parameters['_url']['action'] == $currentAction - ) { - return $subMenuName; - } - } - } - return false; - } - /** * @deprecated since version 2.4.0. See {@link Piwik\Plugin\Menu} for new implementation. */ diff --git a/core/Menu/MenuUser.php b/core/Menu/MenuUser.php index 758ac3d578c5877050b8d421ad600ff0052621ad..ac3bc295abf6182e89a7770e04271b8aa46f2d31 100755 --- a/core/Menu/MenuUser.php +++ b/core/Menu/MenuUser.php @@ -31,6 +31,20 @@ namespace Piwik\Menu; class MenuUser extends MenuAbstract { + /** + * See {@link add()}. Adds a new menu item to the manage section of the user menu. + * @param string $menuName + * @param array $url + * @param int $order + * @param bool|string $tooltip + * @api + * @since 2.5.0 + */ + public function addPersonalItem($menuName, $url, $order = 50, $tooltip = false) + { + $this->addItem('UsersManager_MenuPersonal', $menuName, $url, $order, $tooltip); + } + /** * See {@link add()}. Adds a new menu item to the manage section of the user menu. * @param string $menuName diff --git a/core/Plugin/ControllerAdmin.php b/core/Plugin/ControllerAdmin.php index 23184caa8f16d757330e9fbc60421f7d50bcd864..b0c86a6b1a098c83db1b82899d22ce042d2508ca 100644 --- a/core/Plugin/ControllerAdmin.php +++ b/core/Plugin/ControllerAdmin.php @@ -148,7 +148,6 @@ abstract class ControllerAdmin extends Controller * - **statisticsNotRecorded** - Set to true if the `[Tracker] record_statistics` INI * config is `0`. If not `0`, this variable will not be defined. * - **topMenu** - The result of `MenuTop::getInstance()->getMenu()`. - * - **currentAdminMenuName** - The currently selected admin menu name. * - **enableFrames** - The value of the `[General] enable_framed_pages` INI config option. If * true, {@link Piwik\View::setXFrameOptions()} is called on the view. * - **isSuperUser** - Whether the current user is a superuser or not. @@ -170,7 +169,6 @@ abstract class ControllerAdmin extends Controller $view->topMenu = MenuTop::getInstance()->getMenu(); $view->userMenu = MenuUser::getInstance()->getMenu(); - $view->currentAdminMenuName = MenuAdmin::getInstance()->getCurrentAdminMenuName(); $view->isDataPurgeSettingsEnabled = self::isDataPurgeSettingsEnabled(); $enableFrames = PiwikConfig::getInstance()->General['enable_framed_settings']; diff --git a/core/Settings/Manager.php b/core/Settings/Manager.php index bbe696792bcca96845fab0db241c2785c004ee75..f3862989e10f2f62fdcdb22575de6338d5d2a5ea 100644 --- a/core/Settings/Manager.php +++ b/core/Settings/Manager.php @@ -102,22 +102,57 @@ class Manager return $settingsForUser; } - public static function hasPluginSettingsForCurrentUser($pluginName) + public static function hasSystemPluginSettingsForCurrentUser($pluginName) { - $pluginNames = array_keys(static::getPluginSettingsForCurrentUser()); + $pluginNames = static::getPluginNamesHavingSystemSettings(); return in_array($pluginName, $pluginNames); } /** - * Detects whether there are settings for activated plugins available that the current user can change. + * Detects whether there are user settings for activated plugins available that the current user can change. * * @return bool */ - public static function hasPluginsSettingsForCurrentUser() + public static function hasUserPluginsSettingsForCurrentUser() { $settings = static::getPluginSettingsForCurrentUser(); + foreach ($settings as $setting) { + foreach ($setting->getSettingsForCurrentUser() as $set) { + if ($set instanceof UserSetting) { + return true; + } + } + } + + return false; + } + + public static function getPluginNamesHavingSystemSettings() + { + $settings = static::getPluginSettingsForCurrentUser(); + $plugins = array(); + + foreach ($settings as $pluginName => $setting) { + foreach ($setting->getSettingsForCurrentUser() as $set) { + if ($set instanceof SystemSetting) { + $plugins[] = $pluginName; + } + } + } + + return array_unique($plugins); + } + /** + * Detects whether there are system settings for activated plugins available that the current user can change. + * + * @return bool + */ + public static function hasSystemPluginsSettingsForCurrentUser() + { + $settings = static::getPluginNamesHavingSystemSettings(); + return !empty($settings); } diff --git a/plugins/API/templates/listAllAPI.twig b/plugins/API/templates/listAllAPI.twig index e4cf96174ca67f777c8718ed4d22b749ca25db48..4bf0c04600571ca42f194e2c0f9a0cd64f3abdf8 100644 --- a/plugins/API/templates/listAllAPI.twig +++ b/plugins/API/templates/listAllAPI.twig @@ -1,28 +1,27 @@ -{% extends 'dashboard.twig' %} -{% set showMenu=false %} +{% extends 'user.twig' %} {% block content %} -{% include "@CoreHome/_siteSelectHeader.twig" %} +<div> -<div class="page_api pageWrap"> + <h2>{{ 'API_QuickDocumentationTitle'|translate }}</h2> + + {% include "@CoreHome/_siteSelectHeader.twig" %} <div class="top_controls"> {% include "@CoreHome/_periodSelect.twig" %} </div> - <h2>{{ 'API_QuickDocumentationTitle'|translate }}</h2> - <p>{{ 'API_PluginDescription'|translate }}</p> <p> - <strong>{{ 'API_MoreInformation'|translate("<a target='_blank' href='?module=Proxy&action=redirect&url=http://piwik.org/docs/analytics-api'>","</a>","<a target='_blank' href='?module=Proxy&action=redirect&url=http://piwik.org/docs/analytics-api/reference'>","</a>")|raw }}</strong> + {{ 'API_MoreInformation'|translate("<a target='_blank' href='?module=Proxy&action=redirect&url=http://piwik.org/docs/analytics-api'>","</a>","<a target='_blank' href='?module=Proxy&action=redirect&url=http://piwik.org/docs/analytics-api/reference'>","</a>")|raw }} </p> <h2>{{ 'API_UserAuthentication'|translate }}</h2> <p> - {{ 'API_UsingTokenAuth'|translate('<b>','</b>',"")|raw }}<br/> + {{ 'API_UsingTokenAuth'|translate('','',"")|raw }}<br/> <span id='token_auth'>&token_auth=<strong>{{ token_auth }}</strong></span><br/> {{ 'API_KeepTokenSecret'|translate('<b>','</b>')|raw }} {{ list_api_methods_with_links|raw }} diff --git a/plugins/CoreAdminHome/Controller.php b/plugins/CoreAdminHome/Controller.php index c03577e5e5fed054296b3034429ab17b8e4ae496..96a788b0647c68348a526928884f6010afc8857b 100644 --- a/plugins/CoreAdminHome/Controller.php +++ b/plugins/CoreAdminHome/Controller.php @@ -25,6 +25,8 @@ use Piwik\Plugins\LanguagesManager\LanguagesManager; use Piwik\Plugins\PrivacyManager\DoNotTrackHeaderChecker; use Piwik\Plugins\SitesManager\API as APISitesManager; use Piwik\Settings\Manager as SettingsManager; +use Piwik\Settings\SystemSetting; +use Piwik\Settings\UserSetting; use Piwik\Site; use Piwik\Tracker\IgnoreCookie; use Piwik\Url; @@ -45,7 +47,7 @@ class Controller extends \Piwik\Plugin\ControllerAdmin public function generalSettings() { - Piwik::checkUserHasSomeAdminAccess(); + Piwik::checkUserHasSuperUserAccess(); $view = new View('@CoreAdminHome/generalSettings'); if (Piwik::hasUserSuperUserAccess()) { @@ -69,7 +71,53 @@ class Controller extends \Piwik\Plugin\ControllerAdmin return $view->render(); } - public function pluginSettings() + public function adminPluginSettings() + { + Piwik::checkUserHasSuperUserAccess(); + + $settings = $this->getPluginSettings(); + + $vars = array( + 'nonce' => Nonce::getNonce(static::SET_PLUGIN_SETTINGS_NONCE), + 'pluginsSettings' => $this->getSettingsByType($settings, 'admin'), + 'firstSuperUserSettingNames' => $this->getFirstSuperUserSettingNames($settings), + 'mode' => 'admin' + ); + + return $this->renderTemplate('pluginSettings', $vars); + } + + /** + * @param \Piwik\Plugin\Settings[] $pluginsSettings + * @return array array([pluginName] => []) + */ + private function getSettingsByType($pluginsSettings, $mode) + { + $byType = array(); + + foreach ($pluginsSettings as $pluginName => $pluginSettings) { + $settings = array(); + + foreach ($pluginSettings->getSettingsForCurrentUser() as $setting) { + if ('admin' === $mode && $setting instanceof SystemSetting) { + $settings[] = $setting; + } elseif ('user' === $mode && $setting instanceof UserSetting) { + $settings[] = $setting; + } + } + + if (!empty($settings)) { + $byType[$pluginName] = array( + 'introduction' => $pluginSettings->getIntroduction(), + 'settings' => $settings + ); + } + } + + return $byType; + } + + public function userPluginSettings() { Piwik::checkUserIsNotAnonymous(); @@ -77,8 +125,9 @@ class Controller extends \Piwik\Plugin\ControllerAdmin $vars = array( 'nonce' => Nonce::getNonce(static::SET_PLUGIN_SETTINGS_NONCE), - 'pluginSettings' => $settings, - 'firstSuperUserSettingNames' => $this->getFirstSuperUserSettingNames($settings) + 'pluginsSettings' => $this->getSettingsByType($settings, 'user'), + 'firstSuperUserSettingNames' => $this->getFirstSuperUserSettingNames($settings), + 'mode' => 'user' ); return $this->renderTemplate('pluginSettings', $vars); diff --git a/plugins/CoreAdminHome/Menu.php b/plugins/CoreAdminHome/Menu.php index 17be9db0e0713e9a14089a7ee11b3483fa121f1f..57dd069a9f1d5e79cb5471dccbbe07a3a3678d4a 100644 --- a/plugins/CoreAdminHome/Menu.php +++ b/plugins/CoreAdminHome/Menu.php @@ -28,17 +28,16 @@ class Menu extends \Piwik\Plugin\Menu $menu->addDiagnosticItem(null, "", $order = 10); $menu->addDevelopmentItem(null, "", $order = 15); - $menu->addSettingsItem('General_General', - $this->urlForAction('generalSettings'), - $order = 6); - $menu->addManageItem('CoreAdminHome_TrackingCode', - $this->urlForAction('trackingCodeGenerator'), - $order = 10); + if (Piwik::hasUserSuperUserAccess()) { + $menu->addSettingsItem('General_General', + $this->urlForAction('generalSettings'), + $order = 6); + } } - if (SettingsManager::hasPluginsSettingsForCurrentUser()) { + if (Piwik::hasUserSuperUserAccess() && SettingsManager::hasSystemPluginsSettingsForCurrentUser()) { $menu->addSettingsItem('General_Plugins', - $this->urlForAction('pluginSettings'), + $this->urlForAction('adminPluginSettings'), $order = 7); } } @@ -46,7 +45,26 @@ class Menu extends \Piwik\Plugin\Menu public function configureTopMenu(MenuTop $menu) { if (Piwik::isUserHasSomeAdminAccess()) { - $menu->addItem('CoreAdminHome_Administration', null, $this->urlForAction('generalSettings'), 10); + $url = $this->urlForModuleAction('SitesManager', 'index'); + + if (Piwik::hasUserSuperUserAccess()) { + $url = $this->urlForAction('generalSettings'); + } + + $menu->addItem('CoreAdminHome_Administration', null, $url, 10); + } + } + + public function configureUserMenu(MenuUser $menu) + { + $menu->addManageItem('CoreAdminHome_TrackingCode', + $this->urlForAction('trackingCodeGenerator'), + $order = 10); + + if (SettingsManager::hasUserPluginsSettingsForCurrentUser()) { + $menu->addPersonalItem('CoreAdminHome_PluginSettings', + $this->urlForAction('userPluginSettings'), + $order = 15); } } diff --git a/plugins/CoreAdminHome/lang/en.json b/plugins/CoreAdminHome/lang/en.json index a1c0307b48c776c46fa5ae5871164815c573c357..b6904ae5e6ca2b1c90aa3ab8dc6a4fe2ba137094 100644 --- a/plugins/CoreAdminHome/lang/en.json +++ b/plugins/CoreAdminHome/lang/en.json @@ -63,6 +63,7 @@ "OptOutExplanationBis": "This code will display an Iframe containing a link for your visitors to opt-out of Piwik by setting an opt-out cookie in their browsers. %s Click here%s to view the content that will be displayed by the iFrame.", "OptOutForYourVisitors": "Piwik opt-out for your visitors", "PiwikIsInstalledAt": "Piwik is installed at", + "PersonalPluginSettings": "Personal Plugin Settings", "PluginDescription": "Administration area of Piwik.", "PluginSettingChangeNotAllowed": "You are not allowed to change the value of the setting \"%s\" in plugin \"%s\"", "PluginSettingReadNotAllowed": "You are not allowed to read the value of the setting \"%s\" in plugin \"%s\"", @@ -73,6 +74,7 @@ "SendPluginUpdateCommunication": "Send me an email notification when there is a new plugin update", "SendPluginUpdateCommunicationHelp": "An email will be sent to Super Users when there is a new version available for a plugin.", "StableReleases": "If Piwik is a critical part of your business, we recommend you use the latest stable release. If you use the latest beta and you find a bug or have a suggestion, please %ssee here%s.", + "SystemPluginSettings": "System Plugin Settings", "TrackAGoal": "Track a goal", "TrackingCode": "Tracking Code", "TrustedHostConfirm": "Are you sure you want to change the trusted Piwik hostname?", diff --git a/plugins/CoreAdminHome/stylesheets/generalSettings.less b/plugins/CoreAdminHome/stylesheets/generalSettings.less index 4e7dbec7cb921db7482cf5f85479c0e00040e20d..076d7600094fd80317f2db398449347138349f23 100644 --- a/plugins/CoreAdminHome/stylesheets/generalSettings.less +++ b/plugins/CoreAdminHome/stylesheets/generalSettings.less @@ -7,6 +7,11 @@ text-decoration: underline; } +.admin h2 + .top_bar_sites_selector { + margin-top: -62px; + margin-right: 0px !important; +} + #content.admin { margin: 0 0 0 260px; padding: 0 0 40px; @@ -16,6 +21,7 @@ .admin #header_message { margin-top: 10px; + margin-right: 10px; } table.admin { @@ -138,6 +144,10 @@ table.admin tbody td:hover, table.admin tbody th:hover { margin-left: 50px; } +.adminTable .columnHelp .ui-inline-help { + margin-left: 0px; +} + /* other styles */ .form-description { color: @theme-color-text-lighter; diff --git a/plugins/CoreAdminHome/stylesheets/menu.less b/plugins/CoreAdminHome/stylesheets/menu.less index 79c98e228b9828025fe12a6225fe5c6c6d4e331c..cb6f3a6eaf18ce8aaeee07a00ac6cc0954adf8af 100644 --- a/plugins/CoreAdminHome/stylesheets/menu.less +++ b/plugins/CoreAdminHome/stylesheets/menu.less @@ -21,6 +21,7 @@ margin-top: 0.1em; border: 1px solid #ddd; border-radius: 5px; + border-left: 0px; } .Menu--admin > .Menu-tabList li { diff --git a/plugins/CoreAdminHome/templates/_menu.twig b/plugins/CoreAdminHome/templates/_menu.twig index 5ec9b95cbd621b66496374b9de2c9f45cdc258b2..080f36e93c1ee47da52ccaba31992889b78adecf 100644 --- a/plugins/CoreAdminHome/templates/_menu.twig +++ b/plugins/CoreAdminHome/templates/_menu.twig @@ -1,23 +1,3 @@ -{% if adminMenu|length > 1 %} - <div class="Menu Menu--admin"> - <ul class="Menu-tabList"> - {% for name,submenu in adminMenu %} - {% 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 }}' - {% if currentAdminMenuName is defined and sname==currentAdminMenuName %}class='active'{% endif %}>{{ sname|translate }}</a> - </li> - {% endif %} - {% endfor %} - </ul> - </li> - {% endif %} - {% endfor %} - </ul> - </div> -{% endif %} +{% import '@CoreHome/macros.twig' as corehome %} + +{{ corehome.sidebarMenu(adminMenu, currentModule, currentAction) }} \ No newline at end of file diff --git a/plugins/CoreAdminHome/templates/generalSettings.twig b/plugins/CoreAdminHome/templates/generalSettings.twig index 5ee3f9138903a937e227c11e9f900a759bde1eeb..1a1497ada5e34d9987eb0e549e4e03d8cb96cac1 100644 --- a/plugins/CoreAdminHome/templates/generalSettings.twig +++ b/plugins/CoreAdminHome/templates/generalSettings.twig @@ -335,16 +335,5 @@ </p> {% endif %} {% endif %} -<h2>{{ 'CoreAdminHome_OptOutForYourVisitors'|translate }}</h2> - -<p>{{ 'CoreAdminHome_OptOutExplanation'|translate }} - {% set optOutUrl %}{{ piwikUrl }}index.php?module=CoreAdminHome&action=optOut&language={{ language }}{% endset %} - {% set iframeOptOut %} - <iframe style="border: 0; height: 200px; width: 600px;" src="{{ optOutUrl }}"></iframe> - {% endset %} - <code>{{ iframeOptOut|escape }}</code> - <br/> - {{ 'CoreAdminHome_OptOutExplanationBis'|translate("<a href='" ~ optOutUrl ~ "' rel='noreferrer' target='_blank'>","</a>")|raw }} -</p> {% endblock %} diff --git a/plugins/CoreAdminHome/templates/pluginSettings.twig b/plugins/CoreAdminHome/templates/pluginSettings.twig index fa1e032ea8f12fad7af445993423ee30fd9e565e..bf9443537e0b8fc570679ea8e824fccd2bd2b3a7 100644 --- a/plugins/CoreAdminHome/templates/pluginSettings.twig +++ b/plugins/CoreAdminHome/templates/pluginSettings.twig @@ -1,4 +1,4 @@ -{% extends 'admin.twig' %} +{% extends mode == 'user' ? "user.twig" : "admin.twig" %} {% block content %} @@ -6,38 +6,36 @@ {% import 'macros.twig' as piwik %} {% import 'ajaxMacros.twig' as ajax %} + {% if mode == 'user' %} + <h2 piwik-enriched-headline>{{ 'CoreAdminHome_PersonalPluginSettings'|translate }}</h2> + {% else %} + <h2 piwik-enriched-headline>{{ 'CoreAdminHome_SystemPluginSettings'|translate }}</h2> + {% endif %} + <p> {{ 'CoreAdminHome_PluginSettingsIntro'|translate }} - {% for pluginName, settings in pluginSettings %} + {% for pluginName, settings in pluginsSettings %} <a href="#{{ pluginName|e('html_attr') }}">{{ pluginName }}</a>{% if not loop.last %}, {% endif %} {% endfor %} </p> <input type="hidden" name="setpluginsettingsnonce" value="{{ nonce }}"> - {% for pluginName, settings in pluginSettings %} + {% for pluginName, pluginSettings in pluginsSettings %} <h2 id="{{ pluginName|e('html_attr') }}">{{ pluginName }}</h2> - {% if settings.getIntroduction %} + {% if pluginSettings.introduction %} <p class="pluginIntroduction"> - {{ settings.getIntroduction }} + {{ pluginSettings.introduction }} </p> {% endif %} <table class="adminTable" id="pluginSettings" data-pluginname="{{ pluginName|e('html_attr') }}"> - {% for name, setting in settings.getSettingsForCurrentUser %} + {% for name, setting in pluginSettings.settings %} {% set settingValue = setting.getValue %} - {% if pluginName in firstSuperUserSettingNames|keys and name == firstSuperUserSettingNames[pluginName] %} - <tr> - <td colspan="3"> - <h3 class="superUserSettings">{{ 'MobileMessaging_Settings_SuperAdmin'|translate }}</h3> - </td> - </tr> - {% endif %} - {% if setting.introduction %} <tr> <td colspan="3"> diff --git a/plugins/CoreAdminHome/templates/trackingCodeGenerator.twig b/plugins/CoreAdminHome/templates/trackingCodeGenerator.twig index bd54182b769f085cbc0011030b07711de5fecbb4..51d48ebe3fed055236ad28a519f203226f789596 100644 --- a/plugins/CoreAdminHome/templates/trackingCodeGenerator.twig +++ b/plugins/CoreAdminHome/templates/trackingCodeGenerator.twig @@ -1,4 +1,4 @@ -{% extends 'admin.twig' %} +{% extends 'user.twig' %} {% block head %} {{ parent() }} @@ -13,7 +13,7 @@ feature-name="{{ 'CoreAdminHome_TrackingCode'|translate }}" help-url="http://piwik.org/docs/tracking-api/">{{ 'CoreAdminHome_JavaScriptTracking'|translate }}</h2> -<div id="js-code-options" class="adminTable"> +<div id="js-code-options"> <p> {{ 'CoreAdminHome_JSTrackingIntro1'|translate }} @@ -201,7 +201,7 @@ <h2 id="image-tracking-link">{{ 'CoreAdminHome_ImageTracking'|translate }}</h2> -<div id="image-tracking-code-options" class="adminTable"> +<div id="image-tracking-code-options"> <p> {{ 'CoreAdminHome_ImageTrackingIntro1'|translate }} {{ 'CoreAdminHome_ImageTrackingIntro2'|translate("<em><noscript></noscript></em>")|raw }} diff --git a/plugins/CoreHome/CoreHome.php b/plugins/CoreHome/CoreHome.php index 23e1fe093b70b77057c3c7953c24ecb5f5cb8598..283f4bbf2bf0ebf5f5c82c04e9d2cfc3fe51beb9 100644 --- a/plugins/CoreHome/CoreHome.php +++ b/plugins/CoreHome/CoreHome.php @@ -99,6 +99,7 @@ class CoreHome extends \Piwik\Plugin $jsFiles[] = "plugins/Morpheus/javascripts/ajaxHelper.js"; $jsFiles[] = "plugins/Morpheus/javascripts/jquery.icheck.min.js"; $jsFiles[] = "plugins/Morpheus/javascripts/morpheus.js"; + $jsFiles[] = "plugins/Morpheus/javascripts/layout.js"; $jsFiles[] = "plugins/CoreHome/javascripts/require.js"; $jsFiles[] = "plugins/CoreHome/javascripts/uiControl.js"; $jsFiles[] = "plugins/CoreHome/javascripts/dataTable.js"; diff --git a/plugins/CoreHome/Menu.php b/plugins/CoreHome/Menu.php index 08426cf7964242cfed0c6db5791ee4948eb3ac42..6881b689dabab71d93cd5c07a2d62c4d1f5ecd96 100644 --- a/plugins/CoreHome/Menu.php +++ b/plugins/CoreHome/Menu.php @@ -12,25 +12,36 @@ use Piwik\Db; use Piwik\Menu\MenuTop; use Piwik\Menu\MenuUser; use Piwik\Piwik; +use Piwik\Plugins\UsersManager\API as APIUsersManager; class Menu extends \Piwik\Plugin\Menu { - public function configureUserMenu(MenuUser $menu) + public function configureTopMenu(MenuTop $menu) { - if (!Piwik::isUserIsAnonymous()) { - $module = $this->getLoginModule(); - $menu->addItem('General_Logout', null, array('module' => $module, 'action' => 'logout', 'idSite' => null), 999); + $login = Piwik::getCurrentUserLogin(); + $user = APIUsersManager::getInstance()->getUser($login); + + if (!empty($user['alias'])) { + $login = $user['alias']; } - } - public function configureTopMenu(MenuTop $menu) - { + $menu->addItem($login, null, array('module' => 'UsersManager', 'action' => 'userSettings'), 998); + + $module = $this->getLoginModule(); if (Piwik::isUserIsAnonymous()) { - $module = $this->getLoginModule(); $menu->addItem('Login_LogIn', null, array('module' => $module), 999); + } else { + $menu->addItem('General_Logout', null, array('module' => $module, 'action' => 'logout', 'idSite' => null), 999); } } + public function configureUserMenu(MenuUser $menu) + { + $menu->addPersonalItem(null, array(), 1, false); + $menu->addManageItem(null, array(), 2, false); + $menu->addPlatformItem(null, array(), 3, false); + } + private function getLoginModule() { return Piwik::getLoginPluginName(); diff --git a/plugins/CoreHome/angularjs/notification/notification.directive.less b/plugins/CoreHome/angularjs/notification/notification.directive.less index bc3c5e3f5fd6922bde7bec2b6c56240022c6e9d4..87630d0c333572f72a7d1430e4c81ea2534b4bca 100644 --- a/plugins/CoreHome/angularjs/notification/notification.directive.less +++ b/plugins/CoreHome/angularjs/notification/notification.directive.less @@ -1,3 +1,9 @@ +.admin .system.notification { + a { + color: #9b7a44; + } +} + .system.notification { color: #9b7a44; float: none; diff --git a/plugins/CoreHome/angularjs/siteselector/siteselector.directive.less b/plugins/CoreHome/angularjs/siteselector/siteselector.directive.less index 5787d058a709a43bae2525ab478f9d24944a2acf..7c7ea202945e730a92388a5636cc653e1c1d83ca 100644 --- a/plugins/CoreHome/angularjs/siteselector/siteselector.directive.less +++ b/plugins/CoreHome/angularjs/siteselector/siteselector.directive.less @@ -7,6 +7,10 @@ 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; } diff --git a/plugins/CoreHome/templates/_topBarTopMenu.twig b/plugins/CoreHome/templates/_topBarTopMenu.twig index 00e75d9813c3e44764f8c23db1c880f1c8ba4712..459ccb611e268f2c116adb1f6f8bf0faa42ca774 100644 --- a/plugins/CoreHome/templates/_topBarTopMenu.twig +++ b/plugins/CoreHome/templates/_topBarTopMenu.twig @@ -1,15 +1,6 @@ <div id="topRightBar"> - {% set helloAlias %} - {% if userAlias is not empty %} - {{ userAlias|raw }} - {% else %} - {{ userLogin|raw }} - {% endif %} - {% endset %} - {% 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)) %} @@ -31,41 +22,16 @@ {% endmacro %} - {% for label,menu in topMenu if menu._order >= 0 and menu._order <= 500 %} - {{ _self.topMenuItem(label, menu, currentModule, currentAction) }} - | - {% endfor %} - - <span class="topBarElem"> - <div id="userMenu" - tooltip="{{ 'General_HelloUser'|translate(helloAlias|trim)|rawSafeDecoded }}" - menu-title="{{ helloAlias|trim }}" - piwik-menudropdown> - - {% for lev1UserLabel,lev1UserMenu in userMenu if lev1UserLabel|slice(0,1) != '_' %} - {% if not loop.first %} - <hr class="item separator"/> - {% endif %} - - {% if lev1UserMenu._hasSubmenu is defined and lev1UserMenu._hasSubmenu %} - {% if lev1UserLabel %} - <a class="item disabled category">{{ lev1UserLabel|translate }}</a> - {% endif %} - - {% for lev2Label,lev2Menu in lev1UserMenu if lev2Label|slice(0,1) != '_' %} - {{ _self.userMenuItem(lev2Label, lev2Menu, currentModule, currentAction) }} - {% endfor %} - {% else %} - {{ _self.userMenuItem(lev1UserLabel, lev1UserMenu, currentModule, currentAction) }} - {% endif %} - - {% endfor %} - </div> - </span> + {% if topMenuModule is not defined %} + {% set topMenuModule = currentModule %} + {% set topMenuAction = currentAction %} + {% endif %} - {% for label,menu in topMenu if menu._order >= 501 %} - | - {{ _self.topMenuItem(label, menu, currentModule, currentAction) }} + {% for label,menu in topMenu %} + {% if not loop.first %} + | + {% endif %} + {{ _self.topMenuItem(label, menu, topMenuModule, topMenuAction) }} {% endfor %} </div> diff --git a/plugins/CoreHome/templates/_userMenu.twig b/plugins/CoreHome/templates/_userMenu.twig new file mode 100644 index 0000000000000000000000000000000000000000..67076af75599094b5cda985a3397371cf0a54db4 --- /dev/null +++ b/plugins/CoreHome/templates/_userMenu.twig @@ -0,0 +1,3 @@ +{% import '@CoreHome/macros.twig' as corehome %} + +{{ corehome.sidebarMenu(userMenu, currentModule, currentAction) }} \ No newline at end of file diff --git a/plugins/CoreHome/templates/macros.twig b/plugins/CoreHome/templates/macros.twig new file mode 100644 index 0000000000000000000000000000000000000000..a1d3d8a27b5b7114be85f48ca11c00b29442a14b --- /dev/null +++ b/plugins/CoreHome/templates/macros.twig @@ -0,0 +1,25 @@ +{% 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 }}' + {% 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/Controller.php b/plugins/CorePluginsAdmin/Controller.php index 71d95730b9f0f2e3c209c7d4401429234c5107ba..e157fbf83f429fadeb5b33ed1198ff255807c694 100644 --- a/plugins/CorePluginsAdmin/Controller.php +++ b/plugins/CorePluginsAdmin/Controller.php @@ -205,6 +205,13 @@ class Controller extends Plugin\ControllerAdmin return $view->render(); } + public function userBrowsePlugins() + { + $view = $this->createBrowsePluginsOrThemesView('browsePlugins', $themesOnly = false); + $view->mode = 'user'; + return $view->render(); + } + private function createPluginsOrThemesView($template, $themesOnly) { Piwik::checkUserHasSuperUserAccess(); @@ -232,7 +239,10 @@ class Controller extends Plugin\ControllerAdmin try { $marketplace = new Marketplace(); $view->marketplacePluginNames = $marketplace->getAvailablePluginNames($themesOnly); - $view->pluginsHavingUpdate = $marketplace->getPluginsHavingUpdate($themesOnly); + + $pluginsHavingUpdate = $marketplace->getPluginsHavingUpdate(true); + $themesHavingUpdate = $marketplace->getPluginsHavingUpdate(false); + $view->pluginsHavingUpdate = $pluginsHavingUpdate + $themesHavingUpdate; } catch(Exception $e) { // curl exec connection error (ie. server not connected to internet) } @@ -395,7 +405,7 @@ class Controller extends Plugin\ControllerAdmin } $message = Piwik::translate('CorePluginsAdmin_SuccessfullyActicated', array($pluginName)); - if (SettingsManager::hasPluginSettingsForCurrentUser($pluginName)) { + if (SettingsManager::hasSystemPluginSettingsForCurrentUser($pluginName)) { $target = sprintf('<a href="index.php%s#%s">', Url::getCurrentQueryStringWithParametersModified(array('module' => 'CoreAdminHome', 'action' => 'pluginSettings')), $pluginName); @@ -472,7 +482,7 @@ class Controller extends Plugin\ControllerAdmin private function getPluginNamesHavingSettingsForCurrentUser() { - return array_keys(SettingsManager::getPluginSettingsForCurrentUser()); + return SettingsManager::getPluginNamesHavingSystemSettings(); } private function tryToRepairPiwik() diff --git a/plugins/CorePluginsAdmin/Menu.php b/plugins/CorePluginsAdmin/Menu.php index 3133bed3e56a0bcc1edf02fffd38586c2411369a..97ec818a59b6703eaa3eb1f4588615b14569ced3 100644 --- a/plugins/CorePluginsAdmin/Menu.php +++ b/plugins/CorePluginsAdmin/Menu.php @@ -25,7 +25,6 @@ class Menu extends \Piwik\Plugin\Menu $isMarketplaceEnabled = CorePluginsAdmin::isMarketplaceEnabled(); $pluginsUpdateMessage = ''; - $themesUpdateMessage = ''; if ($hasSuperUserAcess && $isMarketplaceEnabled) { $marketplace = new Marketplace(); @@ -33,10 +32,7 @@ class Menu extends \Piwik\Plugin\Menu $themesHavingUpdate = $marketplace->getPluginsHavingUpdate($themesOnly = true); if (!empty($pluginsHavingUpdate)) { - $pluginsUpdateMessage = sprintf(' (%d)', count($pluginsHavingUpdate)); - } - if (!empty($themesHavingUpdate)) { - $themesUpdateMessage = sprintf(' (%d)', count($themesHavingUpdate)); + $pluginsUpdateMessage = sprintf(' (%d)', count($pluginsHavingUpdate) + count($themesHavingUpdate)); } } @@ -48,16 +44,13 @@ class Menu extends \Piwik\Plugin\Menu $menu->addManageItem(Piwik::translate('General_Plugins') . $pluginsUpdateMessage, $this->urlForAction('plugins', array('activated' => '')), $order = 4); - $menu->addManageItem(Piwik::translate('CorePluginsAdmin_Themes') . $themesUpdateMessage, - $this->urlForAction('themes', array('activated' => '')), - $order = 5); } - if (Piwik::hasUserSuperUserAccess() && CorePluginsAdmin::isMarketplaceEnabled()) { - $menu->addPlatformItem('CorePluginsAdmin_Marketplace', - $this->urlForAction('browsePlugins', array('activated' => '')), - $order = 5); + if (Piwik::hasUserSuperUserAccess() && CorePluginsAdmin::isMarketplaceEnabled()) { + $menu->addManageItem('CorePluginsAdmin_Marketplace', + $this->urlForAction('browsePlugins', array('activated' => '')), + $order = 12); } } @@ -73,7 +66,7 @@ class Menu extends \Piwik\Plugin\Menu { if ($this->isAllowedToSeeMarketPlace()) { $menu->addPlatformItem('CorePluginsAdmin_Marketplace', - $this->urlForAction('browsePlugins', array('activated' => '')), + $this->urlForAction('userBrowsePlugins', array('activated' => '')), $order = 5); } } diff --git a/plugins/CorePluginsAdmin/lang/en.json b/plugins/CorePluginsAdmin/lang/en.json index 6ce90f0e0fa944c045cfbe261793d767bc5a2f3c..58911b3b6923b6fcf85acd38280eb77338bd26af 100644 --- a/plugins/CorePluginsAdmin/lang/en.json +++ b/plugins/CorePluginsAdmin/lang/en.json @@ -24,6 +24,7 @@ "DoMoreContactPiwikAdmins": "To install a new plugin or a new theme, please get in touch with your Piwik admins.", "EmailToEnquireUpdatedVersion": "Please email %1$s and enquire an updated version of %2$s.", "FeaturedPlugin": "Featured plugin", + "ChangeLookByManageThemes": "You can change the appearance of Piwik by %sManaging Themes%s.", "GetEarlyAccessForPaidPlugins": "Note: all plugins are available for free at present; in the future we will enable Paid Plugins in the Marketplace (%scontact us%s for early access).", "History": "History", "Inactive": "Inactive", diff --git a/plugins/CorePluginsAdmin/stylesheets/marketplace.less b/plugins/CorePluginsAdmin/stylesheets/marketplace.less index 119634da9d186ca5356de6fa1f047111de79d770..ade343711498801ceab9f626152239a0cf17aebe 100644 --- a/plugins/CorePluginsAdmin/stylesheets/marketplace.less +++ b/plugins/CorePluginsAdmin/stylesheets/marketplace.less @@ -84,7 +84,7 @@ float: left; border: 1px solid #dadada; padding: 15px; - background-color: #F6F5F3; + background-color: #f2f2f2; margin-right: 14px; margin-bottom: 15px; position: relative; @@ -138,6 +138,9 @@ .header { margin-top: 0px; margin-bottom: 15px; + h3 { + font-size: 16px; + } } .description { @@ -145,17 +148,21 @@ } .install { float: right; + margin-top: 3px; } .update { .install } h3 .more { - color: @theme-color-text; - } - .more { font-weight: bold; text-decoration: none; - color: @theme-color-link; + &:hover { + text-decoration: underline; + } + } + .more { + text-decoration: underline; + color: @theme-color-text; } .content { margin-bottom: 46px; @@ -229,16 +236,12 @@ .pluginslistActionBar { min-width: 650px; - max-width: 980px; form { display: inline; } .sort { - a { - color: @theme-color-link; - } .active { font-weight: bold; } diff --git a/plugins/CorePluginsAdmin/templates/browsePlugins.twig b/plugins/CorePluginsAdmin/templates/browsePlugins.twig index 9259081a0cf4700238c358d7b07c3c6873d7fb56..068d9e80abee4e58dabe24e580f01542c1897a35 100644 --- a/plugins/CorePluginsAdmin/templates/browsePlugins.twig +++ b/plugins/CorePluginsAdmin/templates/browsePlugins.twig @@ -1,4 +1,4 @@ -{% extends 'admin.twig' %} +{% extends mode is defined and mode == 'user' ? "user.twig" : "admin.twig" %} {% import '@CorePluginsAdmin/macros.twig' as pluginsMacro %} {% block content %} diff --git a/plugins/CorePluginsAdmin/templates/macros.twig b/plugins/CorePluginsAdmin/templates/macros.twig index 3f6ad112c03d7c85988f5b5385eaca1aa1112b24..6eda0a2d315a486c087bba96e40155627f1d3d9e 100644 --- a/plugins/CorePluginsAdmin/templates/macros.twig +++ b/plugins/CorePluginsAdmin/templates/macros.twig @@ -166,7 +166,7 @@ {% if name in pluginNamesHavingSettings %} <br /><br /> - <a href="{{ linkTo({'module':'CoreAdminHome', 'action': 'pluginSettings'}) }}#{{ name|e('html_attr') }}" class="settingsLink">{{ 'General_Settings'|translate }}</a> + <a href="{{ linkTo({'module':'CoreAdminHome', 'action': 'adminPluginSettings'}) }}#{{ name|e('html_attr') }}" class="settingsLink">{{ 'General_Settings'|translate }}</a> {% endif %} </td> <td class="desc"> diff --git a/plugins/CorePluginsAdmin/templates/pluginOverview.twig b/plugins/CorePluginsAdmin/templates/pluginOverview.twig index b6a81cd9019905ba7000a4d832f24416f87193e2..f49d8878ed3281d6dde6322ba40aa939b0bfb1e0 100644 --- a/plugins/CorePluginsAdmin/templates/pluginOverview.twig +++ b/plugins/CorePluginsAdmin/templates/pluginOverview.twig @@ -19,7 +19,7 @@ </h3> <p class="description">{{ plugin.description }} <br /> - <a href="javascript:void(0);" title="{{ 'General_MoreDetails'|translate }}" class="more">>> {{ 'General_MoreLowerCase'|translate }}</a> + <a href="javascript:void(0);" title="{{ 'General_MoreDetails'|translate }}" class="more">› {{ 'General_MoreLowerCase'|translate }}</a> </p> {% if plugin.canBeUpdated %} diff --git a/plugins/CorePluginsAdmin/templates/plugins.twig b/plugins/CorePluginsAdmin/templates/plugins.twig index 4c4b6b1192345084c30be58898fe5745d2d5290b..7249e45488d1d21cc47c766fd0f8e7456d3f6ac3 100644 --- a/plugins/CorePluginsAdmin/templates/plugins.twig +++ b/plugins/CorePluginsAdmin/templates/plugins.twig @@ -3,7 +3,7 @@ {% import '@CorePluginsAdmin/macros.twig' as plugins %} {% block content %} -<div style="max-width:980px;"> +<div> {% if pluginsHavingUpdate|length %} <h2>{{ pluginsHavingUpdate|length }} Update(s) available</h2> @@ -22,6 +22,11 @@ <br/>{{ 'CorePluginsAdmin_DoMoreContactPiwikAdmins'|translate }} {% endif %} + + {% if isMarketplaceEnabled %} + <br /> + {{ 'CorePluginsAdmin_ChangeLookByManageThemes'|translate('<a href="' ~ linkTo({'action': 'themes'}) ~'">', '</a>')|raw }} + {% endif %} </p> {{ plugins.pluginsFilter(false, isMarketplaceEnabled) }} diff --git a/plugins/CorePluginsAdmin/templates/themes.twig b/plugins/CorePluginsAdmin/templates/themes.twig index 5ac8ff6d9a063d5566ca4e761bd611b1c9763d8d..b5e52666d9c4d16f404be49720dfb0bcaea57e94 100644 --- a/plugins/CorePluginsAdmin/templates/themes.twig +++ b/plugins/CorePluginsAdmin/templates/themes.twig @@ -5,14 +5,6 @@ {% block content %} <div style="max-width:980px;"> - {% if pluginsHavingUpdate|length %} - <h2>{{ 'CorePluginsAdmin_NumUpdatesAvailable'|translate(pluginsHavingUpdate|length) }}</h2> - - <p>{{ 'CorePluginsAdmin_InfoThemeUpdateIsRecommended'|translate }}</p> - - {{ plugins.tablePluginUpdates(pluginsHavingUpdate, updateNonce, true) }} - {% endif %} - <h2 piwik-enriched-headline>{{ 'CorePluginsAdmin_ThemesManagement'|translate }}</h2> <p>{{ 'CorePluginsAdmin_ThemesDescription'|translate }} diff --git a/plugins/CustomAlerts b/plugins/CustomAlerts index 9716f8b12f0abd0f9ca99cb343bea19f7e077949..cc0e3c2b00ac7ff3083cd446e1e6a927b3649e56 160000 --- a/plugins/CustomAlerts +++ b/plugins/CustomAlerts @@ -1 +1 @@ -Subproject commit 9716f8b12f0abd0f9ca99cb343bea19f7e077949 +Subproject commit cc0e3c2b00ac7ff3083cd446e1e6a927b3649e56 diff --git a/plugins/Feedback/Menu.php b/plugins/Feedback/Menu.php index acfd55dab1c5f0184ee680ef7419b9d9cddcdd12..19d3f62db5088291796a31bedf378393ba3efe1f 100644 --- a/plugins/Feedback/Menu.php +++ b/plugins/Feedback/Menu.php @@ -15,9 +15,8 @@ class Menu extends \Piwik\Plugin\Menu { public function configureUserMenu(MenuUser $menu) { - $menu->addItem( + $menu->addPlatformItem( 'General_Help', - null, $this->urlForAction('index', array('segment' => false)), $order = 99, $tooltip = Piwik::translate('Feedback_TopLinkTooltip') diff --git a/plugins/Feedback/stylesheets/feedback.less b/plugins/Feedback/stylesheets/feedback.less index 8ac50e8c0b79b25d85fd834ccbd30ca93b494287..3a12cb0365638e3a91b25d25c0dc1d1b5ac546da 100644 --- a/plugins/Feedback/stylesheets/feedback.less +++ b/plugins/Feedback/stylesheets/feedback.less @@ -1,11 +1,4 @@ #feedback-faq { - color: #5e5e5c; - width: 675px; - font-size: 14px; - - strong { - color: #5e5e5c; - } ul { list-style: none; @@ -19,11 +12,6 @@ line-height: 1.7em; } - a { - color: #5176a0; - text-decoration: none; - } - .piwik-donate-call { border: 0px; padding-left: 0px; diff --git a/plugins/Feedback/templates/index.twig b/plugins/Feedback/templates/index.twig index 97a90ee2a3560125e2de831c11c77ca4626caa5c..7cba7e5b26125fe625552c48f8e13d0017767e09 100644 --- a/plugins/Feedback/templates/index.twig +++ b/plugins/Feedback/templates/index.twig @@ -1,11 +1,11 @@ -{% extends 'dashboard.twig' %} +{% extends 'user.twig' %} {% set test_piwikUrl='http://demo.piwik.org/' %} {% set isPiwikDemo %}{{ piwikUrl == 'http://demo.piwik.org/' or piwikUrl == 'https://demo.piwik.org/'}}{% endset %} {% block content %} - <div id="feedback-faq" class="admin centerLargeDiv"> + <div id="feedback-faq" class="admin"> <h2 piwik-enriched-headline feature-name="{{ 'General_Help'|translate }}" >{{ 'General_AboutPiwikX'|translate(piwikVersion) }}</h2> diff --git a/plugins/Goals/javascripts/goalsForm.js b/plugins/Goals/javascripts/goalsForm.js index e7de62d168bfe13cee255fefca84740d529292ff..01f4540b582bf3450adcbbd3ec866175a936efe6 100644 --- a/plugins/Goals/javascripts/goalsForm.js +++ b/plugins/Goals/javascripts/goalsForm.js @@ -37,11 +37,11 @@ function showCancel() { } function showCreateGoal() { - $("a[name=linkAddNewGoal]").show(); + $("div[name=linkAddNewGoal]").show(); } function hideCreateGoal() { - $("a[name=linkAddNewGoal]").hide(); + $("div[name=linkAddNewGoal]").hide(); } function onMatchAttributeChange(matchAttribute) @@ -128,7 +128,7 @@ function bindGoalForm() { return false; }); - $('a[name=linkAddNewGoal]').click(function () { + $('div[name=linkAddNewGoal]').click(function () { initAndShowAddGoalForm(); piwikHelper.lazyScrollTo('#goal_name'); }); diff --git a/plugins/Goals/stylesheets/goals.css b/plugins/Goals/stylesheets/goals.css index 52602215bb04ae3c6fe63133e907c003aae4ff28..16f594781a1b7b88c2ed6457774fcaa0a03d72b8 100644 --- a/plugins/Goals/stylesheets/goals.css +++ b/plugins/Goals/stylesheets/goals.css @@ -9,6 +9,14 @@ width: 614px; } +.managegoals .addrow:hover { + text-decoration: underline; +} + +.managegoals .addrow { + margin-top: 0px; +} + /* dimension selector */ #titleGoalsByDimension { padding-top: 30px; diff --git a/plugins/Goals/templates/_formAddGoal.twig b/plugins/Goals/templates/_formAddGoal.twig index 573d86dc29832df0bf0febfd7fe9784e1baca80c..5e0366fdb8774468cbe63d28708e90540a0b6c60 100644 --- a/plugins/Goals/templates/_formAddGoal.twig +++ b/plugins/Goals/templates/_formAddGoal.twig @@ -1,11 +1,4 @@ <div class='entityAddContainer' style="display:none;"> - {% if onlyShowAddNewGoal is not defined %} - <div class='entityCancel'> - {{ 'Goals_CancelAndReturnToGoals'|translate("<a class='entityCancelLink'>","</a>")|raw }} - </div> - <div class='clear'></div> - {% endif %} - <form> <table class="dataTable entityTable"> <thead> diff --git a/plugins/Goals/templates/_listGoalEdit.twig b/plugins/Goals/templates/_listGoalEdit.twig index 325bfd4d3e0a82263ef606463f96dd87aef370b2..62417aa6d80abb7b67eecfeb00308a4af2e92bb2 100644 --- a/plugins/Goals/templates/_listGoalEdit.twig +++ b/plugins/Goals/templates/_listGoalEdit.twig @@ -1,4 +1,4 @@ -<div id='entityEditContainer' style="display:none;"> +<div id='entityEditContainer' class="managegoals" style="display:none;"> <table class="dataTable entityTable"> <thead> <tr> @@ -31,13 +31,13 @@ </td> <td>{% if goal.revenue==0 %}-{% else %}{{ goal.revenue|money(idSite)|raw }}{% endif %}</td> <td> - <a href='#' name="linkEditGoal" id="{{ goal.idgoal }}" class="link_but"> + <a href='#' name="linkEditGoal" id="{{ goal.idgoal }}" class="link_but withIcon"> <img src='plugins/Morpheus/images/ico_edit.png' border="0"/> {{ 'General_Edit'|translate }} </a> </td> <td> - <a href='#' name="linkDeleteGoal" id="{{ goal.idgoal }}" class="link_but"> + <a href='#' name="linkDeleteGoal" id="{{ goal.idgoal }}" class="link_but withIcon"> <img src='plugins/Morpheus/images/ico_delete.png' border="0"/> {{ 'General_Delete'|translate }} </a> @@ -49,7 +49,7 @@ {% if onlyShowAddNewGoal is not defined %} <br/> - <a onclick='' name='linkAddNewGoal'>› {{ 'Goals_CreateNewGOal'|translate }}</a> + <div name="linkAddNewGoal" class="addrow"><img src='plugins/Morpheus/images/add.png'/> {{ 'Goals_CreateNewGOal'|translate }}</div> <br/> <br/> diff --git a/plugins/Goals/templates/manageGoals.twig b/plugins/Goals/templates/manageGoals.twig index 65dc6a615d28ca1eb0dff47f1327bd9ae075a3fe..f71cd38300895f7b9e049a2f9c5ac9a819f23d9c 100644 --- a/plugins/Goals/templates/manageGoals.twig +++ b/plugins/Goals/templates/manageGoals.twig @@ -1,30 +1,26 @@ -{% extends 'dashboard.twig' %} +{% extends 'user.twig' %} {% block content %} - {% include "@CoreHome/_siteSelectHeader.twig" %} - - <div class="centerLargeDiv"> - - <h2 piwik-enriched-headline> - <div class="inlineHelp">{{ 'Goals_LearnMoreAboutGoalTrackingDocumentation'|translate("<a href='?module=Proxy&action=redirect&url=http://piwik.org/docs/tracking-goals-web-analytics/' target='_blank'>","</a>")|raw }} + <h2 piwik-enriched-headline> + <div class="inlineHelp">{{ 'Goals_LearnMoreAboutGoalTrackingDocumentation'|translate("<a href='?module=Proxy&action=redirect&url=http://piwik.org/docs/tracking-goals-web-analytics/' target='_blank'>","</a>")|raw }} + + {% if not ecommerceEnabled %} + <br /><br/> + {% set websiteManageText %} + <a href='{{ linkTo({'module':'SitesManager','action':'index' }) }}'>{{ 'SitesManager_WebsitesManagement'|translate }}</a> + {% endset %} + {% set ecommerceReportText %} + <a href="http://piwik.org/docs/ecommerce-analytics/" rel="noreferrer" target="_blank">{{ 'Goals_EcommerceReports'|translate }}</a> + {% endset %} + {{ 'Goals_Optional'|translate }} {{ 'Goals_Ecommerce'|translate }}: {{ 'Goals_YouCanEnableEcommerceReports'|translate(ecommerceReportText,websiteManageText)|raw }} + {% endif %}</div> + {{ 'Goals_ManageGoals'|translate }} + </h2> - {% if not ecommerceEnabled %} - <br /><br/> - {% set websiteManageText %} - <a href='{{ linkTo({'module':'SitesManager','action':'index' }) }}'>{{ 'SitesManager_WebsitesManagement'|translate }}</a> - {% endset %} - {% set ecommerceReportText %} - <a href="http://piwik.org/docs/ecommerce-analytics/" rel="noreferrer" target="_blank">{{ 'Goals_EcommerceReports'|translate }}</a> - {% endset %} - {{ 'Goals_Optional'|translate }} {{ 'Goals_Ecommerce'|translate }}: {{ 'Goals_YouCanEnableEcommerceReports'|translate(ecommerceReportText,websiteManageText)|raw }} - {% endif %}</div> - {{ 'Goals_ManageGoals'|translate }} - </h2> - - {% include "@Goals/_addEditGoal.twig" %} + {% include "@CoreHome/_siteSelectHeader.twig" %} - </div> + {% include "@Goals/_addEditGoal.twig" %} <style type="text/css"> .entityAddContainer { diff --git a/plugins/Installation/stylesheets/systemCheckPage.less b/plugins/Installation/stylesheets/systemCheckPage.less index 579bd888ae9937ae49353b07560633368a035b5b..3c5f6ddfa04ed9b80619ff8f2daa15e3f70e3ceb 100755 --- a/plugins/Installation/stylesheets/systemCheckPage.less +++ b/plugins/Installation/stylesheets/systemCheckPage.less @@ -1,6 +1,5 @@ #systemCheckOptional, #systemCheckRequired { - border: 1px solid #dadada; width: 100%; max-width: 900px; } @@ -13,18 +12,13 @@ #systemCheckRequired td { padding: 1em .5em 1em 2em; vertical-align: middle; - font-size: 1.2em; margin: 0; + min-width: 200px; } -#systemCheckOptional tr:nth-child(even), -#systemCheckRequired tr:nth-child(even) { - background-color: #EFEEEC; -} - -#systemCheckOptional tr:nth-child(odd), -#systemCheckRequired tr:nth-child(odd) { - background-color: #F6F5F3; +#systemCheckOptional tr, +#systemCheckRequired tr { + background-color: #f2f2f2; } .error { diff --git a/plugins/Installation/templates/systemCheckPage.twig b/plugins/Installation/templates/systemCheckPage.twig index 1d214ba39565a46619d7146541e75b9fbe3cce17..b66c493eea23f7dc9519d2c44cf608b1f2f43534 100755 --- a/plugins/Installation/templates/systemCheckPage.twig +++ b/plugins/Installation/templates/systemCheckPage.twig @@ -3,7 +3,7 @@ {% block content %} {% if isSuperUser %} <h2 piwik-enriched-headline>{{ 'Installation_SystemCheck'|translate }}</h2> - <p style="margin-left:1em;"> + <p style="margin-left:0.2em;"> {% if infos.has_errors %} <img src="plugins/Morpheus/images/error.png"/> {{ 'Installation_SystemCheckSummaryThereWereErrors'|translate('<strong>','</strong>','<strong><em>','</em></strong>')|raw }} {{ 'Installation_SeeBelowForMoreInfo'|translate }} diff --git a/plugins/MobileMessaging/Controller.php b/plugins/MobileMessaging/Controller.php index e19b7684b1c3e51ec2b9f936461ad6d45b635a9c..92661ed87d00c74954f0a8a975a221ba7a195eb3 100644 --- a/plugins/MobileMessaging/Controller.php +++ b/plugins/MobileMessaging/Controller.php @@ -32,10 +32,33 @@ class Controller extends \Piwik\Plugin\ControllerAdmin */ public function index() { - Piwik::checkUserIsNotAnonymous(); + Piwik::checkUserHasSuperUserAccess(); $view = new View('@MobileMessaging/index'); + $this->setManageVariables($view); + + return $view->render(); + } + /* + * Mobile Messaging Settings tab : + * - set delegated management + * - provide & validate SMS API credential + * - add & activate phone numbers + * - check remaining credits + */ + public function userSettings() + { + Piwik::checkUserIsNotAnonymous(); + + $view = new View('@MobileMessaging/userSettings'); + $this->setManageVariables($view); + + return $view->render(); + } + + private function setManageVariables(View $view) + { $view->isSuperUser = Piwik::hasUserSuperUserAccess(); $mobileMessagingAPI = API::getInstance(); @@ -43,6 +66,8 @@ class Controller extends \Piwik\Plugin\ControllerAdmin $view->credentialSupplied = $mobileMessagingAPI->areSMSAPICredentialProvided(); $view->accountManagedByCurrentUser = $view->isSuperUser || $view->delegatedManagement; $view->strHelpAddPhone = Piwik::translate('MobileMessaging_Settings_PhoneNumbers_HelpAdd', array(Piwik::translate('General_Settings'), Piwik::translate('MobileMessaging_SettingsMenu'))); + $view->creditLeft = 0; + $view->provider = ''; if ($view->credentialSupplied && $view->accountManagedByCurrentUser) { $view->provider = $mobileMessagingAPI->getSMSProvider(); $view->creditLeft = $mobileMessagingAPI->getCreditLeft(); @@ -72,7 +97,5 @@ class Controller extends \Piwik\Plugin\ControllerAdmin $view->phoneNumbers = $mobileMessagingAPI->getPhoneNumbers(); $this->setBasicVariablesView($view); - - return $view->render(); } } diff --git a/plugins/MobileMessaging/Menu.php b/plugins/MobileMessaging/Menu.php index e810e997449663a654d421138f678296d302d445..4612c79d214d76fe5ce804130ad0e91c8e79d7a5 100644 --- a/plugins/MobileMessaging/Menu.php +++ b/plugins/MobileMessaging/Menu.php @@ -9,11 +9,20 @@ namespace Piwik\Plugins\MobileMessaging; use Piwik\Menu\MenuAdmin; +use Piwik\Menu\MenuUser; +use Piwik\Piwik; class Menu extends \Piwik\Plugin\Menu { public function configureAdminMenu(MenuAdmin $menu) { - $menu->addSettingsItem('MobileMessaging_SettingsMenu', $this->urlForAction('index'), $order = 12); + if (Piwik::hasUserSuperUserAccess()) { + $menu->addSettingsItem('MobileMessaging_SettingsMenu', $this->urlForAction('index'), $order = 12); + } + } + + public function configureUserMenu(MenuUser $menu) + { + $menu->addPersonalItem('MobileMessaging_SettingsMenu', $this->urlForAction('userSettings'), $order = 12); } } diff --git a/plugins/MobileMessaging/lang/en.json b/plugins/MobileMessaging/lang/en.json index 4c462372862cd58f9d40e1560e6fd7480d9ecb68..63df29ceefd9f7a037da9e5592dd5bde2658038d 100644 --- a/plugins/MobileMessaging/lang/en.json +++ b/plugins/MobileMessaging/lang/en.json @@ -14,7 +14,7 @@ "Settings_CredentialProvided": "Your %s SMS API account is correctly configured!", "Settings_DeleteAccountConfirm": "Are you sure you want to delete this SMS account?", "Settings_InvalidActivationCode": "Code entered was not valid, please try again.", - "Settings_LetUsersManageAPICredential": "Allow users to manage their own SMS API credentials", + "Settings_LetUsersManageAPICredential": "Allow users to manage their own SMS provider", "Settings_LetUsersManageAPICredential_No_Help": "All users are able to receive SMS Reports and will use your account's credits.", "Settings_LetUsersManageAPICredential_Yes_Help": "Each user will be able to setup their own SMS API Account and will not use your credit.", "Settings_ManagePhoneNumbers": "Manage Phone Numbers", diff --git a/plugins/MobileMessaging/templates/index.twig b/plugins/MobileMessaging/templates/index.twig index 17b5bbb435500fbffa78c8e8bd0f3ad98d0e58d7..c75c00f5832c60a9b0b2385aa88dec19b7e6e473 100644 --- a/plugins/MobileMessaging/templates/index.twig +++ b/plugins/MobileMessaging/templates/index.twig @@ -1,160 +1,11 @@ {% extends 'admin.twig' %} -{% block content %} - {% if accountManagedByCurrentUser %} - <h2 piwik-enriched-headline - feature-name="{{ 'MobileMessaging_SettingsMenu'|translate }}" - >{{ 'MobileMessaging_Settings_SMSAPIAccount'|translate }}</h2> - {% if credentialSupplied %} - {{ 'MobileMessaging_Settings_CredentialProvided'|translate(provider) }} - {{ creditLeft }} - <br/> - {{ 'MobileMessaging_Settings_UpdateOrDeleteAccount'|translate("<a id='displayAccountForm'>","</a>","<a id='deleteAccount'>","</a>")|raw }} - {% else %} - {{ 'MobileMessaging_Settings_PleaseSignUp'|translate }} - {% endif %} - <div id='accountForm' {% if credentialSupplied %}style='display: none;'{% endif %}> - <br/> - {{ 'MobileMessaging_Settings_SMSProvider'|translate }} - <select id='smsProviders'> - {% for smsProvider, description in smsProviders %} - <option value='{{ smsProvider }}'> - {{ smsProvider }} - </option> - {% endfor %} - </select> - - {{ 'MobileMessaging_Settings_APIKey'|translate }} - <input size='25' id='apiKey'/> - - <input type='submit' value='{{ 'General_Save'|translate }}' id='apiAccountSubmit' class='submit'/> - - {% for smsProvider, description in smsProviders %} - <div class='providerDescription' id='{{ smsProvider }}'> - {{ description|raw }} - </div> - {% endfor %} - - </div> - {% endif %} +{% import '@MobileMessaging/macros.twig' as macro %} - {% import 'ajaxMacros.twig' as ajax %} - - <div style="margin-top:10px"> - {{ ajax.errorDiv('ajaxErrorMobileMessagingSettings') }} - </div> - - <h2>{{ 'MobileMessaging_PhoneNumbers'|translate }}</h2> - {% if not credentialSupplied %} - {% if accountManagedByCurrentUser %} - {{ 'MobileMessaging_Settings_CredentialNotProvided'|translate }} - {% else %} - {{ 'MobileMessaging_Settings_CredentialNotProvidedByAdmin'|translate }} - {% endif %} - {% else %} - {{ 'MobileMessaging_Settings_PhoneNumbers_Help'|translate }} - <br/> - <br/> - <table style="width:900px;" class="adminTable"> - <tbody> - <tr> - <td style="width:480px;"> - <strong>{{ 'MobileMessaging_Settings_PhoneNumbers_Add'|translate }}</strong> - <br/><br/> - - <span id="suspiciousPhoneNumber" style="display:none;"> - {{ 'MobileMessaging_Settings_SuspiciousPhoneNumber'|translate('54184032') }} - <br/><br/> - </span> - - + <input id="countryCallingCode" size="4" maxlength="4"/> - <input id="newPhoneNumber"/> - <input type="submit" value='{{ 'General_Add'|translate }}' - id="addPhoneNumberSubmit"/> - <br/> - - <span style=' font-size: 11px;'><span - class="form-description">{{ 'MobileMessaging_Settings_CountryCode'|translate }}</span> - <span class="form-description" - style="margin-left:50px;">{{ 'MobileMessaging_Settings_PhoneNumber'|translate }}</span></span> - <br/><br/> - - {{ 'MobileMessaging_Settings_PhoneNumbers_CountryCode_Help'|translate }} - - <select id="countries"> - {# this is a trick to avoid selecting the first country when no default could be found #} - <option value=""> </option> - {% for countryCode, country in countries %} - <option value='{{ country.countryCallingCode }}' - {% if defaultCountry==countryCode %} selected="selected" {% endif %} - > - {{ country.countryName }} - </option> - {% endfor %} - </select> - - </td> - <td style="width:220px;"> - {% import 'macros.twig' as piwik %} - {{ piwik.inlineHelp(strHelpAddPhone) }} - </td> - </tr> - <tr> - <td colspan="2"> - - {% if phoneNumbers|length > 0 %} - <br/> - <br/> - <strong>{{ 'MobileMessaging_Settings_ManagePhoneNumbers'|translate }}</strong> - <br/> - <br/> - {% endif %} - - {{ ajax.errorDiv('invalidVerificationCodeAjaxError') }} - - <div id='phoneNumberActivated' style="display:none;"> - {{ 'MobileMessaging_Settings_PhoneActivated'|translate }} - </div> - - <div id='invalidActivationCode' style="display:none;"> - {{ 'MobileMessaging_Settings_InvalidActivationCode'|translate }} - </div> - - <ul> - {% for phoneNumber, validated in phoneNumbers %} - <li> - <span class='phoneNumber'>{{ phoneNumber }}</span> - {% if not validated %} - <input class='verificationCode'/> - <input - type='submit' - value='{{ 'MobileMessaging_Settings_ValidatePhoneNumber'|translate }}' - class='validatePhoneNumberSubmit' - /> - {% endif %} - <input - type='submit' - value='{{ 'General_Remove'|translate }}' - class='removePhoneNumberSubmit' - /> - {% if not validated %} - <br/> - <span class='form-description'>{{ 'MobileMessaging_Settings_VerificationCodeJustSent'|translate }}</span> - {% endif %} - <br/> - <br/> - </li> - {% endfor %} - </ul> - - </td> - </tr> - </tbody> - </table> - {% endif %} +{% block content %} {% if isSuperUser %} - <h2>{{ 'MobileMessaging_Settings_SuperAdmin'|translate }}</h2> + <h2>{{ 'General_Settings'|translate }}</h2> <table class='adminTable' style='width:650px;'> <tr> <td style="width:400px;">{{ 'MobileMessaging_Settings_LetUsersManageAPICredential'|translate }}</td> @@ -183,6 +34,29 @@ </table> {% endif %} + {% if accountManagedByCurrentUser and delegatedManagement %} + + <h2 piwik-enriched-headline + >{{ 'MobileMessaging_Settings_SMSProvider'|translate }}</h2> + To manage your SMS provider go to your <a href="{{ linkTo({'action':'userSettings'}) }}">personal mobile messaging settings</a>. + + {% elseif accountManagedByCurrentUser %} + + <h2 piwik-enriched-headline + >{{ 'MobileMessaging_Settings_SMSProvider'|translate }}</h2> + + {{ macro.manageSmsApi(credentialSupplied, creditLeft, smsProviders, provider) }} + {% endif %} + + {% import 'ajaxMacros.twig' as ajax %} + + <div style="margin-top:10px"> + {{ ajax.errorDiv('ajaxErrorMobileMessagingSettings') }} + </div> + + <h2>{{ 'MobileMessaging_PhoneNumbers'|translate }}</h2> + To manage your phone numbers go to your <a href="{{ linkTo({'action':'userSettings'}) }}">personal mobile messaging settings</a>. + {{ ajax.loadingDiv('ajaxLoadingMobileMessagingSettings') }} <div class='ui-confirm' id='confirmDeleteAccount'> diff --git a/plugins/MobileMessaging/templates/macros.twig b/plugins/MobileMessaging/templates/macros.twig new file mode 100644 index 0000000000000000000000000000000000000000..e0c1d499c62adc704fb28124eb327a4eab9ae994 --- /dev/null +++ b/plugins/MobileMessaging/templates/macros.twig @@ -0,0 +1,33 @@ +{% macro manageSmsApi(credentialSupplied, creditLeft, smsProviders, provider) %} + {% if credentialSupplied %} + {{ 'MobileMessaging_Settings_CredentialProvided'|translate(provider) }} + {{ creditLeft }} + <br/> + {{ 'MobileMessaging_Settings_UpdateOrDeleteAccount'|translate("<a id='displayAccountForm'>","</a>","<a id='deleteAccount'>","</a>")|raw }} + {% else %} + {{ 'MobileMessaging_Settings_PleaseSignUp'|translate }} + {% endif %} + <div id='accountForm' {% if credentialSupplied %}style='display: none;'{% endif %}> + <br/> + {{ 'MobileMessaging_Settings_SMSProvider'|translate }} + <select id='smsProviders'> + {% for smsProvider, description in smsProviders %} + <option value='{{ smsProvider }}'> + {{ smsProvider }} + </option> + {% endfor %} + </select> + + {{ 'MobileMessaging_Settings_APIKey'|translate }} + <input size='25' id='apiKey'/> + + <input type='submit' value='{{ 'General_Save'|translate }}' id='apiAccountSubmit' class='submit'/> + + {% for smsProvider, description in smsProviders %} + <div class='providerDescription' id='{{ smsProvider }}'> + {{ description|raw }} + </div> + {% endfor %} + + </div> +{% endmacro %} \ No newline at end of file diff --git a/plugins/MobileMessaging/templates/userSettings.twig b/plugins/MobileMessaging/templates/userSettings.twig new file mode 100644 index 0000000000000000000000000000000000000000..987683e7391d81b3dee6acd357f9c3ae5421f880 --- /dev/null +++ b/plugins/MobileMessaging/templates/userSettings.twig @@ -0,0 +1,139 @@ +{% extends 'user.twig' %} + +{% block content %} + + {% import 'ajaxMacros.twig' as ajax %} + + <div style="margin-top:10px"> + {{ ajax.errorDiv('ajaxErrorMobileMessagingSettings') }} + </div> + + {% import '@MobileMessaging/macros.twig' as macro %} + + {% if accountManagedByCurrentUser and delegatedManagement %} + <h2 piwik-enriched-headline + >{{ 'MobileMessaging_Settings_SMSProvider'|translate }}</h2> + + {{ macro.manageSmsApi(credentialSupplied, creditLeft, smsProviders, provider) }} + {% endif %} + + <h2>{{ 'MobileMessaging_PhoneNumbers'|translate }}</h2> + {% if not credentialSupplied %} + {% if accountManagedByCurrentUser and delegatedManagement %} + {{ 'MobileMessaging_Settings_CredentialNotProvided'|translate }} + {% elseif accountManagedByCurrentUser %} + Before you can create and manage phone numbers, please setup an SMS provider in <a href="{{ linkTo({'action': 'index'}) }}">admin mobile messaging settings</a>. + {% else %} + {{ 'MobileMessaging_Settings_CredentialNotProvidedByAdmin'|translate }} + {% endif %} + {% else %} + {{ 'MobileMessaging_Settings_PhoneNumbers_Help'|translate }} + <br/> + <br/> + <table style="width:900px;" class="adminTable"> + <tbody> + <tr> + <td style="width:480px;"> + <strong>{{ 'MobileMessaging_Settings_PhoneNumbers_Add'|translate }}</strong> + <br/><br/> + + <span id="suspiciousPhoneNumber" style="display:none;"> + {{ 'MobileMessaging_Settings_SuspiciousPhoneNumber'|translate('54184032') }} + <br/><br/> + </span> + + + <input id="countryCallingCode" size="4" maxlength="4"/> + <input id="newPhoneNumber"/> + <input type="submit" value='{{ 'General_Add'|translate }}' + id="addPhoneNumberSubmit"/> + <br/> + + <span style=' font-size: 11px;'><span + class="form-description">{{ 'MobileMessaging_Settings_CountryCode'|translate }}</span> + <span class="form-description" + style="margin-left:50px;">{{ 'MobileMessaging_Settings_PhoneNumber'|translate }}</span></span> + <br/><br/> + + {{ 'MobileMessaging_Settings_PhoneNumbers_CountryCode_Help'|translate }} + + <select id="countries"> + {# this is a trick to avoid selecting the first country when no default could be found #} + <option value=""> </option> + {% for countryCode, country in countries %} + <option value='{{ country.countryCallingCode }}' + {% if defaultCountry==countryCode %} selected="selected" {% endif %} + > + {{ country.countryName }} + </option> + {% endfor %} + </select> + + </td> + <td style="width:220px;"> + {% import 'macros.twig' as piwik %} + {{ piwik.inlineHelp(strHelpAddPhone) }} + </td> + </tr> + <tr> + <td colspan="2"> + + {% if phoneNumbers|length > 0 %} + <br/> + <br/> + <strong>{{ 'MobileMessaging_Settings_ManagePhoneNumbers'|translate }}</strong> + <br/> + <br/> + {% endif %} + + {{ ajax.errorDiv('invalidVerificationCodeAjaxError') }} + + <div id='phoneNumberActivated' style="display:none;"> + {{ 'MobileMessaging_Settings_PhoneActivated'|translate }} + </div> + + <div id='invalidActivationCode' style="display:none;"> + {{ 'MobileMessaging_Settings_InvalidActivationCode'|translate }} + </div> + + <ul> + {% for phoneNumber, validated in phoneNumbers %} + <li> + <span class='phoneNumber'>{{ phoneNumber }}</span> + {% if not validated %} + <input class='verificationCode'/> + <input + type='submit' + value='{{ 'MobileMessaging_Settings_ValidatePhoneNumber'|translate }}' + class='validatePhoneNumberSubmit' + /> + {% endif %} + <input + type='submit' + value='{{ 'General_Remove'|translate }}' + class='removePhoneNumberSubmit' + /> + {% if not validated %} + <br/> + <span class='form-description'>{{ 'MobileMessaging_Settings_VerificationCodeJustSent'|translate }}</span> + {% endif %} + <br/> + <br/> + </li> + {% endfor %} + </ul> + + </td> + </tr> + </tbody> + </table> + {% endif %} + + {{ ajax.loadingDiv('ajaxLoadingMobileMessagingSettings') }} + + <div class='ui-confirm' id='confirmDeleteAccount'> + <h2>{{ 'MobileMessaging_Settings_DeleteAccountConfirm'|translate }}</h2> + <input role='yes' type='button' value='{{ 'General_Yes'|translate }}'/> + <input role='no' type='button' value='{{ 'General_No'|translate }}'/> + </div> + +{% endblock %} diff --git a/plugins/Morpheus/javascripts/layout.js b/plugins/Morpheus/javascripts/layout.js new file mode 100644 index 0000000000000000000000000000000000000000..c155945ea933255875bccee760be3d1fde06551a --- /dev/null +++ b/plugins/Morpheus/javascripts/layout.js @@ -0,0 +1,32 @@ +/*! + * Piwik - free/libre analytics platform + * + * @link http://piwik.org + * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later + */ + +$(function () { + var contentUser = $('#content.user'); + + function adjustSize(content) + { + var width = $('body').width() - content.offset().left - 10; + content.css('width', width + 'px'); + } + + if (contentUser.length) { + adjustSize(contentUser); + $(window).resize(function () { + adjustSize(contentUser); + }); + } + + var contentAdmin = $('#content.admin'); + + if (contentAdmin.length) { + adjustSize(contentAdmin); + $(window).resize(function () { + adjustSize(contentAdmin); + }); + } +}); \ No newline at end of file diff --git a/plugins/Morpheus/stylesheets/general/_admin.less b/plugins/Morpheus/stylesheets/general/_admin.less index 0a3b21cd8805bf2791d462128a83cf89a35cba26..3d6aa21f61e528c8077c1777263d9773f97f5d09 100644 --- a/plugins/Morpheus/stylesheets/general/_admin.less +++ b/plugins/Morpheus/stylesheets/general/_admin.less @@ -5,6 +5,9 @@ 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 { @@ -15,10 +18,12 @@ padding: 12px 15px; } ul { + background-color: @theme-color-menu-contrast-background; + li { a { color: @theme-color-text-lighter !important; - padding: 0.6em 1.1em; + padding: 0.8em 1.1em; &:hover { color: @theme-color-text; text-decoration: none; @@ -90,21 +95,40 @@ color: @theme-color-link; } +.admin .adminTable a { + color: @theme-color-text; + text-decoration: underline; +} + +.admin .adminTable .ui-inline-help a { + color: @theme-color-link; + text-decoration: none; +} + .addRowSite, .addrow { cursor: pointer; } +.addrow:hover { + text-decoration: underline; +} + .addrow { - margin-top: 10px; + margin-top: 16px; } .addRowSite { display: inline-block; margin: 5px 0; + text-decoration: none !important; &:before { content: url(plugins/Morpheus/images/add.png) !important; } + + &:hover { + text-decoration: underline !important; + } } code { diff --git a/plugins/Morpheus/stylesheets/general/_form.less b/plugins/Morpheus/stylesheets/general/_form.less index 81238a747fa71512505cfddc21635909b1108918..f4b2acbdaedb7983affbe504169caac67b3c615b 100644 --- a/plugins/Morpheus/stylesheets/general/_form.less +++ b/plugins/Morpheus/stylesheets/general/_form.less @@ -9,12 +9,14 @@ /* on admin screen, Save button aligned on the left */ .admin .submit { - margin-left: 50px; + margin-left: 0px; + margin-top: 20px; float: none; } .admin .entityContainer .submit { margin: 0; + margin-top: 20px; } .entityContainer .link_but { @@ -88,8 +90,6 @@ table.entityTable tr td a { /* cancel button below Forms */ .entityCancel { - float: right; - clear: both; padding: 10px 0; font-size: 12px; } diff --git a/plugins/Morpheus/stylesheets/general/_forms.less b/plugins/Morpheus/stylesheets/general/_forms.less index 7baf2a6c30ac6f6a2475b67492b29a24c4249139..3a23231bcc1e4f7fb4fb49c5b75f1bc121425755 100644 --- a/plugins/Morpheus/stylesheets/general/_forms.less +++ b/plugins/Morpheus/stylesheets/general/_forms.less @@ -64,7 +64,10 @@ button[type="button"], min-height: 30px; .box-sizing(border-box); a { - color: @theme-color-text; + color: @theme-color-text; + &:hover { + text-decoration: none; + } } .custom_select_block { .custom_select_container{ diff --git a/plugins/Morpheus/stylesheets/theme.less b/plugins/Morpheus/stylesheets/theme.less index fa2259e4130aadcbe676e74cf725b88a525074d1..7d1ac7d2a08fabe256ab58863c9a01aad956e473 100644 --- a/plugins/Morpheus/stylesheets/theme.less +++ b/plugins/Morpheus/stylesheets/theme.less @@ -418,6 +418,10 @@ table.dataTable { text-decoration: none !important; color: @theme-color-link; width: inherit; + + &.withIcon { + color: @theme-color-text; + } } div.label, diff --git a/plugins/Morpheus/stylesheets/ui/_popups.less b/plugins/Morpheus/stylesheets/ui/_popups.less index dc2b2140de5b271f118399b2786f7a0795d9a786..78515cfab479cf74803d635f349f5e5051514e91 100644 --- a/plugins/Morpheus/stylesheets/ui/_popups.less +++ b/plugins/Morpheus/stylesheets/ui/_popups.less @@ -9,8 +9,7 @@ font-weight: bold; } -#feedback-sent, -#feedback-faq { +#feedback-sent { a { color: @theme-color-link; } diff --git a/plugins/Morpheus/stylesheets/uibase/_headerMessage.less b/plugins/Morpheus/stylesheets/uibase/_headerMessage.less index e2f9a1399742b62828e2135b38ee3c7263b8a4f8..41cdc726b99a93fecbec2dbabce44e3b342d058f 100644 --- a/plugins/Morpheus/stylesheets/uibase/_headerMessage.less +++ b/plugins/Morpheus/stylesheets/uibase/_headerMessage.less @@ -3,7 +3,7 @@ z-index: 0; cursor: default; position: absolute; - right: 1px; + right: 0px; overflow: hidden; display: block; height: 20px; diff --git a/plugins/Morpheus/templates/admin.twig b/plugins/Morpheus/templates/admin.twig index cf9307721877e9113f542cc7631bcc5f1d94a7ea..e2ebcb166e713e4a3c2f3fab236c8f3134d48bc8 100644 --- a/plugins/Morpheus/templates/admin.twig +++ b/plugins/Morpheus/templates/admin.twig @@ -23,7 +23,15 @@ <![endif]--> <!--[if (gte IE 9)|!(IE)]><!--> <body ng-app="app" class="{{ postEvent('Template.bodyClass', 'admin') }}"><!--<![endif]--> - {% set isAdminLayout = true %} + + {% if isSuperUser %} + {% set topMenuModule = 'CoreAdminHome' %} + {% set topMenuAction = 'generalSettings' %} + {% else %} + {% set topMenuModule = 'SitesManager' %} + {% set topMenuAction = 'index' %} + {% endif %} + {% include "_iframeBuster.twig" %} {% include "@CoreHome/_javaScriptDisabled.twig" %} diff --git a/plugins/Morpheus/templates/user.twig b/plugins/Morpheus/templates/user.twig new file mode 100644 index 0000000000000000000000000000000000000000..35524397aa03768e7ac9d4d2d2216ba8b052c46c --- /dev/null +++ b/plugins/Morpheus/templates/user.twig @@ -0,0 +1,62 @@ +<!DOCTYPE html> +<html id="ng-app" ng-app="piwikApp"> + <head> +{% block head %} + <meta charset="utf-8"> + <meta http-equiv="x-ua-compatible" content="IE=EDGE,chrome=1" > + <title>{% if not isCustomLogo %}Piwik › {% endif %}{{ 'CoreAdminHome_Administration'|translate }}</title> + <meta name="generator" content="Piwik - free/libre analytics platform"/> + <link rel="shortcut icon" href="{{ customFavicon|default('plugins/CoreHome/images/favicon.ico') }}"/> + +{% include "@CoreHome/_favicon.twig" %} +{% include "_jsGlobalVariables.twig" %} +{% include "_piwikTag.twig" %} +{% include "_jsCssIncludes.twig" %} + + <!--[if IE]> + <link rel="stylesheet" type="text/css" href="plugins/Morpheus/stylesheets/ieonly.css"/> + <![endif]--> + {% endblock %} + </head> + <!--[if lt IE 9 ]> + <body ng-app="app" class="old-ie {{ postEvent('Template.bodyClass', 'admin') }}"> + <![endif]--> + <!--[if (gte IE 9)|!(IE)]><!--> + <body ng-app="app" class="{{ postEvent('Template.bodyClass', 'admin') }}"><!--<![endif]--> + + {% set topMenuModule = 'UsersManager' %} + {% set topMenuAction = 'userSettings' %} + + {% include "_iframeBuster.twig" %} + {% include "@CoreHome/_javaScriptDisabled.twig" %} + + <div id="root"> + {% include "@CoreHome/_topScreen.twig" %} + + {% import 'ajaxMacros.twig' as ajax %} + {{ ajax.requestErrorDiv(emailSuperUser|default('')) }} + {{ postEvent("Template.beforeContent", "user", currentModule) }} + + <div id="container"> + + {% if showMenu is not defined or showMenu %} + {% include "@CoreHome/_userMenu.twig" %} + {% endif %} + + <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> + </body> +</html> diff --git a/plugins/MultiSites/angularjs/dashboard/dashboard.controller.js b/plugins/MultiSites/angularjs/dashboard/dashboard.controller.js index 2f28a6e8878c3d4838833d5dcad704d90bf1a83c..d4dd4eba3f817139b787d90497c4e359c024ff71 100644 --- a/plugins/MultiSites/angularjs/dashboard/dashboard.controller.js +++ b/plugins/MultiSites/angularjs/dashboard/dashboard.controller.js @@ -18,6 +18,7 @@ $scope.evolutionSelector = 'visits_evolution'; $scope.hasSuperUserAccess = piwik.hasSuperUserAccess; $scope.date = piwik.broadcast.getValueFromUrl('date'); + $scope.idSite = piwik.broadcast.getValueFromUrl('idSite'); $scope.url = piwik.piwik_url; $scope.period = piwik.period; diff --git a/plugins/MultiSites/angularjs/dashboard/dashboard.directive.html b/plugins/MultiSites/angularjs/dashboard/dashboard.directive.html index 803549913954975b88bec5e542b9bb785e915a2e..7066fd5d1fcb34bdfa1f52aaa8cfa67f838c7d36 100644 --- a/plugins/MultiSites/angularjs/dashboard/dashboard.directive.html +++ b/plugins/MultiSites/angularjs/dashboard/dashboard.directive.html @@ -79,7 +79,7 @@ <tr ng-if="hasSuperUserAccess"> <td colspan="8" class="add_new_site"> - <a href="{{ url }}?module=SitesManager&action=index&showaddsite=1&period={{ period }}&date={{ date }}"> + <a href="{{ url }}?module=SitesManager&action=index&showaddsite=1&period={{ period }}&date={{ date }}&idSite={{ idSite }}"> <img src='plugins/Morpheus/images/add.png' alt=""/> {{ 'SitesManager_AddSite'|translate }} </a> </td> diff --git a/plugins/PrivacyManager/templates/privacySettings.twig b/plugins/PrivacyManager/templates/privacySettings.twig index dc989fbf043d8b891f1e7ccd3f43240b17529917..5fa61c683bb8b526aea3b1ef327ea6689a1a6c44 100644 --- a/plugins/PrivacyManager/templates/privacySettings.twig +++ b/plugins/PrivacyManager/templates/privacySettings.twig @@ -6,7 +6,7 @@ <h2 piwik-enriched-headline help-url="http://piwik.org/docs/privacy/">{{ 'PrivacyManager_TeaserHeadline'|translate }}</h2> <p>{{ 'PrivacyManager_Teaser'|translate('<a href="#anonymizeIPAnchor">',"</a>",'<a href="#deleteLogsAnchor">',"</a>",'<a href="#optOutAnchor">',"</a>")|raw }} - {{'PrivacyManager_SeeAlsoOurOfficialGuidePrivacy'|translate('<strong><a href="http://piwik.org/privacy/" rel="noreferrer" target="_blank">','</a></strong>')|raw }}</p> + {{'PrivacyManager_SeeAlsoOurOfficialGuidePrivacy'|translate('<a href="http://piwik.org/privacy/" rel="noreferrer" target="_blank">','</a>')|raw }}</p> <h2 id="anonymizeIPAnchor">{{ 'PrivacyManager_UseAnonymizeIp'|translate }}</h2> <form method="post" action="{{ {'action':'saveSettings', 'form':'formMaskLength', 'token_auth':token_auth} | urlRewriteWithParameters }}" id="formMaskLength"> <div id='anonymizeIpSettings'> diff --git a/plugins/Provider/Menu.php b/plugins/Provider/Menu.php deleted file mode 100644 index 2d34f5b2296e01ad22968439bd6480bdaa71038c..0000000000000000000000000000000000000000 --- a/plugins/Provider/Menu.php +++ /dev/null @@ -1,20 +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\Provider; - -use Piwik\Menu\MenuReporting; - -class Menu extends \Piwik\Plugin\Menu -{ - public function configureReportingMenu(MenuReporting $menu) - { - $menu->rename('General_Visitors', 'UserCountry_SubmenuLocations', - 'General_Visitors', 'Provider_SubmenuLocationsProvider'); - } -} diff --git a/plugins/Provider/lang/en.json b/plugins/Provider/lang/en.json index f634e2eda74c9398c189d310cd57ce634cbc08f2..4252d9bc15d99474777573682b826666ef632e0a 100644 --- a/plugins/Provider/lang/en.json +++ b/plugins/Provider/lang/en.json @@ -3,7 +3,6 @@ "ColumnProvider": "Provider", "PluginDescription": "Reports the Provider of the visitors.", "ProviderReportDocumentation": "This report shows which Internet Service Providers your visitors used to access the website. You can click on a provider name for more details. %s If Piwik can't determine a visitor's provider, it is listed as IP.", - "SubmenuLocationsProvider": "Locations & Provider", "WidgetProviders": "Providers", "ProviderReportFooter": "Unknown provider means the IP address could not be looked up." } diff --git a/plugins/ScheduledReports/Menu.php b/plugins/ScheduledReports/Menu.php index 6c0111ff235101b6a0d460b61a6ad6ca40cd3474..ea02b98b60520121c1e42d28aafd548ae3bbdf25 100644 --- a/plugins/ScheduledReports/Menu.php +++ b/plugins/ScheduledReports/Menu.php @@ -24,11 +24,10 @@ class Menu extends \Piwik\Plugin\Menu \Piwik\Plugin\Manager::getInstance()->isPluginActivated('MobileMessaging') ? 'MobileMessaging_TopLinkTooltip' : 'ScheduledReports_TopLinkTooltip'); - $menu->addManageItem(null, $this->urlForDefaultAction(array('segment' => false)), 10); - $menu->addManageItem( + $menu->addPersonalItem( $this->getTopMenuTranslationKey(), $this->urlForAction('index', array('segment' => false)), - 13, + 7, $tooltip ); } diff --git a/plugins/ScheduledReports/javascripts/pdf.js b/plugins/ScheduledReports/javascripts/pdf.js index da23deb4fdd231436b03b5880b43535830ac0a44..c34de6f9ca196240bb67dbc8bd4999bc007bf40c 100644 --- a/plugins/ScheduledReports/javascripts/pdf.js +++ b/plugins/ScheduledReports/javascripts/pdf.js @@ -66,7 +66,7 @@ function formSetEditReport(idReport) { function getReportAjaxRequest(idReport, defaultApiMethod) { var parameters = {}; - piwikHelper.lazyScrollTo(".centerLargeDiv>h2", 400); + piwikHelper.lazyScrollTo(".emailReports>h2", 400); parameters.module = 'API'; parameters.method = defaultApiMethod; if (idReport == 0) { diff --git a/plugins/ScheduledReports/lang/en.json b/plugins/ScheduledReports/lang/en.json index 7b5b14d495a4b3d45c573711f511f35b24a61db2..fdb394699c2b33cedb3bfc807ee30963df5c558a 100644 --- a/plugins/ScheduledReports/lang/en.json +++ b/plugins/ScheduledReports/lang/en.json @@ -17,7 +17,7 @@ "EmailSchedule": "Email Schedule", "EvolutionGraph": "Show Historical Graphs for the top %s values", "FrontPage": "Front Page", - "ManageEmailReports": "Manage Email Reports", + "PersonalEmailReports": "Personal Email Reports", "MonthlyScheduleHelp": "Monthly schedule: report will be sent the first day of each month.", "MustBeLoggedIn": "You must be logged in to create and schedule custom reports.", "NoRecipients": "This report has no recipients", diff --git a/plugins/ScheduledReports/templates/_addReport.twig b/plugins/ScheduledReports/templates/_addReport.twig index 3fbc21b98b33b6739f46da6bb4f371115c2a9c27..24ddf473a33e4482bfede7b8a066e36d5c408276 100644 --- a/plugins/ScheduledReports/templates/_addReport.twig +++ b/plugins/ScheduledReports/templates/_addReport.twig @@ -1,7 +1,4 @@ <div class="entityAddContainer" style="display:none;"> - <div class='entityCancel'> - {{ 'ScheduledReports_CancelAndReturnToReports'|translate("<a class='entityCancelLink'>","</a>")|raw }} - </div> <div class='clear'></div> <form id='addEditReport'> <table class="dataTable entityTable"> diff --git a/plugins/ScheduledReports/templates/_listReports.twig b/plugins/ScheduledReports/templates/_listReports.twig index b9359f21a0b06b34c723da7f2569513ced138f6f..72b6698fcbbcf4110b1b0dbde0e14eebac868add 100644 --- a/plugins/ScheduledReports/templates/_listReports.twig +++ b/plugins/ScheduledReports/templates/_listReports.twig @@ -12,7 +12,7 @@ </tr> </thead> - {% if userLogin == 'anonymous' %} + {% if userLogin == 'anonymous' %} <tr> <td colspan='7'> <br/> @@ -21,18 +21,14 @@ <br/><br/> </td> </tr> - </table> {% elseif reports is empty %} - <tr> - <td colspan='7'> - <br/> - {{ 'ScheduledReports_ThereIsNoReportToManage'|translate(siteName)|raw }}. - <br/><br/> - <a onclick='' id='linkAddReport'>› {{ 'ScheduledReports_CreateAndScheduleReport'|translate }}</a> - <br/><br/> - </td> - </tr> - </table> + <tr> + <td colspan='7'> + <br/> + {{ 'ScheduledReports_ThereIsNoReportToManage'|translate(siteName)|raw }}. + <br/><br/> + </td> + </tr> {% else %} {% for report in reports %} <tr> @@ -62,7 +58,7 @@ <br/> {% endfor %} {# send now link #} - <a href="#" idreport="{{ report.idreport }}" name="linkSendNow" class="link_but" style="margin-top:3px;"> + <a href="#" idreport="{{ report.idreport }}" name="linkSendNow" class="link_but withIcon" style="margin-top:3px;"> <img border=0 src='{{ reportTypes[report.type] }}'/> {{ 'ScheduledReports_SendReportNow'|translate }} </a> @@ -75,33 +71,35 @@ 'outputType':downloadOutputType, 'language':language, 'format': (report.format in ['html', 'csv']) ? report.format : false }) }}" - rel="noreferrer" target="_blank" name="linkDownloadReport" id="{{ report.idreport }}" class="link_but"> + rel="noreferrer" target="_blank" name="linkDownloadReport" id="{{ report.idreport }}" class="link_but withIcon"> <img src='{{ reportFormatsByReportType[report.type][report.format] }}' border="0"/> {{ 'General_Download'|translate }} </a> </td> <td> {# edit link #} - <a href='#' name="linkEditReport" id="{{ report.idreport }}" class="link_but"> + <a href='#' name="linkEditReport" id="{{ report.idreport }}" class="link_but withIcon"> <img src='plugins/Morpheus/images/ico_edit.png' border="0"/> {{ 'General_Edit'|translate }} </a> </td> <td> {# delete link #} - <a href='#' name="linkDeleteReport" id="{{ report.idreport }}" class="link_but"> + <a href='#' name="linkDeleteReport" id="{{ report.idreport }}" class="link_but withIcon"> <img src='plugins/Morpheus/images/ico_delete.png' border="0"/> {{ 'General_Delete'|translate }} </a> </td> </tr> {% endfor %} + {% endif %} + </table> {% if userLogin != 'anonymous' %} <br/> - <a onclick='' id='linkAddReport'>› {{ 'ScheduledReports_CreateAndScheduleReport'|translate }}</a> + <div id='linkAddReport' class="addrow"><img src='plugins/Morpheus/images/add.png'/> {{ 'ScheduledReports_CreateAndScheduleReport'|translate }}</div> <br/> <br/> {% endif %} - {% endif %} + </div> diff --git a/plugins/ScheduledReports/templates/index.twig b/plugins/ScheduledReports/templates/index.twig index b8ccecf53a9c69299f5cf4136a0d1f73b3b36330..89065c5d90179cd43172d9d58cc83e4632755e21 100644 --- a/plugins/ScheduledReports/templates/index.twig +++ b/plugins/ScheduledReports/templates/index.twig @@ -1,16 +1,17 @@ -{% extends 'dashboard.twig' %} +{% extends 'user.twig' %} {% block content %} -{% include "@CoreHome/_siteSelectHeader.twig" %} +<div class="emailReports"> + <h2 piwik-enriched-headline + help-url="http://piwik.org/docs/email-reports/">{{ 'ScheduledReports_PersonalEmailReports'|translate }}</h2> -<div class="top_controls"> - {% include "@CoreHome/_periodSelect.twig" %} -</div> + {% include "@CoreHome/_siteSelectHeader.twig" %} + + <div class="top_controls"> + {% include "@CoreHome/_periodSelect.twig" %} + </div> -<div class="centerLargeDiv"> - <h2 piwik-enriched-headline - help-url="http://piwik.org/docs/email-reports/">{{ 'ScheduledReports_ManageEmailReports'|translate }}</h2> <span id="reportSentSuccess"></span> <span id="reportUpdatedSuccess"></span> @@ -53,10 +54,17 @@ position:relative; } - .entityAddContainer > .entityCancel:first-child { - position: absolute; - right:0; - bottom:100%; + #linkAddReport { + margin-top: 0px; } + + #linkAddReport:hover { + text-decoration: underline; + } + + .emailReports .top_controls { + padding-bottom: 18px; + } + </style> {% endblock %} diff --git a/plugins/SitesManager/templates/global-settings.html b/plugins/SitesManager/templates/global-settings.html index 049d7b5386a40b25c2b9846db2d3952b6a06db68..e6ae10d949d41863cb458d64064759c26be7ecf8 100644 --- a/plugins/SitesManager/templates/global-settings.html +++ b/plugins/SitesManager/templates/global-settings.html @@ -182,7 +182,7 @@ </tr> </table> - <span style="margin-left:20px;"> + <span> <input type="submit" class="submit" ng-click="saveGlobalSettings()" value="{{ 'General_Save'|translate }}"/> </span> diff --git a/plugins/SitesManager/templates/sites-list/sites-list.html b/plugins/SitesManager/templates/sites-list/sites-list.html index 8252585d223586d297929d636865b2e1721acf63..bd8ddd1c6ef1464f0a998e74adb17e27934e93be 100644 --- a/plugins/SitesManager/templates/sites-list/sites-list.html +++ b/plugins/SitesManager/templates/sites-list/sites-list.html @@ -19,8 +19,8 @@ <th>{{ 'SitesManager_Timezone'|translate }}</th> <th>{{ 'SitesManager_Currency'|translate }}</th> <th>{{ 'Goals_Ecommerce'|translate }}</th> - <th></th> - <th></th> + <th>{{ 'General_Edit'|translate }}</th> + <th>{{ 'General_Delete'|translate }}</th> <th>{{ 'General_JsTrackingTag'|translate }}</th> </tr> </thead> diff --git a/plugins/UsersManager/Menu.php b/plugins/UsersManager/Menu.php index 67d9811aad6b56e25626f9bb19e48b811b02fca1..9f3175a3ef8ccb2caf9d4f5b21e6fdcffbec04bd 100644 --- a/plugins/UsersManager/Menu.php +++ b/plugins/UsersManager/Menu.php @@ -18,7 +18,6 @@ class Menu extends \Piwik\Plugin\Menu { if (Piwik::isUserHasSomeAdminAccess()) { $menu->addManageItem('UsersManager_MenuUsers', $this->urlForAction('index'), $order = 2); - $menu->addSettingsItem('UsersManager_MenuPersonal', $this->urlForAction('userSettings'), $order = 1); } if (Piwik::hasUserSuperUserAccess() && API::getInstance()->getSitesAccessFromUser('anonymous')) { @@ -29,7 +28,7 @@ class Menu extends \Piwik\Plugin\Menu public function configureUserMenu(MenuUser $menu) { if (!Piwik::isUserIsAnonymous()) { - $menu->addItem('', 'General_Settings', $this->urlForAction('userSettings'), 0); + $menu->addItem('UsersManager_MenuPersonal', 'General_Settings', $this->urlForAction('userSettings'), 0); } } } diff --git a/plugins/UsersManager/javascripts/usersManager.js b/plugins/UsersManager/javascripts/usersManager.js index 51be3f80639582791587f1414b06c6cdcbe14814..0b7f4e431eaba7e583c7b7ba0bd03a9cf2ac61d7 100644 --- a/plugins/UsersManager/javascripts/usersManager.js +++ b/plugins/UsersManager/javascripts/usersManager.js @@ -263,7 +263,7 @@ $(document).ready(function () { } ); - $('.addrow').click(function () { + $('.admin .user .addrow').click(function () { piwikHelper.hideAjaxError(); $(this).toggle(); diff --git a/plugins/UsersManager/templates/index.twig b/plugins/UsersManager/templates/index.twig index f102bce7e1d4231e9900a5e12e55ad6b6eaa3e4d..2a29c9f85165afb219eb61e890566a552896a7c7 100644 --- a/plugins/UsersManager/templates/index.twig +++ b/plugins/UsersManager/templates/index.twig @@ -110,7 +110,7 @@ {% import 'ajaxMacros.twig' as ajax %} {{ ajax.errorDiv('ajaxErrorUsersManagement') }} {{ ajax.loadingDiv('ajaxLoadingUsersManagement') }} - <div class="entityContainer" style="margin-bottom:50px;"> + <div class="user entityContainer" style="margin-bottom:50px;"> <table class="entityTable dataTable" id="users"> <thead> <tr> diff --git a/plugins/UsersManager/templates/userSettings.twig b/plugins/UsersManager/templates/userSettings.twig index cc609030803aecd68b8d1a53f667bd28f1dd06c2..769a682a432ef7a5dcdb94e9a8f61d20cc8ce4ae 100644 --- a/plugins/UsersManager/templates/userSettings.twig +++ b/plugins/UsersManager/templates/userSettings.twig @@ -1,9 +1,8 @@ -{% extends 'admin.twig' %} +{% extends 'user.twig' %} {% block content %} <h2 piwik-enriched-headline>{{ 'UsersManager_PersonalSettings'|translate }}</h2> -<br/> <div class="ui-confirm" id="confirmPasswordChange"> <h2>{{ 'UsersManager_ChangePasswordConfirm'|translate }}</h2> <input role="yes" type="button" value="{{ 'General_Yes'|translate }}"/> diff --git a/plugins/VisitFrequency/Controller.php b/plugins/VisitFrequency/Controller.php index ee1d3620a9325c5d620f8e96b1d4b95ccf458ae5..43453f06bf902e19e979b2d0ee10ce9d3d49ffd9 100644 --- a/plugins/VisitFrequency/Controller.php +++ b/plugins/VisitFrequency/Controller.php @@ -21,8 +21,11 @@ class Controller extends \Piwik\Plugin\Controller function index() { $view = new View('@VisitFrequency/index'); + $this->setGeneralVariablesView($view); + $view->graphEvolutionVisitFrequency = $this->getEvolutionGraph(array(), array('nb_visits_returning')); $this->setSparklinesAndNumbers($view); + return $view->render(); } diff --git a/plugins/VisitFrequency/templates/_sparklines.twig b/plugins/VisitFrequency/templates/_sparklines.twig index f497c970e5b9199571d3d1b381f437f35060c8fa..97697272e84385f46553fc4a6b27fbd768583a0b 100644 --- a/plugins/VisitFrequency/templates/_sparklines.twig +++ b/plugins/VisitFrequency/templates/_sparklines.twig @@ -1,26 +1,26 @@ <div id="leftcolumn"> -<div class="sparkline"> - {{ sparkline(urlSparklineNbVisitsReturning) }} - {{ 'VisitFrequency_ReturnVisits'|translate("<strong>"~nbVisitsReturning~"</strong>")|raw }} -</div> -<div class="sparkline"> - {{ sparkline(urlSparklineNbActionsReturning) }} - {{ 'VisitFrequency_ReturnActions'|translate("<strong>"~nbActionsReturning~"</strong>")|raw }} -</div> -<div class="sparkline"> - {{ sparkline(urlSparklineActionsPerVisitReturning) }} - {{ 'VisitFrequency_ReturnAvgActions'|translate("<strong>"~nbActionsPerVisitReturning~"</strong>")|raw }} -</div> - </div><div id="rightcolumn"> -<div class="sparkline"> - {{ sparkline(urlSparklineAvgVisitDurationReturning) }} - {% set avgVisitDurationReturning=avgVisitDurationReturning|sumtime %} - {{ 'VisitFrequency_ReturnAverageVisitDuration'|translate("<strong>"~avgVisitDurationReturning~"</strong>")|raw }} -</div> -<div class="sparkline"> - {{ sparkline(urlSparklineBounceRateReturning) }} - {{ 'VisitFrequency_ReturnBounceRate'|translate("<strong>"~bounceRateReturning~"</strong>")|raw }} -</div> -{% include "_sparklineFooter.twig" %} + <div class="sparkline"> + {{ sparkline(urlSparklineNbVisitsReturning) }} + {{ 'VisitFrequency_ReturnVisits'|translate("<strong>"~nbVisitsReturning~"</strong>")|raw }} + </div> + <div class="sparkline"> + {{ sparkline(urlSparklineNbActionsReturning) }} + {{ 'VisitFrequency_ReturnActions'|translate("<strong>"~nbActionsReturning~"</strong>")|raw }} + </div> + <div class="sparkline"> + {{ sparkline(urlSparklineActionsPerVisitReturning) }} + {{ 'VisitFrequency_ReturnAvgActions'|translate("<strong>"~nbActionsPerVisitReturning~"</strong>")|raw }} + </div> +</div><div id="rightcolumn"> + <div class="sparkline"> + {{ sparkline(urlSparklineAvgVisitDurationReturning) }} + {% set avgVisitDurationReturning=avgVisitDurationReturning|sumtime %} + {{ 'VisitFrequency_ReturnAverageVisitDuration'|translate("<strong>"~avgVisitDurationReturning~"</strong>")|raw }} + </div> + <div class="sparkline"> + {{ sparkline(urlSparklineBounceRateReturning) }} + {{ 'VisitFrequency_ReturnBounceRate'|translate("<strong>"~bounceRateReturning~"</strong>")|raw }} + </div> + {% include "_sparklineFooter.twig" %} </div> <div style="clear:both"></div> \ No newline at end of file diff --git a/plugins/VisitorGenerator b/plugins/VisitorGenerator index 9834e8fffbd1293818a813f003c5f3a08181cdfa..a292a7fe8b815ffe43ea9fd47940938c6bc2fa6b 160000 --- a/plugins/VisitorGenerator +++ b/plugins/VisitorGenerator @@ -1 +1 @@ -Subproject commit 9834e8fffbd1293818a813f003c5f3a08181cdfa +Subproject commit a292a7fe8b815ffe43ea9fd47940938c6bc2fa6b diff --git a/plugins/VisitorInterest/Controller.php b/plugins/VisitorInterest/Controller.php index 54de6972827bdd78d7e36ba7a020a38ee50d3a1a..939318534ebabd6fe390be1615a55c595a46bfdf 100644 --- a/plugins/VisitorInterest/Controller.php +++ b/plugins/VisitorInterest/Controller.php @@ -18,11 +18,26 @@ class Controller extends \Piwik\Plugin\Controller { public function index() { + $byDimension = new View\ReportsByDimension('VisitorInterest'); + + $reportsToAdd = array( + new GetNumberOfVisitsPerVisitDuration(), + new GetNumberOfVisitsPerPage(), + new GetNumberOfVisitsByVisitCount(), + new GetNumberOfVisitsByDaysSinceLast() + ); + + foreach ($reportsToAdd as $report) { + /** @var \Piwik\Plugin\Report $report */ + $byDimension->addReport( + $report->getCategory(), + $report->getWidgetTitle(), + $report->getModule() . '.' . $report->getAction(), + array()); + } + $view = new View('@VisitorInterest/index'); - $view->dataTableNumberOfVisitsPerVisitDuration = $this->renderReport(new GetNumberOfVisitsPerVisitDuration()); - $view->dataTableNumberOfVisitsPerPage = $this->renderReport(new GetNumberOfVisitsPerPage()); - $view->dataTableNumberOfVisitsByVisitNum = $this->renderReport(new GetNumberOfVisitsByVisitCount()); - $view->dataTableNumberOfVisitsByDaysSinceLast = $this->renderReport(new GetNumberOfVisitsByDaysSinceLast()); + $view->reports = $byDimension->render(); return $view->render(); } } diff --git a/plugins/VisitorInterest/VisitorInterest.php b/plugins/VisitorInterest/VisitorInterest.php index c5fdac37117816d0cd2551317b8c5cd8ee94f78f..11d5f717c490ef30feb52296db5f283da9cc629f 100644 --- a/plugins/VisitorInterest/VisitorInterest.php +++ b/plugins/VisitorInterest/VisitorInterest.php @@ -33,7 +33,7 @@ class VisitorInterest extends \Piwik\Plugin Piwik::addAction('Template.footerVisitsFrequency', array('Piwik\Plugins\VisitorInterest\VisitorInterest', 'footerVisitsFrequency')); } - public static function footerVisitsFrequency(&$out) + public static function footerVisitsFrequency(&$out) { $out .= FrontController::getInstance()->fetchDispatch('VisitorInterest', 'index'); } diff --git a/plugins/VisitorInterest/templates/index.twig b/plugins/VisitorInterest/templates/index.twig index 2ffae16c8f3192abf6942ee36efb348cb673e190..59d474fc471038927b1cf63a83839be2e1da19c7 100644 --- a/plugins/VisitorInterest/templates/index.twig +++ b/plugins/VisitorInterest/templates/index.twig @@ -1,4 +1,3 @@ -<br /> <div id="leftcolumn"> <h2 piwik-enriched-headline>{{ 'VisitorInterest_VisitsPerDuration'|translate }}</h2> {{ dataTableNumberOfVisitsPerVisitDuration|raw }} diff --git a/plugins/Widgetize/stylesheets/widgetize.less b/plugins/Widgetize/stylesheets/widgetize.less index 47b49ba39ac6ab8ba46481632cee2b2822ab8521..dafad78d9036389de133eeb48d0d2de63dc6d426 100644 --- a/plugins/Widgetize/stylesheets/widgetize.less +++ b/plugins/Widgetize/stylesheets/widgetize.less @@ -1,7 +1,10 @@ .widgetize { width: 100%; - padding: 15px 15px 0 15px; font-size: 13px; + + .top_controls { + padding-bottom: 16px; + } } .widgetize p { diff --git a/plugins/Widgetize/templates/index.twig b/plugins/Widgetize/templates/index.twig index 4763473a62518c09094f5be54d49b2938044c3b6..f5cbbcb10f26a9c40db58441badfbd33f9d09501 100644 --- a/plugins/Widgetize/templates/index.twig +++ b/plugins/Widgetize/templates/index.twig @@ -1,12 +1,8 @@ -{% extends 'dashboard.twig' %} +{% extends 'user.twig' %} {% block content %} -<div class="pageWrap"> - <div class="top_controls"> - {% include "@CoreHome/_siteSelectHeader.twig" %} - {% include "@CoreHome/_periodSelect.twig" %} - </div> +<div> <script type="text/javascript"> $(function () { @@ -30,31 +26,40 @@ }); </script> +<h2 piwik-enriched-headline>{{ 'General_Widgets'|translate }}</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. + <h2>Authentication</h2> <p> - <strong>› Widget authentication:</strong> If you want your widgets to be viewable by everybody, you first have to set the 'view' permissions + If you want your widgets to be viewable by everybody, you first have to set the 'view' permissions to the anonymous user in the <a href='index.php?module=UsersManager' rel='noreferrer' target='_blank'>Users Management section</a>. <br/>Alternatively, if you are publishing widgets on a password protected or private page, you don't necessarily have to allow 'anonymous' to view your reports. In this case, you can add the secret token_auth parameter (found in the <a href='{{ linkTo({'module':'API','action':'listAllAPI'}) }}' rel='noreferrer' target='_blank'>API page</a>) in the widget URL. </p> - <p><strong>› Widgetize the full dashboard:</strong> You can also display the full Piwik dashboard in your application or website in an IFRAME + <h2>Widgetize dashboards</h2> + <p>You can also display the full Piwik dashboard in your application or website in an IFRAME (<a href='' rel='noreferrer' target='_blank' id='linkDashboardUrl'>see example</a>). The date parameter can be set to a specific calendar date, "today", or "yesterday". The period parameter can be set to "day", "week", "month", or "year". The language parameter can be set to the language code of a translation, such as language=fr. For example, for idSite=1 and date=yesterday, you can write: <span id='exportFullDashboard'></span> - </p> - - <p> - <strong>› Widgetize the all websites dashboard in an IFRAME</strong> (<a href='' rel='noreferrer' target='_blank' id='linkAllWebsitesDashboardUrl'>see example</a>) + <br /> + You can also widgetize the all websites dashboard in an IFRAME (<a href='' rel='noreferrer' target='_blank' id='linkAllWebsitesDashboardUrl'>see example</a>) <span id='exportAllWebsitesDashboard'></span> </p> - <p><strong>› Select a report, and copy paste in your page the embed code below the widget:</strong> + <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>