PM-3193 "Prepare integration of new Valeo simplified designer in process list" SOLVED

Issue:
    Prepare integration of new Valeo simplified designer in process list
Cause:
    Nuevo requerimiento de funciones
Solution:
    > Se a implementado "DESIGNER: New options in menu" para los plugins; para lo cual se define
      en el archivo principal del plugin, lo siguiente (ejemplo):
          public function setup()
          {   ...
              $this->registerDesignerMenu(PATH_PLUGINS . "DemoDesignerMenu/classes/DesignerMenuDemoDesignerMenu.php");
              ...
          }
      El archivo "DesignerMenuDemoDesignerMenu.php" es una clase donde se define las nuevas opciones
      para el "Menu New" y "Context Menu"
    > Se a implementado "DESIGNER: Edit process" para los plugins; en el listado de procesos (esto en DESIGNER)
      al hacer doble-click en un proceso, se inicia el modulo para la edicion del proceso, esto tambien
      puede ser customizado en el plugin, para lo cual se debera realizar lo siguiente:
          - Cambiar en la Base de Datos el valor del campo PROCESS.PRO_TYPE por un nuevo tipo:
                * Ejemplo: PRO_TYPE = 'CPF_STANDARD_TPL'
          - Registrar un archivo JavaScript para el plugin, esto se define en el archivo principal del
            plugin (ejemplo):
                public function setup()
                {   ...
                    $this->registerJavascript("processes/main", "DemoDesignerMenu/MyJavaScript.js");
                    ...
                }
          - En el archivo "MyJavaScript.js" se debe definir la siguiente funcion:
                function CPF_STANDARD_TPLDesignerGridRowDblClick(...)
                {   ...
                }
          - Ejemplos de "PROCESS.PRO_TYPE" y la funcion "DesignerGridRowDblClick":
                * Ejemplo: PRO_TYPE = 'CPF-STANDARD-TPL' => function CPF_STANDARD_TPLDesignerGridRowDblClick(...)
                * Ejemplo: PRO_TYPE = 'CPF STANDARD TPL' => function CPF_STANDARD_TPLDesignerGridRowDblClick(...)
    > Se adjunta el plugin "DemoDesignerMenu-1.tar" como ejmplo
This commit is contained in:
Victor Saisa Lopez
2015-09-21 10:18:44 -04:00
parent 2f641e76cd
commit e6ddb81319
5 changed files with 231 additions and 198 deletions

View File

@@ -381,14 +381,20 @@ class PMPlugin
} }
/** /**
* With this function we can register new options to designer menu * Register designer menu file
* param string $menuOptionsFile *
* @param string $file Designer menu file
*
* @return void * @return void
*/ */
public function registerDesignerNewOption($menuOptionsFile) public function registerDesignerMenu($file)
{ {
$oPluginRegistry =& PMPluginRegistry::getSingleton(); try {
$oPluginRegistry->registerDesignerNewOption($this->sNamespace, $menuOptionsFile); $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;
}
}

View File

@@ -101,7 +101,7 @@ class PMPluginRegistry
private $_aTaskExtendedProperties = array (); private $_aTaskExtendedProperties = array ();
private $_aDashboardPages = array (); private $_aDashboardPages = array ();
private $_aCronFiles = array (); private $_aCronFiles = array ();
private $_aDesignerMenuFiles = array (); private $_arrayDesignerMenu = array();
/** /**
* Registry a plugin javascript to include with js core at same runtime * Registry a plugin javascript to include with js core at same runtime
@@ -392,9 +392,10 @@ class PMPluginRegistry
unset( $this->_aDashboardPages[$key] ); unset( $this->_aDashboardPages[$key] );
} }
} }
foreach ($this->_aDesignerMenuFiles as $key => $detail) {
if ($detail->namespace == $sNamespace) { foreach ($this->_arrayDesignerMenu as $key => $detail) {
unset( $this->_aDesignerMenuFiles[$key] ); if ($detail->pluginName == $sNamespace) {
unset($this->_arrayDesignerMenu[$key]);
} }
} }
@@ -1609,33 +1610,49 @@ class PMPluginRegistry
} }
/** /**
* Register new options to designer menu * Register designer menu file
* *
* @param unknown_type $namespace * @param string $pluginName Plugin name
* @param unknown_type $cronFile * @param string $file Designer menu file
*
* @return void
*/ */
public function registerDesignerNewOption ($namespace, $menuOptionFile) public function registerDesignerMenu($pluginName, $file)
{ {
$found = false; try {
foreach ($this->_aDesignerMenuFiles as $row => $detail) { $flagFound = false;
if ($menuOptionFile == $detail->menuOptionFile && $namespace == $detail->namespace) {
$detail->menuOptionFile = $menuOptionFile; foreach ($this->_arrayDesignerMenu as $value) {
$found = true; if ($value->pluginName == $pluginName && $value->file == $file) {
$flagFound = true;
break;
} }
} }
if (!$found) {
$menuOptionFile = new menuOptionFile( $namespace, $menuOptionFile ); if (!$flagFound) {
$this->_aDesignerMenuFiles[] = $menuOptionFile; $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 * @return array
*/ */
public function getDesignerNewOption() public function getDesignerMenu()
{ {
return $this->_aDesignerMenuFiles; try {
return $this->_arrayDesignerMenu;
} catch (Exception $e) {
throw $e;
} }
} }
}

View File

@@ -663,6 +663,7 @@ class Process extends BaseProcess
$oCriteria->addSelectColumn( ProcessPeer::PRO_UID ); $oCriteria->addSelectColumn( ProcessPeer::PRO_UID );
$oCriteria->addSelectColumn( ProcessPeer::PRO_PARENT ); $oCriteria->addSelectColumn( ProcessPeer::PRO_PARENT );
$oCriteria->addSelectColumn( ProcessPeer::PRO_STATUS ); $oCriteria->addSelectColumn( ProcessPeer::PRO_STATUS );
$oCriteria->addSelectColumn(ProcessPeer::PRO_TYPE);
$oCriteria->addSelectColumn( ProcessPeer::PRO_CATEGORY ); $oCriteria->addSelectColumn( ProcessPeer::PRO_CATEGORY );
$oCriteria->addSelectColumn( ProcessPeer::PRO_UPDATE_DATE ); $oCriteria->addSelectColumn( ProcessPeer::PRO_UPDATE_DATE );
$oCriteria->addSelectColumn( ProcessPeer::PRO_CREATE_DATE ); $oCriteria->addSelectColumn( ProcessPeer::PRO_CREATE_DATE );
@@ -732,7 +733,9 @@ class Process extends BaseProcess
$uids = array (); $uids = array ();
while ($oDataset->next()) { while ($oDataset->next()) {
$row = $oDataset->getRow(); $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; $processes[] = $row;
$uids[] = $processes[sizeof( $processes ) - 1]['PRO_UID']; $uids[] = $processes[sizeof( $processes ) - 1]['PRO_UID'];
} }

View File

@@ -29,102 +29,43 @@ $RBAC->requirePermissions( 'PM_FACTORY' );
G::loadClass( 'configuration' ); G::loadClass( 'configuration' );
$conf = new Configurations(); $conf = new Configurations();
if (preg_match("/^([\d\.]+).*$/", System::getVersion(), $arrayMatch)) { $pmVersion = (preg_match("/^([\d\.]+).*$/", System::getVersion(), $arrayMatch))? $arrayMatch[1] : ""; //Otherwise: Branch master
$pmVersion = $arrayMatch[1];
} else {
$pmVersion = ""; //Branch master
}
$arrayImportFileExtension = array("pm", "pmx", "bpmn"); $arrayFlagImportFileExtension = array("pm", "pmx", "bpmn");
$arrayMenuNewOption = array("pm" => true, "bpmn" => true); $arrayFlagMenuNewOption = array("pm" => true, "bpmn" => true);
/*options menu*/
$arrayMenuNew = 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.'"})';
$mnuNewProject = new stdClass();
$mnuNewProject->text = G::LoadTranslation("ID_NEW_PROJECT");
$mnuNewProject->iconCls = "silk-add";
$mnuNewProject->icon = "";
$mnuNewProject->newProcessType = 'newProcess({type:"classicProject",title:"'.$mnuNewProject->text.'"})';
$menuOption = array("pm" => $mnuNewProject, "bpmn" => $mnuNewBpmnProject);
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();
$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];
}
}
}
}
}
/*end get registered options from plugin*/
/*end options menu*/
if ($pmVersion != "") { if ($pmVersion != "") {
$arrayImportFileExtension = (version_compare($pmVersion . "", "3", ">="))? $arrayImportFileExtension : array("pm"); $arrayFlagImportFileExtension = (version_compare($pmVersion . "", "3", ">="))? $arrayFlagImportFileExtension : array("pm");
$arrayMenuNewOption = (version_compare($pmVersion . "", "3", ">="))? array("bpmn" => true) : array("pm" => true); $arrayFlagMenuNewOption = (version_compare($pmVersion . "", "3", ">="))? array("bpmn" => true) : array("pm" => true);
}
$pluginRegistry = &PMPluginRegistry::getSingleton();
$arrayMenuNewOptionPlugin = array();
$arrayContextMenuOptionPlugin = array();
foreach ($pluginRegistry->getDesignerMenu() as $value) {
if (file_exists($value->file)) {
require_once($value->file);
$className = "DesignerMenu" . $value->pluginName;
if (class_exists($className)) {
$obj = new $className();
if (method_exists($obj, "getDesignerMenu")) {
$arrayDesignerMenuData = $obj->getDesignerMenu();
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"]);
}
}
}
}
} }
$oHeadPublisher->addExtJsScript( 'processes/main', true ); //adding a javascript file .js $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; $partnerFlag = (defined('PARTNER_FLAG')) ? PARTNER_FLAG : false;
$oHeadPublisher->assign( 'PARTNER_FLAG', $partnerFlag ); $oHeadPublisher->assign( 'PARTNER_FLAG', $partnerFlag );
$oHeadPublisher->assign( 'pageSize', $conf->getEnvSetting( 'casesListRowNumber' ) ); $oHeadPublisher->assign( 'pageSize', $conf->getEnvSetting( 'casesListRowNumber' ) );
$oHeadPublisher->assign("arrayImportFileExtension", $arrayImportFileExtension); $oHeadPublisher->assign("arrayFlagImportFileExtension", $arrayFlagImportFileExtension);
$oHeadPublisher->assign("arrayMenuNewOption", $arrayMenuNewOption); $oHeadPublisher->assign("arrayFlagMenuNewOption", $arrayFlagMenuNewOption);
$oHeadPublisher->assign("arrayMenuNewOptionPlugin", $arrayMenuNewOptionPlugin);
$oHeadPublisher->assign("arrayMenuNew", $arrayMenuNew); $oHeadPublisher->assign("arrayContextMenuOptionPlugin", $arrayContextMenuOptionPlugin);
$oHeadPublisher->assign("contexMenu", $contexMenuRightClick);
$oHeadPublisher->assign("jsFromPlugin", $jsFromPlugin);
G::RenderPage( 'publish', 'extJs' ); G::RenderPage( 'publish', 'extJs' );

View File

@@ -6,7 +6,6 @@ var processesGrid;
var store; var store;
var comboCategory; var comboCategory;
var winDesigner; var winDesigner;
var typeMnuNew;
var newTypeProcess; var newTypeProcess;
@@ -178,37 +177,69 @@ Ext.onReady(function(){
items:[_('ID_PAGE_SIZE')+':',comboPageSize] items:[_('ID_PAGE_SIZE')+':',comboPageSize]
}) */ }) */
for(var k=0;k<arrayMenuNew.length;k++) { var mnuNewBpmnProject = {
var handlerMenu = arrayMenuNew[k].handler; text: _("ID_NEW_BPMN_PROJECT"),
arrayMenuNew[k].handler = new Function(handlerMenu) iconCls: "silk-add",
icon: "",
pmTypeProject: "bpmnProject",
handler: function ()
{
newProcess({type:"bpmnProject"});
} }
for(var j=0;j<contexMenu.length;j++) { };
var handlerMenu = contexMenu[j].handler;
contexMenu[j].handler = new Function(handlerMenu) var mnuNewProject = {
text: _("ID_NEW_PROJECT"),
iconCls: "silk-add",
icon: "",
pmTypeProject: "classicProject",
handler: function ()
{
newProcess({type: "classicProject"});
}
};
var arrayMenuNewOption = [];
if (typeof(arrayFlagMenuNewOption["bpmn"]) != "undefined") {
arrayMenuNewOption.push(mnuNewBpmnProject);
} }
if(jsFromPlugin) { if (typeof(arrayFlagMenuNewOption["pm"]) != "undefined") {
injectScriptElement(jsFromPlugin); arrayMenuNewOption.push(mnuNewProject);
} }
if(typeof(arrayMenuNewOption["bpmn"]) != "undefined" && typeof(arrayMenuNewOption["pm"]) != "undefined"){ for (var i = 0; i <= arrayMenuNewOptionPlugin.length - 1; i++) {
try {
if (typeof(arrayMenuNewOptionPlugin[i].handler) != "undefined") {
eval("arrayMenuNewOptionPlugin[i].handler = " + arrayMenuNewOptionPlugin[i].handler + ";");
}
arrayMenuNewOption.push(arrayMenuNewOptionPlugin[i]);
} catch (e) {
}
}
if (arrayMenuNewOption.length > 1) {
newTypeProcess = { newTypeProcess = {
xtype: 'tbsplit', xtype: "tbsplit",
text: _('ID_NEW'), text: _("ID_NEW"),
iconCls: 'button_menu_ext ss_sprite ss_add', iconCls: "button_menu_ext ss_sprite ss_add",
menu: arrayMenuNew, menu: arrayMenuNewOption,
listeners: { listeners: {
"click": function (obj, e) { "click": function (obj, e)
{
obj.showMenu(); obj.showMenu();
} }
} }
}; };
} else { } else {
newTypeProcess = { newTypeProcess = {
text: _('ID_NEW'), text: _("ID_NEW"),
iconCls: 'button_menu_ext ss_sprite ss_add', iconCls: "button_menu_ext ss_sprite ss_add",
handler: function (){ handler: function ()
newProcess({type: typeMnuNew}); {
newProcess({type: arrayMenuNewOption[0].pmTypeProject});
} }
}; };
} }
@@ -439,9 +470,62 @@ Ext.onReady(function(){
messageContextMenu.showAt([coords[0], coords[1]]); 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({ var messageContextMenu = new Ext.menu.Menu({
id: 'messageContextMenu', id: "messageContextMenu",
items: contexMenu items: arrayContextMenuOption
}); });
var viewport = new Ext.Viewport({ var viewport = new Ext.Viewport({
@@ -459,10 +543,7 @@ function newProcess(params)
params = typeof params == 'undefined' ? {type:'classicProject'} : params; params = typeof params == 'undefined' ? {type:'classicProject'} : params;
// TODO this variable have hardcoded labels, it must be changed on the future // TODO this variable have hardcoded labels, it must be changed on the future
var formTitle = params.title; var formTitle = (params.type == "classicProject")? _("ID_NEW_PROJECT") : _("ID_NEW_BPMN_PROJECT");
if(typeof formTitle === "undefined") {
formTitle = params.type == "classicProject" ? _('ID_NEW_PROJECT') : _('ID_NEW_BPMN_PROJECT');
}
// window.location = 'processes_New'; // window.location = 'processes_New';
var ProcessCategories = new Ext.form.ComboBox({ var ProcessCategories = new Ext.form.ComboBox({
@@ -597,10 +678,6 @@ function doSearch(){
editProcess = function(typeParam) editProcess = function(typeParam)
{ {
if(jsFromPlugin) {
pluginFunctions.onRowdblclick();
}
var rowSelected = processesGrid.getSelectionModel().getSelected(); var rowSelected = processesGrid.getSelectionModel().getSelected();
if (!rowSelected) { if (!rowSelected) {
Ext.Msg.show({ Ext.Msg.show({
@@ -615,19 +692,33 @@ editProcess = function(typeParam)
}); });
return; return;
} }
var url, pro_uid = rowSelected.data.PRO_UID;
var type = rowSelected.data.PROJECT_TYPE;
if (typeParam == "bpmn" || typeParam == "classic") { switch (rowSelected.data.PROJECT_TYPE) {
type = typeParam; 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") { eval("var flag = typeof(" + fn + ") == \"function\";");
url = '../designer?prj_uid=' + pro_uid;
openWindowIfIE(url); if (flag) {
eval(fn + "(rowSelected.data);");
} else { } else {
url = 'processes_Map?PRO_UID=' + pro_uid; Ext.MessageBox.show({
location.href = url; title: _("ID_ERROR"),
msg: _("ID_DESIGNER_PROCESS_DESIGNER_IS_DISABLED"),
icon: Ext.MessageBox.ERROR,
buttons: Ext.MessageBox.OK
});
}
break;
} }
} }
@@ -1183,7 +1274,7 @@ importProcess = function()
handler : function(){ handler : function(){
var arrayMatch = []; 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]; var fileExtension = arrayMatch[1];
switch (fileExtension) { switch (fileExtension) {
@@ -1493,10 +1584,3 @@ function openWindowIfIE(pathDesigner) {
location.href = 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;
}