From 908d5b8c110bbcbec42283e4bb416ff8a887c745 Mon Sep 17 00:00:00 2001
From: "Hahn Axel (hahn)" <axel.hahn@unibe.ch>
Date: Fri, 24 Nov 2023 11:12:55 +0100
Subject: [PATCH] get version from 1st json file

---
 public_html/deployment/inc_functions.php      | 249 ++++++++++--------
 public_html/deployment/index.php              |   2 +-
 public_html/deployment/main.css               |   2 +-
 .../deployment/ui/page_replacements.php       |   2 +-
 4 files changed, 139 insertions(+), 116 deletions(-)

diff --git a/public_html/deployment/inc_functions.php b/public_html/deployment/inc_functions.php
index fce1cd7e..19d3f1e0 100644
--- a/public_html/deployment/inc_functions.php
+++ b/public_html/deployment/inc_functions.php
@@ -28,7 +28,7 @@ if (isset($_SERVER) && is_array($_SERVER) && array_key_exists("REQUEST_URI", $_S
         array_shift($aTmp);
         array_shift($aTmp);
         if (
-                count($aTmp) && $aTmp[count($aTmp) - 1] && $aTmp[count($aTmp) - 1][0] == "?"
+            count($aTmp) && $aTmp[count($aTmp) - 1] && $aTmp[count($aTmp) - 1][0] == "?"
         ) {
             array_pop($aTmp);
         }
@@ -59,8 +59,7 @@ if (isset($_SERVER) && is_array($_SERVER) && array_key_exists("REQUEST_URI", $_S
     foreach (array_keys($aParams) as $sKey) {
         $aParams[$sKey] = is_string($aParams[$sKey])
             ? str_replace(array('\\', "\0", "\n", "\r", "'", '"', "\x1a"), array('\\\\', '\\0', '\\n', '\\r', "\\'", '\\"', '\\Z'), $aParams[$sKey])
-            : $aParams[$sKey]
-        ;
+            : $aParams[$sKey];
     }
 }
 
@@ -68,14 +67,15 @@ if (isset($_SERVER) && is_array($_SERVER) && array_key_exists("REQUEST_URI", $_S
  * get home link as button
  * @return string
  */
-function aHome($sClass = "btn btn-default") {
+function aHome($sClass = "btn btn-default")
+{
     global $oHtml;
     // if (!array_key_exists("prj", $aParams)) return false;
     return $oHtml->getLinkButton(array(
-        'href'=>'/deployment/?',
-        'icon'=>'overview',
-        'class'=>$sClass,
-        'label'=>t("menu-overview"),
+        'href' => '/deployment/?',
+        'icon' => 'overview',
+        'class' => $sClass,
+        'label' => t("menu-overview"),
     ));
 }
 
@@ -83,12 +83,13 @@ function aHome($sClass = "btn btn-default") {
  * get project Home link as button
  * @return string
  */
-function aPrjHome($sClass = "btn btn-default") {
+function aPrjHome($sClass = "btn btn-default")
+{
     global $aParams, $oHtml;
-    if (!array_key_exists("prj", $aParams)){
+    if (!array_key_exists("prj", $aParams)) {
         return false;
     }
-    if ($aParams["prj"] == "all"){
+    if ($aParams["prj"] == "all") {
         return aHome($sClass);
     }
     // if (!array_key_exists("action", $aParams)) return false;
@@ -96,10 +97,10 @@ function aPrjHome($sClass = "btn btn-default") {
     require_once("./classes/project.class.php");
     $oPrj = new project($aParams["prj"]);
     return $oHtml->getLinkButton(array(
-        'href'=>'/deployment/' . $aParams["prj"] . '/',
-        'icon'=>'project',
-        'class'=>$sClass,
-        'label'=>$oPrj->getLabel(),
+        'href' => '/deployment/' . $aParams["prj"] . '/',
+        'icon' => 'project',
+        'class' => $sClass,
+        'label' => $oPrj->getLabel(),
     ));
 }
 
@@ -107,29 +108,31 @@ function aPrjHome($sClass = "btn btn-default") {
  * get go back link as button
  * @return string
  */
-function aGoback($sClass = "btn btn-default") {
+function aGoback($sClass = "btn btn-default")
+{
     global $oHtml;
     return $oHtml->getLinkButton(array(
-        'href'=>'#',
-        'onclick'=>'history.back();',
-        'title'=>t("back"),
-        'icon'=>'back',
-        'class'=>$sClass,
-        'label'=>t("back")
+        'href' => '#',
+        'onclick' => 'history.back();',
+        'title' => t("back"),
+        'icon' => 'back',
+        'class' => $sClass,
+        'label' => t("back")
     ));
 }
 /**
  * get go top link as button
  * @return string
  */
-function aGotop($sClass = "scroll-link btn btn-default") {
+function aGotop($sClass = "scroll-link btn btn-default")
+{
     global $oHtml;
     return $oHtml->getLinkButton(array(
-        'href'=>'#top',
-        'class'=>$sClass,
-        'title'=>t("gotop"),
-        'icon'=>'gotop',
-        'label'=>' '
+        'href' => '#top',
+        'class' => $sClass,
+        'title' => t("gotop"),
+        'icon' => 'gotop',
+        'label' => ' '
     ));
 }
 
@@ -137,7 +140,8 @@ function aGotop($sClass = "scroll-link btn btn-default") {
  * get array top left navigation
  * @return array
  */
-function getTopNavLeft($aEmbed=[]) {
+function getTopNavLeft($aEmbed = [])
+{
     global $aParams, $oHtml;
     $aReturn = [];
     require_once("./classes/project.class.php");
@@ -147,23 +151,23 @@ function getTopNavLeft($aEmbed=[]) {
 
     $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"';
+    $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"';
 
     // $aReturn[]=['label'=>'=' ];
-    $aReturn[]=['href'=>$sBaseUrl . '', 'label'=>'&nbsp;Deployment UI <small class="badge bg-info"><nobr>v'.APP_VERSION.'</nobr></small>',    'icon'=>'', 'class'=>'imllogo topbrand' ];
+    $aReturn[] = ['href' => $sBaseUrl . '', 'label' => '&nbsp;Deployment UI <small class="badge bg-info"><nobr>v' . APP_VERSION . '</nobr></small>',    'icon' => '', 'class' => 'imllogo topbrand'];
 
-    if($oUser->getUsername()){
+    if ($oUser->getUsername()) {
         $oPrj1 = new project();
-        $aPrjItems=[];
+        $aPrjItems = [];
         foreach ($oPrj1->getProjects("label") as $aProject) {
-            $aPrjItems[]=[
-                'href'=>$sBaseUrl . $aProject['id'] .'/', 
-                'label'=>$aProject['label'], 
-                'class'=>$sCurrentProject===$aProject['id'] ? 'active' : '', 
-                'icon'=>'fa-solid fa-book',
+            $aPrjItems[] = [
+                'href' => $sBaseUrl . $aProject['id'] . '/',
+                'label' => $aProject['label'],
+                'class' => $sCurrentProject === $aProject['id'] ? 'active' : '',
+                'icon' => 'fa-solid fa-book',
             ];
         }
         /* to test a scrolling menu
@@ -174,50 +178,48 @@ function getTopNavLeft($aEmbed=[]) {
         );
         */
 
-        $aReturn[]=[
-                    'href'=>$sBaseUrl, 'label'=>t("menu"), 'class'=>(array_key_exists("prj", $aParams) && $aParams['prj']==='all' ? 'active' : ''),
-                    'icon'=>'fa-solid fa-chevron-right',
-                    'children'=>[
-                        ['href'=>$sBaseUrl . 'all/setup/new/',       'label'=>t("menu-new-project"), 'icon'=>'fa-regular fa-star' ],
-                        ['href'=>$sBaseUrl . 'all/setup/actionlog/', 'label'=>t("menu-logs"),        'icon'=>'fa-regular fa-rectangle-list'],
-                        ['href'=>$sBaseUrl . 'all/setup/checklang/', 'label'=>t("menu-checklang"),   'icon'=>'fa-regular fa-comment'],
-                        ['href'=>$sBaseUrl . 'all/setup/',           'label'=>t("menu-settings"),    'icon'=>'fa-solid fa-gear'],
-                    ]
-                ];
-        if(count($aPrjItems)){
-            $aReturn[]=[
-                    'href'=>'#','label'=>t("menu-projects"), 'icon'=>'fa-solid fa-box-open', 
-                    'children'=>$aPrjItems
-                ]
-                ;
+        $aReturn[] = [
+            'href' => $sBaseUrl, 'label' => t("menu"), 'class' => (array_key_exists("prj", $aParams) && $aParams['prj'] === 'all' ? 'active' : ''),
+            'icon' => 'fa-solid fa-chevron-right',
+            'children' => [
+                ['href' => $sBaseUrl . 'all/setup/new/',       'label' => t("menu-new-project"), 'icon' => 'fa-regular fa-star'],
+                ['href' => $sBaseUrl . 'all/setup/actionlog/', 'label' => t("menu-logs"),        'icon' => 'fa-regular fa-rectangle-list'],
+                ['href' => $sBaseUrl . 'all/setup/checklang/', 'label' => t("menu-checklang"),   'icon' => 'fa-regular fa-comment'],
+                ['href' => $sBaseUrl . 'all/setup/',           'label' => t("menu-settings"),    'icon' => 'fa-solid fa-gear'],
+            ]
+        ];
+        if (count($aPrjItems)) {
+            $aReturn[] = [
+                'href' => '#', 'label' => t("menu-projects"), 'icon' => 'fa-solid fa-box-open',
+                'children' => $aPrjItems
+            ];
         }
-        if ($sCurrentProject){
+        if ($sCurrentProject) {
             $oPrj = new project($aParams["prj"]);
-            $aPrjChildren=[
-                ['href'=>$sBaseUrl . $sCurrentProject . '/', 'label'=>$oHtml->getIcon('project-home').t("project-home"), 'icon'=>'', 'class'=>($sCurrentAction=='' ? 'active' :'')],
-                ['label'=>'-'],
+            $aPrjChildren = [
+                ['href' => $sBaseUrl . $sCurrentProject . '/', 'label' => $oHtml->getIcon('project-home') . t("project-home"), 'icon' => '', 'class' => ($sCurrentAction == '' ? 'active' : '')],
+                ['label' => '-'],
             ];
             $aPhases = $oPrj->getActivePhases();
             if (count($aPhases)) {
-                $aPrjChildren[]=['href'=>$sBaseUrl . $sCurrentProject . '/build/', 'label'=>$oHtml->getIcon('build').t("build"), 'icon'=>'', 'class'=>($sCurrentAction==='build' ? 'active' :'')];
-                $aPrjChildren[]=['label'=>'-'];
+                $aPrjChildren[] = ['href' => $sBaseUrl . $sCurrentProject . '/build/', 'label' => $oHtml->getIcon('build') . t("build"), 'icon' => '', 'class' => ($sCurrentAction === 'build' ? 'active' : '')];
+                $aPrjChildren[] = ['label' => '-'];
 
                 foreach ($aPhases as $sPhase) {
-                    $aPrjChildren[]=['href'=>$sBaseUrl . $sCurrentProject . '/phase/' . $sPhase . '/', 'label'=>$oHtml->getIcon('phase').$sPhase, 'icon'=>'', 'class'=>(isset($aParams['par3']) && $aParams['par3']===$sPhase ? 'active' :'')];
+                    $aPrjChildren[] = ['href' => $sBaseUrl . $sCurrentProject . '/phase/' . $sPhase . '/', 'label' => $oHtml->getIcon('phase') . $sPhase, 'icon' => '', 'class' => (isset($aParams['par3']) && $aParams['par3'] === $sPhase ? 'active' : '')];
                 }
-                $aPrjChildren[]=['label'=>'-'];
+                $aPrjChildren[] = ['label' => '-'];
             }
-            $aPrjChildren[]=['href'=>$sBaseUrl . $sCurrentProject . '/setup/',   'label'=>$oHtml->getIcon('setup').t("menu-project-settings"), 'icon'=>'',  'class'=>($sCurrentAction==='setup'   ? 'active' :'')];
-            $aPrjChildren[]=['href'=>$sBaseUrl . $sCurrentProject . '/cleanup/', 'label'=>$oHtml->getIcon('cleanup').t("menu-project-cleanup"), 'icon'=>'', 'class'=>($sCurrentAction==='cleanup' ? 'active' :'')];
-            $aPrjChildren[]=['href'=>$sBaseUrl . $sCurrentProject . '/delete/',  'label'=>$oHtml->getIcon('delete').t("menu-project-delete"), 'icon'=>'',   'class'=>($sCurrentAction==='delete'  ? 'active' :'')];
+            $aPrjChildren[] = ['href' => $sBaseUrl . $sCurrentProject . '/setup/',   'label' => $oHtml->getIcon('setup') . t("menu-project-settings"), 'icon' => '',  'class' => ($sCurrentAction === 'setup'   ? 'active' : '')];
+            $aPrjChildren[] = ['href' => $sBaseUrl . $sCurrentProject . '/cleanup/', 'label' => $oHtml->getIcon('cleanup') . t("menu-project-cleanup"), 'icon' => '', 'class' => ($sCurrentAction === 'cleanup' ? 'active' : '')];
+            $aPrjChildren[] = ['href' => $sBaseUrl . $sCurrentProject . '/delete/',  'label' => $oHtml->getIcon('delete') . t("menu-project-delete"), 'icon' => '',   'class' => ($sCurrentAction === 'delete'  ? 'active' : '')];
 
-            $aReturn[]=[
-                'href'=>'#','label'=>$oPrj->getLabel(), 'icon'=>'fa-solid fa-book', 'class'=>'active',
-                'children'=>$aPrjChildren
+            $aReturn[] = [
+                'href' => '#', 'label' => $oPrj->getLabel(), 'icon' => 'fa-solid fa-book', 'class' => 'active',
+                'children' => $aPrjChildren
             ];
         }
-
-    }    
+    }
     // echo '<pre>'.print_r($aReturn, 1); die(__FUNCTION__);
     return $aReturn;
 }
@@ -226,7 +228,8 @@ function getTopNavLeft($aEmbed=[]) {
  * get array top left navigation
  * @return array
  */
-function getTopNavRight() {
+function getTopNavRight()
+{
     global $aParams, $oHtml;
     $aReturn = [];
     require_once("./classes/project.class.php");
@@ -235,33 +238,34 @@ function getTopNavRight() {
 
     $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("menu-userprofile"),            'icon'=>'fa-regular fa-id-card', 'class'=>($sCurrentAction=='login' ? 'active' :'') ],
+    $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("menu-userprofile"),            'icon' => 'fa-regular fa-id-card', 'class' => ($sCurrentAction == 'login' ? 'active' : '')],
                 ]
             ]
         ];
-    } else{
-        $aReturn[]=['href'=>$sBaseUrl . 'all/login/',           'label'=>t("login"),            'icon'=>'fa-solid fa-right-to-bracket', 'class'=>($sCurrentAction=='login' ? 'active' :'') ];
+    } else {
+        $aReturn[] = ['href' => $sBaseUrl . 'all/login/',           'label' => t("login"),            'icon' => 'fa-solid fa-right-to-bracket', 'class' => ($sCurrentAction == 'login' ? 'active' : '')];
     }
-    $aReturn[]=['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'=>'' ],
-                    ['href'=>$sBaseUrl . 'all/doc',                                                                   'label'=>t('menu-help-classes'),                    'icon'=>'' ],
-                ]
-            ]
-        ;
+    $aReturn[] = [
+        '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' => ''],
+            ['href' => $sBaseUrl . 'all/doc',                                                                   'label' => t('menu-help-classes'),                    'icon' => ''],
+        ]
+    ];
 
     // echo '<pre>'.print_r($aReturn, 1); die(__FUNCTION__);
     return $aReturn;
@@ -273,45 +277,62 @@ function getTopNavRight() {
  * @param  string  $sLinkClass  classname for links; default: "" (adds class="btn btn-default")
  * @return string
  */
-function getBreadcrumb($sLinkClass="") {
+function getBreadcrumb($sLinkClass = "")
+{
     global $aParams, $oHtml;
     $sReturn = '';
     $sNav = '';
     $sLabel = '';
     // $sDelim=$oHtml->getIcon('fa-chevron-right');
 
-    $sDelim='&nbsp;&nbsp;&nbsp;/&nbsp;&nbsp;&nbsp;';
+    $sDelim = '&nbsp;&nbsp;&nbsp;/&nbsp;&nbsp;&nbsp;';
     if (array_key_exists("action", $aParams)) {
-        $sLabel .= $oHtml->getIcon($aParams["action"]).t($aParams["action"]);
+        $sLabel .= $oHtml->getIcon($aParams["action"]) . t($aParams["action"]);
         $sNav .= aHome($sLinkClass);
-        if ($aParams['prj']==='all'){
+        if ($aParams['prj'] === 'all') {
             // $sNav .= ' ' . $oHtml->getIcon('fa-chevron-right') . '[ci-GUI]';
         } else {
             $sNav .= ' ' . $sDelim . aPrjHome($sLinkClass);
         }
-        $sClass='action '.$aParams["action"];
+        $sClass = 'action ' . $aParams["action"];
         if (array_key_exists("par3", $aParams)) {
-            $sLabel=$oHtml->getIcon($aParams["par3"]). $aParams["par3"];
-            $sClass='action ' . $aParams["action"];
+            $sLabel = $oHtml->getIcon($aParams["par3"]) . $aParams["par3"];
+            $sClass = 'action ' . $aParams["action"];
         }
         // $sReturn.='<h2 class="action ' . $aParams["action"] . '">' . $sLabel . '</h2>';
     } else if (array_key_exists("prj", $aParams)) {
         $sNav .= aHome($sLinkClass);
-        $sClass='action prjhome';
+        $sClass = 'action prjhome';
         // $sLabel.=$oHtml->getIcon('project').t('project-home');
-        $sLabel.=aPrjHome($sLinkClass);
+        $sLabel .= aPrjHome($sLinkClass);
         // $sReturn.='<h2 class="action prjhome"> Projekt-Home</h2>';
     }
-    // $sReturn.=($sNav ? '<div id="navtop">' . $sNav .  ' ' . $sDelim . ' <span class="current">'.$sLabel.'</span></div>':'')
+        // $sReturn.=($sNav ? '<div id="navtop">' . $sNav .  ' ' . $sDelim . ' <span class="current">'.$sLabel.'</span></div>':'')
         // .'<h2 class="'.$sClass.'"> '.$sLabel.'</h2>'
-        ;
-    $sReturn.=($sNav ? '' . $sNav .  ' ' . $sDelim . ' <span class="current">'.$sLabel.'</span>':'');
-    if($sLinkClass){
-        $sReturn=str_replace(['btn-default ', 'btn '], ['', ''], $sReturn);
+    ;
+    $sReturn .= ($sNav ? '' . $sNav .  ' ' . $sDelim . ' <span class="current">' . $sLabel . '</span>' : '');
+    if ($sLinkClass) {
+        $sReturn = str_replace(['btn-default ', 'btn '], ['', ''], $sReturn);
     }
     return $sReturn;
 }
 
+/**
+ * get version info
+ * @return string
+ */
+function getVersioninfo()
+{
+    $sMyRev = "";
+
+    $aFiles = glob(dirname(dirname(__DIR__)) . "/*.json");
+    if (isset($aFiles[0])) {
+        $aJson = json_decode(file_get_contents($aFiles[0]), true);
+        $sMyRev = (isset($aJson["branch"]) ? $aJson["branch"] . ' - ' : '')
+            . (isset($aJson["date"]) ? $aJson["date"] : '');
+    }
+    return ($sMyRev  ? $sMyRev . ' @ ' : '') . php_uname("n");
+}
 /**
  * translate function
  * @global type $aConfig
@@ -319,7 +340,8 @@ function getBreadcrumb($sLinkClass="") {
  * @param string $s text
  * @return string
  */
-function t($s) {
+function t($s)
+{
     global $aConfig;
     static $aLang = array();
 
@@ -346,7 +368,8 @@ function t($s) {
  * @global type $aParams
  * @return string
  */
-function enterDeployinfos() {
+function enterDeployinfos()
+{
     global $aParams;
     $sIdUser = "inputUser";
     $sIdComment = "inputComment";
diff --git a/public_html/deployment/index.php b/public_html/deployment/index.php
index 8b38d559..15b6b397 100644
--- a/public_html/deployment/index.php
+++ b/public_html/deployment/index.php
@@ -1,6 +1,6 @@
 <?php
 
-define("APP_VERSION", '2.0-alpha');
+define("APP_VERSION", '2.0');
 
 session_start();
 
diff --git a/public_html/deployment/main.css b/public_html/deployment/main.css
index 91ec9c65..94ff5a0e 100644
--- a/public_html/deployment/main.css
+++ b/public_html/deployment/main.css
@@ -145,7 +145,7 @@ tr:hover{background:#f0f4f8; background_: linear-gradient(#f4f4f4,#fff,#f4f4f4);
 div.progressinprogress{color: #17a2b8;}
 div.progresshasqueue{color: #d61;}
 tr.progressinprogress{border-left:0.3em solid #17a2b8; }
-tr.progresshasqueue{border-left:0.3em solid #f81;}
+tr.progresshasqueue{border-left:0.3em solid #d61;}
 
 td.prj:nth-child(1) {max-width: 30em;}
 td.prj:nth-child(1) a{display: block; padding: 0.3em 0.5em; border-radius: 0.3em; background-color: #f0f4f8;}
diff --git a/public_html/deployment/ui/page_replacements.php b/public_html/deployment/ui/page_replacements.php
index ebb0c8a8..3b04020f 100644
--- a/public_html/deployment/ui/page_replacements.php
+++ b/public_html/deployment/ui/page_replacements.php
@@ -66,5 +66,5 @@ return [
     // '{{INJECT_JS}}' => $cr->renderJSLang(),
     '{{INJECT_JS}}' => '',
     '{{PAGE_FOOTER_LEFT}}'=>' &copy; 2013-' . date("Y") . ' <a href="https://www.iml.unibe.ch/" target="_blank">Institut f&uuml;r Medizinische Lehre; Universit&auml;t Bern</a>',
-    '{{PAGE_FOOTER_RIGHT}}'=>'Source: <a href="https://git-repo.iml.unibe.ch/iml-open-source/imldeployment/" target="_blank">git-repo.iml.unibe.ch</a>',
+    '{{PAGE_FOOTER_RIGHT}}'=>getVersioninfo() . ' | Source: <a href="https://git-repo.iml.unibe.ch/iml-open-source/imldeployment/" target="_blank">git-repo.iml.unibe.ch</a>',
 ];
\ No newline at end of file
-- 
GitLab