blob: da568fa33c227e394898ede1d39121803f9e4126 [file] [log] [blame]
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html>
<head>
<title>Stratosphere Query Interface</title>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<link rel="stylesheet" type="text/css" href="css/nephelefrontend.css">
<link rel="stylesheet" type="text/css" href="css/js-graph-it.css">
<link rel="stylesheet" type="text/css" href="css/pactgraphs_small.css">
<script type="text/javascript" src="js/jquery.js"></script>
<script type="text/javascript" src="js/js-graph-it.js"></script>
<script type="text/javascript" src="js/pactgraph.js"></script>
<script type="text/javascript">
<!--
var maxColumnWidth = 200;
var minColumnWidth = 100;
// global variable for the currently requested plan
var pactPlanRequested = 0;
/*
* This function toggels the child checkbox on and of, depending on the parent's state
*/
function toggleShowPlanBox(box)
{
var child = $('#suspendJobDuringPlanCheck');
if (box.is(':checked')) {
child.attr('disabled', false);
}
else {
child.attr('disabled', true);
}
}
/*
* Shows an error message below the upload field.
*/
function showUploadError(message)
{
$('#upload_error_text').fadeOut("fast", function () { $('#upload_error_text')[0].innerHTML = "" + message;
$('#upload_error_text').fadeIn("slow"); } );
}
/*
* Checks the selected file and triggers an upload, if all is correct.
*/
function processUpload()
{
var filename = $('#upload_file_input').attr('value');
var len = filename.length;
if (len == 0) {
showUploadError("Please select a file.");
}
else if (len > 4 && filename.substr(len - 4, len) == ".jar") {
$('#upload_form')[0].submit();
}
else {
showUploadError("Please select a .jar file.");
}
}
/*
* This function makes sure only one checkbox is selected.
* Upon selection it initializes the drawing of the pact plan.
* Upon deselection, it clears the pact plan.
*/
function toggleCheckboxes(box)
{
if (box.is(':checked')) {
$('.jobItemCheckbox').attr('checked', false);
box.attr('checked', true);
var id = box.parentsUntil('.jobListItem').parent().attr('id').substr(4);
$('#mainCanvas').html('');
$('#planDescription').html('');
pactPlanRequested = id;
$.ajax({
type: "GET",
url: "pactPlan",
data: { job: id },
success: function(response) { showPreviewPlan(response); }
});
}
else {
$('#mainCanvas').html('');
$('#planplanDescription').html('');
}
}
/*
* Function that takes the returned plan and draws it.
*/
function showPreviewPlan(data)
{
// check whether this one is still selected
var active = $('.jobItemCheckbox:checked');
var id = active.parentsUntil('.jobListItem').parent().attr('id').substr(4);
if (pactPlanRequested == id) {
if (data == undefined || data.jobname == undefined || data.jobname != pactPlanRequested || data.plan == undefined) {
pactPlanRequested = 0;
}
if(data.description != undefined) {
$('#planDescription').html(data.description);
}
drawPactPlan(data.plan, false, "arr2.gif");
pactPlanRequested = 0;
}
}
/*
* Asynchronously loads the jobs and creates a list of them.
*/
function loadJobList()
{
$.get("jobs", { action: "list" }, createJobList);
}
/*
* Triggers an AJAX request to delete a job.
*/
function deleteJob(id)
{
var name = id.substr(4);
$.get("jobs", { action: "delete", filename: name }, loadJobList);
}
/*
* Creates and lists the returned jobs.
*/
function createJobList(data)
{
var markup = "";
var lines = data.split("\n");
for (var i = 0; i < lines.length; i++)
{
if (lines[i] == null || lines[i].length == 0) {
continue;
}
var name = null;
var date = null;
var tabIx = lines[i].indexOf("\t");
if (tabIx > 0) {
name = lines[i].substr(0, tabIx);
if (tabIx < lines[i].length - 1) {
date = lines[i].substr(tabIx + 1);
}
else {
date = "unknown date";
}
}
else {
name = lines[i];
date = "unknown date";
}
markup += '<div id="job_' + name + '" class="jobListItem"><table class="layoutTable" width="100%"><tr>';
markup += '<td width="30px;"><input class="jobItemCheckbox" type="checkbox"></td>';
markup += '<td><p class="jobListItemName">' + name + '</p></td>';
markup += '<td><p class="jobListItemDate">' + date + '</p></td>';
markup += '<td width="30px"><img class="jobItemDeleteIcon" src="img/delete-icon.png" width="24" height="24" /></td>';
markup += '</tr></table></div>';
}
// add the contents
$('#jobsContents').attr('innerHTML', markup);
// register the event handler that triggers the delete when the delete icon is clicked
$('.jobItemDeleteIcon').click(function () { deleteJob($(this).parentsUntil('.jobListItem').parent().attr('id')); } );
// register the event handler, that ensures only one checkbox is active
$('.jobItemCheckbox').change(function () { toggleCheckboxes($(this)) });
}
/*
* Function that checks and launches a pact job.
*/
function runJob ()
{
var job = $('.jobItemCheckbox:checked');
if (job.length == 0) {
$('#run_error_text').fadeOut("fast", function () { $('#run_error_text')[0].innerHTML = "Select a job to run.";
$('#run_error_text').fadeIn("slow"); } );
return;
}
var jobName = job.parentsUntil('.jobListItem').parent().attr('id').substr(4);
var showPlan = $('#showPlanCheck').is(':checked');
var suspendPlan = $('#suspendJobDuringPlanCheck').is(':checked');
var args = $('#commandLineArgsField').attr('value');
var url = "runJob?" + $.param({ action: "submit", job: jobName, arguments: args, show_plan: showPlan, suspend: suspendPlan});
window.location = url;
}
/*
* Document initialization.
*/
$(document).ready(function ()
{
// hide the error text sections
$('#upload_error_text').fadeOut("fast");
$('#run_error_text').fadeOut("fast");
// register the event listener that keeps the hidden file form and the text fied in sync
$('#upload_file_input').change(function () { $('#upload_file_name_text').attr('value', $(this).attr('value')) } );
// register the event handler for the upload button
$('#upload_submit_button').click(processUpload);
$('#run_button').click(runJob);
// register the event handler that (in)activates the plan display checkbox
$('#showPlanCheck').change(function () { toggleShowPlanBox ($(this)); });
// start the ajax load of the jobs
loadJobList();
});
//-->
</script>
</head>
<body>
<div class="mainHeading" style="min-width: 1225px;">
<h1><img src="img/StratosphereLogo.png" width="326" height="100" alt="Stratosphere Logo" />Stratosphere Query Interface</h1>
</div>
<!-- the main panel with the jobs list and the preview pane -->
<div style="position: absolute; top: 110px; bottom: 210px; left: 0px; right: 0px; min-width: 1225px;">
<div id="jobsContents" class="boxed" style="position: absolute; top: 0px; bottom: 0px; left: 0px; width: 450px; overflow: auto;"></div>
<div class="boxed" style="position: absolute; top: 0px; bottom: 0px; left: 460px; right: 0px; overflow: auto;">
<div id="mainCanvas" class="canvas" style="position: relative; height: 100%"></div>
</div>
</div>
<!-- the footer containing the box with the run properties and the box with the upload field -->
<div class="footer" style="min-width: 1225px;">
<div class="boxed" style="float: left; width: 700px; height: 200px; position: relative;">
<h3>Show or launch selected PACT program...</h3>
<div style="margin-top: 30px;">
<div>
<div id="planDescription"></div>
</div>
<div style="text-align: right;">
<span class="formLabel">Arguments:</span>
<input id="commandLineArgsField" type="text" name="commandLine" style="width: 580px;"/>
</div>
<div class="spaced" style="margin-left: 20px;">
<input type="checkbox" id="showPlanCheck" checked="checked"><span class="formLabel">Show optimizer plan</span>
<div id="suspendOption"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><input type="checkbox" id="suspendJobDuringPlanCheck" checked="checked"><span class="formLabel">Suspend execution while showing plan</span></div>
</div>
</div>
<div class="footer" style="text-align: right;">
<span id="run_error_text" class="error_text"></span>
<input id="run_button" type="button" value="Run Job" style="width: 75px; margin-left: 100px;"/>
</div>
</div>
<div class="boxed" style="float: left; width: 500px; height: 150px; position: relative;">
<h3>Select a new PACT program to upload...</h3>
<form id="upload_form" action="jobs" enctype="multipart/form-data" method="POST">
<div style="position: relative; margin-top: 30px;">
<input id="upload_file_name_text" type="text" name="file_name" disabled="disabled" style="position: absolute; top: 0px; right: 85px; width: 380px; z-index: 3;"/>
<input type="button" value="Browse" style="width: 75px; position: absolute; right: 0px; top: 0px; z-index: 1;" />
<input id="upload_file_input" class="translucent" type="file" name="upload_jar_file" style="position: absolute; right: 0px; top: 0px; height: 30px; width=75px; z-index: 2;" />
</div>
<div class="footer" style="text-align: right;">
<span id="upload_error_text" class="error_text"></span>
<input id="upload_submit_button" type="button" value="Upload" style="width: 75px; margin-left: 100px;"/>
</div>
</form>
</div>
</div>
</body>
</html>