From 2db42a8180b716de7fa83ed9cd96dbe9b59e9aff Mon Sep 17 00:00:00 2001 From: vogelor 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 9d2a670294..247e6a454b 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 da7caf12f3..1693bb154f 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 0000000000..53a745c6e1 --- /dev/null +++ b/interface/web/dashboard/dashboard.php @@ -0,0 +1,119 @@ +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 0000000000..584f28bad6 --- /dev/null +++ b/interface/web/dashboard/lib/admin.conf.php @@ -0,0 +1,29 @@ + \ 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 0000000000..79ffff06e3 --- /dev/null +++ b/interface/web/dashboard/lib/lang/de.lng @@ -0,0 +1,4 @@ + diff --git a/interface/web/dashboard/lib/lang/en.lng b/interface/web/dashboard/lib/lang/en.lng new file mode 100644 index 0000000000..177fad0416 --- /dev/null +++ b/interface/web/dashboard/lib/lang/en.lng @@ -0,0 +1,4 @@ + diff --git a/interface/web/dashboard/lib/module.conf.php b/interface/web/dashboard/lib/module.conf.php new file mode 100644 index 0000000000..28f47a26a6 --- /dev/null +++ b/interface/web/dashboard/lib/module.conf.php @@ -0,0 +1,46 @@ + '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 0000000000..190252b655 --- /dev/null +++ b/interface/web/dashboard/templates/dashboard.htm @@ -0,0 +1,36 @@ +

+ +
+
+ +
+ +

{tmpl_var name='error_msg'}

+
+
+
+ +
+ +

{tmpl_var name='warning_msg'}

+
+
+
+ +
+ +

{tmpl_var name='info_msg'}

+
+
+
+
+

 

+

{tmpl_var name='available_modules_txt'}

+ + + +
diff --git a/interface/web/nav.php b/interface/web/nav.php index 73a6371720..07eb9326e6 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 1b52075638..13dc1c8980 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 0f52f10cc1..10803ced91 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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