chg: [workflows] Allow running workflows via the editor interface

pull/8530/head
Sami Mokaddem 2022-08-04 10:01:32 +02:00
parent ce9eac725f
commit 30a5db3b9f
No known key found for this signature in database
GPG Key ID: 164C473F627A06FA
5 changed files with 89 additions and 15 deletions

View File

@ -161,19 +161,21 @@ class WorkflowsController extends AppController
public function executeWorkflow($workflow_id)
{
$this->request->allowMethod(['post', 'put']);
$blockingErrors = [];
$data = $this->request->data;
$result = $this->Workflow->executeWorkflow($workflow_id, $data, $blockingErrors);
if (!empty($logging) && empty($result['success'])) {
$logging['message'] = !empty($logging['message']) ? $logging['message'] : __('Error while executing workflow.');
$errorMessage = implode(', ', $blockingErrors);
$this->Workflow->loadLog()->createLogEntry('SYSTEM', $logging['action'], $logging['model'], $logging['id'], $logging['message'], __('Returned message: %s', $errorMessage));
if ($this->request->is('post') || $this->request->is('put')) {
$blockingErrors = [];
$data = JsonTool::decode($this->request->data['Workflow']['data']);
$result = $this->Workflow->executeWorkflow($workflow_id, $data, $blockingErrors);
if (!empty($logging) && empty($result['success'])) {
$logging['message'] = !empty($logging['message']) ? $logging['message'] : __('Error while executing workflow.');
$errorMessage = implode(', ', $blockingErrors);
$this->Workflow->loadLog()->createLogEntry('SYSTEM', $logging['action'], $logging['model'], $logging['id'], $logging['message'], __('Returned message: %s', $errorMessage));
}
return $this->RestResponse->viewData([
'success' => $result['success'],
'outcome' => $result['outcomeText'],
], $this->response->type());
}
return $this->RestResponse->viewData([
'success' => $result['success'],
'outcome' => $result['outcomeText'],
], $this->response->type());
$this->render('ajax/executeWorkflow');
}
public function triggers()

View File

@ -0,0 +1,19 @@
<?php
echo $this->element('genericElements/Form/genericForm', [
'form' => $this->Form,
'data' => [
'title' => __('Execute Workflow'),
'model' => 'Workflow',
'skip_side_menu' => 1,
'fields' => [
[
'field' => 'data',
'type' => 'textarea',
'class' => 'input span6'
]
],
'submit' => [
'action' => $this->request->params['action'],
]
]
]);

View File

@ -9,7 +9,6 @@ echo $this->element('genericElements/Form/genericForm', [
],
'submit' => [
'action' => $this->request->params['action'],
// 'ajaxSubmit' => 'submitGenericFormInPlace();'
]
]
]);

View File

@ -50,11 +50,15 @@ $debugEnabled = !empty($selectedWorkflow['Workflow']['debug_enabled']);
<span id="workflow-saved-text-details" style="margin-left: 5px; font-size: 0.75em"></span>
</span>
<span style="display: flex; align-items: center; margin-left: auto; margin-right: 1em; gap: 1em;">
<button id="workflow-debug-container" class="btn btn-<?= $debugEnabled ? 'success' : 'primary' ?>" data-enabled="<?= $debugEnabled ? '1' : '0' ?>" style="margin-right: 0.5em;">
<button id="workflow-debug-button" class="btn btn-<?= $debugEnabled ? 'success' : 'primary' ?>" data-enabled="<?= $debugEnabled ? '1' : '0' ?>">
<i class="<?= $this->FontAwesome->getClass('bug') ?> fa-fw"></i>
<?= __('Debug Mode: ') ?>
<b class="state-text" data-on="<?= __('On') ?>" data-off="<?= __('Off') ?>"><?= $debugEnabled ? __('On') : __('Off') ?></b>
</button>
<button id="workflow-run-button" class="btn btn-primary" <?= $debugEnabled ? '' : 'disabled' ?>>
<i class="<?= $this->FontAwesome->getClass('play') ?> fa-fw"></i>
<?= __('Run Workflow') ?>
</button>
<a href="<?= $baseurl . '/admin/logs/index/model:Workflow/action:execute_workflow/model_id:' . h($selectedWorkflow['Workflow']['id']) ?>" title="<?= __('View execution logs') ?>" aria-label="<?= __('View execution logs') ?>">
<i class="<?= $this->FontAwesome->getClass('list-alt') ?>"></i> <?= __('Execution logs') ?>
</a>
@ -306,7 +310,8 @@ echo $this->element('genericElements/assetLoader', [
var $importWorkflowButton = $('#importWorkflow')
var $exportWorkflowButton = $('#exportWorkflow')
var $saveWorkflowButton = $('#saveWorkflow')
var $toggleWorkflowButton = $('#workflow-debug-container')
var $toggleWorkflowButton = $('#workflow-debug-button')
var $runWorkflowButton = $('#workflow-run-button')
var $saveBlueprintButton = $('#saveBlueprint')
var $lastModifiedField = $('#lastModifiedField')
var $workflowSavedIconContainer = $('#workflow-saved-container')

View File

@ -328,6 +328,7 @@ function initDrawflow() {
$importWorkflowButton.click(importWorkflow)
$exportWorkflowButton.click(exportWorkflow)
$toggleWorkflowButton.click(enabledDebugMode)
$runWorkflowButton.click(runWorkflow)
$blockModal
.on('show', function (evt) {
var selectedNode = getSelectedNode()
@ -1136,10 +1137,58 @@ function enabledDebugMode() {
$clicked.removeClass('btn-success').addClass('btn-primary')
}
$clicked.find('.state-text').text($clicked.find('.state-text').data($clicked.data('enabled') ? 'on' : 'off'))
$runWorkflowButton.prop('disabled', $clicked.data('enabled') ? false : true)
}
})
}
function runWorkflow() {
var html = '<div style="width: 350px;"><textarea rows=15 style="width: 100%; box-sizing: border-box;" placeholder="Enter data to be sent to the workflow"></textarea><div style="display: flex;"><button class="btn btn-primary" style="margin: 0 0 0 auto;"><i class="fa fa-spin fa-spinner hidden"></i> Run Workflow</button></div><pre style="margin-top: 0.75em;"></pre></div>'
var popoverOptions = {
html: true,
placement: 'bottom',
trigger: 'click',
content: html,
container: 'body',
template: '<div class="popover" role="tooltip"><div class="arrow"></div><h3 class="popover-title"></h3><div class="popover-content"><div class="data-content"></div></div></div>'
}
$runWorkflowButton
.popover(popoverOptions)
.on('shown.bs.popover', function () {
var $popover = $runWorkflowButton.data('popover').tip()
$popover.find('button').click(function() {
var url = baseurl + "/workflows/executeWorkflow/" + workflow.Workflow.id
fetchFormDataAjax(url, function (formHTML) {
$('body').append($('<div id="temp" style="display: none"/>').html(formHTML))
var $tmpForm = $('#temp form')
var formUrl = $tmpForm.attr('action')
data = $popover.find('textarea').val()
$tmpForm.find('[name="data[Workflow][data]"]').val(data)
$.ajax({
data: $tmpForm.serialize(),
beforeSend: function() {
$popover.find('pre').empty()
$popover.find('button i').removeClass('hidden')
},
success: function (data) {
$popover.find('pre').text(data)
},
error: xhrFailCallback,
complete: function () {
$('#temp').remove();
$popover.find('button i').addClass('hidden')
},
type: 'post',
cache: false,
url: formUrl,
})
})
})
})
$runWorkflowButton.popover('show')
}
function getSelectedNodeID() {
return editor.node_selected !== null ? editor.node_selected.id : null // Couldn't find a better way to get the selected node
}