From 2db42a8180b716de7fa83ed9cd96dbe9b59e9aff Mon Sep 17 00:00:00 2001 From: vogelor <vogelor@ispconfig3> Date: Wed, 5 May 2010 19:57:13 +0000 Subject: [PATCH] The very first version of a dashboard (very very simple, just that we have some...) --- interface/lib/lang/de.lng | 1 + interface/lib/lang/en.lng | 1 + interface/web/dashboard/dashboard.php | 119 ++++++++++++++++++ interface/web/dashboard/lib/admin.conf.php | 29 +++++ interface/web/dashboard/lib/lang/de.lng | 4 + interface/web/dashboard/lib/lang/en.lng | 4 + interface/web/dashboard/lib/module.conf.php | 46 +++++++ .../web/dashboard/templates/dashboard.htm | 36 ++++++ interface/web/nav.php | 26 ++-- .../themes/default/css/navigation/nav_top.css | 4 + .../default/css/screen/content_ispc.css | 30 +++++ .../themes/default/icons/x32/dashboard.png | Bin 0 -> 2676 bytes .../themes/default/icons/x64/dashboard.png | Bin 0 -> 7482 bytes .../default_64_navimg/css/additional.css | 5 + 14 files changed, 296 insertions(+), 9 deletions(-) create mode 100644 interface/web/dashboard/dashboard.php create mode 100644 interface/web/dashboard/lib/admin.conf.php create mode 100644 interface/web/dashboard/lib/lang/de.lng create mode 100644 interface/web/dashboard/lib/lang/en.lng create mode 100644 interface/web/dashboard/lib/module.conf.php create mode 100644 interface/web/dashboard/templates/dashboard.htm create mode 100644 interface/web/themes/default/icons/x32/dashboard.png create mode 100644 interface/web/themes/default/icons/x64/dashboard.png diff --git a/interface/lib/lang/de.lng b/interface/lib/lang/de.lng index 9d2a67029..247e6a454 100644 --- a/interface/lib/lang/de.lng +++ b/interface/lib/lang/de.lng @@ -33,4 +33,5 @@ $wb['top_menu_tools'] = 'Tools'; $wb['top_menu_help'] = 'Support'; $wb['top_menu_billing'] = 'Billing'; $wb['top_menu_domain'] = 'Domänen'; +$wb['top_menu_dashboard'] = 'Startseite'; ?> diff --git a/interface/lib/lang/en.lng b/interface/lib/lang/en.lng index da7caf12f..1693bb154 100644 --- a/interface/lib/lang/en.lng +++ b/interface/lib/lang/en.lng @@ -33,5 +33,6 @@ $wb['top_menu_tools'] = 'Tools'; $wb['top_menu_help'] = 'Help'; $wb['top_menu_billing'] = 'Billing'; $wb['top_menu_domain'] = 'Domains'; +$wb['top_menu_dashboard'] = 'Home'; $wb['toolsarea_head_txt'] = 'Tools'; ?> diff --git a/interface/web/dashboard/dashboard.php b/interface/web/dashboard/dashboard.php new file mode 100644 index 000000000..53a745c6e --- /dev/null +++ b/interface/web/dashboard/dashboard.php @@ -0,0 +1,119 @@ +<?php +/* +Copyright (c) 2010 Till Brehm, projektfarm Gmbh and Oliver Vogel www.muv.com +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + * Neither the name of ISPConfig nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, +EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +require_once('../../lib/config.inc.php'); +require_once('../../lib/app.inc.php'); + +//* Check permissions for module +$app->auth->check_module_permissions('dashboard'); + +//* Loading Template +$app->uses('tpl'); +$app->tpl->newTemplate("templates/dashboard.htm"); + +//* load language file +$lng_file = 'lib/lang/'.$_SESSION['s']['language'].'.lng'; +include($lng_file); +$app->tpl->setVar($wb); + +//* set Default - Values +$app->tpl_defaults(); + +/* + * Let the user welcome +*/ +$welcome = sprintf($wb['welcome_user_txt'], $_SESSION['s']['user']['username']); +$app->tpl->setVar('welcome_user', $welcome); + + +/* + * ToDo: Display errors, warnings and hints +*/ +///* +// * If there is any error to display, do it... +//*/ +//$error = array(); +// +//$error[] = array('error_msg' => 'EClaus1'); +//$error[] = array('error_msg' => 'EEClaus2'); +//$error[] = array('error_msg' => 'EClaus3'); +//$error[] = array('error_msg' => 'EClaus4'); +// +//$app->tpl->setloop('error', $error); +// +///* +// * If there is any warning to display, do it... +//*/ +//$warning = array(); +// +//$warning[] = array('warning_msg' => 'WClaus1'); +//$warning[] = array('warning_msg' => 'WWClaus2'); +//$warning[] = array('warning_msg' => 'WClaus3'); +//$warning[] = array('warning_msg' => 'WClaus4'); +// +//$app->tpl->setloop('warning', $warning); +// +///* +// * If there is any information to display, do it... +//*/ +//$info = array(); +// +//$info[] = array('info_msg' => 'IClaus1'); +//$info[] = array('info_msg' => 'IClaus2'); +//$info[] = array('info_msg' => 'IClaus3'); +//$info[] = array('info_msg' => 'IClaus4'); +// +//$app->tpl->setloop('info', $info); + +/* + * Show all modules, the user is allowed to use +*/ +$modules = explode(',', $_SESSION['s']['user']['modules']); +$mod = array(); +if(is_array($modules)) { + foreach($modules as $mt) { + if(is_file('../' . $mt . '/lib/module.conf.php')) { + if(!preg_match("/^[a-z]{2,20}$/i", $mt)) die('module name contains unallowed chars.'); + include_once('../' . $mt.'/lib/module.conf.php'); + /* We don't want to show the dashboard */ + if ($mt != 'dashboard') { + $mod[] = array( 'modules_title' => $app->lng($module['title']), + 'modules_startpage' => $module['startpage'], + 'modules_name' => $module['name']); + } + } + } + + $app->tpl->setloop('modules', $mod); +} + +//* Do Output +$app->tpl->pparse(); + +?> \ No newline at end of file diff --git a/interface/web/dashboard/lib/admin.conf.php b/interface/web/dashboard/lib/admin.conf.php new file mode 100644 index 000000000..584f28bad --- /dev/null +++ b/interface/web/dashboard/lib/admin.conf.php @@ -0,0 +1,29 @@ +<?php +/* +Copyright (c) 2010 Till Brehm, projektfarm Gmbh and Oliver Vogel www.muv.com +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + * Neither the name of ISPConfig nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, +EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +?> \ No newline at end of file diff --git a/interface/web/dashboard/lib/lang/de.lng b/interface/web/dashboard/lib/lang/de.lng new file mode 100644 index 000000000..79ffff06e --- /dev/null +++ b/interface/web/dashboard/lib/lang/de.lng @@ -0,0 +1,4 @@ +<?php +$wb['welcome_user_txt'] = "Herzlich Willkommen %s"; +$wb['available_modules_txt'] = "Verfügbare Module"; +?> diff --git a/interface/web/dashboard/lib/lang/en.lng b/interface/web/dashboard/lib/lang/en.lng new file mode 100644 index 000000000..177fad041 --- /dev/null +++ b/interface/web/dashboard/lib/lang/en.lng @@ -0,0 +1,4 @@ +<?php +$wb['welcome_user_txt'] = "Welcome %s"; +$wb['available_modules_txt'] = "Available Modules"; +?> diff --git a/interface/web/dashboard/lib/module.conf.php b/interface/web/dashboard/lib/module.conf.php new file mode 100644 index 000000000..28f47a26a --- /dev/null +++ b/interface/web/dashboard/lib/module.conf.php @@ -0,0 +1,46 @@ +<?php +/* +Copyright (c) 2010 Till Brehm, projektfarm Gmbh and Oliver Vogel www.muv.com +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + * Neither the name of ISPConfig nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, +EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +$module['name'] = 'dashboard'; +$module['title'] = 'top_menu_dashboard'; +$module['template'] = 'dashboard.tpl.htm'; +$module['startpage'] = 'dashboard/dashboard.php'; +$module['tab_width'] = ''; + +//$items = array(); +// +//$items[] = array( 'title' => 'Dashboard 1', +// 'target' => 'content', +// 'link' => 'dashboard/dashboard.php'); +// +//$module['nav'][] = array( 'title' => 'Dashboard 2', +// 'open' => 1, +// 'items' => $items); + +?> \ No newline at end of file diff --git a/interface/web/dashboard/templates/dashboard.htm b/interface/web/dashboard/templates/dashboard.htm new file mode 100644 index 000000000..190252b65 --- /dev/null +++ b/interface/web/dashboard/templates/dashboard.htm @@ -0,0 +1,36 @@ +<h1><tmpl_var name="welcome_user"></h1> + +<div class="panel panel_dashboard"> + <div> + <tmpl_if name='error'> + <div class="systemmonitor-state state-error"> + <tmpl_loop name="error"> + <p>{tmpl_var name='error_msg'}</p> + </tmpl_loop> + </div> + </tmpl_if> + <tmpl_if name='warning'> + <div class="systemmonitor-state state-warning"> + <tmpl_loop name="warning"> + <p>{tmpl_var name='warning_msg'}</p> + </tmpl_loop> + </div> + </tmpl_if> + <tmpl_if name='info'> + <div class="systemmonitor-state state-info"> + <tmpl_loop name="info"> + <p>{tmpl_var name='info_msg'}</p> + </tmpl_loop> + </div> + </tmpl_if> + </div> + <p> </p> + <h2>{tmpl_var name='available_modules_txt'}</h2> + <tmpl_loop name='modules'> + <div class="dashboard-modules {tmpl_var name='modules_name'}"> + <a href="#" onclick="capp('{tmpl_var name='modules_name'}')"> + {tmpl_var name='modules_title'} + </a> + </div> + </tmpl_loop> +</div> diff --git a/interface/web/nav.php b/interface/web/nav.php index 73a637172..07eb9326e 100644 --- a/interface/web/nav.php +++ b/interface/web/nav.php @@ -35,13 +35,21 @@ $app->uses('tpl'); //** Top Naviation if(isset($_GET['nav']) && $_GET['nav'] == 'top') { - + $app->tpl->newTemplate('topnav.tpl.htm'); - + //* Check User Login and current module if(isset($_SESSION["s"]["user"]) && $_SESSION["s"]["user"]['active'] == 1 && is_array($_SESSION['s']['module'])) { //* Loading modules of the user and building top navigation $modules = explode(',', $_SESSION['s']['user']['modules']); + /* + * If the dashboard is in the list of modules it always has to be the first! + */ + if (in_array('dashboard', $modules)) { + $key = array_search('dashboard', $modules); + unset($modules[$key]); + $modules = array_merge(array('dashboard'), $modules); + } if(is_array($modules)) { foreach($modules as $mt) { if(is_file($mt.'/lib/module.conf.php')) { @@ -49,8 +57,8 @@ if(isset($_GET['nav']) && $_GET['nav'] == 'top') { include_once($mt.'/lib/module.conf.php'); $active = ($module['name'] == $_SESSION['s']['module']['name']) ? 1 : 0; $topnav[] = array( 'title' => $app->lng($module['title']), - 'active' => $active, - 'module' => $module['name']); + 'active' => $active, + 'module' => $module['name']); } } } @@ -59,21 +67,21 @@ if(isset($_GET['nav']) && $_GET['nav'] == 'top') { include_once('login/lib/module.conf.php'); $_SESSION['s']['module'] = $module; $topnav[] = array( 'title' => 'Login', - 'active' => 1); + 'active' => 1); $module = null; unset($module); } //* Topnavigation $app->tpl->setLoop('nav_top',$topnav); - + } //** Side Naviation if(isset($_GET['nav']) && $_GET['nav'] == 'side') { - + $app->tpl->newTemplate('sidenav.tpl.htm'); - + //* translating module navigation $nav_translated = array(); if(isset($_SESSION['s']['module']['nav']) && is_array($_SESSION['s']['module']['nav'])) { @@ -93,7 +101,7 @@ if(isset($_GET['nav']) && $_GET['nav'] == 'side') { } $app->tpl->setLoop('nav_left',$nav_translated); - + } $app->tpl_defaults(); diff --git a/interface/web/themes/default/css/navigation/nav_top.css b/interface/web/themes/default/css/navigation/nav_top.css index 1b5207563..13dc1c898 100644 --- a/interface/web/themes/default/css/navigation/nav_top.css +++ b/interface/web/themes/default/css/navigation/nav_top.css @@ -95,4 +95,8 @@ background-image: url('../../icons/x32/domain.png') !important; } + .topnav-dashboard { + background-image: url('../../icons/x32/dashboard.png') !important; + } + } \ No newline at end of file diff --git a/interface/web/themes/default/css/screen/content_ispc.css b/interface/web/themes/default/css/screen/content_ispc.css index 0f52f10cc..10803ced9 100644 --- a/interface/web/themes/default/css/screen/content_ispc.css +++ b/interface/web/themes/default/css/screen/content_ispc.css @@ -230,6 +230,36 @@ padding:0px 5px; } + /* Dashboard */ + .dashboard-modules { + float:left; + width:100px; + height: 20px; + border:1px dotted #888888; + background-color: #cccccc; + margin:10px; + padding:10px; + background-position: center 5px; + background-repeat: no-repeat; + padding-top: 70px; + text-align: center; + } + + .dashboard-modules a{ + color: Black; + font-weight: bold; + } + + .dashboard-modules.admin { background-image: url('../../icons/x64/system.png') !important; } + .dashboard-modules.client { background-image: url('../../icons/x64/client.png') !important; } + .dashboard-modules.mail { background-image: url('../../icons/x64/email.png') !important; } + .dashboard-modules.monitor { background-image: url('../../icons/x64/monitor.png') !important; } + .dashboard-modules.dns { background-image: url('../../icons/x64/dns.png') !important; } + .dashboard-modules.tools { background-image: url('../../icons/x64/tools.png') !important; } + .dashboard-modules.help { background-image: url('../../icons/x64/help.png') !important; } + .dashboard-modules.domain { background-image: url('../../icons/x64/domain.png') !important; } + .dashboard-modules.sites { background-image: url('../../icons/x64/sites.png') !important; } + /* Image-Replacement */ .swap { background-repeat:no-repeat; } .swap span { display:none; height:16px; } diff --git a/interface/web/themes/default/icons/x32/dashboard.png b/interface/web/themes/default/icons/x32/dashboard.png new file mode 100644 index 0000000000000000000000000000000000000000..0094f836cd7a745b5023217afff165387ada1af9 GIT binary patch literal 2676 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 literal 0 HcmV?d00001 diff --git a/interface/web/themes/default/icons/x64/dashboard.png b/interface/web/themes/default/icons/x64/dashboard.png new file mode 100644 index 0000000000000000000000000000000000000000..7b20e566319bbe83fd14ec0de677797a6e34ab2e GIT binary patch literal 7482 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 a5FnelMYV)Itlk$t0ekDCggQ%7+W!G#Ge}+l literal 0 HcmV?d00001 diff --git a/interface/web/themes/default_64_navimg/css/additional.css b/interface/web/themes/default_64_navimg/css/additional.css index 95798061d..a58c80716 100644 --- a/interface/web/themes/default_64_navimg/css/additional.css +++ b/interface/web/themes/default_64_navimg/css/additional.css @@ -52,4 +52,9 @@ .topnav-domain { background-image: url('../../icons/x64/domain.png') !important; } + + .topnav-dashboard { + background-image: url('../../icons/x64/dashboard.png') !important; + } + } \ No newline at end of file -- GitLab