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

236 lines
7.2 KiB
PHP

<?php
include_once '../../../include/boot.php';
include_once '../../../include/authenticate.php';
include_once '../../../include/ajax_functions.php';
include_once '../include/rse_workflow_functions.php';
$modal = (getval("modal", "") == "true");
$form_action_extra = array();
$ajax = getval("ajax", "") == "true";
$process_action = getval("process_action", "") == "true";
$action = getval("action", null, true);
if(is_null($action))
{
if($ajax && $process_action)
{
ajax_send_response(400, ajax_response_fail(ajax_build_message($lang["rse_workflow_err_invalid_action"])));
}
exit(escape($lang["rse_workflow_err_invalid_action"]));
}
$action = rse_workflow_get_actions("", $action);
if(!is_array($action) || empty($action))
{
if($ajax && $process_action)
{
ajax_send_response(400, ajax_response_fail(ajax_build_message($lang["rse_workflow_err_invalid_action"])));
}
exit(escape($lang["rse_workflow_err_invalid_action"]));
}
$action = $action[0];
$wf_states = rse_workflow_get_archive_states();
if(!array_key_exists($action["statusto"], $wf_states))
{
if($ajax && $process_action)
{
ajax_send_response(400, ajax_response_fail(ajax_build_message($lang["rse_workflow_err_missing_wfstate"])));
}
exit(escape($lang["rse_workflow_err_missing_wfstate"]));
}
$to_wf_state = $wf_states[$action["statusto"]];
$collection = getval("collection", null, true);
if(!is_null($collection) && checkperm("b"))
{
if($ajax && $process_action)
{
ajax_unauthorized();
}
exit(escape($lang["error-permissiondenied"]));
}
// Determine resources affected (effectively runs a search to determine if action is valid for each resource)
$search = getval("search", "");
$restypes = getval("restypes", "");
if (strpos($search,"!")!==false) {$restypes="";}
$order_by = getval("order_by", "relevance");
$archive = getval("archive", "");
$access = getval("access", null);
$per_page = getval("per_page", null, true);
$offset = getval("offset", 0, true);
$sort = "DESC";
$recent_search_daylimit = getval("recent_search_daylimit", "");
$go = getval("go", "");
$search_all_workflow_states_cache = $search_all_workflow_states;
if ($archive == "") {
$archive = 0;
} else {
$search_all_workflow_states = false;
}
// Override if needed
if(!is_null($collection))
{
$search = "!collection{$collection}";
$order_by = $default_collection_sort;
$form_action_extra["collection"] = $collection;
}
$result = do_search(
$search,
$restypes,
$order_by,
$archive,
-1,
$sort,
false, # $access_override
DEPRECATED_STARSEARCH,
false, # $ignore_filters
false, # $return_disk_usage
$recent_search_daylimit,
$go,
true, # $stats_logging
false, # $return_refs_only
false, # $editable_only
false,
$access
);
$search_all_workflow_states = $search_all_workflow_states_cache;
$resources = array();
if(is_array($result) && count($result) > 0)
{
$resources = $result;
}
$affected_resources = array_filter($resources, function($resource) use ($action)
{
return rse_workflow_validate_action($action, $resource);
});
$affected_resources_count = count($affected_resources);
if($ajax && $process_action)
{
if(empty($affected_resources))
{
ajax_send_response(200, ajax_response_ok_no_data());
}
$r_refs = array_column($affected_resources, 'ref');
$r_states = array_column($affected_resources, 'archive');
update_archive_status($r_refs, $action['statusto'], $r_states);
// send user a message of confirmation with link to all resources in that new wf state
$url = generateURL(
"{$baseurl}/pages/search.php",
array(
"search" => "",
"archive" => $action["statusto"],
"resetrestypes" => "true",
));
$text = str_replace("%wf_name", $to_wf_state["name"], $lang["rse_workflow_confirm_resources_moved_to_state"]);
message_add($userref, $text, $url);
ajax_send_response(200, ajax_response_ok(array_column($affected_resources, "ref")));
}
$form_action = generateURL($baseurl_short . 'plugins/rse_workflow/pages/batch_action.php',
array(
"search" => $search,
"restypes" => $restypes,
"order_by" => $order_by,
"archive" => $archive,
"access" => $access,
"per_page" => $per_page,
"offset" => $offset,
"sort" => $sort,
"recent_search_daylimit" => $recent_search_daylimit,
"go" => $go,
"action" => $action["ref"],
"collection" => $collection,
),
$form_action_extra
);
$action_csrf_data = " data-csrf-token-identifier=\"{$CSRF_token_identifier}\"";
$action_csrf_data .= " data-csrf-token=\"" . generateCSRFToken($usersession, "process_wf_action{$action["ref"]}") . "\"";
include_once '../../../include/header.php';
?>
<div class="BasicsBox">
<div class="RecordHeader">
<div class="BackToResultsContainer">
<div class="backtoresults">
<?php
if($modal)
{
?>
<a href="#" class="closeLink fa fa-times" onclick="ModalClose();" title="<?php echo escape($lang["close"]); ?>"></a>
<?php
}
?>
</div>
</div>
<h1><?php echo escape($lang["rse_workflow_confirm_batch_wf_change"]); ?></h1>
</div>
<p><?php echo str_replace("%wf_name", $to_wf_state["name"], $lang["rse_workflow_confirm_to_state"]); ?></p>
<p><?php echo str_replace("%count", $affected_resources_count, $lang["rse_workflow_affected_resources"]); ?></p>
<div class="QuestionSubmit">
<button type="button" onclick="ModalClose();"><?php echo escape($lang["cancel"]); ?></button>
<button type="button" onclick="process_wf_action(this);" <?php echo $action_csrf_data; ?>><?php echo escape($lang["ok"]); ?></button>
</div>
</div>
<script>
function process_wf_action(e)
{
var button = jQuery(e);
var csrf_token_identifier = button.data("csrf-token-identifier");
var csrf_token = button.data("csrf-token");
var default_post_data = {};
default_post_data[csrf_token_identifier] = csrf_token;
var post_data = Object.assign({}, default_post_data);
post_data.ajax = true;
post_data.process_action = true;
CentralSpaceShowProcessing();
jQuery.ajax({
type: 'POST',
url: "<?php echo $form_action; ?>",
data: post_data,
dataType: "json"
})
.done(function(response)
{
if(typeof response.status !== "undefined" && response.status == "success")
{
console.debug("response.data = %o", response.data);
}
})
.fail(function(data, textStatus, jqXHR)
{
if(typeof data.responseJSON === 'undefined')
{
return;
}
var response = data.responseJSON;
styledalert(jqXHR, response.data.message);
})
.always(function()
{
CentralSpaceHideProcessing();
ModalClose();
});
return;
}
</script>
<?php
include "../../../include/footer.php";