diff --git a/workflow/engine/classes/class.derivation.php b/workflow/engine/classes/class.derivation.php index ec0a22905..7cddccf06 100755 --- a/workflow/engine/classes/class.derivation.php +++ b/workflow/engine/classes/class.derivation.php @@ -56,7 +56,7 @@ class Derivation * * return array Return array */ - public function prepareInformationTask(array $arrayTaskData) + private function prepareInformationTask(array $arrayTaskData) { try { $task = new Task(); @@ -112,7 +112,9 @@ class Derivation $arrayTaskData["NEXT_TASK"]["TAS_PARENT"] = ""; } - $arrayTaskData["NEXT_TASK"]["USER_ASSIGNED"] = (!in_array($arrayTaskData["NEXT_TASK"]["TAS_TYPE"], array("GATEWAYTOGATEWAY", "END-MESSAGE-EVENT", "SCRIPT-TASK", "INTERMEDIATE-CATCH-TIMER-EVENT", "END-EMAIL-EVENT")))? $this->getNextAssignedUser($arrayTaskData) : array("USR_UID" => "", "USR_FULLNAME" => ""); + $regexpTaskTypeToExclude = "GATEWAYTOGATEWAY|END-MESSAGE-EVENT|SCRIPT-TASK|INTERMEDIATE-CATCH-TIMER-EVENT|END-EMAIL-EVENT"; + + $arrayTaskData["NEXT_TASK"]["USER_ASSIGNED"] = (!preg_match("/^(?:" . $regexpTaskTypeToExclude . ")$/", $arrayTaskData["NEXT_TASK"]["TAS_TYPE"]))? $this->getNextAssignedUser($arrayTaskData) : array("USR_UID" => "", "USR_FULLNAME" => ""); } //Return @@ -226,7 +228,7 @@ class Derivation } } - if (empty($arrayNextTask) && !empty($arrayNextTaskDefault)) { + if (count($arrayNextTask) == 0 && count($arrayNextTaskDefault) > 0) { $arrayNextTask[++$i] = $this->prepareInformationTask($arrayNextTaskDefault); } @@ -480,10 +482,26 @@ class Derivation //} ///* End - Verify if the next Task is set with the option "TAS_ASSIGN_LOCATION == TRUE" */ - $uidUser = ''; - switch ($nextAssignedTask['TAS_ASSIGN_TYPE']) { + $taskNext = TaskPeer::retrieveByPK($nextAssignedTask["TAS_UID"]); + $bpmnActivityNext = BpmnActivityPeer::retrieveByPK($nextAssignedTask["TAS_UID"]); + + $flagTaskNextIsMultipleInstance = false; + $flagTaskNextAssignTypeIsMultipleInstance = false; + + if (!is_null($taskNext) && !is_null($bpmnActivityNext)) { + $flagTaskNextIsMultipleInstance = $bpmnActivityNext->getActType() == "TASK" && preg_match("/^(?:EMPTY|USERTASK|MANUALTASK)$/", $bpmnActivityNext->getActTaskType()) && $bpmnActivityNext->getActLoopType() == "PARALLEL"; + $flagTaskNextAssignTypeIsMultipleInstance = preg_match("/^(?:MULTIPLE_INSTANCE|MULTIPLE_INSTANCE_VALUE_BASED)$/", $taskNext->getTasAssignType()); + } + + $taskNextAssignType = $taskNext->getTasAssignType(); + $taskNextAssignType = ($flagTaskNextIsMultipleInstance && !$flagTaskNextAssignTypeIsMultipleInstance)? "" : $taskNextAssignType; + $taskNextAssignType = (!$flagTaskNextIsMultipleInstance && $flagTaskNextAssignTypeIsMultipleInstance)? "" : $taskNextAssignType; + + switch ($taskNextAssignType) { case 'BALANCED': $users = $this->getAllUsersFromAnyTask( $sTasUid ); + $uidUser = ""; + if (is_array( $users ) && count( $users ) > 0) { //to do apply any filter like LOCATION assignment $uidUser = $users[0]; @@ -553,8 +571,25 @@ class Derivation $userFields['USR_LASTNAME'] = ''; $userFields['USR_EMAIL'] = ''; break; + case "MULTIPLE_INSTANCE": + $userFields = $this->getUsersFullNameFromArray($this->getAllUsersFromAnyTask($nextAssignedTask["TAS_UID"])); + break; + case "MULTIPLE_INSTANCE_VALUE_BASED": + $arrayApplicationData = $this->case->loadCase($tasInfo["APP_UID"]); + + $nextTaskAssignVariable = trim($nextAssignedTask["TAS_ASSIGN_VARIABLE"], " @#"); + + if ($nextTaskAssignVariable != "" && + isset($arrayApplicationData["APP_DATA"][$nextTaskAssignVariable]) && !empty($arrayApplicationData["APP_DATA"][$nextTaskAssignVariable]) && is_array($arrayApplicationData["APP_DATA"][$nextTaskAssignVariable]) + ) { + $userFields = $this->getUsersFullNameFromArray($arrayApplicationData["APP_DATA"][$nextTaskAssignVariable]); + } else { + throw new Exception(G::LoadTranslation("ID_ACTIVITY_INVALID_USER_DATA_VARIABLE_FOR_MULTIPLE_INSTANCE_ACTIVITY", array(strtolower("ACT_UID"), $nextAssignedTask["TAS_UID"], $nextTaskAssignVariable))); + } + break; default: throw (new Exception( 'Invalid Task Assignment method for Next Task ' )); + break; } return $userFields; } @@ -595,6 +630,86 @@ class Derivation } } + /** + * Update counters + * + * @param array $arrayCurrentDelegationData + * @param array $arrayNextDelegationData + * @param mixed $taskNextDelegation + * @param array $arrayApplicationData + * @param int $delIndexNew + * @param mixed $aSp + * @param bool $removeList + * + * return void + */ + private function derivateUpdateCounters(array $arrayCurrentDelegationData, array $arrayNextDelegationData, $taskNextDelegation, array $arrayApplicationData, $delIndexNew, $aSp, $removeList) + { + /*----------------------------------********---------------------------------*/ + try { + $user = new Users(); + + if ($arrayNextDelegationData["TAS_UID"] == "-2") { + $application = ApplicationPeer::retrieveByPK($arrayApplicationData["APP_UID"]); + + if ($application->getAppStatus() == "DRAFT") { + $user->refreshTotal($arrayApplicationData["CURRENT_USER_UID"], "remove", "draft"); + } else { + $user->refreshTotal($arrayApplicationData["CURRENT_USER_UID"], "remove", "inbox"); + } + } else { + if ($arrayNextDelegationData["TAS_UID"] != "-1") { + $regexpTaskTypeToExclude = "WEBENTRYEVENT|END-MESSAGE-EVENT|START-MESSAGE-EVENT|INTERMEDIATE-THROW-MESSAGE-EVENT|INTERMEDIATE-CATCH-MESSAGE-EVENT|SCRIPT-TASK|INTERMEDIATE-CATCH-TIMER-EVENT"; + + if (!preg_match("/^(?:" . $regexpTaskTypeToExclude . ")$/", $taskNextDelegation->getTasType())) { + if (!empty($delIndexNew) && empty($aSp)) { + $appDelegation = AppDelegationPeer::retrieveByPK($arrayApplicationData["APP_UID"], $delIndexNew); + $arrayApplicationData2 = $appDelegation->toArray(BasePeer::TYPE_FIELDNAME); + + $arrayApplicationData2["APP_STATUS"] = $arrayCurrentDelegationData["APP_STATUS"]; + + $taskCurrent = TaskPeer::retrieveByPK($arrayCurrentDelegationData["TAS_UID"]); + + if ($taskCurrent->getTasType() == "INTERMEDIATE-CATCH-MESSAGE-EVENT") { + $removeList = false; + } + + $arrayApplicationData2["REMOVED_LIST"] = $removeList; + + $inbox = new ListInbox(); + $inbox->newRow($arrayApplicationData2, $arrayApplicationData["CURRENT_USER_UID"], false, array(), (($arrayNextDelegationData["TAS_ASSIGN_TYPE"] == "SELF_SERVICE")? true : false)); + } else { + if (empty($aSp)) { + $application = ApplicationPeer::retrieveByPK($arrayApplicationData["APP_UID"]); + + if ($application->getAppStatus() == "DRAFT") { + $user->refreshTotal($arrayApplicationData["CURRENT_USER_UID"], "remove", "draft"); + } else { + $user->refreshTotal($arrayApplicationData["CURRENT_USER_UID"], "remove", "inbox"); + } + } + } + } else { + $regexpTaskTypeToExclude = "SCRIPT-TASK"; + + if (!preg_match("/^(?:" . $regexpTaskTypeToExclude . ")$/", $taskNextDelegation->getTasType()) && $removeList) { + $application = ApplicationPeer::retrieveByPK($arrayApplicationData["APP_UID"]); + + if ($application->getAppStatus() == "DRAFT") { + $user->refreshTotal($arrayApplicationData["CURRENT_USER_UID"], "remove", "draft"); + } else { + $user->refreshTotal($arrayApplicationData["CURRENT_USER_UID"], "remove", "inbox"); + } + } + } + } + } + } catch (Exception $e) { + throw $e; + } + /*----------------------------------********---------------------------------*/ + } + /* derivate * * @param array $currentDelegation @@ -621,6 +736,15 @@ class Derivation //Get data for current delegation (current Task) $task = TaskPeer::retrieveByPK($currentDelegation["TAS_UID"]); + $bpmnActivity = BpmnActivityPeer::retrieveByPK($currentDelegation["TAS_UID"]); + + $flagTaskIsMultipleInstance = false; + $flagTaskAssignTypeIsMultipleInstance = false; + + if (!is_null($task) && !is_null($bpmnActivity)) { + $flagTaskIsMultipleInstance = $bpmnActivity->getActType() == "TASK" && preg_match("/^(?:EMPTY|USERTASK|MANUALTASK)$/", $bpmnActivity->getActTaskType()) && $bpmnActivity->getActLoopType() == "PARALLEL"; + $flagTaskAssignTypeIsMultipleInstance = preg_match("/^(?:MULTIPLE_INSTANCE|MULTIPLE_INSTANCE_VALUE_BASED)$/", $task->getTasAssignType()); + } $currentDelegation["TAS_ASSIGN_TYPE"] = $task->getTasAssignType(); $currentDelegation["TAS_MI_COMPLETE_VARIABLE"] = $task->getTasMiCompleteVariable(); @@ -666,6 +790,17 @@ class Derivation } $taskNextDel = TaskPeer::retrieveByPK($nextDel["TAS_UID"]); //Get data for next delegation (next Task) + $bpmnActivityNextDel = BpmnActivityPeer::retrieveByPK($nextDel["TAS_UID"]); + + $flagTaskNextDelIsMultipleInstance = false; + $flagTaskNextDelAssignTypeIsMultipleInstance = false; + + if (!is_null($taskNextDel) && !is_null($bpmnActivityNextDel)) { + $flagTaskNextDelIsMultipleInstance = $bpmnActivityNextDel->getActType() == "TASK" && preg_match("/^(?:EMPTY|USERTASK|MANUALTASK)$/", $bpmnActivityNextDel->getActTaskType()) && $bpmnActivityNextDel->getActLoopType() == "PARALLEL"; + $flagTaskNextDelAssignTypeIsMultipleInstance = preg_match("/^(?:MULTIPLE_INSTANCE|MULTIPLE_INSTANCE_VALUE_BASED)$/", $taskNextDel->getTasAssignType()); + } + + $flagUpdateCounters = true; switch ($nextDel['TAS_UID']) { case TASK_FINISH_PROCESS: @@ -699,12 +834,13 @@ class Derivation $this->case->closeAppThread( $currentDelegation['APP_UID'], $iAppThreadIndex ); break; default: - // get all siblingThreads - //if($currentDelegation['TAS_ASSIGN_TYPE'] == 'STATIC_MI') + //Get all siblingThreads + $canDerivate = false; + switch ($currentDelegation['TAS_ASSIGN_TYPE']) { case 'CANCEL_MI': case 'STATIC_MI': - $siblingThreads = $this->case->GetAllOpenDelegation( $currentDelegation ); + $arrayOpenThread = $this->case->GetAllOpenDelegation($currentDelegation); $aData = $this->case->loadCase( $currentDelegation['APP_UID'] ); if (isset( $aData['APP_DATA'][str_replace( '@@', '', $currentDelegation['TAS_MI_INSTANCE_VARIABLE'] )] )) { @@ -722,21 +858,29 @@ class Derivation $discriminateThread = $sMIinstanceVar - $sMIcompleteVar; // -1 because One App Delegation is closed by above Code - if ($discriminateThread == count( $siblingThreads )) { + if ($discriminateThread == count($arrayOpenThread)) { $canDerivate = true; } else { $canDerivate = false; } break; default: - if ($currentDelegation["ROU_TYPE"] == "SEC-JOIN") { - $siblingThreads = $this->case->getOpenSiblingThreads($nextDel["TAS_UID"], $currentDelegation["APP_UID"], $currentDelegation["DEL_INDEX"], $currentDelegation["TAS_UID"]); + $routeType = $currentDelegation["ROU_TYPE"]; + $routeType = ($flagTaskIsMultipleInstance && $flagTaskAssignTypeIsMultipleInstance)? "SEC-JOIN" : $routeType; - $canDerivate = empty($siblingThreads); - } else { - $canDerivate = true; + switch ($routeType) { + case "SEC-JOIN": + $arrayOpenThread = ($flagTaskIsMultipleInstance && $flagTaskAssignTypeIsMultipleInstance)? $this->case->searchOpenPreviousTasks($currentDelegation["TAS_UID"], $currentDelegation["APP_UID"]) : array(); + $arrayOpenThread = array_merge($arrayOpenThread, $this->case->getOpenSiblingThreads($nextDel["TAS_UID"], $currentDelegation["APP_UID"], $currentDelegation["DEL_INDEX"], $currentDelegation["TAS_UID"])); + + $canDerivate = empty($arrayOpenThread); + break; + default: + $canDerivate = true; + break; } - } //end switch + break; + } if ($canDerivate) { //Throw Message-Events @@ -750,9 +894,35 @@ class Derivation $emailEvent->emailEventBetweenElementOriginAndElementDest($currentDelegation["TAS_UID"], $nextDel["TAS_UID"], $appFields); //Derivate - $aSP = isset( $aSP ) ? $aSP : null; + $aSP = (isset($aSP))? $aSP : null; - $iNewDelIndex = $this->doDerivation( $currentDelegation, $nextDel, $appFields, $aSP ); + $taskNextDelAssignType = ($flagTaskNextDelIsMultipleInstance && $flagTaskNextDelAssignTypeIsMultipleInstance)? $taskNextDel->getTasAssignType() : ""; + + switch ($taskNextDelAssignType) { + case "MULTIPLE_INSTANCE": + case "MULTIPLE_INSTANCE_VALUE_BASED": + $arrayUser = $this->getNextAssignedUser(array("APP_UID" => $currentDelegation["APP_UID"], "NEXT_TASK" => $taskNextDel->toArray(BasePeer::TYPE_FIELDNAME))); + + if (empty($arrayUser)) { + throw new Exception(G::LoadTranslation("ID_NO_USERS")); + } + + foreach ($arrayUser as $value2) { + $currentDelegationAux = array_merge($currentDelegation, array("ROU_TYPE" => "PARALLEL")); + $nextDelAux = array_merge($nextDel, array("USR_UID" => $value2["USR_UID"])); + + $iNewDelIndex = $this->doDerivation($currentDelegationAux, $nextDelAux, $appFields, $aSP); + + $this->derivateUpdateCounters($currentDelegationAux, $nextDelAux, $taskNextDel, $appFields, $iNewDelIndex, $aSP, $removeList); + + $flagUpdateCounters = false; + $removeList = false; + } + break; + default: + $iNewDelIndex = $this->doDerivation($currentDelegation, $nextDel, $appFields, $aSP); + break; + } //Execute Script-Task $scriptTask = new \ProcessMaker\BusinessModel\ScriptTask(); @@ -760,9 +930,9 @@ class Derivation $appFields["APP_DATA"] = $scriptTask->execScriptByActivityUid($nextDel["TAS_UID"], $appFields); //Create record in table APP_ASSIGN_SELF_SERVICE_VALUE - $arrayTaskTypeToExclude = array("SCRIPT-TASK"); + $regexpTaskTypeToExclude = "SCRIPT-TASK"; - if (!in_array($taskNextDel->getTasType(), $arrayTaskTypeToExclude)) { + if (!is_null($taskNextDel) && !preg_match("/^(?:" . $regexpTaskTypeToExclude . ")$/", $taskNextDel->getTasType())) { if ($taskNextDel->getTasAssignType() == "SELF_SERVICE" && trim($taskNextDel->getTasGroupVariable()) != "") { $nextTaskGroupVariable = trim($taskNextDel->getTasGroupVariable(), " @#"); @@ -780,7 +950,7 @@ class Derivation } //Check if $taskNextDel is Script-Task - if ($taskNextDel->getTasType() == "SCRIPT-TASK") { + if (!is_null($taskNextDel) && $taskNextDel->getTasType() == "SCRIPT-TASK") { $this->case->CloseCurrentDelegation($currentDelegation["APP_UID"], $iNewDelIndex); //Get for $nextDel["TAS_UID"] your next Task @@ -807,7 +977,11 @@ class Derivation } else { //when the task doesnt generate a new AppDelegation $iAppThreadIndex = $appFields['DEL_THREAD']; - switch ($currentDelegation['ROU_TYPE']) { + + $routeType = $currentDelegation["ROU_TYPE"]; + $routeType = ($flagTaskIsMultipleInstance && $flagTaskAssignTypeIsMultipleInstance)? "SEC-JOIN" : $routeType; + + switch ($routeType) { case 'SEC-JOIN': $this->case->closeAppThread( $currentDelegation['APP_UID'], $iAppThreadIndex ); break; @@ -816,74 +990,19 @@ class Derivation $this->case->closeAppThread( $currentDelegation['APP_UID'], $iAppThreadIndex ); } break; - } //switch + } } + break; } - //SETS THE APP_PROC_CODE - //if (isset($nextDel['TAS_DEF_PROC_CODE'])) - //$appFields['APP_PROC_CODE'] = $nextDel['TAS_DEF_PROC_CODE']; - /*----------------------------------********---------------------------------*/ - if ($nextDel['TAS_UID'] == '-2') { - $oRow = ApplicationPeer::retrieveByPK($appFields['APP_UID']); - $aFields = $oRow->toArray( BasePeer::TYPE_FIELDNAME ); - $users = new Users(); - if ($aFields['APP_STATUS'] == 'DRAFT') { - $users->refreshTotal($appFields['CURRENT_USER_UID'], 'remove', 'draft'); - } else { - $users->refreshTotal($appFields['CURRENT_USER_UID'], 'remove', 'inbox'); - } - } elseif ($nextDel['TAS_UID'] != '-1') { - $arrayTaskTypeToExclude = array("WEBENTRYEVENT", "END-MESSAGE-EVENT", "START-MESSAGE-EVENT", "INTERMEDIATE-THROW-MESSAGE-EVENT", "INTERMEDIATE-CATCH-MESSAGE-EVENT", "SCRIPT-TASK", "INTERMEDIATE-CATCH-TIMER-EVENT"); - - if (!in_array($taskNextDel->getTasType(), $arrayTaskTypeToExclude)) { - if (!empty($iNewDelIndex) && empty($aSP)) { - $oAppDel = AppDelegationPeer::retrieveByPK( $appFields['APP_UID'], $iNewDelIndex ); - $aFields = $oAppDel->toArray( BasePeer::TYPE_FIELDNAME ); - $aFields['APP_STATUS'] = $currentDelegation['APP_STATUS']; - $taskCur = TaskPeer::retrieveByPK($currentDelegation['TAS_UID']); - $aTaskCur = $taskCur->toArray( BasePeer::TYPE_FIELDNAME ); - if ($aTaskCur['TAS_TYPE'] == "INTERMEDIATE-CATCH-MESSAGE-EVENT") { - $removeList = false; - } - $aFields['REMOVED_LIST'] = $removeList; - $inbox = new ListInbox(); - $inbox->newRow($aFields, $appFields['CURRENT_USER_UID'], false, array(), ($nextDel['TAS_ASSIGN_TYPE'] == 'SELF_SERVICE' ? true : false)); - } else { - if (empty($aSP)) { - $oRow = ApplicationPeer::retrieveByPK($appFields['APP_UID']); - $aFields = $oRow->toArray( BasePeer::TYPE_FIELDNAME ); - $users = new Users(); - if ($aFields['APP_STATUS'] == 'DRAFT') { - $users->refreshTotal($appFields['CURRENT_USER_UID'], 'remove', 'draft'); - } else { - $users->refreshTotal($appFields['CURRENT_USER_UID'], 'remove', 'inbox'); - } - } - } - } else { - $arrayTaskTypeToExclude = array("SCRIPT-TASK"); - - if ($removeList && !in_array($taskNextDel->getTasType(), $arrayTaskTypeToExclude)) { - $oRow = ApplicationPeer::retrieveByPK($appFields["APP_UID"]); - $aFields = $oRow->toArray( BasePeer::TYPE_FIELDNAME ); - - $users = new Users(); - - if ($aFields["APP_STATUS"] == "DRAFT") { - $users->refreshTotal($appFields["CURRENT_USER_UID"], "remove", "draft"); - } else { - $users->refreshTotal($appFields["CURRENT_USER_UID"], "remove", "inbox"); - } - } - } + if ($flagUpdateCounters) { + $this->derivateUpdateCounters($currentDelegation, $nextDel, $taskNextDel, $appFields, (isset($iNewDelIndex))? $iNewDelIndex : 0, (isset($aSP))? $aSP : null, $removeList); } - /*----------------------------------********---------------------------------*/ - - unset( $aSP ); $removeList = false; - } //end foreach + + unset($aSP); + } /* Start Block : UPDATES APPLICATION */ @@ -893,7 +1012,7 @@ class Derivation $openThreads = $this->case->GetOpenThreads( $currentDelegation['APP_UID'] ); /////// - $sw = 0; + $flag = false; if ($openThreads == 0) { //Close case @@ -901,17 +1020,17 @@ class Derivation $appFields["APP_FINISH_DATE"] = "now"; $this->verifyIsCaseChild($currentDelegation["APP_UID"], $currentDelegation["DEL_INDEX"]); - $sw = 1; + $flag = true; } if (isset( $iNewDelIndex )) { $appFields["DEL_INDEX"] = $iNewDelIndex; $appFields["TAS_UID"] = $nextDel["TAS_UID"]; - $sw = 1; + $flag = true; } - if ($sw == 1) { + if ($flag) { //Start Block : UPDATES APPLICATION $this->case->updateCase( $currentDelegation["APP_UID"], $appFields ); //End Block : UPDATES APPLICATION diff --git a/workflow/engine/classes/class.plugin.php b/workflow/engine/classes/class.plugin.php index 07484c17a..6bf6c57ff 100755 --- a/workflow/engine/classes/class.plugin.php +++ b/workflow/engine/classes/class.plugin.php @@ -379,6 +379,17 @@ class PMPlugin $oPluginRegistry =& PMPluginRegistry::getSingleton(); $oPluginRegistry->enableRestService($this->sNamespace, $enable); } + + /** + * With this function we can register new options to designer menu + * param string $menuOptionsFile + * @return void + */ + public function registerDesignerNewOption($menuOptionsFile) + { + $oPluginRegistry =& PMPluginRegistry::getSingleton(); + $oPluginRegistry->registerDesignerNewOption($this->sNamespace, $menuOptionsFile); + } } class menuDetail @@ -718,3 +729,21 @@ class cronFile $this->cronFile = $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 b62e6c6e2..eb1d956c8 100755 --- a/workflow/engine/classes/class.pluginRegistry.php +++ b/workflow/engine/classes/class.pluginRegistry.php @@ -101,6 +101,7 @@ class PMPluginRegistry private $_aTaskExtendedProperties = array (); private $_aDashboardPages = array (); private $_aCronFiles = array (); + private $_aDesignerMenuFiles = array (); /** * Registry a plugin javascript to include with js core at same runtime @@ -391,6 +392,11 @@ class PMPluginRegistry unset( $this->_aDashboardPages[$key] ); } } + foreach ($this->_aDesignerMenuFiles as $key => $detail) { + if ($detail->namespace == $sNamespace) { + unset( $this->_aDesignerMenuFiles[$key] ); + } + } //unregistering javascripts from this plugin $this->unregisterJavascripts( $sNamespace ); @@ -1601,4 +1607,35 @@ class PMPluginRegistry throw $e; } } + + /** + * Register new options to designer menu + * + * @param unknown_type $namespace + * @param unknown_type $cronFile + */ + public function registerDesignerNewOption ($namespace, $menuOptionFile) + { + $found = false; + foreach ($this->_aDesignerMenuFiles as $row => $detail) { + if ($menuOptionFile == $detail->menuOptionFile && $namespace == $detail->namespace) { + $detail->menuOptionFile = $menuOptionFile; + $found = true; + } + } + if (!$found) { + $menuOptionFile = new menuOptionFile( $namespace, $menuOptionFile ); + $this->_aDesignerMenuFiles[] = $menuOptionFile; + } + } + + /** + * Return all designer menu Option files registered + * + * @return array + */ + public function getDesignerNewOption() + { + return $this->_aDesignerMenuFiles; + } } diff --git a/workflow/engine/classes/class.pmDynaform.php b/workflow/engine/classes/class.pmDynaform.php index 37ebb6045..77caa227a 100644 --- a/workflow/engine/classes/class.pmDynaform.php +++ b/workflow/engine/classes/class.pmDynaform.php @@ -182,7 +182,7 @@ class pmDynaform array_push($json->optionsSql, $option); } } catch (Exception $e) { - + } } if (isset($json->options[0])) { @@ -475,6 +475,55 @@ class pmDynaform exit(); } + public function printEditSupervisor() + { + ob_clean(); + + $json = G::json_decode($this->record["DYN_CONTENT"]); + $this->jsonr($json); + + $msg = ""; + + if (isset($_SESSION["G_MESSAGE_TYPE"]) && isset($_SESSION["G_MESSAGE"])) { + $msg = "
" . G::LoadTranslation("ID_INFO") . ": " . $_SESSION["G_MESSAGE"] . "
"; + + unset($_SESSION["G_MESSAGE_TYPE"]); + unset($_SESSION["G_MESSAGE"]); + } + + $javascrip = " + + + + +
+ $msg +
+ +
+
+ "; + + $file = file_get_contents(PATH_HOME . "public_html" . PATH_SEP . "lib" . PATH_SEP . "pmdynaform" . PATH_SEP . "build" . PATH_SEP . "pmdynaform.html"); + $file = str_replace("{javascript}", $javascrip, $file); + + echo $file; + exit(0); + } + public function printWebEntry($filename) { ob_clean(); @@ -967,3 +1016,4 @@ class pmDynaform } } + diff --git a/workflow/engine/classes/class.pmFunctions.php b/workflow/engine/classes/class.pmFunctions.php index 51bbdbcc6..39749d52f 100755 --- a/workflow/engine/classes/class.pmFunctions.php +++ b/workflow/engine/classes/class.pmFunctions.php @@ -1409,7 +1409,7 @@ function WSUnpauseCase ($caseUid, $delIndex, $userUid) * * Add a case note. * - * @name WSAddACaseNote + * @name WSAddCaseNote * @label WS Add a case note * @link http://wiki.processmaker.com/index.php/ProcessMaker_Functions#WSAddCaseNote.28.29 * @@ -1546,7 +1546,7 @@ function PMFUserList () //its test was successfull * * Add an Input Document. * - * @name PMFAddAnInputDocument + * @name PMFAddInputDocument * @label PMF Add an input document * @link http://wiki.processmaker.com/index.php/ProcessMaker_Functions#PMFAddInputDocument.28.29 * @@ -2780,7 +2780,7 @@ function PMFUnpauseCase ($caseUid, $delIndex, $userUid) * * Add a case note. * - * @name PMFAddACaseNote + * @name PMFAddCaseNote * @label PMF Add a case note * @link http://wiki.processmaker.com/index.php/ProcessMaker_Functions#PMFAddCaseNote.28.29 * diff --git a/workflow/engine/classes/class.reportTables.php b/workflow/engine/classes/class.reportTables.php index 562734812..657a4797b 100755 --- a/workflow/engine/classes/class.reportTables.php +++ b/workflow/engine/classes/class.reportTables.php @@ -240,7 +240,7 @@ class ReportTables if (! isset( $aData[$aField['sFieldName']] )) { $aData[$aField['sFieldName']] = ''; } - $sQuery .= ",'" . (isset( $aData[$aField['sFieldName']] ) ? mysql_real_escape_string( $aData[$aField['sFieldName']] ) : '') . "'"; + $sQuery .= ",'" . (isset( $aData[$aField['sFieldName']] ) ? @mysql_real_escape_string( $aData[$aField['sFieldName']] ) : '') . "'"; break; case 'date': $value = (isset( $aData[$aField['sFieldName']] ) && trim( $aData[$aField['sFieldName']] )) != '' ? "'" . $aData[$aField['sFieldName']] . "'" : 'NULL'; @@ -599,12 +599,15 @@ class ReportTables case 'text': if (! isset( $aFields[$aField['sFieldName']] )) { $aFields[$aField['sFieldName']] = ''; - } - + } if(is_array($aFields[$aField['sFieldName']])){ $sQuery .= "'" . (isset( $aFields[$aField['sFieldName']] ) ? $aFields[$aField['sFieldName']][0] : '') . "',"; }else{ - $sQuery .= "'" . (isset( $aFields[$aField['sFieldName']] ) ? @mysql_real_escape_string( $aFields[$aField['sFieldName']] ) : '') . "',"; + if($aFields[$aField['sFieldName']] == $aFields[$aField['sFieldName'].'_label']){ + $sQuery .= "'" . (isset( $aFields[$aField['sFieldName']] ) ? @mysql_real_escape_string( $aFields[$aField['sFieldName']] ) : '') . "',"; + }else{ + $sQuery .= "'" . (isset( $aFields[$aField['sFieldName']] ) ? @mysql_real_escape_string( $aFields[$aField['sFieldName'].'_label'] ) : '') . "',"; + } } break; case 'date': diff --git a/workflow/engine/classes/model/Language.php b/workflow/engine/classes/model/Language.php index c171e99c0..9a275bc7b 100755 --- a/workflow/engine/classes/model/Language.php +++ b/workflow/engine/classes/model/Language.php @@ -129,6 +129,21 @@ class Language extends BaseLanguage public function import ($sLanguageFile, $updateXml = true, $updateDB = true, $generateMafe = true) { try { + + //get labels MichelangeloFE + try { + $oTranslation = new Translation(); + $MichelangeloFE = PATH_HOME . "../workflow/public_html/lib/js"; + if (file_exists($MichelangeloFE)) { + $labels = self::readLabelsDirectory($MichelangeloFE, true); + foreach ($labels as $label) { + $oTranslation->addTranslation('LABEL', 'ID_MAFE_' . G::encryptOld($label), 'en', $label); + } + } + } catch (Exception $e) { + error_log($e->getMessage()); + } + G::LoadSystem( 'i18n_po' ); $POFile = new i18n_PO( $sLanguageFile ); $POFile->readInit(); @@ -297,8 +312,8 @@ class Language extends BaseLanguage try { $oTranslation = new Translation(); $MichelangeloFE = PATH_HOME . "../workflow/public_html/lib/js"; - if ($_GET['LOCALE'] === "en" & file_exists($MichelangeloFE)) { - $labels = $this->readLabelsDirectory($MichelangeloFE, true); + if (file_exists($MichelangeloFE)) { + $labels = self::readLabelsDirectory($MichelangeloFE, true); foreach ($labels as $label) { $oTranslation->addTranslation('LABEL', 'ID_MAFE_' . G::encryptOld($label), 'en', $label); } @@ -824,23 +839,23 @@ class Language extends BaseLanguage } } - public function readLabelsDirectory($path, $unique = false) + public static function readLabelsDirectory($path, $unique = false) { $labels = array(); $items = opendir($path); while (false !== ($item = readdir($items))) { $a = $path . "/" . $item; if ($item !== "." && $item !== ".." && is_dir($a)) { - $labels = array_merge($labels, $this->readLabelsDirectory($a, false)); + $labels = array_merge($labels, self::readLabelsDirectory($a, false)); } if (is_file($a)) { $info = pathinfo($a); if ($info["extension"] === "js" || $info["extension"] === "JS") { $file = file_get_contents($a); //search string 'xx\'xx\'xx'.translate() - $labels = array_merge($labels, $this->readLabelsFile($file, "'")); + $labels = array_merge($labels, self::readLabelsFile($file, "'")); //search string "xx\"xx\"xx".translate() - $labels = array_merge($labels, $this->readLabelsFile($file, "\"")); + $labels = array_merge($labels, self::readLabelsFile($file, "\"")); } } } @@ -851,7 +866,7 @@ class Language extends BaseLanguage return $labels; } - public function readLabelsFile($file, $sep) + public static function readLabelsFile($file, $sep) { $labels = array(); $k = 0; diff --git a/workflow/engine/classes/model/ListInbox.php b/workflow/engine/classes/model/ListInbox.php index f3215e7ca..f010d34f7 100644 --- a/workflow/engine/classes/model/ListInbox.php +++ b/workflow/engine/classes/model/ListInbox.php @@ -121,7 +121,9 @@ class ListInbox extends BaseListInbox $users->refreshTotal($data['USR_UID'], 'add', 'participated'); } - $data['DEL_PRIORITY'] = $this->getTaskPriority($data['TAS_UID'], $data['PRO_UID'], $data["APP_UID"]); + if((array_key_exists('TAS_UID', $data) && isset($data['TAS_UID'])) && (array_key_exists('TAS_UID', $data) && isset($data['PRO_UID'])) && isset($data['APP_UID'])) { + $data['DEL_PRIORITY'] = $this->getTaskPriority($data['TAS_UID'], $data['PRO_UID'], $data["APP_UID"]); + } $con = Propel::getConnection( ListInboxPeer::DATABASE_NAME ); try { diff --git a/workflow/engine/classes/model/Users.php b/workflow/engine/classes/model/Users.php index e956d7d90..07f1c8393 100755 --- a/workflow/engine/classes/model/Users.php +++ b/workflow/engine/classes/model/Users.php @@ -103,6 +103,31 @@ class Users extends BaseUsers } } + public function loadByEmail ($sUsrEmail) + { + $c = new Criteria( 'workflow' ); + + $c->clearSelectColumns(); + $c->addSelectColumn( UsersPeer::USR_UID ); + $c->addSelectColumn( UsersPeer::USR_USERNAME ); + $c->addSelectColumn( UsersPeer::USR_STATUS ); + $c->addSelectColumn( UsersPeer::USR_FIRSTNAME ); + $c->addSelectColumn( UsersPeer::USR_LASTNAME ); + + $c->add( UsersPeer::USR_EMAIL, $sUsrEmail ); + return $c; + } + + public function loadByUserEmailInArray ($sUsrEmail) + { + $c = $this->loadByEmail( $sUsrEmail ); + $rs = UsersPeer::doSelectRS( $c, Propel::getDbConnection('workflow_ro') ); + $rs->setFetchmode( ResultSet::FETCHMODE_ASSOC ); + $rs->next(); + $row = $rs->getRow(); + return $row; + } + public function loadDetails ($UsrUid) { try { diff --git a/workflow/engine/classes/model/map/TaskMapBuilder.php b/workflow/engine/classes/model/map/TaskMapBuilder.php index ed4b783d5..44a3eb00e 100755 --- a/workflow/engine/classes/model/map/TaskMapBuilder.php +++ b/workflow/engine/classes/model/map/TaskMapBuilder.php @@ -165,7 +165,7 @@ class TaskMapBuilder $tMap->addValidator('TAS_ALERT', 'validValues', 'propel.validator.ValidValuesValidator', 'TRUE|FALSE', 'Please select a valid value for TAS_ALERT.'); - $tMap->addValidator('TAS_ASSIGN_TYPE', 'validValues', 'propel.validator.ValidValuesValidator', 'BALANCED|MANUAL|EVALUATE|REPORT_TO|SELF_SERVICE|STATIC_MI|CANCEL_MI', 'Please select a valid value for TAS_ASSIGN_TYPE.'); + $tMap->addValidator('TAS_ASSIGN_TYPE', 'validValues', 'propel.validator.ValidValuesValidator', 'BALANCED|MANUAL|EVALUATE|REPORT_TO|SELF_SERVICE|STATIC_MI|CANCEL_MI|MULTIPLE_INSTANCE|MULTIPLE_INSTANCE_VALUE_BASED', 'Please set a valid value for TAS_ASSIGN_TYPE'); $tMap->addValidator('TAS_ASSIGN_LOCATION', 'validValues', 'propel.validator.ValidValuesValidator', 'TRUE|FALSE', 'Please select a valid value for TAS_ASSIGN_LOCATION.'); diff --git a/workflow/engine/content/translations/english/processmaker.en.po b/workflow/engine/content/translations/english/processmaker.en.po index a5539eb20..2d9e4117d 100644 --- a/workflow/engine/content/translations/english/processmaker.en.po +++ b/workflow/engine/content/translations/english/processmaker.en.po @@ -2,7 +2,7 @@ msgid "" msgstr "" "Project-Id-Version: ProcessMaker 3.0\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2015-08-18 12:18:18\n" +"PO-Revision-Date: 2015-09-15 15:08:19\n" "Last-Translator: \n" "Language-Team: Colosa Developers Team \n" "MIME-Version: 1.0\n" @@ -12880,8 +12880,8 @@ msgstr "Database already exists, check \"Delete Databases if exists\" to overwri # TRANSLATION # LABEL/ID_USER_PROCESS_NOT_START #: LABEL/ID_USER_PROCESS_NOT_START -msgid "User can not start process" -msgstr "User can not start process" +msgid "You don't have processes to start..." +msgstr "You don't have processes to start..." # TRANSLATION # LABEL/ID_REQUEST_ACTION_NOT_EXIST @@ -19369,12 +19369,6 @@ msgstr "Lane" msgid "[LABEL/ID_MAFE_03937134cedab9078be39a77ee3a48a0] Group" msgstr "Group" -# TRANSLATION -# LABEL/ID_MAFE_7215ee9c7d9dc229d2921a40e899ec5f -#: LABEL/ID_MAFE_7215ee9c7d9dc229d2921a40e899ec5f -msgid "[LABEL/ID_MAFE_7215ee9c7d9dc229d2921a40e899ec5f] " -msgstr "" - # TRANSLATION # LABEL/ID_MAFE_5308fcbb3c60d1cb24e45795bf9a0b7e #: LABEL/ID_MAFE_5308fcbb3c60d1cb24e45795bf9a0b7e @@ -24262,8 +24256,8 @@ msgstr "New BPMN Project" # TRANSLATION # LABEL/ID_ROUTE_TO_TASK_SCRIPT_TASK #: LABEL/ID_ROUTE_TO_TASK_SCRIPT_TASK -msgid "The following task will execute a script automatically and then it will continue with the workflow" -msgstr "The following task will execute a script automatically and then it will continue with the workflow" +msgid "The following case is a \"Script-Task\"" +msgstr "The following case is a \"Script-Task\"" # TRANSLATION # LABEL/ID_MAFE_0d82790b0612935992bd564a17ce37d6 @@ -24361,6 +24355,1746 @@ msgstr "Select an element in the designer to display the quick toolbar with the msgid "In the design area you can drop the process elements and order or arrange them to design your process." msgstr "In the design area you can drop the process elements and order or arrange them to design your process." +# TRANSLATION +# LABEL/ID_ACTIVITY_INVALID_ASSIGNMENT_METHOD_FOR_MULTIPLE_INSTANCE_ACTIVITY +#: LABEL/ID_ACTIVITY_INVALID_ASSIGNMENT_METHOD_FOR_MULTIPLE_INSTANCE_ACTIVITY +msgid "The activity {0}: \"{1}\", has an invalid assignment method for a multi-instance activity" +msgstr "The activity {0}: \"{1}\", has an invalid assignment method for a multi-instance activity" + +# TRANSLATION +# LABEL/ID_ACTIVITY_INVALID_ASSIGNMENT_METHOD_FOR_ACTIVITY +#: LABEL/ID_ACTIVITY_INVALID_ASSIGNMENT_METHOD_FOR_ACTIVITY +msgid "The activity {0}: \"{1}\", has an invalid assignment method for an activity" +msgstr "The activity {0}: \"{1}\", has an invalid assignment method for an activity" + +# TRANSLATION +# LABEL/ID_ACTIVITY_INVALID_USER_DATA_VARIABLE_FOR_MULTIPLE_INSTANCE_ACTIVITY +#: LABEL/ID_ACTIVITY_INVALID_USER_DATA_VARIABLE_FOR_MULTIPLE_INSTANCE_ACTIVITY +msgid "The activity {0}: \"{1}\", has an invalid user-data in \"{2}\" or this variable doesn't exist for a multi-instance activity" +msgstr "The activity {0}: \"{1}\", has an invalid user-data in \"{2}\" or this variable doesn't exist for a multi-instance activity" + +# TRANSLATION +# LABEL/ID_CASE_USER_INVALID_CANCEL_CASE +#: LABEL/ID_CASE_USER_INVALID_CANCEL_CASE +msgid "The user with \"{0}\" is invalid to cancel the Case." +msgstr "The user with \"{0}\" is invalid to cancel the Case." + +# TRANSLATION +# LABEL/ID_CASE_USER_NOT_HAVE_PERMISSION +#: LABEL/ID_CASE_USER_NOT_HAVE_PERMISSION +msgid "The user with \"{0}\" did not have permission to perform this action." +msgstr "The user with \"{0}\" did not have permission to perform this action." + +# TRANSLATION +# LABEL/ID_EMAIL_MORE_THAN_ONE_USER +#: LABEL/ID_EMAIL_MORE_THAN_ONE_USER +msgid "This email is assigned to more than one user. Please contact your administrator." +msgstr "This email is assigned to more than one user. Please contact your administrator." + +# TRANSLATION +# LABEL/ID_USER_DOES_NOT_CORRESPOND +#: LABEL/ID_USER_DOES_NOT_CORRESPOND +msgid "Wrong authentication. This user does not correspond with the email address." +msgstr "Wrong authentication. This user does not correspond with the email address." + +# TRANSLATION +# LABEL/ID_NO_LICESE_FEATURE_ENABLED +#: LABEL/ID_NO_LICESE_FEATURE_ENABLED +msgid "Your license does not have the Gmail integration. Please contact your administrator." +msgstr "Your license does not have the Gmail integration. Please contact your administrator." + +# TRANSLATION +# LABEL/ID_USER_NOT_ACTIVE +#: LABEL/ID_USER_NOT_ACTIVE +msgid "The user is not active." +msgstr "The user is not active." + +# TRANSLATION +# LABEL/ID_MAFE_b776b96aded5145322e09111013ef8c5 +#: LABEL/ID_MAFE_b776b96aded5145322e09111013ef8c5 +msgid "Invalid connection type" +msgstr "Invalid connection type" + +# TRANSLATION +# LABEL/ID_MAFE_89d626523f83c2d1f8a5549a845dd6aa +#: LABEL/ID_MAFE_89d626523f83c2d1f8a5549a845dd6aa +msgid "Start Event must have an outgoing sequence flow" +msgstr "Start Event must have an outgoing sequence flow" + +# TRANSLATION +# LABEL/ID_MAFE_d4bff85814308aca1cfde4b977872550 +#: LABEL/ID_MAFE_d4bff85814308aca1cfde4b977872550 +msgid "Start Event must not have an incommig sequence flow" +msgstr "Start Event must not have an incommig sequence flow" + +# TRANSLATION +# LABEL/ID_MAFE_98611a4ed602dfc4087f66ce54c1e9a8 +#: LABEL/ID_MAFE_98611a4ed602dfc4087f66ce54c1e9a8 +msgid "Activity must have an incoming sequence flow" +msgstr "Activity must have an incoming sequence flow" + +# TRANSLATION +# LABEL/ID_MAFE_e47eb6970857d9b170bb3691a0dad2f4 +#: LABEL/ID_MAFE_e47eb6970857d9b170bb3691a0dad2f4 +msgid "Activity must have an outgoing sequence flow" +msgstr "Activity must have an outgoing sequence flow" + +# TRANSLATION +# LABEL/ID_MAFE_9925fd3c9d09e862da22c5d6912420d9 +#: LABEL/ID_MAFE_9925fd3c9d09e862da22c5d6912420d9 +msgid "End event must have an incoming sequence flow" +msgstr "End event must have an incoming sequence flow" + +# TRANSLATION +# LABEL/ID_MAFE_5910b8ede1c0dbd5b10052355e3df260 +#: LABEL/ID_MAFE_5910b8ede1c0dbd5b10052355e3df260 +msgid "End Event must have an outgoing sequence flow" +msgstr "End Event must have an outgoing sequence flow" + +# TRANSLATION +# LABEL/ID_MAFE_a6b0e9c61c3697c11f9b170be6df20cb +#: LABEL/ID_MAFE_a6b0e9c61c3697c11f9b170be6df20cb +msgid "Intermediate event must have an incoming sequence flow" +msgstr "Intermediate event must have an incoming sequence flow" + +# TRANSLATION +# LABEL/ID_MAFE_88ee153347bd5d42dcf24dec1f78080b +#: LABEL/ID_MAFE_88ee153347bd5d42dcf24dec1f78080b +msgid "Intermediate event must have an outgoing sequence flow" +msgstr "Intermediate event must have an outgoing sequence flow" + +# TRANSLATION +# LABEL/ID_MAFE_76d5c10546065f2b71f8d0bfd242ebf5 +#: LABEL/ID_MAFE_76d5c10546065f2b71f8d0bfd242ebf5 +msgid "Diverging Gateway must have an incoming sequence flow" +msgstr "Diverging Gateway must have an incoming sequence flow" + +# TRANSLATION +# LABEL/ID_MAFE_157b53019e903b82b3b34209dbb26b21 +#: LABEL/ID_MAFE_157b53019e903b82b3b34209dbb26b21 +msgid "Converging Gateway must have two or more incoming sequence flow" +msgstr "Converging Gateway must have two or more incoming sequence flow" + +# TRANSLATION +# LABEL/ID_MAFE_1586e418c08ebe156f39e9fa02504a7c +#: LABEL/ID_MAFE_1586e418c08ebe156f39e9fa02504a7c +msgid "Diverging Gateway must have two or more outgoing sequence flow" +msgstr "Diverging Gateway must have two or more outgoing sequence flow" + +# TRANSLATION +# LABEL/ID_MAFE_a9ef06d9637b09f171953304372d9bd8 +#: LABEL/ID_MAFE_a9ef06d9637b09f171953304372d9bd8 +msgid "Converging Gateway must have a outgoing sequence flow" +msgstr "Converging Gateway must have a outgoing sequence flow" + +# TRANSLATION +# LABEL/ID_MAFE_1baadae520fd9733943b6ae58b198e3f +#: LABEL/ID_MAFE_1baadae520fd9733943b6ae58b198e3f +msgid "Black box pool must not have an incoming sequence flow" +msgstr "Black box pool must not have an incoming sequence flow" + +# TRANSLATION +# LABEL/ID_MAFE_c7fb228a7d20de930f9d4ecfeac63cda +#: LABEL/ID_MAFE_c7fb228a7d20de930f9d4ecfeac63cda +msgid "Black box pool must not have an outgoing sequence flow" +msgstr "Black box pool must not have an outgoing sequence flow" + +# TRANSLATION +# LABEL/ID_MAFE_a4ecfc70574394990cf17bd83df499f7 +#: LABEL/ID_MAFE_a4ecfc70574394990cf17bd83df499f7 +msgid "Event" +msgstr "Event" + +# TRANSLATION +# LABEL/ID_MAFE_9cd75a090ed78909e6b9f4311a31e46f +#: LABEL/ID_MAFE_9cd75a090ed78909e6b9f4311a31e46f +msgid "Intermediate Event" +msgstr "Intermediate Event" + +# TRANSLATION +# LABEL/ID_MAFE_0015b7e51c1ca4293041c429985ca323 +#: LABEL/ID_MAFE_0015b7e51c1ca4293041c429985ca323 +msgid "The specified subform could not be found in the process." +msgstr "The specified subform could not be found in the process." + +# TRANSLATION +# LABEL/ID_MAFE_599dcce2998a6b40b1e38e8c6006cb0a +#: LABEL/ID_MAFE_599dcce2998a6b40b1e38e8c6006cb0a +msgid "type" +msgstr "type" + +# TRANSLATION +# LABEL/ID_MAFE_b80bb7740288fda1f201890375a60c8f +#: LABEL/ID_MAFE_b80bb7740288fda1f201890375a60c8f +msgid "id" +msgstr "id" + +# TRANSLATION +# LABEL/ID_MAFE_b068931cc450442b63f5b3d276ea4297 +#: LABEL/ID_MAFE_b068931cc450442b63f5b3d276ea4297 +msgid "name" +msgstr "name" + +# TRANSLATION +# LABEL/ID_MAFE_67daf92c833c41c95db874e18fcb2786 +#: LABEL/ID_MAFE_67daf92c833c41c95db874e18fcb2786 +msgid "description" +msgstr "description" + +# TRANSLATION +# LABEL/ID_MAFE_6a99c575ab87f8c7d1ed1e52e7e349ce +#: LABEL/ID_MAFE_6a99c575ab87f8c7d1ed1e52e7e349ce +msgid "placeholder" +msgstr "placeholder" + +# TRANSLATION +# LABEL/ID_MAFE_75a7511c1d369ec0a4b82d76b1627a36 +#: LABEL/ID_MAFE_75a7511c1d369ec0a4b82d76b1627a36 +msgid "col-span" +msgstr "col-span" + +# TRANSLATION +# LABEL/ID_MAFE_cbf3543f93135ddeb0fbe1b2f822799d +#: LABEL/ID_MAFE_cbf3543f93135ddeb0fbe1b2f822799d +msgid "Colspan is used to define the size and number of columns of a selected row. Twelve columns can be defined as maximum." +msgstr "Colspan is used to define the size and number of columns of a selected row. Twelve columns can be defined as maximum." + +# TRANSLATION +# LABEL/ID_MAFE_c4cdd5e672b274b476f4760a304445ba +#: LABEL/ID_MAFE_c4cdd5e672b274b476f4760a304445ba +msgid "The column sizes are defined with integer numbers separated by spaces. Any combination of column sizes can be defined but all the columns sizes should add 12.
" +msgstr "The column sizes are defined with integer numbers separated by spaces. Any combination of column sizes can be defined but all the columns sizes should add 12.
" + +# TRANSLATION +# LABEL/ID_MAFE_a466673aa0487e479c2603e855eb431c +#: LABEL/ID_MAFE_a466673aa0487e479c2603e855eb431c +msgid "For a better design we recommend using values above 3.
If you need more info please visit Bootstrap grid system." +msgstr "For a better design we recommend using values above 3.
If you need more info please visit Bootstrap grid system." + +# TRANSLATION +# LABEL/ID_MAFE_e8fab833730f3a939d0b3812fe043b5d +#: LABEL/ID_MAFE_e8fab833730f3a939d0b3812fe043b5d +msgid "href" +msgstr "href" + +# TRANSLATION +# LABEL/ID_MAFE_ee2faeed038501c1deab01c7b54f2fa9 +#: LABEL/ID_MAFE_ee2faeed038501c1deab01c7b54f2fa9 +msgid "hint" +msgstr "hint" + +# TRANSLATION +# LABEL/ID_MAFE_25d902c24283ab8cfbac54dfa101ad31 +#: LABEL/ID_MAFE_25d902c24283ab8cfbac54dfa101ad31 +msgid "src" +msgstr "src" + +# TRANSLATION +# LABEL/ID_MAFE_8c73a98a300905900337f535531dfca6 +#: LABEL/ID_MAFE_8c73a98a300905900337f535531dfca6 +msgid "shape" +msgstr "shape" + +# TRANSLATION +# LABEL/ID_MAFE_951d4dff3c22e9fcc4a2707009f45ea8 +#: LABEL/ID_MAFE_951d4dff3c22e9fcc4a2707009f45ea8 +msgid "thumbnail" +msgstr "thumbnail" + +# TRANSLATION +# LABEL/ID_MAFE_990fcd0ba3c5c9e322c930c83a93be48 +#: LABEL/ID_MAFE_990fcd0ba3c5c9e322c930c83a93be48 +msgid "rounded" +msgstr "rounded" + +# TRANSLATION +# LABEL/ID_MAFE_9b6ddeba5b33e577c07c35d8505c6072 +#: LABEL/ID_MAFE_9b6ddeba5b33e577c07c35d8505c6072 +msgid "circle" +msgstr "circle" + +# TRANSLATION +# LABEL/ID_MAFE_20835b49593bbf08bdbbfdc6203fc51d +#: LABEL/ID_MAFE_20835b49593bbf08bdbbfdc6203fc51d +msgid "alternate text" +msgstr "alternate text" + +# TRANSLATION +# LABEL/ID_MAFE_06d4cd63bde972fc66a0aed41d2f5c51 +#: LABEL/ID_MAFE_06d4cd63bde972fc66a0aed41d2f5c51 +msgid "comment" +msgstr "comment" + +# TRANSLATION +# LABEL/ID_MAFE_ac67ede5a84eb5a1add7ff4440e9a485 +#: LABEL/ID_MAFE_ac67ede5a84eb5a1add7ff4440e9a485 +msgid "required" +msgstr "required" + +# TRANSLATION +# LABEL/ID_MAFE_27d508156505dccd6d8df988982031f7 +#: LABEL/ID_MAFE_27d508156505dccd6d8df988982031f7 +msgid "drag & drop" +msgstr "drag & drop" + +# TRANSLATION +# LABEL/ID_MAFE_1ce4fd7b116c43c936cc8ddbaa51ce99 +#: LABEL/ID_MAFE_1ce4fd7b116c43c936cc8ddbaa51ce99 +msgid "file extensions" +msgstr "file extensions" + +# TRANSLATION +# LABEL/ID_MAFE_f7bd60b75b29d79b660a2859395c1a24 +#: LABEL/ID_MAFE_f7bd60b75b29d79b660a2859395c1a24 +msgid "size" +msgstr "size" + +# TRANSLATION +# LABEL/ID_MAFE_5316b46ed7c677741a6bd60627a2a05c +#: LABEL/ID_MAFE_5316b46ed7c677741a6bd60627a2a05c +msgid "size unity" +msgstr "size unity" + +# TRANSLATION +# LABEL/ID_MAFE_54ca84a794888fe8d92834787dfa935a +#: LABEL/ID_MAFE_54ca84a794888fe8d92834787dfa935a +msgid "[LABEL/ID_MAFE_54ca84a794888fe8d92834787dfa935a] columns" +msgstr "columns" + +# TRANSLATION +# LABEL/ID_MAFE_8d777f385d3dfec8815d20f7496026dc +#: LABEL/ID_MAFE_8d777f385d3dfec8815d20f7496026dc +msgid "data" +msgstr "data" + +# TRANSLATION +# LABEL/ID_MAFE_1443a7220ce58bf7476b59728760e6f7 +#: LABEL/ID_MAFE_1443a7220ce58bf7476b59728760e6f7 +msgid "data type" +msgstr "data type" + +# TRANSLATION +# LABEL/ID_MAFE_2063c1608d6e0baf80249c42e2be5804 +#: LABEL/ID_MAFE_2063c1608d6e0baf80249c42e2be5804 +msgid "value" +msgstr "value" + +# TRANSLATION +# LABEL/ID_MAFE_313af772d92d01300d5e89512cd93bd0 +#: LABEL/ID_MAFE_313af772d92d01300d5e89512cd93bd0 +msgid "default value" +msgstr "default value" + +# TRANSLATION +# LABEL/ID_MAFE_a6ce2340cef46384d71cb790606e9c67 +#: LABEL/ID_MAFE_a6ce2340cef46384d71cb790606e9c67 +msgid "text transform to" +msgstr "text transform to" + +# TRANSLATION +# LABEL/ID_MAFE_334c4a4c42fdb79d7ebc3e73b517e6f8 +#: LABEL/ID_MAFE_334c4a4c42fdb79d7ebc3e73b517e6f8 +msgid "none" +msgstr "none" + +# TRANSLATION +# LABEL/ID_MAFE_f82413ecc07fb74bf40ccfe963a5c4b6 +#: LABEL/ID_MAFE_f82413ecc07fb74bf40ccfe963a5c4b6 +msgid "lowercase" +msgstr "lowercase" + +# TRANSLATION +# LABEL/ID_MAFE_6e5f5bbf51336918feac69b89e96f6e7 +#: LABEL/ID_MAFE_6e5f5bbf51336918feac69b89e96f6e7 +msgid "UPPERCASE" +msgstr "UPPERCASE" + +# TRANSLATION +# LABEL/ID_MAFE_4ba21d7a3d8a97aa04e405f9caf3ab3b +#: LABEL/ID_MAFE_4ba21d7a3d8a97aa04e405f9caf3ab3b +msgid "Capitalize phrase" +msgstr "Capitalize phrase" + +# TRANSLATION +# LABEL/ID_MAFE_3b313f1e720672161bfa924e023cf015 +#: LABEL/ID_MAFE_3b313f1e720672161bfa924e023cf015 +msgid "Title Case" +msgstr "Title Case" + +# TRANSLATION +# LABEL/ID_MAFE_f9ab05454998236921a6b0e281fae632 +#: LABEL/ID_MAFE_f9ab05454998236921a6b0e281fae632 +msgid "validate" +msgstr "validate" + +# TRANSLATION +# LABEL/ID_MAFE_657f8b8da628ef83cf69101b6817150a +#: LABEL/ID_MAFE_657f8b8da628ef83cf69101b6817150a +msgid "help" +msgstr "help" + +# TRANSLATION +# LABEL/ID_MAFE_c5bbc13af6039ac4cf215911e482b5d4 +#: LABEL/ID_MAFE_c5bbc13af6039ac4cf215911e482b5d4 +msgid "error message" +msgstr "error message" + +# TRANSLATION +# LABEL/ID_MAFE_4bf9bb3c160bb69f441724d81671fd72 +#: LABEL/ID_MAFE_4bf9bb3c160bb69f441724d81671fd72 +msgid "max length" +msgstr "max length" + +# TRANSLATION +# LABEL/ID_MAFE_35be2c1cf2cc489bdb16b678cd73cd78 +#: LABEL/ID_MAFE_35be2c1cf2cc489bdb16b678cd73cd78 +msgid "formula" +msgstr "formula" + +# TRANSLATION +# LABEL/ID_MAFE_916a154243f0a90150198e6fba099305 +#: LABEL/ID_MAFE_916a154243f0a90150198e6fba099305 +msgid "edit..." +msgstr "edit..." + +# TRANSLATION +# LABEL/ID_MAFE_15d61712450a686a7f365adf4fef581f +#: LABEL/ID_MAFE_15d61712450a686a7f365adf4fef581f +msgid "mode" +msgstr "mode" + +# TRANSLATION +# LABEL/ID_MAFE_d0e45878043844ffc41aac437e86b602 +#: LABEL/ID_MAFE_d0e45878043844ffc41aac437e86b602 +msgid "parent" +msgstr "parent" + +# TRANSLATION +# LABEL/ID_MAFE_de95b43bceeb4b998aed4aed5cef1ae7 +#: LABEL/ID_MAFE_de95b43bceeb4b998aed4aed5cef1ae7 +msgid "edit" +msgstr "edit" + +# TRANSLATION +# LABEL/ID_MAFE_1bda80f2be4d3658e0baa43fbe7ae8c1 +#: LABEL/ID_MAFE_1bda80f2be4d3658e0baa43fbe7ae8c1 +msgid "view" +msgstr "view" + +# TRANSLATION +# LABEL/ID_MAFE_a22ab4f79904355ae25dfa5afff1dc3b +#: LABEL/ID_MAFE_a22ab4f79904355ae25dfa5afff1dc3b +msgid "Select the mode of the control:
" +msgstr "Select the mode of the control:
" + +# TRANSLATION +# LABEL/ID_MAFE_9f1658da12738ea1b34318bd8258181b +#: LABEL/ID_MAFE_9f1658da12738ea1b34318bd8258181b +msgid "