From 9312229f83240ece90e5d256c8714fa7d6c9768c Mon Sep 17 00:00:00 2001 From: Roly Rudy Gutierrez Pinto Date: Tue, 22 Oct 2019 16:15:42 -0400 Subject: [PATCH 01/12] PMC-1306 Add new attribute mobile_offline_tables_download_interval related to the env.ini configuration --- tests/bootstrap.php | 1 + .../ProcessMaker/BusinessModel/LightTest.php | 101 ++++++++++++++ .../src/ProcessMaker/Core/SystemTest.php | 124 ++++++++++++++++-- .../src/ProcessMaker/BusinessModel/Light.php | 15 ++- .../engine/src/ProcessMaker/Core/System.php | 12 +- 5 files changed, 238 insertions(+), 15 deletions(-) create mode 100644 tests/unit/workflow/engine/src/ProcessMaker/BusinessModel/LightTest.php diff --git a/tests/bootstrap.php b/tests/bootstrap.php index e84e1991b..2429864c7 100644 --- a/tests/bootstrap.php +++ b/tests/bootstrap.php @@ -32,6 +32,7 @@ define('PMTABLE_KEY', 'pmtable'); define('DB_ADAPTER', 'mysql'); // Path related some specific directories define('PATH_SEP', '/'); +define("PATH_PLUGINS", PATH_CORE . "plugins" . PATH_SEP); define('PATH_WORKSPACE', PATH_TRUNK . '/shared/sites/' . SYS_SYS . '/'); define('PATH_METHODS', dirname(__DIR__) . '/workflow/engine/methods/'); define('PATH_WORKFLOW_MYSQL_DATA', PATH_TRUNK . '/workflow/engine/data/mysql/'); diff --git a/tests/unit/workflow/engine/src/ProcessMaker/BusinessModel/LightTest.php b/tests/unit/workflow/engine/src/ProcessMaker/BusinessModel/LightTest.php new file mode 100644 index 000000000..b860a6390 --- /dev/null +++ b/tests/unit/workflow/engine/src/ProcessMaker/BusinessModel/LightTest.php @@ -0,0 +1,101 @@ + true, + 'tz' => true, + ]; + $light = new Light(); + + /** + * In the getConfiguration() method, the next section: + * + * $postMaxSize = $this->return_bytes(ini_get('post_max_size')); + * $uploadMaxFileSize = $this->return_bytes(ini_get('upload_max_filesize')); + * if ($postMaxSize < $uploadMaxFileSize) { + * $uploadMaxFileSize = $postMaxSize; + * } + * + * It can only be tested if you change the values of "post_max_size" and "upload_max_filesize" + * in php.ini, you can't use the ini_set() function. + * The mode change of these directives is "PHP_INI_PERDIR", where is entry can be + * set in php.ini, .htaccess, httpd.conf or .user.ini, see here: + * https://www.php.net/manual/es/ini.list.php + * https://www.php.net/manual/en/configuration.changes.modes.php + */ + $result = $light->getConfiguration($param); + + $this->assertArrayHasKey('mobile_offline_tables_download_interval', $result); + } + + /** + * This returns the value of mobile_offline_tables_download_interval + * @test + * @covers \ProcessMaker\BusinessModel\Light::getConfiguration + */ + public function this_should_return_mobile_offline_tables_download_interval_inside_env() + { + $oldContent = ""; + $path = PATH_CONFIG . "env.ini"; + if (file_exists($path)) { + $oldContent = file_get_contents($path); + } + + $expected = 30; + + $content = "mobile_offline_tables_download_interval = {$expected};"; + file_put_contents($path, $content); + + $light = new Light(); + $result = $light->getConfiguration([]); + $actual = $result['mobile_offline_tables_download_interval']; + + file_put_contents($path, $oldContent); + + $this->assertEquals($expected, $actual); + } + + /** + * This returns the default value of mobile_offline_tables_download_interval. + * @test + * @covers \ProcessMaker\BusinessModel\Light::getConfiguration + */ + public function this_should_return_default_value_if_mobile_offline_tables_download_interval_inside_env_is_not_an_integer() + { + $oldContent = ""; + $path = PATH_CONFIG . "env.ini"; + if (file_exists($path)) { + $oldContent = file_get_contents($path); + } + + $faker = $faker = Factory::create(); + $alphanumeric = $faker->regexify('[A-Za-z0-9]{20}'); + $content = "mobile_offline_tables_download_interval = '{$alphanumeric}';"; + file_put_contents($path, $content); + + $light = new Light(); + $result = $light->getConfiguration([]); + $expected = (string) $result['mobile_offline_tables_download_interval']; + + file_put_contents($path, $oldContent); + + $this->assertTrue(ctype_digit($expected)); + } +} diff --git a/tests/unit/workflow/engine/src/ProcessMaker/Core/SystemTest.php b/tests/unit/workflow/engine/src/ProcessMaker/Core/SystemTest.php index 19634a5a4..c03e3da6a 100644 --- a/tests/unit/workflow/engine/src/ProcessMaker/Core/SystemTest.php +++ b/tests/unit/workflow/engine/src/ProcessMaker/Core/SystemTest.php @@ -2,22 +2,20 @@ namespace Tests\unit\workflow\engine\src\ProcessMaker\Core; +use G; +use Faker\Factory; use ProcessMaker\Core\System; use Tests\TestCase; class SystemTest extends TestCase { + /** * Define the required variables */ - protected function setUp() + public function setUp() { - $this->markTestIncomplete();//@todo: Please correct this unit test - $config = config('database.connections.testexternal'); - define('DB_HOST', $config['host']); - define('DB_NAME', $config['database']); - define('DB_USER', $config['username']); - define('DB_PASS', $config['password']); + parent::setUp(); } /** @@ -27,6 +25,8 @@ class SystemTest extends TestCase */ public function it_should_init_laravel_configurations() { + $this->markTestIncomplete("@todo: Please correct this unit test"); + $object = new System(); $object->initLaravel(); @@ -36,4 +36,112 @@ class SystemTest extends TestCase $this->assertEquals(DB_USER, config('database.connections.workflow.username')); $this->assertEquals(DB_PASS, config('database.connections.workflow.password')); } -} \ No newline at end of file + + /** + * It should return default system configuration parameters. + * @test + * @covers \ProcessMaker\Core\System::getSystemConfiguration() + */ + public function it_should_return_default_system_configuration_parameters() + { + $result = System::getSystemConfiguration(); + + $this->assertArrayHasKey('server_hostname_requests_frontend', $result); + $this->assertArrayHasKey('disable_php_upload_execution', $result); + $this->assertArrayHasKey('mobile_offline_tables_download_interval', $result); + } + + /** + * It should return default system configuration parameters without workspace. + * @test + * @covers \ProcessMaker\Core\System::getSystemConfiguration() + */ + public function it_should_return_default_system_configuration_parameters_without_workspace() + { + config(["system.workspace" => '']); + putenv("REQUEST_URI=/sysworkflow"); + + $result = System::getSystemConfiguration(); + + $this->assertArrayHasKey('server_hostname_requests_frontend', $result); + $this->assertArrayHasKey('disable_php_upload_execution', $result); + $this->assertArrayHasKey('mobile_offline_tables_download_interval', $result); + } + + /** + * It should return system configuration parameters defined inside env file. + * @test + * @covers \ProcessMaker\Core\System::getSystemConfiguration() + */ + public function it_should_return_system_configuration_parameters_defined_inside_env_file() + { + $oldContent = ""; + $path = PATH_CONFIG . "env.ini"; + if (file_exists($path)) { + $oldContent = file_get_contents($path); + } + + $expected = 30; + + $content = "mobile_offline_tables_download_interval = {$expected};"; + file_put_contents($path, $content); + + $result = System::getSystemConfiguration(); + $actual = $result['mobile_offline_tables_download_interval']; + + file_put_contents($path, $oldContent); + + $this->assertEquals($expected, $actual); + } + + /** + * It should return default system configuration parameters defined inside env file when is not integer. + * @test + * @covers \ProcessMaker\Core\System::getSystemConfiguration() + */ + public function it_should_return_default_system_configuration_parameters_defined_inside_env_file_when_is_not_an_integer() + { + $oldContent = ""; + $path = PATH_CONFIG . "env.ini"; + if (file_exists($path)) { + $oldContent = file_get_contents($path); + } + + $faker = $faker = Factory::create(); + $alphanumeric = $faker->regexify('[A-Za-z0-9]{20}'); + $content = "mobile_offline_tables_download_interval = '{$alphanumeric}';"; + file_put_contents($path, $content); + + $result = System::getSystemConfiguration(); + + $expected = (string) $result['mobile_offline_tables_download_interval']; + + file_put_contents($path, $oldContent); + + $this->assertTrue(is_numeric($expected)); + } + + /** + * It should return proxy_pass defined inside env file. + * @test + * @covers \ProcessMaker\Core\System::getSystemConfiguration() + */ + public function it_should_return_proxy_pass_defined_inside_env_file() + { + $oldContent = ""; + $path = PATH_CONFIG . "env.ini"; + if (file_exists($path)) { + $oldContent = file_get_contents($path); + } + + $faker = $faker = Factory::create(); + $content = "proxy_pass = '{$faker->password}';"; + file_put_contents($path, $content); + + $result = System::getSystemConfiguration(); + + file_put_contents($path, $oldContent); + + $this->assertArrayHasKey("proxy_pass", $result); + } +} diff --git a/workflow/engine/src/ProcessMaker/BusinessModel/Light.php b/workflow/engine/src/ProcessMaker/BusinessModel/Light.php index f6a135071..e81fde5a5 100644 --- a/workflow/engine/src/ProcessMaker/BusinessModel/Light.php +++ b/workflow/engine/src/ProcessMaker/BusinessModel/Light.php @@ -696,9 +696,8 @@ class Light $sAppDocUid = $oAppDocument->getAppDocUid(); $iDocVersion = $oAppDocument->getDocVersion(); $info = pathinfo($oAppDocument->getAppDocFilename()); - $ext = (isset($info['extension']) ? $info['extension'] : '');//BUG fix: must handle files without any extension + $ext = (isset($info['extension']) ? $info['extension'] : ''); //BUG fix: must handle files without any extension - //$app_uid = G::getPathFromUID($oAppDocument->Fields['APP_UID']); $file = G::getPathFromFileUID($oAppDocument->Fields['APP_UID'], $sAppDocUid); $realPath = PATH_DOCUMENT . G::getPathFromUID($app_uid) . '/' . $file[0] . $file[1] . '_' . $iDocVersion . '.' . $ext; @@ -1358,12 +1357,14 @@ class Light */ public function getConfiguration($params) { + $response = []; + $sysConf = Bootstrap::getSystemConfiguration('', '', config("system.workspace")); $multiTimeZone = false; //Set Time Zone /*----------------------------------********---------------------------------*/ if (\PMLicensedFeatures::getSingleton()->verifyfeature('oq3S29xemxEZXJpZEIzN01qenJUaStSekY4cTdJVm5vbWtVM0d4S2lJSS9qUT0=')) { - $multiTimeZone = (int)($sysConf['system_utc_time_zone']) == 1; + $multiTimeZone = (int) ($sysConf['system_utc_time_zone']) == 1; } /*----------------------------------********---------------------------------*/ $tz = isset($_SESSION['USR_TIME_ZONE']) ? $_SESSION['USR_TIME_ZONE'] : $sysConf['time_zone']; @@ -1423,6 +1424,8 @@ class Light $response['tz'] = isset($_SESSION['USR_TIME_ZONE']) ? $_SESSION['USR_TIME_ZONE'] : $sysConf['time_zone']; } + $response['mobile_offline_tables_download_interval'] = $sysConf['mobile_offline_tables_download_interval']; + return $response; } @@ -1431,13 +1434,13 @@ class Light switch (substr($size_str, -1)) { case 'M': case 'm': - return (int)$size_str * 1048576; + return (int) $size_str * 1048576; case 'K': case 'k': - return (int)$size_str * 1024; + return (int) $size_str * 1024; case 'G': case 'g': - return (int)$size_str * 1073741824; + return (int) $size_str * 1073741824; default: return $size_str; } diff --git a/workflow/engine/src/ProcessMaker/Core/System.php b/workflow/engine/src/ProcessMaker/Core/System.php index 7de260e0c..beeb70ce8 100644 --- a/workflow/engine/src/ProcessMaker/Core/System.php +++ b/workflow/engine/src/ProcessMaker/Core/System.php @@ -73,7 +73,8 @@ class System 'files_white_list' => '', 'delay' => '0', 'tries' => '10', - 'retry_after' => '90' + 'retry_after' => '90', + 'mobile_offline_tables_download_interval' => 24 ]; /** @@ -1203,6 +1204,15 @@ class System $config['proxy_pass'] = G::decrypt($config['proxy_pass'], 'proxy_pass'); } + /** + * Here if you validate if the type of data obtained from the configuration + * files are valid, otherwise the default value is used. + */ + $value = (string) $config['mobile_offline_tables_download_interval']; + if (!is_numeric($value)) { + $config['mobile_offline_tables_download_interval'] = self::$defaultConfig['mobile_offline_tables_download_interval']; + } + return $config; } From 53e1100576eeaf7c36d6d845953d66c32b332922 Mon Sep 17 00:00:00 2001 From: Roly Rudy Gutierrez Pinto Date: Wed, 30 Oct 2019 16:28:21 -0400 Subject: [PATCH 02/12] PMC-1308 New attributes in the PMTables editions --- .../factories/AdditionalTablesFactory.php | 28 + .../classes/model/AdditionalTablesTest.php | 109 + .../engine/classes/model/AdditionalTables.php | 1 + .../model/map/AdditionalTablesMapBuilder.php | 4 + .../classes/model/om/BaseAdditionalTables.php | 146 +- .../model/om/BaseAdditionalTablesPeer.php | 28 +- workflow/engine/config/schema.xml | 2 + .../translations/english/processmaker.en.po | 12 + workflow/engine/data/mysql/insert.sql | 2 + workflow/engine/data/mysql/schema.sql | 2 + .../BusinessModel/ReportTable.php | 6 +- .../src/ProcessMaker/BusinessModel/Table.php | 10 + .../ProcessMaker/Model/AdditionalTables.php | 12 + workflow/engine/templates/pmTables/edit.js | 2175 +++++++++-------- workflow/engine/templates/pmTables/list.js | 1398 +++++------ 15 files changed, 2153 insertions(+), 1782 deletions(-) create mode 100644 database/factories/AdditionalTablesFactory.php create mode 100644 tests/unit/workflow/engine/classes/model/AdditionalTablesTest.php create mode 100644 workflow/engine/src/ProcessMaker/Model/AdditionalTables.php diff --git a/database/factories/AdditionalTablesFactory.php b/database/factories/AdditionalTablesFactory.php new file mode 100644 index 000000000..03325eeb7 --- /dev/null +++ b/database/factories/AdditionalTablesFactory.php @@ -0,0 +1,28 @@ +define(\ProcessMaker\Model\AdditionalTables::class, function(Faker $faker) { + return [ + 'ADD_TAB_UID' => G::generateUniqueID(), + 'ADD_TAB_NAME' => $faker->name, + 'ADD_TAB_CLASS_NAME' => $faker->name, + 'ADD_TAB_DESCRIPTION' => $faker->text, + 'ADD_TAB_SDW_LOG_INSERT' => 0, + 'ADD_TAB_SDW_LOG_UPDATE' => 0, + 'ADD_TAB_SDW_LOG_DELETE' => 0, + 'ADD_TAB_SDW_LOG_SELECT' => 0, + 'ADD_TAB_SDW_MAX_LENGTH' => 0, + 'ADD_TAB_SDW_AUTO_DELETE' => 0, + 'ADD_TAB_PLG_UID' => '', + 'DBS_UID' => 'workflow', + 'PRO_UID' => function() { + return factory(\ProcessMaker\Model\Process::class)->create()->PRO_UID; + }, + 'ADD_TAB_TYPE' => '', + 'ADD_TAB_GRID' => '', + 'ADD_TAB_TAG' => '', + 'ADD_TAB_OFFLINE' => 0, + 'ADD_TAB_UPDATE_DATE' => $faker->dateTime() + ]; +}); diff --git a/tests/unit/workflow/engine/classes/model/AdditionalTablesTest.php b/tests/unit/workflow/engine/classes/model/AdditionalTablesTest.php new file mode 100644 index 000000000..fbfa82cba --- /dev/null +++ b/tests/unit/workflow/engine/classes/model/AdditionalTablesTest.php @@ -0,0 +1,109 @@ + "", + "ADD_TAB_NAME" => "PMT_TEST11", + "ADD_TAB_CLASS_NAME" => "PmtTest11", + "ADD_TAB_DESCRIPTION" => "", + "ADD_TAB_PLG_UID" => "", + "DBS_UID" => "workflow", + "PRO_UID" => "", + "ADD_TAB_TYPE" => "", + "ADD_TAB_GRID" => "", + "ADD_TAB_OFFLINE" => false, + "ADD_TAB_UPDATE_DATE" => "2019-10-22 19:52:52" + ]; + + $additionalTables = new AdditionalTables(); + $result = $additionalTables->create($data); + + $additionalTablesModel = AdditionalTablesModel::where('ADD_TAB_UID', '=', $result) + ->get() + ->first(); + $actual = $additionalTablesModel->toArray(); + unset($data["ADD_TAB_UID"]); + + $this->assertArraySubset($data, $actual); + } + + /** + * This attempts to create a PMTable without correct data to cause an exception. + * @test + * @covers \AdditionalTables::create() + */ + public function it_should_create_without_data() + { + $data = [ + ]; + $additionalTables = new AdditionalTables(); + $this->expectException(Exception::class); + $additionalTables->create($data); + } + + /** + * This updates the data of a PMTable. + * @test + * @covers \AdditionalTables::update() + */ + public function it_should_update() + { + $additionalTables = factory(AdditionalTablesModel::class)->create(); + + $expected = [ + "ADD_TAB_UID" => $additionalTables->ADD_TAB_UID, + "ADD_TAB_NAME" => "PMT_TEST11", + "ADD_TAB_CLASS_NAME" => "PmtTest11", + "DBS_UID" => "workflow", + "ADD_TAB_OFFLINE" => false, + "ADD_TAB_UPDATE_DATE" => "2019-10-22 19:53:11" + ]; + $additionalTables = new AdditionalTables(); + $additionalTables->update($expected); + + $additionalTables = AdditionalTablesModel::where('ADD_TAB_UID', '=', $expected['ADD_TAB_UID']) + ->get() + ->first(); + + $this->assertEquals($expected["ADD_TAB_NAME"], $additionalTables->ADD_TAB_NAME); + $this->assertEquals($expected["ADD_TAB_CLASS_NAME"], $additionalTables->ADD_TAB_CLASS_NAME); + } + + /** + * It tries to update the data of a non-existent "PMTable". + * @test + * @covers \AdditionalTables::update() + */ + public function it_should_update_if_registry_not_exist() + { + $expected = [ + "ADD_TAB_UID" => G::generateUniqueID(), + "ADD_TAB_NAME" => "PMT_TEST11", + "ADD_TAB_CLASS_NAME" => "PmtTest11", + "DBS_UID" => "workflow", + "ADD_TAB_OFFLINE" => false, + "ADD_TAB_UPDATE_DATE" => "2019-10-22 19:53:11" + ]; + + $this->expectException(Exception::class); + $additionalTables = new AdditionalTables(); + $additionalTables->update($expected); + } +} diff --git a/workflow/engine/classes/model/AdditionalTables.php b/workflow/engine/classes/model/AdditionalTables.php index 1eefa6356..d896ee0b7 100644 --- a/workflow/engine/classes/model/AdditionalTables.php +++ b/workflow/engine/classes/model/AdditionalTables.php @@ -1086,6 +1086,7 @@ class AdditionalTables extends BaseAdditionalTables $criteria->addSelectColumn(AdditionalTablesPeer::ADD_TAB_DESCRIPTION); $criteria->addSelectColumn(AdditionalTablesPeer::ADD_TAB_TYPE); $criteria->addSelectColumn(AdditionalTablesPeer::ADD_TAB_TAG); + $criteria->addSelectColumn(AdditionalTablesPeer::ADD_TAB_OFFLINE); $criteria->addSelectColumn(AdditionalTablesPeer::PRO_UID); $criteria->addSelectColumn(AdditionalTablesPeer::DBS_UID); diff --git a/workflow/engine/classes/model/map/AdditionalTablesMapBuilder.php b/workflow/engine/classes/model/map/AdditionalTablesMapBuilder.php index 10e79dff7..a9e72fb72 100644 --- a/workflow/engine/classes/model/map/AdditionalTablesMapBuilder.php +++ b/workflow/engine/classes/model/map/AdditionalTablesMapBuilder.php @@ -97,6 +97,10 @@ class AdditionalTablesMapBuilder $tMap->addColumn('ADD_TAB_TAG', 'AddTabTag', 'string', CreoleTypes::VARCHAR, false, 256); + $tMap->addColumn('ADD_TAB_OFFLINE', 'AddTabOffline', 'int', CreoleTypes::TINYINT, true, null); + + $tMap->addColumn('ADD_TAB_UPDATE_DATE', 'AddTabUpdateDate', 'int', CreoleTypes::TIMESTAMP, true, null); + } // doBuild() } // AdditionalTablesMapBuilder diff --git a/workflow/engine/classes/model/om/BaseAdditionalTables.php b/workflow/engine/classes/model/om/BaseAdditionalTables.php index 256e33890..187add267 100644 --- a/workflow/engine/classes/model/om/BaseAdditionalTables.php +++ b/workflow/engine/classes/model/om/BaseAdditionalTables.php @@ -123,6 +123,18 @@ abstract class BaseAdditionalTables extends BaseObject implements Persistent */ protected $add_tab_tag = ''; + /** + * The value for the add_tab_offline field. + * @var int + */ + protected $add_tab_offline = 0; + + /** + * The value for the add_tab_update_date field. + * @var int + */ + protected $add_tab_update_date; + /** * Flag to prevent endless save loop, if this object is referenced * by another object which falls in this transaction. @@ -313,6 +325,49 @@ abstract class BaseAdditionalTables extends BaseObject implements Persistent return $this->add_tab_tag; } + /** + * Get the [add_tab_offline] column value. + * + * @return int + */ + public function getAddTabOffline() + { + + return $this->add_tab_offline; + } + + /** + * Get the [optionally formatted] [add_tab_update_date] column value. + * + * @param string $format The date/time format string (either date()-style or strftime()-style). + * If format is NULL, then the integer unix timestamp will be returned. + * @return mixed Formatted date/time value as string or integer unix timestamp (if format is NULL). + * @throws PropelException - if unable to convert the date/time to timestamp. + */ + public function getAddTabUpdateDate($format = 'Y-m-d H:i:s') + { + + if ($this->add_tab_update_date === null || $this->add_tab_update_date === '') { + return null; + } elseif (!is_int($this->add_tab_update_date)) { + // a non-timestamp value was set externally, so we convert it + $ts = strtotime($this->add_tab_update_date); + if ($ts === -1 || $ts === false) { + throw new PropelException("Unable to parse value of [add_tab_update_date] as date/time value: " . + var_export($this->add_tab_update_date, true)); + } + } else { + $ts = $this->add_tab_update_date; + } + if ($format === null) { + return $ts; + } elseif (strpos($format, '%') !== false) { + return strftime($format, $ts); + } else { + return date($format, $ts); + } + } + /** * Set the value of [add_tab_uid] column. * @@ -665,6 +720,57 @@ abstract class BaseAdditionalTables extends BaseObject implements Persistent } // setAddTabTag() + /** + * Set the value of [add_tab_offline] column. + * + * @param int $v new value + * @return void + */ + public function setAddTabOffline($v) + { + + // Since the native PHP type for this column is integer, + // we will cast the input value to an int (if it is not). + if ($v !== null && !is_int($v) && is_numeric($v)) { + $v = (int) $v; + } + + if ($this->add_tab_offline !== $v || $v === 0) { + $this->add_tab_offline = $v; + $this->modifiedColumns[] = AdditionalTablesPeer::ADD_TAB_OFFLINE; + } + + } // setAddTabOffline() + + /** + * Set the value of [add_tab_update_date] column. + * + * @param int $v new value + * @return void + */ + public function setAddTabUpdateDate($v) + { + + if ($v !== null && !is_int($v)) { + $ts = strtotime($v); + //Date/time accepts null values + if ($v == '') { + $ts = null; + } + if ($ts === -1 || $ts === false) { + throw new PropelException("Unable to parse date/time value for [add_tab_update_date] from input: " . + var_export($v, true)); + } + } else { + $ts = $v; + } + if ($this->add_tab_update_date !== $ts) { + $this->add_tab_update_date = $ts; + $this->modifiedColumns[] = AdditionalTablesPeer::ADD_TAB_UPDATE_DATE; + } + + } // setAddTabUpdateDate() + /** * Hydrates (populates) the object variables with values from the database resultset. * @@ -714,12 +820,16 @@ abstract class BaseAdditionalTables extends BaseObject implements Persistent $this->add_tab_tag = $rs->getString($startcol + 15); + $this->add_tab_offline = $rs->getInt($startcol + 16); + + $this->add_tab_update_date = $rs->getTimestamp($startcol + 17, null); + $this->resetModified(); $this->setNew(false); // FIXME - using NUM_COLUMNS may be clearer. - return $startcol + 16; // 16 = AdditionalTablesPeer::NUM_COLUMNS - AdditionalTablesPeer::NUM_LAZY_LOAD_COLUMNS). + return $startcol + 18; // 18 = AdditionalTablesPeer::NUM_COLUMNS - AdditionalTablesPeer::NUM_LAZY_LOAD_COLUMNS). } catch (Exception $e) { throw new PropelException("Error populating AdditionalTables object", $e); @@ -971,6 +1081,12 @@ abstract class BaseAdditionalTables extends BaseObject implements Persistent case 15: return $this->getAddTabTag(); break; + case 16: + return $this->getAddTabOffline(); + break; + case 17: + return $this->getAddTabUpdateDate(); + break; default: return null; break; @@ -1007,6 +1123,8 @@ abstract class BaseAdditionalTables extends BaseObject implements Persistent $keys[13] => $this->getAddTabType(), $keys[14] => $this->getAddTabGrid(), $keys[15] => $this->getAddTabTag(), + $keys[16] => $this->getAddTabOffline(), + $keys[17] => $this->getAddTabUpdateDate(), ); return $result; } @@ -1086,6 +1204,12 @@ abstract class BaseAdditionalTables extends BaseObject implements Persistent case 15: $this->setAddTabTag($value); break; + case 16: + $this->setAddTabOffline($value); + break; + case 17: + $this->setAddTabUpdateDate($value); + break; } // switch() } @@ -1173,6 +1297,14 @@ abstract class BaseAdditionalTables extends BaseObject implements Persistent $this->setAddTabTag($arr[$keys[15]]); } + if (array_key_exists($keys[16], $arr)) { + $this->setAddTabOffline($arr[$keys[16]]); + } + + if (array_key_exists($keys[17], $arr)) { + $this->setAddTabUpdateDate($arr[$keys[17]]); + } + } /** @@ -1248,6 +1380,14 @@ abstract class BaseAdditionalTables extends BaseObject implements Persistent $criteria->add(AdditionalTablesPeer::ADD_TAB_TAG, $this->add_tab_tag); } + if ($this->isColumnModified(AdditionalTablesPeer::ADD_TAB_OFFLINE)) { + $criteria->add(AdditionalTablesPeer::ADD_TAB_OFFLINE, $this->add_tab_offline); + } + + if ($this->isColumnModified(AdditionalTablesPeer::ADD_TAB_UPDATE_DATE)) { + $criteria->add(AdditionalTablesPeer::ADD_TAB_UPDATE_DATE, $this->add_tab_update_date); + } + return $criteria; } @@ -1332,6 +1472,10 @@ abstract class BaseAdditionalTables extends BaseObject implements Persistent $copyObj->setAddTabTag($this->add_tab_tag); + $copyObj->setAddTabOffline($this->add_tab_offline); + + $copyObj->setAddTabUpdateDate($this->add_tab_update_date); + $copyObj->setNew(true); diff --git a/workflow/engine/classes/model/om/BaseAdditionalTablesPeer.php b/workflow/engine/classes/model/om/BaseAdditionalTablesPeer.php index 688e4d01a..bdf8b61a6 100644 --- a/workflow/engine/classes/model/om/BaseAdditionalTablesPeer.php +++ b/workflow/engine/classes/model/om/BaseAdditionalTablesPeer.php @@ -25,7 +25,7 @@ abstract class BaseAdditionalTablesPeer const CLASS_DEFAULT = 'classes.model.AdditionalTables'; /** The total number of columns. */ - const NUM_COLUMNS = 16; + const NUM_COLUMNS = 18; /** The number of lazy-loaded columns. */ const NUM_LAZY_LOAD_COLUMNS = 0; @@ -79,6 +79,12 @@ abstract class BaseAdditionalTablesPeer /** the column name for the ADD_TAB_TAG field */ const ADD_TAB_TAG = 'ADDITIONAL_TABLES.ADD_TAB_TAG'; + /** the column name for the ADD_TAB_OFFLINE field */ + const ADD_TAB_OFFLINE = 'ADDITIONAL_TABLES.ADD_TAB_OFFLINE'; + + /** the column name for the ADD_TAB_UPDATE_DATE field */ + const ADD_TAB_UPDATE_DATE = 'ADDITIONAL_TABLES.ADD_TAB_UPDATE_DATE'; + /** The PHP to DB Name Mapping */ private static $phpNameMap = null; @@ -90,10 +96,10 @@ abstract class BaseAdditionalTablesPeer * e.g. self::$fieldNames[self::TYPE_PHPNAME][0] = 'Id' */ private static $fieldNames = array ( - BasePeer::TYPE_PHPNAME => array ('AddTabUid', 'AddTabName', 'AddTabClassName', 'AddTabDescription', 'AddTabSdwLogInsert', 'AddTabSdwLogUpdate', 'AddTabSdwLogDelete', 'AddTabSdwLogSelect', 'AddTabSdwMaxLength', 'AddTabSdwAutoDelete', 'AddTabPlgUid', 'DbsUid', 'ProUid', 'AddTabType', 'AddTabGrid', 'AddTabTag', ), - BasePeer::TYPE_COLNAME => array (AdditionalTablesPeer::ADD_TAB_UID, AdditionalTablesPeer::ADD_TAB_NAME, AdditionalTablesPeer::ADD_TAB_CLASS_NAME, AdditionalTablesPeer::ADD_TAB_DESCRIPTION, AdditionalTablesPeer::ADD_TAB_SDW_LOG_INSERT, AdditionalTablesPeer::ADD_TAB_SDW_LOG_UPDATE, AdditionalTablesPeer::ADD_TAB_SDW_LOG_DELETE, AdditionalTablesPeer::ADD_TAB_SDW_LOG_SELECT, AdditionalTablesPeer::ADD_TAB_SDW_MAX_LENGTH, AdditionalTablesPeer::ADD_TAB_SDW_AUTO_DELETE, AdditionalTablesPeer::ADD_TAB_PLG_UID, AdditionalTablesPeer::DBS_UID, AdditionalTablesPeer::PRO_UID, AdditionalTablesPeer::ADD_TAB_TYPE, AdditionalTablesPeer::ADD_TAB_GRID, AdditionalTablesPeer::ADD_TAB_TAG, ), - BasePeer::TYPE_FIELDNAME => array ('ADD_TAB_UID', 'ADD_TAB_NAME', 'ADD_TAB_CLASS_NAME', 'ADD_TAB_DESCRIPTION', 'ADD_TAB_SDW_LOG_INSERT', 'ADD_TAB_SDW_LOG_UPDATE', 'ADD_TAB_SDW_LOG_DELETE', 'ADD_TAB_SDW_LOG_SELECT', 'ADD_TAB_SDW_MAX_LENGTH', 'ADD_TAB_SDW_AUTO_DELETE', 'ADD_TAB_PLG_UID', 'DBS_UID', 'PRO_UID', 'ADD_TAB_TYPE', 'ADD_TAB_GRID', 'ADD_TAB_TAG', ), - BasePeer::TYPE_NUM => array (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, ) + BasePeer::TYPE_PHPNAME => array ('AddTabUid', 'AddTabName', 'AddTabClassName', 'AddTabDescription', 'AddTabSdwLogInsert', 'AddTabSdwLogUpdate', 'AddTabSdwLogDelete', 'AddTabSdwLogSelect', 'AddTabSdwMaxLength', 'AddTabSdwAutoDelete', 'AddTabPlgUid', 'DbsUid', 'ProUid', 'AddTabType', 'AddTabGrid', 'AddTabTag', 'AddTabOffline', 'AddTabUpdateDate', ), + BasePeer::TYPE_COLNAME => array (AdditionalTablesPeer::ADD_TAB_UID, AdditionalTablesPeer::ADD_TAB_NAME, AdditionalTablesPeer::ADD_TAB_CLASS_NAME, AdditionalTablesPeer::ADD_TAB_DESCRIPTION, AdditionalTablesPeer::ADD_TAB_SDW_LOG_INSERT, AdditionalTablesPeer::ADD_TAB_SDW_LOG_UPDATE, AdditionalTablesPeer::ADD_TAB_SDW_LOG_DELETE, AdditionalTablesPeer::ADD_TAB_SDW_LOG_SELECT, AdditionalTablesPeer::ADD_TAB_SDW_MAX_LENGTH, AdditionalTablesPeer::ADD_TAB_SDW_AUTO_DELETE, AdditionalTablesPeer::ADD_TAB_PLG_UID, AdditionalTablesPeer::DBS_UID, AdditionalTablesPeer::PRO_UID, AdditionalTablesPeer::ADD_TAB_TYPE, AdditionalTablesPeer::ADD_TAB_GRID, AdditionalTablesPeer::ADD_TAB_TAG, AdditionalTablesPeer::ADD_TAB_OFFLINE, AdditionalTablesPeer::ADD_TAB_UPDATE_DATE, ), + BasePeer::TYPE_FIELDNAME => array ('ADD_TAB_UID', 'ADD_TAB_NAME', 'ADD_TAB_CLASS_NAME', 'ADD_TAB_DESCRIPTION', 'ADD_TAB_SDW_LOG_INSERT', 'ADD_TAB_SDW_LOG_UPDATE', 'ADD_TAB_SDW_LOG_DELETE', 'ADD_TAB_SDW_LOG_SELECT', 'ADD_TAB_SDW_MAX_LENGTH', 'ADD_TAB_SDW_AUTO_DELETE', 'ADD_TAB_PLG_UID', 'DBS_UID', 'PRO_UID', 'ADD_TAB_TYPE', 'ADD_TAB_GRID', 'ADD_TAB_TAG', 'ADD_TAB_OFFLINE', 'ADD_TAB_UPDATE_DATE', ), + BasePeer::TYPE_NUM => array (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, ) ); /** @@ -103,10 +109,10 @@ abstract class BaseAdditionalTablesPeer * e.g. self::$fieldNames[BasePeer::TYPE_PHPNAME]['Id'] = 0 */ private static $fieldKeys = array ( - BasePeer::TYPE_PHPNAME => array ('AddTabUid' => 0, 'AddTabName' => 1, 'AddTabClassName' => 2, 'AddTabDescription' => 3, 'AddTabSdwLogInsert' => 4, 'AddTabSdwLogUpdate' => 5, 'AddTabSdwLogDelete' => 6, 'AddTabSdwLogSelect' => 7, 'AddTabSdwMaxLength' => 8, 'AddTabSdwAutoDelete' => 9, 'AddTabPlgUid' => 10, 'DbsUid' => 11, 'ProUid' => 12, 'AddTabType' => 13, 'AddTabGrid' => 14, 'AddTabTag' => 15, ), - BasePeer::TYPE_COLNAME => array (AdditionalTablesPeer::ADD_TAB_UID => 0, AdditionalTablesPeer::ADD_TAB_NAME => 1, AdditionalTablesPeer::ADD_TAB_CLASS_NAME => 2, AdditionalTablesPeer::ADD_TAB_DESCRIPTION => 3, AdditionalTablesPeer::ADD_TAB_SDW_LOG_INSERT => 4, AdditionalTablesPeer::ADD_TAB_SDW_LOG_UPDATE => 5, AdditionalTablesPeer::ADD_TAB_SDW_LOG_DELETE => 6, AdditionalTablesPeer::ADD_TAB_SDW_LOG_SELECT => 7, AdditionalTablesPeer::ADD_TAB_SDW_MAX_LENGTH => 8, AdditionalTablesPeer::ADD_TAB_SDW_AUTO_DELETE => 9, AdditionalTablesPeer::ADD_TAB_PLG_UID => 10, AdditionalTablesPeer::DBS_UID => 11, AdditionalTablesPeer::PRO_UID => 12, AdditionalTablesPeer::ADD_TAB_TYPE => 13, AdditionalTablesPeer::ADD_TAB_GRID => 14, AdditionalTablesPeer::ADD_TAB_TAG => 15, ), - BasePeer::TYPE_FIELDNAME => array ('ADD_TAB_UID' => 0, 'ADD_TAB_NAME' => 1, 'ADD_TAB_CLASS_NAME' => 2, 'ADD_TAB_DESCRIPTION' => 3, 'ADD_TAB_SDW_LOG_INSERT' => 4, 'ADD_TAB_SDW_LOG_UPDATE' => 5, 'ADD_TAB_SDW_LOG_DELETE' => 6, 'ADD_TAB_SDW_LOG_SELECT' => 7, 'ADD_TAB_SDW_MAX_LENGTH' => 8, 'ADD_TAB_SDW_AUTO_DELETE' => 9, 'ADD_TAB_PLG_UID' => 10, 'DBS_UID' => 11, 'PRO_UID' => 12, 'ADD_TAB_TYPE' => 13, 'ADD_TAB_GRID' => 14, 'ADD_TAB_TAG' => 15, ), - BasePeer::TYPE_NUM => array (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, ) + BasePeer::TYPE_PHPNAME => array ('AddTabUid' => 0, 'AddTabName' => 1, 'AddTabClassName' => 2, 'AddTabDescription' => 3, 'AddTabSdwLogInsert' => 4, 'AddTabSdwLogUpdate' => 5, 'AddTabSdwLogDelete' => 6, 'AddTabSdwLogSelect' => 7, 'AddTabSdwMaxLength' => 8, 'AddTabSdwAutoDelete' => 9, 'AddTabPlgUid' => 10, 'DbsUid' => 11, 'ProUid' => 12, 'AddTabType' => 13, 'AddTabGrid' => 14, 'AddTabTag' => 15, 'AddTabOffline' => 16, 'AddTabUpdateDate' => 17, ), + BasePeer::TYPE_COLNAME => array (AdditionalTablesPeer::ADD_TAB_UID => 0, AdditionalTablesPeer::ADD_TAB_NAME => 1, AdditionalTablesPeer::ADD_TAB_CLASS_NAME => 2, AdditionalTablesPeer::ADD_TAB_DESCRIPTION => 3, AdditionalTablesPeer::ADD_TAB_SDW_LOG_INSERT => 4, AdditionalTablesPeer::ADD_TAB_SDW_LOG_UPDATE => 5, AdditionalTablesPeer::ADD_TAB_SDW_LOG_DELETE => 6, AdditionalTablesPeer::ADD_TAB_SDW_LOG_SELECT => 7, AdditionalTablesPeer::ADD_TAB_SDW_MAX_LENGTH => 8, AdditionalTablesPeer::ADD_TAB_SDW_AUTO_DELETE => 9, AdditionalTablesPeer::ADD_TAB_PLG_UID => 10, AdditionalTablesPeer::DBS_UID => 11, AdditionalTablesPeer::PRO_UID => 12, AdditionalTablesPeer::ADD_TAB_TYPE => 13, AdditionalTablesPeer::ADD_TAB_GRID => 14, AdditionalTablesPeer::ADD_TAB_TAG => 15, AdditionalTablesPeer::ADD_TAB_OFFLINE => 16, AdditionalTablesPeer::ADD_TAB_UPDATE_DATE => 17, ), + BasePeer::TYPE_FIELDNAME => array ('ADD_TAB_UID' => 0, 'ADD_TAB_NAME' => 1, 'ADD_TAB_CLASS_NAME' => 2, 'ADD_TAB_DESCRIPTION' => 3, 'ADD_TAB_SDW_LOG_INSERT' => 4, 'ADD_TAB_SDW_LOG_UPDATE' => 5, 'ADD_TAB_SDW_LOG_DELETE' => 6, 'ADD_TAB_SDW_LOG_SELECT' => 7, 'ADD_TAB_SDW_MAX_LENGTH' => 8, 'ADD_TAB_SDW_AUTO_DELETE' => 9, 'ADD_TAB_PLG_UID' => 10, 'DBS_UID' => 11, 'PRO_UID' => 12, 'ADD_TAB_TYPE' => 13, 'ADD_TAB_GRID' => 14, 'ADD_TAB_TAG' => 15, 'ADD_TAB_OFFLINE' => 16, 'ADD_TAB_UPDATE_DATE' => 17, ), + BasePeer::TYPE_NUM => array (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, ) ); /** @@ -239,6 +245,10 @@ abstract class BaseAdditionalTablesPeer $criteria->addSelectColumn(AdditionalTablesPeer::ADD_TAB_TAG); + $criteria->addSelectColumn(AdditionalTablesPeer::ADD_TAB_OFFLINE); + + $criteria->addSelectColumn(AdditionalTablesPeer::ADD_TAB_UPDATE_DATE); + } const COUNT = 'COUNT(ADDITIONAL_TABLES.ADD_TAB_UID)'; diff --git a/workflow/engine/config/schema.xml b/workflow/engine/config/schema.xml index a9b23a22b..348415bde 100644 --- a/workflow/engine/config/schema.xml +++ b/workflow/engine/config/schema.xml @@ -2522,6 +2522,8 @@ + + diff --git a/workflow/engine/content/translations/english/processmaker.en.po b/workflow/engine/content/translations/english/processmaker.en.po index 9a3f2ffd0..a3d18f9fb 100644 --- a/workflow/engine/content/translations/english/processmaker.en.po +++ b/workflow/engine/content/translations/english/processmaker.en.po @@ -2749,6 +2749,18 @@ msgstr "AVAILABLE GROUPS" msgid "AVAILABLE MEMBERS" msgstr "AVAILABLE MEMBERS" +# TRANSLATION +# LABEL/ID_AVAILABLE_OFFLINE +#: LABEL/ID_AVAILABLE_OFFLINE +msgid "Available offline" +msgstr "Available offline" + +# TRANSLATION +# LABEL/ID_AVAILABLE_OFFLINE_THE_MOBILE_APPLICATIONS +#: LABEL/ID_AVAILABLE_OFFLINE_THE_MOBILE_APPLICATIONS +msgid "Available offline, the mobile applications will download this table for offline use" +msgstr "Available offline, the mobile applications will download this table for offline use" + # TRANSLATION # LABEL/ID_AVAILABLE_PERMISSIONS #: LABEL/ID_AVAILABLE_PERMISSIONS diff --git a/workflow/engine/data/mysql/insert.sql b/workflow/engine/data/mysql/insert.sql index 20e077737..fa026df32 100644 --- a/workflow/engine/data/mysql/insert.sql +++ b/workflow/engine/data/mysql/insert.sql @@ -57260,6 +57260,8 @@ INSERT INTO TRANSLATION (TRN_CATEGORY,TRN_ID,TRN_LANG,TRN_VALUE,TRN_UPDATE_DATE ( 'LABEL','ID_AVAILABLE_FIELDS','en','Available Fields','2014-01-15') , ( 'LABEL','ID_AVAILABLE_GROUPS','en','AVAILABLE GROUPS','2014-01-15') , ( 'LABEL','ID_AVAILABLE_MEMBERS','en','AVAILABLE MEMBERS','2014-01-15') , +( 'LABEL','ID_AVAILABLE_OFFLINE','en','Available offline','2019-10-15') , +( 'LABEL','ID_AVAILABLE_OFFLINE_THE_MOBILE_APPLICATIONS','en','Available offline, the mobile applications will download this table for offline use','2019-10-15') , ( 'LABEL','ID_AVAILABLE_PERMISSIONS','en','AVAILABLE PERMISSIONS','2014-01-15') , ( 'LABEL','ID_AVAILABLE_TRIGGERS','en','Available Triggers','2014-01-15') , ( 'LABEL','ID_AVAILABLE_USERS','en','AVAILABLE USERS','2014-01-15') , diff --git a/workflow/engine/data/mysql/schema.sql b/workflow/engine/data/mysql/schema.sql index 0d2445581..eb0682aad 100644 --- a/workflow/engine/data/mysql/schema.sql +++ b/workflow/engine/data/mysql/schema.sql @@ -1162,6 +1162,8 @@ CREATE TABLE `ADDITIONAL_TABLES` `ADD_TAB_TYPE` VARCHAR(32) default '', `ADD_TAB_GRID` VARCHAR(256) default '', `ADD_TAB_TAG` VARCHAR(256) default '', + `ADD_TAB_OFFLINE` TINYINT default 0 NOT NULL, + `ADD_TAB_UPDATE_DATE` DATETIME NOT NULL, PRIMARY KEY (`ADD_TAB_UID`), KEY `indexAdditionalProcess`(`PRO_UID`) )ENGINE=InnoDB DEFAULT CHARSET='utf8'; diff --git a/workflow/engine/src/ProcessMaker/BusinessModel/ReportTable.php b/workflow/engine/src/ProcessMaker/BusinessModel/ReportTable.php index e50f4a47e..10a292ff7 100644 --- a/workflow/engine/src/ProcessMaker/BusinessModel/ReportTable.php +++ b/workflow/engine/src/ProcessMaker/BusinessModel/ReportTable.php @@ -486,7 +486,9 @@ class ReportTable 'DBS_UID' => ($arrayData['REP_TAB_CONNECTION']) ? $arrayData['REP_TAB_CONNECTION'] : 'workflow', 'PRO_UID' => $arrayData['PRO_UID'], 'ADD_TAB_TYPE' => $arrayData['REP_TAB_TYPE'], - 'ADD_TAB_GRID' => $arrayData['REP_TAB_GRID'] + 'ADD_TAB_GRID' => $arrayData['REP_TAB_GRID'], + 'ADD_TAB_OFFLINE' => !empty($arrayData['REP_TAB_OFFLINE']) ?? 0, + 'ADD_TAB_UPDATE_DATE' => date('Y-m-d H:i:s'), ]; if ($arrayData['REP_TAB_UID'] == '' || (isset($arrayData['forceUid']) && $arrayData['forceUid'])) { @@ -806,6 +808,8 @@ class ReportTable $tableData->REP_TAB_CONNECTION = $contentSchema['DBS_UID']; $tableData->REP_TAB_TYPE = (isset($contentSchema['ADD_TAB_TYPE'])) ? $contentSchema['ADD_TAB_TYPE'] : ''; $tableData->REP_TAB_GRID = (isset($contentSchema['ADD_TAB_GRID'])) ? $contentSchema['ADD_TAB_GRID'] : ''; + $tableData->REP_TAB_OFFLINE = (isset($contentSchema['ADD_TAB_OFFLINE'])) ? $contentSchema['ADD_TAB_OFFLINE'] : '0'; + $tableData->REP_TAB_UPDATE_DATE = date('Y-m-d H:i:s'); $tableData->columns = G::json_encode($columns); $tableData->forceUid = true; diff --git a/workflow/engine/src/ProcessMaker/BusinessModel/Table.php b/workflow/engine/src/ProcessMaker/BusinessModel/Table.php index 7f85689d6..7ce212479 100644 --- a/workflow/engine/src/ProcessMaker/BusinessModel/Table.php +++ b/workflow/engine/src/ProcessMaker/BusinessModel/Table.php @@ -87,6 +87,7 @@ class Table $tabData['PMT_UID'] = $tab_uid; $tabData['PMT_TAB_NAME'] = $table['ADD_TAB_NAME']; $tabData['PMT_TAB_DESCRIPTION'] = $table['ADD_TAB_DESCRIPTION']; + $tabData['PMT_TAB_OFFLINE'] = $table['ADD_TAB_OFFLINE']; $tabData['PMT_TAB_CLASS_NAME'] = $table['ADD_TAB_CLASS_NAME']; $tabData['PMT_NUM_ROWS'] = $tableData['count']; } @@ -384,6 +385,8 @@ class Table 'ADD_TAB_NAME' => $dataValidate['REP_TAB_NAME'], 'ADD_TAB_CLASS_NAME' => $repTabClassName, 'ADD_TAB_DESCRIPTION' => $dataValidate['REP_TAB_DSC'], + 'ADD_TAB_OFFLINE' => 0, + 'ADD_TAB_UPDATE_DATE' => date('Y-m-d H:i:s'), 'ADD_TAB_PLG_UID' => '', 'DBS_UID' => ($dataValidate['REP_TAB_CONNECTION'] ? $dataValidate['REP_TAB_CONNECTION'] : 'workflow'), 'PRO_UID' => $dataValidate['PRO_UID'], @@ -396,6 +399,8 @@ class Table 'ADD_TAB_NAME' => $dataValidate['PMT_TAB_NAME'], 'ADD_TAB_CLASS_NAME' => $repTabClassName, 'ADD_TAB_DESCRIPTION' => $dataValidate['PMT_TAB_DSC'], + 'ADD_TAB_OFFLINE' => !empty($dataValidate['PMT_TAB_OFFLINE']) ?? 0, + 'ADD_TAB_UPDATE_DATE' => date('Y-m-d H:i:s'), 'ADD_TAB_PLG_UID' => '', 'DBS_UID' => ($dataValidate['PMT_TAB_CONNECTION'] ? $dataValidate['PMT_TAB_CONNECTION'] : 'workflow'), 'PRO_UID' => '', @@ -549,6 +554,11 @@ class Table $dataValidate['rep_tab_dsc'] = $tableData['pmt_tab_dsc']; $tableDsc = true; } + if (!empty($tableData['pmt_tab_offline'])) { + $dataValidate['rep_tab_offline'] = $tableData['pmt_tab_offline']; + $tableDsc = true; + } + $dataValidate['rep_tab_update_date'] = date('Y-m-d H:i:s'); } if (!empty($tableData['fields'])) { $dataValidate['fields'] = $tableData['fields']; diff --git a/workflow/engine/src/ProcessMaker/Model/AdditionalTables.php b/workflow/engine/src/ProcessMaker/Model/AdditionalTables.php new file mode 100644 index 000000000..31cf40a78 --- /dev/null +++ b/workflow/engine/src/ProcessMaker/Model/AdditionalTables.php @@ -0,0 +1,12 @@ +
  • ") { + Ext.msgBoxSlider.msgTopCenter("error", _("ID_ERROR"), msg, 3); } - return false; + flagShowMessageError = 0; } - }); + }, + listeners: { + canceledit: function (grid, obj) { + if (grid.record.data.field_label == '' && grid.record.data.field_name == '') { + store.remove(grid.record); + } - if (valid) { - flagShowMessageError = 1; + flagShowMessageError = 1; + } } + }); - return valid; - }, - showTooltip: function (msg) - { - if (flagShowMessageError == 1) { - if (msg != "" && msg != "
    ") { - Ext.msgBoxSlider.msgTopCenter("error", _("ID_ERROR"), msg, 3); + editor.on({ + beforeedit: function (roweditor, rowIndex) + { + setTimeout( + function () + { + var fieldTypeValue = Ext.getCmp("fieldType").getValue(); + var fieldNull = Ext.getCmp("field_null"); + var fieldPrimaryKey = Ext.getCmp("field_primary_key"); + var fieldIndex = Ext.getCmp("field_index"); + var fieldInc = Ext.getCmp("field_incre"); + var sizeEdit = Ext.getCmp("sizeEdit"); + + editorFieldsEnableDisable(fieldTypeValue, fieldNull, fieldPrimaryKey, fieldIndex, fieldInc, sizeEdit); + }, + 250 + ); + }, + afteredit: function (roweditor, changes, r, rowIndex) + { + row = assignedGrid.getSelectionModel().getSelected(); + //if a column was set as PK so can't be null + if (row.get('field_key') == true) { + row.data.field_null = false; } - flagShowMessageError = 0; - } - }, - listeners: { - canceledit: function(grid,obj){ - if ( grid.record.data.field_label == '' && grid.record.data.field_name == '') { - store.remove(grid.record); + if (row.get('field_index') == true) { + row.data.field_null = false; + } + row.commit(); } + }); - flagShowMessageError = 1; - } - } - }); - - editor.on({ - beforeedit: function(roweditor, rowIndex) - { - setTimeout( - function () + //table columns grid + assignedGrid = new Ext.grid.GridPanel({ + //title: 'Columns', + region: 'center', + id: 'assignedGrid', + ddGroup: 'availableGridDDGroup', + enableDragDrop: true, + enableColumnResize: true, + enableColumnMove: false, + viewConfig: {forceFit: true}, + cm: cm, + sm: sm, + store: store, + plugins: [editor, checkColumn], + tbar: [ { - var fieldTypeValue = Ext.getCmp("fieldType").getValue(); - var fieldNull = Ext.getCmp("field_null"); - var fieldPrimaryKey = Ext.getCmp("field_primary_key"); - var fieldIndex = Ext.getCmp("field_index"); - var fieldInc = Ext.getCmp("field_incre"); - var sizeEdit = Ext.getCmp("sizeEdit"); + icon: '/images/add-row-after.png', + text: _("ID_ADD_FIELD"), + handler: addColumn + }, { + id: 'editColumn', + icon: '/images/edit-row.png', + text: _("ID_EDIT_FIELD"), + disabled: true, + handler: editColumn + }, { + id: 'removeColumn', + icon: '/images/delete-row.png', + text: _("ID_REMOVE_FIELD"), + disabled: true, + handler: removeColumn + } + ], - editorFieldsEnableDisable(fieldTypeValue, fieldNull, fieldPrimaryKey, fieldIndex, fieldInc, sizeEdit); + border: false, + + listeners: { + render: function (grid) { + var ddrow = new Ext.dd.DropTarget(grid.getView().mainBody, { + ddGroup: 'availableGridDDGroup', + copy: false, + notifyDrop: function (dd, e, data) { + var ds = grid.store; + var sm = grid.getSelectionModel(); + var rows = sm.getSelections(); + if (dd.getDragData(e)) { + var cindex = dd.getDragData(e).rowIndex; + //skipping primary keys, we can't reorder + if (store.data.items[cindex].data.field_key) + return; + + if (typeof (cindex) != "undefined") { + for (var i = 0; i < rows.length; i++) { + //skipping primary keys, we can't reorder + if (rows[i].data.field_key) + continue; + + var srcIndex = ds.indexOfId(rows[i].id); + ds.remove(ds.getById(rows[i].id)); + if (i > 0 && cindex < srcIndex) { + cindex++; + } + ds.insert(cindex, rows[i]); + } + sm.selectRecords(rows); + } + } + } + }); + } + } + }); + + assignedGrid.getSelectionModel().on('selectionchange', function (sm) { + //alert('s'); + }); + + // (vertical) selection buttons + buttonsPanel = new Ext.Panel({ + width: 40, + layout: { + type: 'vbox', + padding: '0', + pack: 'center', + align: 'center' + }, + defaults: {margins: '0 0 35 0'}, + items: [ + {xtype: 'button', text: '>', + handler: AssignFieldsAction, + id: 'assignButton', disabled: true }, - 250 - ); - }, - afteredit: function(roweditor, changes, r, rowIndex) - { - row = assignedGrid.getSelectionModel().getSelected(); - //if a column was set as PK so can't be null - if (row.get('field_key') == true) { - row.data.field_null = false; - } - - if (row.get('field_index') == true) { - row.data.field_null = false; - } - row.commit(); - } - }); - - //table columns grid - assignedGrid = new Ext.grid.GridPanel({ - //title: 'Columns', - region: 'center', - id: 'assignedGrid', - ddGroup : 'availableGridDDGroup', - enableDragDrop : true, - enableColumnResize : true, - enableColumnMove: false, - viewConfig : {forceFit:true}, - cm: cm, - sm: sm, - store: store, - plugins: [editor, checkColumn], - tbar: [ - { - icon: '/images/add-row-after.png', - text: _("ID_ADD_FIELD"), - handler: addColumn - }, { - id: 'editColumn', - icon: '/images/edit-row.png', - text: _("ID_EDIT_FIELD"), - disabled: true, - handler: editColumn - }, { - id: 'removeColumn', - icon: '/images/delete-row.png', - text: _("ID_REMOVE_FIELD"), - disabled: true, - handler: removeColumn - } - ], - - border: false, - - listeners: { - render: function(grid) { - var ddrow = new Ext.dd.DropTarget(grid.getView().mainBody, { - ddGroup: 'availableGridDDGroup', - copy: false, - notifyDrop: function(dd, e, data) { - var ds = grid.store; - var sm = grid.getSelectionModel(); - var rows = sm.getSelections(); - if (dd.getDragData(e)) { - var cindex = dd.getDragData(e).rowIndex; - //skipping primary keys, we can't reorder - if (store.data.items[cindex].data.field_key) - return; - - if (typeof(cindex) != "undefined") { - for(var i = 0; i < rows.length; i++) { - //skipping primary keys, we can't reorder - if (rows[i].data.field_key ) - continue; - - var srcIndex = ds.indexOfId(rows[i].id); - ds.remove(ds.getById(rows[i].id)); - if (i > 0 && cindex < srcIndex) { - cindex++; - } - ds.insert(cindex, rows[i]); - } - sm.selectRecords(rows); - } + {xtype: 'button', text: '<', + handler: RemoveFieldsAction, + id: 'removeButton', disabled: true + }, + {xtype: 'button', text: '>>', + handler: AssignAllFieldsAction, + id: 'assignButtonAll', disabled: false}, + {xtype: 'button', text: '<<', + handler: RemoveAllFieldsAction, + id: 'removeButtonAll', disabled: false } - } - }); - } - } - }); + ] - assignedGrid.getSelectionModel().on('selectionchange', function(sm){ - //alert('s'); - }); - - // (vertical) selection buttons - buttonsPanel = new Ext.Panel({ - width : 40, - layout : { - type:'vbox', - padding:'0', - pack:'center', - align:'center' - }, - defaults:{margins:'0 0 35 0'}, - items:[ - { xtype:'button',text: '>', - handler: AssignFieldsAction, - id: 'assignButton', disabled: true - }, - { xtype:'button',text: '<', - handler: RemoveFieldsAction, - id: 'removeButton', disabled: true - }, - { xtype:'button',text: '>>', - handler: AssignAllFieldsAction, - id: 'assignButtonAll', disabled: false}, - { xtype:'button',text: '<<', - handler: RemoveAllFieldsAction, - id: 'removeButtonAll', disabled: false - } - ] - - }); + }); - FieldsPanel = new Ext.Panel({ - //title: _('ID_FIELDS'), - region : 'center', - //autoWidth : true, - width: 150, - layout : 'hbox', - defaults : { flex : 1 }, //auto stretch - layoutConfig : { align : 'stretch' }, - items : [assignedGrid], - viewConfig : {forceFit:true} + FieldsPanel = new Ext.Panel({ + //title: _('ID_FIELDS'), + region: 'center', + //autoWidth : true, + width: 150, + layout: 'hbox', + defaults: {flex: 1}, //auto stretch + layoutConfig: {align: 'stretch'}, + items: [assignedGrid], + viewConfig: {forceFit: true} - }); + }); - searchTextA = new Ext.form.TextField ({ + searchTextA = new Ext.form.TextField({ id: 'searchTextA', - ctCls:'pm_search_text_field', + ctCls: 'pm_search_text_field', allowBlank: true, width: 110, emptyText: _('ID_EMPTY_SEARCH'), listeners: { - specialkey: function(f,e){ - if (e.getKey() == e.ENTER) { - DoSearchA(); + specialkey: function (f, e) { + if (e.getKey() == e.ENTER) { + DoSearchA(); + } } - } } }); - searchTextP = new Ext.form.TextField ({ + searchTextP = new Ext.form.TextField({ id: 'searchTextP', - ctCls:'pm_search_text_field', + ctCls: 'pm_search_text_field', allowBlank: true, width: 110, emptyText: _('ID_EMPTY_SEARCH'), listeners: { - specialkey: function(f,e){ - if (e.getKey() == e.ENTER) { - DoSearchP(); + specialkey: function (f, e) { + if (e.getKey() == e.ENTER) { + DoSearchP(); + } } - } } }); - var types = new Ext.data.SimpleStore({ - fields: ['REP_TAB_TYPE', 'type'], - data : [['NORMAL',_("ID_GLOBAL")],['GRID',_("ID_GRID")]] - }); + var types = new Ext.data.SimpleStore({ + fields: ['REP_TAB_TYPE', 'type'], + data: [['NORMAL', _("ID_GLOBAL")], ['GRID', _("ID_GRID")]] + }); - comboReport = new Ext.form.ComboBox({ - id : 'REP_TAB_TYPE', - name: 'type', - fieldLabel: 'Type', - hiddenName : 'REP_TAB_TYPE', - mode: 'local', - store: types, - displayField:'type', - valueField:'REP_TAB_TYPE', - width: 120, - typeAhead: true, - triggerAction: 'all', - editable:false, - lazyRender: true, - value: typeof TABLE.ADD_TAB_TYPE != 'undefined'? TABLE.ADD_TAB_TYPE : 'NORMAL', - listeners: { - select: function(combo,record,index){ - if (this.getValue()=='NORMAL') { - Ext.getCmp('REP_TAB_GRID').setVisible(false); - loadFieldNormal(); - } else { - Ext.getCmp('availableGrid').store.removeAll(); - Ext.getCmp('REP_TAB_GRID').setVisible(true); - Ext.getCmp('REP_TAB_GRID').setValue(''); - gridsListStore.reload({params:{PRO_UID : PRO_UID !== false ? PRO_UID : Ext.getCmp('PROCESS').getValue()}}); - } - } - } - }); - - dbConnectionsStore = new Ext.data.Store({ - autoLoad: false, - proxy : new Ext.data.HttpProxy({ - url: '../pmTablesProxy/getDbConnectionsList', - method : 'POST' - }), - baseParams : { - PRO_UID : '' - }, - reader : new Ext.data.JsonReader( { - fields : [{name : 'DBS_UID'}, {name : 'DBS_NAME'}] - }), - listeners: { - load: function() { - if (TABLE !== false) { // is editing - // set current editing process combobox - var i = this.findExact('DBS_UID', TABLE.DBS_UID, 0); - if (i > -1){ - comboDbConnections.setValue(this.getAt(i).data.DBS_UID); - comboDbConnections.setRawValue(this.getAt(i).data.DBS_NAME); - comboDbConnections.setDisabled(true); - } else { - // DB COnnection deleted - Ext.Msg.alert( _('ID_ERROR'), _('ID_DB_CONNECTION_NOT_EXIST') ); - } - } else { - comboDbConnections.setValue('rp'); - } - } - } - }); - - comboDbConnections = new Ext.form.ComboBox({ - id: 'REP_TAB_CONNECTION', - fieldLabel : _("ID_DB_CONNECTION"), - hiddenName : 'DBS_UID', - store : dbConnectionsStore, - //value: 'rp', - valueField : 'DBS_UID', - displayField : 'DBS_NAME', - triggerAction : 'all', - editable : false, - mode:'local' - }); - - var tbar = new Array(); - var items = new Array(); - - items.push({ - id: 'REP_TAB_NAME', - fieldLabel: _("ID_TABLE_NAME") + ' ('+_("ID_AUTO_PREFIX") + ' "PMT_")', - xtype:'textfield', - emptyText: _("ID_SET_A_TABLE_NAME"), - width: 250, - autoCreate: {tag: "input", type: "text", autocomplete: "off", maxlength: sizeTableName }, - stripCharsRe: /(\W+)/g, - listeners:{ - change: function(){ - this.setValue(this.getValue().toUpperCase()); - } - } - }); - items.push({ - id: 'REP_TAB_DSC', - fieldLabel: _("ID_DESCRIPTION"), - xtype:'textarea', - emptyText: _("ID_SET_TABLE_DESCRIPTION"), - width: 250, - height: 40, - allowBlank: true - }); - - items.push( - { - layout: "column", - style: "margin-left: 255px;", - hidden: (dataNumRows > 0)? false : true, - items: [ - { - xtype: "checkbox", - id: "chkKeepData", - name: "chkKeepData", - checked : true, - boxLabel: _("ID_PMTABLE_DATA_KEEP") - } - ] - } - ); - - //items.push(comboDbConnections); - - var frmDetails = new Ext.FormPanel({ - id :'frmDetails', - region : 'north', - labelWidth: 250, - labelAlign :'right', - title : ADD_TAB_UID ? _('ID_PMTABLE') : _('ID_NEW_PMTABLE'), - bodyStyle :'padding:10px', - frame : true, - height: 170, - items : items, - //tbar : tbar, - waitMsgTarget : true, - defaults: { - allowBlank : false, - msgTarget : 'side', - align :'center' - } - }); - - - southPanel = new Ext.FormPanel({ - region: 'south', - buttons:[ - { - text: TABLE === false ? _("ID_CREATE") : _("ID_UPDATE"), - handler: function() { - if (TABLE === false || dataNumRows == 0 || Ext.getCmp("chkKeepData").checked == true) { - if (TABLE !== false && TABLE.ADD_TAB_NAME !== Ext.getCmp('REP_TAB_NAME').getValue().trim()) { - PMExt.confirm(_('ID_CONFIRM'), _('ID_THE_NAME_CHANGE_MAY_CAUSE_DATA_LOSS'), createReportTable); - } else { - createReportTable(); + comboReport = new Ext.form.ComboBox({ + id: 'REP_TAB_TYPE', + name: 'type', + fieldLabel: 'Type', + hiddenName: 'REP_TAB_TYPE', + mode: 'local', + store: types, + displayField: 'type', + valueField: 'REP_TAB_TYPE', + width: 120, + typeAhead: true, + triggerAction: 'all', + editable: false, + lazyRender: true, + value: typeof TABLE.ADD_TAB_TYPE != 'undefined' ? TABLE.ADD_TAB_TYPE : 'NORMAL', + listeners: { + select: function (combo, record, index) { + if (this.getValue() == 'NORMAL') { + Ext.getCmp('REP_TAB_GRID').setVisible(false); + loadFieldNormal(); + } else { + Ext.getCmp('availableGrid').store.removeAll(); + Ext.getCmp('REP_TAB_GRID').setVisible(true); + Ext.getCmp('REP_TAB_GRID').setValue(''); + gridsListStore.reload({params: {PRO_UID: PRO_UID !== false ? PRO_UID : Ext.getCmp('PROCESS').getValue()}}); + } } - } - else { - PMExt.confirm(_('ID_CONFIRM'), _('ID_PMTABLE_SAVE_AND_DATA_LOST'), createReportTable); - } } - }, { - text:_("ID_CANCEL"), - handler: function() { - proParam = PRO_UID !== false ? '?PRO_UID='+PRO_UID : ''; - location.href = '../pmTables' + proParam; + }); + + dbConnectionsStore = new Ext.data.Store({ + autoLoad: false, + proxy: new Ext.data.HttpProxy({ + url: '../pmTablesProxy/getDbConnectionsList', + method: 'POST' + }), + baseParams: { + PRO_UID: '' + }, + reader: new Ext.data.JsonReader({ + fields: [{name: 'DBS_UID'}, {name: 'DBS_NAME'}] + }), + listeners: { + load: function () { + if (TABLE !== false) { // is editing + // set current editing process combobox + var i = this.findExact('DBS_UID', TABLE.DBS_UID, 0); + if (i > -1) { + comboDbConnections.setValue(this.getAt(i).data.DBS_UID); + comboDbConnections.setRawValue(this.getAt(i).data.DBS_NAME); + comboDbConnections.setDisabled(true); + } else { + // DB COnnection deleted + Ext.Msg.alert(_('ID_ERROR'), _('ID_DB_CONNECTION_NOT_EXIST')); + } + } else { + comboDbConnections.setValue('rp'); + } + } } - } - ] - }); + }); - var viewport = new Ext.Viewport({ - layout: 'border', - autoScroll: false, - items:[frmDetails, FieldsPanel, southPanel] - }); + comboDbConnections = new Ext.form.ComboBox({ + id: 'REP_TAB_CONNECTION', + fieldLabel: _("ID_DB_CONNECTION"), + hiddenName: 'DBS_UID', + store: dbConnectionsStore, + //value: 'rp', + valueField: 'DBS_UID', + displayField: 'DBS_NAME', + triggerAction: 'all', + editable: false, + mode: 'local' + }); - /*** Editing routines ***/ - if (TABLE !== false) { - Ext.getCmp('REP_TAB_NAME').setValue(TABLE.ADD_TAB_NAME); - Ext.getCmp('REP_TAB_NAME').setDisabled(false); - Ext.getCmp('REP_TAB_DSC').setValue(TABLE.ADD_TAB_DESCRIPTION); + var tbar = new Array(); + var items = new Array(); - loadTableRowsFromArray(TABLE.FIELDS); - } + items.push({ + id: 'REP_TAB_NAME', + fieldLabel: _("ID_TABLE_NAME") + ' (' + _("ID_AUTO_PREFIX") + ' "PMT_")', + xtype: 'textfield', + emptyText: _("ID_SET_A_TABLE_NAME"), + width: 250, + autoCreate: {tag: "input", type: "text", autocomplete: "off", maxlength: sizeTableName}, + stripCharsRe: /(\W+)/g, + listeners: { + change: function () { + this.setValue(this.getValue().toUpperCase()); + } + } + }); + items.push({ + id: 'REP_TAB_DSC', + fieldLabel: _("ID_DESCRIPTION"), + xtype: 'textarea', + emptyText: _("ID_SET_TABLE_DESCRIPTION"), + width: 250, + height: 40, + allowBlank: true + }); + items.push({ + layout: "column", + style: "margin-left: 255px;", + hidden: (dataNumRows > 0) ? false : true, + items: [ + { + xtype: "checkbox", + id: "chkKeepData", + name: "chkKeepData", + checked: true, + boxLabel: _("ID_PMTABLE_DATA_KEEP") + } + ] + }); + items.push({ + layout: "column", + style: "margin-left: 255px;", + hidden: false, + items: [ + { + xtype: "checkbox", + id: "checkboxAvailableOffline", + name: "checkboxAvailableOffline", + checked: false, + boxLabel: _("ID_AVAILABLE_OFFLINE_THE_MOBILE_APPLICATIONS") + } + ] + }); - var newEl, - tpl = new Ext.Template( - '' - ); + //items.push(comboDbConnections); + + var frmDetails = new Ext.FormPanel({ + id: 'frmDetails', + region: 'north', + labelWidth: 250, + labelAlign: 'right', + title: ADD_TAB_UID ? _('ID_PMTABLE') : _('ID_NEW_PMTABLE'), + bodyStyle: 'padding:10px', + frame: true, + height: 170, + items: items, + //tbar : tbar, + waitMsgTarget: true, + defaults: { + allowBlank: false, + msgTarget: 'side', + align: 'center' + } + }); + + + southPanel = new Ext.FormPanel({ + region: 'south', + buttons: [ + { + text: TABLE === false ? _("ID_CREATE") : _("ID_UPDATE"), + handler: function () { + if (TABLE === false || dataNumRows == 0 || Ext.getCmp("chkKeepData").checked == true) { + if (TABLE !== false && TABLE.ADD_TAB_NAME !== Ext.getCmp('REP_TAB_NAME').getValue().trim()) { + PMExt.confirm(_('ID_CONFIRM'), _('ID_THE_NAME_CHANGE_MAY_CAUSE_DATA_LOSS'), createReportTable); + } else { + createReportTable(); + } + } else { + PMExt.confirm(_('ID_CONFIRM'), _('ID_PMTABLE_SAVE_AND_DATA_LOST'), createReportTable); + } + } + }, { + text: _("ID_CANCEL"), + handler: function () { + proParam = PRO_UID !== false ? '?PRO_UID=' + PRO_UID : ''; + location.href = '../pmTables' + proParam; + } + } + ] + }); + + var viewport = new Ext.Viewport({ + layout: 'border', + autoScroll: false, + items: [frmDetails, FieldsPanel, southPanel] + }); + + /*** Editing routines ***/ + if (TABLE !== false) { + Ext.getCmp('REP_TAB_NAME').setValue(TABLE.ADD_TAB_NAME); + Ext.getCmp('REP_TAB_NAME').setDisabled(false); + Ext.getCmp('REP_TAB_DSC').setValue(TABLE.ADD_TAB_DESCRIPTION); + Ext.getCmp('checkboxAvailableOffline').setValue(TABLE.ADD_TAB_OFFLINE === 1); + loadTableRowsFromArray(TABLE.FIELDS); + } + + var newEl, + tpl = new Ext.Template( + '' + ); Ext.getCmp("chkKeepData").on('check', function () { - if (dataNumRows > 0 && Ext.getCmp("chkKeepData").checked === false) { - newEl = tpl.insertFirst(document.getElementById('assignedGrid')); - Ext.fly('hideWarning').on('click', function() { - Ext.fly(newEl).slideOut('t', {useDisplay:true}); - }); - Ext.fly(newEl).slideIn(); - } else if (Ext.getCmp("chkKeepData").checked === true) { - Ext.fly(newEl).slideOut('t', {useDisplay:true}); - } + if (dataNumRows > 0 && Ext.getCmp("chkKeepData").checked === false) { + newEl = tpl.insertFirst(document.getElementById('assignedGrid')); + Ext.fly('hideWarning').on('click', function () { + Ext.fly(newEl).slideOut('t', {useDisplay: true}); + }); + Ext.fly(newEl).slideIn(); + } else if (Ext.getCmp("chkKeepData").checked === true) { + Ext.fly(newEl).slideOut('t', {useDisplay: true}); + } }); }); @@ -838,210 +852,211 @@ Ext.onReady(function(){ function createReportTable() { - var tableName = Ext.getCmp('REP_TAB_NAME').getValue().trim(); - var tableDescription = Ext.getCmp('REP_TAB_DSC').getValue().trim(); + var tableName = Ext.getCmp('REP_TAB_NAME').getValue().trim(); + var tableDescription = Ext.getCmp('REP_TAB_DSC').getValue().trim(); - //validate table name - if (tableName == '') { - Ext.getCmp('REP_TAB_NAME').focus(); - PMExt.error(_('ID_ERROR'), _('ID_TABLE_NAME_IS_REQUIRED'), function(){ - Ext.getCmp('REP_TAB_NAME').focus(); - }); - return false; - } - - // validate table name length - if(tableName.length < 4) { - PMExt.error(_('ID_ERROR'), _('ID_TABLE_NAME_TOO_SHORT'), function(){ - Ext.getCmp('REP_TAB_NAME').focus(); - }); - return false; - } - - var allRows = assignedGrid.getStore(); - var columns = new Array(); - var hasSomePrimaryKey = false; - - //validate columns count - if(allRows.getCount() == 0) { - PMExt.error(_('ID_ERROR'), _('ID_PMTABLES_ALERT7')); - return false; - } - var fieldsNames = new Array(); - // Reserved Words - var reservedWords = new Array('DESC'); - - - for (var i = 0; i < allRows.getCount(); i++) { - row = allRows.getAt(i); - - if (in_array(row.data['field_name'], fieldsNames)) { - PMExt.error(_('ID_ERROR'),_('ID_PMTABLES_ALERT1') + ' ' + row.data['field_name']+''); - return false; - } - - for (j=0; j < reservedWords.length; j++) { - if (row.data['field_name'] == reservedWords[j]) { - PMExt.error(_('ID_ERROR'), _('ID_PMTABLES_RESERVED_FIELDNAME_WARNING', reservedWords[j])); + //validate table name + if (tableName == '') { + Ext.getCmp('REP_TAB_NAME').focus(); + PMExt.error(_('ID_ERROR'), _('ID_TABLE_NAME_IS_REQUIRED'), function () { + Ext.getCmp('REP_TAB_NAME').focus(); + }); return false; - } } - // validate that fieldname is not empty - if(row.data['field_name'].trim() == '') { - PMExt.error(_('ID_ERROR'), _('ID_PMTABLES_ALERT2')); - return false; + // validate table name length + if (tableName.length < 4) { + PMExt.error(_('ID_ERROR'), _('ID_TABLE_NAME_TOO_SHORT'), function () { + Ext.getCmp('REP_TAB_NAME').focus(); + }); + return false; } - if(row.data['field_label'].trim() == '') { - PMExt.error(_('ID_ERROR'), _('ID_PMTABLES_ALERT3')); - return false; + var allRows = assignedGrid.getStore(); + var columns = new Array(); + var hasSomePrimaryKey = false; + + //validate columns count + if (allRows.getCount() == 0) { + PMExt.error(_('ID_ERROR'), _('ID_PMTABLES_ALERT7')); + return false; } + var fieldsNames = new Array(); + // Reserved Words + var reservedWords = new Array('DESC'); - if (row.data['field_type'] == '') { - PMExt.error(_('ID_ERROR'), _('ID_PMTABLES_ALERT4') + ' '+row.data['field_name']+''); - return false; - } - // validate field size for varchar & int column types - if ((row.data['field_type'] == 'VARCHAR' || row.data['field_type'] == 'INTEGER') && row.data['field_size'] == '') { - PMExt.error(_('ID_ERROR'), _('ID_PMTABLES_ALERT5')+' '+row.data['field_name']+' ('+row.data['field_type']+').'); - return false; - } + for (var i = 0; i < allRows.getCount(); i++) { + row = allRows.getAt(i); - if (row.data['field_index']) { - hasSomeIndex = true; - } - - if (row.data['field_key']) { - hasSomePrimaryKey = true; - } - fieldsNames.push(row.data['field_name']); - columns.push(row.data); - } - - if (!hasSomePrimaryKey) { - PMExt.error(_('ID_ERROR'), _('ID_PMTABLES_ALERT6')); - return; - } - - Ext.Msg.show({ - title : '', - msg : TABLE !== false ? _('ID_UPDATING_TABLE') : _('ID_CREATING_TABLE'), - wait:true, - waitConfig: {interval:500} - }); - - var p = { - REP_TAB_UID: (TABLE !== false)? TABLE.ADD_TAB_UID : "", - PRO_UID: "", - REP_TAB_NAME: (TABLE !== false)? tableName : "PMT_" + tableName, - REP_TAB_NAME_OLD_NAME: "PMT_" + ((TABLE !== false) ? TABLE.ADD_TAB_NAME : tableName), - REP_TAB_DSC: tableDescription, - REP_TAB_CONNECTION: "workflow", - REP_TAB_TYPE: "", - REP_TAB_GRID: "", - columns: Ext.util.JSON.encode(columns) - }; - - if (dataNumRows > 0) { - p.keepData = (Ext.getCmp("chkKeepData").checked == true)? 1 : 0; - } - - Ext.Ajax.request({ - url: '../pmTablesProxy/save', - params: p, - success: function(resp){ - try { - result = Ext.util.JSON.decode(resp.responseText); - Ext.MessageBox.hide(); - if (result.success) { - proParam = PRO_UID !== false ? '?PRO_UID='+PRO_UID : ''; - location.href = '../pmTables' + proParam; //history.back(); - } else { - PMExt.error(_('ID_ERROR'), result.type +': '+result.msg); - if (window.console && window.console.firebug) { - window.console.log(result.msg); - window.console.log(result.trace); - } + if (in_array(row.data['field_name'], fieldsNames)) { + PMExt.error(_('ID_ERROR'), _('ID_PMTABLES_ALERT1') + ' ' + row.data['field_name'] + ''); + return false; } - } catch (e) { - if (dbg) { - _showDebugWin(resp.responseText); - } else { - PMExt.error( _('ID_ERROR'), _('ID_SOMETHING_WRONG')); + + for (j = 0; j < reservedWords.length; j++) { + if (row.data['field_name'] == reservedWords[j]) { + PMExt.error(_('ID_ERROR'), _('ID_PMTABLES_RESERVED_FIELDNAME_WARNING', reservedWords[j])); + return false; + } } - } - }, - failure: function(obj, resp){ - Ext.Msg.alert( _('ID_ERROR'), resp.result.msg); + + // validate that fieldname is not empty + if (row.data['field_name'].trim() == '') { + PMExt.error(_('ID_ERROR'), _('ID_PMTABLES_ALERT2')); + return false; + } + + if (row.data['field_label'].trim() == '') { + PMExt.error(_('ID_ERROR'), _('ID_PMTABLES_ALERT3')); + return false; + } + + if (row.data['field_type'] == '') { + PMExt.error(_('ID_ERROR'), _('ID_PMTABLES_ALERT4') + ' ' + row.data['field_name'] + ''); + return false; + } + + // validate field size for varchar & int column types + if ((row.data['field_type'] == 'VARCHAR' || row.data['field_type'] == 'INTEGER') && row.data['field_size'] == '') { + PMExt.error(_('ID_ERROR'), _('ID_PMTABLES_ALERT5') + ' ' + row.data['field_name'] + ' (' + row.data['field_type'] + ').'); + return false; + } + + if (row.data['field_index']) { + hasSomeIndex = true; + } + + if (row.data['field_key']) { + hasSomePrimaryKey = true; + } + fieldsNames.push(row.data['field_name']); + columns.push(row.data); } - }); + + if (!hasSomePrimaryKey) { + PMExt.error(_('ID_ERROR'), _('ID_PMTABLES_ALERT6')); + return; + } + + Ext.Msg.show({ + title: '', + msg: TABLE !== false ? _('ID_UPDATING_TABLE') : _('ID_CREATING_TABLE'), + wait: true, + waitConfig: {interval: 500} + }); + + var p = { + REP_TAB_UID: (TABLE !== false) ? TABLE.ADD_TAB_UID : "", + PRO_UID: "", + REP_TAB_NAME: (TABLE !== false) ? tableName : "PMT_" + tableName, + REP_TAB_NAME_OLD_NAME: "PMT_" + ((TABLE !== false) ? TABLE.ADD_TAB_NAME : tableName), + REP_TAB_DSC: tableDescription, + REP_TAB_CONNECTION: "workflow", + REP_TAB_TYPE: "", + REP_TAB_GRID: "", + REP_TAB_OFFLINE: Ext.getCmp("checkboxAvailableOffline").checked === true ? "1" : "0", + columns: Ext.util.JSON.encode(columns) + }; + + if (dataNumRows > 0) { + p.keepData = (Ext.getCmp("chkKeepData").checked == true) ? 1 : 0; + } + + Ext.Ajax.request({ + url: '../pmTablesProxy/save', + params: p, + success: function (resp) { + try { + result = Ext.util.JSON.decode(resp.responseText); + Ext.MessageBox.hide(); + if (result.success) { + proParam = PRO_UID !== false ? '?PRO_UID=' + PRO_UID : ''; + location.href = '../pmTables' + proParam; //history.back(); + } else { + PMExt.error(_('ID_ERROR'), result.type + ': ' + result.msg); + if (window.console && window.console.firebug) { + window.console.log(result.msg); + window.console.log(result.trace); + } + } + } catch (e) { + if (dbg) { + _showDebugWin(resp.responseText); + } else { + PMExt.error(_('ID_ERROR'), _('ID_SOMETHING_WRONG')); + } + } + }, + failure: function (obj, resp) { + Ext.Msg.alert(_('ID_ERROR'), resp.result.msg); + } + }); } //end createReportTable function _showDebugWin(content) { - dbgWin = new Ext.Window({ - title: '', - id: 'dbgWin', - layout: 'fit', - width: 570, - height: 400, - modal: false, - autoScroll: true, - maximizable: true, - //closeAction: 'hide', - maximizable : false, - items: [], - x: 0, - y: 0, - html: '
    ' + content + '
    ' - }); + dbgWin = new Ext.Window({ + title: '', + id: 'dbgWin', + layout: 'fit', + width: 570, + height: 400, + modal: false, + autoScroll: true, + maximizable: true, + //closeAction: 'hide', + maximizable: false, + items: [], + x: 0, + y: 0, + html: '
    ' + content + '
    ' + }); - dbgWin.show(); + dbgWin.show(); } function addColumn() { - var PMRow = assignedGrid.getStore().recordType; - //var meta = mapPMFieldType(records[i].data['FIELD_UID']); - var row = new PMRow({ - uid : '', - field_uid : '', - field_dyn : '', - field_name : '', - field_label: '', - field_type : '', - field_size : '', - field_key : 0, - field_index : 0, - field_null : 1 - }); - var len = assignedGrid.getStore().data.length; + var PMRow = assignedGrid.getStore().recordType; + //var meta = mapPMFieldType(records[i].data['FIELD_UID']); + var row = new PMRow({ + uid: '', + field_uid: '', + field_dyn: '', + field_name: '', + field_label: '', + field_type: '', + field_size: '', + field_key: 0, + field_index: 0, + field_null: 1 + }); + var len = assignedGrid.getStore().data.length; - editor.stopEditing(); - store.insert(len, row); - assignedGrid.getView().refresh(); - assignedGrid.getSelectionModel().selectRow(len); - editor.startEditing(len); + editor.stopEditing(); + store.insert(len, row); + assignedGrid.getView().refresh(); + assignedGrid.getSelectionModel().selectRow(len); + editor.startEditing(len); } function editColumn() { - var row = Ext.getCmp('assignedGrid').getSelectionModel().getSelected(); - var selIndex = store.indexOfId(row.id); - editor.stopEditing(); - assignedGrid.getView().refresh(); - assignedGrid.getSelectionModel().selectRow(selIndex); - editor.startEditing(selIndex); + var row = Ext.getCmp('assignedGrid').getSelectionModel().getSelected(); + var selIndex = store.indexOfId(row.id); + editor.stopEditing(); + assignedGrid.getView().refresh(); + assignedGrid.getSelectionModel().selectRow(selIndex); + editor.startEditing(selIndex); } function removeColumn() { - PMExt.confirm(_('ID_CONFIRM'), _('ID_CONFIRM_REMOVE_FIELD'), function(){ - var records = Ext.getCmp('assignedGrid').getSelectionModel().getSelections(); - Ext.each(records, Ext.getCmp('assignedGrid').store.remove, Ext.getCmp('assignedGrid').store); - }); + PMExt.confirm(_('ID_CONFIRM'), _('ID_CONFIRM_REMOVE_FIELD'), function () { + var records = Ext.getCmp('assignedGrid').getSelectionModel().getSelections(); + Ext.each(records, Ext.getCmp('assignedGrid').store.remove, Ext.getCmp('assignedGrid').store); + }); } function editorFieldsEnableDisable(fieldTypeValue, fieldNull, fieldPrimaryKey, fieldIndex, fieldInc, sizeEdit) @@ -1062,11 +1077,11 @@ function editorFieldsEnableDisable(fieldTypeValue, fieldNull, fieldPrimaryKey, f //Numbers if (fieldTypeValue == "INTEGER" || fieldTypeValue == "BIGINT") { - //Enable All + //Enable All } if (fieldTypeValue == "TINYINT" || fieldTypeValue == "SMALLINT") { - swSize = 0; + swSize = 0; } if (fieldTypeValue == "DECIMAL" || fieldTypeValue == "FLOAT") { @@ -1076,10 +1091,10 @@ function editorFieldsEnableDisable(fieldTypeValue, fieldNull, fieldPrimaryKey, f } if (fieldTypeValue == "DOUBLE" || fieldTypeValue == "REAL") { - swSize = 0; - swPK = 0; - swAI = 0; - swI = 0; + swSize = 0; + swPK = 0; + swAI = 0; + swI = 0; } //String @@ -1150,189 +1165,192 @@ function editorFieldsEnableDisable(fieldTypeValue, fieldNull, fieldPrimaryKey, f } ////ASSIGNBUTON FUNCTIONALITY -AssignFieldsAction = function(){ - records = Ext.getCmp('availableGrid').getSelectionModel().getSelections(); +AssignFieldsAction = function () { + var records, i; - for(i=0; i < records.length; i++){ - var PMRow = assignedGrid.getStore().recordType; - var meta = mapPMFieldType(records[i].data['FIELD_UID']); - var row = new PMRow({ - uid : '', - field_uid : records[i].data['FIELD_UID'], - field_dyn : records[i].data['FIELD_NAME'], - field_name : records[i].data['FIELD_NAME'].toUpperCase(), - field_label : records[i].data['FIELD_NAME'].toUpperCase(), - field_type : meta.type, - field_size : meta.size, - field_key : 0, - field_index : 0, - field_null : 1 - }); + records = Ext.getCmp('availableGrid').getSelectionModel().getSelections(); - store.add(row); - } + for (i = 0; i < records.length; i++) { + var PMRow = assignedGrid.getStore().recordType; + var meta = mapPMFieldType(records[i].data['FIELD_UID']); + var row = new PMRow({ + uid: '', + field_uid: records[i].data['FIELD_UID'], + field_dyn: records[i].data['FIELD_NAME'], + field_name: records[i].data['FIELD_NAME'].toUpperCase(), + field_label: records[i].data['FIELD_NAME'].toUpperCase(), + field_type: meta.type, + field_size: meta.size, + field_key: 0, + field_index: 0, + field_null: 1 + }); - //remove from source grid - Ext.each(records, Ext.getCmp('availableGrid').store.remove, Ext.getCmp('availableGrid').store); + store.add(row); + } + + //remove from source grid + Ext.each(records, Ext.getCmp('availableGrid').store.remove, Ext.getCmp('availableGrid').store); }; //RemoveButton Functionality -RemoveFieldsAction = function(){ +RemoveFieldsAction = function () { - records = Ext.getCmp('assignedGrid').getSelectionModel().getSelections(); - var PMRow = availableGrid.getStore().recordType; - for(i=0; i < records.length; i++){ - if (records[i].data['field_dyn'] != '' && records[i].data['field_name'] != 'APP_UID' && records[i].data['field_name'] != 'APP_NUMBER' && records[i].data['field_name'] != 'ROW') { - var row = new PMRow({ - FIELD_UID : records[i].data['field_uid'], - FIELD_NAME : records[i].data['field_dyn'] - }); - availableGrid.getStore().add(row); - } else { - records[i] = null; + records = Ext.getCmp('assignedGrid').getSelectionModel().getSelections(); + var PMRow = availableGrid.getStore().recordType; + for (i = 0; i < records.length; i++) { + if (records[i].data['field_dyn'] != '' && records[i].data['field_name'] != 'APP_UID' && records[i].data['field_name'] != 'APP_NUMBER' && records[i].data['field_name'] != 'ROW') { + var row = new PMRow({ + FIELD_UID: records[i].data['field_uid'], + FIELD_NAME: records[i].data['field_dyn'] + }); + availableGrid.getStore().add(row); + } else { + records[i] = null; + } } - } - //remove from source grid - Ext.each(records, Ext.getCmp('assignedGrid').store.remove, Ext.getCmp('assignedGrid').store); + //remove from source grid + Ext.each(records, Ext.getCmp('assignedGrid').store.remove, Ext.getCmp('assignedGrid').store); }; //AssignALLButton Functionality -AssignAllFieldsAction = function(){ - var available = Ext.getCmp('availableGrid'); - var allRows = available.getStore(); - var arrAux = new Array(); - records = new Array() +AssignAllFieldsAction = function () { + var available = Ext.getCmp('availableGrid'); + var allRows = available.getStore(); + var arrAux = new Array(); + records = new Array() - if (allRows.getCount() > 0){ - var PMRow = assignedGrid.getStore().recordType; - for (i=0; i < allRows.getCount(); i++){ - records[i] = allRows.getAt(i); - var meta = mapPMFieldType(records[i].data['FIELD_UID']); - var row = new PMRow({ - uid : '', - field_uid : records[i].data['FIELD_UID'], - field_dyn : records[i].data['FIELD_NAME'], - field_name : records[i].data['FIELD_NAME'].toUpperCase(), - field_label : records[i].data['FIELD_NAME'].toUpperCase(), - field_type : meta.type, - field_size : meta.size, - field_key : 0, - field_index : 0, - field_null : 1 - }); + if (allRows.getCount() > 0) { + var PMRow = assignedGrid.getStore().recordType; + for (i = 0; i < allRows.getCount(); i++) { + records[i] = allRows.getAt(i); + var meta = mapPMFieldType(records[i].data['FIELD_UID']); + var row = new PMRow({ + uid: '', + field_uid: records[i].data['FIELD_UID'], + field_dyn: records[i].data['FIELD_NAME'], + field_name: records[i].data['FIELD_NAME'].toUpperCase(), + field_label: records[i].data['FIELD_NAME'].toUpperCase(), + field_type: meta.type, + field_size: meta.size, + field_key: 0, + field_index: 0, + field_null: 1 + }); - store.add(row); + store.add(row); + } + //remove from source grid + Ext.each(records, Ext.getCmp('availableGrid').store.remove, Ext.getCmp('availableGrid').store); } - //remove from source grid - Ext.each(records, Ext.getCmp('availableGrid').store.remove, Ext.getCmp('availableGrid').store); - } }; //RevomeALLButton Functionality -RemoveAllFieldsAction = function(){ - var allRows = Ext.getCmp('assignedGrid').getStore(); - var records = new Array(); - if (allRows.getCount() > 0) { - var PMRow = availableGrid.getStore().recordType; - for (var i=0; i < allRows.getCount(); i++){ - records[i] = allRows.getAt(i); - if (records[i].data['field_dyn'] != '' && records[i].data['field_name'] != 'APP_UID' && records[i].data['field_name'] != 'APP_NUMBER' && records[i].data['field_name'] != 'ROW') { - var row = new PMRow({ - FIELD_UID : records[i].data['field_uid'], - FIELD_NAME : records[i].data['field_dyn'] - }); - availableGrid.getStore().add(row); - } else { - records[i] = null; - } +RemoveAllFieldsAction = function () { + var allRows = Ext.getCmp('assignedGrid').getStore(); + var records = new Array(); + if (allRows.getCount() > 0) { + var PMRow = availableGrid.getStore().recordType; + for (var i = 0; i < allRows.getCount(); i++) { + records[i] = allRows.getAt(i); + if (records[i].data['field_dyn'] != '' && records[i].data['field_name'] != 'APP_UID' && records[i].data['field_name'] != 'APP_NUMBER' && records[i].data['field_name'] != 'ROW') { + var row = new PMRow({ + FIELD_UID: records[i].data['field_uid'], + FIELD_NAME: records[i].data['field_dyn'] + }); + availableGrid.getStore().add(row); + } else { + records[i] = null; + } + } + //remove from source grid + Ext.each(records, Ext.getCmp('assignedGrid').store.remove, Ext.getCmp('assignedGrid').store); } - //remove from source grid - Ext.each(records, Ext.getCmp('assignedGrid').store.remove, Ext.getCmp('assignedGrid').store); - } }; // drag & drop handler -var DDLoadFields = function(){ - var availableGridDropTargetEl = availableGrid.getView().scroller.dom; - var availableGridDropTarget = new Ext.dd.DropTarget(availableGridDropTargetEl, { - ddGroup : 'availableGridDDGroup', - notifyDrop : function(ddSource, e, data){ +var DDLoadFields = function () { + var availableGridDropTargetEl = availableGrid.getView().scroller.dom; + var availableGridDropTarget = new Ext.dd.DropTarget(availableGridDropTargetEl, { + ddGroup: 'availableGridDDGroup', + notifyDrop: function (ddSource, e, data) { - var records = ddSource.dragData.selections; - var PMRow = availableGrid.getStore().recordType; + var records = ddSource.dragData.selections; + var PMRow = availableGrid.getStore().recordType; - for (i=0; i < records.length; i++){ - if (records[i].data['field_dyn'] != '' && records[i].data['field_name'] != 'APP_UID' && records[i].data['field_name'] != 'APP_NUMBER' && records[i].data['field_name'] != 'ROW') { - var row = new PMRow({ - FIELD_UID: records[i].data['field_uid'], - FIELD_NAME: records[i].data['field_dyn'] - }); - availableGrid.getStore().add(row); - } else if (records[i].data['field_dyn'] != '') { - records[i] = null; + for (i = 0; i < records.length; i++) { + if (records[i].data['field_dyn'] != '' && records[i].data['field_name'] != 'APP_UID' && records[i].data['field_name'] != 'APP_NUMBER' && records[i].data['field_name'] != 'ROW') { + var row = new PMRow({ + FIELD_UID: records[i].data['field_uid'], + FIELD_NAME: records[i].data['field_dyn'] + }); + availableGrid.getStore().add(row); + } else if (records[i].data['field_dyn'] != '') { + records[i] = null; + } + } + + Ext.each(records, ddSource.grid.store.remove, ddSource.grid.store); + return true; } - } + }); - Ext.each(records, ddSource.grid.store.remove, ddSource.grid.store); - return true; - } - }); + //droptarget on grid forassignment + var assignedGridDropTargetEl = assignedGrid.getView().scroller.dom; + var assignedGridDropTarget = new Ext.dd.DropTarget(assignedGridDropTargetEl, { + ddGroup: 'assignedGridDDGroup', + notifyDrop: function (ddSource, e, data) { - //droptarget on grid forassignment - var assignedGridDropTargetEl = assignedGrid.getView().scroller.dom; - var assignedGridDropTarget = new Ext.dd.DropTarget(assignedGridDropTargetEl, { - ddGroup : 'assignedGridDDGroup', - notifyDrop : function(ddSource, e, data){ + var records = ddSource.dragData.selections; + var PMRow = assignedGrid.getStore().recordType; - var records = ddSource.dragData.selections; - var PMRow = assignedGrid.getStore().recordType; + //add on target grid + for (i = 0; i < records.length; i++) { + //arrAux[r] = records[r].data['FIELD_UID']; + var meta = mapPMFieldType(records[i].data['FIELD_UID']); + var row = new PMRow({ + uid: '', + field_uid: records[i].data['FIELD_UID'], + field_dyn: records[i].data['FIELD_NAME'], + field_name: records[i].data['FIELD_NAME'].toUpperCase(), + field_label: records[i].data['FIELD_NAME'].toUpperCase(), + field_type: meta.type, + field_size: meta.size, + field_key: 0, + field_index: 0, + field_null: 1 + }); - //add on target grid - for (i=0; i < records.length; i++){ - //arrAux[r] = records[r].data['FIELD_UID']; - var meta = mapPMFieldType(records[i].data['FIELD_UID']); - var row = new PMRow({ - uid : '', - field_uid : records[i].data['FIELD_UID'], - field_dyn : records[i].data['FIELD_NAME'], - field_name : records[i].data['FIELD_NAME'].toUpperCase(), - field_label : records[i].data['FIELD_NAME'].toUpperCase(), - field_type : meta.type, - field_size : meta.size, - field_key : 0, - field_index : 0, - field_null : 1 - }); + store.add(row); + } + //remove from source grid + Ext.each(records, availableGrid.store.remove, availableGrid.store); - store.add(row); - } - //remove from source grid - Ext.each(records, availableGrid.store.remove, availableGrid.store); - - return true; - } - }); - //sw_func_groups = true; + return true; + } + }); + //sw_func_groups = true; }; function loadTableRowsFromArray(records) { var PMRow = assignedGrid.getStore().recordType; - if (records.length == 0) return; - for (i=0;i('+ _('ID_OLD_VERSION') +')' : v; - }}); - cmodelColumns.push({header: _('ID_DESCRIPTION'), dataIndex: 'ADD_TAB_DESCRIPTION', sortable: true, width: 400, hidden: false, align: 'left', renderer: function (v, p, r) { - if (r.get('ADD_TAB_TAG')) { - tag = r.get('ADD_TAB_TAG').replace('plugin@', ''); - tag = tag.charAt(0).toUpperCase() + tag.slice(1); - switch(tag.toLowerCase()){ - case 'simplereport': - tag = _('ID_SIMPLE_REPORT'); - break; + cmodelColumns.push({id: 'ADD_TAB_UID', dataIndex: 'ADD_TAB_UID', hidden: true, hideable: false}); + cmodelColumns.push({dataIndex: 'ADD_TAB_TAG', hidden: true, hideable: false}); + cmodelColumns.push({header: _('ID_NAME'), dataIndex: 'ADD_TAB_NAME', width: 300, align: 'left', renderer: function (v, p, r) { + return r.get('TYPE') == 'CLASSIC' ? v + ' (' + _('ID_OLD_VERSION') + ')' : v; } - } - - v = Ext.util.Format.htmlEncode(v); + }); + cmodelColumns.push({header: _('ID_DESCRIPTION'), dataIndex: 'ADD_TAB_DESCRIPTION', sortable: true, width: 400, hidden: false, align: 'left', renderer: function (v, p, r) { + if (r.get('ADD_TAB_TAG')) { + tag = r.get('ADD_TAB_TAG').replace('plugin@', ''); + tag = tag.charAt(0).toUpperCase() + tag.slice(1); + switch (tag.toLowerCase()) { + case 'simplereport': + tag = _('ID_SIMPLE_REPORT'); + break; + } + } - return r.get("ADD_TAB_TAG") ? "" + tag + ": "+ v : v; - }}); - cmodelColumns.push({header: _('ID_TABLE_TYPE'), dataIndex: 'PRO_UID', width: 120, align:'left', renderer: function(v,p,r){ - color = r.get('PRO_UID') ? 'blue' : 'green'; - value = r.get('PRO_UID') ? _('ID_REPORT_TABLE') : _('ID_PMTABLE'); - return ''+value+' '; - }}); + v = Ext.util.Format.htmlEncode(v); + + return r.get("ADD_TAB_TAG") ? "" + tag + ": " + v : v; + } + }); + cmodelColumns.push({header: _('ID_TABLE_TYPE'), dataIndex: 'PRO_UID', width: 120, align: 'left', renderer: function (v, p, r) { + color = r.get('PRO_UID') ? 'blue' : 'green'; + value = r.get('PRO_UID') ? _('ID_REPORT_TABLE') : _('ID_PMTABLE'); + return '' + value + ' '; + } + }); cmodelColumns.push({dataIndex: "DBS_UID", hidden: true, hideable: false}); - cmodelColumns.push({header: _('ID_RECORDS'), dataIndex: 'NUM_ROWS', width: 90, align:'left', renderer: function (v, p, r) { - return '
    ' + v + '
    '; - }}); + cmodelColumns.push({header: _('ID_RECORDS'), dataIndex: 'NUM_ROWS', width: 90, align: 'left', renderer: function (v, p, r) { + return '
    ' + v + '
    '; + } + }); if (PRO_UID === false) { - cmodelColumns.push({header: _('ID_PROCESS'), dataIndex: 'PRO_TITLE', width: 180, align:'left'}); + cmodelColumns.push({header: _('ID_PROCESS'), dataIndex: 'PRO_TITLE', width: 180, align: 'left'}); } - cmodelColumns.push({header: _('ID_TYPE'), dataIndex: 'ADD_TAB_TYPE', width: 400, hidden:true, align:'left'}); + cmodelColumns.push({header: _('ID_TYPE'), dataIndex: 'ADD_TAB_TYPE', width: 400, hidden: true, align: 'left'}); + + cmodelColumns.push({header: _('ID_AVAILABLE_OFFLINE'), dataIndex: 'ADD_TAB_OFFLINE', width: 400, align: 'left', renderer: function (value) { + return value === "1" ? _('ID_YES') : _('ID_NO'); + } + }); cmodel = new Ext.grid.ColumnModel({ - defaults: { - width: 50, - sortable: true - }, - columns: cmodelColumns + defaults: { + width: 50, + sortable: true + }, + columns: cmodelColumns }); bbarpaging = new Ext.PagingToolbar({ @@ -327,53 +336,53 @@ Ext.onReady(function(){ pageSize: pageSize, store: store, displayInfo: true, - displayMsg: (PRO_UID? _('ID_GRID_PAGE_DISPLAYING_REPORTABLES_MESSAGE') : _('ID_GRID_PAGE_DISPLAYING_PMTABLES_MESSAGE')) + '    ', + displayMsg: (PRO_UID ? _('ID_GRID_PAGE_DISPLAYING_REPORTABLES_MESSAGE') : _('ID_GRID_PAGE_DISPLAYING_PMTABLES_MESSAGE')) + '    ', emptyMsg: _('ID_GRID_PAGE_NO_PMTABLES_MESSAGE'), - items: ['-',_('ID_PAGE_SIZE')+':',comboPageSize] + items: ['-', _('ID_PAGE_SIZE') + ':', comboPageSize] }); infoGrid = new Ext.grid.GridPanel({ - region: 'center', - layout: 'fit', - id: 'infoGrid', - height:100, - autoWidth : true, - title : (PRO_UID? _('ID_REPORT_TABLES') : _('ID_PMTABLE')), - stateful : true, - stateId : 'gridList', - enableColumnResize: true, - enableHdMenu: true, - frame:false, - columnLines: false, - viewConfig: { - forceFit:true - }, - store: store, - loadMask: true, - cm: cmodel, - sm: chkSelModel, - tbar: [ - newButton, - editButton, - deleteButton,'-', - dataButton,'-' , - importButton, - exportButton, - '->', - searchText, - clearTextButton, - searchButton], - bbar: bbarpaging, - listeners: { - rowdblclick: EditPMTable, - render: function(){ - this.loadMask = new Ext.LoadMask(this.body, {msg: _('ID_LOADING_GRID')}); - } - }, - view: new Ext.grid.GroupingView({ - forceFit:true, - groupTextTpl: '{text}' - }) + region: 'center', + layout: 'fit', + id: 'infoGrid', + height: 100, + autoWidth: true, + title: (PRO_UID ? _('ID_REPORT_TABLES') : _('ID_PMTABLE')), + stateful: true, + stateId: 'gridList', + enableColumnResize: true, + enableHdMenu: true, + frame: false, + columnLines: false, + viewConfig: { + forceFit: true + }, + store: store, + loadMask: true, + cm: cmodel, + sm: chkSelModel, + tbar: [ + newButton, + editButton, + deleteButton, '-', + dataButton, '-', + importButton, + exportButton, + '->', + searchText, + clearTextButton, + searchButton], + bbar: bbarpaging, + listeners: { + rowdblclick: EditPMTable, + render: function () { + this.loadMask = new Ext.LoadMask(this.body, {msg: _('ID_LOADING_GRID')}); + } + }, + view: new Ext.grid.GroupingView({ + forceFit: true, + groupTextTpl: '{text}' + }) }); infoGrid.on('rowcontextmenu', function (grid, rowIndex, evt) { @@ -397,17 +406,19 @@ Ext.onReady(function(){ } else { externalOption.setDisabled(true); } - externalOption.setHidden((rowsSelected[0].get("TYPE") != "CLASSIC" && rowsSelected[0].get("DBS_UID") == "workflow")? false : true); + externalOption.setHidden((rowsSelected[0].get("TYPE") != "CLASSIC" && rowsSelected[0].get("DBS_UID") == "workflow") ? false : true); } - },this); + }, this); - infoGrid.on('contextmenu', function(evt){evt.preventDefault();}, this); - infoGrid.addListener('rowcontextmenu',onMessageContextMenu, this); + infoGrid.on('contextmenu', function (evt) { + evt.preventDefault(); + }, this); + infoGrid.addListener('rowcontextmenu', onMessageContextMenu, this); viewport = new Ext.Viewport({ - layout: 'fit', - autoScroll: false, - items: [infoGrid] + layout: 'fit', + autoScroll: false, + items: [infoGrid] }); infoGrid.store.load(); @@ -423,526 +434,527 @@ onMessageContextMenu = function (grid, rowIndex, e) { /////JS FUNCTIONS //Capitalize String Function -capitalize = function(s){ - s = s.toLowerCase(); - return s.replace( /(^|\s)([a-z])/g , function(m,p1,p2){ return p1+p2.toUpperCase(); } ); +capitalize = function (s) { + s = s.toLowerCase(); + return s.replace(/(^|\s)([a-z])/g, function (m, p1, p2) { + return p1 + p2.toUpperCase(); + }); }; //Do Nothing Function -DoNothing = function(){}; +DoNothing = function () {}; //Load New PM Table Forms -NewReportTable = function() { - if(PRO_UID !== false) { - location.href = 'pmTables/edit?PRO_UID='+PRO_UID+'&tableType=report&flagProcessmap='+flagProcessmap; +NewReportTable = function () { + if (PRO_UID !== false) { + location.href = 'pmTables/edit?PRO_UID=' + PRO_UID + '&tableType=report&flagProcessmap=' + flagProcessmap; } else { - location.href = 'pmTables/edit?tableType=report&flagProcessmap='+flagProcessmap; + location.href = 'pmTables/edit?tableType=report&flagProcessmap=' + flagProcessmap; } }; -NewReportTableOld = function(){ - //location.href = 'reportTables/edit?PRO_UID='+PRO_UID+'&tableType=report'; - //parent.reportTables2(); - //parent.Pm.data.render.buildingBlocks.injector('reportTables2'); - location.href = 'reportTables/reportTables_Edit?PRO_UID='+PRO_UID; +NewReportTableOld = function () { + //location.href = 'reportTables/edit?PRO_UID='+PRO_UID+'&tableType=report'; + //parent.reportTables2(); + //parent.Pm.data.render.buildingBlocks.injector('reportTables2'); + location.href = 'reportTables/reportTables_Edit?PRO_UID=' + PRO_UID; }; -newPMTable = function(){ - location.href = 'pmTables/edit?tableType=table'; +newPMTable = function () { + location.href = 'pmTables/edit?tableType=table'; }; -EditPMTable = function(){ - var row = Ext.getCmp('infoGrid').getSelectionModel().getSelected(); +EditPMTable = function () { + var row = Ext.getCmp('infoGrid').getSelectionModel().getSelected(); if (row.data.TYPE != 'CLASSIC') { - tableType = row.data.PRO_UID ? 'report' : 'table'; - proParam = PRO_UID !== false ? '&PRO_UID='+PRO_UID : ''; - location.href = 'pmTables/edit?id='+row.data.ADD_TAB_UID+'&flagProcessmap='+flagProcessmap+'&tableType=' + tableType + proParam; - } - else { //edit old report table - location.href = 'reportTables/reportTables_Edit?REP_TAB_UID='+row.data.ADD_TAB_UID + tableType = row.data.PRO_UID ? 'report' : 'table'; + proParam = PRO_UID !== false ? '&PRO_UID=' + PRO_UID : ''; + location.href = 'pmTables/edit?id=' + row.data.ADD_TAB_UID + '&flagProcessmap=' + flagProcessmap + '&tableType=' + tableType + proParam; + } else { //edit old report table + location.href = 'reportTables/reportTables_Edit?REP_TAB_UID=' + row.data.ADD_TAB_UID } }; //Confirm PM Table Deletion Tasks -DeletePMTable = function() { - var rows = Ext.getCmp('infoGrid').getSelectionModel().getSelections(); - var selections = new Array(); +DeletePMTable = function () { + var rows = Ext.getCmp('infoGrid').getSelectionModel().getSelections(); + var selections = new Array(); - for(var i=0; i' + _('ID_IMPORTING_ERROR') + '' + result.message, - items: [], + if (result.success) { + PMExt.notify('', result.message); + } else { + win = new Ext.Window({ + id: 'windowImportingError', + applyTo: 'hello-win', + layout: 'fit', + width: 500, + height: 300, + closeAction: 'hide', + plain: true, + html: '

    ' + _('ID_IMPORTING_ERROR') + '

    ' + result.message, + items: [], - buttons: [{ - text: 'Close', - handler: function () { - win.hide(); + buttons: [{ + text: 'Close', + handler: function () { + win.hide(); + } + }] + }); + win.show(this); } - }] - }); - win.show(this); - } - w.close(); - infoGrid.store.reload(); - }, - failure: function (o, resp) { - w.close(); - infoGrid.store.reload(); - - var result = Ext.util.JSON.decode(resp.response.responseText); - if (result.errorType == 'warning') { - Ext.MessageBox.show({ - title: _('ID_WARNING_PMTABLES'), - width: 510, - height: 300, - msg: "
    " + result.message.replace(/\n/g, '
    ') + "
    ", - buttons: Ext.MessageBox.OK, - animEl: 'mb9', - fn: function () { + w.close(); + infoGrid.store.reload(); }, - icon: Ext.MessageBox.INFO - }); - } else { - if (result.errorType == 'notice') { - Ext.MessageBox.alert(_("ID_ERROR"), result.message); - } else { - if (result.fromAdmin) { /* from admin tab */ - aOverwrite = result.arrayOverwrite; - aRelated = result.arrayRelated; - aMessage = result.arrayMessage; - pmtablesErrors(aOverwrite, aRelated, aMessage); - } else { /* from designer tab */ - aOverwrite = result.arrayOverwrite; - aRelated = result.arrayRelated; - aMessage = result.arrayMessage; - pmtablesErrors(aOverwrite, aRelated, aMessage); + failure: function (o, resp) { + w.close(); + infoGrid.store.reload(); + + var result = Ext.util.JSON.decode(resp.response.responseText); + if (result.errorType == 'warning') { + Ext.MessageBox.show({ + title: _('ID_WARNING_PMTABLES'), + width: 510, + height: 300, + msg: "
    " + result.message.replace(/\n/g, '
    ') + "
    ", + buttons: Ext.MessageBox.OK, + animEl: 'mb9', + fn: function () { + }, + icon: Ext.MessageBox.INFO + }); + } else { + if (result.errorType == 'notice') { + Ext.MessageBox.alert(_("ID_ERROR"), result.message); + } else { + if (result.fromAdmin) { /* from admin tab */ + aOverwrite = result.arrayOverwrite; + aRelated = result.arrayRelated; + aMessage = result.arrayMessage; + pmtablesErrors(aOverwrite, aRelated, aMessage); + } else { /* from designer tab */ + aOverwrite = result.arrayOverwrite; + aRelated = result.arrayRelated; + aMessage = result.arrayMessage; + pmtablesErrors(aOverwrite, aRelated, aMessage); + } + } + } } - } + }); } + } else { + Ext.MessageBox.alert(_("ID_ERROR"), _("ID_FILE_UPLOAD_INCORRECT_EXTENSION")); } - }); - } - } else { - Ext.MessageBox.alert(_("ID_ERROR"), _("ID_FILE_UPLOAD_INCORRECT_EXTENSION")); - } - } - },{ - id: 'importPMTableButtonCancel', - text: TRANSLATIONS.ID_CANCEL, - handler: function(){ - w.close(); - } - }] - }) - ] - }); - w.show(); + } + }, { + id: 'importPMTableButtonCancel', + text: TRANSLATIONS.ID_CANCEL, + handler: function () { + w.close(); + } + }] + }) + ] + }); + w.show(); } //Load Export PM Tables Form -ExportPMTable = function(){ - var rows = Ext.getCmp('infoGrid').getSelectionModel().getSelections(); - var toExportRows = new Array(); +ExportPMTable = function () { + var rows = Ext.getCmp('infoGrid').getSelectionModel().getSelections(); + var toExportRows = new Array(); - for(var i=0; i Date: Fri, 22 Nov 2019 15:01:08 -0400 Subject: [PATCH 03/12] PMC-1380 --- database/factories/FieldsFactory.php | 50 +++++ .../Model/AdditionalTablesTest.php | 81 ++++++++ .../src/ProcessMaker/Model/FieldsTest.php | 40 ++++ .../src/ProcessMaker/BusinessModel/Table.php | 2 +- .../ProcessMaker/Model/AdditionalTables.php | 81 ++++++++ .../engine/src/ProcessMaker/Model/Fields.php | 55 ++++++ .../src/ProcessMaker/Services/Api/Pmtable.php | 178 ++++++++++++------ workflow/engine/templates/pmTables/edit.js | 26 +-- workflow/engine/templates/pmTables/list.js | 24 +-- 9 files changed, 438 insertions(+), 99 deletions(-) create mode 100644 database/factories/FieldsFactory.php create mode 100644 tests/unit/workflow/engine/src/ProcessMaker/Model/AdditionalTablesTest.php create mode 100644 tests/unit/workflow/engine/src/ProcessMaker/Model/FieldsTest.php create mode 100644 workflow/engine/src/ProcessMaker/Model/Fields.php diff --git a/database/factories/FieldsFactory.php b/database/factories/FieldsFactory.php new file mode 100644 index 000000000..70615e769 --- /dev/null +++ b/database/factories/FieldsFactory.php @@ -0,0 +1,50 @@ +define(\ProcessMaker\Model\Fields::class, function (Faker $faker) { + return [ + 'FLD_UID' => G::generateUniqueID(), + 'ADD_TAB_UID' => G::generateUniqueID(), + 'FLD_INDEX' => 0, + 'FLD_NAME' => 'VAR_' . $faker->sentence(1), + 'FLD_DESCRIPTION' => $faker->sentence(2), + 'FLD_TYPE' => 'VARCHAR', + 'FLD_SIZE' => 255, + 'FLD_NULL' => 1, + 'FLD_AUTO_INCREMENT' => 0, + 'FLD_KEY' => 1, + 'FLD_TABLE_INDEX' => 0, + 'FLD_FOREIGN_KEY' => 0, + 'FLD_FOREIGN_KEY_TABLE' => '', + 'FLD_DYN_NAME' => '', + 'FLD_DYN_UID' => '', + 'FLD_FILTER' => 0, + ]; +}); + +// Create columns from a table with the foreign keys +$factory->state(\ProcessMaker\Model\Fields::class, 'foreign_keys', function (Faker $faker) { + return [ + 'FLD_UID' => G::generateUniqueID(), + 'ADD_TAB_UID' => function() { + $table = factory(AdditionalTables::class)->create(['ADD_TAB_OFFLINE' => 1]); + return $table->ADD_TAB_UID; + }, + 'FLD_INDEX' => 0, + 'FLD_NAME' => 'VAR_' . $faker->sentence(1), + 'FLD_DESCRIPTION' => $faker->sentence(2), + 'FLD_TYPE' => 'VARCHAR', + 'FLD_SIZE' => 255, + 'FLD_NULL' => 1, + 'FLD_AUTO_INCREMENT' => 0, + 'FLD_KEY' => 1, + 'FLD_TABLE_INDEX' => 0, + 'FLD_FOREIGN_KEY' => 0, + 'FLD_FOREIGN_KEY_TABLE' => '', + 'FLD_DYN_NAME' => '', + 'FLD_DYN_UID' => '', + 'FLD_FILTER' => 0, + ]; +}); diff --git a/tests/unit/workflow/engine/src/ProcessMaker/Model/AdditionalTablesTest.php b/tests/unit/workflow/engine/src/ProcessMaker/Model/AdditionalTablesTest.php new file mode 100644 index 000000000..1083cb19d --- /dev/null +++ b/tests/unit/workflow/engine/src/ProcessMaker/Model/AdditionalTablesTest.php @@ -0,0 +1,81 @@ +create([ + 'ADD_TAB_UID' => function () { + return factory(Fields::class)->create()->ADD_TAB_UID; + } + ]); + $this->assertInstanceOf(Fields::class, $table->columns); + } + + /** + * Test scope query to get the offline tables + * + * @covers \ProcessMaker\Model\AdditionalTables::scopeOffline() + * @test + */ + public function it_filter_offline_table() + { + factory(AdditionalTables::class)->create(['ADD_TAB_OFFLINE' => 0]); + $table = factory(AdditionalTables::class)->create([ + 'ADD_TAB_OFFLINE' => 1 + ]); + $this->assertCount(1, $table->offline([$table->ADD_TAB_OFFLINE])->get()); + } + + /** + * Test get the structure of offline tables + * + * @covers \ProcessMaker\Model\AdditionalTables::getTablesOfflineStructure() + * @test + */ + public function it_get_structure_from_offline_tables() + { + factory(Fields::class)->states('foreign_keys')->create(); + $results = AdditionalTables::getTablesOfflineStructure(); + $this->assertNotEmpty($results); + foreach ($results as $row) { + $this->assertArrayHasKey('add_tab_uid', $row); + $this->assertArrayHasKey('add_tab_name', $row); + $this->assertArrayHasKey('add_tab_description', $row); + $this->assertArrayHasKey('add_tab_class_name', $row); + $this->assertArrayHasKey('fields', $row); + } + } + + /** + * Test get the data of offline tables + * + * @covers \ProcessMaker\Model\AdditionalTables::getTablesOfflineData() + * @test + */ + public function it_get_data_from_offline_tables() + { + factory(Fields::class)->states('foreign_keys')->create(); + $results = AdditionalTables::getTablesOfflineData(); + $this->assertNotEmpty($results); + foreach ($results as $row) { + $this->assertArrayHasKey('add_tab_uid', $row); + $this->assertArrayHasKey('add_tab_name', $row); + $this->assertArrayHasKey('add_tab_description', $row); + $this->assertArrayHasKey('add_tab_class_name', $row); + $this->assertArrayHasKey('rows', $row); + } + } +} diff --git a/tests/unit/workflow/engine/src/ProcessMaker/Model/FieldsTest.php b/tests/unit/workflow/engine/src/ProcessMaker/Model/FieldsTest.php new file mode 100644 index 000000000..ecabbe6cf --- /dev/null +++ b/tests/unit/workflow/engine/src/ProcessMaker/Model/FieldsTest.php @@ -0,0 +1,40 @@ +create([ + 'ADD_TAB_UID' => function () { + return factory(AdditionalTables::class)->create()->ADD_TAB_UID; + } + ]); + $this->assertInstanceOf(AdditionalTables::class, $tableColumns->table); + } + + /** + * Test scope and the query with a specific ADD_TAB_UID + * + * @covers \ProcessMaker\Model\Fields::scopeTable() + * @covers \ProcessMaker\Model\Fields::getFields() + * @test + */ + public function it_get_fields_from_specific_table() + { + $fields = factory(Fields::class)->create(); + $result = Fields::getFields($fields->ADD_TAB_UID); + $this->assertNotEmpty($result); + } +} diff --git a/workflow/engine/src/ProcessMaker/BusinessModel/Table.php b/workflow/engine/src/ProcessMaker/BusinessModel/Table.php index 7ce212479..1a3a31387 100644 --- a/workflow/engine/src/ProcessMaker/BusinessModel/Table.php +++ b/workflow/engine/src/ProcessMaker/BusinessModel/Table.php @@ -20,7 +20,7 @@ class Table * * @return array */ - public function getTables($pro_uid = '', $reportFlag = false) + public function getTables($pro_uid = '', $reportFlag = false, $offline = false) { //VALIDATION if ($reportFlag) { diff --git a/workflow/engine/src/ProcessMaker/Model/AdditionalTables.php b/workflow/engine/src/ProcessMaker/Model/AdditionalTables.php index 31cf40a78..535387053 100644 --- a/workflow/engine/src/ProcessMaker/Model/AdditionalTables.php +++ b/workflow/engine/src/ProcessMaker/Model/AdditionalTables.php @@ -2,6 +2,7 @@ namespace ProcessMaker\Model; +use AdditionalTables as ModelAdditionalTables; use Illuminate\Database\Eloquent\Model; class AdditionalTables extends Model @@ -9,4 +10,84 @@ class AdditionalTables extends Model protected $table = 'ADDITIONAL_TABLES'; public $timestamps = false; + /** + * Get the fields related to the table belongs to + * + * @return \Illuminate\Database\Eloquent\Relations\BelongsTo + */ + public function columns() + { + return $this->belongsTo(Fields::class, 'ADD_TAB_UID', 'ADD_TAB_UID'); + } + + /** + * Scope a query to get the offline tables + * + * @param \Illuminate\Database\Eloquent\Builder $query + * + * @return \Illuminate\Database\Eloquent\Builder + */ + public function scopeOffline($query) + { + return $query->where('ADD_TAB_OFFLINE', '=', 1); + } + + /** + * Get the structure of offline tables + * + * @return array + */ + public static function getTablesOfflineStructure() + { + $query = AdditionalTables::query()->select([ + 'ADD_TAB_UID', + 'ADD_TAB_NAME', + 'ADD_TAB_DESCRIPTION', + 'ADD_TAB_CLASS_NAME' + ]); + $query->offline(); + + $results = $query->get(); + $data = []; + $results->each(function ($item, $key) use (&$data) { + $data[$key] = array_change_key_case($item->toArray(), CASE_LOWER); + $data[$key]['fields'] = Fields::getFields($item->ADD_TAB_UID); + }); + + return $data; + } + + /** + * Get the data of offline tables + * + * @return array + */ + public static function getTablesOfflineData() + { + $query = AdditionalTables::query()->select([ + 'ADD_TAB_UID', + 'ADD_TAB_NAME', + 'ADD_TAB_DESCRIPTION', + 'ADD_TAB_CLASS_NAME' + ]); + $query->offline(); + + $results = $query->get(); + $data = []; + $results->each(function ($item, $key) use (&$data) { + $data[$key] = array_change_key_case($item->toArray(), CASE_LOWER); + + $additionalTables = new ModelAdditionalTables(); + $result = $additionalTables->getAllData($item->ADD_TAB_UID); + if (empty($result['rows'])) { + $data[$key]['rows'] = []; + } else { + foreach ($result['rows'] as $i => $row) { + $data[$key]['rows'][$i] = $row; + } + } + }); + + return $data; + } } diff --git a/workflow/engine/src/ProcessMaker/Model/Fields.php b/workflow/engine/src/ProcessMaker/Model/Fields.php new file mode 100644 index 000000000..6283dd69c --- /dev/null +++ b/workflow/engine/src/ProcessMaker/Model/Fields.php @@ -0,0 +1,55 @@ +belongsTo(AdditionalTables::class, 'ADD_TAB_UID', 'ADD_TAB_UID'); + } + + /** + * Scope a query to get the offline tables + * + * @param \Illuminate\Database\Eloquent\Builder $query + * @param string $tabUid + * + * @return \Illuminate\Database\Eloquent\Builder + */ + public function scopeTable($query, $tabUid) + { + return $query->where('ADD_TAB_UID', '=', $tabUid); + } + + /** + * Get the offline tables + * + * @param string $tabUid + * + * @return array + */ + public static function getFields($tabUid) + { + $query = Fields::query(); + $query->table($tabUid); + + $results = $query->get(); + $data = []; + $results->each(function ($item, $key) use (&$data) { + $data[$key] = array_change_key_case($item->toArray(), CASE_LOWER); + }); + + return $data; + } +} \ No newline at end of file diff --git a/workflow/engine/src/ProcessMaker/Services/Api/Pmtable.php b/workflow/engine/src/ProcessMaker/Services/Api/Pmtable.php index c378f0c71..00ef18f99 100644 --- a/workflow/engine/src/ProcessMaker/Services/Api/Pmtable.php +++ b/workflow/engine/src/ProcessMaker/Services/Api/Pmtable.php @@ -1,9 +1,11 @@ - * @copyright Colosa - Bolivia + * @url GET + * @status 200 + * + * @param boolean $offline {@from path} + * + * @return array + * @throws RestException * * @access protected - * @class AccessControl {@permission PM_SETUP_PM_TABLES} - * @url GET + * @class AccessControl {@permission PM_SETUP_PM_TABLES} + * @link https://wiki.processmaker.com/3.1/REST_API_Administration/PM_Tables#PM_Tables_List:_GET_.2Fpmtable */ - public function doGetPmTables() + public function doGetPmTables($offline = false) { try { - $oPmTable = new \ProcessMaker\BusinessModel\Table(); - $response = $oPmTable->getTables(); + if ($offline) { + $response = AdditionalTables::getTablesOfflineStructure(); + } else { + $pmTable = new BusinessModelTable(); + $response = $pmTable->getTables(); + } + return $response; - } catch (\Exception $e) { + } catch (Exception $e) { throw (new RestException(Api::STAT_APP_EXCEPTION, $e->getMessage())); } } /** - * @param string $pmt_uid {@min 1} {@max 32} + * Get the data of the offline PM tables + * + * @url GET /offline/data + * @status 200 + * + * @param boolean $compress {@from path} + * * @return array * - * @author Brayan Pereyra (Cochalo) - * @copyright Colosa - Bolivia + * @throws RestException * * @access protected - * @class AccessControl {@permission PM_SETUP_PM_TABLES} + * @class AccessControl {@permission PM_SETUP_PM_TABLES} + * @link https://wiki.processmaker.com/3.1/REST_API_Administration/PM_Tables#PM_Tables_List:_GET_.2Fpmtable + */ + public function doGetPmTablesDataOffline($compress = true) + { + try { + $data = AdditionalTables::getTablesOfflineData(); + if ($compress) { + $json = json_encode($data); + $compressed = gzcompress($json, 5); + echo $compressed; + } else { + return $data; + } + } catch (Exception $e) { + throw (new RestException(Api::STAT_APP_EXCEPTION, $e->getMessage())); + } + } + + /** + * Get the structure from a specific PM Table, including a list of its fields and their properties. + * * @url GET /:pmt_uid + * @status 200 + * + * @param string $pmt_uid {@min 1} {@max 32} + * + * @return array + * @throws RestException + * + * @access protected + * @class AccessControl {@permission PM_SETUP_PM_TABLES} + * @link https://wiki.processmaker.com/3.1/REST_API_Administration/PM_Tables#Get_PM_Table_Structure:_GET_.2Fpmtable.2F.7Bpmt_uid.7D */ public function doGetPmTable($pmt_uid) { try { - $oPmTable = new \ProcessMaker\BusinessModel\Table(); + $oPmTable = new BusinessModelTable(); $response = $oPmTable->getTable($pmt_uid); return $response; - } catch (\Exception $e) { + } catch (Exception $e) { throw (new RestException(Api::STAT_APP_EXCEPTION, $e->getMessage())); } } /** + * Get the data from a PM table + * + * @url GET /:pmt_uid/data + * @status 200 + * * @param string $pmt_uid {@min 1} {@max 32} * @param string $filter * @param string $q - * @return array * - * @author Brayan Pereyra (Cochalo) - * @copyright Colosa - Bolivia + * @return array + * @throws RestException * * @access protected * @class AccessControl {@permission PM_SETUP_PM_TABLES} - * @url GET /:pmt_uid/data + * */ public function doGetPmTableData($pmt_uid, $filter = null, $q = "") { try { - $oPmTable = new \ProcessMaker\BusinessModel\Table(); + $oPmTable = new BusinessModelTable(); $response = $oPmTable->getTableData($pmt_uid, null, $filter, false, $q); return $response; - } catch (\Exception $e) { + } catch (Exception $e) { throw (new RestException(Api::STAT_APP_EXCEPTION, $e->getMessage())); } } /** + * Create a new PM Table + * + * @url POST + * @status 201 + * * @param array $request_data * @param string $pmt_tab_name {@from body} * @param string $pmt_tab_dsc {@from body} - * @return array * - * @author Brayan Pereyra (Cochalo) - * @copyright Colosa - Bolivia + * @return array + * @throws RestException * * @access protected * @class AccessControl {@permission PM_SETUP_PM_TABLES} - * @url POST - * @status 201 */ public function doPostPmTable( $request_data, @@ -100,58 +154,58 @@ class Pmtable extends Api $pmt_tab_dsc = '' ) { try { - $oReportTable = new \ProcessMaker\BusinessModel\Table(); + $oReportTable = new BusinessModelTable(); $response = $oReportTable->saveTable($request_data); if (isset($response['pro_uid'])) { unset($response['pro_uid']); } return $response; - } catch (\Exception $e) { + } catch (Exception $e) { throw (new RestException(Api::STAT_APP_EXCEPTION, $e->getMessage())); } } /** - * @param string $pmt_uid {@min 1} {@max 32} + * Add a new record to a PM Table * - * @param array $request_data - * @return array - * - * @author Brayan Pereyra (Cochalo) - * @copyright Colosa - Bolivia - * - * @access protected - * @class AccessControl {@permission PM_SETUP_PM_TABLES} * @url POST /:pmt_uid/data * @status 201 + * + * @param string $pmt_uid {@min 1} {@max 32} + * @param array $request_data + * + * @return array + * @throws RestException + * @access protected + * @class AccessControl {@permission PM_SETUP_PM_TABLES} */ public function doPostPmTableData( $pmt_uid, $request_data ) { try { - $oReportTable = new \ProcessMaker\BusinessModel\Table(); + $oReportTable = new BusinessModelTable(); $response = $oReportTable->saveTableData($pmt_uid, $request_data); return $response; - } catch (\Exception $e) { + } catch (Exception $e) { throw (new RestException(Api::STAT_APP_EXCEPTION, $e->getMessage())); } } /** - * Update pm-table. + * Update the structure of a PM table. * * @url PUT /:pmt_uid + * @status 200 * * @param string $pmt_uid {@min 1} {@max 32} * @param array $request_data * * @return void - * @throw RestException + * @throws RestException * * @access protected * @class AccessControl {@permission PM_SETUP_PM_TABLES} - * @throws RestException */ public function doPutPmTable( $pmt_uid, @@ -167,9 +221,10 @@ class Pmtable extends Api } /** - * Update pm-table data. + * Update the data of an existing record in a PM table. * * @url PUT /:pmt_uid/data + * @status 200 * * @param string $pmt_uid {@min 1} {@max 32} * @param array $request_data @@ -185,37 +240,47 @@ class Pmtable extends Api $request_data ) { try { - $oReportTable = new \ProcessMaker\BusinessModel\Table(); + $oReportTable = new BusinessModelTable(); $response = $oReportTable->updateTableData($pmt_uid, $request_data); return $response; - } catch (\Exception $e) { + } catch (Exception $e) { throw (new RestException(Api::STAT_APP_EXCEPTION, $e->getMessage())); } } /** + * Delete a specified PM table and all its data. + * + * @url DELETE /:pmt_uid + * @status 200 + * * @param string $pmt_uid {@min 1} {@max 32} * * @return void - * - * @author Brayan Pereyra (Cochalo) - * @copyright Colosa - Bolivia + * @throws RestException * * @access protected * @class AccessControl {@permission PM_SETUP_PM_TABLES} - * @url DELETE /:pmt_uid */ public function doDeletePmTable($pmt_uid) { try { - $oReportTable = new \ProcessMaker\BusinessModel\Table(); + $oReportTable = new BusinessModelTable(); $response = $oReportTable->deleteTable($pmt_uid); - } catch (\Exception $e) { + } catch (Exception $e) { throw (new RestException(Api::STAT_APP_EXCEPTION, $e->getMessage())); } } /** + * Delete a record from a PM table, by specifying its primary key(s). The PM Table can have up to 3 primary key + * fields. + * + * @url DELETE /:pmt_uid/data/:key1/:value1 + * @url DELETE /:pmt_uid/data/:key1/:value1/:key2/:value2 + * @url DELETE /:pmt_uid/data/:key1/:value1/:key2/:value2/:key3/:value3 + * @status 200 + * * @param string $pmt_uid {@min 1} {@max 32} * @param string $key1 {@min 1} * @param string $value1 {@min 1} @@ -225,15 +290,10 @@ class Pmtable extends Api * @param string $value3 * * @return array - * - * @author Brayan Pereyra (Cochalo) - * @copyright Colosa - Bolivia + * @throws RestException * * @access protected * @class AccessControl {@permission PM_SETUP_PM_TABLES} - * @url DELETE /:pmt_uid/data/:key1/:value1 - * @url DELETE /:pmt_uid/data/:key1/:value1/:key2/:value2 - * @url DELETE /:pmt_uid/data/:key1/:value1/:key2/:value2/:key3/:value3 */ public function doDeletePmTableData($pmt_uid, $key1, $value1, $key2 = '', $value2 = '', $key3 = '', $value3 = '') { @@ -245,10 +305,10 @@ class Pmtable extends Api if ($key3 != '') { $rows[$key3] = $value3; } - $oReportTable = new \ProcessMaker\BusinessModel\Table(); + $oReportTable = new BusinessModelTable(); $response = $oReportTable->deleteTableData($pmt_uid, $rows); return $response; - } catch (\Exception $e) { + } catch (Exception $e) { throw (new RestException(Api::STAT_APP_EXCEPTION, $e->getMessage())); } } diff --git a/workflow/engine/templates/pmTables/edit.js b/workflow/engine/templates/pmTables/edit.js index 3a7ac2f22..23f6b7165 100644 --- a/workflow/engine/templates/pmTables/edit.js +++ b/workflow/engine/templates/pmTables/edit.js @@ -1,6 +1,5 @@ /** * PM tables Edit - * @author Erik A. O. */ var store; @@ -99,14 +98,13 @@ Ext.onReady(function () { listeners: {rowdblclick: AssignFieldsAction} }); - //selecion model for table columns grid + //selection model for table columns grid sm = new Ext.grid.RowSelectionModel({ selectSingle: false, listeners: { selectionchange: function (sm) { switch (sm.getCount()) { case 0: - //Ext.getCmp('removeButton').disable(); Ext.getCmp('editColumn').disable(); Ext.getCmp('removeColumn').disable(); break; @@ -115,7 +113,6 @@ Ext.onReady(function () { Ext.getCmp('removeColumn').enable(); break; default: - //Ext.getCmp('removeButton').enable(); Ext.getCmp('editColumn').disable(); Ext.getCmp('removeColumn').enable(); break; @@ -196,7 +193,6 @@ Ext.onReady(function () { if (valueInputField) { this.setValue(this.getValue().replace(/\s/g, '').toUpperCase()); } else { - //Ext.Msg.alert(_('ID_WARNING'), _('ID_FIELD_NAME')); this.setValue(''); } } @@ -232,7 +228,7 @@ Ext.onReady(function () { } else { return true; } - }, + } } }, { id: 'field_type', @@ -286,7 +282,7 @@ Ext.onReady(function () { flagShowMessageError = 1; } - }//select + } } }) }, { @@ -481,7 +477,6 @@ Ext.onReady(function () { //table columns grid assignedGrid = new Ext.grid.GridPanel({ - //title: 'Columns', region: 'center', id: 'assignedGrid', ddGroup: 'availableGridDDGroup', @@ -553,7 +548,6 @@ Ext.onReady(function () { }); assignedGrid.getSelectionModel().on('selectionchange', function (sm) { - //alert('s'); }); // (vertical) selection buttons @@ -588,9 +582,7 @@ Ext.onReady(function () { FieldsPanel = new Ext.Panel({ - //title: _('ID_FIELDS'), region: 'center', - //autoWidth : true, width: 150, layout: 'hbox', defaults: {flex: 1}, //auto stretch @@ -702,7 +694,6 @@ Ext.onReady(function () { fieldLabel: _("ID_DB_CONNECTION"), hiddenName: 'DBS_UID', store: dbConnectionsStore, - //value: 'rp', valueField: 'DBS_UID', displayField: 'DBS_NAME', triggerAction: 'all', @@ -765,8 +756,6 @@ Ext.onReady(function () { ] }); - //items.push(comboDbConnections); - var frmDetails = new Ext.FormPanel({ id: 'frmDetails', region: 'north', @@ -777,7 +766,6 @@ Ext.onReady(function () { frame: true, height: 170, items: items, - //tbar : tbar, waitMsgTarget: true, defaults: { allowBlank: false, @@ -786,7 +774,6 @@ Ext.onReady(function () { } }); - southPanel = new Ext.FormPanel({ region: 'south', buttons: [ @@ -849,7 +836,6 @@ Ext.onReady(function () { }); // actions - function createReportTable() { var tableName = Ext.getCmp('REP_TAB_NAME').getValue().trim(); @@ -1006,7 +992,6 @@ function _showDebugWin(content) modal: false, autoScroll: true, maximizable: true, - //closeAction: 'hide', maximizable: false, items: [], x: 0, @@ -1019,7 +1004,6 @@ function _showDebugWin(content) function addColumn() { var PMRow = assignedGrid.getStore().recordType; - //var meta = mapPMFieldType(records[i].data['FIELD_UID']); var row = new PMRow({ uid: '', field_uid: '', @@ -1164,7 +1148,7 @@ function editorFieldsEnableDisable(fieldTypeValue, fieldNull, fieldPrimaryKey, f } } -////ASSIGNBUTON FUNCTIONALITY +//Assign button functionality AssignFieldsAction = function () { var records, i; @@ -1306,7 +1290,6 @@ var DDLoadFields = function () { //add on target grid for (i = 0; i < records.length; i++) { - //arrAux[r] = records[r].data['FIELD_UID']; var meta = mapPMFieldType(records[i].data['FIELD_UID']); var row = new PMRow({ uid: '', @@ -1329,7 +1312,6 @@ var DDLoadFields = function () { return true; } }); - //sw_func_groups = true; }; function loadTableRowsFromArray(records) diff --git a/workflow/engine/templates/pmTables/list.js b/workflow/engine/templates/pmTables/list.js index f809548f2..5cee228e2 100644 --- a/workflow/engine/templates/pmTables/list.js +++ b/workflow/engine/templates/pmTables/list.js @@ -1,3 +1,7 @@ +/** + * PM tables list + */ + var newButton; var editButton; var deleteButton; @@ -20,7 +24,7 @@ var currentSelectedRow = -1; var extensionPmt = 'pmt'; Ext.onReady(function () { - ///Keyboard Events + // Keyboard Events new Ext.KeyMap(document, { key: Ext.EventObject.F5, fn: function (keycode, e) { @@ -62,13 +66,6 @@ Ext.onReady(function () { var flagProcessmap = (typeof ('flagProcessmap') != 'undefined') ? flagProcessmap : 0; - /*if (PRO_UID !== false) { - newMenuOptions.push({ - text: _('ID_NEW_REPORT_TABLE_OLD'), - handler: NewReportTableOld - }); - }*/ - if (PRO_UID !== false) { newButton = new Ext.Action({ id: 'newButton', @@ -424,14 +421,14 @@ Ext.onReady(function () { infoGrid.store.load(); }); -//Funtion Handles Context Menu Opening +//Function Handles Context Menu Opening onMessageContextMenu = function (grid, rowIndex, e) { e.stopEvent(); var coords = e.getXY(); contextMenu.showAt([coords[0], coords[1]]); }; -/////JS FUNCTIONS +// JS Functions //Capitalize String Function capitalize = function (s) { @@ -454,9 +451,6 @@ NewReportTable = function () { }; NewReportTableOld = function () { - //location.href = 'reportTables/edit?PRO_UID='+PRO_UID+'&tableType=report'; - //parent.reportTables2(); - //parent.Pm.data.render.buildingBlocks.injector('reportTables2'); location.href = 'reportTables/reportTables_Edit?PRO_UID=' + PRO_UID; }; @@ -544,7 +538,6 @@ ImportPMTable = function () { resizable: false, items: [ new Ext.FormPanel({ - /*renderTo: 'form-panel',*/ id: 'uploader', fileUpload: true, width: 400, @@ -604,7 +597,6 @@ ImportPMTable = function () { plain: true, html: '

    ' + _('ID_IMPORTING_ERROR') + '

    ' + result.message, items: [], - buttons: [{ text: 'Close', handler: function () { @@ -700,7 +692,6 @@ PMTableData = function () var row = Ext.getCmp('infoGrid').getSelectionModel().getSelected(); var type = row.get('PRO_UID'); - //location.href = 'pmTables/data?id='+row.get('ADD_TAB_UID'); if (row.get('TYPE') != '') { PMExt.info(_('ID_INFO'), _('ID_DATA_LIST_NOT_AVAILABLE_FOR_OLDVER')); return; @@ -715,7 +706,6 @@ PMTableData = function () modal: true, maximizable: true, constrain: true, - //closeAction:'hide', plain: true, items: [{ xtype: "iframepanel", From 62459e52e1282d49a0125ccfb322a74ec9c3786b Mon Sep 17 00:00:00 2001 From: Paula Quispe Date: Tue, 10 Dec 2019 11:33:47 -0400 Subject: [PATCH 04/12] PMC-1442 --- workflow/engine/classes/PmDynaform.php | 1 + 1 file changed, 1 insertion(+) diff --git a/workflow/engine/classes/PmDynaform.php b/workflow/engine/classes/PmDynaform.php index 488701120..6f7da3e5a 100644 --- a/workflow/engine/classes/PmDynaform.php +++ b/workflow/engine/classes/PmDynaform.php @@ -357,6 +357,7 @@ class PmDynaform $option->value = isset($row[0]) ? $row[0] : ""; $option->label = isset($row[1]) ? $row[1] : ""; $json->optionsSql[] = $option; + $json->queryOutputData[] = $option; } } if ($value === "suggest" && isset($json->queryField) && $json->queryField == true) { From 8ac44c047972e62c064927d628a9b1d88074fa80 Mon Sep 17 00:00:00 2001 From: Roly Rudy Gutierrez Pinto Date: Thu, 12 Dec 2019 16:05:35 -0400 Subject: [PATCH 05/12] PMC-1489 ErrorException: Function create_function() is deprecated in PHP7.3 with smarty 2.6.30 --- composer.json | 2 +- composer.lock | 250 +++++++++++++++++++++++++------------------------- 2 files changed, 126 insertions(+), 126 deletions(-) diff --git a/composer.json b/composer.json index 11d6041e8..cee63edf8 100644 --- a/composer.json +++ b/composer.json @@ -45,7 +45,7 @@ "pear/console_getopt": "1.4.*", "typo3/class-alias-loader": "^1.0", "ralouphie/getallheaders": "^2.0", - "smarty/smarty": "2.6.30", + "smarty/smarty": "2.6.31", "pdepend/pdepend": "@stable", "chumper/zipper": "^1.0", "php-imap/php-imap": "^3.0", diff --git a/composer.lock b/composer.lock index e3e3e9590..a715e21a0 100644 --- a/composer.lock +++ b/composer.lock @@ -4,8 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file", "This file is @generated automatically" ], - "hash": "2847484159397aa0646fb850bf14c857", - "content-hash": "6a5b008a3b908266bd5d0ff9b842eb9c", + "content-hash": "2fbf01051b97bd40008c3196c920daed", "packages": [ { "name": "bshaffer/oauth2-server-php", @@ -48,7 +47,7 @@ "oauth", "oauth2" ], - "time": "2013-08-12 16:35:58" + "time": "2013-08-12T16:35:58+00:00" }, { "name": "chumper/zipper", @@ -108,7 +107,7 @@ "laravel", "zip" ], - "time": "2017-07-17 08:05:10" + "time": "2017-07-17T08:05:10+00:00" }, { "name": "colosa/MichelangeloFE", @@ -127,7 +126,7 @@ "keywords": [ "js app ProcessMaker" ], - "time": "2019-08-01 12:24:57" + "time": "2019-08-01T12:24:57+00:00" }, { "name": "colosa/pmDynaform", @@ -143,7 +142,7 @@ "keywords": [ "js lib ProcessMaker Dynaforms" ], - "time": "2019-07-29 16:58:17" + "time": "2019-07-29T16:58:17+00:00" }, { "name": "colosa/pmUI", @@ -159,7 +158,7 @@ "keywords": [ "js lib ProcessMaker UI" ], - "time": "2019-04-26 14:15:30" + "time": "2019-04-26T14:15:30+00:00" }, { "name": "dapphp/securimage", @@ -208,7 +207,7 @@ "captcha", "security" ], - "time": "2018-03-09 06:07:41" + "time": "2018-03-09T06:07:41+00:00" }, { "name": "dnoegel/php-xdg-base-dir", @@ -241,7 +240,7 @@ "MIT" ], "description": "implementation of xdg base directory specification for php", - "time": "2014-10-24 07:27:01" + "time": "2014-10-24T07:27:01+00:00" }, { "name": "doctrine/inflector", @@ -308,7 +307,7 @@ "singularize", "string" ], - "time": "2018-01-09 20:05:19" + "time": "2018-01-09T20:05:19+00:00" }, { "name": "doctrine/lexer", @@ -368,7 +367,7 @@ "parser", "php" ], - "time": "2019-06-08 11:03:04" + "time": "2019-06-08T11:03:04+00:00" }, { "name": "dragonmantank/cron-expression", @@ -422,7 +421,7 @@ "cron", "schedule" ], - "time": "2019-03-31 00:38:28" + "time": "2019-03-31T00:38:28+00:00" }, { "name": "egulias/email-validator", @@ -480,7 +479,7 @@ "validation", "validator" ], - "time": "2019-07-19 20:52:08" + "time": "2019-07-19T20:52:08+00:00" }, { "name": "erusev/parsedown", @@ -526,7 +525,7 @@ "markdown", "parser" ], - "time": "2019-03-17 18:48:37" + "time": "2019-03-17T18:48:37+00:00" }, { "name": "geshi/geshi", @@ -566,7 +565,7 @@ ], "description": "Generic Syntax Highlighter", "homepage": "http://qbnz.com/highlighter/", - "time": "2018-10-01 23:49:06" + "time": "2018-10-01T23:49:06+00:00" }, { "name": "google/apiclient", @@ -609,7 +608,7 @@ "keywords": [ "google" ], - "time": "2015-10-16 22:11:08" + "time": "2015-10-16T22:11:08+00:00" }, { "name": "guzzlehttp/guzzle", @@ -674,7 +673,7 @@ "rest", "web service" ], - "time": "2018-04-22 15:46:56" + "time": "2018-04-22T15:46:56+00:00" }, { "name": "guzzlehttp/promises", @@ -725,7 +724,7 @@ "keywords": [ "promise" ], - "time": "2016-12-20 10:07:11" + "time": "2016-12-20T10:07:11+00:00" }, { "name": "guzzlehttp/psr7", @@ -796,7 +795,7 @@ "uri", "url" ], - "time": "2019-07-01 23:21:34" + "time": "2019-07-01T23:21:34+00:00" }, { "name": "jakub-onderka/php-console-color", @@ -838,7 +837,7 @@ "email": "jakub.onderka@gmail.com" } ], - "time": "2018-09-29 17:23:10" + "time": "2018-09-29T17:23:10+00:00" }, { "name": "jakub-onderka/php-console-highlighter", @@ -884,7 +883,7 @@ } ], "description": "Highlight PHP code in terminal", - "time": "2018-09-29 18:48:56" + "time": "2018-09-29T18:48:56+00:00" }, { "name": "kylekatarnls/update-helper", @@ -929,7 +928,7 @@ } ], "description": "Update helper", - "time": "2019-07-29 11:03:54" + "time": "2019-07-29T11:03:54+00:00" }, { "name": "laravel/framework", @@ -1075,7 +1074,7 @@ "framework", "laravel" ], - "time": "2019-02-26 15:41:34" + "time": "2019-02-26T15:41:34+00:00" }, { "name": "laravel/nexmo-notification-channel", @@ -1132,7 +1131,7 @@ "nexmo", "notifications" ], - "time": "2018-12-04 12:57:08" + "time": "2018-12-04T12:57:08+00:00" }, { "name": "laravel/slack-notification-channel", @@ -1189,7 +1188,7 @@ "notifications", "slack" ], - "time": "2018-12-12 13:12:06" + "time": "2018-12-12T13:12:06+00:00" }, { "name": "laravel/tinker", @@ -1252,7 +1251,7 @@ "laravel", "psysh" ], - "time": "2019-07-29 18:09:25" + "time": "2019-07-29T18:09:25+00:00" }, { "name": "lcobucci/jwt", @@ -1307,7 +1306,7 @@ "JWS", "jwt" ], - "time": "2019-05-24 18:30:49" + "time": "2019-05-24T18:30:49+00:00" }, { "name": "league/flysystem", @@ -1391,7 +1390,7 @@ "sftp", "storage" ], - "time": "2019-06-18 20:09:29" + "time": "2019-06-18T20:09:29+00:00" }, { "name": "libchart/libchart", @@ -1437,7 +1436,7 @@ "line charts", "pie charts" ], - "time": "2013-10-19 22:21:30" + "time": "2013-10-19T22:21:30+00:00" }, { "name": "luracast/restler", @@ -1516,7 +1515,7 @@ "rest", "server" ], - "time": "2019-05-12 15:05:48" + "time": "2019-05-12T15:05:48+00:00" }, { "name": "monolog/monolog", @@ -1594,7 +1593,7 @@ "logging", "psr-3" ], - "time": "2016-04-12 18:29:35" + "time": "2016-04-12T18:29:35+00:00" }, { "name": "nesbot/carbon", @@ -1655,7 +1654,7 @@ "datetime", "time" ], - "time": "2019-06-11 09:07:59" + "time": "2019-06-11T09:07:59+00:00" }, { "name": "nexmo/client", @@ -1703,7 +1702,7 @@ } ], "description": "PHP Client for using Nexmo's API.", - "time": "2019-05-13 20:27:43" + "time": "2019-05-13T20:27:43+00:00" }, { "name": "nikic/php-parser", @@ -1754,7 +1753,7 @@ "parser", "php" ], - "time": "2018-02-28 20:30:58" + "time": "2018-02-28T20:30:58+00:00" }, { "name": "opis/closure", @@ -1815,7 +1814,7 @@ "serialization", "serialize" ], - "time": "2019-07-09 21:58:11" + "time": "2019-07-09T21:58:11+00:00" }, { "name": "paragonie/random_compat", @@ -1860,7 +1859,7 @@ "pseudorandom", "random" ], - "time": "2018-07-02 15:55:56" + "time": "2018-07-02T15:55:56+00:00" }, { "name": "pdepend/pdepend", @@ -1900,7 +1899,7 @@ "BSD-3-Clause" ], "description": "Official version of pdepend to be handled with Composer", - "time": "2017-12-13 13:21:38" + "time": "2017-12-13T13:21:38+00:00" }, { "name": "pear/archive_tar", @@ -1966,7 +1965,7 @@ "archive", "tar" ], - "time": "2019-04-08 13:15:55" + "time": "2019-04-08T13:15:55+00:00" }, { "name": "pear/console_getopt", @@ -2013,7 +2012,7 @@ } ], "description": "More info available on: http://pear.php.net/package/Console_Getopt", - "time": "2019-02-06 16:52:33" + "time": "2019-02-06T16:52:33+00:00" }, { "name": "pear/pear-core-minimal", @@ -2057,7 +2056,7 @@ } ], "description": "Minimal set of PEAR core files to be used as composer dependency", - "time": "2019-03-13 18:15:44" + "time": "2019-03-13T18:15:44+00:00" }, { "name": "pear/pear_exception", @@ -2112,7 +2111,7 @@ "keywords": [ "exception" ], - "time": "2015-02-10 20:07:52" + "time": "2015-02-10T20:07:52+00:00" }, { "name": "php-http/guzzle6-adapter", @@ -2172,7 +2171,7 @@ "Guzzle", "http" ], - "time": "2016-05-10 06:13:32" + "time": "2016-05-10T06:13:32+00:00" }, { "name": "php-http/httplug", @@ -2228,7 +2227,7 @@ "client", "http" ], - "time": "2016-08-31 08:30:17" + "time": "2016-08-31T08:30:17+00:00" }, { "name": "php-http/promise", @@ -2278,7 +2277,7 @@ "keywords": [ "promise" ], - "time": "2016-01-26 13:27:02" + "time": "2016-01-26T13:27:02+00:00" }, { "name": "php-imap/php-imap", @@ -2331,7 +2330,7 @@ "pop3", "receive emails" ], - "time": "2019-07-23 09:25:42" + "time": "2019-07-23T09:25:42+00:00" }, { "name": "phpmailer/phpmailer", @@ -2408,7 +2407,7 @@ } ], "description": "PHPMailer is a full-featured email creation and transfer class for PHP", - "time": "2018-11-15 22:32:31" + "time": "2018-11-15T22:32:31+00:00" }, { "name": "psr/container", @@ -2457,7 +2456,7 @@ "container-interop", "psr" ], - "time": "2017-02-14 16:28:37" + "time": "2017-02-14T16:28:37+00:00" }, { "name": "psr/http-factory", @@ -2509,7 +2508,7 @@ "request", "response" ], - "time": "2019-04-30 12:38:16" + "time": "2019-04-30T12:38:16+00:00" }, { "name": "psr/http-message", @@ -2559,7 +2558,7 @@ "request", "response" ], - "time": "2016-08-06 14:39:51" + "time": "2016-08-06T14:39:51+00:00" }, { "name": "psr/log", @@ -2597,7 +2596,7 @@ "psr", "psr-3" ], - "time": "2012-12-21 11:40:51" + "time": "2012-12-21T11:40:51+00:00" }, { "name": "psr/simple-cache", @@ -2645,7 +2644,7 @@ "psr-16", "simple-cache" ], - "time": "2017-10-23 01:57:42" + "time": "2017-10-23T01:57:42+00:00" }, { "name": "psy/psysh", @@ -2719,7 +2718,7 @@ "interactive", "shell" ], - "time": "2018-10-13 15:16:03" + "time": "2018-10-13T15:16:03+00:00" }, { "name": "ralouphie/getallheaders", @@ -2759,7 +2758,7 @@ } ], "description": "A polyfill for getallheaders.", - "time": "2016-02-11 07:05:27" + "time": "2016-02-11T07:05:27+00:00" }, { "name": "ramsey/uuid", @@ -2841,20 +2840,20 @@ "identifier", "uuid" ], - "time": "2018-07-19 23:38:55" + "time": "2018-07-19T23:38:55+00:00" }, { "name": "smarty/smarty", - "version": "v2.6.30", + "version": "v2.6.31", "source": { "type": "git", "url": "https://github.com/smarty-php/smarty.git", - "reference": "c5c9d6514ceaf15fe35345886668726829560f93" + "reference": "4ab9757b492f08a38f68123a6e7c1df7110bbc49" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/smarty-php/smarty/zipball/c5c9d6514ceaf15fe35345886668726829560f93", - "reference": "c5c9d6514ceaf15fe35345886668726829560f93", + "url": "https://api.github.com/repos/smarty-php/smarty/zipball/4ab9757b492f08a38f68123a6e7c1df7110bbc49", + "reference": "4ab9757b492f08a38f68123a6e7c1df7110bbc49", "shasum": "" }, "require": { @@ -2892,7 +2891,7 @@ "keywords": [ "templating" ], - "time": "2016-07-19 18:31:12" + "time": "2017-11-03T06:39:13+00:00" }, { "name": "swiftmailer/swiftmailer", @@ -2954,7 +2953,7 @@ "mail", "mailer" ], - "time": "2019-04-21 09:21:45" + "time": "2019-04-21T09:21:45+00:00" }, { "name": "symfony/config", @@ -3018,7 +3017,7 @@ ], "description": "Symfony Config Component", "homepage": "https://symfony.com", - "time": "2019-07-18 10:34:59" + "time": "2019-07-18T10:34:59+00:00" }, { "name": "symfony/console", @@ -3093,7 +3092,7 @@ ], "description": "Symfony Console Component", "homepage": "https://symfony.com", - "time": "2019-07-24 17:13:59" + "time": "2019-07-24T17:13:59+00:00" }, { "name": "symfony/css-selector", @@ -3146,7 +3145,7 @@ ], "description": "Symfony CssSelector Component", "homepage": "https://symfony.com", - "time": "2019-01-16 09:39:14" + "time": "2019-01-16T09:39:14+00:00" }, { "name": "symfony/debug", @@ -3202,7 +3201,7 @@ ], "description": "Symfony Debug Component", "homepage": "https://symfony.com", - "time": "2019-07-23 11:21:36" + "time": "2019-07-23T11:21:36+00:00" }, { "name": "symfony/dependency-injection", @@ -3275,7 +3274,7 @@ ], "description": "Symfony DependencyInjection Component", "homepage": "https://symfony.com", - "time": "2019-07-26 07:03:43" + "time": "2019-07-26T07:03:43+00:00" }, { "name": "symfony/event-dispatcher", @@ -3345,7 +3344,7 @@ ], "description": "Symfony EventDispatcher Component", "homepage": "https://symfony.com", - "time": "2019-06-27 06:42:14" + "time": "2019-06-27T06:42:14+00:00" }, { "name": "symfony/event-dispatcher-contracts", @@ -3403,7 +3402,7 @@ "interoperability", "standards" ], - "time": "2019-06-20 06:46:26" + "time": "2019-06-20T06:46:26+00:00" }, { "name": "symfony/filesystem", @@ -3453,7 +3452,7 @@ ], "description": "Symfony Filesystem Component", "homepage": "https://symfony.com", - "time": "2019-06-23 08:51:25" + "time": "2019-06-23T08:51:25+00:00" }, { "name": "symfony/finder", @@ -3502,7 +3501,7 @@ ], "description": "Symfony Finder Component", "homepage": "https://symfony.com", - "time": "2019-06-28 13:16:30" + "time": "2019-06-28T13:16:30+00:00" }, { "name": "symfony/http-foundation", @@ -3557,7 +3556,7 @@ ], "description": "Symfony HttpFoundation Component", "homepage": "https://symfony.com", - "time": "2019-07-23 11:21:36" + "time": "2019-07-23T11:21:36+00:00" }, { "name": "symfony/http-kernel", @@ -3649,7 +3648,7 @@ ], "description": "Symfony HttpKernel Component", "homepage": "https://symfony.com", - "time": "2019-07-28 07:10:23" + "time": "2019-07-28T07:10:23+00:00" }, { "name": "symfony/mime", @@ -3708,7 +3707,7 @@ "mime", "mime-type" ], - "time": "2019-07-19 16:21:19" + "time": "2019-07-19T16:21:19+00:00" }, { "name": "symfony/polyfill-ctype", @@ -3766,7 +3765,7 @@ "polyfill", "portable" ], - "time": "2019-02-06 07:57:58" + "time": "2019-02-06T07:57:58+00:00" }, { "name": "symfony/polyfill-iconv", @@ -3825,7 +3824,7 @@ "portable", "shim" ], - "time": "2019-02-06 07:57:58" + "time": "2019-02-06T07:57:58+00:00" }, { "name": "symfony/polyfill-intl-idn", @@ -3887,7 +3886,7 @@ "portable", "shim" ], - "time": "2019-03-04 13:44:35" + "time": "2019-03-04T13:44:35+00:00" }, { "name": "symfony/polyfill-mbstring", @@ -3946,7 +3945,7 @@ "portable", "shim" ], - "time": "2019-02-06 07:57:58" + "time": "2019-02-06T07:57:58+00:00" }, { "name": "symfony/polyfill-php72", @@ -4001,7 +4000,7 @@ "portable", "shim" ], - "time": "2019-02-06 07:57:58" + "time": "2019-02-06T07:57:58+00:00" }, { "name": "symfony/polyfill-php73", @@ -4059,7 +4058,7 @@ "portable", "shim" ], - "time": "2019-02-06 07:57:58" + "time": "2019-02-06T07:57:58+00:00" }, { "name": "symfony/process", @@ -4108,7 +4107,7 @@ ], "description": "Symfony Process Component", "homepage": "https://symfony.com", - "time": "2019-05-30 16:10:05" + "time": "2019-05-30T16:10:05+00:00" }, { "name": "symfony/routing", @@ -4184,7 +4183,7 @@ "uri", "url" ], - "time": "2019-07-23 14:43:56" + "time": "2019-07-23T14:43:56+00:00" }, { "name": "symfony/service-contracts", @@ -4242,7 +4241,7 @@ "interoperability", "standards" ], - "time": "2019-06-13 11:15:36" + "time": "2019-06-13T11:15:36+00:00" }, { "name": "symfony/translation", @@ -4318,7 +4317,7 @@ ], "description": "Symfony Translation Component", "homepage": "https://symfony.com", - "time": "2019-07-18 10:34:59" + "time": "2019-07-18T10:34:59+00:00" }, { "name": "symfony/translation-contracts", @@ -4375,7 +4374,7 @@ "interoperability", "standards" ], - "time": "2019-06-13 11:15:36" + "time": "2019-06-13T11:15:36+00:00" }, { "name": "symfony/var-dumper", @@ -4451,7 +4450,7 @@ "debug", "dump" ], - "time": "2019-07-27 06:42:46" + "time": "2019-07-27T06:42:46+00:00" }, { "name": "tijsverkoyen/css-to-inline-styles", @@ -4498,7 +4497,7 @@ ], "description": "CssToInlineStyles is a class that enables you to convert HTML-pages/files into HTML-pages/files with inline styles. This is very useful when you're sending emails.", "homepage": "https://github.com/tijsverkoyen/CssToInlineStyles", - "time": "2017-11-27 11:13:29" + "time": "2017-11-27T11:13:29+00:00" }, { "name": "typo3/class-alias-loader", @@ -4556,7 +4555,7 @@ "classloader", "composer" ], - "time": "2018-10-03 12:49:56" + "time": "2018-10-03T12:49:56+00:00" }, { "name": "vlucas/phpdotenv", @@ -4607,7 +4606,7 @@ "env", "environment" ], - "time": "2019-01-29 11:11:52" + "time": "2019-01-29T11:11:52+00:00" }, { "name": "zendframework/zend-diactoros", @@ -4673,7 +4672,7 @@ "psr", "psr-7" ], - "time": "2019-07-10 16:13:25" + "time": "2019-07-10T16:13:25+00:00" } ], "packages-dev": [ @@ -4753,7 +4752,7 @@ "symfony", "testing" ], - "time": "2018-08-10 18:56:51" + "time": "2018-08-10T18:56:51+00:00" }, { "name": "behat/gherkin", @@ -4812,7 +4811,7 @@ "gherkin", "parser" ], - "time": "2019-01-16 14:22:17" + "time": "2019-01-16T14:22:17+00:00" }, { "name": "behat/mink", @@ -4870,7 +4869,7 @@ "testing", "web" ], - "time": "2016-03-05 08:26:18" + "time": "2016-03-05T08:26:18+00:00" }, { "name": "behat/mink-selenium2-driver", @@ -4931,7 +4930,7 @@ "testing", "webdriver" ], - "time": "2016-03-05 09:10:18" + "time": "2016-03-05T09:10:18+00:00" }, { "name": "behat/transliterator", @@ -4975,7 +4974,7 @@ "slug", "transliterator" ], - "time": "2017-04-04 11:38:05" + "time": "2017-04-04T11:38:05+00:00" }, { "name": "container-interop/container-interop", @@ -5006,7 +5005,8 @@ ], "description": "Promoting the interoperability of container objects (DIC, SL, etc.)", "homepage": "https://github.com/container-interop/container-interop", - "time": "2017-02-14 19:40:03" + "abandoned": "psr/container", + "time": "2017-02-14T19:40:03+00:00" }, { "name": "doctrine/instantiator", @@ -5062,7 +5062,7 @@ "constructor", "instantiate" ], - "time": "2019-03-17 17:37:11" + "time": "2019-03-17T17:37:11+00:00" }, { "name": "filp/whoops", @@ -5122,7 +5122,7 @@ "whoops", "zf2" ], - "time": "2017-02-18 14:22:27" + "time": "2017-02-18T14:22:27+00:00" }, { "name": "fzaninotto/faker", @@ -5172,7 +5172,7 @@ "faker", "fixtures" ], - "time": "2018-07-12 10:23:15" + "time": "2018-07-12T10:23:15+00:00" }, { "name": "instaclick/php-webdriver", @@ -5231,7 +5231,7 @@ "webdriver", "webtest" ], - "time": "2017-06-30 04:02:48" + "time": "2017-06-30T04:02:48+00:00" }, { "name": "myclabs/deep-copy", @@ -5279,7 +5279,7 @@ "object", "object graph" ], - "time": "2019-04-07 13:18:21" + "time": "2019-04-07T13:18:21+00:00" }, { "name": "phpdocumentor/reflection-common", @@ -5333,7 +5333,7 @@ "reflection", "static analysis" ], - "time": "2017-09-11 18:02:19" + "time": "2017-09-11T18:02:19+00:00" }, { "name": "phpdocumentor/reflection-docblock", @@ -5384,7 +5384,7 @@ } ], "description": "With this component, a library can provide support for annotations via DocBlocks or otherwise retrieve information that is embedded in a DocBlock.", - "time": "2019-04-30 17:48:53" + "time": "2019-04-30T17:48:53+00:00" }, { "name": "phpdocumentor/type-resolver", @@ -5431,7 +5431,7 @@ "email": "me@mikevanriel.com" } ], - "time": "2017-07-14 14:27:02" + "time": "2017-07-14T14:27:02+00:00" }, { "name": "phpspec/prophecy", @@ -5494,7 +5494,7 @@ "spy", "stub" ], - "time": "2019-06-13 12:50:23" + "time": "2019-06-13T12:50:23+00:00" }, { "name": "phpunit/php-code-coverage", @@ -5557,7 +5557,7 @@ "testing", "xunit" ], - "time": "2017-04-02 07:44:40" + "time": "2017-04-02T07:44:40+00:00" }, { "name": "phpunit/php-file-iterator", @@ -5604,7 +5604,7 @@ "filesystem", "iterator" ], - "time": "2017-11-27 13:52:08" + "time": "2017-11-27T13:52:08+00:00" }, { "name": "phpunit/php-text-template", @@ -5645,7 +5645,7 @@ "keywords": [ "template" ], - "time": "2015-06-21 13:50:34" + "time": "2015-06-21T13:50:34+00:00" }, { "name": "phpunit/php-timer", @@ -5694,7 +5694,7 @@ "keywords": [ "timer" ], - "time": "2017-02-26 11:10:40" + "time": "2017-02-26T11:10:40+00:00" }, { "name": "phpunit/php-token-stream", @@ -5743,7 +5743,7 @@ "keywords": [ "tokenizer" ], - "time": "2017-11-27 05:48:46" + "time": "2017-11-27T05:48:46+00:00" }, { "name": "phpunit/phpunit", @@ -5825,7 +5825,7 @@ "testing", "xunit" ], - "time": "2018-02-01 05:50:59" + "time": "2018-02-01T05:50:59+00:00" }, { "name": "phpunit/phpunit-mock-objects", @@ -5885,7 +5885,7 @@ "xunit" ], "abandoned": true, - "time": "2017-06-30 09:13:00" + "time": "2017-06-30T09:13:00+00:00" }, { "name": "sebastian/code-unit-reverse-lookup", @@ -5930,7 +5930,7 @@ ], "description": "Looks up which function or method a line of code belongs to", "homepage": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/", - "time": "2017-03-04 06:30:41" + "time": "2017-03-04T06:30:41+00:00" }, { "name": "sebastian/comparator", @@ -5994,7 +5994,7 @@ "compare", "equality" ], - "time": "2017-01-29 09:50:25" + "time": "2017-01-29T09:50:25+00:00" }, { "name": "sebastian/diff", @@ -6046,7 +6046,7 @@ "keywords": [ "diff" ], - "time": "2017-05-22 07:24:03" + "time": "2017-05-22T07:24:03+00:00" }, { "name": "sebastian/environment", @@ -6096,7 +6096,7 @@ "environment", "hhvm" ], - "time": "2016-11-26 07:53:53" + "time": "2016-11-26T07:53:53+00:00" }, { "name": "sebastian/exporter", @@ -6163,7 +6163,7 @@ "export", "exporter" ], - "time": "2016-11-19 08:54:04" + "time": "2016-11-19T08:54:04+00:00" }, { "name": "sebastian/global-state", @@ -6214,7 +6214,7 @@ "keywords": [ "global state" ], - "time": "2015-10-12 03:26:01" + "time": "2015-10-12T03:26:01+00:00" }, { "name": "sebastian/object-enumerator", @@ -6260,7 +6260,7 @@ ], "description": "Traverses array structures and object graphs to enumerate all referenced objects", "homepage": "https://github.com/sebastianbergmann/object-enumerator/", - "time": "2017-02-18 15:18:39" + "time": "2017-02-18T15:18:39+00:00" }, { "name": "sebastian/recursion-context", @@ -6313,7 +6313,7 @@ ], "description": "Provides functionality to recursively process PHP variables", "homepage": "http://www.github.com/sebastianbergmann/recursion-context", - "time": "2016-11-19 07:33:16" + "time": "2016-11-19T07:33:16+00:00" }, { "name": "sebastian/resource-operations", @@ -6355,7 +6355,7 @@ ], "description": "Provides a list of PHP built-in functions that operate on resources", "homepage": "https://www.github.com/sebastianbergmann/resource-operations", - "time": "2015-07-28 20:34:47" + "time": "2015-07-28T20:34:47+00:00" }, { "name": "sebastian/version", @@ -6398,7 +6398,7 @@ ], "description": "Library that helps with managing the version number of Git-hosted PHP projects", "homepage": "https://github.com/sebastianbergmann/version", - "time": "2016-10-03 07:35:21" + "time": "2016-10-03T07:35:21+00:00" }, { "name": "squizlabs/php_codesniffer", @@ -6449,7 +6449,7 @@ "phpcs", "standards" ], - "time": "2019-04-10 23:49:02" + "time": "2019-04-10T23:49:02+00:00" }, { "name": "symfony/class-loader", @@ -6505,7 +6505,7 @@ ], "description": "Symfony ClassLoader Component", "homepage": "https://symfony.com", - "time": "2019-01-16 09:39:14" + "time": "2019-01-16T09:39:14+00:00" }, { "name": "symfony/yaml", @@ -6564,7 +6564,7 @@ ], "description": "Symfony Yaml Component", "homepage": "https://symfony.com", - "time": "2019-07-24 14:47:54" + "time": "2019-07-24T14:47:54+00:00" }, { "name": "webmozart/assert", @@ -6615,7 +6615,7 @@ "check", "validate" ], - "time": "2018-12-25 11:19:39" + "time": "2018-12-25T11:19:39+00:00" }, { "name": "wimg/php-compatibility", @@ -6674,7 +6674,7 @@ "standards" ], "abandoned": "phpcompatibility/php-compatibility", - "time": "2019-06-27 19:58:56" + "time": "2019-06-27T19:58:56+00:00" } ], "aliases": [], From cf01e82cae929bcf238a675ca499b06608ba8f29 Mon Sep 17 00:00:00 2001 From: Paula Quispe Date: Fri, 13 Dec 2019 10:13:19 -0400 Subject: [PATCH 06/12] PMC-1493 --- workflow/engine/src/ProcessMaker/Services/Api/Pmtable.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/workflow/engine/src/ProcessMaker/Services/Api/Pmtable.php b/workflow/engine/src/ProcessMaker/Services/Api/Pmtable.php index 00ef18f99..d18ab1436 100644 --- a/workflow/engine/src/ProcessMaker/Services/Api/Pmtable.php +++ b/workflow/engine/src/ProcessMaker/Services/Api/Pmtable.php @@ -27,7 +27,7 @@ class Pmtable extends Api * @throws RestException * * @access protected - * @class AccessControl {@permission PM_SETUP_PM_TABLES} + * @class AccessControl {@permission PM_LOGIN} * @link https://wiki.processmaker.com/3.1/REST_API_Administration/PM_Tables#PM_Tables_List:_GET_.2Fpmtable */ public function doGetPmTables($offline = false) @@ -59,7 +59,7 @@ class Pmtable extends Api * @throws RestException * * @access protected - * @class AccessControl {@permission PM_SETUP_PM_TABLES} + * @class AccessControl {@permission PM_LOGIN} * @link https://wiki.processmaker.com/3.1/REST_API_Administration/PM_Tables#PM_Tables_List:_GET_.2Fpmtable */ public function doGetPmTablesDataOffline($compress = true) From 88720262575ef2381c9c1f04081598c7790665fe Mon Sep 17 00:00:00 2001 From: Andrea Adamczyk Date: Tue, 17 Dec 2019 10:18:09 -0400 Subject: [PATCH 07/12] PMC-1399 --- workflow/engine/methods/processes/processes_Import_Ajax.php | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/workflow/engine/methods/processes/processes_Import_Ajax.php b/workflow/engine/methods/processes/processes_Import_Ajax.php index 9015c2cab..f2acde6ed 100644 --- a/workflow/engine/methods/processes/processes_Import_Ajax.php +++ b/workflow/engine/methods/processes/processes_Import_Ajax.php @@ -291,7 +291,8 @@ if (isset($_POST["PRO_FILENAME"]) && exit(0); } - if (version_compare($data['version'], '3.0', '>') && $_POST['IMPORT_OPTION']==="3") { + if ((version_compare($data['version'], '3.0', + '>') && $_POST['IMPORT_OPTION'] === "3") || empty($_POST['objectsToImport'])) { $objectsToImport = []; $objects = (isset($data['objects'])) ? explode('|', $data['objects']) : ""; $ids = new \ProcessMaker\BusinessModel\Migrator\ExportObjects(); @@ -304,6 +305,7 @@ if (isset($_POST["PRO_FILENAME"]) && if (isset($_POST['objectsToImport']) && !empty(G::json_decode($_POST['objectsToImport']))) { $objectsToImport = G::json_decode($_POST['objectsToImport']); } + /*----------------------------------********---------------------------------*/ $prjUid = $importer->import($option, $optionGroup, false, $objectsToImport); From 4deabf1cb0b3fed5a5a55b119f0fc09d9c5e674e Mon Sep 17 00:00:00 2001 From: Andrea Adamczyk Date: Wed, 18 Dec 2019 14:01:39 -0400 Subject: [PATCH 08/12] PMC-1503 --- workflow/engine/classes/model/Translation.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/workflow/engine/classes/model/Translation.php b/workflow/engine/classes/model/Translation.php index b4cc04ba0..3463fa736 100644 --- a/workflow/engine/classes/model/Translation.php +++ b/workflow/engine/classes/model/Translation.php @@ -237,7 +237,7 @@ class Translation extends BaseTranslation } $res['cacheFileMafe'] = $cacheFileMafe; - $res['languague'] = count($cacheFileMafe); + $res['languague'] = (is_array($cacheFileMafe) || $cacheFileMafe instanceof Countable) ? count($cacheFileMafe) : 0; $res['rowsMafeJS'] = count( $translation ); return $res; } catch (Exception $e) { From df9aaefd70905b7288f63e08faef63600079d0b5 Mon Sep 17 00:00:00 2001 From: Andrea Adamczyk Date: Thu, 19 Dec 2019 09:41:52 -0400 Subject: [PATCH 09/12] PMC-1396 --- tests/unit/workflow/engine/classes/DerivationTest.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/unit/workflow/engine/classes/DerivationTest.php b/tests/unit/workflow/engine/classes/DerivationTest.php index da821037e..d06bc0697 100644 --- a/tests/unit/workflow/engine/classes/DerivationTest.php +++ b/tests/unit/workflow/engine/classes/DerivationTest.php @@ -28,7 +28,7 @@ class DerivationTest extends TestCase // Truncate the APP_SEQUENCE table DB::table('APP_SEQUENCE')->truncate(); - config(["system.workspace" => "test"]); + config(["system.workspace" => "new_site"]); $workspace = config("system.workspace"); if (!file_exists(PATH_DB . $workspace)) { From cf9dfe30f4b8701eb2f10860e3783267dac47edf Mon Sep 17 00:00:00 2001 From: Roly Rudy Gutierrez Pinto Date: Fri, 20 Dec 2019 09:10:10 -0400 Subject: [PATCH 10/12] PMC-1518 Restructure the offline definition over the PM Tables --- .../translations/english/processmaker.en.po | 18 +++++ workflow/engine/controllers/pmTablesProxy.php | 29 ++++++++ workflow/engine/data/mysql/insert.sql | 3 + .../ProcessMaker/Model/AdditionalTables.php | 12 ++++ workflow/engine/templates/pmTables/edit.js | 16 ----- workflow/engine/templates/pmTables/list.js | 65 +++++++++++++++++- workflow/public_html/images/offline-pin.png | Bin 0 -> 317 bytes 7 files changed, 125 insertions(+), 18 deletions(-) create mode 100644 workflow/public_html/images/offline-pin.png diff --git a/workflow/engine/content/translations/english/processmaker.en.po b/workflow/engine/content/translations/english/processmaker.en.po index e13aec174..3bacc36a7 100644 --- a/workflow/engine/content/translations/english/processmaker.en.po +++ b/workflow/engine/content/translations/english/processmaker.en.po @@ -20087,6 +20087,24 @@ msgstr "User has been updated successfully" msgid "Off" msgstr "Off" +# TRANSLATION +# LABEL/ID_OFFLINE_TABLES +#: LABEL/ID_OFFLINE_TABLES +msgid "Offline Tables" +msgstr "Offline Tables" + +# TRANSLATION +# LABEL/ID_OFFLINE_TABLES_ENABLE +#: LABEL/ID_OFFLINE_TABLES_ENABLE +msgid "Set Offline" +msgstr "Set Offline" + +# TRANSLATION +# LABEL/ID_OFFLINE_TABLES_DISABLE +#: LABEL/ID_OFFLINE_TABLES_DISABLE +msgid "Set Online" +msgstr "Set Online" + # TRANSLATION # LABEL/ID_OF_THE_MONTH #: LABEL/ID_OF_THE_MONTH diff --git a/workflow/engine/controllers/pmTablesProxy.php b/workflow/engine/controllers/pmTablesProxy.php index 3d59b1cc3..d9d3e660d 100644 --- a/workflow/engine/controllers/pmTablesProxy.php +++ b/workflow/engine/controllers/pmTablesProxy.php @@ -1,6 +1,7 @@ rows)); + $data = []; + $enable = false; + foreach ($array as $value) { + if ($value->type !== "NORMAL") { + $data[] = $value->id; + $enable = $value->offline ? 1 : 0; + } + } + AdditionalTablesModel::updatePropertyOffline($data, $enable); + $result->success = true; + $result->message = $enable ? G::LoadTranslation("ID_ENABLE") : G::LoadTranslation("ID_DISABLE"); + } catch (Exception $e) { + $result->success = false; + $result->message = $e->getMessage(); + } + return $result; + } + /** * delete pm table * diff --git a/workflow/engine/data/mysql/insert.sql b/workflow/engine/data/mysql/insert.sql index 8404ddb27..f35f5bc2a 100644 --- a/workflow/engine/data/mysql/insert.sql +++ b/workflow/engine/data/mysql/insert.sql @@ -60216,6 +60216,9 @@ INSERT INTO TRANSLATION (TRN_CATEGORY,TRN_ID,TRN_LANG,TRN_VALUE,TRN_UPDATE_DATE ( 'LABEL','ID_OBJECT_REMOVE','en','Object has been removed successfully','2014-01-15') , ( 'LABEL','ID_OBJECT_UPDATE','en','User has been updated successfully','2014-01-15') , ( 'LABEL','ID_OFF','en','Off','2014-01-15') , +( 'LABEL','ID_OFFLINE_TABLES','en','Offline Tables','2019-12-19') , +( 'LABEL','ID_OFFLINE_TABLES_ENABLE','en','Set Offline Tables','2019-12-19') , +( 'LABEL','ID_OFFLINE_TABLES_DISABLE','en','Set Online Tables','2019-12-19') , ( 'LABEL','ID_OF_THE_MONTH','en','of the month(s)','2014-01-15') , ( 'LABEL','ID_OK','en','Ok','2015-09-17') , ( 'LABEL','ID_OLD_VERSION','en','old version','2014-01-15') , diff --git a/workflow/engine/src/ProcessMaker/Model/AdditionalTables.php b/workflow/engine/src/ProcessMaker/Model/AdditionalTables.php index 535387053..c25583b75 100644 --- a/workflow/engine/src/ProcessMaker/Model/AdditionalTables.php +++ b/workflow/engine/src/ProcessMaker/Model/AdditionalTables.php @@ -90,4 +90,16 @@ class AdditionalTables extends Model return $data; } + + /** + * Update the offline property. + * @param array $tablesUid + * @param int $value + * @return void + */ + public static function updatePropertyOffline(array $tablesUid, $value): void + { + $query = AdditionalTables::whereIn('ADD_TAB_UID', $tablesUid) + ->update(['ADD_TAB_OFFLINE' => $value]); + } } diff --git a/workflow/engine/templates/pmTables/edit.js b/workflow/engine/templates/pmTables/edit.js index 23f6b7165..843d1abe6 100644 --- a/workflow/engine/templates/pmTables/edit.js +++ b/workflow/engine/templates/pmTables/edit.js @@ -741,20 +741,6 @@ Ext.onReady(function () { } ] }); - items.push({ - layout: "column", - style: "margin-left: 255px;", - hidden: false, - items: [ - { - xtype: "checkbox", - id: "checkboxAvailableOffline", - name: "checkboxAvailableOffline", - checked: false, - boxLabel: _("ID_AVAILABLE_OFFLINE_THE_MOBILE_APPLICATIONS") - } - ] - }); var frmDetails = new Ext.FormPanel({ id: 'frmDetails', @@ -811,7 +797,6 @@ Ext.onReady(function () { Ext.getCmp('REP_TAB_NAME').setValue(TABLE.ADD_TAB_NAME); Ext.getCmp('REP_TAB_NAME').setDisabled(false); Ext.getCmp('REP_TAB_DSC').setValue(TABLE.ADD_TAB_DESCRIPTION); - Ext.getCmp('checkboxAvailableOffline').setValue(TABLE.ADD_TAB_OFFLINE === 1); loadTableRowsFromArray(TABLE.FIELDS); } @@ -941,7 +926,6 @@ function createReportTable() REP_TAB_CONNECTION: "workflow", REP_TAB_TYPE: "", REP_TAB_GRID: "", - REP_TAB_OFFLINE: Ext.getCmp("checkboxAvailableOffline").checked === true ? "1" : "0", columns: Ext.util.JSON.encode(columns) }; diff --git a/workflow/engine/templates/pmTables/list.js b/workflow/engine/templates/pmTables/list.js index 5cee228e2..ac1d77d6e 100644 --- a/workflow/engine/templates/pmTables/list.js +++ b/workflow/engine/templates/pmTables/list.js @@ -7,6 +7,7 @@ var editButton; var deleteButton; var importButton; var exportButton; +var offlineEnableDisable; var dataButton; var store; @@ -108,6 +109,26 @@ Ext.onReady(function () { disabled: true }); + offlineEnableDisable = new Ext.Action({ + id: 'offlineEnableDisable', + text: _('ID_OFFLINE_TABLES'), + iconCls: 'silk-add', + icon: '/images/offline-pin.png', + menu: [{ + text: _('ID_OFFLINE_TABLES_ENABLE'), + handler: function () { + OfflineEnableDisablePMTable(true); + } + }, { + text: _('ID_OFFLINE_TABLES_DISABLE'), + handler: function () { + OfflineEnableDisablePMTable(false); + } + } + ], + disabled: true + }); + dataButton = new Ext.Action({ id: 'dataButton', text: ' ' + _('ID_DATA'), @@ -252,18 +273,21 @@ Ext.onReady(function () { editButton.disable(); deleteButton.disable(); exportButton.disable(); + offlineEnableDisable.disable(); dataButton.disable(); break; case 1: editButton.enable(); deleteButton.enable(); exportButton.enable(); + offlineEnableDisable.enable(); dataButton.enable(); break; default: editButton.disable(); deleteButton.enable(); exportButton.enable(); + offlineEnableDisable.enable(); dataButton.disable(); break; } @@ -365,6 +389,7 @@ Ext.onReady(function () { dataButton, '-', importButton, exportButton, + offlineEnableDisable, '->', searchText, clearTextButton, @@ -515,6 +540,7 @@ DeletePMTable = function () { editButton.disable(); deleteButton.disable(); exportButton.disable(); + offlineEnableDisable.disable(); dataButton.disable(); } } @@ -777,7 +803,6 @@ function updateTagPermissions() { location.href = 'pmReports/reportsAjax?action=permissionList&ADD_TAB_NAME=' + rowsSelected[0].get('ADD_TAB_NAME') + '&ADD_TAB_UID=' + rowsSelected[0].get('ADD_TAB_UID') + '&pro_uid=' + PRO_UID + '&flagProcessmap=' + flagProcessmap; } } -; function PopupCenter(pageURL, title, w, h) { var left = (Ext.getBody().getViewSize().width / 3); @@ -947,4 +972,40 @@ function pmtablesErrors(aOverwrite, aRelated, aMessage) { for (i = 0; i < aOverwrite.length; i++) { Ext.get(aOverwrite[i]['NAME_TABLE']).setStyle({border: '0', marginTop: '0'}); } -} \ No newline at end of file +} + +function OfflineEnableDisablePMTable(enableDisable) { + var rows = Ext.getCmp('infoGrid').getSelectionModel().getSelections(); + if (rows.length <= 0) { + return; + } + var selections = []; + for (var i = 0; i < rows.length; i++) { + selections[i] = { + id: rows[i].get('ADD_TAB_UID'), + type: rows[i].get('ADD_TAB_TYPE'), + offline: enableDisable + }; + } + Ext.Ajax.request({ + url: 'pmTablesProxy/updateOffline', + params: { + rows: Ext.util.JSON.encode(selections) + }, + success: function (response) { + Ext.MessageBox.hide(); + var result = Ext.util.JSON.decode(response.responseText); + if (result.success) { + PMExt.notify(_("ID_OFFLINE_TABLES"), result.message.nl2br()); + } else { + PMExt.error(_("ID_ERROR"), result.message.nl2br()); + } + Ext.getCmp('infoGrid').getStore().reload(); + }, + failure: function (target, response) { + Ext.MessageBox.hide(); + Ext.getCmp('infoGrid').getStore().reload(); + Ext.Msg.alert(_('ID_ERROR'), response.result.message); + } + }); +} diff --git a/workflow/public_html/images/offline-pin.png b/workflow/public_html/images/offline-pin.png new file mode 100644 index 0000000000000000000000000000000000000000..7adf7e2af0fda1d34462082a26b1fe46c8013fb6 GIT binary patch literal 317 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sBugD~Uq{1quc!AqVljv*HQTQ4uX%;+d_{A2bajV=&+;V*Ds zBWsbpqljxD2p!%2>F>E4vv+Up7yNOyCT-5%^!)cX_r97gnb>FF^Y`&(pMs;dpZi(w zrSUw(G+)mUds-lv*h7yoA%lL3Z{Pom+>>`?^w#Usp_Ii|N!Z zy0juf`by*?%ZjGSE=O-I?BhL^UodG!#9H0Aio6je9469lD>IL-Ej%E-_{Y76wsL*O zmxPtpU3eyz{PUNOeFmsI$kPm}`sj=|H_&t;uc GLK6V8`h=1I literal 0 HcmV?d00001 From 2871f02a042dfaa07c043aeecb18f13d795ccbc6 Mon Sep 17 00:00:00 2001 From: Roly Rudy Gutierrez Pinto Date: Mon, 23 Dec 2019 12:36:40 -0400 Subject: [PATCH 11/12] PMC-1459 It is not possible to export processes --- tests/resources/dynaformDataForRenewUids.json | 929 ++++++++++++++++++ .../workflow/engine/classes/ProcessesTest.php | 48 +- .../src/ProcessMaker/Project/WorkflowTest.php | 118 +++ workflow/engine/classes/Processes.php | 3 + .../processes/processes_Import_Ajax.php | 69 +- .../src/ProcessMaker/Project/Workflow.php | 5 +- 6 files changed, 1131 insertions(+), 41 deletions(-) create mode 100644 tests/resources/dynaformDataForRenewUids.json create mode 100644 tests/unit/workflow/engine/src/ProcessMaker/Project/WorkflowTest.php diff --git a/tests/resources/dynaformDataForRenewUids.json b/tests/resources/dynaformDataForRenewUids.json new file mode 100644 index 000000000..6156ab080 --- /dev/null +++ b/tests/resources/dynaformDataForRenewUids.json @@ -0,0 +1,929 @@ +{ + "process": { + "PRO_UID": "3865635965dfb8d7a152330088145190", + "PRO_TITLE": "test", + "PRO_DESCRIPTION": "", + "PRO_PARENT": "7084112395dfb826264eac2069406712", + "PRO_TIME": "1", + "PRO_TIMEUNIT": "DAYS", + "PRO_STATUS": "ACTIVE", + "PRO_STATUS_ID": "1", + "PRO_TYPE_DAY": "", + "PRO_TYPE": "NORMAL", + "PRO_ASSIGNMENT": "FALSE", + "PRO_SHOW_MAP": "0", + "PRO_SHOW_MESSAGE": "0", + "PRO_SUBPROCESS": "0", + "PRO_TRI_CREATE": "", + "PRO_TRI_OPEN": "", + "PRO_TRI_DELETED": "", + "PRO_TRI_CANCELED": "", + "PRO_TRI_PAUSED": "", + "PRO_TRI_REASSIGNED": "", + "PRO_TRI_UNPAUSED": "", + "PRO_TYPE_PROCESS": "PUBLIC", + "PRO_SHOW_DELEGATE": "0", + "PRO_SHOW_DYNAFORM": "0", + "PRO_CATEGORY": "", + "PRO_SUB_CATEGORY": "", + "PRO_INDUSTRY": "0", + "PRO_UPDATE_DATE": "2019-12-19 14:16:06", + "PRO_CREATE_USER": "00000000000000000000000000000001", + "PRO_HEIGHT": "5000", + "PRO_WIDTH": "10000", + "PRO_TITLE_X": "0", + "PRO_TITLE_Y": "0", + "PRO_DEBUG": "0", + "PRO_DYNAFORMS": "a:1:{s:7:\"PROCESS\";s:0:\"\";}", + "PRO_DERIVATION_SCREEN_TPL": "", + "PRO_COST": "0", + "PRO_UNIT_COST": "", + "PRO_ITEE": "1", + "PRO_ACTION_DONE": "a:1:{i:0;s:41:\"GATEWAYTOGATEWAY_DELETE_CORRUPTED_RECORDS\";}", + "CATEGORY_ID": "0", + "PRO_CATEGORY_LABEL": "No Category", + "PRO_BPMN": "1" + }, + "tasks": [ + { + "PRO_UID": "3865635965dfb8d7a152330088145190", + "PRO_ID": "0", + "TAS_UID": "5978729975dfb8d7a264fa0070639752", + "TAS_TITLE": "Task 1", + "TAS_DESCRIPTION": "", + "TAS_DEF_TITLE": "", + "TAS_DEF_SUBJECT_MESSAGE": "", + "TAS_DEF_PROC_CODE": "", + "TAS_DEF_MESSAGE": "", + "TAS_DEF_DESCRIPTION": "", + "TAS_TYPE": "NORMAL", + "TAS_DURATION": "1", + "TAS_DELAY_TYPE": "", + "TAS_TEMPORIZER": "0", + "TAS_TYPE_DAY": "", + "TAS_TIMEUNIT": "DAYS", + "TAS_ALERT": "FALSE", + "TAS_PRIORITY_VARIABLE": "", + "TAS_ASSIGN_TYPE": "BALANCED", + "TAS_ASSIGN_VARIABLE": "@@SYS_NEXT_USER_TO_BE_ASSIGNED", + "TAS_GROUP_VARIABLE": "", + "TAS_MI_INSTANCE_VARIABLE": "@@SYS_VAR_TOTAL_INSTANCE", + "TAS_MI_COMPLETE_VARIABLE": "@@SYS_VAR_TOTAL_INSTANCES_COMPLETE", + "TAS_ASSIGN_LOCATION": "FALSE", + "TAS_ASSIGN_LOCATION_ADHOC": "FALSE", + "TAS_TRANSFER_FLY": "FALSE", + "TAS_LAST_ASSIGNED": "0", + "TAS_USER": "0", + "TAS_CAN_UPLOAD": "FALSE", + "TAS_VIEW_UPLOAD": "FALSE", + "TAS_VIEW_ADDITIONAL_DOCUMENTATION": "FALSE", + "TAS_CAN_CANCEL": "FALSE", + "TAS_OWNER_APP": "FALSE", + "STG_UID": "", + "TAS_CAN_PAUSE": "FALSE", + "TAS_CAN_SEND_MESSAGE": "TRUE", + "TAS_CAN_DELETE_DOCS": "FALSE", + "TAS_SELF_SERVICE": "FALSE", + "TAS_START": "TRUE", + "TAS_TO_LAST_USER": "FALSE", + "TAS_SEND_LAST_EMAIL": "FALSE", + "TAS_DERIVATION": "NORMAL", + "TAS_POSX": "143", + "TAS_POSY": "82", + "TAS_WIDTH": "110", + "TAS_HEIGHT": "60", + "TAS_COLOR": "", + "TAS_EVN_UID": "", + "TAS_BOUNDARY": "", + "TAS_DERIVATION_SCREEN_TPL": "", + "TAS_SELFSERVICE_TIMEOUT": "0", + "TAS_SELFSERVICE_TIME": "0", + "TAS_SELFSERVICE_TIME_UNIT": "", + "TAS_SELFSERVICE_TRIGGER_UID": "", + "TAS_SELFSERVICE_EXECUTION": "EVERY_TIME", + "TAS_NOT_EMAIL_FROM_FORMAT": "0", + "TAS_OFFLINE": "FALSE", + "TAS_EMAIL_SERVER_UID": "", + "TAS_AUTO_ROOT": "FALSE", + "TAS_RECEIVE_SERVER_UID": "", + "TAS_RECEIVE_LAST_EMAIL": "FALSE", + "TAS_RECEIVE_EMAIL_FROM_FORMAT": "0", + "TAS_RECEIVE_MESSAGE_TYPE": "text", + "TAS_RECEIVE_MESSAGE_TEMPLATE": "alert_message.html", + "TAS_RECEIVE_SUBJECT_MESSAGE": "", + "TAS_RECEIVE_MESSAGE": "", + "TAS_AVERAGE": "", + "TAS_SDV": "", + "TAS_UID_OLD": "5730239675dfb8626a65a28038679991" + }, + { + "PRO_UID": "3865635965dfb8d7a152330088145190", + "PRO_ID": "0", + "TAS_UID": "3458788095dfb8d7a18fa33047794245", + "TAS_TITLE": "Task 2", + "TAS_DESCRIPTION": "", + "TAS_DEF_TITLE": "", + "TAS_DEF_SUBJECT_MESSAGE": "", + "TAS_DEF_PROC_CODE": "", + "TAS_DEF_MESSAGE": "", + "TAS_DEF_DESCRIPTION": "", + "TAS_TYPE": "NORMAL", + "TAS_DURATION": "1", + "TAS_DELAY_TYPE": "", + "TAS_TEMPORIZER": "0", + "TAS_TYPE_DAY": "", + "TAS_TIMEUNIT": "DAYS", + "TAS_ALERT": "FALSE", + "TAS_PRIORITY_VARIABLE": "", + "TAS_ASSIGN_TYPE": "BALANCED", + "TAS_ASSIGN_VARIABLE": "@@SYS_NEXT_USER_TO_BE_ASSIGNED", + "TAS_GROUP_VARIABLE": "", + "TAS_MI_INSTANCE_VARIABLE": "@@SYS_VAR_TOTAL_INSTANCE", + "TAS_MI_COMPLETE_VARIABLE": "@@SYS_VAR_TOTAL_INSTANCES_COMPLETE", + "TAS_ASSIGN_LOCATION": "FALSE", + "TAS_ASSIGN_LOCATION_ADHOC": "FALSE", + "TAS_TRANSFER_FLY": "FALSE", + "TAS_LAST_ASSIGNED": "0", + "TAS_USER": "0", + "TAS_CAN_UPLOAD": "FALSE", + "TAS_VIEW_UPLOAD": "FALSE", + "TAS_VIEW_ADDITIONAL_DOCUMENTATION": "FALSE", + "TAS_CAN_CANCEL": "FALSE", + "TAS_OWNER_APP": "FALSE", + "STG_UID": "", + "TAS_CAN_PAUSE": "FALSE", + "TAS_CAN_SEND_MESSAGE": "TRUE", + "TAS_CAN_DELETE_DOCS": "FALSE", + "TAS_SELF_SERVICE": "FALSE", + "TAS_START": "TRUE", + "TAS_TO_LAST_USER": "FALSE", + "TAS_SEND_LAST_EMAIL": "FALSE", + "TAS_DERIVATION": "NORMAL", + "TAS_POSX": "143", + "TAS_POSY": "181", + "TAS_WIDTH": "110", + "TAS_HEIGHT": "60", + "TAS_COLOR": "", + "TAS_EVN_UID": "", + "TAS_BOUNDARY": "", + "TAS_DERIVATION_SCREEN_TPL": "", + "TAS_SELFSERVICE_TIMEOUT": "0", + "TAS_SELFSERVICE_TIME": "0", + "TAS_SELFSERVICE_TIME_UNIT": "", + "TAS_SELFSERVICE_TRIGGER_UID": "", + "TAS_SELFSERVICE_EXECUTION": "EVERY_TIME", + "TAS_NOT_EMAIL_FROM_FORMAT": "0", + "TAS_OFFLINE": "FALSE", + "TAS_EMAIL_SERVER_UID": "", + "TAS_AUTO_ROOT": "FALSE", + "TAS_RECEIVE_SERVER_UID": "", + "TAS_RECEIVE_LAST_EMAIL": "FALSE", + "TAS_RECEIVE_EMAIL_FROM_FORMAT": "0", + "TAS_RECEIVE_MESSAGE_TYPE": "text", + "TAS_RECEIVE_MESSAGE_TEMPLATE": "alert_message.html", + "TAS_RECEIVE_SUBJECT_MESSAGE": "", + "TAS_RECEIVE_MESSAGE": "", + "TAS_AVERAGE": "", + "TAS_SDV": "", + "TAS_UID_OLD": "6279149375dfb8626a95495099553981" + }, + { + "PRO_UID": "3865635965dfb8d7a152330088145190", + "PRO_ID": "0", + "TAS_UID": "7916511005dfb8d7a234286082436886", + "TAS_TITLE": "Task 3", + "TAS_DESCRIPTION": "", + "TAS_DEF_TITLE": "", + "TAS_DEF_SUBJECT_MESSAGE": "", + "TAS_DEF_PROC_CODE": "", + "TAS_DEF_MESSAGE": "", + "TAS_DEF_DESCRIPTION": "", + "TAS_TYPE": "NORMAL", + "TAS_DURATION": "1", + "TAS_DELAY_TYPE": "", + "TAS_TEMPORIZER": "0", + "TAS_TYPE_DAY": "", + "TAS_TIMEUNIT": "DAYS", + "TAS_ALERT": "FALSE", + "TAS_PRIORITY_VARIABLE": "", + "TAS_ASSIGN_TYPE": "BALANCED", + "TAS_ASSIGN_VARIABLE": "@@SYS_NEXT_USER_TO_BE_ASSIGNED", + "TAS_GROUP_VARIABLE": "", + "TAS_MI_INSTANCE_VARIABLE": "@@SYS_VAR_TOTAL_INSTANCE", + "TAS_MI_COMPLETE_VARIABLE": "@@SYS_VAR_TOTAL_INSTANCES_COMPLETE", + "TAS_ASSIGN_LOCATION": "FALSE", + "TAS_ASSIGN_LOCATION_ADHOC": "FALSE", + "TAS_TRANSFER_FLY": "FALSE", + "TAS_LAST_ASSIGNED": "0", + "TAS_USER": "0", + "TAS_CAN_UPLOAD": "FALSE", + "TAS_VIEW_UPLOAD": "FALSE", + "TAS_VIEW_ADDITIONAL_DOCUMENTATION": "FALSE", + "TAS_CAN_CANCEL": "FALSE", + "TAS_OWNER_APP": "FALSE", + "STG_UID": "", + "TAS_CAN_PAUSE": "FALSE", + "TAS_CAN_SEND_MESSAGE": "TRUE", + "TAS_CAN_DELETE_DOCS": "FALSE", + "TAS_SELF_SERVICE": "FALSE", + "TAS_START": "FALSE", + "TAS_TO_LAST_USER": "FALSE", + "TAS_SEND_LAST_EMAIL": "FALSE", + "TAS_DERIVATION": "NORMAL", + "TAS_POSX": "337", + "TAS_POSY": "181", + "TAS_WIDTH": "110", + "TAS_HEIGHT": "60", + "TAS_COLOR": "", + "TAS_EVN_UID": "", + "TAS_BOUNDARY": "", + "TAS_DERIVATION_SCREEN_TPL": "", + "TAS_SELFSERVICE_TIMEOUT": "0", + "TAS_SELFSERVICE_TIME": "0", + "TAS_SELFSERVICE_TIME_UNIT": "", + "TAS_SELFSERVICE_TRIGGER_UID": "", + "TAS_SELFSERVICE_EXECUTION": "EVERY_TIME", + "TAS_NOT_EMAIL_FROM_FORMAT": "0", + "TAS_OFFLINE": "FALSE", + "TAS_EMAIL_SERVER_UID": "", + "TAS_AUTO_ROOT": "FALSE", + "TAS_RECEIVE_SERVER_UID": "", + "TAS_RECEIVE_LAST_EMAIL": "FALSE", + "TAS_RECEIVE_EMAIL_FROM_FORMAT": "0", + "TAS_RECEIVE_MESSAGE_TYPE": "text", + "TAS_RECEIVE_MESSAGE_TEMPLATE": "alert_message.html", + "TAS_RECEIVE_SUBJECT_MESSAGE": "", + "TAS_RECEIVE_MESSAGE": "", + "TAS_AVERAGE": "", + "TAS_SDV": "", + "TAS_UID_OLD": "3347609685dfb8626a35d06089327263" + }, + { + "PRO_UID": "3865635965dfb8d7a152330088145190", + "PRO_ID": "0", + "TAS_UID": "9865926225dfb8d7a1fc385009206952", + "TAS_TITLE": "Task 4", + "TAS_DESCRIPTION": "", + "TAS_DEF_TITLE": "", + "TAS_DEF_SUBJECT_MESSAGE": "", + "TAS_DEF_PROC_CODE": "", + "TAS_DEF_MESSAGE": "", + "TAS_DEF_DESCRIPTION": "", + "TAS_TYPE": "NORMAL", + "TAS_DURATION": "1", + "TAS_DELAY_TYPE": "", + "TAS_TEMPORIZER": "0", + "TAS_TYPE_DAY": "1", + "TAS_TIMEUNIT": "DAYS", + "TAS_ALERT": "FALSE", + "TAS_PRIORITY_VARIABLE": "", + "TAS_ASSIGN_TYPE": "BALANCED", + "TAS_ASSIGN_VARIABLE": "@@SYS_NEXT_USER_TO_BE_ASSIGNED", + "TAS_GROUP_VARIABLE": "", + "TAS_MI_INSTANCE_VARIABLE": "@@SYS_VAR_TOTAL_INSTANCE", + "TAS_MI_COMPLETE_VARIABLE": "@@SYS_VAR_TOTAL_INSTANCES_COMPLETE", + "TAS_ASSIGN_LOCATION": "FALSE", + "TAS_ASSIGN_LOCATION_ADHOC": "FALSE", + "TAS_TRANSFER_FLY": "FALSE", + "TAS_LAST_ASSIGNED": "0", + "TAS_USER": "0", + "TAS_CAN_UPLOAD": "FALSE", + "TAS_VIEW_UPLOAD": "FALSE", + "TAS_VIEW_ADDITIONAL_DOCUMENTATION": "FALSE", + "TAS_CAN_CANCEL": "FALSE", + "TAS_OWNER_APP": "FALSE", + "STG_UID": "", + "TAS_CAN_PAUSE": "FALSE", + "TAS_CAN_SEND_MESSAGE": "TRUE", + "TAS_CAN_DELETE_DOCS": "FALSE", + "TAS_SELF_SERVICE": "FALSE", + "TAS_START": "TRUE", + "TAS_TO_LAST_USER": "FALSE", + "TAS_SEND_LAST_EMAIL": "FALSE", + "TAS_DERIVATION": "NORMAL", + "TAS_POSX": "143", + "TAS_POSY": "274", + "TAS_WIDTH": "110", + "TAS_HEIGHT": "60", + "TAS_COLOR": "", + "TAS_EVN_UID": "", + "TAS_BOUNDARY": "", + "TAS_DERIVATION_SCREEN_TPL": "", + "TAS_SELFSERVICE_TIMEOUT": "0", + "TAS_SELFSERVICE_TIME": "0", + "TAS_SELFSERVICE_TIME_UNIT": "", + "TAS_SELFSERVICE_TRIGGER_UID": "", + "TAS_SELFSERVICE_EXECUTION": "EVERY_TIME", + "TAS_NOT_EMAIL_FROM_FORMAT": "0", + "TAS_OFFLINE": "FALSE", + "TAS_EMAIL_SERVER_UID": "", + "TAS_AUTO_ROOT": "FALSE", + "TAS_RECEIVE_SERVER_UID": "", + "TAS_RECEIVE_LAST_EMAIL": "FALSE", + "TAS_RECEIVE_EMAIL_FROM_FORMAT": "0", + "TAS_RECEIVE_MESSAGE_TYPE": "text", + "TAS_RECEIVE_MESSAGE_TEMPLATE": "alert_message.html", + "TAS_RECEIVE_SUBJECT_MESSAGE": "", + "TAS_RECEIVE_MESSAGE": "", + "TAS_AVERAGE": "", + "TAS_SDV": "", + "TAS_UID_OLD": "8420128765dfb8626acccb8059629296" + }, + { + "PRO_UID": "3865635965dfb8d7a152330088145190", + "PRO_ID": "0", + "TAS_UID": "3454769755dfb8d7a1cadc9088436060", + "TAS_TITLE": "Task 5", + "TAS_DESCRIPTION": "", + "TAS_DEF_TITLE": "", + "TAS_DEF_SUBJECT_MESSAGE": "", + "TAS_DEF_PROC_CODE": "", + "TAS_DEF_MESSAGE": "", + "TAS_DEF_DESCRIPTION": "", + "TAS_TYPE": "NORMAL", + "TAS_DURATION": "1", + "TAS_DELAY_TYPE": "", + "TAS_TEMPORIZER": "0", + "TAS_TYPE_DAY": "1", + "TAS_TIMEUNIT": "DAYS", + "TAS_ALERT": "FALSE", + "TAS_PRIORITY_VARIABLE": "", + "TAS_ASSIGN_TYPE": "BALANCED", + "TAS_ASSIGN_VARIABLE": "@@SYS_NEXT_USER_TO_BE_ASSIGNED", + "TAS_GROUP_VARIABLE": "", + "TAS_MI_INSTANCE_VARIABLE": "@@SYS_VAR_TOTAL_INSTANCE", + "TAS_MI_COMPLETE_VARIABLE": "@@SYS_VAR_TOTAL_INSTANCES_COMPLETE", + "TAS_ASSIGN_LOCATION": "FALSE", + "TAS_ASSIGN_LOCATION_ADHOC": "FALSE", + "TAS_TRANSFER_FLY": "FALSE", + "TAS_LAST_ASSIGNED": "0", + "TAS_USER": "0", + "TAS_CAN_UPLOAD": "FALSE", + "TAS_VIEW_UPLOAD": "FALSE", + "TAS_VIEW_ADDITIONAL_DOCUMENTATION": "FALSE", + "TAS_CAN_CANCEL": "FALSE", + "TAS_OWNER_APP": "FALSE", + "STG_UID": "", + "TAS_CAN_PAUSE": "FALSE", + "TAS_CAN_SEND_MESSAGE": "TRUE", + "TAS_CAN_DELETE_DOCS": "FALSE", + "TAS_SELF_SERVICE": "FALSE", + "TAS_START": "FALSE", + "TAS_TO_LAST_USER": "FALSE", + "TAS_SEND_LAST_EMAIL": "FALSE", + "TAS_DERIVATION": "NORMAL", + "TAS_POSX": "337", + "TAS_POSY": "274", + "TAS_WIDTH": "110", + "TAS_HEIGHT": "60", + "TAS_COLOR": "", + "TAS_EVN_UID": "", + "TAS_BOUNDARY": "", + "TAS_DERIVATION_SCREEN_TPL": "", + "TAS_SELFSERVICE_TIMEOUT": "0", + "TAS_SELFSERVICE_TIME": "0", + "TAS_SELFSERVICE_TIME_UNIT": "", + "TAS_SELFSERVICE_TRIGGER_UID": "", + "TAS_SELFSERVICE_EXECUTION": "EVERY_TIME", + "TAS_NOT_EMAIL_FROM_FORMAT": "0", + "TAS_OFFLINE": "FALSE", + "TAS_EMAIL_SERVER_UID": "", + "TAS_AUTO_ROOT": "FALSE", + "TAS_RECEIVE_SERVER_UID": "", + "TAS_RECEIVE_LAST_EMAIL": "FALSE", + "TAS_RECEIVE_EMAIL_FROM_FORMAT": "0", + "TAS_RECEIVE_MESSAGE_TYPE": "text", + "TAS_RECEIVE_MESSAGE_TEMPLATE": "alert_message.html", + "TAS_RECEIVE_SUBJECT_MESSAGE": "", + "TAS_RECEIVE_MESSAGE": "", + "TAS_AVERAGE": "", + "TAS_SDV": "", + "TAS_UID_OLD": "7400740655dfb86269feaa1089812754" + }, + { + "PRO_UID": "3865635965dfb8d7a152330088145190", + "PRO_ID": "0", + "TAS_UID": "wee-532835dfb8d7a2d0a29054950929", + "TAS_TITLE": "WEBENTRYEVENT", + "TAS_DESCRIPTION": "", + "TAS_DEF_TITLE": "", + "TAS_DEF_SUBJECT_MESSAGE": "", + "TAS_DEF_PROC_CODE": "", + "TAS_DEF_MESSAGE": "", + "TAS_DEF_DESCRIPTION": "", + "TAS_TYPE": "WEBENTRYEVENT", + "TAS_DURATION": "1", + "TAS_DELAY_TYPE": "", + "TAS_TEMPORIZER": "0", + "TAS_TYPE_DAY": "", + "TAS_TIMEUNIT": "DAYS", + "TAS_ALERT": "FALSE", + "TAS_PRIORITY_VARIABLE": "", + "TAS_ASSIGN_TYPE": "BALANCED", + "TAS_ASSIGN_VARIABLE": "@@SYS_NEXT_USER_TO_BE_ASSIGNED", + "TAS_GROUP_VARIABLE": "", + "TAS_MI_INSTANCE_VARIABLE": "@@SYS_VAR_TOTAL_INSTANCE", + "TAS_MI_COMPLETE_VARIABLE": "@@SYS_VAR_TOTAL_INSTANCES_COMPLETE", + "TAS_ASSIGN_LOCATION": "FALSE", + "TAS_ASSIGN_LOCATION_ADHOC": "FALSE", + "TAS_TRANSFER_FLY": "FALSE", + "TAS_LAST_ASSIGNED": "0", + "TAS_USER": "0", + "TAS_CAN_UPLOAD": "FALSE", + "TAS_VIEW_UPLOAD": "FALSE", + "TAS_VIEW_ADDITIONAL_DOCUMENTATION": "FALSE", + "TAS_CAN_CANCEL": "FALSE", + "TAS_OWNER_APP": "FALSE", + "STG_UID": "", + "TAS_CAN_PAUSE": "FALSE", + "TAS_CAN_SEND_MESSAGE": "TRUE", + "TAS_CAN_DELETE_DOCS": "FALSE", + "TAS_SELF_SERVICE": "FALSE", + "TAS_START": "TRUE", + "TAS_TO_LAST_USER": "FALSE", + "TAS_SEND_LAST_EMAIL": "FALSE", + "TAS_DERIVATION": "NORMAL", + "TAS_POSX": "62", + "TAS_POSY": "202", + "TAS_WIDTH": "110", + "TAS_HEIGHT": "60", + "TAS_COLOR": "", + "TAS_EVN_UID": "", + "TAS_BOUNDARY": "", + "TAS_DERIVATION_SCREEN_TPL": "", + "TAS_SELFSERVICE_TIMEOUT": "0", + "TAS_SELFSERVICE_TIME": "0", + "TAS_SELFSERVICE_TIME_UNIT": "", + "TAS_SELFSERVICE_TRIGGER_UID": "", + "TAS_SELFSERVICE_EXECUTION": "EVERY_TIME", + "TAS_NOT_EMAIL_FROM_FORMAT": "0", + "TAS_OFFLINE": "FALSE", + "TAS_EMAIL_SERVER_UID": "", + "TAS_AUTO_ROOT": "FALSE", + "TAS_RECEIVE_SERVER_UID": "", + "TAS_RECEIVE_LAST_EMAIL": "FALSE", + "TAS_RECEIVE_EMAIL_FROM_FORMAT": "0", + "TAS_RECEIVE_MESSAGE_TYPE": "text", + "TAS_RECEIVE_MESSAGE_TEMPLATE": "alert_message.html", + "TAS_RECEIVE_SUBJECT_MESSAGE": "", + "TAS_RECEIVE_MESSAGE": "", + "TAS_AVERAGE": "", + "TAS_SDV": "", + "TAS_UID_OLD": "wee-873125dfb8626b28bf4015522377" + } + ], + "routes": [ + { + "ROU_UID": "1212118285dfb8626c112f2028203620", + "ROU_PARENT": "0", + "PRO_UID": "3865635965dfb8d7a152330088145190", + "TAS_UID": "3454769755dfb8d7a1cadc9088436060", + "ROU_NEXT_TASK": "-1", + "ROU_CASE": "1", + "ROU_TYPE": "SEQUENTIAL", + "ROU_DEFAULT": "0", + "ROU_CONDITION": "", + "ROU_TO_LAST_USER": "FALSE", + "ROU_OPTIONAL": "FALSE", + "ROU_SEND_EMAIL": "TRUE", + "ROU_SOURCEANCHOR": "1", + "ROU_TARGETANCHOR": "0", + "ROU_TO_PORT": "1", + "ROU_FROM_PORT": "2", + "ROU_EVN_UID": "", + "GAT_UID": "" + }, + { + "ROU_UID": "2179164525dfb8626c19333095716699", + "ROU_PARENT": "0", + "PRO_UID": "3865635965dfb8d7a152330088145190", + "TAS_UID": "9865926225dfb8d7a1fc385009206952", + "ROU_NEXT_TASK": "3454769755dfb8d7a1cadc9088436060", + "ROU_CASE": "1", + "ROU_TYPE": "SEQUENTIAL", + "ROU_DEFAULT": "0", + "ROU_CONDITION": "", + "ROU_TO_LAST_USER": "FALSE", + "ROU_OPTIONAL": "FALSE", + "ROU_SEND_EMAIL": "TRUE", + "ROU_SOURCEANCHOR": "1", + "ROU_TARGETANCHOR": "0", + "ROU_TO_PORT": "1", + "ROU_FROM_PORT": "2", + "ROU_EVN_UID": "", + "GAT_UID": "" + }, + { + "ROU_UID": "2685133935dfb8626c23ee2060782509", + "ROU_PARENT": "0", + "PRO_UID": "3865635965dfb8d7a152330088145190", + "TAS_UID": "7916511005dfb8d7a234286082436886", + "ROU_NEXT_TASK": "-1", + "ROU_CASE": "1", + "ROU_TYPE": "SEQUENTIAL", + "ROU_DEFAULT": "0", + "ROU_CONDITION": "", + "ROU_TO_LAST_USER": "FALSE", + "ROU_OPTIONAL": "FALSE", + "ROU_SEND_EMAIL": "TRUE", + "ROU_SOURCEANCHOR": "1", + "ROU_TARGETANCHOR": "0", + "ROU_TO_PORT": "1", + "ROU_FROM_PORT": "2", + "ROU_EVN_UID": "", + "GAT_UID": "" + }, + { + "ROU_UID": "3309845585dfb8626cf6d41085941718", + "ROU_PARENT": "0", + "PRO_UID": "3865635965dfb8d7a152330088145190", + "TAS_UID": "wee-532835dfb8d7a2d0a29054950929", + "ROU_NEXT_TASK": "3458788095dfb8d7a18fa33047794245", + "ROU_CASE": "1", + "ROU_TYPE": "SEQUENTIAL", + "ROU_DEFAULT": "0", + "ROU_CONDITION": "", + "ROU_TO_LAST_USER": "FALSE", + "ROU_OPTIONAL": "FALSE", + "ROU_SEND_EMAIL": "TRUE", + "ROU_SOURCEANCHOR": "1", + "ROU_TARGETANCHOR": "0", + "ROU_TO_PORT": "1", + "ROU_FROM_PORT": "2", + "ROU_EVN_UID": "", + "GAT_UID": "" + }, + { + "ROU_UID": "7287866925dfb8626c065a7095532193", + "ROU_PARENT": "0", + "PRO_UID": "3865635965dfb8d7a152330088145190", + "TAS_UID": "3458788095dfb8d7a18fa33047794245", + "ROU_NEXT_TASK": "7916511005dfb8d7a234286082436886", + "ROU_CASE": "1", + "ROU_TYPE": "SEQUENTIAL", + "ROU_DEFAULT": "0", + "ROU_CONDITION": "", + "ROU_TO_LAST_USER": "FALSE", + "ROU_OPTIONAL": "FALSE", + "ROU_SEND_EMAIL": "TRUE", + "ROU_SOURCEANCHOR": "1", + "ROU_TARGETANCHOR": "0", + "ROU_TO_PORT": "1", + "ROU_FROM_PORT": "2", + "ROU_EVN_UID": "", + "GAT_UID": "" + }, + { + "ROU_UID": "8808316485dfb8626c2ed28017700589", + "ROU_PARENT": "0", + "PRO_UID": "3865635965dfb8d7a152330088145190", + "TAS_UID": "5978729975dfb8d7a264fa0070639752", + "ROU_NEXT_TASK": "-1", + "ROU_CASE": "1", + "ROU_TYPE": "SEQUENTIAL", + "ROU_DEFAULT": "0", + "ROU_CONDITION": "", + "ROU_TO_LAST_USER": "FALSE", + "ROU_OPTIONAL": "FALSE", + "ROU_SEND_EMAIL": "TRUE", + "ROU_SOURCEANCHOR": "1", + "ROU_TARGETANCHOR": "0", + "ROU_TO_PORT": "1", + "ROU_FROM_PORT": "2", + "ROU_EVN_UID": "", + "GAT_UID": "" + } + ], + "lanes": [], + "gateways": [], + "inputs": [], + "outputs": [], + "dynaforms": [ + { + "DYN_UID": "1981330525dfb8626c70026010918765", + "DYN_TITLE": "dynaform1", + "DYN_DESCRIPTION": "", + "PRO_UID": "3865635965dfb8d7a152330088145190", + "DYN_TYPE": "xmlform", + "DYN_FILENAME": "3598973985dfb86269c23d6071638314\/1981330525dfb8626c70026010918765", + "DYN_CONTENT": "{\"name\":\"dynaform1\",\"description\":\"\",\"items\":[{\"type\":\"form\",\"variable\":\"\",\"var_uid\":\"\",\"dataType\":\"\",\"id\":\"1981330525dfb8626c70026010918765\",\"name\":\"dynaform1\",\"description\":\"\",\"mode\":\"edit\",\"script\":\"\",\"language\":\"en\",\"externalLibs\":\"\",\"printable\":false,\"items\":[[{\"type\":\"text\",\"variable\":\"textVar001\",\"var_uid\":\"2420200535dfb8626c83d16045380736\",\"dataType\":\"string\",\"protectedValue\":false,\"id\":\"textVar001\",\"name\":\"textVar001\",\"label\":\"text_1\",\"defaultValue\":\"\",\"placeholder\":\"\",\"hint\":\"\",\"required\":false,\"requiredFieldErrorMessage\":\"\",\"textTransform\":\"none\",\"validate\":\"\",\"validateMessage\":\"\",\"maxLength\":1000,\"formula\":\"\",\"mode\":\"parent\",\"operation\":\"\",\"dbConnection\":\"workflow\",\"dbConnectionLabel\":\"PM Database\",\"sql\":\"\",\"var_name\":\"textVar001\",\"colSpan\":12}]],\"variables\":[{\"var_uid\":\"2420200535dfb8626c83d16045380736\",\"prj_uid\":\"3598973985dfb86269c23d6071638314\",\"var_name\":\"textVar001\",\"var_field_type\":\"string\",\"var_field_size\":10,\"var_label\":\"string\",\"var_dbconnection\":\"workflow\",\"var_dbconnection_label\":\"PM Database\",\"var_sql\":\"\",\"var_null\":0,\"var_default\":\"\",\"var_accepted_values\":\"[]\",\"inp_doc_uid\":\"\"}]}]}", + "DYN_LABEL": "", + "DYN_VERSION": "2", + "DYN_UPDATE_DATE": "2019-12-19 14:02:48" + } + ], + "steps": [ + { + "STEP_UID": "1497588005dfb8626c75079092586998", + "PRO_UID": "3865635965dfb8d7a152330088145190", + "TAS_UID": "9865926225dfb8d7a1fc385009206952", + "STEP_TYPE_OBJ": "DYNAFORM", + "STEP_UID_OBJ": "1981330525dfb8626c70026010918765", + "STEP_CONDITION": "", + "STEP_POSITION": "1", + "STEP_MODE": "EDIT" + }, + { + "STEP_UID": "1500595075dfb8626c761f9080007968", + "PRO_UID": "3865635965dfb8d7a152330088145190", + "TAS_UID": "7916511005dfb8d7a234286082436886", + "STEP_TYPE_OBJ": "DYNAFORM", + "STEP_UID_OBJ": "1981330525dfb8626c70026010918765", + "STEP_CONDITION": "", + "STEP_POSITION": "1", + "STEP_MODE": "EDIT" + }, + { + "STEP_UID": "2804442295dfb8626c78449036895613", + "PRO_UID": "3865635965dfb8d7a152330088145190", + "TAS_UID": "wee-532835dfb8d7a2d0a29054950929", + "STEP_TYPE_OBJ": "DYNAFORM", + "STEP_UID_OBJ": "1981330525dfb8626c70026010918765", + "STEP_CONDITION": "", + "STEP_POSITION": "1", + "STEP_MODE": "EDIT" + }, + { + "STEP_UID": "3986576985dfb8626c721d3097828590", + "PRO_UID": "3865635965dfb8d7a152330088145190", + "TAS_UID": "3454769755dfb8d7a1cadc9088436060", + "STEP_TYPE_OBJ": "DYNAFORM", + "STEP_UID_OBJ": "1981330525dfb8626c70026010918765", + "STEP_CONDITION": "", + "STEP_POSITION": "1", + "STEP_MODE": "EDIT" + }, + { + "STEP_UID": "4754027025dfb8626c73c99090309776", + "PRO_UID": "3865635965dfb8d7a152330088145190", + "TAS_UID": "3458788095dfb8d7a18fa33047794245", + "STEP_TYPE_OBJ": "DYNAFORM", + "STEP_UID_OBJ": "1981330525dfb8626c70026010918765", + "STEP_CONDITION": "", + "STEP_POSITION": "1", + "STEP_MODE": "EDIT" + }, + { + "STEP_UID": "8110336185dfb8626ce6121078206082", + "PRO_UID": "3865635965dfb8d7a152330088145190", + "TAS_UID": "wee-532835dfb8d7a2d0a29054950929", + "STEP_TYPE_OBJ": "DYNAFORM", + "STEP_UID_OBJ": "1981330525dfb8626c70026010918765", + "STEP_CONDITION": "", + "STEP_POSITION": "1", + "STEP_MODE": "EDIT" + }, + { + "STEP_UID": "9520990735dfb8626c77338089242336", + "PRO_UID": "3865635965dfb8d7a152330088145190", + "TAS_UID": "5978729975dfb8d7a264fa0070639752", + "STEP_TYPE_OBJ": "DYNAFORM", + "STEP_UID_OBJ": "1981330525dfb8626c70026010918765", + "STEP_CONDITION": "", + "STEP_POSITION": "1", + "STEP_MODE": "EDIT" + } + ], + "triggers": [], + "taskusers": [], + "groupwfs": [], + "steptriggers": [], + "dbconnections": [], + "reportTables": [], + "reportTablesVars": [], + "stepSupervisor": [ + { + "STEP_UID": "2322645545dfb8626c79580010259901", + "PRO_UID": "3865635965dfb8d7a152330088145190", + "STEP_TYPE_OBJ": "DYNAFORM", + "STEP_UID_OBJ": "1981330525dfb8626c70026010918765", + "STEP_POSITION": "1" + } + ], + "dynaformFiles": { + "1981330525dfb8626c70026010918765": "test" + }, + "gridFiles": { + "1981330525dfb8626c70026010918765": "test" + }, + "objectPermissions": [{ + "PRO_UID": "3865635965dfb8d7a152330088145190", + "OP_OBJ_UID": "1981330525dfb8626c70026010918765", + "OP_OBJ_TYPE": "DYNAFORM" + } + ], + "subProcess": [], + "caseTracker": [ + { + "PRO_UID": "3865635965dfb8d7a152330088145190", + "CT_MAP_TYPE": "PROCESSMAP", + "CT_DERIVATION_HISTORY": "1", + "CT_MESSAGE_HISTORY": "1" + } + ], + "caseTrackerObject": [ + { + "CTO_UID": "9681402035dfb8626c7a720057282635", + "PRO_UID": "3865635965dfb8d7a152330088145190", + "CTO_TYPE_OBJ": "DYNAFORM", + "CTO_UID_OBJ": "1981330525dfb8626c70026010918765", + "CTO_CONDITION": "", + "CTO_POSITION": "1" + } + ], + "stage": [], + "fieldCondition": [ + { + "FCD_DYN_UID": "1981330525dfb8626c70026010918765" + } + ], + "event": [], + "caseScheduler": [], + "processCategory": [], + "taskExtraProperties": [], + "processUser": [], + "processVariables": [ + { + "VAR_UID": "2420200535dfb8626c83d16045380736", + "PRJ_UID": "3865635965dfb8d7a152330088145190", + "VAR_NAME": "textVar001", + "VAR_FIELD_TYPE": "string", + "VAR_FIELD_SIZE": "10", + "VAR_LABEL": "string", + "VAR_DBCONNECTION": "workflow", + "VAR_SQL": "", + "VAR_NULL": "0", + "VAR_DEFAULT": "", + "VAR_ACCEPTED_VALUES": "[]", + "INP_DOC_UID": "" + } + ], + "webEntry": [ + { + "DYN_UID": "1981330525dfb8626c70026010918765" + } + ], + "webEntryEvent": [ + { + "WEE_UID": "7839596635dfb8626d46f82082790649", + "PRJ_UID": "3598973985dfb86269c23d6071638314", + "EVN_UID": "8868532835dfb8d7a2d0a29054950929", + "ACT_UID": "3458788095dfb8d7a18fa33047794245", + "DYN_UID": "1981330525dfb8626c70026010918765", + "USR_UID": "00000000000000000000000000000002", + "WEE_TITLE": "1833424275dfb847c912110048244199", + "WEE_DESCRIPTION": "", + "WEE_STATUS": "ENABLED", + "WEE_WE_UID": "9067551515dfb8626d0f040095365609", + "WEE_WE_TAS_UID": "wee-873125dfb8626b28bf4015522377", + "WEE_WE_URL": "1833424275dfb847c912110048244199.php", + "WE_CUSTOM_TITLE": "", + "WE_TYPE": "SINGLE", + "WE_AUTHENTICATION": "ANONYMOUS", + "WE_HIDE_INFORMATION_BAR": "1", + "WE_CALLBACK": "PROCESSMAKER", + "WE_CALLBACK_URL": "", + "WE_LINK_GENERATION": "DEFAULT", + "WE_LINK_SKIN": "classic", + "WE_LINK_LANGUAGE": "en", + "WE_LINK_DOMAIN": "", + "TAS_UID": "wee-873125dfb8626b28bf4015522377", + "WE_SHOW_IN_NEW_CASE": "0", + "EVN_UID_OLD": "8469873125dfb8626b28bf4015522377" + } + ], + "messageType": [], + "messageTypeVariable": [], + "messageEventDefinition": [], + "scriptTask": [], + "timerEvent": [], + "emailEvent": [], + "filesManager": [ + { + "PRF_UID": "2320529945dfb8626e07327095962435", + "PRO_UID": "3865635965dfb8d7a152330088145190", + "USR_UID": "00000000000000000000000000000001", + "PRF_UPDATE_USR_UID": "", + "PRF_PATH": "\/var\/www\/shared\/sites\/workflow\/public\/3598973985dfb86269c23d6071638314\/1833424275dfb847c912110048244199.php", + "PRF_TYPE": "file", + "PRF_EDITABLE": "0", + "PRF_CREATE_DATE": "2019-12-19 14:16:06", + "PRF_UPDATE_DATE": "" + }, + { + "PRF_UID": "3478830955dfb84d9e1d771040119182", + "PRO_UID": "3865635965dfb8d7a152330088145190", + "USR_UID": "00000000000000000000000000000001", + "PRF_UPDATE_USR_UID": "", + "PRF_PATH": "\/var\/www\/shared\/sites\/workflow\/mailTemplates\/3598973985dfb86269c23d6071638314\/actionsByEmailErrorReply.html", + "PRF_TYPE": "file", + "PRF_EDITABLE": "1", + "PRF_CREATE_DATE": "2019-12-19 14:10:33", + "PRF_UPDATE_DATE": "" + }, + { + "PRF_UID": "5200351355dfb84d9e18946005177341", + "PRO_UID": "3865635965dfb8d7a152330088145190", + "USR_UID": "00000000000000000000000000000001", + "PRF_UPDATE_USR_UID": "", + "PRF_PATH": "\/var\/www\/shared\/sites\/workflow\/mailTemplates\/3598973985dfb86269c23d6071638314\/actionsByEmail.html", + "PRF_TYPE": "file", + "PRF_EDITABLE": "1", + "PRF_CREATE_DATE": "2019-12-19 14:10:33", + "PRF_UPDATE_DATE": "" + }, + { + "PRF_UID": "6235128035dfb8626dffd94027574889", + "PRO_UID": "3865635965dfb8d7a152330088145190", + "USR_UID": "00000000000000000000000000000001", + "PRF_UPDATE_USR_UID": "", + "PRF_PATH": "\/var\/www\/shared\/sites\/workflow\/public\/3598973985dfb86269c23d6071638314\/1833424275dfb847c912110048244199Info.php", + "PRF_TYPE": "file", + "PRF_EDITABLE": "0", + "PRF_CREATE_DATE": "2019-12-19 14:16:06", + "PRF_UPDATE_DATE": "" + }, + { + "PRF_UID": "6966516255dfb8626dfbd42099136357", + "PRO_UID": "3865635965dfb8d7a152330088145190", + "USR_UID": "00000000000000000000000000000001", + "PRF_UPDATE_USR_UID": "", + "PRF_PATH": "\/var\/www\/shared\/sites\/workflow\/public\/3598973985dfb86269c23d6071638314\/1833424275dfb847c912110048244199Post.php", + "PRF_TYPE": "file", + "PRF_EDITABLE": "0", + "PRF_CREATE_DATE": "2019-12-19 14:16:06", + "PRF_UPDATE_DATE": "" + }, + { + "PRF_UID": "7327359135dfb8626e03770066162194", + "PRO_UID": "3865635965dfb8d7a152330088145190", + "USR_UID": "00000000000000000000000000000001", + "PRF_UPDATE_USR_UID": "", + "PRF_PATH": "\/var\/www\/shared\/sites\/workflow\/public\/3598973985dfb86269c23d6071638314\/wsClient.php", + "PRF_TYPE": "file", + "PRF_EDITABLE": "0", + "PRF_CREATE_DATE": "2019-12-19 14:16:06", + "PRF_UPDATE_DATE": "" + } + ], + "abeConfiguration": [ + { + "ABE_UID": "4306137575dfb8626d54c87075844725", + "PRO_UID": "3865635965dfb8d7a152330088145190", + "TAS_UID": "3454769755dfb8d7a1cadc9088436060", + "ABE_TYPE": "LINK", + "ABE_TEMPLATE": "actionsByEmailErrorReply.html", + "ABE_DYN_TYPE": "NORMAL", + "DYN_UID": "1981330525dfb8626c70026010918765", + "ABE_EMAIL_FIELD": "", + "ABE_ACTION_FIELD": "", + "ABE_ACTION_BODY_FIELD": "", + "ABE_CASE_NOTE_IN_RESPONSE": "0", + "ABE_FORCE_LOGIN": "0", + "ABE_CREATE_DATE": "2019-12-19 14:16:06", + "ABE_UPDATE_DATE": "2019-12-19 14:16:06", + "ABE_SUBJECT_FIELD": "", + "ABE_MAILSERVER_OR_MAILCURRENT": "0", + "ABE_CUSTOM_GRID": "b:0;", + "ABE_EMAIL_SERVER_UID": "", + "ABE_EMAIL_SERVER_RECEIVER_UID": "", + "TAS_UID_OLD": "7400740655dfb86269feaa1089812754" + }, + { + "ABE_UID": "5375484805dfb8626d58030072013572", + "PRO_UID": "3865635965dfb8d7a152330088145190", + "TAS_UID": "9865926225dfb8d7a1fc385009206952", + "ABE_TYPE": "LINK", + "ABE_TEMPLATE": "actionsByEmailErrorReply.html", + "ABE_DYN_TYPE": "NORMAL", + "DYN_UID": "1981330525dfb8626c70026010918765", + "ABE_EMAIL_FIELD": "test", + "ABE_ACTION_FIELD": "", + "ABE_ACTION_BODY_FIELD": "", + "ABE_CASE_NOTE_IN_RESPONSE": "0", + "ABE_FORCE_LOGIN": "0", + "ABE_CREATE_DATE": "2019-12-19 14:16:06", + "ABE_UPDATE_DATE": "2019-12-19 14:16:06", + "ABE_SUBJECT_FIELD": "test", + "ABE_MAILSERVER_OR_MAILCURRENT": "0", + "ABE_CUSTOM_GRID": "b:0;", + "ABE_EMAIL_SERVER_UID": "", + "ABE_EMAIL_SERVER_RECEIVER_UID": "", + "TAS_UID_OLD": "8420128765dfb8626acccb8059629296" + } + ], + "elementTask": [], + "uid": { + "PROCESS": { + "7084112395dfb826264eac2069406712": "3865635965dfb8d7a152330088145190" + }, + "TASK": { + "5730239675dfb8626a65a28038679991": "5978729975dfb8d7a264fa0070639752", + "6279149375dfb8626a95495099553981": "3458788095dfb8d7a18fa33047794245", + "3347609685dfb8626a35d06089327263": "7916511005dfb8d7a234286082436886", + "8420128765dfb8626acccb8059629296": "9865926225dfb8d7a1fc385009206952", + "7400740655dfb86269feaa1089812754": "3454769755dfb8d7a1cadc9088436060", + "wee-873125dfb8626b28bf4015522377": "wee-532835dfb8d7a2d0a29054950929" + } + } +} diff --git a/tests/unit/workflow/engine/classes/ProcessesTest.php b/tests/unit/workflow/engine/classes/ProcessesTest.php index 5abf4eb07..efd542075 100644 --- a/tests/unit/workflow/engine/classes/ProcessesTest.php +++ b/tests/unit/workflow/engine/classes/ProcessesTest.php @@ -13,6 +13,7 @@ use Tests\TestCase; class ProcessesTest extends TestCase { + private $processes; /** * Constructor of the class. @@ -33,6 +34,7 @@ class ProcessesTest extends TestCase protected function setUp() { parent::setUp(); + $this->processes = new Processes(); } /** @@ -154,7 +156,7 @@ class ProcessesTest extends TestCase * This checks fi the returned output documents are correct with the differect * parameters. * @test - * @covers Processes::getOutputRows() + * @covers \Processes::getOutputRows() */ public function it_should_return_output_documents() { @@ -205,7 +207,7 @@ class ProcessesTest extends TestCase /** * This checks if the dynaforms structure is saved with the different parameters. * @test - * @covers Processes::createDynaformRows() + * @covers \Processes::createDynaformRows() */ public function it_sholud_create_dynaform() { @@ -269,7 +271,7 @@ class ProcessesTest extends TestCase * This checks if the input documents structure is saved with the different * parameters. * @test - * @covers Processes::createInputRows() + * @covers \Processes::createInputRows() */ public function it_should_create_input_document() { @@ -339,7 +341,7 @@ class ProcessesTest extends TestCase * This checks if the output documents structure is saved with the different * parameters. * @test - * @covers Processes::createOutputRows() + * @covers \Processes::createOutputRows() */ public function it_should_create_output_document() { @@ -432,7 +434,7 @@ class ProcessesTest extends TestCase /** * This gets the data structure of a project. * @test - * @covers Processes::getWorkflowData() + * @covers \Processes::getWorkflowData() */ public function it_should_get_workflow_data() { @@ -459,4 +461,40 @@ class ProcessesTest extends TestCase $result = $processes->getWorkflowData($process->PRO_UID); $this->assertNotNull($result); } + + /** + * This test guarantees the replacement of new identifiers. + * @test + * @covers \Processes::renewAllDynaformGuid() + */ + public function it_should_renew_all_dynaform_guid() + { + $pathData = PATH_TRUNK . "/tests/resources/dynaformDataForRenewUids.json"; + $data = file_get_contents($pathData); + $result = json_decode($data, JSON_OBJECT_AS_ARRAY); + $result = (object) $result; + $this->processes->renewAllDynaformGuid($result); + foreach ($result as $key => $value) { + $this->assertObjectHasAttribute($key, $result); + } + + //without PRO_DYNAFORMS + $result = json_decode($data, JSON_OBJECT_AS_ARRAY); + $result = (object) $result; + unset($result->process['PRO_DYNAFORMS']); + $this->processes->renewAllDynaformGuid($result); + foreach ($result as $key => $value) { + $this->assertObjectHasAttribute($key, $result); + } + + //for process inside PRO_DYNAFORMS + $result = json_decode($data, JSON_OBJECT_AS_ARRAY); + $result = (object) $result; + $result->process['PRO_DYNAFORMS'] = []; + $result->process['PRO_DYNAFORMS']['PROCESS'] = $result->dynaforms[0]['DYN_UID']; + $this->processes->renewAllDynaformGuid($result); + foreach ($result as $key => $value) { + $this->assertObjectHasAttribute($key, $result); + } + } } diff --git a/tests/unit/workflow/engine/src/ProcessMaker/Project/WorkflowTest.php b/tests/unit/workflow/engine/src/ProcessMaker/Project/WorkflowTest.php new file mode 100644 index 000000000..ff0e0fd68 --- /dev/null +++ b/tests/unit/workflow/engine/src/ProcessMaker/Project/WorkflowTest.php @@ -0,0 +1,118 @@ +workflow = new Workflow(); + $this->directories = []; + $this->files = []; + $this->faker = Factory::create(); + } + + /** + * This method is executed after each test. + */ + public function tearDown() + { + parent::tearDown(); + foreach ($this->files as $value) { + unlink($value); + } + foreach ($this->directories as $value) { + rmdir($value); + } + } + + /** + * This test ensures that the getData method returns the correct data. + * @test + * @covers \ProcessMaker\Project\Workflow::getData() + */ + public function it_should_return_the_data_when_the_project_id_is_valid() + { + $process = factory(Process::class)->create(); + $dynaforms = factory(Dynaform::class, 5)->create([ + 'PRO_UID' => $process->PRO_UID + ]); + factory(WebEntry::class, 5)->create([ + 'PRO_UID' => $process->PRO_UID + ]); + + $directory = PATH_DYNAFORM . $process->PRO_UID . "/"; + $this->directories[] = $directory; + mkdir($directory); + foreach ($dynaforms as $dynaform) { + Dynaform::where('PRO_UID', $process->PRO_UID) + ->where('DYN_UID', $dynaform->DYN_UID) + ->update(['DYN_FILENAME' => $process->PRO_UID . '/' . $dynaform->DYN_UID]); + + $dynUid = $dynaform->DYN_UID; + $data = ''; + $filename = $directory . $dynUid . ".xml"; + $this->files[] = $filename; + file_put_contents($filename, $data); + + $filename = $directory . $dynUid . ".html"; + $this->files[] = $filename; + file_put_contents($filename, $data); + } + + //template + $directory = PATH_DATA_MAILTEMPLATES . $process->PRO_UID; + $this->directories[] = $directory; + mkdir($directory); + + $filename = $directory . "/test.html"; + $this->files[] = $filename; + file_put_contents($filename, ''); + + //public files + $directory = PATH_DATA_PUBLIC . $process->PRO_UID; + $this->directories[] = $directory; + mkdir($directory); + + $filename = $directory . "/wsClient.php"; + $this->files[] = $filename; + file_put_contents($filename, ''); + + $actual = $this->workflow->getData($process->PRO_UID); + + $this->assertCount(2, $actual); + $this->assertArrayHasKey('process', $actual[0]); + $this->assertArrayHasKey('DYNAFORMS', $actual[1]); + } + + /** + * This test should throw an exception when the parameter is not correct. + * @test + * @covers \ProcessMaker\Project\Workflow::getData() + */ + public function it_should_throw_exception_when_get_data_is_failed() + { + $proUid = $this->faker->regexify("/[a-zA-Z]{32}/"); + + $this->expectException(Exception::class); + $actual = $this->workflow->getData($proUid); + } +} diff --git a/workflow/engine/classes/Processes.php b/workflow/engine/classes/Processes.php index 8c7eb52f8..1c928ed61 100644 --- a/workflow/engine/classes/Processes.php +++ b/workflow/engine/classes/Processes.php @@ -1017,6 +1017,9 @@ class Processes $map[$val['DYN_UID']] = $newGuid; $oData->dynaforms[$key]['DYN_UID'] = $newGuid; unset($oData->dynaforms[$key]['DYN_ID']); + + //this is important when UID's is updated + $oData->dynaforms[$key]['DYN_FILENAME'] = $oData->dynaforms[$key]['PRO_UID'] . "/" . $oData->dynaforms[$key]['DYN_UID']; } $oData->uid["DYNAFORM"] = $map; diff --git a/workflow/engine/methods/processes/processes_Import_Ajax.php b/workflow/engine/methods/processes/processes_Import_Ajax.php index f2acde6ed..fbb5832fe 100644 --- a/workflow/engine/methods/processes/processes_Import_Ajax.php +++ b/workflow/engine/methods/processes/processes_Import_Ajax.php @@ -268,44 +268,45 @@ if (isset($_POST["PRO_FILENAME"]) && try { /*----------------------------------********---------------------------------*/ $objectsToImport = ''; - // only uploadFileNewProcessExist - if (version_compare($data['version'], '3.0', '>') && isset($_POST['objectsToImport']) && $_POST['objectsToImport'] === '' && $_POST['IMPORT_OPTION']==="1") { - $objectImport = (isset($data['objects'])) ? explode('|', $data['objects']) : ""; - $ids = new \ProcessMaker\BusinessModel\Migrator\ExportObjects(); - $objectImport = $ids->getIdObjectList($objectImport); - $granularImport = true; - $result = array( - "success" => true, - "catchMessage" => '', - "ExistProcessInDatabase" => 0, - "ExistGroupsInDatabase" => 0, - "notExistProcessInDatabase" => 0, - "affectedGroups" => '', - "sNewProUid" => '', - "project_type" => 'bpmn', - "isGranularImport" => $granularImport, - "objectGranularImport" => $objectImport, - "project_type_aux" => '' - ); - echo G::json_encode($result); - exit(0); - } + if (version_compare($data['version'], '3.0', '>')) { + $dataObject = (isset($data['objects'])) ? explode('|', $data['objects']) : ""; + $exportObjects = new \ProcessMaker\BusinessModel\Migrator\ExportObjects(); + $idObjectList = $exportObjects->getIdObjectList($dataObject); + + // only uploadFileNewProcessExist + if (isset($_POST['objectsToImport']) && $_POST['objectsToImport'] === '' && $_POST['IMPORT_OPTION'] === "1") { + $granularImport = true; + $result = [ + "success" => true, + "catchMessage" => '', + "ExistProcessInDatabase" => 0, + "ExistGroupsInDatabase" => 0, + "notExistProcessInDatabase" => 0, + "affectedGroups" => '', + "sNewProUid" => '', + "project_type" => 'bpmn', + "isGranularImport" => $granularImport, + "objectGranularImport" => $idObjectList, + "project_type_aux" => '' + ]; + echo G::json_encode($result); + exit(0); + } + + $actionImport = "merge"; + if ($_POST['IMPORT_OPTION'] === "3") { + $actionImport = "replace"; + } - if ((version_compare($data['version'], '3.0', - '>') && $_POST['IMPORT_OPTION'] === "3") || empty($_POST['objectsToImport'])) { $objectsToImport = []; - $objects = (isset($data['objects'])) ? explode('|', $data['objects']) : ""; - $ids = new \ProcessMaker\BusinessModel\Migrator\ExportObjects(); - $objects = $ids->getIdObjectList($objects); - foreach ($objects as $object) { - $objectsToImport[] = (object)array('id' => $object, 'action' => 'replace'); + foreach ($idObjectList as $object) { + $objectsToImport[] = (object) ['id' => $object, 'action' => $actionImport]; + } + + if (isset($_POST['objectsToImport']) && !empty(G::json_decode($_POST['objectsToImport']))) { + $objectsToImport = G::json_decode($_POST['objectsToImport']); } } - - if (isset($_POST['objectsToImport']) && !empty(G::json_decode($_POST['objectsToImport']))) { - $objectsToImport = G::json_decode($_POST['objectsToImport']); - } - /*----------------------------------********---------------------------------*/ $prjUid = $importer->import($option, $optionGroup, false, $objectsToImport); diff --git a/workflow/engine/src/ProcessMaker/Project/Workflow.php b/workflow/engine/src/ProcessMaker/Project/Workflow.php index 26775a4ad..57bd927a7 100644 --- a/workflow/engine/src/ProcessMaker/Project/Workflow.php +++ b/workflow/engine/src/ProcessMaker/Project/Workflow.php @@ -1169,12 +1169,13 @@ class Workflow extends Handler //Getting DynaForms foreach ($workflowData["dynaforms"] as $dynaform) { - $dynFile = PATH_DYNAFORM . $dynaform["DYN_FILENAME"] . ".xml"; + $dynFile = PATH_DYNAFORM . $dynaform["PRO_UID"] . "/" . $dynaform["DYN_UID"] . ".xml"; + $content = file_exists($dynFile) ? file_get_contents($dynFile) : ''; $workflowFile["DYNAFORMS"][] = array( "filename" => $dynaform["DYN_TITLE"], "filepath" => $dynaform["DYN_FILENAME"] . ".xml", - "file_content" => file_get_contents($dynFile) + "file_content" => $content ); $htmlFile = PATH_DYNAFORM . $dynaform["DYN_FILENAME"] . ".html"; From b9304dc001044000f3eadfc871f5e9e848c1d158 Mon Sep 17 00:00:00 2001 From: Paula Quispe Date: Thu, 2 Jan 2020 15:52:31 -0400 Subject: [PATCH 12/12] PMC-1540 --- rbac/engine/data/mysql/insert.sql | 2 +- workflow/engine/data/mysql/insert.sql | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/rbac/engine/data/mysql/insert.sql b/rbac/engine/data/mysql/insert.sql index 874e3eae8..8bc913275 100644 --- a/rbac/engine/data/mysql/insert.sql +++ b/rbac/engine/data/mysql/insert.sql @@ -225,7 +225,7 @@ INSERT INTO `RBAC_SYSTEMS` VALUES ('00000000000000000000000000000002','PROCESSMAKER','2007-07-31 19:10:22','2007-08-03 12:24:36',1); INSERT INTO `RBAC_USERS` VALUES -('00000000000000000000000000000001','admin','21232f297a57a5a743894a0e4a801fc3','Administrator','','admin@processmaker.com','2020-01-01','2007-08-03 12:24:36','2008-02-13 07:24:07',1,'MYSQL','00000000000000000000000000000000','',''), +('00000000000000000000000000000001','admin','21232f297a57a5a743894a0e4a801fc3','Administrator','','admin@processmaker.com',DATE_ADD(curdate(), INTERVAL 1 YEAR),'2007-08-03 12:24:36','2008-02-13 07:24:07',1,'MYSQL','00000000000000000000000000000000','',''), ('00000000000000000000000000000002','guest','$2y$10$rasFC.VNv9TLStNtFVJu6OjxhCi6FezdwkLrBzTFwmXsNnfW0/YZm','Guest','','guest@processmaker.com','2030-01-01','2009-02-01 12:24:36','2009-02-01 12:24:36',0,'MYSQL','00000000000000000000000000000000','',''); INSERT INTO `RBAC_USERS_ROLES` VALUES diff --git a/workflow/engine/data/mysql/insert.sql b/workflow/engine/data/mysql/insert.sql index 3da7580e6..eb63d6146 100644 --- a/workflow/engine/data/mysql/insert.sql +++ b/workflow/engine/data/mysql/insert.sql @@ -1,5 +1,5 @@ INSERT INTO USERS (USR_UID,USR_USERNAME,USR_PASSWORD,USR_FIRSTNAME,USR_LASTNAME,USR_EMAIL,USR_DUE_DATE,USR_CREATE_DATE,USR_UPDATE_DATE,USR_STATUS,USR_COUNTRY,USR_CITY,USR_LOCATION,USR_ADDRESS,USR_PHONE,USR_FAX,USR_CELLULAR,USR_ZIP_CODE,DEP_UID,USR_POSITION,USR_RESUME,USR_BIRTHDAY,USR_ROLE,USR_REPORTS_TO,USR_REPLACED_BY ) VALUES -('00000000000000000000000000000001','admin','21232f297a57a5a743894a0e4a801fc3','Administrator',' ', 'admin@processmaker.com','2020-01-01','1999-11-30 00:00:00','2008-05-23 18:36:19','ACTIVE', 'US','FL','MMK','','', '1-305-402-0282','1-305-675-1400','','','Administrator', '','1999-02-25','PROCESSMAKER_ADMIN','',''), +('00000000000000000000000000000001','admin','21232f297a57a5a743894a0e4a801fc3','Administrator',' ','admin@processmaker.com',DATE_ADD(curdate(), INTERVAL 1 YEAR),'1999-11-30 00:00:00','2008-05-23 18:36:19','ACTIVE', 'US','FL','MMK','','', '1-305-402-0282','1-305-675-1400','','','Administrator', '','1999-02-25','PROCESSMAKER_ADMIN','',''), ('00000000000000000000000000000002','guest','674ba9750749d735ec9787d606170d78','Guest',' ', 'guest@processmaker.com','2030-01-01','2009-02-01 12:24:36','2009-02-01 12:24:36','INACTIVE', 'US','FL','MMK','','', '1-305-402-0282','1-305-675-1400','','','Guest', '','2009-02-01','PROCESSMAKER_GUEST','',''); INSERT INTO CONTENT (CON_CATEGORY,CON_PARENT,CON_ID,CON_LANG,CON_VALUE) VALUES