diff --git a/workflow/engine/classes/model/map/UsersPropertiesMapBuilder.php b/workflow/engine/classes/model/map/UsersPropertiesMapBuilder.php index 90743a86a..d391036bc 100644 --- a/workflow/engine/classes/model/map/UsersPropertiesMapBuilder.php +++ b/workflow/engine/classes/model/map/UsersPropertiesMapBuilder.php @@ -75,6 +75,8 @@ class UsersPropertiesMapBuilder $tMap->addColumn('USR_SETTING_DESIGNER', 'UsrSettingDesigner', 'string', CreoleTypes::LONGVARCHAR, false, null); + $tMap->addColumn('PMDYNAFORM_FIRST_TIME', 'PmdynaformFirstTime', 'string', CreoleTypes::CHAR, false, 1); + } // doBuild() } // UsersPropertiesMapBuilder diff --git a/workflow/engine/classes/model/om/BaseUsersProperties.php b/workflow/engine/classes/model/om/BaseUsersProperties.php index d7da23a8b..eb160481c 100644 --- a/workflow/engine/classes/model/om/BaseUsersProperties.php +++ b/workflow/engine/classes/model/om/BaseUsersProperties.php @@ -57,6 +57,12 @@ abstract class BaseUsersProperties extends BaseObject implements Persistent */ protected $usr_setting_designer; + /** + * The value for the pmdynaform_first_time field. + * @var string + */ + protected $pmdynaform_first_time = '0'; + /** * Flag to prevent endless save loop, if this object is referenced * by another object which falls in this transaction. @@ -147,6 +153,17 @@ abstract class BaseUsersProperties extends BaseObject implements Persistent return $this->usr_setting_designer; } + /** + * Get the [pmdynaform_first_time] column value. + * + * @return string + */ + public function getPmdynaformFirstTime() + { + + return $this->pmdynaform_first_time; + } + /** * Set the value of [usr_uid] column. * @@ -264,6 +281,28 @@ abstract class BaseUsersProperties extends BaseObject implements Persistent } // setUsrSettingDesigner() + /** + * Set the value of [pmdynaform_first_time] column. + * + * @param string $v new value + * @return void + */ + public function setPmdynaformFirstTime($v) + { + + // Since the native PHP type for this column is string, + // we will cast the input to a string (if it is not). + if ($v !== null && !is_string($v)) { + $v = (string) $v; + } + + if ($this->pmdynaform_first_time !== $v || $v === '0') { + $this->pmdynaform_first_time = $v; + $this->modifiedColumns[] = UsersPropertiesPeer::PMDYNAFORM_FIRST_TIME; + } + + } // setPmdynaformFirstTime() + /** * Hydrates (populates) the object variables with values from the database resultset. * @@ -291,12 +330,14 @@ abstract class BaseUsersProperties extends BaseObject implements Persistent $this->usr_setting_designer = $rs->getString($startcol + 4); + $this->pmdynaform_first_time = $rs->getString($startcol + 5); + $this->resetModified(); $this->setNew(false); // FIXME - using NUM_COLUMNS may be clearer. - return $startcol + 5; // 5 = UsersPropertiesPeer::NUM_COLUMNS - UsersPropertiesPeer::NUM_LAZY_LOAD_COLUMNS). + return $startcol + 6; // 6 = UsersPropertiesPeer::NUM_COLUMNS - UsersPropertiesPeer::NUM_LAZY_LOAD_COLUMNS). } catch (Exception $e) { throw new PropelException("Error populating UsersProperties object", $e); @@ -515,6 +556,9 @@ abstract class BaseUsersProperties extends BaseObject implements Persistent case 4: return $this->getUsrSettingDesigner(); break; + case 5: + return $this->getPmdynaformFirstTime(); + break; default: return null; break; @@ -540,6 +584,7 @@ abstract class BaseUsersProperties extends BaseObject implements Persistent $keys[2] => $this->getUsrLoggedNextTime(), $keys[3] => $this->getUsrPasswordHistory(), $keys[4] => $this->getUsrSettingDesigner(), + $keys[5] => $this->getPmdynaformFirstTime(), ); return $result; } @@ -586,6 +631,9 @@ abstract class BaseUsersProperties extends BaseObject implements Persistent case 4: $this->setUsrSettingDesigner($value); break; + case 5: + $this->setPmdynaformFirstTime($value); + break; } // switch() } @@ -629,6 +677,10 @@ abstract class BaseUsersProperties extends BaseObject implements Persistent $this->setUsrSettingDesigner($arr[$keys[4]]); } + if (array_key_exists($keys[5], $arr)) { + $this->setPmdynaformFirstTime($arr[$keys[5]]); + } + } /** @@ -660,6 +712,10 @@ abstract class BaseUsersProperties extends BaseObject implements Persistent $criteria->add(UsersPropertiesPeer::USR_SETTING_DESIGNER, $this->usr_setting_designer); } + if ($this->isColumnModified(UsersPropertiesPeer::PMDYNAFORM_FIRST_TIME)) { + $criteria->add(UsersPropertiesPeer::PMDYNAFORM_FIRST_TIME, $this->pmdynaform_first_time); + } + return $criteria; } @@ -722,6 +778,8 @@ abstract class BaseUsersProperties extends BaseObject implements Persistent $copyObj->setUsrSettingDesigner($this->usr_setting_designer); + $copyObj->setPmdynaformFirstTime($this->pmdynaform_first_time); + $copyObj->setNew(true); diff --git a/workflow/engine/classes/model/om/BaseUsersPropertiesPeer.php b/workflow/engine/classes/model/om/BaseUsersPropertiesPeer.php index 2636ff64a..ffac1caf2 100644 --- a/workflow/engine/classes/model/om/BaseUsersPropertiesPeer.php +++ b/workflow/engine/classes/model/om/BaseUsersPropertiesPeer.php @@ -25,7 +25,7 @@ abstract class BaseUsersPropertiesPeer const CLASS_DEFAULT = 'classes.model.UsersProperties'; /** The total number of columns. */ - const NUM_COLUMNS = 5; + const NUM_COLUMNS = 6; /** The number of lazy-loaded columns. */ const NUM_LAZY_LOAD_COLUMNS = 0; @@ -46,6 +46,9 @@ abstract class BaseUsersPropertiesPeer /** the column name for the USR_SETTING_DESIGNER field */ const USR_SETTING_DESIGNER = 'USERS_PROPERTIES.USR_SETTING_DESIGNER'; + /** the column name for the PMDYNAFORM_FIRST_TIME field */ + const PMDYNAFORM_FIRST_TIME = 'USERS_PROPERTIES.PMDYNAFORM_FIRST_TIME'; + /** The PHP to DB Name Mapping */ private static $phpNameMap = null; @@ -57,10 +60,10 @@ abstract class BaseUsersPropertiesPeer * e.g. self::$fieldNames[self::TYPE_PHPNAME][0] = 'Id' */ private static $fieldNames = array ( - BasePeer::TYPE_PHPNAME => array ('UsrUid', 'UsrLastUpdateDate', 'UsrLoggedNextTime', 'UsrPasswordHistory', 'UsrSettingDesigner', ), - BasePeer::TYPE_COLNAME => array (UsersPropertiesPeer::USR_UID, UsersPropertiesPeer::USR_LAST_UPDATE_DATE, UsersPropertiesPeer::USR_LOGGED_NEXT_TIME, UsersPropertiesPeer::USR_PASSWORD_HISTORY, UsersPropertiesPeer::USR_SETTING_DESIGNER, ), - BasePeer::TYPE_FIELDNAME => array ('USR_UID', 'USR_LAST_UPDATE_DATE', 'USR_LOGGED_NEXT_TIME', 'USR_PASSWORD_HISTORY', 'USR_SETTING_DESIGNER', ), - BasePeer::TYPE_NUM => array (0, 1, 2, 3, 4, ) + BasePeer::TYPE_PHPNAME => array ('UsrUid', 'UsrLastUpdateDate', 'UsrLoggedNextTime', 'UsrPasswordHistory', 'UsrSettingDesigner', 'PmdynaformFirstTime', ), + BasePeer::TYPE_COLNAME => array (UsersPropertiesPeer::USR_UID, UsersPropertiesPeer::USR_LAST_UPDATE_DATE, UsersPropertiesPeer::USR_LOGGED_NEXT_TIME, UsersPropertiesPeer::USR_PASSWORD_HISTORY, UsersPropertiesPeer::USR_SETTING_DESIGNER, UsersPropertiesPeer::PMDYNAFORM_FIRST_TIME, ), + BasePeer::TYPE_FIELDNAME => array ('USR_UID', 'USR_LAST_UPDATE_DATE', 'USR_LOGGED_NEXT_TIME', 'USR_PASSWORD_HISTORY', 'USR_SETTING_DESIGNER', 'PMDYNAFORM_FIRST_TIME', ), + BasePeer::TYPE_NUM => array (0, 1, 2, 3, 4, 5, ) ); /** @@ -70,10 +73,10 @@ abstract class BaseUsersPropertiesPeer * e.g. self::$fieldNames[BasePeer::TYPE_PHPNAME]['Id'] = 0 */ private static $fieldKeys = array ( - BasePeer::TYPE_PHPNAME => array ('UsrUid' => 0, 'UsrLastUpdateDate' => 1, 'UsrLoggedNextTime' => 2, 'UsrPasswordHistory' => 3, 'UsrSettingDesigner' => 4, ), - BasePeer::TYPE_COLNAME => array (UsersPropertiesPeer::USR_UID => 0, UsersPropertiesPeer::USR_LAST_UPDATE_DATE => 1, UsersPropertiesPeer::USR_LOGGED_NEXT_TIME => 2, UsersPropertiesPeer::USR_PASSWORD_HISTORY => 3, UsersPropertiesPeer::USR_SETTING_DESIGNER => 4, ), - BasePeer::TYPE_FIELDNAME => array ('USR_UID' => 0, 'USR_LAST_UPDATE_DATE' => 1, 'USR_LOGGED_NEXT_TIME' => 2, 'USR_PASSWORD_HISTORY' => 3, 'USR_SETTING_DESIGNER' => 4, ), - BasePeer::TYPE_NUM => array (0, 1, 2, 3, 4, ) + BasePeer::TYPE_PHPNAME => array ('UsrUid' => 0, 'UsrLastUpdateDate' => 1, 'UsrLoggedNextTime' => 2, 'UsrPasswordHistory' => 3, 'UsrSettingDesigner' => 4, 'PmdynaformFirstTime' => 5, ), + BasePeer::TYPE_COLNAME => array (UsersPropertiesPeer::USR_UID => 0, UsersPropertiesPeer::USR_LAST_UPDATE_DATE => 1, UsersPropertiesPeer::USR_LOGGED_NEXT_TIME => 2, UsersPropertiesPeer::USR_PASSWORD_HISTORY => 3, UsersPropertiesPeer::USR_SETTING_DESIGNER => 4, UsersPropertiesPeer::PMDYNAFORM_FIRST_TIME => 5, ), + BasePeer::TYPE_FIELDNAME => array ('USR_UID' => 0, 'USR_LAST_UPDATE_DATE' => 1, 'USR_LOGGED_NEXT_TIME' => 2, 'USR_PASSWORD_HISTORY' => 3, 'USR_SETTING_DESIGNER' => 4, 'PMDYNAFORM_FIRST_TIME' => 5, ), + BasePeer::TYPE_NUM => array (0, 1, 2, 3, 4, 5, ) ); /** @@ -184,6 +187,8 @@ abstract class BaseUsersPropertiesPeer $criteria->addSelectColumn(UsersPropertiesPeer::USR_SETTING_DESIGNER); + $criteria->addSelectColumn(UsersPropertiesPeer::PMDYNAFORM_FIRST_TIME); + } const COUNT = 'COUNT(USERS_PROPERTIES.USR_UID)'; diff --git a/workflow/engine/config/schema.xml b/workflow/engine/config/schema.xml index 2419ba032..f0020a576 100644 --- a/workflow/engine/config/schema.xml +++ b/workflow/engine/config/schema.xml @@ -2399,6 +2399,7 @@ + diff --git a/workflow/engine/controllers/designer.php b/workflow/engine/controllers/designer.php index 44772077b..ed889372e 100644 --- a/workflow/engine/controllers/designer.php +++ b/workflow/engine/controllers/designer.php @@ -30,6 +30,7 @@ class Designer extends Controller */ public function index($httpData) { + global $RBAC; $proUid = isset($httpData->prj_uid) ? $httpData->prj_uid : ''; $appUid = isset($httpData->app_uid) ? $httpData->app_uid : ''; $proReadOnly = isset($httpData->prj_readonly) ? $httpData->prj_readonly : 'false'; @@ -41,6 +42,9 @@ class Designer extends Controller $enterprise = 0; $distribution = 0; + $usrUid = $RBAC->userObj->getUsrUid(); + $userProperties = UsersPropertiesPeer::retrieveByPk($usrUid); + /*----------------------------------********---------------------------------*/ $licensedFeatures = PMLicensedFeatures::getSingleton(); if ($licensedFeatures->verifyfeature('7TTeDBQeWRoZTZKYjh4eFpYUlRDUUEyVERPU3FxellWank=')) { @@ -65,6 +69,7 @@ class Designer extends Controller $this->setVar("SYS_LANG", SYS_LANG); $this->setVar("SYS_SKIN", SYS_SKIN); $this->setVar('HTTP_SERVER_HOSTNAME', System::getHttpServerHostnameRequestsFrontEnd()); + $this->setVar('PMDYNAFORM_FIRST_TIME', $userProperties->getPmdynaformFirstTime()); if ($debug) { if (!file_exists(PATH_HTML . "lib-dev/pmUI/build.cache")) { diff --git a/workflow/engine/data/mysql/schema.sql b/workflow/engine/data/mysql/schema.sql index f78a95cd0..7dc0714dd 100644 --- a/workflow/engine/data/mysql/schema.sql +++ b/workflow/engine/data/mysql/schema.sql @@ -1115,6 +1115,7 @@ CREATE TABLE `USERS_PROPERTIES` `USR_LOGGED_NEXT_TIME` INTEGER default 0, `USR_PASSWORD_HISTORY` MEDIUMTEXT, `USR_SETTING_DESIGNER` MEDIUMTEXT, + `PMDYNAFORM_FIRST_TIME` CHAR(1) default '0', PRIMARY KEY (`USR_UID`) )ENGINE=InnoDB DEFAULT CHARSET='utf8'; #----------------------------------------------------------------------------- diff --git a/workflow/engine/src/ProcessMaker/BusinessModel/Process.php b/workflow/engine/src/ProcessMaker/BusinessModel/Process.php index 90dc0a288..e7f82eba5 100644 --- a/workflow/engine/src/ProcessMaker/BusinessModel/Process.php +++ b/workflow/engine/src/ProcessMaker/BusinessModel/Process.php @@ -8,6 +8,7 @@ use G; use PMmemcached; use ProcessPeer; use ResultSet; +use UsersPropertiesPeer; class Process { @@ -2160,4 +2161,21 @@ class Process return $processes; } + + /** + * Set for the first time the user opened the dynaform editor. + * + * @param string $usrUid + * @param string $seen + */ + public function setIfFirstTimeConsumed($usrUid, $seen) + { + if ($seen === '1') { + $userProperties = UsersPropertiesPeer::retrieveByPk($usrUid); + if ($userProperties) { + $userProperties->setPmDynaformFirstTime('1'); + $userProperties->save(); + } + } + } } diff --git a/workflow/engine/src/ProcessMaker/Services/Api/Project.php b/workflow/engine/src/ProcessMaker/Services/Api/Project.php index ce382e49a..65c3938da 100644 --- a/workflow/engine/src/ProcessMaker/Services/Api/Project.php +++ b/workflow/engine/src/ProcessMaker/Services/Api/Project.php @@ -366,8 +366,9 @@ class Project extends Api * * @url GET /:prj_uid/dynaforms * @param string $prj_uid {@min 32}{@max 32} + * @param string $seen */ - public function doGetDynaForms($prj_uid) + public function doGetDynaForms($prj_uid, $seen = '0') { try { $process = new \ProcessMaker\BusinessModel\Process(); @@ -375,7 +376,7 @@ class Project extends Api $process->setArrayFieldNameForException(array("processUid" => "prj_uid")); $response = $process->getDynaForms($prj_uid); - + $process->setIfFirstTimeConsumed($this->getUserId(), $seen); return DateTime::convertUtcToIso8601($response, $this->arrayFieldIso8601); } catch (Exception $e) { throw (new RestException(Api::STAT_APP_EXCEPTION, $e->getMessage())); diff --git a/workflow/engine/templates/designer/index.html b/workflow/engine/templates/designer/index.html index a40df5785..d2da471e7 100644 --- a/workflow/engine/templates/designer/index.html +++ b/workflow/engine/templates/designer/index.html @@ -1,5 +1,6 @@ + @@ -29,6 +30,7 @@ var SYS_LANG = "{$SYS_LANG}"; var SYS_SKIN = "{$SYS_SKIN}"; var HTTP_SERVER_HOSTNAME = "{$HTTP_SERVER_HOSTNAME}"; + var PMDYNAFORM_FIRST_TIME = "{$PMDYNAFORM_FIRST_TIME}" === "1"; @@ -86,6 +88,7 @@ var SYS_LANG = "{$SYS_LANG}"; var SYS_SKIN = "{$SYS_SKIN}"; var HTTP_SERVER_HOSTNAME = "{$HTTP_SERVER_HOSTNAME}"; + var PMDYNAFORM_FIRST_TIME = "{$PMDYNAFORM_FIRST_TIME}" === "1"; {foreach from=$sourceJs item=pathFile} @@ -94,7 +97,6 @@ {/if} -