Files
resourcespace/pages/manage_jobs.php
2025-07-18 16:20:14 +07:00

311 lines
12 KiB
PHP

<?php
include '../include/boot.php';
include '../include/authenticate.php';
$job_user = getval("job_user", 0, true);
if ($job_user != $userref && !checkperm('a')) {
// User does not have permission to see other user's jobs
$job_user = $userref;
}
$job_status = getval("job_status", -1, true);
$job_type = getval("job_type", "");
$job_orderby = getval("job_orderby", "priority");
$job_boost = getval("job_boost", 0, true);
$job_sort = (strtoupper(getval("job_sort", "ASC")) == "DESC") ? "DESC" : "ASC";
$job_find = getval("job_find", "");
if (!checkperm('a') || $job_user == $userref) {
$pagetitle = $lang["my_jobs"];
$breadcrumbs = [
['title' => $userfullname == "" ? $username : $userfullname, 'href' => "{$baseurl_short}pages/user/user_home.php", 'menu' => true],
['title' => $pagetitle]];
} else {
$pagetitle = $lang["manage_jobs_title"];
$breadcrumbs = [
['title' => $lang['systemsetup'], 'href' => "{$baseurl_short}pages/admin/admin_home.php", 'menu' => true],
['title' => $pagetitle]];
}
$deletejob = getval("delete_job", 0, true);
$resetjob = getval("reset_job", 0, true);
if ($deletejob > 0 && enforcePostRequest(true)) {
$deletejobdetail = job_queue_get_job($deletejob);
if (checkperm('a') || $deletejobdetail["user"] == $userref) {
job_queue_delete($deletejob);
}
} elseif ($resetjob > 0 && enforcePostRequest(true)) {
$resetjobdetail = job_queue_get_job($resetjob);
if (checkperm('a') || $resetjobdetail["user"] == $userref) {
clear_process_lock("job_{$resetjob}");
job_queue_update($resetjob, array(), 1, date('Y-m-d H:i:s'), get_job_type_priority($resetjobdetail["type"]));
}
} elseif ($job_boost > 0 && enforcePostRequest(true) && checkperm('a')) {
clear_process_lock("job_{$job_boost}");
job_queue_update($job_boost, array(), 1, date('Y-m-d H:i:s'), JOB_PRIORITY_IMMEDIATE);
} elseif (getval("purge_jobs", '') != '' && enforcePostRequest(true) && checkperm('a')) {
job_queue_purge(STATUS_COMPLETE);
job_queue_purge(STATUS_ERROR);
}
$jobs = job_queue_get_jobs($job_type, $job_status, $job_user, '', $job_orderby, $job_sort, $job_find);
$endedjobs = 0;
$per_page = getval("per_page", $default_perpage_list, true);
$per_page = (!in_array($per_page, array_merge($list_display_array, [99999]))) ? $default_perpage_list : $per_page;
rs_setcookie('per_page', $per_page);
$jobcount = count($jobs);
$totalpages = ceil($jobcount / $per_page);
$offset = getval("offset", 0, true);
if ($offset > $jobcount) {
$offset = 0;
}
$curpage = floor($offset / $per_page) + 1;
$curparams = array(
"job_user" => $job_user,
"job_status" => $job_status,
"job_type" => $job_type,
"job_orderby" => $job_orderby,
"job_sort" => $job_sort,
"job_find" => $job_find
);
$url = generateURL($baseurl . "/pages/manage_jobs.php", $curparams);
$tabledata = array(
"class" => "JobTable",
"headers" => array(
"ref" => array("name" => $lang["property-reference"],"sortable" => true),
"type" => array("name" => $lang["job_queue_type"],"sortable" => true),
"fullname" => array("name" => $lang["user"],"sortable" => true),
"status" => array("name" => $lang["status"],"sortable" => true),
"start_date" => array("name" => $lang["date"],"sortable" => true),
"tools" => array("name" => $lang["tools"],"sortable" => false)
),
"orderbyname" => "job_orderby",
"orderby" => $job_orderby,
"sortname" => "job_sort",
"sort" => $job_sort,
"defaulturl" => $baseurl . "/pages/manage_jobs.php",
"params" => $curparams,
"pager" => array("current" => $curpage,"total" => $totalpages, "per_page" => $per_page, "break" => false),
"data" => array()
);
if (checkperm('a')) {
$priorityheader = array("name" => $lang["job_priority"],"sortable" => true,"html" => true, "width" => "40px");
$tabledata["headers"] = array_merge(array("priority" => $priorityheader), $tabledata["headers"]);
}
if (!checkperm('a')) {
unset($tabledata["headers"]["fullname"]);
}
for ($n = 0; $n < $jobcount; $n++) {
if (in_array($jobs[$n]["status"], array(STATUS_ERROR,STATUS_COMPLETE))) {
$endedjobs++;
}
if ($n >= $offset && ($n < $offset + $per_page)) {
$tablejob = array();
$tablejob["ref"] = $jobs[$n]["ref"];
$tablejob["type"] = $jobs[$n]["type"];
if (checkperm('a')) {
// Only required if can see jobs for different users
$tablejob["fullname"] = $jobs[$n]["fullname"];
// Add priority column
switch ($jobs[$n]["priority"]) {
case JOB_PRIORITY_IMMEDIATE:
$priorityicon = "fas fa-fw fa-bolt";
$prioritytitle = $lang["job_priority_immediate"];
break;
case JOB_PRIORITY_USER:
$priorityicon = "fa fa-fw fa-arrow-circle-up";
$prioritytitle = $lang["job_priority_user"];
break;
case JOB_PRIORITY_SYSTEM:
$priorityicon = "fa fa-fw fa-arrow-circle-right";
$prioritytitle = $lang["job_priority_system"];
break;
case JOB_PRIORITY_COMPLETED:
default:
$priorityicon = "fa fa-fw fa-arrow-circle-down";
$prioritytitle = $lang["job_priority_completed"];
break;
}
$tablejob["priority"] = "<span class='" . $priorityicon . "' title='" . $prioritytitle . "'></span>";
}
$tablejob["status"] = isset($lang["job_status_" . $jobs[$n]["status"]]) ? $lang["job_status_" . $jobs[$n]["status"]] : $jobs[$n]["status"];
$tablejob["start_date"] = nicedate($jobs[$n]["start_date"], true, true, true);
if (
$jobs[$n]["status"] == STATUS_ERROR
|| (
!in_array($jobs[$n]["status"], array(STATUS_COMPLETE,STATUS_INPROGRESS))
&& $jobs[$n]["start_date"] < date("Y-m-d H:i:s", time() - 24 * 60 * 60)
)
) {
$tablejob["alerticon"] = "fas fa-exclamation-triangle";
$tablejob["alerticontitle"] = $lang["job_status_error"];
}
$tablejob["tools"] = array();
$tablejob["tools"][] = array(
"icon" => "fa fa-fw fa-trash",
"text" => $lang["action-delete"],
"url" => "#",
"modal" => false,
"onclick" => "update_job(\"" . $jobs[$n]["ref"] . "\",\"delete_job\");return false;"
);
if (checkperm('a')) {
$tablejob["tools"][] = array(
"icon" => "fa fa-fw fa-info",
"text" => $lang["job_details"],
"url" => generateURL($baseurl . "/pages/job_details.php", array("job" => $jobs[$n]["ref"])),
"modal" => true,
);
$tablejob["tools"][] = array(
"icon" => "fa fa-fw fa-rocket",
"text" => $lang["job_boost"],
"url" => "#",
"onclick" => "update_job(\"" . $jobs[$n]["ref"] . "\",\"job_boost\");return false;",
"modal" => true,
);
}
if (checkperm('a') && $jobs[$n]["status"] != STATUS_ACTIVE) {
$tablejob["tools"][] = array(
"icon" => "fas fa-fw fa-undo",
"text" => $lang["job_reset"],
"url" => "#",
"modal" => false,
"onclick" => "update_job(\"" . $jobs[$n]["ref"] . "\",\"reset_job\");return false;"
);
}
$tabledata["data"][] = $tablejob;
}
}
include '../include/header.php';
?>
<script>
function update_job(ref, action) {
var temp_form = document.createElement("form");
temp_form.setAttribute("id", "jobform");
temp_form.setAttribute("method", "post");
temp_form.setAttribute("action", '<?php echo $url ?>');
var i = document.createElement("input");
i.setAttribute("type", "hidden");
i.setAttribute("name", action);
i.setAttribute("value", ref);
temp_form.appendChild(i);
<?php if ($CSRF_enabled) { ?>
var csrf = document.createElement("input");
csrf.setAttribute("type", "hidden");
csrf.setAttribute("name", "<?php echo $CSRF_token_identifier; ?>");
csrf.setAttribute("value", "<?php echo generateCSRFToken($usersession, "jobform"); ?>");
temp_form.appendChild(csrf);
<?php } ?>
document.getElementById('job_list_container').appendChild(temp_form);
CentralSpacePost(document.getElementById('jobform'),false);
}
</script>
<div class='BasicsBox'>
<h1>
<?php
echo escape($pagetitle);
render_help_link('user/manage_jobs'); ?>
</h1>
<?php
$introtext = text("introtext");
if ($introtext != "") {
echo "<p>" . text("introtext") . "</p>";
}
renderBreadcrumbs($breadcrumbs);
if (checkperm('a') && $endedjobs > 0) {
echo "<p><a href='#' onclick='if(confirm(\"" . escape($lang["job_confirm_purge"]) . "\")){update_job(true,\"purge_jobs\");}'>" . LINK_CARET . escape($lang["jobs_action_purge_complete"]) . "</a></p>";
}
?>
<form id="JobFilterForm" method="POST" action="<?php echo $url; ?>">
<?php generateFormToken('JobFilterForm');
$single_user_select_field_id = "job_user";
$single_user_select_field_value = $job_user;
?>
<div id="QuestionJobFilter">
<div class="Question" id="QuestionJobType">
<label for="job_type"><?php echo escape($lang["job_filter_type"]); ?></label>
<select class="stdwidth" id="job_type" name="job_type">
<?php
// Not filtered by default when searching, add option to filter by month
echo "<option " . ($job_type == 0 ? " selected" : "") . " value=''>" . escape($lang["all"]) . "</option>\n";
$alljobtypes = array_unique(array_column($jobs, "type"));
foreach ($alljobtypes as $avail_jobtype) {
echo "<option " . ($avail_jobtype == $job_type ? " selected" : "") . " value=\"" . escape($avail_jobtype) . "\">" . escape($avail_jobtype) . "</option>\n";
}
?>
</select>
<div class="clearerleft"></div>
</div>
<div class="Question" id="QuestionJobStatus">
<label for="job_status"><?php echo escape($lang["job_filter_status"]); ?></label>
<select class="stdwidth" id="job_status" name="job_status">
<?php
// Not filtered by default when searching, add option to filter by month
echo "<option " . ($job_status == -1 ? " selected" : "") . " value='-1'>" . escape($lang["all"]) . "</option>\n";
foreach (array(0,1,2,3,5) as $status) {
echo "<option " . ($status == $job_status ? " selected" : "") . " value=\"" . $status . "\">" . escape($lang["job_status_" . $status]) . "</option>\n";
}
?>
</select>
<div class="clearerleft"></div>
</div>
<?php if (checkperm('a')) {?>
<div class="Question" id="QuestionJobUser">
<label><?php echo escape($lang["job_filter_user"]); ?></label>
<?php include __DIR__ . "/../include/user_select.php" ?>
<div class="clearerleft"></div>
</div>
<?php } ?>
<div class="Question" id="QuestionJobFilterSubmit">
<input type="button" id="filter" class="searchbutton" value="<?php echo escape($lang['filterbutton']); ?>" onclick="return CentralSpacePost(document.getElementById('JobFilterForm'));">
<input type="button" id="clearfilter" class="searchbutton" value="<?php echo escape($lang['clearbutton']); ?>" onclick="addUser();jQuery('#job_status').val('-1');jQuery('#job_type').val('');return CentralSpacePost(document.getElementById('JobFilterForm'));">
<div class="clearerleft"></div>
</div>
</div>
</form>
<div id='job_list_container' class='BasicsBox'>
<?php render_table($tabledata); ?>
</div>
</div>
<?php
include '../include/footer.php';