/*# ##### BEGIN GPL LICENSE BLOCK ##### # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software Foundation, # Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # # ##### END GPL LICENSE BLOCK #####*/ var rulesTableHeader = ["type", "enabled", "descritpiton", "limit", "value"]; var slaveTableHeaderWithJob = ["name", "last_seen", "stats", "address", "tags", "total_done", "total_error", "job"]; var slaveTableHeader = ["name", "last_seen", "stats", "address"]; var jobTableHeader = ["action", "id", "name", "category", "tags", "type", "chunks", "priority", "usage", "wait", "status", "length", "done", "dispatched", "error", "priority r", "exception r"]; var framesTableHeader = ["no", "status", "render time", "slave", "log", "result"]; var JOB_TYPES = ["None", "Blender", "Process", "Versioned"]; var JOB_STATUS_TEXT = ["Waiting", "Paused", "Finished", "Queued"]; var JOB_SUBTYPE = ["BLENDER", "CYCLE"]; var FRAME_STATUS_TEXT = ["Queued", "Dispatched", "Done", "error"]; var JOB_TYPE_NONE = 0; var JOB_TYPE_BLENDER = 1; var JOB_TYPE_PROCESS = 2; var JOB_TYPE_VERSIONED = 3; var maxFramesPerPage = 10; var maxItemsperTable = 10; function setupPage() { /*$.themes.init({themeBase: 'http://ajax.googleapis.com/ajax/libs/jqueryui/1.7.2/themes/', icons: '/html/css/images/themes.gif',previews: '/html/css/images/themes-preview.gif'});*/ $('body').addClass("ui-widget-overlay"); setupJobsPanel(); setupSlavesPanel(); setupConfigPanel(); var refreshSlaveData = window.setInterval(updateSlavesData, 5000); var refreshJobsData = window.setInterval(updateJobsData, 5000); } function setupJobsPanel() { createPanelwidget("body", "jobs", "Jobs", ""); updateJobsData(); } function updateJobsData() { $.ajax({ type : 'GET', url : '/html/jobs', dataType : 'json', contentType : 'application/json', success : function(jobs) { changeJobsTable(jobs); } }); } function changeJobsTable(jobs) { function celladd(name, row) { if(name == "category") { if(row.category === "") { return "None"; } } if(name == "tags") { retstr = "[ "; for(var i = 0; i < row.tags.length; i++) { retstr = retstr + row.tags[i] + " "; } retstr = retstr + "]"; return retstr; } if(name == "usage") { return Math.floor(row.usage * 100) + "%"; } if(name == "type") { return JOB_TYPES[row.type] + "[" + JOB_SUBTYPE[row.subtype] + "]"; } if(name == "status") { return JOB_STATUS_TEXT[row.status]; } if(name == "priority r") { if(row.p_rule) { return "yes"; } else { return "no"; } } if(name == "exception r") { if(row.e_rule) { return "yes"; } else { return "no"; } } if(name == "name") { retstr = '<button title="Show Job Info" onclick="showJob(' + "'" + row.id + "'" + ',' + "'" + row.name + "'" + ");" + '"' + ">" + row.name + "</button>"; return retstr; } if(name == "action") { if(row.status != 2) { disabled = ""; } else { disabled = "disabled"; } retstr = '<button ' + disabled + ' title="Pause Job" onclick="pause_job(' + row.id + ');">P</button>'; if(row.error > 0) { disabled = ""; } else { disabled = "disabled"; } retstr += '<button ' + disabled + ' title="Reset Frame" onclcik="reset_job_frames(' + row.id + ')">R</button><button title="Remove Job" onclick="cancel_job(' + row.id + ')">X</button>'; return retstr; } if(name == "chunks") { retstr = '<button title="increase chunks size" onclick="changeJobChunk(' + row.id + ',' + (row.chunks + 1) + ');">+</button>' + " " + row.chunks + " "; if(row.chunks > 1) { disabled = ''; } else { disabled = 'disabled'; } retstr += '<button ' + disabled + ' title="decrease chunks size" onclick="changeJobChunk(' + row.id + ',' + (row.chunks - 1) + ');">-</button>'; return retstr; } if(name == "priority") { retstr = '<button title="increase job priority" onclick="changeJobPriority(' + row.id + ',' + (row.priority + 1) + ');">+</button>' + " " + row.priority + " "; if(row.priority > 1) { disabled = ""; } else { disabled = 'disabled'; } retstr += '<button ' + disabled + ' title="decrease job priority" onclick="changeJobPriority(' + row.id + ',' + (row.priority - 1) + ');">-</button>'; return retstr; } if(name == "wait") { if(row.wait != "N/A") { return secondsToHms(row.wait); } } if(name == "error") { if(row.error > 0) { disabled = ""; } else { disabled = 'disabled'; } retstr = '<button ' + disabled + ' title="reset error frames" onclick="reset_error_frames(' + row.id + ');">R</button>' + ' ' + row.error; return retstr; } return row[name]; } $("#b_jobCancel").remove(); createTable("#jobs_Panelcontent", "jobsTable", jobTableHeader, jobs, celladd); $("#jobsTable button").button(); if(jobs.length) { $("#jobs_Panelcontent").append('<button id="b_jobCancel" title="clear all jobs" onclick="clear_jobs();">Cancel all jobs</button>'); $("#b_jobCancel").button(); } } function setupSlavesPanel() { createPanelwidget("body", "slaves", "Slaves", ""); updateSlavesData(); } $("#slavesTable button").button(); function updateSlavesData() { $.ajax({ type : 'GET', url : '/html/slaves', dataType : 'json', contentType : 'application/json', success : function(slaves) { changeSlaveTable(slaves); } }); } function changeSlaveTable(slaves) { createTable("#slaves_Panelcontent", "slavesTable", slaveTableHeaderWithJob, slaves, cellSlaveTable); $("#slavesTable button").button(); } function setupConfigPanel() { function confTab(name) { if(name == "Rules") { updateConfigData(); return ""; } if(name == "Interface") { $("#Interface").append('<a id="oldinterface" href="/">'); $("#oldinterface").html('Simple Interface'); $("#oldinterface").button(); } return ""; } createPanelwidget("body", "configure", "Confgiguration", ""); createTabswidget("#configure_Panelcontent", "conf", [{ name : "Rules", f_content : confTab }, { name : "Interface", f_content : confTab }]); updateConfigData(); /*$("#themeselector").themes({compact: false});*/ } function updateConfigData() { $.ajax({ type : 'GET', url : '/html/rules', dataType : 'json', contentType : 'application/json', success : function(rules) { changeConfigureTable(rules); } }); } function changeConfigureTable(rules) { var checked = { "true" : "checked", "false" : "" }; function celladd(name, row) { if(name == "enabled") { retstr = '<input type="checkbox" title="" ' + checked[row.enabled]; retstr = retstr + ' onclick="balance_enable('; retstr = retstr + "'" + row.id + "'," + "'" + (!row.enabled) + "')" + '" >'; return retstr; } if(name == "limit") { return row.limit_str; } if(name == "value") { if(row.editable) { retstr = '<button title="edit limit" onclick="balance_edit(' + "'" + row.id + "'" + ',' + "'" + row.limit + "'" + ");" + '"' + ">edit</button>"; return retstr; } return ""; } if(name != "id") { return row[name]; } } createTable("#Rules", "rulesTable", rulesTableHeader, rules, celladd); $("#rulesTable button").button(); } function showJob(id, name) { var job = {}; function general(tab_name) { var rendertime = 0; $.each(job.frames, function(index, frame) { rendertime += frame.time; }); var info = [new namevalue("resolution", job.resolution[0] + 'x' + job.resolution[1] + ' at ' + job.resolution[2] + '%'), new namevalue("tags", job.tags), new namevalue("result", getresult(id)), new namevalue("frames", job.frames.length), new namevalue("status", job.status), new namevalue("job name", job.name), new namevalue("type", job.type), new namevalue("render", job.subtype), new namevalue("render time:", secondsToHms(rendertime))]; function cellview(name, row) { if(name == "name") { return '<b>' + row.name + ':</b>'; } if(name == "value") { switch (row.name) { case "tags": retstr = "[ "; for(var i = 0; i < row.value.length; i++) { retstr = retstr + row.value[i] + " "; } retstr = retstr + "]"; return retstr; case "result": return '<a title="load result" href="' + row.value + '">load</a>'; case "status": return JOB_STATUS_TEXT[job.status]; case "type": return JOB_TYPES[job.type]; case "render": return JOB_SUBTYPE[job.subtype]; default: return row.value; } } } createTable("#" + tab_name, "generalTable", ["name", "value"], info, cellview, false); return ""; } function files(tab_name) { function fileJobCache() { createFilesTable("#JobCache_Panelcontent", id, "cache"); return ""; } function fileJobFluid() { createFilesTable("#JobFluid_Panelcontent", id, "fluid"); return ""; } function fileJobOther() { createFilesTable("#JobOthers_Panelcontent", id, "other"); return ""; } function filePath(data) { $("#JobPath_Panelcontent").html(data[0].filepath); } function showFilesBlenderJob() { createPanelwidget("#" + tab_name, "JobPath", "Job Path", function() { return ""; }); $.getJSON("/html/blendfile_" + id, null, filePath); if(job.totcache) { createPanelwidget("#" + tab_name, "JobCache", "Physic cache files", fileJobCache); } if(job.totfluid) { createPanelwidget("#" + tab_name, "JobFluid", "Fluid cache Files", fileJobFluid); } if(job.totother) { createPanelwidget("#" + tab_name, "JobOthers", "Other Files", fileJobOther); } } function showFilesVersioned() { function cellview(name, row) { if(name == "name") { return '<b>' + row.name + ':</b>'; } if(name == "value") { return row.value; } } var info = [new namevalue("system", job.version_info.system.name), new namevalue("Remote Path", job.version_info.rpath), new namevalue("Working Path", job.version_info.wpath), new namevalue("Revision", job.version_info.revision), new namevalue("Render File", job.files[0].filepath)]; } switch(job.type) { case JOB_TYPE_BLENDER: showFilesBlenderJob(); break; case JOB_TYPE_VERSIONED: showFilesVersioned(); break; default: return tab_name; } return ""; } function frames(tab_name) { function frameCell(name, frame) { if(name == "no") { return frame.number; } if(name == "status") { return FRAME_STATUS_TEXT[frame.status]; } if(frame.status) { if(name == "render time") { return Math.floor(frame.time) + "s"; } if(name == "slave") { if(frame.slave) { return frame.slave.name; } else { return "none"; } } if(name == "log") { return '<a href="/log_' + id + '_' + frame.number + '.log" target="_blank">view log</a>'; } if(frame.status > 1) { if(name == "result") { return '<a href="/render_' + id + '_' + frame.number + '.exr" target="_blank">view result</a>'; } } } return "N/A"; } createPagedTable("#" + tab_name, "framesTable", framesTableHeader, job.frames, frameCell, 10, "next frames page", "previous frames page"); return ""; } function thumbs(tab_name) { function img_src(img_num) { return '/thumb_' + id + '_' + job.frames[img_num].number + '.jpg'; } function img_info(img_num) { return "<b>Job:</b>" + job.name + ' <b>frame:</b>' + job.frames[img_num].number; } createImgViewer("#" + tab_name, img_src, job.frames.length, img_info); } function slaves(tab_name) { function createBlackList(data) { function blacklist() { if(data.length === 0) { return "None"; } createPagedTable("#BlackList_Panelcontent", "blacklistTable", slaveTableHeader, data, cellSlaveTable, maxItemsperTable, "next slaves page", "previous slaves page"); return ""; } createPanelwidget('#' + tab_name, "BlackList", "Black Listed slaves", blacklist); } function createSlaveList(data) { function slavelist() { if(data.length === 0) { return "None"; } createPagedTable("#SlavesList_Panelcontent", "slaveslistTable", slaveTableHeader, data, cellSlaveTable, maxItemsperTable, "next slaves page", "previous slaves page"); return ""; } createPanelwidget('#' + tab_name, "SlavesList", "Currently assigned slaves", slavelist); } $.getJSON("/html/blacklist_" + id, null, createBlackList); $.getJSON("/html/slavesjob_" + id, null, createSlaveList); return ""; } function onCancel(dlg) { $(dlg).dialog("close"); $(dlg).remove(); } function jobDialog(dlg) { $("#showjobs").remove(); var tab_descript = [{ name : "General", f_content : general }, { name : "Files", f_content : files }, { name : "Frames", f_content : frames }, { name : "Thumbs", f_content : thumbs }, { name : "slaves", f_content : slaves }]; createTabswidget(dlg, "showjobs", tab_descript); return ""; } function retJobData(data) { job = data[0]; $("#JobInfo" + id).remove(); DialogWidget('body', 'JobInfo' + id, "Job Information", "", "Go Back", null, onCancel, jobDialog, true, 700, 800); $("#General a").button(); } $.getJSON("/html/job_" + id, null, retJobData); }