From e4f9e7447a8beb8794e2de93b406f0315846ee4b Mon Sep 17 00:00:00 2001 From: Dennis Eichhorn Date: Mon, 28 Mar 2022 21:27:54 +0200 Subject: [PATCH] continue implementation drafting --- Admin/Hooks/Cli.php | 2 +- Admin/Routes/Cli.php | 12 ++ Admin/Routes/Web/Api.php | 54 ++++++ Admin/Routes/Web/Backend.php | 21 ++- Controller/ApiController.php | 175 +++++++++++++----- Controller/BackendController.php | 172 ++++++++++++++--- Controller/CliController.php | 95 +++++++++- Models/WorkflowControllerInterface.php | 74 ++++++++ ...tance.php => WorkflowInstanceAbstract.php} | 10 +- Models/WorkflowInterface.php | 27 --- Models/WorkflowTemplate.php | 15 ++ Theme/Backend/workflow-create.tpl.php | 41 +--- Theme/Backend/workflow-dashboard.tpl.php | 48 +---- .../Backend/workflow-instance-list.tpl.php | 7 +- Theme/Backend/workflow-instance.tpl.php | 16 ++ Theme/Backend/workflow-single.tpl.php | 89 --------- 16 files changed, 576 insertions(+), 282 deletions(-) create mode 100644 Admin/Routes/Cli.php create mode 100644 Admin/Routes/Web/Api.php create mode 100644 Models/WorkflowControllerInterface.php rename Models/{WorkflowInstance.php => WorkflowInstanceAbstract.php} (90%) delete mode 100755 Models/WorkflowInterface.php mode change 100755 => 100644 Theme/Backend/workflow-dashboard.tpl.php rename Admin/Hooks/Web/Api.php => Theme/Backend/workflow-instance-list.tpl.php (64%) mode change 100644 => 100755 create mode 100755 Theme/Backend/workflow-instance.tpl.php delete mode 100755 Theme/Backend/workflow-single.tpl.php diff --git a/Admin/Hooks/Cli.php b/Admin/Hooks/Cli.php index 9d30820..9e32b24 100644 --- a/Admin/Hooks/Cli.php +++ b/Admin/Hooks/Cli.php @@ -14,6 +14,6 @@ declare(strict_types=1); return [ '/.*/' => [ - 'callback' => ['\Modules\Workflow\Controller\CliController:findWorkflow'], + 'callback' => ['\Modules\Workflow\Controller\CliController:runWorkflowFromHook'], ], ]; diff --git a/Admin/Routes/Cli.php b/Admin/Routes/Cli.php new file mode 100644 index 0000000..7acd36f --- /dev/null +++ b/Admin/Routes/Cli.php @@ -0,0 +1,12 @@ + [ + [ + 'dest' => '\Modules\Workflow\Controller\CliController:cliWorkflowInstanceCreate', + 'verb' => RouteVerb::PUT, + ], + ] +]; diff --git a/Admin/Routes/Web/Api.php b/Admin/Routes/Web/Api.php new file mode 100644 index 0000000..9cd9f36 --- /dev/null +++ b/Admin/Routes/Web/Api.php @@ -0,0 +1,54 @@ + [ + [ + 'dest' => '\Modules\Workflow\Controller\ApiController:apiWorkflowExport', + 'verb' => RouteVerb::GET, + 'permission' => [ + 'module' => ApiController::NAME, + 'type' => PermissionType::READ, + 'state' => PermissionCategory::WORKFLOW, + ], + ], + ], + '^.*/workflow/template.*$' => [ + [ + 'dest' => '\Modules\Workflow\Controller\ApiController:apiWorkflowTemplateCreate', + 'verb' => RouteVerb::PUT, + 'permission' => [ + 'module' => ApiController::NAME, + 'type' => PermissionType::CREATE, + 'state' => PermissionCategory::TEMPLATE, + ], + ], + ], + '^.*/workflow/instance.*$' => [ + [ + 'dest' => '\Modules\Workflow\Controller\ApiController:apiWorkflowInstanceCreate', + 'verb' => RouteVerb::PUT, + 'permission' => [ + 'module' => ApiController::NAME, + 'type' => PermissionType::CREATE, + 'state' => PermissionCategory::WORKFLOW, + ], + ], + ], +]; diff --git a/Admin/Routes/Web/Backend.php b/Admin/Routes/Web/Backend.php index bbbfd36..d8f70c8 100755 --- a/Admin/Routes/Web/Backend.php +++ b/Admin/Routes/Web/Backend.php @@ -20,7 +20,7 @@ use phpOMS\Router\RouteVerb; return [ '^.*/workflow/template/list.*$' => [ [ - 'dest' => '\Modules\Workflow\Controller\BackendController:viewWorkflowTemplates', + 'dest' => '\Modules\Workflow\Controller\BackendController:viewWorkflowTemplateList', 'verb' => RouteVerb::GET, 'permission' => [ 'module' => BackendController::NAME, @@ -29,7 +29,7 @@ return [ ], ], ], - '^.*/workflow/template/single.*$' => [ + '^.*/workflow/template/profile.*$' => [ [ 'dest' => '\Modules\Workflow\Controller\BackendController:viewWorkflowTemplate', 'verb' => RouteVerb::GET, @@ -53,7 +53,18 @@ return [ ], '^.*/workflow/dashboard.*$' => [ [ - 'dest' => '\Modules\Workflow\Controller\BackendController:viewWorkflowDashboard', + 'dest' => '\Modules\Workflow\Controller\BackendController:viewDashboard', + 'verb' => RouteVerb::GET, + 'permission' => [ + 'module' => BackendController::NAME, + 'type' => PermissionType::CREATE, + 'state' => PermissionCategory::WORKFLOW, + ], + ], + ], + '^.*/workflow/instance/list.*$' => [ + [ + 'dest' => '\Modules\Workflow\Controller\BackendController:viewInstanceList', 'verb' => RouteVerb::GET, 'permission' => [ 'module' => BackendController::NAME, @@ -62,9 +73,9 @@ return [ ], ], ], - '^.*/workflow/single.*$' => [ + '^.*/workflow/instance/profile.*$' => [ [ - 'dest' => '\Modules\Workflow\Controller\BackendController:viewWorkflowSingle', + 'dest' => '\Modules\Workflow\Controller\BackendController:viewInstance', 'verb' => RouteVerb::GET, 'permission' => [ 'module' => BackendController::NAME, diff --git a/Controller/ApiController.php b/Controller/ApiController.php index 9579418..5a6f74d 100644 --- a/Controller/ApiController.php +++ b/Controller/ApiController.php @@ -21,6 +21,7 @@ use Modules\Media\Models\NullCollection; use Modules\Media\Models\NullMedia; use Modules\Workflow\Models\PermissionCategory; use Modules\Workflow\Models\WorkflowInstance; +use Modules\Workflow\Models\WorkflowInstanceAbstract; use Modules\Workflow\Models\WorkflowInstanceMapper; use Modules\Workflow\Models\WorkflowTemplate; use Modules\Workflow\Models\WorkflowTemplateMapper; @@ -34,10 +35,10 @@ use phpOMS\Message\RequestAbstract; use phpOMS\Message\ResponseAbstract; use phpOMS\Model\Message\FormValidation; use phpOMS\System\MimeType; -use phpOMS\System\SystemUtils; use phpOMS\Utils\Parser\Markdown\Markdown; use phpOMS\Utils\StringUtils; use phpOMS\Views\View; +use phpOMS\DataStorage\Database\Schema\Builder as SchemaBuilder; /** * Workflow controller class. @@ -71,7 +72,7 @@ final class ApiController extends Controller return; } - /** @var WorkflowInstance $instance */ + /** @var WorkflowInstanceAbstract $instance */ $instance = WorkflowInstanceMapper::get() ->with('template') ->with('template/source') @@ -206,7 +207,7 @@ final class ApiController extends Controller /** * Create view from template * - * @param WorkflowInstance $instance Instance to create view from + * @param WorkflowInstanceAbstract $instance Instance to create view from * @param RequestAbstract $request Request * @param ResponseAbstract $response Response * @@ -216,7 +217,7 @@ final class ApiController extends Controller * * @since 1.0.0 */ - private function createView(WorkflowInstance $instance, RequestAbstract $request, ResponseAbstract $response) : View + private function createView(WorkflowInstanceAbstract $instance, RequestAbstract $request, ResponseAbstract $response) : View { /** @var array $tcoll */ $tcoll = []; @@ -308,9 +309,8 @@ final class ApiController extends Controller * * @since 1.0.0 */ - public function apiTemplateCreate(RequestAbstract $request, ResponseAbstract $response, $data = null) : void + public function apiWorkflowTemplateCreate(RequestAbstract $request, ResponseAbstract $response, $data = null) : void { - $dbFiles = $request->getDataJson('media-list') ?? []; $uploadedFiles = $request->getFiles() ?? []; $files = []; @@ -328,6 +328,7 @@ final class ApiController extends Controller return; } + /** @var \Modules\Media\Models\Media[] $uploaded */ $uploaded = $this->app->moduleManager->get('Media')->uploadFiles( $request->getDataList('names') ?? [], $request->getDataList('filenames') ?? [], @@ -337,11 +338,11 @@ final class ApiController extends Controller ); foreach ($uploaded as $upload) { - $files[] = new NullMedia($upload->getId()); - } + if ($upload instanceof NullMedia) { + continue; + } - foreach ($dbFiles as $db) { - $files[] = new NullMedia($db); + $files[] = $upload; } /** @var Collection $collection */ @@ -365,8 +366,22 @@ final class ApiController extends Controller CollectionMapper::create()->execute($collection); $template = $this->createTemplateFromRequest($request, $collection->getId()); + $this->createDatabaseForTemplate($template); $this->createModel($request->header->account, $template, WorkflowTemplateMapper::class, 'template', $request->getOrigin()); + + // replace placeholders + foreach ($uploaded as $upload) { + if ($upload instanceof NullMedia) { + continue; + } + + $path = $upload->getAbsolutePath(); + $content = \file_get_contents($path); + $content = \str_replace('{workflow_id}', (string) $template->getId(), $content); + \file_put_contents($path, $content); + } + $this->fillJsonResponse($request, $response, NotificationLevel::OK, 'Template', 'Template successfully created', $template); } @@ -403,7 +418,7 @@ final class ApiController extends Controller * * @param RequestAbstract $request Request * - * @return Template + * @return WorkflowTemplate * * @since 1.0.0 */ @@ -425,7 +440,46 @@ final class ApiController extends Controller } /** - * Routing end-point for application behaviour. + * Method to create database for template. + * + * @param WorkflowTemplate $template Workflow template + * + * @return void + * + * @since 1.0.0 + */ + private function createDatabaseForTemplate(WorkflowTemplate $template) : void + { + /** @var \Modules\Media\Models\Collection $collection */ + $collection = CollectionMapper::get() + ->with('sources') + ->where('id', $template->source->getId()) + ->execute(); + + $files = $collection->getSources(); + foreach ($files as $file) { + if (!StringUtils::endsWith($file->getPath(), 'db.json')) { + continue; + } + + if (!\is_file($file->getPath())) { + return; + } + + $content = \file_get_contents($file->getPath()); + if ($content === false) { + return; // @codeCoverageIgnore + } + + $definitions = \json_decode($content, true); + foreach ($definitions as $definition) { + SchemaBuilder::createFromSchema($definition, $this->app->dbPool->get('schema'))->execute(); + } + } + } + + /** + * Method which creates a workflow instance * * @param RequestAbstract $request Request * @param ResponseAbstract $response Response @@ -433,12 +487,75 @@ final class ApiController extends Controller * * @return void * - * @api - * * @since 1.0.0 */ public function apiWorkflowInstanceCreate(RequestAbstract $request, ResponseAbstract $response, $data = null) : void { + if (!empty($val = $this->validateInstanceCreate($request))) { + $response->set('instance_create', new FormValidation($val)); + $response->header->status = RequestStatusCode::R_400; + + return; + } + + $instance = $this->createInstanceFromRequest($request); + + $this->createModel($request->header->account, $instance, WorkflowInstanceMapper::class, 'instance', $request->getOrigin()); + $this->fillJsonResponse($request, $response, NotificationLevel::OK, 'Instance', 'Instance successfully created', $instance); + } + + /** + * Validate template create request + * + * @param RequestAbstract $request Request + * + * @return array + * + * @since 1.0.0 + */ + private function validateInstanceCreate(RequestAbstract $request) : array + { + $val = []; + if (($val['j'] = empty($request->getData('j')))) { + return $val; + } + + return []; + } + + /** + * Method to create interface from request. + * + * @param RequestAbstract $request Request + * + * @return WorkflowInstanceAbstract + * + * @since 1.0.0 + */ + private function createInstanceFromRequest(RequestAbstract $request) : WorkflowInstanceAbstract + { + $template = WorkflowTemplateMapper::get() + ->where('id', (int) $request->getData('j')) + ->execute(); + + $controller = null; + + $files = $template->source->getSources(); + foreach ($files as $tMedia) { + $lowerPath = \strtolower($tMedia->getPath()); + + switch (true) { + case StringUtils::endsWith($lowerPath, 'WorkflowController.php'): + require_once $lowerPath; + + $controller = new WorkflowController($this->app, $template); + break; + } + } + + $instance = $controller->createInstanceFromRequest($request); + + return $instance; } /** @@ -459,34 +576,4 @@ final class ApiController extends Controller public function apiWorkflowImport(HttpRequest $request, HttpResponse $response, $data = null) : void { } - - /** - * Api method to make a call to the cli app - * - * @param mixed $data Generic data - * - * @return void - * - * @api - * - * @since 1.0.0 - * @todo maybe this needs to be moved to the admin module if there every is another hook which uses .* regex-match and is forwarded to the cli application - */ - public function cliEventCall(...$data) : void - { - $count = \count($data); - - // @todo: if no Cli is available do it in the web app (maybe first web request and if this is also not allowed run it in here) - /* - SystemUtils::runProc( - 'php', - __DIR__ . '/../../../cli.php' . ' ' - . 'post:/admin/event' . ' ' - . '-g ' . \escapeshellarg($data[$count - 2]) . ' ' - . '-i ' . \escapeshellarg($data[$count - 1]) . ' ' - . '-d ' . \escapeshellarg(\json_encode($data)), - true - ); - */ - } } diff --git a/Controller/BackendController.php b/Controller/BackendController.php index 5475a33..6b8e25b 100755 --- a/Controller/BackendController.php +++ b/Controller/BackendController.php @@ -15,6 +15,9 @@ declare(strict_types=1); namespace Modules\Workflow\Controller; use Modules\Media\Models\CollectionMapper; +use Modules\Media\Models\NullMedia; +use Modules\Workflow\Models\WorkflowInstanceMapper; +use Modules\Workflow\Models\WorkflowStatus; use Modules\Workflow\Models\WorkflowTemplateMapper; use phpOMS\Contract\RenderableInterface; use phpOMS\Message\RequestAbstract; @@ -31,6 +34,60 @@ use phpOMS\Views\View; */ final class BackendController extends Controller { + /** + * Api method to make a call to the cli app + * + * @param mixed $data Generic data + * + * @return void + * + * @api + * + * @since 1.0.0 + */ + public function runWorkflowFromHook(...$data) : void + { + $workflows = WorkflowTemplateMapper::getAll()->where('status', WorkflowStatus::ACTIVE)->execute(); + foreach ($workflows as $workflow) { + $hooks = $workflow->getHooks(); + + foreach ($hooks as $hook) { + $triggerIsRegex = \stripos($data[':triggerGroup'], '/') === 0; + $matched = false; + + if ($triggerIsRegex) { + $matched = \preg_match($data[':triggerGroup'], $hook) === 1; + } else { + $matched = $data[':triggerGroup'] === $hook; + } + + if (!$matched && \stripos($hook, '/') === 0) { + $matched = \preg_match($hook, $data[':triggerGroup']) === 1; + } + + if ($matched) { + $this->runWorkflow($workflow, $hook, $data); + } + } + } + } + + /** + * Api method to make a call to the cli app + * + * @param mixed $data Generic data + * + * @return void + * + * @api + * + * @since 1.0.0 + */ + public function runWorkflow(WorkflowTemplate $workflow, string $hook, array $data) : void + { + include $workflow->media->getAbsolutePath(); + } + /** * Routing end-point for application behaviour. * @@ -43,7 +100,7 @@ final class BackendController extends Controller * @since 1.0.0 * @codeCoverageIgnore */ - public function viewWorkflowTemplates(RequestAbstract $request, ResponseAbstract $response, $data = null) : RenderableInterface + public function viewWorkflowTemplateList(RequestAbstract $request, ResponseAbstract $response, $data = null) : RenderableInterface { $view = new View($this->app->l11nManager, $request, $response); $view->setTemplate('/Modules/Workflow/Theme/Backend/workflow-template-list'); @@ -84,29 +141,25 @@ final class BackendController extends Controller public function viewWorkflowTemplate(RequestAbstract $request, ResponseAbstract $response, $data = null) : RenderableInterface { $view = new View($this->app->l11nManager, $request, $response); - $view->setTemplate('/Modules/Workflow/Theme/Backend/task-single'); $view->addData('nav', $this->app->moduleManager->get('Navigation')->createNavigationMid(1005501001, $request, $response)); - return $view; - } + $template = WorkflowTemplateMapper::get() + ->with('createdBy') + ->where('id', (int) $request->getData('id')) + ->execute(); - /** - * Routing end-point for application behaviour. - * - * @param RequestAbstract $request Request - * @param ResponseAbstract $response Response - * @param mixed $data Generic data - * - * @return RenderableInterface - * - * @since 1.0.0 - * @codeCoverageIgnore - */ - public function viewWorkflowSingle(RequestAbstract $request, ResponseAbstract $response, $data = null) : RenderableInterface - { - $view = new View($this->app->l11nManager, $request, $response); - $view->setTemplate('/Modules/Workflow/Theme/Backend/task-create'); - $view->addData('nav', $this->app->moduleManager->get('Navigation')->createNavigationMid(1005501001, $request, $response)); + require_once $template->findFile('WorkflowController.php')->getPath(); + + /** @var WorkflowControllerInterface $controller */ + $controller = new WorkflowController($this->app, $template); + + // @todo load template specific data and pass it to the view + + if (!(($list = $template->findFile('template-profile.tpl.php')) instanceof NullMedia)) { + $view->setTemplate('/' . \substr($list->getPath(), 0, -8)); + } else { + $view->setTemplate('/Modules/Workflow/Theme/Backend/workflow-profile'); + } return $view; } @@ -144,7 +197,7 @@ final class BackendController extends Controller * @since 1.0.0 * @codeCoverageIgnore */ - public function viewWorkflowDashboard(RequestAbstract $request, ResponseAbstract $response, $data = null) : RenderableInterface + public function viewDashboard(RequestAbstract $request, ResponseAbstract $response, $data = null) : RenderableInterface { $view = new View($this->app->l11nManager, $request, $response); $view->setTemplate('/Modules/Workflow/Theme/Backend/workflow-dashboard'); @@ -152,4 +205,79 @@ final class BackendController extends Controller return $view; } + + /** + * Routing end-point for application behaviour. + * + * @param RequestAbstract $request Request + * @param ResponseAbstract $response Response + * @param mixed $data Generic data + * + * @return RenderableInterface + * + * @since 1.0.0 + * @codeCoverageIgnore + */ + public function viewInstanceList(RequestAbstract $request, ResponseAbstract $response, $data = null) : RenderableInterface + { + $view = new View($this->app->l11nManager, $request, $response); + $view->addData('nav', $this->app->moduleManager->get('Navigation')->createNavigationMid(1005501001, $request, $response)); + + $template = WorkflowTemplateMapper::get() + ->with('createdBy') + ->where('id', (int) $request->getData('id')) + ->execute(); + + require_once $template->findFile('WorkflowController.php')->getPath(); + + /** @var WorkflowControllerInterface $controller */ + $controller = new WorkflowController($this->app, $template); + + $view->addData('instances', $controller->getInstanceListFromRequest($request)); + + if (!(($list = $template->findFile('instance-list.tpl.php')) instanceof NullMedia)) { + $view->setTemplate('/' . \substr($list->getPath(), 0, -8)); + } else { + $view->setTemplate('/Modules/Workflow/Theme/Backend/workflow-instance-list'); + } + + return $view; + } + + /** + * Routing end-point for application behaviour. + * + * @param RequestAbstract $request Request + * @param ResponseAbstract $response Response + * @param mixed $data Generic data + * + * @return RenderableInterface + * + * @since 1.0.0 + * @codeCoverageIgnore + */ + public function viewInstance(RequestAbstract $request, ResponseAbstract $response, $data = null) : RenderableInterface + { + $view = new View($this->app->l11nManager, $request, $response); + $view->addData('nav', $this->app->moduleManager->get('Navigation')->createNavigationMid(1005501001, $request, $response)); + + $template = WorkflowTemplateMapper::get() + ->where('template', (int) $request->getData('template')) + ->execute(); + + require_once $template->findFile('WorkflowController.php')->getPath(); + + /** @var WorkflowControllerInterface $controller */ + $controller = new WorkflowController($this->app, $template); + + $view->addData('instance', $controller->getInstanceFromRequest($request)); + + if (!(($instance = $template->findFile('instance-profile.tpl.php')) instanceof NullMedia)) { + $view->setTemplate('/' . \substr($instance->getPath(), 0, -8)); + } else { + $view->setTemplate('/Modules/Workflow/Theme/Backend/workflow-instance'); + } + + return $view; + } } diff --git a/Controller/CliController.php b/Controller/CliController.php index b296aea..fbf07a8 100644 --- a/Controller/CliController.php +++ b/Controller/CliController.php @@ -14,10 +14,17 @@ declare(strict_types=1); namespace Modules\Workflow\Controller; +use Modules\Workflow\Models\WorkflowInstanceAbstract; use Modules\Workflow\Models\WorkflowStatus; use Modules\Workflow\Models\WorkflowTemplate; use Modules\Workflow\Models\WorkflowTemplateMapper; -use phpOMS\System\SystemUtils; +use phpOMS\Contract\RenderableInterface; +use phpOMS\Message\Http\RequestStatusCode; +use phpOMS\Message\RequestAbstract; +use phpOMS\Message\ResponseAbstract; +use phpOMS\Model\Message\FormValidation; +use phpOMS\Utils\StringUtils; +use phpOMS\Views\View; /** * Workflow controller class. @@ -40,7 +47,7 @@ final class CliController extends Controller * * @since 1.0.0 */ - public function findWorkflow(...$data) : void + public function runWorkflowFromHook(...$data) : void { $workflows = WorkflowTemplateMapper::getAll()->where('status', WorkflowStatus::ACTIVE)->execute(); foreach ($workflows as $workflow) { @@ -82,4 +89,88 @@ final class CliController extends Controller { include $workflow->media->getAbsolutePath(); } + + /** + * Method which creates a workflow instance + * + * @param RequestAbstract $request Request + * @param ResponseAbstract $response Response + * @param mixed $data Generic data + * + * @return RenderableInterface Response can be rendered + * + * @since 1.0.0 + * @codeCoverageIgnore + */ + public function cliWorkflowInstanceCreate(RequestAbstract $request, ResponseAbstract $response, $data = null) : RenderableInterface + { + $view = new View($this->app->l11nManager, $request, $response); + + if (!empty($val = $this->validateInstanceCreate($request))) { + $response->set('instance_create', new FormValidation($val)); + $response->header->status = RequestStatusCode::R_400; + } + + $instance = $this->createInstanceFromRequest($request); + + $view->setTemplate('/Modules/Workflow/Theme/Cli/empty-command'); + + return $view; + } + + /** + * Validate template create request + * + * @param RequestAbstract $request Request + * + * @return array + * + * @since 1.0.0 + */ + private function validateInstanceCreate(RequestAbstract $request) : array + { + $val = []; + if (($val['j'] = empty($request->getData('j')))) { + return $val; + } + + return []; + } + + /** + * Method to create instance from request. + * + * @param RequestAbstract $request Request + * + * @return WorkflowInstanceAbstract + * + * @since 1.0.0 + */ + private function createInstanceFromRequest(RequestAbstract $request) : WorkflowInstanceAbstract + { + $template = WorkflowTemplateMapper::get() + ->where('id', (int) $request->getData('j')) + ->execute(); + + $controller = null; + $mapper = null; + + $files = $template->source->getSources(); + foreach ($files as $tMedia) { + $lowerPath = \strtolower($tMedia->getPath()); + + switch (true) { + case StringUtils::endsWith($lowerPath, 'WorkflowController.php'): + require_once $lowerPath; + + $controller = new WorkflowController($this->app, $template); + break; + } + } + + $instance = $controller->createInstanceFromRequest($request); + $controller->createInstanceDbModel($instance); + + return $instance; + } } diff --git a/Models/WorkflowControllerInterface.php b/Models/WorkflowControllerInterface.php new file mode 100644 index 0000000..e16a3b6 --- /dev/null +++ b/Models/WorkflowControllerInterface.php @@ -0,0 +1,74 @@ +id; } + + public function findFile(string $name) : Media + { + $files = $this->source->getSources(); + foreach ($files as $file) { + if (StringUtils::endsWith($file->getPath(), $name)) { + return $file; + } + } + + return new NullMedia(); + } } diff --git a/Theme/Backend/workflow-create.tpl.php b/Theme/Backend/workflow-create.tpl.php index af4e822..b0a004f 100755 --- a/Theme/Backend/workflow-create.tpl.php +++ b/Theme/Backend/workflow-create.tpl.php @@ -13,43 +13,4 @@ declare(strict_types=1); /** @var \phpOMS\Views\View $this */ -echo $this->getData('nav')->render(); ?> - -
-

getHtml('Task'); ?>

- -
-
- - -
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- -
-

getHtml('Media'); ?>

- -
-
- - -
-
-
-
-
-
-
-
+echo $this->getData('nav')->render(); diff --git a/Theme/Backend/workflow-dashboard.tpl.php b/Theme/Backend/workflow-dashboard.tpl.php old mode 100755 new mode 100644 index a6adc58..b0a004f --- a/Theme/Backend/workflow-dashboard.tpl.php +++ b/Theme/Backend/workflow-dashboard.tpl.php @@ -12,49 +12,5 @@ */ declare(strict_types=1); -use Modules\Workflow\Models\WorkflowStatus; - -/** - * @var \phpOMS\Views\View $this - */ -$workflows = []; - -echo $this->getData('nav')->render(); ?> - -
-
-
-
getHtml('Workflow'); ?>
- - - - - $workflow) : ++$c; - - $url = \phpOMS\Uri\UriFactory::build('{/prefix}task/single?{?}&id=' . $workflow->getId()); - $color = 'darkred'; - - if ($workflow->getStatus() === WorkflowStatus::DONE) { $color = 'green'; } - elseif ($workflow->getStatus() === WorkflowStatus::OPEN) { $color = 'darkblue'; } - elseif ($workflow->getStatus() === WorkflowStatus::WORKING) { $color = 'purple'; } - elseif ($workflow->getStatus() === WorkflowStatus::CANCELED) { $color = 'red'; } - elseif ($workflow->getStatus() === WorkflowStatus::SUSPENDED) { $color = 'yellow'; } ?> - -
getHtml('Status'); ?> - getHtml('Next'); ?> - getHtml('Title'); ?> - getHtml('Creator'); ?> - getHtml('Created'); ?> -
getHtml('S' . $workflow->getStatus()); ?> - printHtml($workflow->getDue()->format('Y-m-d H:i')); ?> - printHtml($workflow->getTitle()); ?> - printHtml($workflow->createdBy->getId()); ?> - printHtml($workflow->createdAt->format('Y-m-d H:i')); ?> - -
getHtml('Empty', '0', '0'); ?> - -
-
-
-
\ No newline at end of file +/** @var \phpOMS\Views\View $this */ +echo $this->getData('nav')->render(); diff --git a/Admin/Hooks/Web/Api.php b/Theme/Backend/workflow-instance-list.tpl.php old mode 100644 new mode 100755 similarity index 64% rename from Admin/Hooks/Web/Api.php rename to Theme/Backend/workflow-instance-list.tpl.php index 55c301f..b0a004f --- a/Admin/Hooks/Web/Api.php +++ b/Theme/Backend/workflow-instance-list.tpl.php @@ -12,8 +12,5 @@ */ declare(strict_types=1); -return [ - '/.*/' => [ - 'callback' => ['\Modules\Workflow\Controller\ApiController:cliEventCall'], - ], -]; +/** @var \phpOMS\Views\View $this */ +echo $this->getData('nav')->render(); diff --git a/Theme/Backend/workflow-instance.tpl.php b/Theme/Backend/workflow-instance.tpl.php new file mode 100755 index 0000000..b0a004f --- /dev/null +++ b/Theme/Backend/workflow-instance.tpl.php @@ -0,0 +1,16 @@ +getData('nav')->render(); diff --git a/Theme/Backend/workflow-single.tpl.php b/Theme/Backend/workflow-single.tpl.php deleted file mode 100755 index a00b655..0000000 --- a/Theme/Backend/workflow-single.tpl.php +++ /dev/null @@ -1,89 +0,0 @@ -getData('task'); -$elements = $task->getTaskElements(); -$cElements = \count($elements); - -echo $this->getData('nav')->render(); ?> - -
-

printHtml($task->getTitle()); ?>

-
-
Due printHtml($task->getDue()->format('Y-m-d H:i')); ?>
-
Created printHtml($task->createdAt->format('Y-m-d H:i')); ?>
-
- printHtml($task->description); ?> -
-
Created printHtml($task->createdBy->getId()); ?>
-
Status printHtml($task->getStatus()); ?>
-
-
- - $element) : ++$c; - if ($element->getStatus() === \Modules\Tasks\Models\TaskStatus::DONE) { $color = 'green'; } - elseif ($element->getStatus() === \Modules\Tasks\Models\TaskStatus::OPEN) { $color = 'darkblue'; } - elseif ($element->getStatus() === \Modules\Tasks\Models\TaskStatus::WORKING) { $color = 'purple'; } - elseif ($element->getStatus() === \Modules\Tasks\Models\TaskStatus::CANCELED) { $color = 'red'; } - elseif ($element->getStatus() === \Modules\Tasks\Models\TaskStatus::SUSPENDED) { $color = 'yellow'; } ?> -
-
getHtml('S' . $element->getStatus()); ?>
-
printHtml($element->createdBy->getId()); ?> - printHtml($element->createdAt->format('Y-m-d H:i')); ?>
-
- description !== '') : ?> -
-
-
- printHtml($element->description); ?> -
-
-
- -
- getStatus() !== \Modules\Tasks\Models\TaskStatus::CANCELED || - $element->getStatus() !== \Modules\Tasks\Models\TaskStatus::DONE || - $element->getStatus() !== \Modules\Tasks\Models\TaskStatus::SUSPENDED || $c != $cElements - ) : ?> -
Due printHtml($element->getDue()->format('Y-m-d H:i')); ?>
- - getForwarded() !== 0) : ?> -
Forwarded printHtml($element->getForwarded()); ?>
- -
- - -
-
-
- -
-
-
-
-
-
-
-
-
-
-
-
-