From 120f7fce14ae6adeeeaff391d4782176d4bc4bfa Mon Sep 17 00:00:00 2001 From: Erik Date: Mon, 20 Apr 2015 15:37:36 -0500 Subject: [PATCH 01/20] main changes to enable register rest api endpoints from plugins 1. Enable rest api registering feature on main plugin file i.e, if I have a plugin named "erik", so we have a file named workflow/engine/plugins/erik.php and a folder workflow/engine/plugins/erik/ - inside of setup method of plugin main class set: $this->enableRestService(true); ---- file: erik.php ---- class erikPlugin extends PMPlugin { ... public function setup() { $this->registerMenu("processmaker", "menuerik.php"); ... $this->enableRestService(true); // <- this line enable Rest Service dispatching feature } ... 2. Create a folder: workflow/engine/plugins/erik/src/Services/Api/ $ mkdir -p workflow/engine/plugins/erik/src/Services/Api/ 3. Create a Restler class inside the folder created above i.e. creating a Hello class. ---- file: workflow/engine/plugins/erik/src/Services/Api/Hello.php ----- 'Hello world' ); return $hello; } catch (\Exception $e) { throw new RestException(Api::STAT_APP_EXCEPTION, $e->getMessage()); } } } ---------- end file --------- 4. Disable and enable the plugin named "erik" on ProcessMaker Admin Interface 5. Use the Rest Api defined inside the plugin you can access from a url something like that: format: http:///api/1.0//plugin-/hello/world i.e. http://processmaker/api/1.0/workflow/plugin-erik/hello/world Note.- to access this url that has the protected attribute into the class you need provide the access token into request header. --- framework/src/Maveriks/WebApplication.php | 81 +++++++++++-------- .../engine/classes/class.pluginRegistry.php | 9 ++- 2 files changed, 54 insertions(+), 36 deletions(-) diff --git a/framework/src/Maveriks/WebApplication.php b/framework/src/Maveriks/WebApplication.php index 058645a21..97f33be63 100644 --- a/framework/src/Maveriks/WebApplication.php +++ b/framework/src/Maveriks/WebApplication.php @@ -210,7 +210,7 @@ class WebApplication */ public function dispatchApiRequest($uri, $version = "1.0", $multipart = false, $inputExecute = '') { - $this->initRest($uri, "1.0", $multipart); + $uri = $this->initRest($uri, "1.0", $multipart); // to handle a request with "OPTIONS" method if ($_SERVER['REQUEST_METHOD'] === 'OPTIONS') { @@ -328,50 +328,60 @@ class WebApplication // Override $_SERVER['REQUEST_URI'] to Restler handles the modified url - if (! $isPluginRequest) { // if it is not a request for a plugin endpoint - // scan all api directory to find api classes - $classesList = Util\Common::rglob($apiDir . "/*"); + // scan all api directory to find api classes + $classesList = Util\Common::rglob($apiDir . "/*"); - foreach ($classesList as $classFile) { - if (pathinfo($classFile, PATHINFO_EXTENSION) === 'php') { - $relClassPath = str_replace('.php', '', str_replace($servicesDir, '', $classFile)); - $namespace = '\\ProcessMaker\\Services\\' . str_replace(DS, '\\', $relClassPath); - $namespace = strpos($namespace, "//") === false? $namespace: str_replace("//", '', $namespace); + foreach ($classesList as $classFile) { + if (pathinfo($classFile, PATHINFO_EXTENSION) === 'php') { + $relClassPath = str_replace('.php', '', str_replace($servicesDir, '', $classFile)); + $namespace = '\\ProcessMaker\\Services\\' . str_replace(DS, '\\', $relClassPath); + $namespace = strpos($namespace, "//") === false? $namespace: str_replace("//", '', $namespace); - //if (! class_exists($namespace)) { - require_once $classFile; - //} + //if (! class_exists($namespace)) { + require_once $classFile; + //} - $this->rest->addAPIClass($namespace); + $this->rest->addAPIClass($namespace); + } + } + // adding aliases for Restler + if (array_key_exists('alias', $config)) { + foreach ($config['alias'] as $alias => $aliasData) { + if (is_array($aliasData)) { + foreach ($aliasData as $label => $namespace) { + $namespace = '\\' . ltrim($namespace, '\\'); + $this->rest->addAPIClass($namespace, $alias); + } } } - // adding aliases for Restler - if (array_key_exists('alias', $config)) { - foreach ($config['alias'] as $alias => $aliasData) { - if (is_array($aliasData)) { - foreach ($aliasData as $label => $namespace) { - $namespace = '\\' . ltrim($namespace, '\\'); - $this->rest->addAPIClass($namespace, $alias); + } + + //if (! $isPluginRequest) { // if it is not a request for a plugin endpoint + // hook to get rest api classes from plugins + if (class_exists('PMPluginRegistry')) { + $pluginRegistry = \PMPluginRegistry::loadSingleton(PATH_DATA_SITE . 'plugin.singleton'); + $plugins = $pluginRegistry->getRegisteredRestServices(); + + if (! empty($plugins)) { + $pluginSourceDir = PATH_PLUGINS . $pluginName . DIRECTORY_SEPARATOR . 'src'; + + $loader = \Maveriks\Util\ClassLoader::getInstance(); + $loader->add($pluginSourceDir); + + if (is_array($plugins) && array_key_exists($pluginName, $plugins)) { + foreach ($plugins[$pluginName] as $class) { + if (class_exists($class['namespace'])) { + $this->rest->addAPIClass($class['namespace']); } } } } - } else { - // hook to get rest api classes from plugins -// if (class_exists('PMPluginRegistry')) { -// $pluginRegistry = & PMPluginRegistry::getSingleton(); -// $plugins = $pluginRegistry->getRegisteredRestServices(); -// -// if (is_array($plugins) && array_key_exists($pluginName, $plugins)) { -// foreach ($plugins[$pluginName] as $class) { -// $rest->addAPIClass($class['namespace']); -// } -// } -// } } Services\OAuth2\Server::setWorkspace(SYS_SYS); $this->rest->addAPIClass('\ProcessMaker\\Services\\OAuth2\\Server', 'oauth2'); + + return $uri; } public function parseApiRequestUri() @@ -580,5 +590,10 @@ class WebApplication throw $e; } } -} + public static function purgeRestApiCache($workspace) + { + @unlink(PATH_DATA . 'compiled' . DS . 'routes.php'); + @unlink(PATH_DATA . 'sites' . DS . $workspace . DS . 'api-config.php'); + } +} diff --git a/workflow/engine/classes/class.pluginRegistry.php b/workflow/engine/classes/class.pluginRegistry.php index 611ae1ed5..e6a24a476 100755 --- a/workflow/engine/classes/class.pluginRegistry.php +++ b/workflow/engine/classes/class.pluginRegistry.php @@ -277,12 +277,15 @@ class PMPluginRegistry $pluginSrcDir = PATH_PLUGINS . $detail->sNamespace . PATH_SEP . 'src'; if (is_dir($pluginSrcDir)) { - Bootstrap::registerDir($detail->sNamespace.'/src', $pluginSrcDir); + //Bootstrap::registerDir($detail->sNamespace.'/src', $pluginSrcDir); + $loader = \Maveriks\Util\ClassLoader::getInstance(); + $loader->add($pluginSrcDir); } if (array_key_exists($detail->sNamespace, $this->_restServiceEnabled) && $this->_restServiceEnabled[$detail->sNamespace] == true ) { + $oPlugin->registerRestService(); } @@ -1400,7 +1403,6 @@ class PMPluginRegistry foreach ($classesList as $classFile) { if (pathinfo($classFile, PATHINFO_EXTENSION) === 'php') { - $ns = str_replace( DIRECTORY_SEPARATOR, '\\', @@ -1413,6 +1415,8 @@ class PMPluginRegistry "filepath" => $classFile, "namespace" => $ns ); + + \Maveriks\WebApplication::purgeRestApiCache(basename(PATH_DATA_SITE)); } } } @@ -1601,4 +1605,3 @@ class PMPluginRegistry } } } - From c4c55e09164a5e96eb7dcfdd4d3163f53e0fa3b0 Mon Sep 17 00:00:00 2001 From: "Paula V. Quispe" Date: Wed, 22 Apr 2015 12:22:34 -0400 Subject: [PATCH 02/20] PM-2347: Problemas con el FROM del ACTION BY EMAIL --- workflow/engine/classes/model/AppDelegation.php | 1 + 1 file changed, 1 insertion(+) diff --git a/workflow/engine/classes/model/AppDelegation.php b/workflow/engine/classes/model/AppDelegation.php index 388d48542..90d2873e4 100755 --- a/workflow/engine/classes/model/AppDelegation.php +++ b/workflow/engine/classes/model/AppDelegation.php @@ -177,6 +177,7 @@ class AppDelegation extends BaseAppDelegation $data->APP_UID = $sAppUid; $data->DEL_INDEX = $delIndex; $data->USR_UID = $sUsrUid; + $data->PREVIOUS_USR_UID = $delPreviusUsrUid; $oPluginRegistry = &PMPluginRegistry::getSingleton(); $oPluginRegistry->executeTriggers(PM_CREATE_NEW_DELEGATION, $data); From 4f3f5f097b753d75f4af07d27652e2a7f6b1bbfe Mon Sep 17 00:00:00 2001 From: "Paula V. Quispe" Date: Wed, 22 Apr 2015 12:31:40 -0400 Subject: [PATCH 03/20] PM-2347: Problemas con el FROM del ACTION BY EMAIL in plugin --- workflow/engine/classes/class.actionsByEmail.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/workflow/engine/classes/class.actionsByEmail.php b/workflow/engine/classes/class.actionsByEmail.php index 9f376a006..18cd1e53b 100644 --- a/workflow/engine/classes/class.actionsByEmail.php +++ b/workflow/engine/classes/class.actionsByEmail.php @@ -193,7 +193,7 @@ class actionsByEmailClass extends PMPlugin G::LoadClass("Users"); $user = new Users(); - $userDetails = $user->loadDetails($data->USR_UID); + $userDetails = $user->loadDetails($data->PREVIOUS_USR_UID); $emailFrom = $userDetails["USR_EMAIL"]; G::LoadClass('wsBase'); From 24fb4637457c3496c0dccb6cafc6c941383dfa91 Mon Sep 17 00:00:00 2001 From: "Paula V. Quispe" Date: Wed, 22 Apr 2015 12:55:59 -0400 Subject: [PATCH 04/20] I corrected --- workflow/engine/classes/class.actionsByEmail.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/workflow/engine/classes/class.actionsByEmail.php b/workflow/engine/classes/class.actionsByEmail.php index 18cd1e53b..9f376a006 100644 --- a/workflow/engine/classes/class.actionsByEmail.php +++ b/workflow/engine/classes/class.actionsByEmail.php @@ -193,7 +193,7 @@ class actionsByEmailClass extends PMPlugin G::LoadClass("Users"); $user = new Users(); - $userDetails = $user->loadDetails($data->PREVIOUS_USR_UID); + $userDetails = $user->loadDetails($data->USR_UID); $emailFrom = $userDetails["USR_EMAIL"]; G::LoadClass('wsBase'); From 1e2e5a7e0a085067371fd763fe016ef4665d6414 Mon Sep 17 00:00:00 2001 From: dheeyi Date: Wed, 22 Apr 2015 17:54:58 -0400 Subject: [PATCH 05/20] =?UTF-8?q?PM-1879=200015808:=20Incorrect=20messages?= =?UTF-8?q?=20handling=20and/or=20actions=20when=20the=20user's=20session?= =?UTF-8?q?=20expires=20in=20the=20DESIGNER=20module=200016086:=20Informat?= =?UTF-8?q?ion=20of=20templates=20lost.=20Causa=20:=20Esto=20fue=20debido?= =?UTF-8?q?=20a=20que=20no=20se=20tenia=20una=20validacion=20de=20perdida?= =?UTF-8?q?=20de=20session.=20Soluci=C3=B3=20Aplica=20a=20secci=C3=B3roces?= =?UTF-8?q?s=20Files=20Manager)=20=20para=20el=20antiguo=20dise=C3=B1r,=20?= =?UTF-8?q?a=20la=20cual=20se=20considera=20todos=20los=20posibles=20casos?= =?UTF-8?q?=20de=20perdida=20de=20session=20haciendo=20una=20validaci?= =?UTF-8?q?=C3=B3ara=20todo=20estas=20situaciones.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../methods/processes/processes_Ajax.php | 7 + .../processes/processes_FilesOptions.xml | 331 +++++++++++++----- 2 files changed, 246 insertions(+), 92 deletions(-) diff --git a/workflow/engine/methods/processes/processes_Ajax.php b/workflow/engine/methods/processes/processes_Ajax.php index 484d8fbe2..17a4ab221 100755 --- a/workflow/engine/methods/processes/processes_Ajax.php +++ b/workflow/engine/methods/processes/processes_Ajax.php @@ -789,6 +789,13 @@ try { echo 'saved: ' . $sDirectory; } break; + case 'getSessid': + if(isset($_SESSION['USER_LOGGED'])){ + echo Bootstrap::json_encode(1); + }else{ + echo Bootstrap::json_encode(0); + } + break; case 'events': $oProcessMap->eventsList($oData->pro_uid, $oData->type); break; diff --git a/workflow/engine/xmlform/processes/processes_FilesOptions.xml b/workflow/engine/xmlform/processes/processes_FilesOptions.xml index 5fdfe43a5..859470d68 100755 --- a/workflow/engine/xmlform/processes/processes_FilesOptions.xml +++ b/workflow/engine/xmlform/processes/processes_FilesOptions.xml @@ -16,64 +16,185 @@ var CURRENT_MAIN_DIRECTORY; var CURRENT_CURRENT_DIRECTORY; var oUploadFilesPanel; var oUploadFilesPanel; +var showPromptLogin = function(lastAction) { + lastActionPerformed = lastAction; + promptPanel = new leimnud.module.panel(); + promptPanel.options={ + statusBarButtons:[{value: _('LOGIN')}], + position:{center:true}, + size:{w:370,h:160}, + control:{ + close:false, + resize:false + }, + fx:{ + modal:true + } + }; + promptPanel.setStyle={ + content:{ + padding:10, + paddingBottom:2, + textAlign:'left', + paddingLeft:24, + backgroundRepeat:'no-repeat', + backgroundPosition:'10 50%', + backgroundColor:'transparent', + borderWidth:0 + } + }; + promptPanel.make(); + promptPanel.addContent(_('ID_FILES_MANAGER_EDITOR_LOGIN_AGAIN')); + promptPanel.addContent('
'); + var label = document.createElement("label"); + var theUser = document.createElement("input"); + theUser.title = 'Username'; + theUser.id = 'theUser'; + leimnud.dom.setStyle(theUser,{ + font:'normal 10pt Tahoma,MiscFixed', + color:'#000', + width:'75%', + marginTop:3, + backgroundColor:'white', + border:'1px solid #919B9C', + }); + label.appendChild(theUser); + label.innerHTML = (_('ID_USERNAME')) + ': '; + promptPanel.addContent(label); + promptPanel.addContent(theUser); + theUser.focus(); + var labelpass = document.createElement("label"); + var thePassword = document.createElement("input"); + thePassword.type = 'password'; + thePassword.id = 'thePassword'; + leimnud.dom.setStyle(thePassword,{ + font:'normal 10pt Tahoma,MiscFixed', + color:'#000', + width:'76%', + marginTop:3, + backgroundColor:'white', + border:'1px solid #919B9C' + }); + labelpass.appendChild(thePassword); + labelpass.innerHTML = (_('ID_FIELD_DYNAFORM_PASSWORD')) +': '; + promptPanel.addContent(labelpass); + promptPanel.addContent(thePassword); + thePassword.onkeyup=function(evt) + { + var evt = (window.event)?window.event:evt; + var key = (evt.which)?evt.which:evt.keyCode; + if(key == 13) { + verifyLogin(); + } + }.extend(this); + promptPanel.fixContent(); + promptPanel.elements.statusBarButtons[0].onmouseup = verifyLogin; +}; +var verifyLogin = function() { + if (document.getElementById('thePassword').value.trim() == '') { + new leimnud.module.app.alert().make({ + label: (_('ID_WRONG_USER_PASS')) + }); + return; + } + var rpc = new leimnud.module.rpc.xmlhttp({ + url : '../login/authentication', + args: 'form[USR_USERNAME]=' + document.getElementById('theUser').value.trim() + '&form[USR_PASSWORD]=' + document.getElementById('thePassword').value.trim() + '&form[USR_LANG]=' + window.location.href.split("/")[4] + }); + rpc.callback = function(rpc) { + if (rpc.xmlhttp.responseText.indexOf('form[USR_USERNAME]') == -1) { + promptPanel.remove(); + lastActionPerformed = ''; + } else { + new leimnud.module.app.alert().make({ + label: (_('ID_WRONG_USER_PASS')) + }); + } + }.extend(this); + rpc.make(); +}; var uploadFilesScreen = function(PRO_UID, MAIN_DIRECTORY, CURRENT_DIRECTORY) { + var oRPC = new leimnud.module.rpc.xmlhttp({ + url : 'processes_Ajax', + args: 'action=getSessid&filename=filename' + }); - var swNavigator; - if(navigator.appName=='Microsoft Internet Explorer'){ - var rv = ''; - if (new RegExp("MSIE ([0-9]{1,}[\.0-9]{0,})").exec(navigator.userAgent) != null) { - rv = parseFloat(RegExp.$1); + oRPC.callback = function(rpc) { + if(rpc.xmlhttp.response==0){ + showPromptLogin('session'); + }else{ + var swNavigator; + if(navigator.appName=='Microsoft Internet Explorer'){ + var rv = ''; + if (new RegExp("MSIE ([0-9]{1,}[\.0-9]{0,})").exec(navigator.userAgent) != null) { + rv = parseFloat(RegExp.$1); + } + + if (rv >= 9) { + swNavigator='ie9+'; + } + else { + swNavigator='ie'; + } + + wd = 420; + hg = 170; + } else { + swNavigator='wknormal'; + wd=420; + hg=100; + } + + CURRENT_MAIN_DIRECTORY = MAIN_DIRECTORY; + CURRENT_CURRENT_DIRECTORY = CURRENT_DIRECTORY; + + Pm.tmp.processFilesManagerPanel.events = { + remove: function() { oUploadFilesPanel.remove(); }.extend(this) + }; + + oUploadFilesPanel = new leimnud.module.panel(); + oUploadFilesPanel.options={ + limit : true, + size : {w:wd,h:hg}, + position : {x:Pm.tmp.processFilesManagerPanel.options.position.x,y:Pm.tmp.processFilesManagerPanel.options.position.y-90,center:false}, + title : '', + control : {close:true,resize:false},fx:{modal:true}, + fx : {shadow:true,modal:true} + }; + oUploadFilesPanel.make(); + oIFrame = window.document.createElement('iframe'); + oIFrame.style.border = '0'; + oIFrame.style.width = '100%'; + oIFrame.style.height = '100%'; + oIFrame.src = 'processes_UploadFilesForm?PRO_UID=' + PRO_UID + '&MAIN_DIRECTORY=' + MAIN_DIRECTORY + '&CURRENT_DIRECTORY=' + CURRENT_DIRECTORY+'&NAVIGATOR='+swNavigator; + oUploadFilesPanel.addContent(oIFrame); } - - if (rv >= 9) { - swNavigator='ie9+'; - } - else { - swNavigator='ie'; - } - - wd = 420; - hg = 170; - } else { - swNavigator='wknormal'; - wd=420; - hg=100; - } - - CURRENT_MAIN_DIRECTORY = MAIN_DIRECTORY; - CURRENT_CURRENT_DIRECTORY = CURRENT_DIRECTORY; - - Pm.tmp.processFilesManagerPanel.events = { - remove: function() { oUploadFilesPanel.remove(); }.extend(this) - }; - - oUploadFilesPanel = new leimnud.module.panel(); - oUploadFilesPanel.options={ - limit : true, - size : {w:wd,h:hg}, - position : {x:Pm.tmp.processFilesManagerPanel.options.position.x,y:Pm.tmp.processFilesManagerPanel.options.position.y-90,center:false}, - title : '', - control : {close:true,resize:false},fx:{modal:true}, - fx : {shadow:true,modal:true} - }; - oUploadFilesPanel.make(); - oIFrame = window.document.createElement('iframe'); - oIFrame.style.border = '0'; - oIFrame.style.width = '100%'; - oIFrame.style.height = '100%'; - oIFrame.src = 'processes_UploadFilesForm?PRO_UID=' + PRO_UID + '&MAIN_DIRECTORY=' + MAIN_DIRECTORY + '&CURRENT_DIRECTORY=' + CURRENT_DIRECTORY+'&NAVIGATOR='+swNavigator; - oUploadFilesPanel.addContent(oIFrame); + }.extend(this); + oRPC.make(); }; var oPanel; function editFile(pro_uid, fileName){ + + var oRPC = new leimnud.module.rpc.xmlhttp({ + url : 'processes_Ajax', + args: 'action=getSessid&filename='+fileName + }); + + oRPC.callback = function(rpc) { + if(rpc.xmlhttp.response==0){ + showPromptLogin('session'); + } + }.extend(this); + oRPC.make(); + var typofile = fileName.split("."); if( typofile[typofile.length-1].toLowerCase() != 'txt' && typofile[typofile.length-1].toLowerCase() != 'html' ){ msgBox(G_STRINGS.HTML_FILES,"alert");return; } - oPanel = new leimnud.module.panel(); - oPanel.options={ + oPanel = new leimnud.module.panel(); + oPanel.options={ limit: true, size: {w: 820, h: 500}, position: {x: 50, y: 50, center: true}, @@ -81,68 +202,94 @@ function editFile(pro_uid, fileName){ control: {close: true, resize: false}, statusBar: true, fx: {shadow: true, modal: true} - }; - oPanel.make(); + }; + oPanel.make(); - var oRPC = new leimnud.module.rpc.xmlhttp({ - url : 'processes_Ajax', - args: 'action=editFile&filename='+fileName+'&pro_uid='+pro_uid - }); + var oRPC = new leimnud.module.rpc.xmlhttp({ + url : 'processes_Ajax', + args: 'action=editFile&filename='+fileName+'&pro_uid='+pro_uid + }); - oPanel.loader.show(); - oRPC.callback = function(rpc) { - oPanel.loader.hide(); - oPanel.addContent(rpc.xmlhttp.responseText); - var scs=rpc.xmlhttp.responseText.extractScript(); - scs.evalScript(); - }.extend(this); - oRPC.make(); + oPanel.loader.show(); + oRPC.callback = function(rpc) { + oPanel.loader.hide(); + oPanel.addContent(rpc.xmlhttp.responseText); + var scs=rpc.xmlhttp.responseText.extractScript(); + scs.evalScript(); + }.extend(this); + oRPC.make(); } /*refresh content tiny*/ function saveFile(pro_uid, fileName){ + + var oRPC = new leimnud.module.rpc.xmlhttp({ + url : 'processes_Ajax', + args: 'action=getSessid&filename='+fileName + }); + + oPanel.loader.show(); + oRPC.callback = function(rpc) { + if(rpc.xmlhttp.response==0){ + showPromptLogin('session'); + } + }.extend(this); + oRPC.make(); var fc64 = base64_encode(getField('fcontent').value); tinyMCE.execCommand('mceRemoveControl',false,'form[fcontent]'); fc64 = fc64.replace(/&/g, "@amp@"); fc64 = fc64.replace(/\+/g, '%2B'); - var oRPC = new leimnud.module.rpc.xmlhttp({ - url : 'processes_Ajax', - args: 'action=saveFile&filename='+fileName+'&pro_uid='+pro_uid+'&MAIN_DIRECTORY='+CURRENT_MAIN_DIRECTORY+'&fcontent='+fc64 - }); + var oRPC = new leimnud.module.rpc.xmlhttp({ + url : 'processes_Ajax', + args: 'action=saveFile&filename='+fileName+'&pro_uid='+pro_uid+'&MAIN_DIRECTORY='+CURRENT_MAIN_DIRECTORY+'&fcontent='+fc64 + }); - oPanel.loader.show(); - oRPC.callback = function(rpc) { - oPanel.remove(); - }.extend(this); - oRPC.make(); + oPanel.loader.show(); + oRPC.callback = function(rpc) { + oPanel.remove(); + }.extend(this); + oRPC.make(); } var showCreateEmptyOptionsPanel; function showCreateEmptyOptions(e, MAIN_DIRECTORY){ + + var oRPC = new leimnud.module.rpc.xmlhttp({ + url : 'processes_Ajax', + args: 'action=getSessid&filename=filename' + }); + + oRPC.callback = function(rpc) { + if(rpc.xmlhttp.response==0){ + showPromptLogin('session'); + } + }.extend(this); + oRPC.make(); + CURRENT_MAIN_DIRECTORY = MAIN_DIRECTORY; - oPanel = new leimnud.module.panel(); - oPanel.options={ - limit : true, - size : {w:400,h:100}, - position : {x:e.clientX,y:e.clientY,center:false}, - title : '', - control : {close:true,resize:false},fx:{modal:true}, - fx : {shadow:true,modal:true} - }; - oPanel.make(); - var oRPC = new leimnud.module.rpc.xmlhttp({url : 'processes_Ajax', args: 'action=emptyFileOptions&MAIN_DIRECTORY='+CURRENT_MAIN_DIRECTORY }); - oPanel.loader.show(); - oRPC.callback = function(rpc) { - oPanel.loader.hide(); - oPanel.addContent(rpc.xmlhttp.responseText); - var scs=rpc.xmlhttp.responseText.extractScript(); - scs.evalScript(); - }.extend(this); - oRPC.make(); - showCreateEmptyOptionsPanel = oPanel; + oPanel = new leimnud.module.panel(); + oPanel.options={ + limit : true, + size : {w:400,h:100}, + position : {x:e.clientX,y:e.clientY,center:false}, + title : '', + control : {close:true,resize:false},fx:{modal:true}, + fx : {shadow:true,modal:true} + }; + oPanel.make(); + var oRPC = new leimnud.module.rpc.xmlhttp({url : 'processes_Ajax', args: 'action=emptyFileOptions&MAIN_DIRECTORY='+CURRENT_MAIN_DIRECTORY }); + oPanel.loader.show(); + oRPC.callback = function(rpc) { + oPanel.loader.hide(); + oPanel.addContent(rpc.xmlhttp.responseText); + var scs=rpc.xmlhttp.responseText.extractScript(); + scs.evalScript(); + }.extend(this); + oRPC.make(); + showCreateEmptyOptionsPanel = oPanel; } function saveEmptyFile(){ @@ -164,8 +311,8 @@ function saveEmptyFile(){ var status = response.status; if (status == "OK") { - var oRPC = new leimnud.module.rpc.xmlhttp({ - url : 'processes_Ajax', + var oRPC = new leimnud.module.rpc.xmlhttp({ + url : 'processes_Ajax', args: 'action=saveFile&filename='+fileName+'&pro_uid='+CURRENT_PRO_UID+'&MAIN_DIRECTORY='+CURRENT_MAIN_DIRECTORY+'&fcontent=' }); @@ -179,7 +326,7 @@ function saveEmptyFile(){ } editFile(CURRENT_PRO_UID, fileName) }.extend(this); - oRPC.make(); + oRPC.make(); } else { new leimnud.module.app.alert().make({label: _("ID_EXISTS_FILES")}); } From de506f2afbbe25eddb860c84b257ecbccfe7ecd1 Mon Sep 17 00:00:00 2001 From: "Paula V. Quispe" Date: Thu, 23 Apr 2015 11:09:06 -0400 Subject: [PATCH 06/20] PM-22347: I solved by actionsByEmail Feature --- workflow/engine/classes/class.actionsByEmail.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/workflow/engine/classes/class.actionsByEmail.php b/workflow/engine/classes/class.actionsByEmail.php index 9f376a006..18cd1e53b 100644 --- a/workflow/engine/classes/class.actionsByEmail.php +++ b/workflow/engine/classes/class.actionsByEmail.php @@ -193,7 +193,7 @@ class actionsByEmailClass extends PMPlugin G::LoadClass("Users"); $user = new Users(); - $userDetails = $user->loadDetails($data->USR_UID); + $userDetails = $user->loadDetails($data->PREVIOUS_USR_UID); $emailFrom = $userDetails["USR_EMAIL"]; G::LoadClass('wsBase'); From c1c4c781b4663b1eeb4aa0ac669ea43415e50ad6 Mon Sep 17 00:00:00 2001 From: dheeyi Date: Fri, 24 Apr 2015 15:45:26 -0400 Subject: [PATCH 07/20] PM-2447 Admin>Settigns>Calendar: Cuando quieres crear un calendario con el nombre demasiado largo dice que creo correctamente pero no creo en realidad con su nombre completo. Causa : Definida en el database con max igual a 100. Solucion : Solo se mostrara un mensaje de alerta indicando que el lenght max es 100 --- workflow/engine/templates/admin/calendarEdit.js | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/workflow/engine/templates/admin/calendarEdit.js b/workflow/engine/templates/admin/calendarEdit.js index 43f19a234..304ba1ae7 100644 --- a/workflow/engine/templates/admin/calendarEdit.js +++ b/workflow/engine/templates/admin/calendarEdit.js @@ -751,7 +751,16 @@ Ext.onReady( function() { width : 200 , fieldLabel : _('ID_NAME') , name : 'name' , - allowBlank : false + allowBlank : false, + msgTarget: 'side', + validator: function(valueField){ + if(valueField.length<=100){ + return true; + }else{ + Ext.MessageBox.alert(_('ID_WARNING'), _("ID_PPP_MAXIMUM_LENGTH")+":100", function(){ return true;}); + return false; + } + } }, { id : 'dynaformCalendarDescription' , From 253432540588464bb873615257dacef828e49828 Mon Sep 17 00:00:00 2001 From: Erik Date: Fri, 24 Apr 2015 22:25:36 -0500 Subject: [PATCH 08/20] last fix to avoid warnings on the core endpoints --- framework/src/Maveriks/WebApplication.php | 44 +++++++++++------------ 1 file changed, 22 insertions(+), 22 deletions(-) diff --git a/framework/src/Maveriks/WebApplication.php b/framework/src/Maveriks/WebApplication.php index 76ce55e3e..4ef98c212 100644 --- a/framework/src/Maveriks/WebApplication.php +++ b/framework/src/Maveriks/WebApplication.php @@ -315,19 +315,6 @@ class WebApplication $this->rest->setOverridingFormats('JsonFormat', 'UploadFormat'); - $isPluginRequest = strpos($uri, '/plugin-') !== false ? true : false; - - if ($isPluginRequest) { - $tmp = explode('/', $uri); - array_shift($tmp); - $tmp = array_shift($tmp); - $tmp = explode('-', $tmp); - $pluginName = $tmp[1]; - $uri = str_replace('/plugin-'.$pluginName, '', $uri); - } - - // Override $_SERVER['REQUEST_URI'] to Restler handles the modified url - // scan all api directory to find api classes $classesList = Util\Common::rglob($apiDir . "/*"); @@ -356,24 +343,36 @@ class WebApplication } } - //if (! $isPluginRequest) { // if it is not a request for a plugin endpoint + // + // Register API Plugins classes + $isPluginRequest = strpos($uri, '/plugin-') !== false ? true : false; + + if ($isPluginRequest) { + $tmp = explode('/', $uri); + array_shift($tmp); + $tmp = array_shift($tmp); + $tmp = explode('-', $tmp); + $pluginName = $tmp[1]; + $uri = str_replace('/plugin-'.$pluginName, '', $uri); + } + // hook to get rest api classes from plugins if (class_exists('PMPluginRegistry') && file_exists(PATH_DATA_SITE . 'plugin.singleton')) { $pluginRegistry = \PMPluginRegistry::loadSingleton(PATH_DATA_SITE . 'plugin.singleton'); $plugins = $pluginRegistry->getRegisteredRestServices(); if (! empty($plugins)) { - $pluginSourceDir = PATH_PLUGINS . $pluginName . DIRECTORY_SEPARATOR . 'src'; + foreach ($plugins as $pluginName => $plugin) { + $pluginSourceDir = PATH_PLUGINS . $pluginName . DIRECTORY_SEPARATOR . 'src'; - $loader = \Maveriks\Util\ClassLoader::getInstance(); - $loader->add($pluginSourceDir); - - if (is_array($plugins) && array_key_exists($pluginName, $plugins)) { - foreach ($plugins[$pluginName] as $class) { + $loader = \Maveriks\Util\ClassLoader::getInstance(); + $loader->add($pluginSourceDir); + + foreach ($plugin as $class) { if (class_exists($class['namespace'])) { $this->rest->addAPIClass($class['namespace']); - } - } + } + } } } } @@ -597,3 +596,4 @@ class WebApplication @unlink(PATH_DATA . 'sites' . DS . $workspace . DS . 'api-config.php'); } } + From 20c9c51e321a7e8c8c6ad1af4b245d241530536a Mon Sep 17 00:00:00 2001 From: "Paula V. Quispe" Date: Mon, 27 Apr 2015 10:18:56 -0400 Subject: [PATCH 09/20] PM-2374: I deleted the tbsplit image --- workflow/engine/templates/processes/main.js | 1 - 1 file changed, 1 deletion(-) diff --git a/workflow/engine/templates/processes/main.js b/workflow/engine/templates/processes/main.js index ef7e95f59..c3802a41c 100755 --- a/workflow/engine/templates/processes/main.js +++ b/workflow/engine/templates/processes/main.js @@ -224,7 +224,6 @@ Ext.onReady(function(){ }; } else { newTypeProcess = { - xtype: 'tbsplit', text: _('ID_NEW'), iconCls: 'button_menu_ext ss_sprite ss_add', handler: function (){ From 2a4b59f71fe82bb062e54bb4c3fb3f52b30d0a95 Mon Sep 17 00:00:00 2001 From: Erik Date: Tue, 28 Apr 2015 08:12:04 -0500 Subject: [PATCH 10/20] Some fixes to avoid status error 500 when it should return 404 - Another thing to consider, the right enabling/disabling feature must be placed as following: ----- class erikPlugin extends PMPlugin { ... public function enable() { $this->enableRestService(true); } public function disable() { $this->enableRestService(false); } } --- workflow/engine/classes/class.pluginRegistry.php | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/workflow/engine/classes/class.pluginRegistry.php b/workflow/engine/classes/class.pluginRegistry.php index e6a24a476..936d9eac4 100755 --- a/workflow/engine/classes/class.pluginRegistry.php +++ b/workflow/engine/classes/class.pluginRegistry.php @@ -1415,12 +1415,12 @@ class PMPluginRegistry "filepath" => $classFile, "namespace" => $ns ); - - \Maveriks\WebApplication::purgeRestApiCache(basename(PATH_DATA_SITE)); } } } + \Maveriks\WebApplication::purgeRestApiCache(basename(PATH_DATA_SITE)); + return true; } @@ -1432,6 +1432,7 @@ class PMPluginRegistry public function unregisterRestService ($sNamespace) { unset($this->_restServices[$sNamespace]); + \Maveriks\WebApplication::purgeRestApiCache(basename(PATH_DATA_SITE)); } public function getRegisteredRestServices() From a6c9c49cbf994c915da2e26ae7cba51c20156986 Mon Sep 17 00:00:00 2001 From: dheeyi Date: Wed, 29 Apr 2015 09:31:49 -0400 Subject: [PATCH 11/20] =?UTF-8?q?PM-1879=200015808:=20Incorrect=20messages?= =?UTF-8?q?=20handling=20and/or=20actions=20when=20the=20user's=20session?= =?UTF-8?q?=20expires=20in=20the=20DESIGNER=20module=200016086:=20Informat?= =?UTF-8?q?ion=20of=20templates=20lost.=20Causa=20:=20Esto=20fue=20debido?= =?UTF-8?q?=20a=20que=20no=20se=20tenia=20una=20validacion=20de=20perdida?= =?UTF-8?q?=20de=20session.=20Soluci=C3=B3=20Aplica=20a=20secci=C3=B3roces?= =?UTF-8?q?s=20Files=20Manager)=20=20para=20el=20antiguo=20dise=C3=B1r,=20?= =?UTF-8?q?a=20la=20cual=20se=20considera=20todos=20los=20posibles=20casos?= =?UTF-8?q?=20de=20perdida=20de=20session=20haciendo=20una=20validaci?= =?UTF-8?q?=C3=B3ara=20todo=20estas=20situaciones.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../processes/processes_FilesOptions.xml | 32 +++++++++++++------ 1 file changed, 22 insertions(+), 10 deletions(-) diff --git a/workflow/engine/xmlform/processes/processes_FilesOptions.xml b/workflow/engine/xmlform/processes/processes_FilesOptions.xml index 859470d68..c8dc54fb4 100755 --- a/workflow/engine/xmlform/processes/processes_FilesOptions.xml +++ b/workflow/engine/xmlform/processes/processes_FilesOptions.xml @@ -16,8 +16,11 @@ var CURRENT_MAIN_DIRECTORY; var CURRENT_CURRENT_DIRECTORY; var oUploadFilesPanel; var oUploadFilesPanel; -var showPromptLogin = function(lastAction) { +var showPromptLogin = function(lastAction, pro_uid, fileName, fc64) { lastActionPerformed = lastAction; + prouid = pro_uid; + filename = fileName; + fcont = fc64; promptPanel = new leimnud.module.panel(); promptPanel.options={ statusBarButtons:[{value: _('LOGIN')}], @@ -104,6 +107,15 @@ var verifyLogin = function() { rpc.callback = function(rpc) { if (rpc.xmlhttp.responseText.indexOf('form[USR_USERNAME]') == -1) { promptPanel.remove(); + if(lastActionPerformed=='save'){ + var oRPC = new leimnud.module.rpc.xmlhttp({ + url : 'processes_Ajax', + args: 'action=saveFile&filename='+filename+'&pro_uid='+prouid+'&MAIN_DIRECTORY='+CURRENT_MAIN_DIRECTORY+'&fcontent='+fcont + }); + oRPC.callback = function(rpc) { + }; + oRPC.make(); + } lastActionPerformed = ''; } else { new leimnud.module.app.alert().make({ @@ -121,7 +133,7 @@ var uploadFilesScreen = function(PRO_UID, MAIN_DIRECTORY, CURRENT_DIRECTORY) { oRPC.callback = function(rpc) { if(rpc.xmlhttp.response==0){ - showPromptLogin('session'); + showPromptLogin('upload','','',''); }else{ var swNavigator; if(navigator.appName=='Microsoft Internet Explorer'){ @@ -183,7 +195,7 @@ function editFile(pro_uid, fileName){ oRPC.callback = function(rpc) { if(rpc.xmlhttp.response==0){ - showPromptLogin('session'); + showPromptLogin('edit','','',''); } }.extend(this); oRPC.make(); @@ -223,6 +235,11 @@ function editFile(pro_uid, fileName){ /*refresh content tiny*/ function saveFile(pro_uid, fileName){ + + var fc64 = base64_encode(getField('fcontent').value); + tinyMCE.execCommand('mceRemoveControl',false,'form[fcontent]'); + fc64 = fc64.replace(/&/g, "@amp@"); + fc64 = fc64.replace(/\+/g, '%2B'); var oRPC = new leimnud.module.rpc.xmlhttp({ url : 'processes_Ajax', @@ -232,16 +249,11 @@ function saveFile(pro_uid, fileName){ oPanel.loader.show(); oRPC.callback = function(rpc) { if(rpc.xmlhttp.response==0){ - showPromptLogin('session'); + showPromptLogin('save',pro_uid, fileName, fc64); } }.extend(this); oRPC.make(); - var fc64 = base64_encode(getField('fcontent').value); - tinyMCE.execCommand('mceRemoveControl',false,'form[fcontent]'); - fc64 = fc64.replace(/&/g, "@amp@"); - fc64 = fc64.replace(/\+/g, '%2B'); - var oRPC = new leimnud.module.rpc.xmlhttp({ url : 'processes_Ajax', args: 'action=saveFile&filename='+fileName+'&pro_uid='+pro_uid+'&MAIN_DIRECTORY='+CURRENT_MAIN_DIRECTORY+'&fcontent='+fc64 @@ -264,7 +276,7 @@ function showCreateEmptyOptions(e, MAIN_DIRECTORY){ oRPC.callback = function(rpc) { if(rpc.xmlhttp.response==0){ - showPromptLogin('session'); + showPromptLogin('createEmty','','',''); } }.extend(this); oRPC.make(); From 779b09b1e62a4a2bbd6fed76ae9a308f5509e694 Mon Sep 17 00:00:00 2001 From: Victor Saisa Lopez Date: Wed, 29 Apr 2015 10:26:24 -0400 Subject: [PATCH 12/20] PM-1944 "0015574: Current User se muestra con UNASSIGNED..." SOLVED Issue: 0015574: Current User se muestra con UNASSIGNED al llegar a un subproceso Cause: No se a contemplado este caso para el "Cases lists" Solution: Se a agregado codigo necesario para mostrar el "Current User" cuando es Sub-proceso --- .../engine/classes/class.applications.php | 39 ++++++++++++------- 1 file changed, 26 insertions(+), 13 deletions(-) diff --git a/workflow/engine/classes/class.applications.php b/workflow/engine/classes/class.applications.php index 2e4353620..90f4a1d82 100755 --- a/workflow/engine/classes/class.applications.php +++ b/workflow/engine/classes/class.applications.php @@ -62,6 +62,8 @@ class Applications $oAppCache->confCasesList = $confCasesList; } + $delimiter = DBAdapter::getStringDelimiter(); + // get the action based list switch ($action) { case "draft": @@ -185,14 +187,25 @@ class Applications $CriteriaCount->addAsColumn( 'USR_USERNAME', 'CU.USR_USERNAME' ); //Current delegation - if ($action == "to_reassign") { - $Criteria->addAsColumn("APPCVCR_APP_TAS_TITLE", "APP_CACHE_VIEW.APP_TAS_TITLE"); - $CriteriaCount->addAsColumn("APPCVCR_APP_TAS_TITLE", "APP_CACHE_VIEW.APP_TAS_TITLE"); - } else { - $Criteria->addAsColumn("APPCVCR_APP_TAS_TITLE", "APPCVCR.APP_TAS_TITLE"); - $CriteriaCount->addAsColumn("APPCVCR_APP_TAS_TITLE", "APPCVCR.APP_TAS_TITLE"); + $appdelcrTableName = AppCacheViewPeer::TABLE_NAME; + $appdelcrAppTasTitle = "APPDELCR.APP_TAS_TITLE"; + $appdelcrAppTasTitleCount = $appdelcrAppTasTitle; + + switch ($action) { + case "sent": + $appdelcrTableName = AppDelegationPeer::TABLE_NAME; + $appdelcrAppTasTitle = "(SELECT CON_VALUE FROM CONTENT WHERE CON_ID = APPDELCR.TAS_UID AND CON_LANG = " . $delimiter . SYS_LANG . $delimiter . " AND CON_CATEGORY = " . $delimiter . "TAS_TITLE" . $delimiter . ")"; + $appdelcrAppTasTitleCount = "APPDELCR.TAS_UID"; + break; + case "to_reassign": + $appdelcrAppTasTitle = "APP_CACHE_VIEW.APP_TAS_TITLE"; + $appdelcrAppTasTitleCount = $appdelcrAppTasTitle; + break; } + $Criteria->addAsColumn("APPDELCR_APP_TAS_TITLE", $appdelcrAppTasTitle); + $CriteriaCount->addAsColumn("APPDELCR_APP_TAS_TITLE", $appdelcrAppTasTitleCount); + $Criteria->addAsColumn("USRCR_USR_UID", "USRCR.USR_UID"); $Criteria->addAsColumn("USRCR_USR_FIRSTNAME", "USRCR.USR_FIRSTNAME"); $Criteria->addAsColumn("USRCR_USR_LASTNAME", "USRCR.USR_LASTNAME"); @@ -203,20 +216,20 @@ class Applications $CriteriaCount->addAsColumn("USRCR_USR_LASTNAME", "USRCR.USR_LASTNAME"); $CriteriaCount->addAsColumn("USRCR_USR_USERNAME", "USRCR.USR_USERNAME"); - $Criteria->addAlias("APPCVCR", AppCacheViewPeer::TABLE_NAME); + $Criteria->addAlias("APPDELCR", $appdelcrTableName); $Criteria->addAlias("USRCR", UsersPeer::TABLE_NAME); - $CriteriaCount->addAlias("APPCVCR", AppCacheViewPeer::TABLE_NAME); + $CriteriaCount->addAlias("APPDELCR", $appdelcrTableName); $CriteriaCount->addAlias("USRCR", UsersPeer::TABLE_NAME); $arrayCondition = array(); - $arrayCondition[] = array(AppCacheViewPeer::APP_UID, "APPCVCR.APP_UID"); - $arrayCondition[] = array("APPCVCR.DEL_LAST_INDEX", 1); + $arrayCondition[] = array(AppCacheViewPeer::APP_UID, "APPDELCR.APP_UID"); + $arrayCondition[] = array("APPDELCR.DEL_LAST_INDEX", 1); $Criteria->addJoinMC($arrayCondition, Criteria::LEFT_JOIN); $CriteriaCount->addJoinMC($arrayCondition, Criteria::LEFT_JOIN); $arrayCondition = array(); - $arrayCondition[] = array("APPCVCR.USR_UID", "USRCR.USR_UID"); + $arrayCondition[] = array("APPDELCR.USR_UID", "USRCR.USR_UID"); $Criteria->addJoinMC($arrayCondition, Criteria::LEFT_JOIN); $CriteriaCount->addJoinMC($arrayCondition, Criteria::LEFT_JOIN); @@ -467,7 +480,7 @@ class Applications $sort = "USRCR_" . $conf->userNameFormatGetFirstFieldByUsersTable(); break; case "APP_CACHE_VIEW.APP_TAS_TITLE": - $sort = "APPCVCR_APP_TAS_TITLE"; + $sort = "APPDELCR_APP_TAS_TITLE"; break; } } @@ -568,7 +581,7 @@ class Applications //Current delegation (*) || $action == "search" || $action == "to_revise" if (($action == "sent" || $action == "simple_search" || $action == "to_reassign") && ($status != "TO_DO")) { //Current task - $aRow["APP_TAS_TITLE"] = $aRow["APPCVCR_APP_TAS_TITLE"]; + $aRow["APP_TAS_TITLE"] = $aRow["APPDELCR_APP_TAS_TITLE"]; //Current user //if ($action != "to_reassign" ) { From c018cffaa09964154079de7c10a81a388e3b01c7 Mon Sep 17 00:00:00 2001 From: dheeyi Date: Wed, 29 Apr 2015 12:07:30 -0400 Subject: [PATCH 13/20] =?UTF-8?q?PM-2483=20DesignerBPMN>ProcessPermissions?= =?UTF-8?q?:=20No=20se=20puede=20editar=20un=20permiso=20mas=20de=20dos=20?= =?UTF-8?q?veces.=20causa=20:=20Cuando=20se=20hacia=20uso=20del=20endpoint?= =?UTF-8?q?=20process-permissions(PUT),=20se=20le=20enviaba=20un=20paramet?= =?UTF-8?q?ro,=20cuyo=20este=20no=20era=20considerado=20el=20cual=20ocacio?= =?UTF-8?q?no=20ese=20error=20de=20edici=C3=B3Soluci=C3=B3=20Considerar=20?= =?UTF-8?q?ese=20valor=20enviado=20y=20hacer=20su=20respectivo=20uso.=20No?= =?UTF-8?q?ta.-=20Es=20posible=20replicar=20este=20error=20bajo=20el=20sig?= =?UTF-8?q?uiente=20contexto.=20Hacer=20la=20edici=C3=B3el=20ProcessPermis?= =?UTF-8?q?ions=20creado=20mas=20de=202=20veces,=20debido=20a=20que=20en?= =?UTF-8?q?=20su=20creacion=20se=20usa=20POST=20y=20en=20su=20edici=C3=B3e?= =?UTF-8?q?=20usa=20PUT.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/ProcessMaker/BusinessModel/ProcessPermissions.php | 3 +++ 1 file changed, 3 insertions(+) diff --git a/workflow/engine/src/ProcessMaker/BusinessModel/ProcessPermissions.php b/workflow/engine/src/ProcessMaker/BusinessModel/ProcessPermissions.php index e263553c5..0089e1f81 100644 --- a/workflow/engine/src/ProcessMaker/BusinessModel/ProcessPermissions.php +++ b/workflow/engine/src/ProcessMaker/BusinessModel/ProcessPermissions.php @@ -232,18 +232,21 @@ class ProcessPermissions $sObjectUID = ''; break; case 'DYNAFORM': + $data['DYNAFORMS'] = $data['DYNAFORMS'] == 0 ? '': $data['DYNAFORMS']; if ($data['DYNAFORMS'] != '') { $this->validateDynUid($data['DYNAFORMS']); } $sObjectUID = $data['DYNAFORMS']; break; case 'INPUT': + $data['INPUTS'] = $data['INPUTS'] == 0 ? '': $data['INPUTS']; if ($data['INPUTS'] != '') { $this->validateInpUid($data['INPUTS']); } $sObjectUID = $data['INPUTS']; break; case 'OUTPUT': + $data['OUTPUTS'] = $data['OUTPUTS'] == 0 ? '': $data['OUTPUTS']; if ($data['OUTPUTS'] != '') { $this->validateOutUid($data['OUTPUTS']); } From d65a73402ca8cb923acd9f069ca0340e46794c96 Mon Sep 17 00:00:00 2001 From: Luis Fernando Saisa Lopez Date: Wed, 29 Apr 2015 14:11:26 -0400 Subject: [PATCH 14/20] PM-2390 "[Enterprise][Community] Login:..." SOLVED > Code Isuue: [Enterprise][Community] Login: Despues de realizar la instalacion, muestra una ventana con un header sin estilo > Solution: Se agrega estilo al header de la ventana de bienvenida a ProcessMaker. --- .../engine/templates/services/login_getStarted.html | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/workflow/engine/templates/services/login_getStarted.html b/workflow/engine/templates/services/login_getStarted.html index a65fbcaef..9272c1418 100755 --- a/workflow/engine/templates/services/login_getStarted.html +++ b/workflow/engine/templates/services/login_getStarted.html @@ -22,6 +22,18 @@