Commit 6bfad320 authored by Mahmoud Aglan's avatar Mahmoud Aglan

Coool

parent 0f1cba7f
......@@ -131,4 +131,74 @@ class WorkflowController extends Controller
$count = count($processed);
return $this->redirect('/workflows')->withSuccess("تم معالجة {$count} انتقال تلقائي");
}
public function edit(Request $request, string $code): Response
{
$definition = WorkflowDefinition::findByCode($code);
if (!$definition) {
return $this->redirect('/workflows')->withError('تعريف دورة العمل غير موجود');
}
return $this->view('Workflow.Views.edit', [
'definition' => $definition,
]);
}
public function update(Request $request, string $code): Response
{
$db = App::getInstance()->db();
$definition = WorkflowDefinition::findByCode($code);
if (!$definition) {
return $this->redirect('/workflows')->withError('تعريف دورة العمل غير موجود');
}
$nameAr = trim((string) $request->post('name_ar', ''));
$nameEn = trim((string) $request->post('name_en', ''));
$descriptionAr = trim((string) $request->post('description_ar', ''));
if ($nameAr === '') {
return $this->redirect("/workflows/edit/{$code}")->withError('الاسم بالعربي مطلوب');
}
$defJson = $definition->getDefinition();
// Update state labels
$statesInput = $request->post('states', []);
if (is_array($statesInput)) {
foreach ($statesInput as $key => $stateData) {
if (isset($defJson['states'][$key])) {
if (!empty($stateData['label_ar'])) {
$defJson['states'][$key]['label_ar'] = trim($stateData['label_ar']);
}
if (!empty($stateData['label_en'])) {
$defJson['states'][$key]['label_en'] = trim($stateData['label_en']);
}
}
}
}
// Update transition triggers
$transitionsInput = $request->post('transitions', []);
if (is_array($transitionsInput)) {
foreach ($transitionsInput as $idx => $tData) {
if (isset($defJson['transitions'][$idx]) && !empty($tData['trigger_edit'])) {
$defJson['transitions'][$idx]['trigger'] = $tData['trigger_edit'];
}
}
}
$newVersion = (int) $definition->version + 1;
$db->update('workflow_definitions', [
'name_ar' => $nameAr,
'name_en' => $nameEn ?: null,
'description_ar' => $descriptionAr ?: null,
'definition_json' => json_encode($defJson, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT),
'version' => $newVersion,
'updated_at' => date('Y-m-d H:i:s'),
], '`id` = ?', [(int) $definition->id]);
return $this->redirect("/workflows/diagram/{$code}")->withSuccess('تم تحديث دورة العمل — الإصدار ' . $newVersion);
}
}
\ No newline at end of file
......@@ -4,8 +4,10 @@ declare(strict_types=1);
return [
['GET', '/workflows', 'Workflow\Controllers\WorkflowController@index', ['auth', 'csrf'], 'rules.view'],
['GET', '/workflows/diagram/{code}', 'Workflow\Controllers\WorkflowController@diagram', ['auth', 'csrf'], 'rules.view'],
['GET', '/workflows/instances/{code}', 'Workflow\Controllers\WorkflowController@instances', ['auth', 'csrf'], 'rules.view'],
['GET', '/workflows/edit/{code}', 'Workflow\Controllers\WorkflowController@edit', ['auth', 'csrf'], 'rules.edit'],
['POST', '/workflows/edit/{code}', 'Workflow\Controllers\WorkflowController@update', ['auth', 'csrf'], 'rules.edit'],
['GET', '/workflows/instances/{id:\d+}', 'Workflow\Controllers\WorkflowController@instance', ['auth', 'csrf'], 'rules.view'],
['POST', '/workflows/instances/{id:\d+}/transition','Workflow\Controllers\WorkflowController@transition', ['auth', 'csrf'], 'rules.edit'],
['GET', '/workflows/instances/{code}', 'Workflow\Controllers\WorkflowController@instances', ['auth', 'csrf'], 'rules.view'],
['POST', '/workflows/process-timeouts', 'Workflow\Controllers\WorkflowController@processTimeouts', ['auth', 'csrf'], 'rules.edit'],
];
\ No newline at end of file
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment