diff --git a/Admin/Install/db.json b/Admin/Install/db.json index 66ea7a4..81810f1 100755 --- a/Admin/Install/db.json +++ b/Admin/Install/db.json @@ -63,6 +63,17 @@ "primary": true, "autoincrement": true }, + "workflow_instance_title": { + "name": "workflow_instance_title", + "type": "VARCHAR(255)", + "default": null, + "null": true + }, + "workflow_instance_status": { + "name": "workflow_instance_status", + "type": "INT", + "null": false + }, "workflow_instance_template": { "name": "workflow_instance_template", "type": "INT", diff --git a/Controller.js b/Controller.js new file mode 100644 index 0000000..f4228fa --- /dev/null +++ b/Controller.js @@ -0,0 +1,26 @@ +import { Autoloader } from '../../jsOMS/Autoloader.js'; + +Autoloader.defineNamespace('jsOMS.Modules'); + +jsOMS.Modules.Workflow = class { + /** + * @constructor + * + * @since 1.0.0 + */ + constructor (app) + { + this.app = app; + }; + + bind (id) + { + mermaid.initialize({startOnLoad:true}); + }; + + bindElement (chart) + { + }; +}; + +window.omsApp.moduleManager.get('Workflow').bind(); diff --git a/Controller/ApiController.php b/Controller/ApiController.php index f4875f0..3f1ac2a 100644 --- a/Controller/ApiController.php +++ b/Controller/ApiController.php @@ -21,6 +21,7 @@ use Modules\Media\Models\NullMedia; use Modules\Media\Models\PathSettings; use Modules\Workflow\Models\PermissionCategory; use Modules\Workflow\Models\WorkflowInstanceAbstract; +use Modules\Workflow\Models\WorkflowInstanceAbstractMapper; use Modules\Workflow\Models\WorkflowStatus; use Modules\Workflow\Models\WorkflowTemplate; use Modules\Workflow\Models\WorkflowTemplateMapper; @@ -146,7 +147,7 @@ final class ApiController extends Controller } /** @var WorkflowInstanceAbstract $instance */ - $instance = WorkflowInstanceMapper::get() + $instance = WorkflowInstanceAbstractMapper::get() ->with('template') ->with('template/source') ->with('template/source/sources') @@ -602,18 +603,19 @@ final class ApiController extends Controller return; } + /** @var \Modules\Workflow\Models\WorkflowTemplate $template */ $template = WorkflowTemplateMapper::get() - ->where('id', (int) $request->getData('id')) + ->with('source') + ->with('source/sources') + ->where('id', (int) $request->getData('template')) ->execute(); - $instance = $this->createInstanceFromRequest($template, $request); - - require_once $template->findFile('WorkflowInstanceMapper.php')->getPath(); + $instance = $this->createInstanceFromRequest($request, $template); $this->createModel( $request->header->account, $instance, - \Modules\Workflow\Models\WorkflowInstanceMapper::class, + WorkflowInstanceAbstractMapper::class, 'instance', $request->getOrigin() ); @@ -632,7 +634,7 @@ final class ApiController extends Controller private function validateInstanceCreate(RequestAbstract $request) : array { $val = []; - if (($val['j'] = empty($request->getData('j')))) { + if (($val['template'] = empty($request->getData('template')))) { return $val; } @@ -642,24 +644,24 @@ final class ApiController extends Controller /** * Method to create interface from request. * - * @param WorkflowTemplate $template Workflow template * @param RequestAbstract $request Request + * @param WorkflowTemplate $template Workflow template * * @return WorkflowInstanceAbstract * * @since 1.0.0 */ - private function createInstanceFromRequest(WorkflowTemplate $template, RequestAbstract $request) : WorkflowInstanceAbstract + private function createInstanceFromRequest(RequestAbstract $request, WorkflowTemplate $template) : WorkflowInstanceAbstract { $controller = null; $file = $template->source->findFile('WorkflowController.php'); - require_once $file->getPath(); - - $controller = new \Modules\Workflow\Controller\WorkflowController($this->app, $template); + require_once $file->getAbsolutePath(); /** @var \Modules\Workflow\Models\WorkflowControllerInterface $controller */ - $instance = $controller->createInstanceFromRequest($request); + $controller = new \Modules\Workflow\Controller\WorkflowController($this->app, $template); + + $instance = $controller->createInstanceFromRequest($request, $template); return $instance; } diff --git a/Controller/BackendController.php b/Controller/BackendController.php index d58a159..32f1f4c 100755 --- a/Controller/BackendController.php +++ b/Controller/BackendController.php @@ -17,8 +17,10 @@ namespace Modules\Workflow\Controller; use Modules\Media\Models\CollectionMapper; use Modules\Media\Models\NullMedia; use Modules\Workflow\Models\WorkflowControllerInterface; +use Modules\Workflow\Models\WorkflowInstanceAbstractMapper; use Modules\Workflow\Models\WorkflowInstanceMapper; use Modules\Workflow\Models\WorkflowTemplateMapper; +use phpOMS\Asset\AssetType; use phpOMS\Contract\RenderableInterface; use phpOMS\Message\RequestAbstract; use phpOMS\Message\ResponseAbstract; @@ -108,6 +110,10 @@ final class BackendController extends Controller $view->setTemplate('/Modules/Workflow/Theme/Backend/workflow-profile'); } + $head = $response->get('Content')->getData('head'); + $head->addAsset(AssetType::JSLATE, 'Resources/mermaid/mermaid.min.js'); + $head->addAsset(AssetType::JSLATE, 'Modules/Workflow/Controller.js', ['type' => 'module']); + return $view; } @@ -150,6 +156,11 @@ final class BackendController extends Controller $view->setTemplate('/Modules/Workflow/Theme/Backend/workflow-dashboard'); $view->addData('nav', $this->app->moduleManager->get('Navigation')->createNavigationMid(1005501001, $request, $response)); + $instances = WorkflowInstanceAbstractMapper::getAll() + ->execute(); + + $view->setData('instances', $instances); + return $view; } @@ -171,7 +182,8 @@ final class BackendController extends Controller $view->setTemplate('/Modules/Workflow/Theme/Backend/workflow-instance-list'); $view->addData('nav', $this->app->moduleManager->get('Navigation')->createNavigationMid(1005501001, $request, $response)); - $instances = WorkflowInstanceMapper::getAll() + /** @var \Modules\Workflow\Models\WorkflowInstanceAbstract $instances */ + $instances = WorkflowInstanceAbstractMapper::getAll() ->execute(); $view->setData('instances', $instances); @@ -196,13 +208,21 @@ final class BackendController extends Controller $view = new View($this->app->l11nManager, $request, $response); $view->addData('nav', $this->app->moduleManager->get('Navigation')->createNavigationMid(1005501001, $request, $response)); + /** @var \Modules\Workflow\Models\WorkflowInstanceAbstract $instance */ + $instance = WorkflowInstanceAbstractMapper::get() + ->where('id', (int) $request->getData('id')) + ->execute(); + /** @var \Modules\Workflow\Models\WorkflowTemplate $template */ $template = WorkflowTemplateMapper::get() ->with('source') ->with('source/sources') - ->where('template', (int) $request->getData('template')) + ->where('id', $instance->template->getId()) + ->limit() ->execute(); + $view->addData('template', $template); + if (!(($template->source->findFile('instance-profile.tpl.php')) instanceof NullMedia)) { require_once $template->source->findFile('WorkflowController.php')->getPath(); diff --git a/Models/NullWorkflowInstance.php b/Models/NullWorkflowInstanceAbstract.php similarity index 88% rename from Models/NullWorkflowInstance.php rename to Models/NullWorkflowInstanceAbstract.php index e551259..a989326 100644 --- a/Models/NullWorkflowInstance.php +++ b/Models/NullWorkflowInstanceAbstract.php @@ -22,7 +22,7 @@ namespace Modules\Workflow\Models; * @link https://karaka.app * @since 1.0.0 */ -final class NullWorkflowInstance extends WorkflowInstanceAbstract +final class NullWorkflowInstanceAbstract extends WorkflowInstanceAbstract { /** * Constructor diff --git a/Models/WorkflowControllerInterface.php b/Models/WorkflowControllerInterface.php index e5ffe91..e9d379b 100644 --- a/Models/WorkflowControllerInterface.php +++ b/Models/WorkflowControllerInterface.php @@ -31,13 +31,14 @@ interface WorkflowControllerInterface /** * Create instance from request * - * @param RequestAbstract $request Request + * @param RequestAbstract $request Request + * @param WorkflowTemplate $template Workflow template * * @return WorkflowInstanceAbstract * * @since 1.0.0 */ - public function createInstanceFromRequest(RequestAbstract $request) : WorkflowInstanceAbstract; + public function createInstanceFromRequest(RequestAbstract $request, WorkflowTemplate $template) : WorkflowInstanceAbstract; /** * Create list of all instances for this workflow from a request diff --git a/Models/WorkflowInstanceAbstract.php b/Models/WorkflowInstanceAbstract.php index f3f1956..e7a9ea0 100644 --- a/Models/WorkflowInstanceAbstract.php +++ b/Models/WorkflowInstanceAbstract.php @@ -25,7 +25,7 @@ use Modules\Admin\Models\NullAccount; * @link https://karaka.app * @since 1.0.0 */ -abstract class WorkflowInstanceAbstract +class WorkflowInstanceAbstract { /** * ID. @@ -43,6 +43,14 @@ abstract class WorkflowInstanceAbstract */ public string $title = ''; + /** + * Instance status. + * + * @var int + * @since 1.0.0 + */ + private int $status = WorkflowInstanceStatus::WORKING; + /** * Template. * @@ -90,4 +98,30 @@ abstract class WorkflowInstanceAbstract { return $this->id; } + + /** + * Set status + * + * @param int $status Status + * + * @return void + * + * @since 1.0.0 + */ + public function setStatus(int $status) : void + { + $this->status = $status; + } + + /** + * Get status + * + * @return int + * + * @since 1.0.0 + */ + public function getStatus() : int + { + return $this->status; + } } diff --git a/Models/WorkflowInstanceMapper.php b/Models/WorkflowInstanceAbstractMapper.php similarity index 86% rename from Models/WorkflowInstanceMapper.php rename to Models/WorkflowInstanceAbstractMapper.php index 48bbfb1..af4e3e8 100644 --- a/Models/WorkflowInstanceMapper.php +++ b/Models/WorkflowInstanceAbstractMapper.php @@ -25,7 +25,7 @@ use phpOMS\DataStorage\Database\Mapper\DataMapperFactory; * @link https://karaka.app * @since 1.0.0 */ -final class WorkflowInstanceMapper extends DataMapperFactory +final class WorkflowInstanceAbstractMapper extends DataMapperFactory { /** * Columns. @@ -35,6 +35,8 @@ final class WorkflowInstanceMapper extends DataMapperFactory */ public const COLUMNS = [ 'workflow_instance_id' => ['name' => 'workflow_instance_id', 'type' => 'int', 'internal' => 'id'], + 'workflow_instance_title' => ['name' => 'workflow_instance_title', 'type' => 'string', 'internal' => 'title'], + 'workflow_instance_status' => ['name' => 'workflow_instance_status', 'type' => 'int', 'internal' => 'status'], 'workflow_instance_template' => ['name' => 'workflow_instance_template', 'type' => 'int', 'internal' => 'template'], 'workflow_instance_created_at' => ['name' => 'workflow_instance_created_at', 'type' => 'DateTimeImmutable', 'internal' => 'createdAt', 'readonly' => true], 'workflow_instance_created_by' => ['name' => 'workflow_instance_created_by', 'type' => 'int', 'internal' => 'createdBy', 'readonly' => true], diff --git a/Models/WorkflowInstanceStatus.php b/Models/WorkflowInstanceStatus.php new file mode 100644 index 0000000..9a1fcc3 --- /dev/null +++ b/Models/WorkflowInstanceStatus.php @@ -0,0 +1,36 @@ +getData('nav')->render(); +/** + * @var \phpOMS\Views\View $this + */ +$instances = $this->getData('instances') ?? []; + +echo $this->getData('nav')->render(); ?> + +
+
+
+
getHtml('instance'); ?>
+ + + + $instance) : ++$c; + $url = \phpOMS\Uri\UriFactory::build('{/prefix}admin/instance/single?{?}&id=' . $instance->getId()); + ?> + +
getHtml('Status'); ?> + getHtml('Title'); ?> +
printHtml((string) $instance->getStatus()); ?> + printHtml($instance->title); ?> + +
getHtml('Empty', '0', '0'); ?> + +
+
+
+
\ No newline at end of file diff --git a/Theme/Backend/workflow-instance-list.tpl.php b/Theme/Backend/workflow-instance-list.tpl.php index 56e7caf..3ea3d6a 100755 --- a/Theme/Backend/workflow-instance-list.tpl.php +++ b/Theme/Backend/workflow-instance-list.tpl.php @@ -12,5 +12,34 @@ */ declare(strict_types=1); -/** @var \phpOMS\Views\View $this */ -echo $this->getData('nav')->render(); +/** + * @var \phpOMS\Views\View $this + */ +$instances = $this->getData('instances') ?? []; + +echo $this->getData('nav')->render(); ?> + +
+
+
+
getHtml('instance'); ?>
+ + + + $instance) : ++$c; + $url = \phpOMS\Uri\UriFactory::build('{/prefix}workflow/instance/profile?{?}&id=' . $instance->getId()); + ?> + +
getHtml('Status'); ?> + getHtml('Title'); ?> +
printHtml((string) $instance->getStatus()); ?> + printHtml($instance->title); ?> + +
getHtml('Empty', '0', '0'); ?> + +
+
+
+
\ No newline at end of file