From 2a0c9db19830a6287bdae53c42366d3ff4273888 Mon Sep 17 00:00:00 2001 From: Dennis Eichhorn Date: Sun, 12 Feb 2017 21:43:10 +0100 Subject: [PATCH] Bulkl path fix reverse --- Admin/Activate.php | 44 +++++ Admin/Deactivate.php | 44 +++++ Admin/Install/Navigation.install.json | 63 +++++++ Admin/Install/Navigation.php | 40 ++++ Admin/Installer.php | 140 ++++++++++++++ Admin/Routes/Web/Backend.php | 36 ++++ Admin/Routes/console.php | 3 + Admin/Routes/socket.php | 3 + Admin/Uninstall.php | 55 ++++++ Admin/Update.php | 47 +++++ Controller.php | 174 ++++++++++++++++++ Docs/workflow_components.md | 17 ++ Models/Template.php | 34 ++++ Models/WorkflowInterface.php | 32 ++++ Models/WorkflowStatus.php | 39 ++++ README.md | 0 Templates/Permission/PermissionStatus.php | 36 ++++ Templates/Permission/States.php | 37 ++++ Templates/Permission/Workflow.php | 77 ++++++++ Templates/Permission/permission-info.tpl.php | 0 Templates/Permission/template.tpl.php | 0 Theme/Backend/Lang/Navigation.en.lang.php | 22 +++ Theme/Backend/Lang/en.lang.php | 24 +++ Theme/Backend/workflow-create.tpl.php | 60 ++++++ Theme/Backend/workflow-dashboard.tpl.php | 52 ++++++ Theme/Backend/workflow-single.tpl.php | 90 +++++++++ .../Backend/workflow-template-create.tpl.php | 19 ++ Theme/Backend/workflow-template-list.tpl.php | 22 +++ img/module_teaser_small.png | Bin 0 -> 49511 bytes info.json | 45 +++++ 30 files changed, 1255 insertions(+) create mode 100644 Admin/Activate.php create mode 100644 Admin/Deactivate.php create mode 100644 Admin/Install/Navigation.install.json create mode 100644 Admin/Install/Navigation.php create mode 100644 Admin/Installer.php create mode 100644 Admin/Routes/Web/Backend.php create mode 100644 Admin/Routes/console.php create mode 100644 Admin/Routes/socket.php create mode 100644 Admin/Uninstall.php create mode 100644 Admin/Update.php create mode 100644 Controller.php create mode 100644 Docs/workflow_components.md create mode 100644 Models/Template.php create mode 100644 Models/WorkflowInterface.php create mode 100644 Models/WorkflowStatus.php create mode 100644 README.md create mode 100644 Templates/Permission/PermissionStatus.php create mode 100644 Templates/Permission/States.php create mode 100644 Templates/Permission/Workflow.php create mode 100644 Templates/Permission/permission-info.tpl.php create mode 100644 Templates/Permission/template.tpl.php create mode 100644 Theme/Backend/Lang/Navigation.en.lang.php create mode 100644 Theme/Backend/Lang/en.lang.php create mode 100644 Theme/Backend/workflow-create.tpl.php create mode 100644 Theme/Backend/workflow-dashboard.tpl.php create mode 100644 Theme/Backend/workflow-single.tpl.php create mode 100644 Theme/Backend/workflow-template-create.tpl.php create mode 100644 Theme/Backend/workflow-template-list.tpl.php create mode 100644 img/module_teaser_small.png create mode 100644 info.json diff --git a/Admin/Activate.php b/Admin/Activate.php new file mode 100644 index 0000000..b3fa30f --- /dev/null +++ b/Admin/Activate.php @@ -0,0 +1,44 @@ + + * @author Dennis Eichhorn + * @copyright Dennis Eichhorn + * @license OMS License 1.0 + * @version 1.0.0 + * @link http://orange-management.com + */ +namespace Modules\Workflow\Admin; + + +use phpOMS\DataStorage\Database\DatabasePool; +use phpOMS\Module\ActivateAbstract; +use phpOMS\Module\InfoManager; + +/** + * Navigation class. + * + * @category Modules + * @package Modules\Admin + * @author OMS Development Team + * @author Dennis Eichhorn + * @license OMS License 1.0 + * @link http://orange-management.com + * @since 1.0.0 + */ +class Activate extends ActivateAbstract +{ + + /** + * {@inheritdoc} + */ + public static function activate(DatabasePool $dbPool, InfoManager $info) + { + parent::activate($dbPool, $info); + } +} diff --git a/Admin/Deactivate.php b/Admin/Deactivate.php new file mode 100644 index 0000000..d47cf80 --- /dev/null +++ b/Admin/Deactivate.php @@ -0,0 +1,44 @@ + + * @author Dennis Eichhorn + * @copyright Dennis Eichhorn + * @license OMS License 1.0 + * @version 1.0.0 + * @link http://orange-management.com + */ +namespace Modules\Workflow\Admin; + + +use phpOMS\DataStorage\Database\DatabasePool; +use phpOMS\Module\DeactivateAbstract; +use phpOMS\Module\InfoManager; + +/** + * Navigation class. + * + * @category Modules + * @package Modules\Admin + * @author OMS Development Team + * @author Dennis Eichhorn + * @license OMS License 1.0 + * @link http://orange-management.com + * @since 1.0.0 + */ +class Deactivate extends DeactivateAbstract +{ + + /** + * {@inheritdoc} + */ + public static function deactivate(DatabasePool $dbPool, InfoManager $info) + { + parent::deactivate($dbPool, $info); + } +} diff --git a/Admin/Install/Navigation.install.json b/Admin/Install/Navigation.install.json new file mode 100644 index 0000000..7bd6452 --- /dev/null +++ b/Admin/Install/Navigation.install.json @@ -0,0 +1,63 @@ +[ + { + "id": 1005501001, + "pid": "754a08ddf8bcb1cf22f310f09206dd783d42f7dd", + "type": 2, + "subtype": 1, + "name": "Workflows", + "uri": "/{/lang}/backend/workflow/dashboard?{?}", + "target": "self", + "icon": null, + "order": 40, + "from": "Wokflow", + "permission": null, + "parent": 1003301001, + "children": [ + { + "id": 1005502001, + "pid": "ac3d9bdf783c7963f449488e33c60133b3dbe6f8", + "type": 3, + "subtype": 1, + "name": "Dashboard", + "uri": "/{/lang}/backend/workflow/dashboard?{?}", + "target": "self", + "icon": null, + "order": 1, + "from": "Wokflow", + "permission": null, + "parent": 1005501001, + "children": [] + }, + { + "id": 1005503001, + "pid": "ac3d9bdf783c7963f449488e33c60133b3dbe6f8", + "type": 3, + "subtype": 1, + "name": "Templates", + "uri": "/{/lang}/backend/workflow/template/list?{?}", + "target": "self", + "icon": null, + "order": 5, + "from": "Wokflow", + "permission": null, + "parent": 1005501001, + "children": [] + }, + { + "id": 1005504001, + "pid": "ac3d9bdf783c7963f449488e33c60133b3dbe6f8", + "type": 3, + "subtype": 1, + "name": "Create", + "uri": "/{/lang}/backend/workflow/template/create?{?}", + "target": "self", + "icon": null, + "order": 10, + "from": "Wokflow", + "permission": null, + "parent": 1005501001, + "children": [] + } + ] + } +] diff --git a/Admin/Install/Navigation.php b/Admin/Install/Navigation.php new file mode 100644 index 0000000..9c337be --- /dev/null +++ b/Admin/Install/Navigation.php @@ -0,0 +1,40 @@ + + * @author Dennis Eichhorn + * @copyright Dennis Eichhorn + * @license OMS License 1.0 + * @version 1.0.0 + * @link http://orange-management.com + */ +namespace Modules\Workflow\Admin\Install; +use phpOMS\DataStorage\Database\DatabasePool; + +/** + * Navigation class. + * + * @category Modules + * @package Modules\Admin + * @author OMS Development Team + * @author Dennis Eichhorn + * @license OMS License 1.0 + * @link http://orange-management.com + * @since 1.0.0 + */ +class Navigation +{ + public static function install(string $path, DatabasePool $dbPool) + { + $navData = json_decode(file_get_contents(__DIR__ . '/Navigation.install.json'), true); + + $class = '\\Modules\\Navigation\\Admin\\Installer'; + /** @var $class \Modules\Navigation\Admin\Installer */ + $class::installExternal($dbPool, $navData); + } +} diff --git a/Admin/Installer.php b/Admin/Installer.php new file mode 100644 index 0000000..a7a9ad6 --- /dev/null +++ b/Admin/Installer.php @@ -0,0 +1,140 @@ + + * @author Dennis Eichhorn + * @copyright Dennis Eichhorn + * @license OMS License 1.0 + * @version 1.0.0 + * @link http://orange-management.com + */ +namespace Modules\Workflow\Admin; + +use phpOMS\DataStorage\Database\DatabaseType; +use phpOMS\DataStorage\Database\DatabasePool; +use phpOMS\Module\InfoManager; +use phpOMS\Module\InstallerAbstract; + +/** + * Tasks install class. + * + * @category Modules + * @package Modules\Tasks + * @author OMS Development Team + * @author Dennis Eichhorn + * @license OMS License 1.0 + * @link http://orange-management.com + * @since 1.0.0 + */ +class Installer extends InstallerAbstract +{ + + /** + * {@inheritdoc} + */ + public static function install(string $path, DatabasePool $dbPool, InfoManager $info) + { + parent::install($path, $dbPool, $info); + + switch ($dbPool->get('core')->getType()) { + case DatabaseType::MYSQL: + $dbPool->get('core')->con->prepare( + 'CREATE TABLE if NOT EXISTS `' . $dbPool->get('core')->prefix . 'workflow` ( + `workflow_id` int(11) NOT NULL AUTO_INCREMENT, + `workflow_name` varchar(50) NOT NULL, + `workflow_status` int(11) NOT NULL, + `workflow_desc` varchar(100) DEFAULT NULL, + `workflow_created` datetime DEFAULT NULL, + `workflow_created_by` int(11) DEFAULT NULL, + PRIMARY KEY (`workflow_id`), + KEY `workflow_created_by` (`workflow_created_by`) + )ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1;' + )->execute(); + + $dbPool->get('core')->con->prepare( + 'ALTER TABLE `' . $dbPool->get('core')->prefix . 'workflow` + ADD CONSTRAINT `' . $dbPool->get('core')->prefix . 'workflow_ibfk_1` FOREIGN KEY (`workflow_created_by`) REFERENCES `' . $dbPool->get('core')->prefix . 'account` (`account_id`);' + )->execute(); + + $dbPool->get('core')->con->prepare( + 'CREATE TABLE if NOT EXISTS `' . $dbPool->get('core')->prefix . 'workflow_media` ( + `workflow_media_id` int(11) NOT NULL AUTO_INCREMENT, + `workflow_media_media` int(11) NOT NULL, + `workflow_media_workflow` int(11) NOT NULL, + `workflow_media_type` int(3) DEFAULT NULL, + PRIMARY KEY (`workflow_media_id`), + KEY `workflow_media_media` (`workflow_media_media`), + KEY `workflow_media_workflow` (`workflow_media_workflow`) + )ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1;' + )->execute(); + + $dbPool->get('core')->con->prepare( + 'ALTER TABLE `' . $dbPool->get('core')->prefix . 'workflow_media` + ADD CONSTRAINT `' . $dbPool->get('core')->prefix . 'workflow_media_ibfk_1` FOREIGN KEY (`workflow_media_media`) REFERENCES `' . $dbPool->get('core')->prefix . 'media` (`media_id`), + ADD CONSTRAINT `' . $dbPool->get('core')->prefix . 'workflow_media_ibfk_2` FOREIGN KEY (`workflow_media_workflow`) REFERENCES `' . $dbPool->get('core')->prefix . 'workflow` (`workflow_id`);' + )->execute(); + + $dbPool->get('core')->con->prepare( + 'CREATE TABLE if NOT EXISTS `' . $dbPool->get('core')->prefix . 'workflow_element` ( + `workflow_element_id` int(11) NOT NULL AUTO_INCREMENT, + `workflow_element_name` varchar(50) NOT NULL, + `workflow_element_status` int(11) NOT NULL, + `workflow_element_data` text NOT NULL, + `workflow_element_desc` varchar(100) DEFAULT NULL, + `workflow_element_created` datetime DEFAULT NULL, + `workflow_element_created_by` int(11) DEFAULT NULL, + `workflow_element_workflow` int(11) DEFAULT NULL, + PRIMARY KEY (`workflow_element_id`), + KEY `workflow_element_created_by` (`workflow_element_created_by`), + KEY `workflow_element_workflow` (`workflow_element_workflow`) + )ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1;' + )->execute(); + + $dbPool->get('core')->con->prepare( + 'ALTER TABLE `' . $dbPool->get('core')->prefix . 'workflow_element` + ADD CONSTRAINT `' . $dbPool->get('core')->prefix . 'workflow_element_ibfk_1` FOREIGN KEY (`workflow_element_created_by`) REFERENCES `' . $dbPool->get('core')->prefix . 'account` (`account_id`), + ADD CONSTRAINT `' . $dbPool->get('core')->prefix . 'workflow_element_ibfk_2` FOREIGN KEY (`workflow_element_workflow`) REFERENCES `' . $dbPool->get('core')->prefix . 'workflow` (`workflow_id`);' + )->execute(); + + $dbPool->get('core')->con->prepare( + 'CREATE TABLE if NOT EXISTS `' . $dbPool->get('core')->prefix . 'workflow_element_media` ( + `workflow_element_media_id` int(11) NOT NULL AUTO_INCREMENT, + `workflow_element_media_media` int(11) NOT NULL, + `workflow_element_media_workflow_element` int(11) NOT NULL, + PRIMARY KEY (`workflow_element_media_id`), + KEY `workflow_element_media_media` (`workflow_element_media_media`), + KEY `workflow_element_media_workflow_element` (`workflow_element_media_workflow_element`) + )ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1;' + )->execute(); + + $dbPool->get('core')->con->prepare( + 'ALTER TABLE `' . $dbPool->get('core')->prefix . 'workflow_element_media` + ADD CONSTRAINT `' . $dbPool->get('core')->prefix . 'workflow_element_media_ibfk_1` FOREIGN KEY (`workflow_element_media_media`) REFERENCES `' . $dbPool->get('core')->prefix . 'media` (`media_id`), + ADD CONSTRAINT `' . $dbPool->get('core')->prefix . 'workflow_element_media_ibfk_2` FOREIGN KEY (`workflow_element_media_workflow_element`) REFERENCES `' . $dbPool->get('core')->prefix . 'workflow_element` (`workflow_element_id`);' + )->execute(); + + $dbPool->get('core')->con->prepare( + 'CREATE TABLE if NOT EXISTS `' . $dbPool->get('core')->prefix . 'workflow_element_task` ( + `workflow_element_task_id` int(11) NOT NULL AUTO_INCREMENT, + `workflow_element_task_task` int(11) NOT NULL, + `workflow_element_task_workflow_element` int(11) NOT NULL, + PRIMARY KEY (`workflow_element_task_id`), + KEY `workflow_element_task_task` (`workflow_element_task_task`), + KEY `workflow_element_task_workflow_element` (`workflow_element_task_workflow_element`) + )ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1;' + )->execute(); + + $dbPool->get('core')->con->prepare( + 'ALTER TABLE `' . $dbPool->get('core')->prefix . 'workflow_element_task` + ADD CONSTRAINT `' . $dbPool->get('core')->prefix . 'workflow_element_task_ibfk_1` FOREIGN KEY (`workflow_element_task_task`) REFERENCES `' . $dbPool->get('core')->prefix . 'task` (`media_id`), + ADD CONSTRAINT `' . $dbPool->get('core')->prefix . 'workflow_element_task_ibfk_2` FOREIGN KEY (`workflow_element_task_workflow_element`) REFERENCES `' . $dbPool->get('core')->prefix . 'workflow_element` (`workflow_element_id`);' + )->execute(); + break; + } + } +} diff --git a/Admin/Routes/Web/Backend.php b/Admin/Routes/Web/Backend.php new file mode 100644 index 0000000..2ac473e --- /dev/null +++ b/Admin/Routes/Web/Backend.php @@ -0,0 +1,36 @@ + [ + [ + 'dest' => '\Modules\Workflow\Controller:viewWorkflowTemplates', + 'verb' => RouteVerb::GET, + ], + ], + '^.*/backend/workflow/template/single.*$' => [ + [ + 'dest' => '\Modules\Workflow\Controller:viewWorkflowTemplate', + 'verb' => RouteVerb::GET, + ], + ], + '^.*/backend/workflow/template/create.*$' => [ + [ + 'dest' => '\Modules\Workflow\Controller:viewWorkflowTemplateCreate', + 'verb' => RouteVerb::GET, + ], + ], + '^.*/backend/workflow/dashboard.*$' => [ + [ + 'dest' => '\Modules\Workflow\Controller:viewWorkflowDashboard', + 'verb' => RouteVerb::GET, + ], + ], + '^.*/backend/workflow/single.*$' => [ + [ + 'dest' => '\Modules\Workflow\Controller:viewWorkflowSingle', + 'verb' => RouteVerb::GET, + ], + ], +]; diff --git a/Admin/Routes/console.php b/Admin/Routes/console.php new file mode 100644 index 0000000..1ecbfac --- /dev/null +++ b/Admin/Routes/console.php @@ -0,0 +1,3 @@ + + * @author Dennis Eichhorn + * @copyright Dennis Eichhorn + * @license OMS License 1.0 + * @version 1.0.0 + * @link http://orange-management.com + */ +namespace Modules\Workflow\Admin; + + +use phpOMS\DataStorage\Database\DatabasePool; +use phpOMS\DataStorage\Database\Schema\Builder; +use phpOMS\Module\InfoManager; +use phpOMS\Module\UninstallAbstract; + +/** + * Navigation class. + * + * @category Modules + * @package Modules\Admin + * @author OMS Development Team + * @author Dennis Eichhorn + * @license OMS License 1.0 + * @link http://orange-management.com + * @since 1.0.0 + */ +class Uninstall extends UninstallAbstract +{ + + /** + * {@inheritdoc} + */ + public static function uninstall(DatabasePool $dbPool, InfoManager $info) + { + parent::uninstall($dbPool, $info); + + $query = new Builder($dbPool->get()); + + $query->prefix($dbPool->get('core')->getPrefix())->drop( + 'task_element', + 'task_account', + 'task' + ); + + $dbPool->get()->con->prepare($query->toSql())->execute(); + } +} diff --git a/Admin/Update.php b/Admin/Update.php new file mode 100644 index 0000000..fcc9d39 --- /dev/null +++ b/Admin/Update.php @@ -0,0 +1,47 @@ + + * @author Dennis Eichhorn + * @copyright Dennis Eichhorn + * @license OMS License 1.0 + * @version 1.0.0 + * @link http://orange-management.com + */ +namespace Modules\Workflow\Admin; + + +use phpOMS\DataStorage\Database\DatabasePool; +use phpOMS\Module\InfoManager; +use phpOMS\Module\UpdateAbstract; +use phpOMS\System\File\Directory; + +/** + * Navigation class. + * + * @category Modules + * @package Modules\Admin + * @author OMS Development Team + * @author Dennis Eichhorn + * @license OMS License 1.0 + * @link http://orange-management.com + * @since 1.0.0 + */ +class Update extends UpdateAbstract +{ + + /** + * {@inheritdoc} + */ + public static function update(DatabasePool $dbPool, InfoManager $info) + { + Directory::deletePath(__DIR__ . '/Update'); + mkdir('Update'); + parent::update($dbPool, $info); + } +} diff --git a/Controller.php b/Controller.php new file mode 100644 index 0000000..012cea6 --- /dev/null +++ b/Controller.php @@ -0,0 +1,174 @@ + + * @author Dennis Eichhorn + * @copyright Dennis Eichhorn + * @license OMS License 1.0 + * @version 1.0.0 + * @link http://orange-management.com + */ +namespace Modules\Workflow; + +use phpOMS\Message\RequestAbstract; +use phpOMS\Message\ResponseAbstract; +use phpOMS\Module\ModuleAbstract; +use phpOMS\Module\WebInterface; +use phpOMS\Views\View; + +/** + * Task class. + * + * @category Modules + * @package Modules\Workflow + * @author OMS Development Team + * @author Dennis Eichhorn + * @license OMS License 1.0 + * @link http://orange-management.com + * @since 1.0.0 + */ +class Controller extends ModuleAbstract implements WebInterface +{ + + /** + * Module path. + * + * @var string + * @since 1.0.0 + */ + /* public */ const MODULE_PATH = __DIR__; + + /** + * Module version. + * + * @var string + * @since 1.0.0 + */ + /* public */ const MODULE_VERSION = '1.0.0'; + + /** + * Module name. + * + * @var string + * @since 1.0.0 + */ + /* public */ const MODULE_NAME = 'Workflow'; + + /** + * Providing. + * + * @var string + * @since 1.0.0 + */ + protected static $providing = []; + + /** + * Dependencies. + * + * @var string + * @since 1.0.0 + */ + protected static $dependencies = [ + ]; + + /** + * @param RequestAbstract $request Request + * @param ResponseAbstract $response Response + * @param mixed $data Generic data + * + * @return \Serializable + * + * @since 1.0.0 + * @author Dennis Eichhorn + */ + public function viewWorkflowTemplates(RequestAbstract $request, ResponseAbstract $response, $data = null) : \Serializable + { + $view = new View($this->app, $request, $response); + $view->setTemplate('/Modules/Workflow/Theme/Backend/workflow-template-list'); + $view->addData('nav', $this->app->moduleManager->get('Navigation')->createNavigationMid(1005501001, $request, $response)); + + return $view; + } + + /** + * @param RequestAbstract $request Request + * @param ResponseAbstract $response Response + * @param mixed $data Generic data + * + * @return \Serializable + * + * @since 1.0.0 + * @author Dennis Eichhorn + */ + public function viewWorkflowTemplate(RequestAbstract $request, ResponseAbstract $response, $data = null) : \Serializable + { + $view = new View($this->app, $request, $response); + $view->setTemplate('/Modules/Workflow/Theme/Backend/task-single'); + $view->addData('nav', $this->app->moduleManager->get('Navigation')->createNavigationMid(1005501001, $request, $response)); + + return $view; + } + + /** + * @param RequestAbstract $request Request + * @param ResponseAbstract $response Response + * @param mixed $data Generic data + * + * @return \Serializable + * + * @since 1.0.0 + * @author Dennis Eichhorn + */ + public function viewWorkflowSingle(RequestAbstract $request, ResponseAbstract $response, $data = null) : \Serializable + { + $view = new View($this->app, $request, $response); + $view->setTemplate('/Modules/Workflow/Theme/Backend/task-create'); + $view->addData('nav', $this->app->moduleManager->get('Navigation')->createNavigationMid(1005501001, $request, $response)); + + return $view; + } + + /** + * @param RequestAbstract $request Request + * @param ResponseAbstract $response Response + * @param mixed $data Generic data + * + * @return \Serializable + * + * @since 1.0.0 + * @author Dennis Eichhorn + */ + public function viewWorkflowTemplateCreate(RequestAbstract $request, ResponseAbstract $response, $data = null) : \Serializable + { + $view = new View($this->app, $request, $response); + $view->setTemplate('/Modules/Workflow/Theme/Backend/workflow-template-create'); + $view->addData('nav', $this->app->moduleManager->get('Navigation')->createNavigationMid(1005501001, $request, $response)); + + return $view; + } + + /** + * @param RequestAbstract $request Request + * @param ResponseAbstract $response Response + * @param mixed $data Generic data + * + * @return \Serializable + * + * @since 1.0.0 + * @author Dennis Eichhorn + */ + public function viewWorkflowDashboard(RequestAbstract $request, ResponseAbstract $response, $data = null) : \Serializable + { + $view = new View($this->app, $request, $response); + $view->setTemplate('/Modules/Workflow/Theme/Backend/workflow-dashboard'); + $view->addData('nav', $this->app->moduleManager->get('Navigation')->createNavigationMid(1005501001, $request, $response)); + + return $view; + } + +} diff --git a/Docs/workflow_components.md b/Docs/workflow_components.md new file mode 100644 index 0000000..2326e8e --- /dev/null +++ b/Docs/workflow_components.md @@ -0,0 +1,17 @@ +# Workflow Components + +Every workflow has to provide a set of components in order to work. Other files are optional but can be used in order to enhance the experience. Additional files may be provided for better templating or for additional models but are not a necessety. + +## Template + +The `template.tpl.php` file contains the UI of the workflow. + +## States + +A `States.php` file contains all workflow states. This is especially important in order to show different content inside of the `template.tpl.php` depending on the state or in order to trigger state depended actions. + +## Workflow + +The `Workflow.php` file is the heart of every workflow. This file is responsible for executing state driven actions and it can also be seen as the API for a workflow. All workflow related actions will be forwarded to this file and can be handled inside including database queries. + +## \ No newline at end of file diff --git a/Models/Template.php b/Models/Template.php new file mode 100644 index 0000000..4ddffdc --- /dev/null +++ b/Models/Template.php @@ -0,0 +1,34 @@ + + * @author Dennis Eichhorn + * @copyright Dennis Eichhorn + * @license OMS License 1.0 + * @version 1.0.0 + * @link http://orange-management.com + */ +namespace Modules\Workflow\Models; + + + +/** + * Task class. + * + * @category Modules + * @package Framework + * @author OMS Development Team + * @author Dennis Eichhorn + * @license OMS License 1.0 + * @link http://orange-management.com + * @since 1.0.0 + */ +class Template +{ + +} diff --git a/Models/WorkflowInterface.php b/Models/WorkflowInterface.php new file mode 100644 index 0000000..f93c698 --- /dev/null +++ b/Models/WorkflowInterface.php @@ -0,0 +1,32 @@ + + * @author Dennis Eichhorn + * @copyright Dennis Eichhorn + * @license OMS License 1.0 + * @version 1.0.0 + * @link http://orange-management.com + */ +namespace Modules\Workflow\Models; + +/** + * Task status enum. + * + * @category Workflow + * @package Modules + * @author OMS Development Team + * @author Dennis Eichhorn + * @license OMS License 1.0 + * @link http://orange-management.com + * @since 1.0.0 + */ +interface WorkflowInterface +{ + +} \ No newline at end of file diff --git a/Models/WorkflowStatus.php b/Models/WorkflowStatus.php new file mode 100644 index 0000000..7739c64 --- /dev/null +++ b/Models/WorkflowStatus.php @@ -0,0 +1,39 @@ + + * @author Dennis Eichhorn + * @copyright Dennis Eichhorn + * @license OMS License 1.0 + * @version 1.0.0 + * @link http://orange-management.com + */ +namespace Modules\Workflow\Models; + +use phpOMS\Datatypes\Enum; + +/** + * Task status enum. + * + * @category Workflow + * @package Modules + * @author OMS Development Team + * @author Dennis Eichhorn + * @license OMS License 1.0 + * @link http://orange-management.com + * @since 1.0.0 + */ +abstract class WorkflowStatus extends Enum +{ + /* public */ const OPEN = 1; + /* public */ const WORKING = 2; + /* public */ const SUSPENDED = 3; + /* public */ const CANCELED = 4; + /* public */ const DONE = 5; + /* public */ const CLOSED = 6; +} diff --git a/README.md b/README.md new file mode 100644 index 0000000..e69de29 diff --git a/Templates/Permission/PermissionStatus.php b/Templates/Permission/PermissionStatus.php new file mode 100644 index 0000000..9e9c539 --- /dev/null +++ b/Templates/Permission/PermissionStatus.php @@ -0,0 +1,36 @@ + + * @author Dennis Eichhorn + * @copyright Dennis Eichhorn + * @license OMS License 1.0 + * @version 1.0.0 + * @link http://orange-management.com + */ +namespace Modules\Workflow\Templates\Permission; + +use phpOMS\Datatypes\Enum; + +/** + * Task status enum. + * + * @category Tasks + * @package Modules + * @author OMS Development Team + * @author Dennis Eichhorn + * @license OMS License 1.0 + * @link http://orange-management.com + * @since 1.0.0 + */ +abstract class PermissionStatus extends Enum +{ + /* public */ const PENDING = 1; + /* public */ const APPROVED = 2; + /* public */ const DISMISSED = 3; +} diff --git a/Templates/Permission/States.php b/Templates/Permission/States.php new file mode 100644 index 0000000..ff06f5d --- /dev/null +++ b/Templates/Permission/States.php @@ -0,0 +1,37 @@ + + * @author Dennis Eichhorn + * @copyright Dennis Eichhorn + * @license OMS License 1.0 + * @version 1.0.0 + * @link http://orange-management.com + */ +namespace Modules\Workflow\Templates\Permission; + +use phpOMS\Datatypes\Enum; + +/** + * Task status enum. + * + * @category Tasks + * @package Modules + * @author OMS Development Team + * @author Dennis Eichhorn + * @license OMS License 1.0 + * @link http://orange-management.com + * @since 1.0.0 + */ +abstract class States extends Enum +{ + /* public */ const DEFAULT = 0; + /* public */ const PENDING = 1; + /* public */ const APPROVED = 2; + /* public */ const DISMISSED = 3; +} diff --git a/Templates/Permission/Workflow.php b/Templates/Permission/Workflow.php new file mode 100644 index 0000000..711fe42 --- /dev/null +++ b/Templates/Permission/Workflow.php @@ -0,0 +1,77 @@ + + * @author Dennis Eichhorn + * @copyright Dennis Eichhorn + * @license OMS License 1.0 + * @version 1.0.0 + * @link http://orange-management.com + */ +namespace Modules\Media; + +use Modules\Workflow\Models\WorkflowInterface; +use Modules\Workflow\Templates\Permission\States; +use phpOMS\DataStorage\Database\Connection\ConnectionAbstract; + +/** + * Media class. + * + * @category Modules + * @package Modules\Media + * @author OMS Development Team + * @author Dennis Eichhorn + * @license OMS License 1.0 + * @link http://orange-management.com + * @since 1.0.0 + */ +class Workflow implements WorkflowInterface +{ + private $id = 0; + private $state = 0; + private $con = null; + + public function __construct(ConnectionAbstract $con) + { + $this->con = $con; + } + + public function run($data) : int + { + switch ($this->state) { + case States::DEFAULT: + $this->state = $this->runRequest($data); + break; + case States::PENDING: + $this->state = $this->runPending($data); + break; + default: + + } + + return $this->state; + } + + public function runRequest($data) + { + // todo: create workflow + // todo: create task + // todo: set state + } + + public function runPending($data) + { + // todo: approve?! + // todo: + } + + public function getState() : int + { + return $this->state; + } +} \ No newline at end of file diff --git a/Templates/Permission/permission-info.tpl.php b/Templates/Permission/permission-info.tpl.php new file mode 100644 index 0000000..e69de29 diff --git a/Templates/Permission/template.tpl.php b/Templates/Permission/template.tpl.php new file mode 100644 index 0000000..e69de29 diff --git a/Theme/Backend/Lang/Navigation.en.lang.php b/Theme/Backend/Lang/Navigation.en.lang.php new file mode 100644 index 0000000..cf33391 --- /dev/null +++ b/Theme/Backend/Lang/Navigation.en.lang.php @@ -0,0 +1,22 @@ + + * @author Dennis Eichhorn + * @copyright Dennis Eichhorn + * @license OMS License 1.0 + * @version 1.0.0 + * @link http://orange-management.com + */ +return ['Navigation' => [ + 'Create' => 'Create', + 'Dashboard' => 'Dashboard', + 'Templates' => 'Templates', + 'Workflows' => 'Workflows', + 'Workflow' => 'Workflow', +]]; diff --git a/Theme/Backend/Lang/en.lang.php b/Theme/Backend/Lang/en.lang.php new file mode 100644 index 0000000..51449fe --- /dev/null +++ b/Theme/Backend/Lang/en.lang.php @@ -0,0 +1,24 @@ + + * @author Dennis Eichhorn + * @copyright Dennis Eichhorn + * @license OMS License 1.0 + * @version 1.0.0 + * @link http://orange-management.com + */ +return ['Workflow' => [ + 'Created' => 'Created', + 'Creator' => 'Creator', + 'Next' => 'Next', + 'Status' => 'Status', + 'Title' => 'Title', + 'Workflow' => 'Workflow', + 'Workflows' => 'Workflows', +]]; diff --git a/Theme/Backend/workflow-create.tpl.php b/Theme/Backend/workflow-create.tpl.php new file mode 100644 index 0000000..6b87196 --- /dev/null +++ b/Theme/Backend/workflow-create.tpl.php @@ -0,0 +1,60 @@ + + * @author Dennis Eichhorn + * @copyright Dennis Eichhorn + * @license OMS License 1.0 + * @version 1.0.0 + * @link http://orange-management.com + */ +/** + * @var \phpOMS\Views\View $this + */ +echo $this->getData('nav')->render(); ?> + +
+

getText('Task'); ?>

+ +
+
+ + +
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ +
+

getText('Media'); ?>

+ +
+
+ + +
+
+
+
+
+
+
+
+ + \ No newline at end of file diff --git a/Theme/Backend/workflow-dashboard.tpl.php b/Theme/Backend/workflow-dashboard.tpl.php new file mode 100644 index 0000000..ff6e97b --- /dev/null +++ b/Theme/Backend/workflow-dashboard.tpl.php @@ -0,0 +1,52 @@ + + * @author Dennis Eichhorn + * @copyright Dennis Eichhorn + * @license OMS License 1.0 + * @version 1.0.0 + * @link http://orange-management.com + */ +/** + * @var \phpOMS\Views\View $this + */ +$workflows = []; + +echo $this->getData('nav')->render(); ?> + +
+ + + + + + $workflow) : $c++; + $url = \phpOMS\Uri\UriFactory::build('/{/lang}/backend/task/single?{?}&id=' . $workflow->getId()); + $color = 'darkred'; + if($workflow->getStatus() === \Modules\Workflow\Models\WorkflowStatus::DONE) { $color = 'green'; } + elseif($workflow->getStatus() === \Modules\Workflow\Models\WorkflowStatus::OPEN) { $color = 'darkblue'; } + elseif($workflow->getStatus() === \Modules\Workflow\Models\WorkflowStatus::WORKING) { $color = 'purple'; } + elseif($workflow->getStatus() === \Modules\Workflow\Models\WorkflowStatus::CANCELED) { $color = 'red'; } + elseif($workflow->getStatus() === \Modules\Workflow\Models\WorkflowStatus::SUSPENDED) { $color = 'yellow'; } ;?> + +
getText('Workflow'); ?>
getText('Status'); ?> + getText('Next'); ?> + getText('Title'); ?> + getText('Creator'); ?> + getText('Created'); ?> +
getText('S' . $workflow->getStatus()); ?> + getDue()->format('Y-m-d H:i'); ?> + getTitle(); ?> + getCreatedBy(); ?> + getCreatedAt()->format('Y-m-d H:i'); ?> + +
getText('Empty', 0, 0); ?> + +
+
\ No newline at end of file diff --git a/Theme/Backend/workflow-single.tpl.php b/Theme/Backend/workflow-single.tpl.php new file mode 100644 index 0000000..ee35254 --- /dev/null +++ b/Theme/Backend/workflow-single.tpl.php @@ -0,0 +1,90 @@ + + * @author Dennis Eichhorn + * @copyright Dennis Eichhorn + * @license OMS License 1.0 + * @version 1.0.0 + * @link http://orange-management.com + */ +/** + * @var \phpOMS\Views\View $this + * @var \Modules\Tasks\Models\Task $task + */ +$task = $this->getData('task'); +$elements = $task->getTaskElements(); +$cElements = count($elements); + +echo $this->getData('nav')->render(); ?> + +
+

getTitle(); ?>

+
+
Due getDue()->format('Y-m-d H:i'); ?>
+
Created getCreatedAt()->format('Y-m-d H:i'); ?>
+
+ getDescription(); ?> +
+
Created getCreatedBy(); ?>
+
Status 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'; } ?> +
+
getText('S' . $element->getStatus()); ?>
+
getCreatedBy(); ?> - getCreatedAt()->format('Y-m-d H:i'); ?>
+
+ getDescription() !== '') : ?> +
+
+
+ getDescription(); ?> +
+
+
+ +
+ getStatus() !== \Modules\Tasks\Models\TaskStatus::CANCELED || + $element->getStatus() !== \Modules\Tasks\Models\TaskStatus::DONE || + $element->getStatus() !== \Modules\Tasks\Models\TaskStatus::SUSPENDED || $c != $cElements + ) : ?> +
Due getDue()->format('Y-m-d H:i'); ?>
+ + getForwarded() !== 0) : ?> +
Forwarded getForwarded(); ?>
+ +
+ + +
+
+
+ +
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Theme/Backend/workflow-template-create.tpl.php b/Theme/Backend/workflow-template-create.tpl.php new file mode 100644 index 0000000..9e3f926 --- /dev/null +++ b/Theme/Backend/workflow-template-create.tpl.php @@ -0,0 +1,19 @@ + + * @author Dennis Eichhorn + * @copyright Dennis Eichhorn + * @license OMS License 1.0 + * @version 1.0.0 + * @link http://orange-management.com + */ +/** + * @var \phpOMS\Views\View $this + */ +echo $this->getData('nav')->render(); ?> diff --git a/Theme/Backend/workflow-template-list.tpl.php b/Theme/Backend/workflow-template-list.tpl.php new file mode 100644 index 0000000..2404c47 --- /dev/null +++ b/Theme/Backend/workflow-template-list.tpl.php @@ -0,0 +1,22 @@ + + * @author Dennis Eichhorn + * @copyright Dennis Eichhorn + * @license OMS License 1.0 + * @version 1.0.0 + * @link http://orange-management.com + */ +/** + * @var \phpOMS\Views\View $this + * @var \Modules\Tasks\Models\Task[] $tasks + */ +$tasks = $this->getData('tasks'); +echo $this->getData('nav')->render(); ?> + diff --git a/img/module_teaser_small.png b/img/module_teaser_small.png new file mode 100644 index 0000000000000000000000000000000000000000..f56e6ff1a61ca4a08413260cacbe116605782baa GIT binary patch literal 49511 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