diff --git a/public_html/deployment/classes/actionlog.class.php b/public_html/deployment/classes/actionlog.class.php index 7eb14abe6d24613637edac6ba1a66d7437e87a8f..c75eac73f4663dc46f1d485e2adbd9ebc88b043a 100644 --- a/public_html/deployment/classes/actionlog.class.php +++ b/public_html/deployment/classes/actionlog.class.php @@ -23,7 +23,20 @@ class Actionlog { `action` TEXT, `message` TEXT )'; - + /* + private $_sCreateFUTURE = ' + CREATE TABLE "logs" ( + `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL UNIQUE , + `time` DATETIME, + `time-start` DATETIME, + `loglevel` TEXT, + `ip` TEXT, + `user` TEXT, + `project` TEXT, + `action` TEXT, + `message` TEXT + )'; + */ /** * constructor - sets internal environment variables and checks existence * of the database @@ -72,6 +85,11 @@ class Actionlog { // echo "<pre>$sSql</pre>"; $db = new PDO("sqlite:" . $this->_dbfile); $result = $db->query($sSql); + /* + if(!$result){ + echo "PDO ERROR " . print_r($db->errorInfo(), 1) ."<br>"; + } + */ $db = NULL; return $result; } @@ -81,8 +99,9 @@ class Actionlog { * @param string $sMessage message * @param string $sAction project action; i.e. build, deploy, ... * @param string $sLoglevel loglevel + * @return type */ - public function add($sMessage, $sAction = "", $sLoglevel = "info") { + public function add($sMessage, $sAction = "", $sLoglevel = "info", $sTimeStart = false) { if (array_search($sLoglevel, $this->_aLoglevels) === false) { die(__class__ . ": loglevel $sLoglevel is invalid"); } @@ -97,8 +116,24 @@ class Actionlog { '" . $sMessage . "' ); "; + /* + $sqlFUTURE = "INSERT INTO `logs` (`time`, ".($sTimeStart ? "`time-start`, " : "" )." `loglevel`, `ip`, `user`, `project` ,`action`, `message`) + VALUES( + '" . date("Y-m-d H:i:s") . "', + ".($sTimeStart ? "'" . $sTimeStart . "', " : "" ) ." + '" . $sLoglevel . "', + '" . $this->_sIP . "', + '" . $this->_sUser . "', + '" . $this->_sProject . "', + '" . $sAction . "', + '" . $sMessage . "' + ); + "; + * + */ // echo $sql . "<br>"; - $this->_makeQuery($sql); + $oResult=$this->_makeQuery($sql); + return $oResult; } /** @@ -200,7 +235,7 @@ class Actionlog { ); // --- list of all projects in log - $sSql='SELECT DISTINCT(project) from `logs`'; + $sSql='SELECT DISTINCT(project) from `logs` order by project asc'; $aForms["filter"]["form"]['selectproject'] = array( 'type' => 'select', 'name' => 'selectproject', @@ -281,9 +316,14 @@ class Actionlog { $sReturn = '<div id="divActionlogs">'.$oForm->renderHtml("filter").' <div style="clear: both; margin-bottom: 1em;"></div> <div id="tableLogactions"></div> + <!-- + <script src="/vendor/vis/4.21.0/vis.min.js"></script> + <link href="/vendor/vis/4.21.0/vis.min.css" rel="stylesheet" type="text/css" /> + <div id="divTimeline"></div> + --> </div> <script> - var sMsgNolog="'.t("class-actionlog-nolog").'"; + var sMsgNolog="'.t("class-actionlog-nolog").'"; </script>'; if ($bIsFullsearch){ @@ -325,5 +365,5 @@ class Actionlog { } return $sReturn; } - + } diff --git a/public_html/deployment/classes/html.tpl.php b/public_html/deployment/classes/html.tpl.php index c2fbb31f77c8e5c3280f1472444a09b1d4137542..60ce8573bf946e0e9050fb0e3378aee62025a968 100644 --- a/public_html/deployment/classes/html.tpl.php +++ b/public_html/deployment/classes/html.tpl.php @@ -11,10 +11,12 @@ not html5 valid: <meta http-equiv="cleartype" content="on"> <link href="/deployment/bootstrap3/css/bootstrap-theme.min.css" rel="stylesheet" type="text/css"/> + <link rel="stylesheet" type="text/css" href="/vendor/twitter-bootstrap/4.1.1/css/bootstrap.min.css"/> + <script src="/vendor/twitter-bootstrap/4.1.1/js/bootstrap.min.js"></script> --> <link rel="stylesheet" type="text/css" href="/vendor/bootstrap3/css/bootstrap.min.css"/> <link rel="stylesheet" type="text/css" href="/vendor/font-awesome-4.7.0/css/font-awesome.min.css"> - <script src="/vendor/jquery/jquery-3.2.0.min.js"></script> + <script src="/vendor/jquery/3.3.1/jquery.min.js"></script> <title>IML Deployment</title> <link rel="stylesheet" type="text/css" href="/deployment/main.css" media="screen"> diff --git a/public_html/deployment/classes/projectlist.class.php b/public_html/deployment/classes/projectlist.class.php index 8c267914e88d12ae6d869b7c5fea9f55d3363ae1..e18d23cb3dc74ca8d938d9c97642ea30a6c8f59e 100644 --- a/public_html/deployment/classes/projectlist.class.php +++ b/public_html/deployment/classes/projectlist.class.php @@ -20,6 +20,8 @@ class projectlist extends base{ // ---------------------------------------------------------------------- // CONFIG // ---------------------------------------------------------------------- + var $_sInprogress=''; + var $_sHasqueue=''; // ---------------------------------------------------------------------- // constructor // ---------------------------------------------------------------------- @@ -29,6 +31,9 @@ class projectlist extends base{ */ public function __construct() { $this->oUser=new user(); + + $this->_sInprogress='<div class="progressinprogress"><i class="fa fa-refresh" title="'.t("progress-inprogress").'"></i> '.t("progress-inprogress").'</div>'; + $this->_sHasqueue='<div class="progresshasqueue"><i class="glyphicon glyphicon-time" title="'.t("progress-hasqueue").'"></i> '.t("progress-hasqueue").'</div>'; // define } @@ -62,8 +67,12 @@ class projectlist extends base{ $sPrjFilter = ''; $sPhaseFilter = ''; - $sPrjFilter.='<option value="' . $sTrClass . '">' . t("all") . '</option>'; + $sPrjFilter.='<option value="">' . t("all") . '</option>'; $sPhaseFilter.='<option value="' . $sColClass . '">' . t("all") . '</option>'; + + $iInprogress=0; + $iHasqueue=0; + // foreach (array_keys($this->_aPhases) as $sPhase) { foreach (array_keys($oPrj1->getPhases()) as $sPhase) { $sPhaseFilter.='<option value="' . $sPhase . '" >' . $sPhase . '</option>'; @@ -74,6 +83,7 @@ class projectlist extends base{ $sOutPhases = ''; $sOutPhases2 = ''; + $sProgress=''; // loop over phases ... foreach (array_keys($oPrj->getPhases()) as $sPhase) { @@ -90,11 +100,14 @@ class projectlist extends base{ .($aProgress['hasQueue'] ? ' progresshasqueue' : '') ; - $sProgress='' - .($aProgress['inprogress'] ? '<div class="progressinprogress"><i class="fa fa-refresh" title="'.t("progress-inprogress").'"></i> '.t("progress-inprogress").'</div>' : '') - .($aProgress['hasQueue'] ? '<div class="progresshasqueue"><i class="glyphicon glyphicon-time" title="'.t("progress-hasqueue").'"></i> '.t("progress-hasqueue").'</div>' : '') - ; - + if($aProgress['inprogress']){ + $iInprogress++; + $sProgress.=$this->_sInprogress; + } + if($aProgress['hasQueue']){ + $iHasqueue++; + $sProgress.=$this->_sHasqueue; + } $sOut2 .= '<div class="' . $sClasses . ' prjbox"><div class="title">' .$oHtml->getLink(array( 'href'=>'#', @@ -175,26 +188,59 @@ class projectlist extends base{ * filter table by chosen select values for project and phase */ function filterOverviewTable(){ + + // --- reset + $(\'.' . $sTrClass . '\').removeClass("trproject-textfilter"); + $(\'.' . $sTrClass . '\').removeClass("trproject-progressfilter"); + $(\'.' . $sTrClass . '\').removeClass("trproject-projectfilter"); + $(\'.' . $sTrClass . '\').removeClass("trprojectfiltered"); + $(\'button.prjprogress\').removeClass(\'selected\'); + + // --- get free filter + var sSearch=$("#efilter").val(); + localStorage.setItem("efilter", sSearch); + var RegexFreetext = new RegExp(sSearch, "i"); + + // --- get project filter var sPrj=$("#prjfilter").val(); - // var sPhase=$("#phasefilter").val(); - // localStorage.setItem("selectedPhase", sPhase); - // $(\'.' . $sColClass . '\').hide(); $(\'.\' + sPhase).show(); localStorage.setItem("selectedPrj", sPrj); - $(\'.' . $sTrClass . '\').hide().removeClass("trprojectfiltered"); - $(\'.\' + sPrj).show(); - if (sPrj!="' . $sTrClass . '"){ - $(\'.\' + sPrj).addClass("trprojectfiltered"); - } + + // --- get progress filter + var sProgress=$("#progressfilter").val(); + localStorage.setItem("progress", sProgress); + $(\'#btnProgress\'+sProgress).addClass(\'selected\').blur(); + + // --- loop over project rows + + $(".trproject").each(function() { + if ( !RegexFreetext.exec(this.innerHTML)) { + $(this).addClass("trproject-textfilter"); + } + + if (sPrj){ + if ($(this).hasClass(sPrj)){ + $(this).addClass("trprojectfiltered"); + } else { + $(this).addClass("trproject-projectfilter"); + } + } + if (sProgress && !$(this).hasClass("progress" + sProgress)){ + $(this).addClass("trproject-progressfilter"); + } + + }); + showResetbtn(); } /** + * onclick event of [filter] button in table row of a project * toggle: show a single project/ all projects */ function setProjectFilter(sPrj){ var sCurrentPrj=$(\'#prjfilter\').val(); - if (sCurrentPrj != \'' .$sTrClass. '\'){ - $(\'#prjfilter\').val(\'' .$sTrClass. '\'); + if (sCurrentPrj != \'\'){ + $(\'#prjfilter\').val(\'\'); } else { $(\'#prjfilter\').val(sPrj); } @@ -206,19 +252,8 @@ class projectlist extends base{ * filter table and tiles by filtertext */ function filterTableByTyping(){ - var sVisible=""; - var sSearch=$("#efilter").val(); - localStorage.setItem("efilter", sSearch); - var Regex = new RegExp(sSearch, "i"); - $(".trproject").each(function() { - sVisible="none"; - if ( Regex.exec(this.innerHTML)) { - sVisible=""; - } - $(this).css("display", sVisible); - }); - showResetbtn(); - return false; + filterOverviewTable(); + return false; } /** @@ -246,12 +281,8 @@ class projectlist extends base{ * filter table by progress status */ function setprogress(){ - var sProgress=$("#progressfilter").val(); - $(\'.progress\').hide(); - $(\'.progress\'+sProgress).show(); - localStorage.setItem("progress", sProgress); - showResetbtn(); - return false; + filterOverviewTable(); + return false; } /** @@ -272,6 +303,12 @@ class projectlist extends base{ } else { $("#phasefilter").val($("#phasefilter option:first").val()); } + + if (localStorage.getItem("progress") && localStorage.getItem("progress")!=\'null\'){ + $("#progressfilter").val(localStorage.getItem("progress")); + } else { + $("#progressfilter").val($("#progressfilter option:first").val()); + } // window.setTimeout("filterOverviewTable();", 10); filterOverviewTable(); @@ -294,12 +331,14 @@ class projectlist extends base{ * Button zum Filter reset anzeigen/ verbergen */ function showResetbtn(){ - var sVisible=($("#efilter").val())?"visible":"hidden"; - if ($("#prjfilter").val()!="' . $sTrClass . '")sVisible="visible"; + var sVisible=$("#efilter").val()?"visible":"hidden"; + if ($("#prjfilter").val()>"")sVisible="visible"; // if ($("#phasefilter").val()!="' . $sColClass . '")sVisible="visible"; if ($("#rolefilter").val())sVisible="visible"; if ($("#progressfilter").val())sVisible="visible"; $("#btnresetfilter").css("visibility", sVisible); + + $("#btnresetefilter").css("visibility", $("#efilter").val()?"visible":"hidden"); return false; } @@ -307,7 +346,7 @@ class projectlist extends base{ * Aktion des Filter reset: Filter zurücksetzen */ function resetFilter(){ - $(\'#prjfilter\').val(\'' .$sTrClass. '\'); + $(\'#prjfilter\').val(\'\'); // $("#phasefilter").val(""); filterOverviewTable(); $("#efilter").val(""); @@ -324,24 +363,50 @@ class projectlist extends base{ <form class="form-inline"> + <!-- <a href="#" class="view viewextended" onclick="setview(\'simple\');"><i class="glyphicon glyphicon-th-large"></i> ' . t("overview-simpleview") . '</a> <a href="#" class="view viewsimple" onclick="setview(\'extended\');" ><i class="glyphicon glyphicon-th-list"></i> ' . t("overview-extview") . '</a> | - + --> + <label for="efilter"> <i class="glyphicon glyphicon-filter"></i> ' . t("overview-textsearch") . ': </label> <input type="text" id="efilter" name="efilter" class="form-control" - style="width: 150px;" + style="width: 200px;" onchange="filterTableByTyping();" onKeypress="filterTableByTyping(); " onKeyup="filterTableByTyping(); " title="' . t("overview-textsearch-hint") . '" > + <button class="btn btn-default" onclick="$(\'#efilter\').val(\''.$this->oUser->getUsername().'\'); filterTableByTyping(); return false;"> + '.$this->oUser->getUsername().' + </button> + <button id="btnresetefilter" class="btn btn-default" onclick="$(\'#efilter\').val(\'\'); filterTableByTyping(); return false;"> + x + </button> + + + <span style="display: none;"> + <label for="progressfilter"> + ' . t("overview-filterprogress") . ': + </label> + <select id="progressfilter" class="form-control" onchange="setprogress(); return false;"> + <option value="">' . t("all") . '</option> + <option value="inprogress">' . t("progress-inprogress") . '</option> + <option value="hasqueue">' . t("progress-hasqueue") . '</option> + </select> + </span> + + <button id="btnProgress" class="btn btn-default prjprogress" onclick="$(\'#progressfilter\').val(\'\'); return setprogress();" >'.t("overview-projectcount").'<br><span>'.count($oPrj1->getProjects()).'</span></button> + <button id="btnProgressinprogress" class="btn btn-default prjprogress" onclick="$(\'#progressfilter\').val(\'inprogress\'); return setprogress();" >'.$this->_sInprogress.'<span>'.$iInprogress.'</span></button> + <button id="btnProgresshasqueue" class="btn btn-default prjprogress" onclick="$(\'#progressfilter\').val(\'hasqueue\'); return setprogress();" >'.$this->_sHasqueue .'<span>'.$iHasqueue.'</span></button> + + <span style="display: none;"> <span class="view viewextended"> <label for="prjfilter"> @@ -360,7 +425,12 @@ class projectlist extends base{ </span> </span> + </span> + + + <input type="hidden" id="rolefilter" value="" /> + <!-- <label for="rolefilter"> ' . t("overview-filterrole") . ': </label> @@ -369,15 +439,8 @@ class projectlist extends base{ <option value="developer">' . t("developer") . '</option> <option value="pl">' . t("projectmanager") . '</option> </select> + --> - <label for="rolefilter"> - ' . t("overview-filterprogress") . ': - </label> - <select id="progressfilter" class="form-control" onchange="setprogress(); return false;"> - <option value="">' . t("all") . '</option> - <option value="inprogress">' . t("progress-inprogress") . '</option> - <option value="hasqueue">' . t("progress-hasqueue") . '</option> - </select> <a href="#" class="btn btn-danger" id="btnresetfilter" title="' . t("overview-filterreset-hint") . '" @@ -385,6 +448,7 @@ class projectlist extends base{ </form> <div style="clear: both; margin-bottom: 1em"></div> </div> + <br> <div class="view viewsimple">