<!DOCTYPE html> | |
<html > | |
<head> | |
<meta charset="utf-8"> | |
<title>thUnDer</title> | |
<link rel="stylesheet" href="demo.css"> | |
<link rel="shortcut icon" href="favicon.ico"> | |
<link rel="stylesheet" href="font-awesome.min.css"> | |
<link rel="stylesheet" href="bootstrap.min.css"> | |
<link rel="stylesheet" href="form-validation.css"> | |
<link rel="stylesheet" href="jquery-ui.css"> | |
<!-- <script type="text/javascript" src="test.json"></script> --> | |
</head> | |
<body > | |
<header> | |
<h1>thUnDer <i class="fa fa-arrow-up" style="font-size:24px"></i><i class="fa fa-arrow-down" style="font-size:24px"></i></h1> | |
<div class="btn-group" id="display-current-user"> | |
<button id="userProfile" type="button" class="btn btn-secondary dropdown-toggle" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false"> | |
Action | |
</button> | |
<div class="dropdown-menu"> | |
<a class="dropdown-item" href="login.html?logout">Logout</a> | |
</div> | |
</div> | |
</header> | |
<ul> | |
<li> <a href="#" class="active"> HOME </a></li> | |
<li><a href="#" id="results">RESULTS</a></li> | |
</ul> | |
<div class="main-content"> | |
<div style="padding:15px" class="falg1"> | |
<div > | |
<div > | |
<div style="height:4em"> | |
<div id="platformList"><div class="ui-select"><div data-corners="true" data-shadow="true" data-iconshadow="true" data-wrapperels="span" data-icon="arrow-d" data-iconpos="right" data-theme="c" data-mini="true" class="ui-btn ui-shadow ui-btn-corner-all ui-mini ui-btn-icon-right ui-btn-up-c"><span class="ui-btn-inner"><span class="ui-btn-text"><span>Select Testbed</span></span><span class="ui-icon ui-icon-arrow-d ui-icon-shadow"> </span></span><select id="selPlatformList" data-mini="true" ><option>Select Testbed</option></select></div></div></div> | |
<button type="button" data-icon="gear" data-theme="b" data-iconpos="right" data-mini="true" data-inline="true" id="add" ><span class="ui-btn-text" >Add Job </span> <span class="ui-icon ui-icon-gear ui-icon-shadow" style=" position: relative; margin-left: 10px; float:right; "> </span> </button> | |
</div> | |
<div id="noActiveUD"> You have no active U/D jobs.</div> | |
<div data-role="collapsible-set" data-content-theme="d" id="set"> | |
</div> | |
</div><!--/demo-html --> | |
</div><!-- /content --> | |
<div class ="submit" id="submit" style="margin-top: 1em;" style="display:none"> | |
<button type="button" data-theme="b" data-mini="true" data-inline="true" id="btnSubmit" >Start U/D</button> | |
</div> | |
</div><!-- /page --> | |
</div> | |
<div style="padding:15px" id="testbedPage"> | |
</div> | |
<div class ="submit" id="book" style="margin-top: 1em;" > | |
<center> | |
<button type="button" data-theme="b" data-mini="true" data-inline="true" id="btnBook" >Book</button> | |
<button type="button" data-theme="b" data-mini="true" data-inline="true" id="btnRelease" >Release</button> | |
<button type="button" data-theme="b" data-mini="true" data-inline="true" id="btnRequestRelease" >Request to release</button> | |
</center> | |
</div> | |
<div id="modalLoading">Loading</div> | |
<!-- Modal --> | |
<div class="modal fade" id="myModalHorizontal" tabindex="-1" role="dialog" | |
aria-labelledby="myModalLabel" aria-hidden="true"> | |
<div class="modal-dialog modal-large"> | |
<div class="modal-content"> | |
<!-- Modal Header --> | |
<div class="modal-header"> | |
<button type="button" class="close" | |
data-dismiss="modal"> | |
<span aria-hidden="true">×</span> | |
<span class="sr-only">Close</span> | |
</button> | |
<h4 class="modal-title" id="myModalLabel"> | |
Custom Testbed | |
</h4> | |
</div> | |
<!-- Modal Body --> | |
<div class="modal-body"> | |
<form class="form-horizontal" method="post" role="form" id="customTB-form" novalidate="novalidate"> | |
<fieldset> | |
<legend>BMC Details</legend> | |
<div class='row'> | |
<div class='col-sm-6'> | |
<div class="form-group required"> | |
<div> | |
<label class=" control-label" | |
for="selectPlatformCustomTB">Select Platform</label> | |
<select id = "selectPlatformCustomTB" name="selectPlatformCustomTB"> | |
<option>Select platform </option> | |
<option value="aa">Aa</option> | |
<option value="c1">C1</option> | |
<option value="d1">D1</option> | |
<option value="d2">D2</option> | |
<option value="i">I</option> | |
<option value="s1">S1</option> | |
<option value="s">S2</option> | |
</select> | |
</div> | |
</div> | |
</div> | |
<div class='col-sm-6'> | |
<div class="form-group required"> | |
<div> | |
<label class=" control-label" | |
for="inputBMCIP">BMC IP</label> | |
<input type="text" class="form-control" | |
id="inputBMCIP" placeholder="BMC IP" name="inputBMCIP" /> | |
</div> | |
</div> | |
</div> | |
</div> | |
<div class='row'> | |
<div class='col-sm-6'> | |
<div class="form-group required"> | |
<div> | |
<label class=" control-label" | |
for="inputBmcUserName">BMC user name</label> | |
<input type="text" class="form-control" | |
id="inputBmcUserName" placeholder="BMC user name" name="inputBmcUserName" /> | |
</div> | |
</div> | |
</div> | |
<div class='col-sm-6'> | |
<div class="form-group required"> | |
<label class="control-label" | |
for="inputBmcPassword" >BMC Password</label> | |
<input type="password" class="form-control" | |
id="inputBmcPassword" placeholder="BMC Password" name="inputBmcPassword" /> | |
</div> | |
</div> | |
</div> | |
<div class='row'> | |
<div class='col-sm-5'> | |
<div class="form-group required"> | |
<label class="control-label" | |
for="inputLocation" >Location</label> | |
<select id = "inputLocation" name="inputLocation"> | |
<option>Select Location </option> | |
<option value="blr">BLR</option> | |
<option value="sjc">SJC</option> | |
</select> | |
</div> | |
</div> | |
</div> | |
</fieldset> | |
<fieldset> | |
<legend>Host Details</legend> | |
<div class='row'> | |
<div class='col-sm-6'> | |
<div class="form-group"> | |
<label class=" control-label" | |
for="inputBMCIP">Host IP </label> | |
<input type="text" class="form-control" | |
id="inputHostIP" placeholder="Host IP" name="" /> | |
</div> | |
</div> | |
<div class='col-sm-6'> | |
<div class="form-group "> | |
<label class=" control-label" | |
for="inputOsUserName">Os User Name </label> | |
<input type="text" class="form-control" | |
id="inputOsUserName" placeholder="Os User Name " name="inputOsUserName"/> | |
</div> | |
</div> | |
</div> | |
<div class='row'> | |
<div class='col-sm-6'> | |
<div class="form-group "> | |
<label class=" control-label" | |
for="inputOsUserpwd">Os Password </label> | |
<input type="text" class="form-control" | |
id="inputOsUserpwd" placeholder="Os Password " name="inputOsUserpwd"/> | |
</div> | |
</div> | |
</div> | |
</fieldset> | |
<fieldset> | |
<legend>Serial Connection Host</legend> | |
<div class='row'> | |
<div class='col-sm-6'> | |
<div class="form-group"> | |
<label class=" control-label" | |
for="inputHostSerSrvrType">Host Serial Server Type </label> | |
<input type="text" class="form-control" | |
id="inputHostSerSrvrType" placeholder="Host Serial Server Type" name=""/> | |
</div> | |
</div> | |
<div class='col-sm-6'> | |
<div class="form-group"> | |
<label class=" control-label" | |
for="inputHostSerSrvrIP">Host Serial Server IP</label> | |
<input type="text" class="form-control" | |
id="inputHostSerSrvrIP" placeholder="Host Serial Server IP" name=""/> | |
</div> | |
</div> | |
</div> | |
<div class='row'> | |
<div class='col-sm-6'> | |
<div class="form-group"> | |
<label class=" control-label" | |
for="inputHostSerSrvrPort">Host Serial Server Port</label> | |
<input type="text" class="form-control" | |
id="inputHostSerSrvrPort" placeholder="Host Serial Server Port" name=""/> | |
</div> | |
</div> | |
<div class='col-sm-6'> | |
<div class="form-group"> | |
<label class=" control-label" | |
for="inputHostSerSrvrUserName">Host Serial User Name</label> | |
<input type="text" class="form-control" | |
id="inputHostSerSrvrUserName" placeholder="Host Serial User Name" name=""/> | |
</div> | |
</div> | |
</div> | |
<div class='row'> | |
<div class='col-sm-6'> | |
<div class="form-group"> | |
<label class=" control-label" | |
for="inputHostSerSrvrPassword">Host Serial Password</label> | |
<input type="password" class="form-control" | |
id="inputHostSerSrvrPassword" placeholder="Host Serial Password" name=""/> | |
</div> | |
</div> | |
</div> | |
</fieldset> | |
<fieldset> | |
<legend>Serial Connection BMC</legend> | |
<div class='row'> | |
<div class='col-sm-6'> | |
<div class="form-group"> | |
<label class=" control-label" | |
for="inputBMCSrialConsoleType">BMC serial console Type </label> | |
<input type="text" class="form-control" | |
id="inputBMCSrialConsoleType" placeholder="BMC serial console Type" name=""/> | |
</div> | |
</div> | |
<div class='col-sm-6'> | |
<div class="form-group"> | |
<label class=" control-label" | |
for="inputBMCSrialConsoleIP">BMC serial console IP</label> | |
<input type="text" class="form-control" | |
id="inputBMCSrialConsoleIP" placeholder="BMC serial console IP" name=""/> | |
</div> | |
</div> | |
</div> | |
<div class='row'> | |
<div class='col-sm-6'> | |
<div class="form-group"> | |
<label class="control-label" | |
for="inputBMCSrialConsolePort">BMC serial console Port</label> | |
<input type="text" class="form-control" | |
id="inputBMCSrialConsolePort" placeholder="BMC serial console Port" name=""/> | |
</div> | |
</div> | |
<div class='col-sm-6'> | |
<div class="form-group"> | |
<label class=" control-label" | |
for="inputBMCSrialConsoleUser">BMC serial console User Name</label> | |
<input type="text" class="form-control" | |
id="inputBMCSrialConsoleUser" placeholder="BMC serial console User Name" name=""/> | |
</div> | |
</div> | |
</div> | |
<div class='row'> | |
<div class='col-sm-6'> | |
<div class="form-group"> | |
<label class=" control-label" | |
for="inputBMCSrialConsolePwd">BMC serial console Password</label> | |
<input type="text" class="form-control" | |
id="inputBMCSrialConsolePwd" placeholder="BMC serial console Password" name=""/> | |
</div> | |
</div> | |
</div> | |
</fieldset> | |
<fieldset> | |
<legend>APC (PDU details)</legend> | |
<div class='row'> | |
<div class='col-sm-6'> | |
<div class="form-group "> | |
<label class=" control-label" | |
for="inputAPCIP">APC IP </label> | |
<input type="text" class="form-control" | |
id="inputAPCIP" placeholder="APC IP" name="inputAPCIP"/> | |
</div> | |
</div> | |
<div class='col-sm-6'> | |
<div class="form-group "> | |
<label class=" control-label" | |
for="inputAPCPorts">APC Ports </label> | |
<input type="text" class="form-control" | |
id="inputAPCPorts" placeholder="APC Ports" name="inputAPCPorts"/> | |
</div> | |
</div> | |
</div> | |
<div class='row'> | |
<div class='col-sm-6'> | |
<div class="form-group "> | |
<label class=" control-label" | |
for="inputAPCModalType">APC Model Type </label> | |
<input type="text" class="form-control" | |
id="inputAPCModalType" placeholder="APC Model Type" name="inputAPCModalType"/> | |
</div> | |
</div> | |
</div> | |
</fieldset> | |
<div class="modal-footer"> | |
<button type="button" class="btn btn-default" | |
data-dismiss="modal"> | |
Close | |
</button> | |
<button type="submit" class="btn btn-primary"> | |
Submit | |
</button> | |
</div> | |
</form> | |
</div> | |
</div> | |
</div> | |
</div> | |
<!-- Modal end--> | |
<!-- <div id="wait'"></div> --> | |
<script src="jquery.js"></script> | |
<!-- <script src="jquery.mobile-1.3.1.min.js"></script> --> | |
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.2/jquery.min.js"></script> | |
<script src="jquery-ui.js"></script> | |
<script type="text/javascript"> | |
$.widget.bridge('uitooltip', $.ui.tooltip); | |
$.widget.bridge('uibutton', $.ui.button); | |
</script> | |
<script src="bootstrap.min.js"></script> | |
<script src="jquery.validate.min.js"></script> | |
<!-- <script src="mockjax.js"></script> --> | |
<script> | |
var testbedListUpdated=[]; | |
var submitFlag = false; | |
var userName1 =localStorage.getItem("user"); | |
var userName = userName1.split("@")[0]; | |
console.log("userName : "+userName); | |
var data1 ; | |
var testbedDetails; | |
var details; | |
$(document).ready(function() { | |
$('#modalLoading').modal('show'); | |
$("#userProfile").html('<i class="icon-user"></i> '+userName+'<img id="down-arrow-button" src="black-asc.gif">') | |
var nextId = 0; | |
var platform =[]; | |
//var details =getIsos(); | |
$.ajax({ | |
url: "/getisos/blr", | |
type: "GET", | |
async:false, | |
success: function(response){ | |
//console.log("response is "+response); | |
details =JSON.parse(response); | |
//console.log("detail is"); | |
//console.log(details); | |
} | |
}); | |
//details = JSON.parse(details); | |
for (var key in details) { | |
//console.log("Key : "+key) | |
platform.push(key); | |
} | |
var selOptPlatform=""; | |
for (var key in details) { | |
selOptPlatform += "<option>"+key+"</option>"; | |
} | |
updateTbDropdown(); | |
$('#modalLoading').modal('hide'); | |
$("#add").click(function(i, e) { | |
var plnameList =[]; | |
var testbedList =[]; | |
var testbed = gettestbed(); | |
//console.log('testbed '+testbed) | |
if(testbed){ | |
//alert("testbed "+testbed); | |
testbedList.push(testbed); | |
var testbedName=containsAll(testbedList,testbedListUpdated); | |
if(testbedName) { | |
var plname= getPlatfrom(); | |
} | |
} | |
if( plname){ | |
//console.log("For"+details[plname]['key']); | |
//console.log("created "+plname); | |
planningJoblist(plname,testbedName); | |
testbedListUpdated.push(testbedName); | |
} | |
$('[data-toggle="tooltip"]').tooltip(); | |
}); | |
$("#expand").click(function() { | |
$("#set").children(":last").trigger( "expand" ); | |
}); | |
$("#collapse").click(function() { | |
$("#set").children(":last").trigger( "collapse" ); | |
}); | |
// Testbed drop down change | |
$('#selPlatformList').change(function(event){ | |
//console.log("change"); | |
//console.log( $('#selPlatformList>option:selected').text()); | |
var text1 =$( event.target ).closest('div').find('.ui-btn-text').text(); | |
console.log( $( event.target ).closest('div').find('.ui-btn-text').text(text1.replace($( event.target ).closest('div').find('.ui-btn-text').text(), $('#selPlatformList>option:selected').text()))); | |
//alert("test"); | |
//$( event.target ).closest('div').find('.ui-btn-text').attr("data-toggle", "tooltip") | |
//$('[data-toggle="tooltip"]').tooltip(); | |
$(this).attr("data-original-title", $(this).val()); | |
$('#selPlatformList').tooltip(); | |
}); | |
// Form submit | |
$("#btnSubmit").click(function(url) { | |
var dataObject = {}; | |
var newObj = {}; | |
var values = [], i, j, cur; | |
var lengthofjob=$(".joblist").length; | |
newObj[userName]=[]; | |
dataObject[userName]=[]; | |
//var listItems = $(".joblist"); | |
for (i = 0, j = lengthofjob; i < j; i++) { | |
console.log($("#set").find("div.joblist").eq(i).find("input[type=hidden]").eq(0).val()); | |
console.log($("#set").find("div.joblist").eq(i).find("input[type=text]").eq(0).val()); | |
console.log($("#set").find("div.joblist").eq(i).find("select option:selected").eq(0).text()); | |
console.log($("#set").find("div.joblist").eq(i).find("select option:selected").eq(0).val()); | |
console.log($("#set").find("div.joblist").eq(i).find("select option:selected").eq(1).text()); | |
console.log($("#set").find("div.joblist").eq(i).find("select option:selected").eq(1).val()); | |
console.log($("#set").find("div.joblist").eq(i).find("input[id=custom_data]").eq(0).val()); | |
console.log($("#set").find("div.joblist").eq(i).find("input[type=radio]:checked").val()); | |
console.log($("#set").find("div.joblist").eq(i).find("input[type=number]").eq(0).val()); | |
if(($("#set").find("div.joblist").eq(i).find("select option:selected").eq(0).text()) == 'From Build ...'){ | |
alert("Please select a Upgrade From iso"); | |
$("#set").find("div.joblist").eq(i).find("select").eq(0).focus(); | |
return false; | |
} | |
if(($("#set").find("div.joblist").eq(i).find("select option:selected").eq(1).text()) == 'TO Build ...'){ | |
alert("Please select a Upgrade To iso"); | |
$("#set").find("div.joblist").eq(i).find("select").eq(1).focus(); | |
return false; | |
} | |
if(($("#set").find("div.joblist").eq(i).find("select option:selected").eq(0).text().trim()) == ($("#set").find("div.joblist").eq(i).find("select option:selected").eq(1).text().trim())){ | |
alert("For U/D From and To build should be diffrent . Please select diffrent build."); | |
$("#set").find("div.joblist").eq(i).find("select").eq(1).focus(); | |
return false; | |
} | |
/*var k=$("#set").find("div.joblist").eq(i).find("input[type=text]").eq(0).val(); | |
if (!(k in dataObject)) { | |
// dataObject.push(new Array()); | |
dataObject[k]=[]; | |
}*/ | |
dataObject[userName].push(new Array( | |
$("#set").find("div.joblist").eq(i).find("input[type=hidden]").eq(0).val()+','+ | |
$("#set").find("div.joblist").eq(i).find("input[type=text]").eq(0).val() +','+ | |
$("#set").find("div.joblist").eq(i).find("select option:selected").eq(0).val()+','+ | |
$("#set").find("div.joblist").eq(i).find("select option:selected").eq(0).text()+','+ | |
$("#set").find("div.joblist").eq(i).find("select option:selected").eq(1).val()+','+ | |
$("#set").find("div.joblist").eq(i).find("select option:selected").eq(1).text()+','+ | |
$("#set").find("div.joblist").eq(i).find("input[type=checkbox]").is(":checked")+','+ | |
$("#set").find("div.joblist").eq(i).find("input[type=radio]:checked").val()+','+ | |
$("#set").find("div.joblist").eq(i).find("input[type=number]").eq(0).val()+','+ | |
$("#set").find("div.joblist").eq(i).find("input[id=custom_data]").eq(0).val())); | |
} | |
//newObj[userName].push(dataObject[k]); | |
//var dataObjectjson2 = newObj; | |
console.log('dataObjectjson2 '+dataObject); | |
//console.log(dataObject); | |
var dataObjectjson= JSON.stringify(dataObject); | |
//console.log(dataObjectjson); | |
data1=dataObjectjson; | |
console.log("data1 "+dataObjectjson); | |
localStorage.setItem("data1",data1); | |
// $('."main-content').load( "results.html" ); | |
//alert(lengthofjob); | |
if (confirm('Are you sure you want to submit this Upgrade Downgrade joblist!')) { | |
//alert('Thanks for confirming. Now Form will be submit'); | |
$('#modalLoading').modal('show'); | |
$.ajax({ | |
type: "POST", | |
url: "/submit", | |
data: dataObjectjson, | |
success: function(data) { alert('data: ' + data); }, | |
contentType: "application/json", | |
dataType: 'json', | |
beforeSend: function() { $('#wait').show(); }, | |
complete: function() { $('#wait').hide(); } | |
}); | |
setTimeout(function() { | |
$('#modalLoading').modal('hide'); | |
window.location.href = "results.html"; | |
}, 6000); | |
} else { | |
alert('You pressed cancel. You can replan your Upgrade Downgrade now'); | |
} | |
}); | |
$("#results").click(function() { | |
$.ajax({ | |
url: "/getresults/", | |
type: "GET", | |
data: {'name': 'suren'}, | |
success: function(response){ | |
$('#blurg').html(response).fadeIn(1500); | |
} | |
}); | |
$(location).attr('href',"results.html"); | |
}) | |
$('#myModalHorizontal').on('hidden.bs.modal', function () { | |
$(this).find('form').trigger('reset'); | |
}) | |
}); | |
function getIsos() { | |
} | |
$("#testbed").click(function() { | |
$.ajax({ | |
url: "/gettestbedstatus/", | |
type: "GET", | |
data: {'name': 'ls'}, | |
success: function(response){ | |
$('#blurg').html(response).fadeIn(1500); | |
} | |
}); | |
$(location).attr('href',"testbed.html"); | |
}); | |
function containsAll(needles, haystack){ | |
//var selTb = false; | |
var selTbName = null; | |
for(var i = 0 , len = needles.length; i < len; i++){ | |
console.log(" needles"+needles[i]); | |
console.log("haystack"+haystack); | |
if($.inArray(needles[i], haystack) == -1) { | |
// console.log('return'+needles[i]); | |
selTbName=needles[i]; | |
//return needles[i]; | |
} | |
} | |
if(selTbName != null) { | |
console.log("selTbName not null"+selTbName); | |
return selTbName; | |
} else { | |
console.log("selTbName null "+needles); | |
return needles; | |
} | |
// alert(haystack); | |
//alert($("#set"+haystack+"").children("div.joblist").find("input[type=text]").eq(1).val()); | |
// console.log('return false'); | |
//if (confirm('Are you sure you want to submit this Upgrade Downgrade joblist!')) { | |
confirm("Plan already available for this testbed"); | |
return false; | |
} | |
function removeRow(e){ | |
alert("removeRow "+e.target.id); | |
//console.log('testbedListUpdated '+testbedListUpdated); | |
//testbedListUpdated.splice(testbedListUpdated.indexOf(e.target.id),1); | |
var render= $(e.currentTarget).parent('a').parent('div').parent('div'); | |
console.log('remove '+render.attr('class')); | |
$(render).remove(); | |
if( $("#set").children(":first").attr("id")==undefined){ | |
$("#submit").hide(); | |
$("#noActiveUD").show(); | |
} | |
} | |
function getPlatfrom(){ | |
var choosenPl=$('#selPlatformList option:selected').attr('platform'); | |
return choosenPl; | |
} | |
function gettestbed(){ | |
var choosenPl=$('#selPlatformList option:selected').val(); | |
if(choosenPl=='Select Testbed'){ | |
alert('Please select Testbed'); | |
$('#selPlatformList').focus(); | |
return false; | |
} else if(choosenPl=='Custom Testbed'){ | |
//alert('Custom Testbed'); | |
$("#myModalHorizontal").modal(); | |
} else{ | |
return choosenPl; | |
} | |
} | |
function ajaxStart(){ $body = $("body"); $body.addClass("loading"); } | |
function ajaxStop() {$body = $("body"); $body.removeClass("loading"); } | |
function upgradeOnly(e) { | |
//this=$(e); | |
var upgardeOnlyChk =$("#"+e.target.id); | |
//var upgardeOnlyChk =$(this); | |
if(upgardeOnlyChk.is(':checked')){ | |
upgardeOnlyChk.parent("div").find("i.fa-2").removeClass("fa-exchange").addClass("fa-long-arrow-right"); | |
} else { | |
upgardeOnlyChk.parent("div").find("i.fa-2").removeClass("fa-long-arrow-right").addClass("fa-exchange"); | |
} | |
} | |
$(document).ready(function(){$("#userProfile").click(function(){$("#dropdown-container").fadeToggle(80)}),$(window).click(function(e){!$("#dropdown-container").is(":visible")||$(e.target).is("#dropdown-container")||$(e.target).is("#userProfile")||$(e.target).is(".icon-user")||$(e.target).is("#down-arrow-button")||$(e.target).is("li")||$(e.target).is("ul")||$("#dropdown-container").fadeOut(400),!$("#add-resource-wrapper").is(":visible")||$(e.target).is("#add-resource-wrapper")||$(e.target).is("#add-resource")||$(e.target).is("form")||$(e.target).is("input[type=text]")||$(e.target).is("select")||$("platform").change()||$(e.target).is("a")||$("#add-resource-wrapper").slideUp(900)})}),$(document).ready(function(){$(".accordianHeader").click(function(){if($(this).next(".accordianBody").toggleClass("expand"),null!=document.getElementById("span8")){var e=$(this).find("span")[6].innerHTML,t=$(this).parent().find("input.edc");t.val(e)}$(".collapseAll").is(":visible")||($(".collapseAll").show(),$(".expandAll").hide())}),$(".expandAll").click(function(){$(this).hide(),$(".collapseAll").show()}),$(".collapseAll").click(function(){$(".accordianBody").removeClass("expand"),$(this).hide(),$(".expandAll").show()})}) | |
$(document).ready(function() { | |
var releasetb=[]; | |
//var booktb=[]; | |
var reqToRelease=[]; | |
loadTBAvailability(); | |
$("#btnRelease").click(function(){ | |
// alert("release"); | |
var relConfirmMsg =true; | |
var remCheckTesbed = $("input:checked"); | |
if(remCheckTesbed.length == 0) { | |
alert("Please select tesbed to release"); | |
return false; | |
} | |
$('input:checked').each(function () { | |
var booked_user = $(this).parent('td').parent('tr').find(".userName").text(); | |
var testbedN = $(this).parent('td').parent('tr').find(".tb_name").text(); | |
if($(this).parent('td').parent('tr').find('.testbedStatus').text()=='free'){ | |
alert("This testbed is already released"); | |
$(this).focus(); | |
relConfirmMsg =false; | |
return false; | |
} | |
if (booked_user != userName){ | |
alert("The testbed:"+testbedN+" is already booked by \""+booked_user+"\"\n Request him to release"); | |
$(this).focus(); | |
relConfirmMsg =false; | |
return false; | |
} | |
}); | |
//else{ | |
// alert($(this).val()); | |
// if (confirm('Are you sure you want to release this testbed!')) { | |
// $(this).parent('td').parent('tr').find('.testbedStatus').replaceWith('<td class="free testbedStatus">Free</td>'); | |
// $(this).removeProp("checked", "false"); | |
// var testbedName = $(this).parent('td').parent('tr').find(".tb_name").text(); | |
// var state = "release" | |
// releasetb.push(testbedName); | |
// ajaxStart(); | |
// setTimeout(function() { | |
// ajaxStop(); | |
// window.location.href = "index.html"; | |
//}, 2000); | |
// } | |
//} | |
//}) | |
if(relConfirmMsg) { | |
$('#modalLoading').modal('show'); | |
releasetb = releaseTB(); | |
var finalrel={}; | |
if(releasetb) { | |
finalrel["TB"]=releasetb; | |
finalrel["STATE"]="RELEASE"; | |
finalrel=JSON.stringify(finalrel); | |
console.log(finalrel); | |
$.ajax({ | |
url: "/releasetb", | |
type: "POST", | |
data: finalrel, | |
async:false, | |
contentType: "application/json", | |
dataType: 'json', | |
success: function(response){ | |
//$('#blurg').html(response).fadeIn(1500); | |
console.log(finalrel); | |
}, | |
complete: function() { | |
$('#modalLoading').modal('hide'); | |
} | |
}) | |
} | |
} | |
finalrel=''; | |
releasetb=''; | |
}) | |
$("#btnRequestRelease").click(function(){ | |
var reqToRelease={} | |
var reqCheckTesbed = $("input:checked"); | |
if(reqCheckTesbed.length == 0) { | |
alert("Please select tesbed for request to release"); | |
return false; | |
} | |
$('input:checked').each(function () { | |
if($(this).parent('td').parent('tr').find('.testbedStatus').text()=='free'){ | |
alert("This testbed is already released"); | |
$(this).focus(); | |
return false; | |
} else{ | |
// alert($(this).val()); | |
$(this).removeProp("checked", "false"); | |
console.log("suren btnRequestRelease"); | |
var testbedName = $(this).parent('td').parent('tr').find(".tb_name").text(); | |
var userName_t = $(this).parent('td').parent('tr').find(".userName").text(); | |
//alert(userName_t); | |
if(!reqToRelease[userName_t]) { | |
reqToRelease[userName_t]={} | |
reqToRelease[userName_t]["SENDER"]=userName; | |
} | |
if(reqToRelease[userName_t]["TESTBED"]) { | |
reqToRelease[userName_t]["TESTBED"].push(testbedName); | |
} else { | |
reqToRelease[userName_t]["TESTBED"]=[]; | |
reqToRelease[userName_t]["TESTBED"].push(testbedName); | |
} | |
alert("Email sent"); | |
} | |
}) | |
reqToRelease=JSON.stringify(reqToRelease); | |
$.ajax({ | |
url: "/reqreleasetb", | |
type: "POST", | |
data: reqToRelease, | |
contentType: "application/json", | |
dataType: 'json', | |
success: function(response){ | |
//$('#blurg').html(response).fadeIn(1500); | |
console.log(reqToRelease); | |
} | |
}) | |
console.log(reqToRelease); | |
}) | |
$("#btnBook").click(function(){ | |
// alert("release"); | |
var confirmMsg =true; | |
var remCheckTesbed = $("input:checked"); | |
if(remCheckTesbed.length == 0) { | |
alert("Please select tesbed to release"); | |
return false; | |
} | |
$('input:checked').each(function () { | |
// alert($(this).val()); | |
if($(this).parent('td').parent('tr').find('.testbedStatus').text()=='busy'){ | |
alert("This testbed is already booked"); | |
$(this).focus(); | |
confirmMsg = false; | |
return false; | |
} | |
}) | |
if(confirmMsg) { | |
booktb= bookTB(); | |
console.log(booktb); | |
var finalbook={} | |
if(booktb) { | |
finalbook["TB"]=booktb; | |
finalbook["STATE"]="BOOK"; | |
finalbook["USER"]=userName; | |
finalbook=JSON.stringify(finalbook); | |
console.log(finalbook); | |
$.ajax({ | |
url: "/releasetb", | |
type: "POST", | |
data: finalbook, | |
contentType: "application/json", | |
dataType: 'json', | |
success: function(response){ | |
//$('#blurg').html(response).fadeIn(1500); | |
console.log(booktb); | |
} | |
}) | |
} | |
} | |
finalbook=''; | |
booktb=''; | |
}) | |
// console.log("tootip"); | |
// var bootstrapTooltip = $.fn.tooltip.noConflict(); | |
//$.fn.bstooltip = bootstrapTooltip; | |
//$('[data-toggle="tooltip"]').bootstrapTooltip(); | |
$( "#testbedPage").uitooltip({ | |
position: { | |
my: "center bottom-0", | |
at: "center top", | |
using: function( position, feedback ) { | |
$( this ).css( position ); | |
$( "<div>" ) | |
.addClass( "arrow" ) | |
.addClass( feedback.vertical ) | |
.addClass( feedback.horizontal ) | |
.appendTo( this ); | |
} | |
} | |
}); | |
}); | |
function bookTB() { | |
var booktb=[]; | |
if (confirm('Are you sure you want to book this testbed!')) { | |
$('input:checked').each(function () { | |
$(this).parent('td').parent('tr').find('.testbedStatus').replaceWith('<td class="busy testbedStatus">busy</td>'); | |
$(this).removeProp("checked", "false"); | |
var testbedName = $(this).parent('td').parent('tr').find(".tb_name").text(); | |
booktb.push(testbedName); | |
$('#modalLoading').modal('show'); | |
setTimeout(function() { | |
$('#modalLoading').modal('hide'); | |
//window.location.href = "index.html"; | |
loadTBAvailability(); | |
updateTbDropdown(); | |
}, 2000); | |
}) | |
} | |
return booktb; | |
} | |
function addRow(e){ | |
console.log("addRow"); | |
var curId=$(e.currentTarget); | |
console.log("curId : " + curId); | |
} | |
function releaseTB() { | |
var releasetb=[]; | |
if (confirm('Are you sure you want to release this testbed!')) { | |
$('input:checked').each(function () { | |
$(this).parent('td').parent('tr').find('.testbedStatus').replaceWith('<td class="free testbedStatus">free</td>'); | |
$(this).removeProp("checked", "false"); | |
var testbedName = $(this).parent('td').parent('tr').find(".tb_name").text(); | |
//var state = "release" | |
releasetb.push(testbedName); | |
ajaxStart(); | |
setTimeout(function() { | |
ajaxStop(); | |
//window.location.href = "index.html"; | |
//loadTBAvailability(); | |
loadTBAvailability(); | |
updateTbDropdown(); | |
}, 2000); | |
}) | |
} | |
return releasetb; | |
} | |
function loadTBAvailability() { | |
$.ajax({ | |
url: "testbeddrop", | |
type: "GET", | |
async:false, | |
success: function(response){ | |
console.log("response is "+response); | |
testbedDetails = JSON.parse(response); | |
//var data = JSON.parse(response); | |
var testbedHtml='<center><h3 style="opacity:0.8">U/D Testbed Availability</h3></center> <table class="w3-table-all" style="width:100%"> <thead><tr> <th>Select</th> <th>Sl.no</th> <th>Testbed</th> <th>Platform</th> <th>User</th> <th>Status</th> <th>Location</th> </thead> </tr><tbody> '; | |
for (var key in testbedDetails){ | |
console.log('testbedDetails[key]["TB_NAME"] '+testbedDetails[key]["TB_NAME"]); | |
testbedHtml+=' <tr>'; | |
testbedHtml+=' <td><input type="checkbox"></td>'; | |
testbedHtml+=' <td>'+testbedDetails[key]["SNO"]+'</td>'; | |
testbedHtml+=' <td class=" tb_name" data-toggle="popover" data-trigger="focus" data-placement="top" title="'+testbedDetails[key]["TB_CONFIG"]+' ">'+testbedDetails[key]["TB_NAME"]+'</td>'; | |
testbedHtml+=' <td>'+testbedDetails[key]["PLATFORM"]+'</td> '; | |
testbedHtml+=' <td class=" userName">'+testbedDetails[key]["USER"]+'</td>'; | |
if(testbedDetails[key]["TB_STATUS"]=='free'){ | |
testbedHtml+=' <td class="completed testbedStatus">'+testbedDetails[key]["TB_STATUS"]+'</td>'; | |
} else { | |
testbedHtml+=' <td class="busy testbedStatus">'+testbedDetails[key]["TB_STATUS"]+'</td>'; | |
} | |
testbedHtml+=' <td>'+testbedDetails[key]["location"]+'</td>'; | |
testbedHtml+=' </tr>'; | |
} | |
testbedHtml+=' </tbody></table>'; | |
$("#testbedPage").html(testbedHtml); | |
} | |
}); | |
} | |
function updateTbDropdown() { | |
var selOptTB="<option hidden>Select Testbed</option>"; | |
$.ajax({ | |
url: "/testbeddrop", | |
type: "GET", | |
success: function(response){ | |
//console.log("response is "+response); | |
testbedDetails = JSON.parse(response); | |
// console.log("testbedDetails "+testbedDetails) | |
for (var rowset in testbedDetails) { | |
//for (var key1 in testbedDetails[key]) { | |
//alert("from = "+key1); | |
//console.log(testbedDetails[key][key1]); | |
var tbstatus="TB_STATUS"; | |
var tbname="TB_NAME"; | |
var plat="PLATFORM"; | |
//console.log(testbedDetails[rowset]); | |
//console.log(testbedDetails[rowset][tbstatus]); | |
if(testbedDetails[rowset][tbstatus] == "busy"){ | |
selOptTB += "<option class='"+testbedDetails[rowset][tbstatus]+"' value='"+testbedDetails[rowset][tbname]+"' disabled platform="+testbedDetails[rowset][plat]+" >"+testbedDetails[rowset][tbname]+" - "+testbedDetails[rowset][tbstatus]+"</option>" | |
} else { | |
selOptTB += "<option class='"+testbedDetails[rowset][tbstatus]+"' value='"+testbedDetails[rowset][tbname]+"' platform="+testbedDetails[rowset][plat]+" >"+testbedDetails[rowset][tbname]+" - "+testbedDetails[rowset][tbstatus]+"</option>" | |
} | |
//} | |
} | |
//console.log(selOptTB); | |
selOptTB += "<option>Custom Testbed </option>"; | |
$("#selPlatformList").html(selOptTB); | |
$("#submit").hide(); | |
} | |
}); | |
} | |
$(document).ready(function() { | |
$.validator.addMethod("valueNotEquals", function(value, element, arg){ | |
return arg != value; | |
}, "Value must not equal arg."); | |
$("#customTB-form").validate({ | |
// Specify the validation rules | |
rules: { | |
inputBMCIP: "required", | |
inputBmcUserName: "required", | |
inputBmcPassword: "required", | |
selectPlatformCustomTB: { valueNotEquals: "Select platform" }, | |
inputLocation: { valueNotEquals: "Select Location" } | |
//inputOsUserName: "required", | |
//inputOsUserpwd: "required", | |
//inputAPCIP: "required", | |
//inputAPCPorts: "required", | |
//inputAPCModalType: "required" | |
}, | |
// Specify the validation error messages | |
messages: { | |
inputBMCIP: "Please enter BMC IP", | |
inputBmcUserName: "Please enter BMC user name", | |
inputBmcPassword: "Please enter BMC Password", | |
selectPlatformCustomTB: { valueNotEquals: "Please select the platform" }, | |
inputLocation: { valueNotEquals: "Please select location" } | |
//inputOsUserName: "Please enter Os User Name", | |
//inputOsUserpwd: "Please enter Os Password", | |
//inputAPCIP: "Please enter APC IP", | |
//inputAPCPorts: "Please enter APC ports", | |
//inputAPCModalType: "Please enter APC Model Type" | |
}, | |
submitHandler: function(form,e) { | |
alert('submit'); | |
$("#modalLoading").modal("show"); | |
e.preventDefault(); | |
var warMesg = ""; | |
var customTBobj ={}; | |
customTBobj["selectPlatformCustomTB"]=$("#selectPlatformCustomTB option:selected").val(); | |
customTBobj["bmcIp"]=$("#inputBMCIP").val(); | |
customTBobj["bmcUser"]=$("#inputBmcUserName").val(); | |
customTBobj["bmcPwd"]=$("#inputBmcPassword").val(); | |
customTBobj["location"]=$("#inputLocation option:selected").val(); | |
customTBobj["hostIP"]=$("#inputHostIP").val(); | |
customTBobj["osUser"]=$("#inputOsUserName").val(); | |
customTBobj["osPwd"]=$("#inputOsUserpwd").val(); | |
if( (customTBobj["hostIP"] == "") || (customTBobj["osUser"] == "") || (customTBobj["osPwd"] == "") ) { | |
warMesg += "Incomplete Host Details will not run following testcases : verifyHostAccessible, verifyStorage, verifyKCS \n"; | |
} | |
customTBobj["hostSerType"]=$("#inputHostSerSrvrType").val(); | |
customTBobj["hostSerIP"]=$("#inputHostSerSrvrIP").val(); | |
customTBobj["hostSerPort"]=$("#inputHostSerSrvrPort").val(); | |
customTBobj["hostSerUser"]=$("#inputHostSerSrvrUserName").val(); | |
customTBobj["hostSerPwd"]=$("#inputHostSerSrvrPassword").val(); | |
if( (customTBobj["hostSerType"] == "") || (customTBobj["hostSerIP"] == "") || (customTBobj["hostSerPort"] == "") || (customTBobj["hostSerUser"] == "") || (customTBobj["hostSerPwd"] == "" )) { | |
warMesg += "Incomplete Serial Connection Host Details will not run following testcases : match_f2_bios_order \n"; | |
} | |
customTBobj["bmcSerConsoleType"]=$("#inputBMCSrialConsoleType").val(); | |
customTBobj["bmcSerConsoleIP"]=$("#inputBMCSrialConsoleIP").val(); | |
customTBobj["bmcSerConsolePort"]=$("#inputBMCSrialConsolePort").val(); | |
customTBobj["bmcSerConsoleUser"]=$("#inputBMCSrialConsoleUser").val(); | |
customTBobj["bmcSerConsolePwd"]=$("#inputBMCSrialConsolePwd").val(); | |
if( (customTBobj["bmcSerConsoleType"] == "") || (customTBobj["bmcSerConsoleIP"] == "") || (customTBobj["bmcSerConsolePort"] == "") || (customTBobj["bmcSerConsoleUser"] == "") || (customTBobj["bmcSerConsolePwd"] == "" )) { | |
warMesg += "Incomplete Serial Connection Host Details will not support testbed recovery \n"; | |
} | |
customTBobj["apcIP"]=$("#inputAPCIP").val(); | |
customTBobj["apcPorts"]=$("#inputAPCPorts").val(); | |
customTBobj["apcModalType"]=$("#inputAPCModalType").val(); | |
if( (customTBobj["apcIP"] == "") || (customTBobj["apcPorts"] == "") || (customTBobj["apcModalType"] == "" )) { | |
warMesg += "Incomplete APC Details will not run following testcases : AC-Power Cycle \n"; | |
} | |
if(warMesg != "") { | |
if (confirm(warMesg)) { | |
customTBData=JSON.stringify(customTBobj); | |
console.log("customTBData : "+customTBData) | |
addCustomTBJob(customTBobj,customTBData); | |
} else { | |
return false | |
} | |
} else { | |
customTBData=JSON.stringify(customTBobj); | |
console.log("customTBData : "+customTBData) | |
addCustomTBJob(customTBobj,customTBData); | |
} | |
//form.submit(); | |
$("#myModalHorizontal .close").click(); | |
$("#modalLoading").modal("hide"); | |
} | |
}); | |
}); | |
function addCustomTBJob(customTBDeatils,customTBData) { | |
console.log("Test"); | |
alert("HI"); | |
$('#modalLoading').modal('show'); | |
var testbed = customTBDeatils["bmcIp"]; | |
var plname= customTBDeatils["selectPlatformCustomTB"]; | |
var testbedName = testbed; | |
var custom_data="bmcIp:"+customTBDeatils["bmcIp"]+"&bmcUser:"+customTBDeatils["bmcUser"]+"&bmcPwd:"+customTBDeatils["bmcPwd"]+"&hostIP:"+customTBDeatils["hostIP"]+"&osUser:"+customTBDeatils["osUser"]+"&osPwd:"+customTBDeatils["osPwd"]; | |
custom_data+="&hostSerType:"+customTBDeatils["hostSerType"]+"&hostSerIP:"+customTBDeatils["hostSerIP"]+"&hostSerPort:"+customTBDeatils["hostSerPort"]+"&hostSerUser:"+customTBDeatils["hostSerUser"]+"&hostSerPwd:"+customTBDeatils["hostSerPwd"]; | |
custom_data+="&bmcSerConsoleType:"+customTBDeatils["bmcSerConsoleType"]+"&bmcSerConsoleIP:"+customTBDeatils["bmcSerConsoleIP"]+"&bmcSerConsolePort:"+customTBDeatils["bmcSerConsolePort"]+"&bmcSerConsoleUser:"+customTBDeatils["bmcSerConsoleUser"]+"&bmcSerConsolePwd:"+customTBDeatils["bmcSerConsolePwd"]; | |
custom_data+="&apcIP:"+customTBDeatils["apcIP"]+"&apcPorts:"+customTBDeatils["apcPorts"]+"&apcModalType:"+customTBDeatils["apcModalType"]+"&location:"+customTBDeatils["location"]; | |
console.log("customTBData : "+customTBData); | |
console.log("Custom_data: "+custom_data) | |
final_custom=JSON.stringify(customTBDeatils); | |
request = $.ajax({ | |
url: "/setCustomTB", | |
type: "POST", | |
data: final_custom, | |
contentType: "application/json", | |
dataType: 'json', | |
async:false, | |
cache: false, | |
success: function(response){ | |
//$('#blurg').html(response).fadeIn(1500); | |
//var testbedName=response | |
//alert(testbedName) | |
console.log(response.name); | |
testbedName = response.name; | |
iso_location = response.location; | |
$('#modalLoading').modal('hide'); | |
alert("planningJoblist start"); | |
console.log("testbedName "+testbedName); | |
} | |
}); | |
request.error(function () { | |
console.log("Error : block`") | |
}); | |
request.complete(function() { | |
$('#modalLoading').modal('hide'); | |
alert("Inside Completed"); | |
planningJoblist(plname,testbedName,custom_data,iso_location); | |
}); | |
} | |
function planningJoblist(plname,testbedName,custom_data,iso_location) { | |
$('#modalLoading').modal('hide'); | |
$('#modalLoading').modal('show'); | |
console.log(iso_location); | |
$.ajax({ | |
url: "/getisos/"+iso_location, | |
type: "GET", | |
contentType: "application/json", | |
async:false, | |
success: function(response){ | |
console.log("response is "+response); | |
details =JSON.parse(response); | |
//deatils=response; | |
//console.log("detail is"); | |
//console.log(details); | |
$('#modalLoading').modal('hide'); | |
} | |
}); | |
var selOptFrom = ""; | |
var selOptTo = ""; | |
//var selOptTB=""; | |
var release=[]; | |
for (var key1 in details[plname]) { | |
/// alert("from = "+key1); | |
selOptFrom +='<optgroup label="'+key1+'">'; | |
for (var key2 in details[plname][key1]) { | |
selOptFrom += "<option value="+key1+">"+details[plname][key1][key2]+"</option>"; | |
} | |
selOptFrom +='</optgroup>'; | |
} | |
for (var key1 in details[plname]) { | |
//alert("from = "+key1); | |
selOptTo +='<optgroup label="'+key1+'">' | |
for (var key2 in details[plname][key1]) { | |
selOptTo += "<option value="+key1+">"+details[plname][key1][key2]+"</option>"; | |
} | |
selOptTo +='</optgroup>'; | |
} | |
var index = $( "#set").children("div:last").index()+1; | |
console.log("index is : "+index); | |
$("<div />", { "data-role": "collapsible", id: testbedName }) | |
.append($("<div />", { "class": "joblist div"+plname }) | |
.append($("<input />", { type: "hidden", value: plname, disabled : "disabled" })) | |
.append($("<input />", { type: "hidden", id: "custom_data", value: custom_data, disabled : "disabled" })) | |
.append($("<input />", { type: "text", value: testbedName, disabled : "disabled" })) | |
.append($("<select />", { id:"from"+testbedName, type: "text", value: testbedName, }).append($("<option >From Build ...</option >")).append(selOptFrom)) | |
.append($("<i />", {class : "fa fa-exchange fa-2", "aria-hidden": "true" })) | |
.append($("<select />", { id:"to"+testbedName, type: "text", value: testbedName, }).append($("<option >To Build ...</option >")).append(selOptTo)) | |
.append($("<input />", { id : "chkUpOnly"+testbedName+""+index,type: "checkbox", value: testbedName, onclick : "upgradeOnly(event)", class: "fancyCheckBox" })) | |
.append($("<label for =chkUpOnly"+testbedName+""+index+" class='chkUpOnly'>Only Upgrade</label>")) | |
.append($("<div />", {class : "pureCssRadio"}) | |
.append($("<input type='radio' id=simple"+""+index+" name=udType"+""+index+" value='simple' />")) | |
.append($("<label for =simple"+""+index+" ><span><span></span></span>Simple</label>"))) | |
.append($("<div />", {class : "pureCssRadio"}) | |
.append($("<input type='radio' id=extensive"+""+index+" name=udType"+""+index+" value='extensive' checked='checked' />")) | |
.append($("<label for =extensive"+""+index+" ><span><span></span></span>Extensive</label>"))) | |
.append($("<input />", {type : "number",id:"iteration"+""+index, name:"quantity",'data-toggle':"tooltip", 'data-placement':"top", title:"Iteration", value:1, min:"1", max:"100"})) | |
// .append($("<a />", {class:"btnAdd", href:"#", title:"Add", 'data-toggle':"tooltip", 'data-placement':"top", onclick:"addRow(event)"}) | |
//.append($("<i />", { class:"glyphicon glyphicon-plus" }))) | |
//iteration | |
.append($("<a />", {class:"btnRemove", href:"#", 'data-toggle':"tooltip", 'data-placement':"top", title:"Remove job"}).append($("<i />", {class: "glyphicon icon-remove-sign", id:testbedName+""+index, onclick:"removeRow(event)"})))) | |
.appendTo("#set"); | |
$(".joblist > select").change(function() { | |
selId = $(this).attr("id"); | |
//alert(selId); | |
$(this).attr("data-original-title", $('#'+selId+' option:selected').text()); | |
$(this).tooltip(); | |
//$(this).trigger("click"); | |
}) | |
//console.log("test"+$(".ui-collapsible-content").children("div:first").children(".btnRemove").html()); | |
//$(".ui-collapsible-content").children("div:first").children(".btnRemove").hide(); | |
if( $("#submit").hide()){$("#submit").show()}; | |
$("#noActiveUD").hide(); | |
alert("planningJoblist complete"); | |
} | |
</script> | |
</body> | |
</html> | |
Subscribe to:
Posts (Atom)