From 06fd8de000a445b66cb356d5528f5ac31486fc62 Mon Sep 17 00:00:00 2001
From: "Hahn Axel (hahn)" <axel.hahn@unibe.ch>
Date: Mon, 20 Nov 2023 14:38:21 +0100
Subject: [PATCH] right top nav; no footer nav

---
 .../classes/render-adminlte.class.php         | 20 ++++++---
 public_html/deployment/inc_functions.php      | 44 ++++++++++++++++++-
 public_html/deployment/index.php              | 43 ++++++++++--------
 public_html/deployment/main.css               |  9 ++--
 public_html/deployment/main_new_ui.css        | 25 +----------
 5 files changed, 89 insertions(+), 52 deletions(-)

diff --git a/public_html/deployment/classes/render-adminlte.class.php b/public_html/deployment/classes/render-adminlte.class.php
index 7ee43120..0c4dc7a2 100755
--- a/public_html/deployment/classes/render-adminlte.class.php
+++ b/public_html/deployment/classes/render-adminlte.class.php
@@ -670,9 +670,16 @@ class renderadminlte {
      * @param  array  $aUlOptions  array of html attrubutes for wrapping UL tag
      * @return string
      */
-    public function getTopNavigation($aNavItems, $aUlOptions=['class'=>'navbar-nav']){
+    public function getTopNavigation($aNavItems, $aUlOptions=false, $aNavItemsRight=[], $aUlOptionsRight=false){
         // array_unshift($aNavItems, ['class'=>'nav-link', 'data-widget'=>'pushmenu', 'href'=>'#', 'role'=>'button', 'label'=>'<i class="fa-solid fa-bars"></i>']);
-        return $this->addWrapper('ul', $aUlOptions, $this->getNavItems($aNavItems));
+        $aUlOptLeft=$aUlOptions ? $aUlOptions : ['class'=>'navbar-nav'];
+        $aUlOptRight=$aUlOptionsRight ? $aUlOptionsRight : ['class'=>'navbar-nav ml-auto'];
+        return $this->addWrapper('ul', $aUlOptLeft, $this->getNavItems($aNavItems))
+            .(count($aNavItemsRight)
+                ? $this->addWrapper('ul', $aUlOptRight, $this->getNavItems($aNavItemsRight))
+                : ''
+            )
+            ;
     }
 
     // ----------------------------------------------------------------------
@@ -1085,7 +1092,7 @@ class renderadminlte {
 
         // print_r($aOptions);
 
-        $sVariantPrefix=$aVariants[$aOptions['variant']] ? $aVariants[$aOptions['variant']] : $aVariants['default'];
+        $sVariantPrefix=isset($aVariants[$aOptions['variant']]) ? $aVariants[$aOptions['variant']] : $aVariants['default'];
         $sClass='card'
                 . $this->_addClassValue($aOptions['type'],    $sVariantPrefix)
                 .($aOptions['shadow'] && isset($this->_aValueMappings['shadow'][$aOptions['shadow']]) 
@@ -1106,10 +1113,13 @@ class renderadminlte {
             $aOptions['tools'].=($aOptions[$sTool] ? $sHtml : '');
         }
         // build parts of the card
-        $sCardHeader=$this->addWrapper('div', ['class'=>'card-header'],
+        $sCardHeader=$aOptions['title'] 
+            ? $this->addWrapper('div', ['class'=>'card-header'],
             $this->_tag('h3', ['class'=>'card-title', 'label'=>$aOptions['title']])
             . ($aOptions['tools'] ? $this->_tag('div', ['class'=>'card-tools', 'label'=>$aOptions['tools']]) : '')
-        );
+            )
+            : ''
+            ;
 
         $sCardBody=$this->_tag('div', ['class'=>'card-body', 'label'=>$aOptions['text']]);
         $sCardFooter=$aOptions['footer'] ? $this->_tag('div', ['class'=>'card-footer', 'label'=>$aOptions['footer']]) : '';
diff --git a/public_html/deployment/inc_functions.php b/public_html/deployment/inc_functions.php
index 987ddef0..480b8985 100644
--- a/public_html/deployment/inc_functions.php
+++ b/public_html/deployment/inc_functions.php
@@ -273,6 +273,48 @@ function getTopNavLeft($aEmbed=[]) {
     return $aReturn;
 }
 
+/**
+ * get array top left navigation
+ * @return array
+ */
+function getTopNavRight() {
+    global $aParams, $oHtml;
+    $aReturn = [];
+    require_once("./classes/project.class.php");
+    require_once("./classes/user.class.php");
+    $oUser = new user();
+
+    $sBaseUrl = '/deployment/';
+    $sWikiBaseUrl = 'https://intranet.iml.unibe.ch/wiki/doku.php';
+    $sCurrentProject=(array_key_exists("prj", $aParams) && $aParams["prj"] <> "all") ? $aParams["prj"] : false;
+    $sCurrentAction=(array_key_exists("action", $aParams) && $aParams["action"]) ? $aParams["action"] : false;
+    $sCurrentPar3=(array_key_exists("par3", $aParams) && $aParams["par3"]) ? $aParams["par3"] : false;
+    $sLiActive=' class="active"';
+
+    if($oUser->getUsername()){
+        $aReturn=[
+            ['href'=>'#', 'label'=>$oUser->getUsername(),    'icon'=>'fa-solid fa-user', 
+                'class'=>($sCurrentAction=='login' ? 'active' :''),
+                'children'=>[
+                    ['href'=>$sBaseUrl . 'all/login/',           'label'=>t("login"),            'icon'=>'fa-solid fa-right-to-bracket' ],
+                ]
+            ],
+            ['href'=>'#', 'label'=>t('menu-help'), 'icon'=>'fa-solid fa-life-ring', 'class'=>'',
+            'children'=>[
+                    ['href'=>$sWikiBaseUrl . '/it/entwicklung/continuous_deployment',                'target'=>'_help', 'label'=>'WIKI: Übersicht Continous Deployment',            'icon'=>'' ],
+                    ['href'=>$sWikiBaseUrl . '/it/entwicklung/continuous_deployment#konventionen',   'target'=>'_help', 'label'=>'WIKI: Konventionen für Entwickler',            'icon'=>'' ],
+                    ['href'=>$sWikiBaseUrl . '/it/infrastruktur/se/snippets/iml.deployment_profile', 'target'=>'_help', 'label'=>'WIKI (Admin): Snippets für den Sysadmin',            'icon'=>'' ],
+                    ['href'=>$sWikiBaseUrl . '/it/infrastruktur/dienste/imldeployment',              'target'=>'_help', 'label'=>'WIKI (Admin): Verzeichnisse und Dateien',            'icon'=>'' ],
+                ]
+            ]
+        ]
+        ;
+
+    }    
+    // echo '<pre>'.print_r($aReturn, 1); die(__FUNCTION__);
+    return $aReturn;
+}
+
 /**
  * auto generate upper part of the page with header and navigation 
  * @global type $aParams
@@ -567,7 +609,7 @@ function getBreadcrumb() {
         }
         $sClass='action '.$aParams["action"];
         if (array_key_exists("par3", $aParams)) {
-            $sLabel.=' :: ' . $oHtml->getIcon($aParams["par3"]). $aParams["par3"];
+            $sLabel=$oHtml->getIcon($aParams["par3"]). $aParams["par3"];
             $sClass='action ' . $aParams["action"];
         }
         // $sReturn.='<h2 class="action ' . $aParams["action"] . '">' . $sLabel . '</h2>';
diff --git a/public_html/deployment/index.php b/public_html/deployment/index.php
index e39ddbd6..985c5b87 100644
--- a/public_html/deployment/index.php
+++ b/public_html/deployment/index.php
@@ -107,8 +107,8 @@ $aReplace=include("./ui/page_replacements.php");
     // ----------------------------------------------------------------------
     // html body
     // ----------------------------------------------------------------------
-    $BODY="WARNING: $sAction did not set \$BODY";
-    $TITLE="WARNING: $sAction did not set \$TITLE";
+    $BODY="";
+    $TITLE="";
     
     $sTopArea=getTopArea(['right'=>$sTopRight]);
     $sBanner=isset($aConfig['banner']) && $aConfig['banner'] ? '<div class="alert alert-info">'.$aConfig['banner'].'</div>' : '';
@@ -138,10 +138,26 @@ $aReplace=include("./ui/page_replacements.php");
         if (!@include($sActionFile)) {
             include("./pages/error_404.php");
         }
-        $BODY = ob_get_contents();
+        $OUT = ob_get_contents();
         ob_end_clean();
         $oCLog->add("including done $sActionFile");
-
+    
+        // echo "BODY is $BODY";
+        // echo "OUT is $OUT";
+        if(!$BODY){
+            $BODY=""
+                // ."INFO: $sActionFile did not set \$BODY<br><br>"
+                .$renderAdminLTE->getCard([
+                    // 'title'=>'Hello',
+                    'type'=>'gray',
+                    'variant'=>'outline',
+                    'text'=>$OUT,
+                ])
+            ;
+        }
+        if(!$TITLE){
+            $TITLE="WARNING: $sActionFile did not set \$TITLE";
+        }
         $oCLog->add("adding actionlog.class");
 
         if ($oUser->getUsername()){
@@ -170,13 +186,12 @@ $aReplace=include("./ui/page_replacements.php");
     $BODY = '
         ' 
         . $sHeader
-        // . $sTopArea  
         . $sShellOuptut
         .'
             ' . $sBanner . getBreadcrumb() . '
-        <div id="content">
+        
             ' . $BODY . '
-        </div>
+        
 
         <!--        
         <div id="footer">
@@ -207,24 +222,13 @@ if(!$sTabApp && !$sPpage){
     return true;
 }
 
-
-$aTopnav = [
-    ['href'=>'#',          'label'=>'Menu A', 'icon'=>'fa-solid fa-home' ],
-    ['href'=>'#',          'label'=>'Menu B', 'icon'=>'fa-solid fa-tv'],
-    ['href'=>'#',          'label'=>'Menu C', 'icon'=>'fa-solid fa-truck-pickup', 'class'=>'active',
-        'children'=>[
-            ['href'=>'#',     'label'=>'FAQ'     , 'icon'=>'fa-solid fa-truck-monster'],
-            ['href'=>'#',     'label'=>'Support' , 'icon'=>'fa-solid fa-truck-moving'],
-        ]
-    ]
-];
 */
 $aTopnav=getTopNavLeft();
 
 $aReplace['{{NAVI_TOP}}']=''
 . $renderAdminLTE->addWrapper(
     'nav', ['class'=>'main-header navbar navbar-expand navbar-white navbar-light'],
-    $renderAdminLTE->getTopNavigation($aTopnav)
+    $renderAdminLTE->getTopNavigation($aTopnav,false, getTopNavRight(), false)
     // add 2nd navbar if needed
 )
 ;
@@ -249,6 +253,7 @@ if(!file_exists($sIncfile)){
 $aReplace['{{PAGE_BODY}}']=$BODY;
 $aReplace['{{PAGE_BODY}}']=$BODY;
 $aReplace['{{PAGE_HEADER_LEFT}}']='<h2>'.$TITLE.'</h2>';
+$aReplace['{{PAGE_HEADER_RIGHT}}']='TODO: small breadcrumb';
 
 $sTemplate=file_get_contents('ui/page.tpl.php');
 echo $renderAdminLTE->render($sTemplate,$aReplace);
diff --git a/public_html/deployment/main.css b/public_html/deployment/main.css
index 52d6bc3f..e1f767a3 100644
--- a/public_html/deployment/main.css
+++ b/public_html/deployment/main.css
@@ -1,5 +1,5 @@
 body{padding-top: 0;
-    background: linear-gradient(-20deg, #fff 10%,#dde,#fff 90%) fixed;
+    /* background: linear-gradient(-20deg, #fff 10%,#dde,#fff 90%) fixed; */
 }
 #header,#footer{
     background:#eee;
@@ -57,6 +57,7 @@ body{padding-top: 0;
     */
 }
 
+/* TODO div#navbuttom wurde auskommentiert */
 div#navtop, div#navbuttom{background: rgba(0,50,100,0.1); padding: 0.2em;}
 div#navtop{margin-bottom: 1em;}
 div#navtop .current{font-size: 170%; color: #667; padding: 0 0.2em; position: absolute;}
@@ -130,7 +131,7 @@ thead{font-size: 130%;}
 
 #tbloverview th{}
 #tbloverview td{}
-th{/*border-radius: 0.7em 0.7em 0 0; */ background:#f0f0f0; text-align: center; border-right: 1px solid #fff; }
+th{/*border-radius: 0.7em 0.7em 0 0; background:#f0f0f0; */ text-align: center; border-right: 1px solid #fff; }
 thead tr th.prj{border-bottom: none;}
 th.versioncontrol{background: #eee; }
 tr{ }
@@ -147,9 +148,9 @@ div.progressinprogress{color: #6a9;}
 tr.progresshasqueue{border-left:0.5em solid #f81;}
 div.progresshasqueue{color: #d61;}
 
-.filterbar{border-bottom: 1px solid #ccc; ;}
+.filterbar{border-bottom: 0px solid #ccc; ;}
 button.prjprogress>span{font-size: 130%;}
-button.prjprogress.selected{background:#f4f4f4; box-shadow: 0 0 1em #ddd inset; border: 1px solid #aaa;}
+button.prjprogress.selected{box-shadow: 0 0 1em #ddd inset; border: 0px solid #aaa;}
 
 /*
 .trproject-textfilter {border-right: 3px solid #f00;}
diff --git a/public_html/deployment/main_new_ui.css b/public_html/deployment/main_new_ui.css
index 4e6499f5..63b4cde1 100644
--- a/public_html/deployment/main_new_ui.css
+++ b/public_html/deployment/main_new_ui.css
@@ -10,26 +10,5 @@ pre.config{background:#f4f4f4; color:#448; border-radius: 0.5em; max-height: aut
 
 a.topbrand{font-size: 150%; margin-top: -0.2em; margin-right: 1em;}
 
-.dropdown-menu {
-    /*
-	position: absolute;
-	top: 100%;
-	left: 0;
-	z-index: 1000;
-	display: none;
-	float: left;
-	min-width: 10rem;
-	padding: .5rem 0;
-	margin: .125rem 0 0;
-	font-size: 1rem;
-	color: #212529;
-	text-align: left;
-	list-style: none;
-	background-color: #fff;
-	background-clip: padding-box;
-	border: 1px solid rgba(0,0,0,.15);
-	border-radius: .25rem;
-	box-shadow: 0 .5rem 1rem rgba(0,0,0,.175);
-    */
-    min-width: 15rem;
-}
\ No newline at end of file
+/* no line break in top menu */
+.dropdown-menu a{white-space: nowrap;}
\ No newline at end of file
-- 
GitLab