diff --git a/workflow/engine/classes/class.plugin.php b/workflow/engine/classes/class.plugin.php index 6bf6c57ff..b1d6ff200 100755 --- a/workflow/engine/classes/class.plugin.php +++ b/workflow/engine/classes/class.plugin.php @@ -379,16 +379,22 @@ class PMPlugin $oPluginRegistry =& PMPluginRegistry::getSingleton(); $oPluginRegistry->enableRestService($this->sNamespace, $enable); } - + /** - * With this function we can register new options to designer menu - * param string $menuOptionsFile + * Register designer menu file + * + * @param string $file Designer menu file + * * @return void */ - public function registerDesignerNewOption($menuOptionsFile) + public function registerDesignerMenu($file) { - $oPluginRegistry =& PMPluginRegistry::getSingleton(); - $oPluginRegistry->registerDesignerNewOption($this->sNamespace, $menuOptionsFile); + try { + $pluginRegistry = &PMPluginRegistry::getSingleton(); + $pluginRegistry->registerDesignerMenu($this->sNamespace, $file); + } catch (Exception $e) { + throw $e; + } } } @@ -730,20 +736,3 @@ class cronFile } } -class menuOptionFile -{ - public $namespace; - public $menuOptionFile; - - /** - * This function is the constructor of the cronFile class - * param string $namespace - * param string $menuOptionFile - * @return void - */ - public function __construct($namespace, $menuOptionFile) - { - $this->namespace = $namespace; - $this->menuOptionFile = $menuOptionFile; - } -} diff --git a/workflow/engine/classes/class.pluginRegistry.php b/workflow/engine/classes/class.pluginRegistry.php index eb1d956c8..f5d7e5544 100755 --- a/workflow/engine/classes/class.pluginRegistry.php +++ b/workflow/engine/classes/class.pluginRegistry.php @@ -101,7 +101,7 @@ class PMPluginRegistry private $_aTaskExtendedProperties = array (); private $_aDashboardPages = array (); private $_aCronFiles = array (); - private $_aDesignerMenuFiles = array (); + private $_arrayDesignerMenu = array(); /** * Registry a plugin javascript to include with js core at same runtime @@ -392,9 +392,10 @@ class PMPluginRegistry unset( $this->_aDashboardPages[$key] ); } } - foreach ($this->_aDesignerMenuFiles as $key => $detail) { - if ($detail->namespace == $sNamespace) { - unset( $this->_aDesignerMenuFiles[$key] ); + + foreach ($this->_arrayDesignerMenu as $key => $detail) { + if ($detail->pluginName == $sNamespace) { + unset($this->_arrayDesignerMenu[$key]); } } @@ -1607,35 +1608,51 @@ class PMPluginRegistry throw $e; } } - + /** - * Register new options to designer menu + * Register designer menu file * - * @param unknown_type $namespace - * @param unknown_type $cronFile + * @param string $pluginName Plugin name + * @param string $file Designer menu file + * + * @return void */ - public function registerDesignerNewOption ($namespace, $menuOptionFile) + public function registerDesignerMenu($pluginName, $file) { - $found = false; - foreach ($this->_aDesignerMenuFiles as $row => $detail) { - if ($menuOptionFile == $detail->menuOptionFile && $namespace == $detail->namespace) { - $detail->menuOptionFile = $menuOptionFile; - $found = true; + try { + $flagFound = false; + + foreach ($this->_arrayDesignerMenu as $value) { + if ($value->pluginName == $pluginName && $value->file == $file) { + $flagFound = true; + break; + } } - } - if (!$found) { - $menuOptionFile = new menuOptionFile( $namespace, $menuOptionFile ); - $this->_aDesignerMenuFiles[] = $menuOptionFile; + + if (!$flagFound) { + $obj = new stdClass(); + $obj->pluginName = $pluginName; + $obj->file = $file; + + $this->_arrayDesignerMenu[] = $obj; + } + } catch (Exception $e) { + throw $e; } } - + /** - * Return all designer menu Option files registered + * Return all designer menu files registered * * @return array */ - public function getDesignerNewOption() + public function getDesignerMenu() { - return $this->_aDesignerMenuFiles; + try { + return $this->_arrayDesignerMenu; + } catch (Exception $e) { + throw $e; + } } } + diff --git a/workflow/engine/classes/model/Process.php b/workflow/engine/classes/model/Process.php index e30e0ed97..79de01e3e 100755 --- a/workflow/engine/classes/model/Process.php +++ b/workflow/engine/classes/model/Process.php @@ -663,6 +663,7 @@ class Process extends BaseProcess $oCriteria->addSelectColumn( ProcessPeer::PRO_UID ); $oCriteria->addSelectColumn( ProcessPeer::PRO_PARENT ); $oCriteria->addSelectColumn( ProcessPeer::PRO_STATUS ); + $oCriteria->addSelectColumn(ProcessPeer::PRO_TYPE); $oCriteria->addSelectColumn( ProcessPeer::PRO_CATEGORY ); $oCriteria->addSelectColumn( ProcessPeer::PRO_UPDATE_DATE ); $oCriteria->addSelectColumn( ProcessPeer::PRO_CREATE_DATE ); @@ -732,7 +733,9 @@ class Process extends BaseProcess $uids = array (); while ($oDataset->next()) { $row = $oDataset->getRow(); - $row['PROJECT_TYPE'] = in_array($row['PRO_UID'], $bpmnProjects) ? 'bpmn' : 'classic'; + + $row["PROJECT_TYPE"] = ($row["PRO_TYPE"] == "NORMAL")? ((in_array($row["PRO_UID"], $bpmnProjects))? "bpmn" : "classic") : $row["PRO_TYPE"]; + $processes[] = $row; $uids[] = $processes[sizeof( $processes ) - 1]['PRO_UID']; } @@ -1020,7 +1023,7 @@ class Process extends BaseProcess public function isBpmnProcess($proUid){ $c = new Criteria("workflow"); $c->add(BpmnProcessPeer::PRJ_UID, $proUid); - $res = BpmnProcessPeer::doSelect($c); + $res = BpmnProcessPeer::doSelect($c); if( sizeof($res) == 0 ){ return 0; }else{ diff --git a/workflow/engine/methods/processes/mainInit.php b/workflow/engine/methods/processes/mainInit.php index 2084ac9a9..de1355300 100755 --- a/workflow/engine/methods/processes/mainInit.php +++ b/workflow/engine/methods/processes/mainInit.php @@ -29,102 +29,43 @@ $RBAC->requirePermissions( 'PM_FACTORY' ); G::loadClass( 'configuration' ); $conf = new Configurations(); -if (preg_match("/^([\d\.]+).*$/", System::getVersion(), $arrayMatch)) { - $pmVersion = $arrayMatch[1]; -} else { - $pmVersion = ""; //Branch master +$pmVersion = (preg_match("/^([\d\.]+).*$/", System::getVersion(), $arrayMatch))? $arrayMatch[1] : ""; //Otherwise: Branch master + +$arrayFlagImportFileExtension = array("pm", "pmx", "bpmn"); +$arrayFlagMenuNewOption = array("pm" => true, "bpmn" => true); + +if ($pmVersion != "") { + $arrayFlagImportFileExtension = (version_compare($pmVersion . "", "3", ">="))? $arrayFlagImportFileExtension : array("pm"); + $arrayFlagMenuNewOption = (version_compare($pmVersion . "", "3", ">="))? array("bpmn" => true) : array("pm" => true); } -$arrayImportFileExtension = array("pm", "pmx", "bpmn"); -$arrayMenuNewOption = array("pm" => true, "bpmn" => true); +$pluginRegistry = &PMPluginRegistry::getSingleton(); -/*options menu*/ -$arrayMenuNew = array(); +$arrayMenuNewOptionPlugin = array(); +$arrayContextMenuOptionPlugin = array(); -$mnuNewBpmnProject = new stdClass(); -$mnuNewBpmnProject->text = G::LoadTranslation("ID_NEW_BPMN_PROJECT"); -$mnuNewBpmnProject->iconCls = "silk-add"; -$mnuNewBpmnProject->icon = ""; -$mnuNewBpmnProject->newProcessType = 'newProcess({type:"bpmnProject",title:"'.$mnuNewBpmnProject->text.'"})'; +foreach ($pluginRegistry->getDesignerMenu() as $value) { + if (file_exists($value->file)) { + require_once($value->file); -$mnuNewProject = new stdClass(); -$mnuNewProject->text = G::LoadTranslation("ID_NEW_PROJECT"); -$mnuNewProject->iconCls = "silk-add"; -$mnuNewProject->icon = ""; -$mnuNewProject->newProcessType = 'newProcess({type:"classicProject",title:"'.$mnuNewProject->text.'"})'; + $className = "DesignerMenu" . $value->pluginName; -$menuOption = array("pm" => $mnuNewProject, "bpmn" => $mnuNewBpmnProject); + if (class_exists($className)) { + $obj = new $className(); -foreach($arrayMenuNewOption as $type => $val) { - if($val) { - array_push($arrayMenuNew, $menuOption[$type]); - } -} -/*right click menu*/ -$contexMenuRightClick = array( - (object)array( - "text" => G::LoadTranslation("ID_EDIT"), - "iconCls" => "button_menu_ext ss_sprite ss_pencil", - "handler" => "editProcess()" - ), - (object)array( - "id" => "activator2", - "text" => "", - "icon" => "", - "handler" => "activeDeactive()" - ), - (object)array( - "id" => "debug", - "text" => "", - "handler" => "enableDisableDebug()" - ), - (object)array( - "text" => G::LoadTranslation("ID_DELETE"), - "iconCls" => "button_menu_ext ss_sprite ss_cross", - "handler" => "deleteProcess()" - ), - (object)array( - "text" => G::LoadTranslation("ID_EXPORT"), - "icon" => "/images/export.png", - "handler" => "exportProcess()" - ), - (object)array( - "id" => "mnuGenerateBpmn", - "text" => G::LoadTranslation("ID_GENERATE_BPMN_PROJECT"), - "iconCls" => "button_menu_ext ss_sprite ss_page_white_go", - "hidden" => true, - "handler" => "generateBpmn()" - ) -); -/*end right click menu*/ -/*get registered options from plugin*/ -$oPluginRegistry =& PMPluginRegistry::getSingleton(); -$fromPlugin = $oPluginRegistry->getDesignerNewOption(); + if (method_exists($obj, "getDesignerMenu")) { + $arrayDesignerMenuData = $obj->getDesignerMenu(); -$jsFromPlugin = false; -foreach($fromPlugin as $menuOptionFile) { - $menuOptionsFromPlugin = include_once($menuOptionFile->menuOptionFile); - if(isset($menuOptionsFromPlugin)) { - if(is_array($menuOptionsFromPlugin) && sizeof($menuOptionsFromPlugin)) { - if(is_array($menuOptionsFromPlugin[0]) && sizeof($menuOptionsFromPlugin[0])) { - $arrayMenuNew = array_merge($arrayMenuNew,$menuOptionsFromPlugin[0]); - } - if(is_array($menuOptionsFromPlugin[1]) && sizeof($menuOptionsFromPlugin[1])) { - $contexMenuRightClick = array_merge($contexMenuRightClick,$menuOptionsFromPlugin[1]); - } - if(isset($menuOptionsFromPlugin[2])) { - if(file_exists(PATH_PLUGINS.implode("/",array_slice(explode("/",$menuOptionsFromPlugin[2]),2)))) { - $jsFromPlugin = $menuOptionsFromPlugin[2]; + if (isset($arrayDesignerMenuData["MENU_NEW_OPTION"]) && is_array($arrayDesignerMenuData["MENU_NEW_OPTION"])) { + $arrayMenuNewOptionPlugin = array_merge($arrayMenuNewOptionPlugin, $arrayDesignerMenuData["MENU_NEW_OPTION"]); + } + + if (isset($arrayDesignerMenuData["CONTEXT_MENU_OPTION"]) && is_array($arrayDesignerMenuData["CONTEXT_MENU_OPTION"])) { + $arrayContextMenuOptionPlugin = array_merge($arrayContextMenuOptionPlugin, $arrayDesignerMenuData["CONTEXT_MENU_OPTION"]); } } - } + } } -} -/*end get registered options from plugin*/ -/*end options menu*/ -if ($pmVersion != "") { - $arrayImportFileExtension = (version_compare($pmVersion . "", "3", ">="))? $arrayImportFileExtension : array("pm"); - $arrayMenuNewOption = (version_compare($pmVersion . "", "3", ">="))? array("bpmn" => true) : array("pm" => true); } $oHeadPublisher->addExtJsScript( 'processes/main', true ); //adding a javascript file .js @@ -133,11 +74,10 @@ $oHeadPublisher->addContent( 'processes/main' ); //adding a html file .html. $partnerFlag = (defined('PARTNER_FLAG')) ? PARTNER_FLAG : false; $oHeadPublisher->assign( 'PARTNER_FLAG', $partnerFlag ); $oHeadPublisher->assign( 'pageSize', $conf->getEnvSetting( 'casesListRowNumber' ) ); -$oHeadPublisher->assign("arrayImportFileExtension", $arrayImportFileExtension); -$oHeadPublisher->assign("arrayMenuNewOption", $arrayMenuNewOption); - -$oHeadPublisher->assign("arrayMenuNew", $arrayMenuNew); -$oHeadPublisher->assign("contexMenu", $contexMenuRightClick); -$oHeadPublisher->assign("jsFromPlugin", $jsFromPlugin); +$oHeadPublisher->assign("arrayFlagImportFileExtension", $arrayFlagImportFileExtension); +$oHeadPublisher->assign("arrayFlagMenuNewOption", $arrayFlagMenuNewOption); +$oHeadPublisher->assign("arrayMenuNewOptionPlugin", $arrayMenuNewOptionPlugin); +$oHeadPublisher->assign("arrayContextMenuOptionPlugin", $arrayContextMenuOptionPlugin); G::RenderPage( 'publish', 'extJs' ); + diff --git a/workflow/engine/templates/processes/main.js b/workflow/engine/templates/processes/main.js index 07b8524b9..1dc906eb5 100755 --- a/workflow/engine/templates/processes/main.js +++ b/workflow/engine/templates/processes/main.js @@ -6,7 +6,6 @@ var processesGrid; var store; var comboCategory; var winDesigner; -var typeMnuNew; var newTypeProcess; @@ -178,39 +177,71 @@ Ext.onReady(function(){ items:[_('ID_PAGE_SIZE')+':',comboPageSize] }) */ - for(var k=0;k 1) { + newTypeProcess = { + xtype: "tbsplit", + text: _("ID_NEW"), + iconCls: "button_menu_ext ss_sprite ss_add", + menu: arrayMenuNewOption, + listeners: { + "click": function (obj, e) + { + obj.showMenu(); + } + } + }; } else { - newTypeProcess = { - text: _('ID_NEW'), - iconCls: 'button_menu_ext ss_sprite ss_add', - handler: function (){ - newProcess({type: typeMnuNew}); - } - }; + newTypeProcess = { + text: _("ID_NEW"), + iconCls: "button_menu_ext ss_sprite ss_add", + handler: function () + { + newProcess({type: arrayMenuNewOption[0].pmTypeProject}); + } + }; } processesGrid = new Ext.grid.GridPanel( { @@ -439,9 +470,62 @@ Ext.onReady(function(){ messageContextMenu.showAt([coords[0], coords[1]]); } + var arrayContextMenuOption = [ + { + text: _("ID_EDIT"), + iconCls: "button_menu_ext ss_sprite ss_pencil", + handler: editProcess + }, + { + id: "activator2", + text: "", + icon: "", + handler: activeDeactive + }, + { + id: "debug", + text: "", + handler: enableDisableDebug + }, + { + text: _("ID_DELETE"), + iconCls: "button_menu_ext ss_sprite ss_cross", + handler: deleteProcess + }, + { + text: _("ID_EXPORT"), + icon: "/images/export.png", + handler: function () + { + exportProcess(); + } + }, + { + id: "mnuGenerateBpmn", + text: _("ID_GENERATE_BPMN_PROJECT"), + iconCls: "button_menu_ext ss_sprite ss_page_white_go", + hidden: true, + handler: function () + { + generateBpmn(); + } + } + ]; + + for (var i = 0; i <= arrayContextMenuOptionPlugin.length - 1; i++) { + try { + if (typeof(arrayContextMenuOptionPlugin[i].handler) != "undefined") { + eval("arrayContextMenuOptionPlugin[i].handler = " + arrayContextMenuOptionPlugin[i].handler + ";"); + } + + arrayContextMenuOption.push(arrayContextMenuOptionPlugin[i]); + } catch (e) { + } + } + var messageContextMenu = new Ext.menu.Menu({ - id: 'messageContextMenu', - items: contexMenu + id: "messageContextMenu", + items: arrayContextMenuOption }); var viewport = new Ext.Viewport({ @@ -459,10 +543,7 @@ function newProcess(params) params = typeof params == 'undefined' ? {type:'classicProject'} : params; // TODO this variable have hardcoded labels, it must be changed on the future - var formTitle = params.title; - if(typeof formTitle === "undefined") { - formTitle = params.type == "classicProject" ? _('ID_NEW_PROJECT') : _('ID_NEW_BPMN_PROJECT'); - } + var formTitle = (params.type == "classicProject")? _("ID_NEW_PROJECT") : _("ID_NEW_BPMN_PROJECT"); // window.location = 'processes_New'; var ProcessCategories = new Ext.form.ComboBox({ @@ -597,10 +678,6 @@ function doSearch(){ editProcess = function(typeParam) { - if(jsFromPlugin) { - pluginFunctions.onRowdblclick(); - } - var rowSelected = processesGrid.getSelectionModel().getSelected(); if (!rowSelected) { Ext.Msg.show({ @@ -615,20 +692,34 @@ editProcess = function(typeParam) }); return; } - var url, pro_uid = rowSelected.data.PRO_UID; - var type = rowSelected.data.PROJECT_TYPE; - if (typeParam == "bpmn" || typeParam == "classic") { - type = typeParam; - } + switch (rowSelected.data.PROJECT_TYPE) { + case "bpmn": + openWindowIfIE("../designer?prj_uid=" + rowSelected.data.PRO_UID); + break; + case "classic": + location.assign("processes_Map?PRO_UID=" + rowSelected.data.PRO_UID); + break; + default: + var fn = rowSelected.data.PROJECT_TYPE; + fn = fn.replace(/\s/g, "_"); + fn = fn.replace(/\-/g, "_"); + fn = fn + "DesignerGridRowDblClick"; - if (type == "bpmn") { - url = '../designer?prj_uid=' + pro_uid; - openWindowIfIE(url); - } else { - url = 'processes_Map?PRO_UID=' + pro_uid; - location.href = url; - } + eval("var flag = typeof(" + fn + ") == \"function\";"); + + if (flag) { + eval(fn + "(rowSelected.data);"); + } else { + Ext.MessageBox.show({ + title: _("ID_ERROR"), + msg: _("ID_DESIGNER_PROCESS_DESIGNER_IS_DISABLED"), + icon: Ext.MessageBox.ERROR, + buttons: Ext.MessageBox.OK + }); + } + break; + } } editNewProcess = function(){ @@ -1183,7 +1274,7 @@ importProcess = function() handler : function(){ var arrayMatch = []; - if ((arrayMatch = eval("/^.+\.(" + arrayImportFileExtension.join("|") + ")$/i").exec(Ext.getCmp("form-file").getValue()))) { + if ((arrayMatch = eval("/^.+\.(" + arrayFlagImportFileExtension.join("|") + ")$/i").exec(Ext.getCmp("form-file").getValue()))) { var fileExtension = arrayMatch[1]; switch (fileExtension) { @@ -1493,10 +1584,3 @@ function openWindowIfIE(pathDesigner) { location.href = pathDesigner; } -function injectScriptElement(url, onLoad, onError, scope) { - var script = document.createElement('script'); - script.type = 'text/javascript'; - script.src = url; - document.getElementsByTagName('head')[0].appendChild(script); - return script; -}