@@ -608,7 +608,7 @@ class LdapAdvanced
|
||||
if (empty($message)) {
|
||||
$message = G::LoadTranslation('ID_LDAP_ERROR_CONNECTION');
|
||||
}
|
||||
Cache::put('ldapMessageError', $message, 2);
|
||||
Cache::put('ldapMessageError', $message, 120); //laravel 8.x the time parameter is in seconds.
|
||||
$this->log($linkIdentifier, $messageError);
|
||||
}
|
||||
|
||||
@@ -1588,7 +1588,7 @@ class LdapAdvanced
|
||||
|
||||
if ($error = ldap_errno($ldapcnn)) {
|
||||
$messageError = ldap_err2str($error);
|
||||
Cache::put('ldapMessageError', $messageError, 2);
|
||||
Cache::put('ldapMessageError', $messageError, 120); //laravel 8.x the time parameter is in seconds.
|
||||
//
|
||||
} else {
|
||||
if ($searchResult) {
|
||||
|
||||
@@ -1,4 +1,6 @@
|
||||
<?php
|
||||
|
||||
use ProcessMaker\PHPReflectionClass\ClassStructure;
|
||||
use ProcessMaker\Plugins\PluginRegistry;
|
||||
|
||||
class TriggerLibrary
|
||||
@@ -105,14 +107,13 @@ class TriggerLibrary
|
||||
* getMethodsFromLibraryFile
|
||||
*
|
||||
* @param string $file
|
||||
* @return object(PHPClass) $parsedLibrary
|
||||
* @return ClassStructure $parsedLibrary
|
||||
*/
|
||||
public function getMethodsFromLibraryFile($file)
|
||||
{
|
||||
// parse class comments from file
|
||||
$parsedLibrary = new PHPClass();
|
||||
$parsedLibrary = new ClassStructure();
|
||||
$success = $parsedLibrary->parseFromFile($file);
|
||||
|
||||
return $parsedLibrary;
|
||||
}
|
||||
|
||||
|
||||
@@ -1635,14 +1635,16 @@ function newFolder()
|
||||
$formNewFolder["items"]= array();
|
||||
|
||||
$field=array();
|
||||
$field["xtype"]= "label";
|
||||
$field["xtype"]= "textfield";
|
||||
$field["fieldLabel"]= G::LoadTranslation('ID_CREATE_FOLDER_PATH_FOLDER');
|
||||
$field["name"]= "form[FOLDER_PATH]";
|
||||
$field["id"]= "form[FOLDER_PATH]";
|
||||
$field["name"]= "FOLDER_PATH";
|
||||
$field["id"]= "FOLDER_PATH";
|
||||
$field["width"]=175;
|
||||
$field["allowBlank"]=false;
|
||||
$field["value"]=$folderPath;
|
||||
$field["text"]=$folderPath;
|
||||
$field["readOnly"]= true;
|
||||
$field["style"] = "{'border': 'none'}";
|
||||
$formNewFolder["items"][]= $field;
|
||||
|
||||
$field=array();
|
||||
|
||||
@@ -374,6 +374,7 @@ function getReassignList()
|
||||
$caseReaderFields[] = ['name' => 'APP_NUMBER'];
|
||||
$caseReaderFields[] = ['name' => 'APP_TITLE'];
|
||||
$caseReaderFields[] = ['name' => 'APP_UID'];
|
||||
$caseReaderFields[] = ['name' => 'DEL_INDEX'];
|
||||
$caseReaderFields[] = ['name' => 'USR_UID'];
|
||||
$caseReaderFields[] = ['name' => 'APP_TAS_TITLE'];
|
||||
$caseReaderFields[] = ['name' => 'APP_PRO_TITLE'];
|
||||
|
||||
@@ -56,7 +56,7 @@ if (isset($_GET['ux'])) {
|
||||
}';
|
||||
} else {
|
||||
/*----------------------------------********---------------------------------*/
|
||||
echo '} else { window.parent.location.href = \'casesListExtJs\'; }';
|
||||
echo '} else { parent.parent.postMessage("redirect=todo","*"); }';
|
||||
/*----------------------------------********---------------------------------*/
|
||||
}
|
||||
/*----------------------------------********---------------------------------*/
|
||||
|
||||
@@ -26,7 +26,7 @@ if (empty($dataPost)) {
|
||||
foreach ($dataPost as $data) {
|
||||
// It was supposed will return only one thread related to the task
|
||||
// todo: implement the reassign case for multi instance task
|
||||
$openThreads = Delegation::getOpenThreads($data->APP_NUMBER, $data->TAS_UID);
|
||||
$openThreads = Delegation::getOpenThread($data->APP_NUMBER, $data->DEL_INDEX);
|
||||
if (!empty($openThreads)) {
|
||||
// Get the user information assigned in the index
|
||||
$currentUsrUid = Delegation::getCurrentUser($openThreads['APP_NUMBER'], $openThreads['DEL_INDEX']);
|
||||
|
||||
@@ -20,7 +20,7 @@ try {
|
||||
$googleClient = $gmailOAuth->getGoogleClient();
|
||||
$result = $googleClient->authenticate($_GET['code']);
|
||||
if (isset($result["error"])) {
|
||||
Cache::put('errorMessageIfNotAuthenticate', G::json_decode($result["error"]), 2);
|
||||
Cache::put('errorMessageIfNotAuthenticate', G::json_decode($result["error"]), 120); //laravel 8.x the time parameter is in seconds.
|
||||
G::header($header);
|
||||
return;
|
||||
}
|
||||
@@ -34,7 +34,7 @@ try {
|
||||
* value in minutes for each session. We use 2 minutes, enough time to retrieve
|
||||
* the error message if there is one.
|
||||
*/
|
||||
Cache::put('errorMessageIfNotAuthenticate', $e->getMessage(), 2);
|
||||
Cache::put('errorMessageIfNotAuthenticate', $e->getMessage(), 120); //laravel 8.x the time parameter is in seconds.
|
||||
}
|
||||
|
||||
G::header($header);
|
||||
|
||||
@@ -34,7 +34,7 @@ try {
|
||||
* value in minutes for each session. We use 2 minutes, enough time to retrieve
|
||||
* the error message if there is one.
|
||||
*/
|
||||
Cache::put('errorMessageIfNotAuthenticate', $e->getMessage(), 2);
|
||||
Cache::put('errorMessageIfNotAuthenticate', $e->getMessage(), 120); //laravel 8.x the time parameter is in seconds.
|
||||
}
|
||||
|
||||
G::header($header);
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
<?php
|
||||
|
||||
use Illuminate\Support\Facades\Cache;
|
||||
use Illuminate\Support\Facades\Crypt;
|
||||
use ProcessMaker\BusinessModel\User;
|
||||
use ProcessMaker\Core\System;
|
||||
use ProcessMaker\Plugins\PluginRegistry;
|
||||
@@ -52,7 +53,7 @@ try {
|
||||
$enterprise->setup();
|
||||
}
|
||||
/*----------------------------------********---------------------------------*/
|
||||
Cache::put('ldapMessageError', '', 2);
|
||||
Cache::put('ldapMessageError', '', 120); //laravel 8.x the time parameter is in seconds.
|
||||
$uid = $RBAC->VerifyLogin($usr, $pwd);
|
||||
$ldapMessageError = Cache::pull('ldapMessageError');
|
||||
$RBAC->cleanSessionFiles(72); //cleaning session files older than 72 hours
|
||||
@@ -111,7 +112,7 @@ try {
|
||||
|
||||
$_SESSION["USERNAME_PREVIOUS1"] = (isset($_SESSION["USERNAME_PREVIOUS2"]))? $_SESSION["USERNAME_PREVIOUS2"] : "";
|
||||
$_SESSION["USERNAME_PREVIOUS2"] = $usr;
|
||||
$_SESSION["FAILED_LOGINS"] = (isset($frm['FAILED_LOGINS']))? $frm['FAILED_LOGINS'] : 0;
|
||||
$_SESSION["FAILED_LOGINS"] = is_numeric(Cache::get("FAILED_LOGINS{$usr}")) ? Cache::get("FAILED_LOGINS{$usr}") : 0;
|
||||
|
||||
if (!isset($uid) || $uid < 0) {
|
||||
if ($_SESSION["USERNAME_PREVIOUS1"] != "" && $_SESSION["USERNAME_PREVIOUS2"] != "" && $_SESSION["USERNAME_PREVIOUS1"] != $_SESSION["USERNAME_PREVIOUS2"]) {
|
||||
@@ -138,6 +139,7 @@ try {
|
||||
$oStatement = $oConnection->prepareStatement("UPDATE USERS SET USR_STATUS = 'INACTIVE' WHERE USR_UID = '" . $sUserUID . "'");
|
||||
$oStatement->executeQuery();
|
||||
unset($_SESSION['FAILED_LOGINS']);
|
||||
Cache::forget("FAILED_LOGINS{$usr}");
|
||||
$errLabel = G::LoadTranslation('ID_ACCOUNT') . ' "' . $usr . '" ' . G::LoadTranslation('ID_ACCOUNT_DISABLED_CONTACT_ADMIN');
|
||||
}
|
||||
//Log failed authentications
|
||||
@@ -150,7 +152,7 @@ try {
|
||||
|
||||
if (strpos($_SERVER['HTTP_REFERER'], 'home/login') !== false) {
|
||||
$d = serialize(['u' => $usr, 'p' => $pwd, 'm' => G::LoadTranslation($errLabel)]);
|
||||
$urlLogin = $urlLogin . '?d=' . base64_encode($d);
|
||||
$urlLogin = $urlLogin . '?d=' . Crypt::encryptString($d);
|
||||
} else {
|
||||
if (empty($ldapMessageError)) {
|
||||
G::SendTemporalMessage($errLabel, "warning");
|
||||
@@ -266,6 +268,7 @@ try {
|
||||
//$_SESSION['USR_ROLENAME'] = $rol['ROL_NAME'];
|
||||
|
||||
unset($_SESSION['FAILED_LOGINS']);
|
||||
Cache::forget("FAILED_LOGINS{$usr}");
|
||||
|
||||
// Assign the uid of user to userloggedobj
|
||||
$RBAC->loadUserRolePermission($RBAC->sSystem, $uid);
|
||||
@@ -404,7 +407,7 @@ try {
|
||||
"browserTimeZoneOffset" => $_POST['form']['BROWSER_TIME_ZONE_OFFSET']
|
||||
];
|
||||
$messPassword['__USR_PASSWORD_CHANGE__'] = G::generateUniqueID();
|
||||
Cache::put($messPassword['__USR_PASSWORD_CHANGE__'], $values, 2);
|
||||
Cache::put($messPassword['__USR_PASSWORD_CHANGE__'], $values, 120); //laravel 8.x the time parameter is in seconds.
|
||||
$G_PUBLISH->AddContent('xmlform', 'xmlform', 'login/changePasswordpm3', '', $messPassword, 'sysLoginVerify');
|
||||
G::RenderPage('publish');
|
||||
session_destroy();
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
<?php
|
||||
|
||||
use Illuminate\Support\Facades\Cache;
|
||||
use ProcessMaker\Core\System;
|
||||
use ProcessMaker\Plugins\PluginRegistry;
|
||||
|
||||
@@ -246,7 +247,7 @@ if (isset($oConf->aConfig["login_defaultLanguage"]) && $oConf->aConfig["login_de
|
||||
$G_PUBLISH = new Publisher();
|
||||
$version = explode('.', trim(file_get_contents(PATH_GULLIVER . 'VERSION')));
|
||||
$version = isset($version[0]) ? intval($version[0]) : 0;
|
||||
$aFields["FAILED_LOGINS"] = $sFailedLogins;
|
||||
Cache::put("FAILED_LOGINS{$usernamePrevious2}", $sFailedLogins, 1800); //this value will be lost after 30 minutes
|
||||
if ($version >= 3) {
|
||||
$G_PUBLISH->AddContent('xmlform', 'xmlform', 'login/loginpm3', '', $aFields, SYS_URI . 'login/authentication.php');
|
||||
} else {
|
||||
|
||||
@@ -1,5 +1,7 @@
|
||||
<?php
|
||||
|
||||
use Illuminate\Support\Facades\Crypt;
|
||||
|
||||
/*----------------------------------********---------------------------------*/
|
||||
//Browser Compatibility
|
||||
$browserSupported = G::checkBrowserCompatibility();
|
||||
@@ -10,7 +12,7 @@ if ($browserSupported==false) {
|
||||
}
|
||||
/*----------------------------------********---------------------------------*/
|
||||
if (isset ($_POST['form']['USER_ENV'])) {
|
||||
$data = base64_encode(serialize($_POST));
|
||||
$data = Crypt::encryptString(serialize($_POST));
|
||||
$url = sprintf('/sys%s/%s/%s/login/sysLoginVerify?d=%s', $_POST['form']['USER_ENV'], SYS_LANG, SYS_SKIN, $data);
|
||||
G::header("location: $url");
|
||||
die();
|
||||
|
||||
@@ -1,7 +1,9 @@
|
||||
<?php
|
||||
|
||||
use Illuminate\Support\Facades\Crypt;
|
||||
|
||||
if (array_key_exists("d", $_GET)) {
|
||||
$str = base64_decode($_GET["d"]);
|
||||
$str = Crypt::decryptString($_GET["d"]);
|
||||
if (preg_match('/^a:[0-9]+:{/', $str) && !preg_match('/(^|;|{|})O:\+?[0-9]+:"/', $str)) {
|
||||
$_POST = unserialize($str);
|
||||
}
|
||||
|
||||
@@ -62,16 +62,21 @@ if (is_file( $imagen )) {
|
||||
//cpyMoreLogos($dir,$newDir);
|
||||
$newDir .= PATH_SEP . $idDecode64;
|
||||
$dir .= PATH_SEP . $idDecode64;
|
||||
copy( $dir, $newDir );
|
||||
showLogo( $newDir );
|
||||
if (file_exists($dir)) {
|
||||
copy($dir, $newDir);
|
||||
showLogo( $newDir );
|
||||
}
|
||||
die();
|
||||
|
||||
}
|
||||
|
||||
function showLogo ($imagen)
|
||||
{
|
||||
$info = @getimagesize( $imagen );
|
||||
$fp = fopen( $imagen, "rb" );
|
||||
$fp = null;
|
||||
if (file_exists($imagen)) {
|
||||
$fp = fopen($imagen, "rb");
|
||||
$info = @getimagesize($imagen);
|
||||
}
|
||||
if ($info && $fp) {
|
||||
header( "Content-type: {$info['mime']}" );
|
||||
fpassthru( $fp );
|
||||
|
||||
@@ -329,6 +329,12 @@ button.x-btn-text:focus,
|
||||
background-image: url(/skins/neoclassic/images/icons_silk/sprites.png);
|
||||
height: 18px;
|
||||
}
|
||||
#FOLDER_PATH{
|
||||
border: none;
|
||||
background-image: none;
|
||||
background-color: #f1f1f1;
|
||||
cursor: default;
|
||||
}
|
||||
.ICON_FOLDERS {
|
||||
/*.ss_folder_explore*/
|
||||
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
<link rel="shortcut icon" href="/images/favicon.ico" type="image/x-icon" />
|
||||
{$header}
|
||||
</head>
|
||||
{if ($user_logged neq '' or $tracker neq '') and $timezone_status neq 'failed'}
|
||||
{if ((isset($user_logged) && $user_logged neq '') or (isset($tracker) && $tracker neq '')) and $timezone_status neq 'failed'}
|
||||
<body>
|
||||
<table width="100%" height="100%" cellpadding="0" cellspacing="0" border="0" id="pm_main_table">
|
||||
<tr>
|
||||
|
||||
@@ -141,7 +141,6 @@ class GranularExporter
|
||||
"vendor_version_code" => "Michelangelo",
|
||||
"export_timestamp" => date("U"),
|
||||
"export_datetime" => date("Y-m-d\TH:i:sP"),
|
||||
"export_server_addr" => isset($_SERVER["SERVER_ADDR"]) ? $_SERVER["SERVER_ADDR"].":".$_SERVER["SERVER_PORT"] : "Unknown",
|
||||
"export_server_os" => PHP_OS ,
|
||||
"export_server_php_version" => PHP_VERSION_ID,
|
||||
);
|
||||
|
||||
@@ -44,7 +44,6 @@ abstract class Exporter
|
||||
"vendor_version_code" => "Michelangelo",
|
||||
"export_timestamp" => date("U"),
|
||||
"export_datetime" => date("Y-m-d\TH:i:sP"),
|
||||
"export_server_addr" => isset($_SERVER["SERVER_ADDR"]) ? $_SERVER["SERVER_ADDR"].":".$_SERVER["SERVER_PORT"] : "Unknown",
|
||||
"export_server_os" => PHP_OS ,
|
||||
"export_server_php_version" => PHP_VERSION_ID,
|
||||
);
|
||||
|
||||
@@ -1847,25 +1847,25 @@ class Delegation extends Model
|
||||
* Return the open thread related to the task
|
||||
*
|
||||
* @param int $appNumber, Case number
|
||||
* @param string $tasUid, The task uid
|
||||
* @param int $delIndex
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
public static function getOpenThreads(int $appNumber, string $tasUid)
|
||||
public static function getOpenThread(int $appNumber, int $delIndex)
|
||||
{
|
||||
$query = Delegation::query()->select();
|
||||
$query->where('DEL_THREAD_STATUS', 'OPEN');
|
||||
$query->where('DEL_FINISH_DATE', null);
|
||||
$query->where('APP_NUMBER', $appNumber);
|
||||
$query->where('TAS_UID', $tasUid);
|
||||
$query->where('DEL_INDEX', $delIndex);
|
||||
$results = $query->get();
|
||||
|
||||
$arrayOpenThreads = [];
|
||||
$results->each(function ($item, $key) use (&$arrayOpenThreads) {
|
||||
$arrayOpenThreads = $item->toArray();
|
||||
$arrayOpenThread = [];
|
||||
$results->each(function ($item, $key) use (&$arrayOpenThread) {
|
||||
$arrayOpenThread = $item->toArray();
|
||||
});
|
||||
|
||||
return $arrayOpenThreads;
|
||||
return $arrayOpenThread;
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -0,0 +1,172 @@
|
||||
<?php
|
||||
|
||||
namespace ProcessMaker\PHPReflectionClass;
|
||||
|
||||
use ReflectionClass;
|
||||
|
||||
/**
|
||||
* Structure for the metadata of the class.
|
||||
*/
|
||||
class ClassStructure
|
||||
{
|
||||
/**
|
||||
* Array of methods.
|
||||
* @var array
|
||||
*/
|
||||
public $methods;
|
||||
|
||||
/**
|
||||
* Array of properties.
|
||||
* @var array
|
||||
*/
|
||||
public $properties;
|
||||
|
||||
/**
|
||||
* Array of informations.
|
||||
* @var array
|
||||
*/
|
||||
public $info;
|
||||
|
||||
/**
|
||||
* Constructor of the class, require the path of source code.
|
||||
* @param string $filename
|
||||
* @return void
|
||||
*/
|
||||
public function __construct(string $filename = "")
|
||||
{
|
||||
$this->methods = [];
|
||||
$this->properties = [];
|
||||
$this->info = [];
|
||||
if ($filename != "") {
|
||||
$this->parseFromFile($filename);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Remove a property by name.
|
||||
* @param string $name
|
||||
* @return boolean
|
||||
*/
|
||||
public function deleteInfo(string $name): bool
|
||||
{
|
||||
if (array_key_exists($name, $this->info)) {
|
||||
unset($this->info[$name]);
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get a property value by name.
|
||||
* @param string $name
|
||||
* @return mixed
|
||||
*/
|
||||
public function getInfo(string $name)
|
||||
{
|
||||
if (array_key_exists($name, $this->info)) {
|
||||
return $this->info[$name];
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets a property by name.
|
||||
* @param string $name
|
||||
* @param string $value
|
||||
* @return void
|
||||
*/
|
||||
public function setInfo(string $name, string $value): void
|
||||
{
|
||||
$this->info[$name] = $value;
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds a method to the class definition.
|
||||
* @param type $method
|
||||
* @return bool
|
||||
*/
|
||||
public function setMethod($method): bool
|
||||
{
|
||||
if (is_object($method) && (new ReflectionClass($method))->getShortName() == "MethodStructure") {
|
||||
$this->methods[$method->getInfo("name")] = $method;
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Parses a source code, require a filename.
|
||||
* @param string $filename
|
||||
* @return bool
|
||||
*/
|
||||
public function parseFromFile(string $filename): bool
|
||||
{
|
||||
if (file_exists($filename) && is_readable($filename)) {
|
||||
$arrContents = file($filename);
|
||||
$parsing = false;
|
||||
$parsingBlocks = [];
|
||||
$tempBlock = [];
|
||||
foreach ($arrContents as $line) {
|
||||
if (trim($line) == "/**") {
|
||||
$parsing = true;
|
||||
$blockstart = true;
|
||||
} elseif ($parsing && trim($line) == "*/") {
|
||||
$parsing = false;
|
||||
$parsingBlocks[] = $tempBlock;
|
||||
$tempBlock = [];
|
||||
} else {
|
||||
if ($parsing) {
|
||||
if ($blockstart) {
|
||||
$tempBlock[] = $line;
|
||||
$blockstart = false;
|
||||
} else {
|
||||
$tempBlock[] = $line;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
foreach ($parsingBlocks as $blockLines) {
|
||||
$block = [];
|
||||
foreach ($blockLines as $line) {
|
||||
$str = strstr($line, "@");
|
||||
$str = substr($str, 1);
|
||||
if ($str !== false) {
|
||||
$separatorPos = (strpos($str, " ") && strpos($str, "\t")) ? min(strpos($str, " "), strpos($str, "\t")) : (strpos($str, " ") ? strpos($str, " ") : (strpos($str, "\t") ? strpos($str, "\t") : strlen($str)));
|
||||
$name = trim(substr($str, 0, $separatorPos));
|
||||
$value = trim(substr($str, $separatorPos));
|
||||
} else {
|
||||
$name = "description";
|
||||
$value = trim($line);
|
||||
}
|
||||
if ($name == "param" || $name == "description")
|
||||
$block[$name][] = $value;
|
||||
else
|
||||
$block[$name] = $value;
|
||||
}
|
||||
if (array_key_exists("method", $block)) {
|
||||
$tempMethod = new MethodStructure($block["method"]);
|
||||
unset($block["method"]);
|
||||
if (isset($block["param"]) && is_array($block["param"])) {
|
||||
foreach ($block["param"] as $param) {
|
||||
$tempMethod->setParam($param, "");
|
||||
}
|
||||
}
|
||||
unset($block["param"]);
|
||||
foreach ($block as $name => $value) {
|
||||
$tempMethod->setInfo($name, $value);
|
||||
}
|
||||
$this->setMethod($tempMethod);
|
||||
} elseif (array_key_exists("class", $block)) {
|
||||
$this->setInfo("name", $block["class"]);
|
||||
unset($block["class"]);
|
||||
foreach ($block as $name => $value) {
|
||||
$this->setInfo($name, $value);
|
||||
}
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,69 @@
|
||||
<?php
|
||||
|
||||
namespace ProcessMaker\PHPReflectionClass;
|
||||
|
||||
/**
|
||||
* Structure for the metadata of the class method.
|
||||
*/
|
||||
class MethodStructure
|
||||
{
|
||||
/**
|
||||
* Params property.
|
||||
* @var array
|
||||
*/
|
||||
public $params;
|
||||
|
||||
/**
|
||||
* Information property.
|
||||
* @var array
|
||||
*/
|
||||
public $info;
|
||||
|
||||
/**
|
||||
* Constructor, runs when new object instance is created, sets name of the method.
|
||||
* @param string $name
|
||||
* @return void
|
||||
*/
|
||||
public function __construct(string $name)
|
||||
{
|
||||
$this->info = [];
|
||||
$this->params = [];
|
||||
$this->setInfo("name", $name);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get value of a property by name.
|
||||
* @param string $name
|
||||
* @return mixed
|
||||
*/
|
||||
public function getInfo(string $name)
|
||||
{
|
||||
if (array_key_exists($name, $this->info)) {
|
||||
return $this->info[$name];
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets a property with supplied name to a supplied value.
|
||||
* @param string $name
|
||||
* @param string $value
|
||||
* @return void
|
||||
*/
|
||||
public function setInfo(string $name, string $value): void
|
||||
{
|
||||
$this->info[$name] = $value;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets a parameter with supplied name and value.
|
||||
* @param string $name
|
||||
* @param string $value
|
||||
* @return void
|
||||
*/
|
||||
public function setParam(string $name, string $value): void
|
||||
{
|
||||
$this->params[$name] = $value;
|
||||
}
|
||||
}
|
||||
@@ -398,6 +398,7 @@ function newNoteHandler() {
|
||||
});
|
||||
|
||||
Ext.getCmp('addCancelBtn').setIcon('/images/comment_add.gif');
|
||||
Ext.getCmp('addCancelBtn').btnEl.dom.ariaLabel = _('ID_CASES_NOTES_ADD');
|
||||
|
||||
caseNotesWindow.getTopToolbar().hide();
|
||||
Ext.getCmp("chkSendMail").hide();
|
||||
@@ -411,6 +412,7 @@ function newNoteHandler() {
|
||||
Ext.getCmp('addCancelBtn').setText('');
|
||||
Ext.getCmp('addCancelBtn').setTooltip({ title: _('ID_CASES_NOTES_CANCEL') });
|
||||
Ext.getCmp('addCancelBtn').setIcon('/images/cancel.png');
|
||||
Ext.getCmp('addCancelBtn').btnEl.dom.ariaLabel = _('ID_CASES_NOTES_CANCEL');
|
||||
|
||||
caseNotesWindow.getTopToolbar().show();
|
||||
Ext.getCmp("chkSendMail").show();
|
||||
|
||||
@@ -89,11 +89,18 @@
|
||||
);
|
||||
|
||||
Ext.onReady(function(){
|
||||
var i;
|
||||
Ext.state.Manager.setProvider(new Ext.state.CookieProvider());
|
||||
Ext.QuickTips.init();
|
||||
|
||||
historyGridList();
|
||||
|
||||
if (document.getElementsByTagName('input')) {
|
||||
document.getElementsByTagName('input')[0].ariaLabel = "pagination";
|
||||
}
|
||||
if (document.getElementsByTagName('button')) {
|
||||
for (i = 0; i < document.getElementsByTagName('button').length; i+= 1) {
|
||||
document.getElementsByTagName('button')[i].ariaLabel = document.getElementsByTagName('button')[i].getAttribute('id');
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
//!historyGridList|
|
||||
|
||||
@@ -222,12 +222,20 @@
|
||||
}
|
||||
);
|
||||
|
||||
Ext.onReady(function(){
|
||||
Ext.onReady(function() {
|
||||
var i;
|
||||
Ext.state.Manager.setProvider(new Ext.state.CookieProvider());
|
||||
Ext.QuickTips.init();
|
||||
|
||||
historyDynaformGrid();
|
||||
|
||||
if (document.getElementsByTagName('input')) {
|
||||
document.getElementsByTagName('input')[0].ariaLabel = "pagination";
|
||||
}
|
||||
if (document.getElementsByTagName('button')) {
|
||||
for (i = 0; i < document.getElementsByTagName('button').length; i+= 1) {
|
||||
document.getElementsByTagName('button')[i].ariaLabel = document.getElementsByTagName('button')[i].getAttribute('id');
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
var historyDynaformGridPreviewGlobal = {};
|
||||
|
||||
@@ -217,11 +217,18 @@ var ActionTabFrameGlobal = '';
|
||||
);
|
||||
|
||||
Ext.onReady(function(){
|
||||
var i;
|
||||
Ext.state.Manager.setProvider(new Ext.state.CookieProvider());
|
||||
Ext.QuickTips.init();
|
||||
|
||||
messageHistoryGridList();
|
||||
|
||||
if (document.getElementsByTagName('input')) {
|
||||
document.getElementsByTagName('input')[0].ariaLabel = "pagination";
|
||||
}
|
||||
if (document.getElementsByTagName('button')) {
|
||||
for (i = 0; i < document.getElementsByTagName('button').length; i+= 1) {
|
||||
document.getElementsByTagName('button')[i].ariaLabel = document.getElementsByTagName('button')[i].getAttribute('id');
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
//!historyGridList|
|
||||
|
||||
@@ -2092,11 +2092,11 @@ var documentsTab = {
|
||||
|
||||
};
|
||||
Ext.onReady(function() {
|
||||
|
||||
var viewport = new Ext.Viewport({
|
||||
layout : 'border',
|
||||
items: [treepanelmain, documentsTab]
|
||||
});
|
||||
var i,
|
||||
viewport = new Ext.Viewport({
|
||||
layout : 'border',
|
||||
items: [treepanelmain, documentsTab]
|
||||
});
|
||||
|
||||
// console.info("viewport -end");
|
||||
|
||||
@@ -2108,5 +2108,16 @@ Ext.onReady(function() {
|
||||
parent.Ext.getCmp('debugPanel').hide();
|
||||
parent.Ext.getCmp('debugPanel').ownerCt.doLayout();
|
||||
}
|
||||
|
||||
if (document.getElementsByTagName('input')) {
|
||||
document.getElementsByTagName('input')[0].ariaLabel = "filterField";
|
||||
}
|
||||
if (document.getElementsByTagName('input')) {
|
||||
document.getElementsByTagName('input')[1].ariaLabel = "pagination";
|
||||
}
|
||||
if (document.getElementsByTagName('button')) {
|
||||
for (i = 0; i < document.getElementsByTagName('button').length; i+= 1) {
|
||||
document.getElementsByTagName('button')[i].ariaLabel = document.getElementsByTagName('button')[i].id;
|
||||
}
|
||||
}
|
||||
|
||||
});
|
||||
|
||||
@@ -154,11 +154,18 @@
|
||||
);
|
||||
|
||||
Ext.onReady(function(){
|
||||
var i;
|
||||
Ext.state.Manager.setProvider(new Ext.state.CookieProvider());
|
||||
Ext.QuickTips.init();
|
||||
|
||||
generateDocumentGrid();
|
||||
|
||||
if (document.getElementsByTagName('input')) {
|
||||
document.getElementsByTagName('input')[0].ariaLabel = "pagination";
|
||||
}
|
||||
if (document.getElementsByTagName('button')) {
|
||||
for (i = 0; i < document.getElementsByTagName('button').length; i+= 1) {
|
||||
document.getElementsByTagName('button')[i].ariaLabel = document.getElementsByTagName('button')[i].getAttribute('id');
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
|
||||
@@ -2784,8 +2784,17 @@ Ext.onReady ( function() {
|
||||
}
|
||||
});
|
||||
// Add the additional 'advanced' VTypes -- [End]
|
||||
|
||||
|
||||
var i;
|
||||
if (document.getElementsByTagName('input')) {
|
||||
for (i = 0; i < document.getElementsByTagName('input').length; i+= 1) {
|
||||
document.getElementsByTagName('input')[i].ariaLabel = document.getElementsByTagName('input')[i].id;
|
||||
}
|
||||
}
|
||||
if (document.getElementsByTagName('button')) {
|
||||
for (i = 0; i < document.getElementsByTagName('button').length; i+= 1) {
|
||||
document.getElementsByTagName('button')[i].ariaLabel = document.getElementsByTagName('button')[i].id;
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
function msgBox(title, msg, type){
|
||||
|
||||
@@ -260,12 +260,19 @@
|
||||
}
|
||||
);
|
||||
|
||||
Ext.onReady(function(){
|
||||
Ext.onReady(function() {
|
||||
var i;
|
||||
Ext.state.Manager.setProvider(new Ext.state.CookieProvider());
|
||||
Ext.QuickTips.init();
|
||||
|
||||
uploadDocumentGrid();
|
||||
|
||||
if (document.getElementsByTagName('input')) {
|
||||
document.getElementsByTagName('input')[0].ariaLabel = "pagination";
|
||||
}
|
||||
if (document.getElementsByTagName('button')) {
|
||||
for (i = 0; i < document.getElementsByTagName('button').length; i+= 1) {
|
||||
document.getElementsByTagName('button')[i].ariaLabel = document.getElementsByTagName('button')[i].getAttribute('id');
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
|
||||
@@ -392,7 +392,11 @@ Ext.onReady(function(){
|
||||
items:[{
|
||||
id: 'casesTab',
|
||||
title: _('ID_CASE') +' ' + _APP_NUM,
|
||||
frameConfig:{name:'openCaseFrame', id:'openCaseFrame'},
|
||||
frameConfig:{
|
||||
name:'openCaseFrame',
|
||||
id:'openCaseFrame',
|
||||
title:'openCaseFrame'
|
||||
},
|
||||
defaultSrc : uri,
|
||||
loadMask:{msg: _('ID_LOADING_GRID') },
|
||||
bodyStyle:{height: (PMExt.getBrowser().screen.height-60) + 'px', overflow:'hidden'},
|
||||
@@ -680,6 +684,7 @@ Ext.onReady(function(){
|
||||
} else {
|
||||
fieldset = {
|
||||
xtype : 'fieldset',
|
||||
title: _('ID_INFORMATION'),
|
||||
autoHeight : true,
|
||||
defaults : {
|
||||
width : 170,
|
||||
@@ -688,11 +693,66 @@ Ext.onReady(function(){
|
||||
style: 'font-weight: bold'
|
||||
},
|
||||
items : [
|
||||
{fieldLabel: _('ID_TITLE'), text: data.PRO_TITLE},
|
||||
{fieldLabel: _('ID_DESCRIPTION'), text: data.PRO_DESCRIPTION},
|
||||
{fieldLabel: _('ID_CATEGORY'), text: data.PRO_CATEGORY_LABEL},
|
||||
{fieldLabel: _('ID_AUTHOR'), text: data.PRO_AUTHOR},
|
||||
{fieldLabel: _('ID_CREATE_DATE'), text: data.PRO_CREATE_DATE}
|
||||
{
|
||||
xtype: 'textfield',
|
||||
fieldLabel: _('ID_TITLE'),
|
||||
value: data.PRO_TITLE,
|
||||
readOnly: true,
|
||||
style: {
|
||||
border: 'none',
|
||||
backgroundImage: 'none',
|
||||
fontWeight: 'bold',
|
||||
width: '170px'
|
||||
}
|
||||
},
|
||||
{
|
||||
xtype: 'textfield',
|
||||
fieldLabel: _('ID_DESCRIPTION'),
|
||||
value: data.PRO_DESCRIPTION,
|
||||
readOnly: true,
|
||||
style: {
|
||||
border: 'none',
|
||||
backgroundImage: 'none',
|
||||
fontWeight: 'bold',
|
||||
width: '170px'
|
||||
}
|
||||
},
|
||||
{
|
||||
xtype: 'textfield',
|
||||
fieldLabel: _('ID_CATEGORY'),
|
||||
value: data.PRO_CATEGORY_LABEL,
|
||||
readOnly: true,
|
||||
style: {
|
||||
border: 'none',
|
||||
backgroundImage: 'none',
|
||||
fontWeight: 'bold',
|
||||
width: '170px'
|
||||
}
|
||||
},
|
||||
{
|
||||
xtype: 'textfield',
|
||||
fieldLabel: _('ID_AUTHOR'),
|
||||
value: data.PRO_AUTHOR,
|
||||
readOnly: true,
|
||||
style: {
|
||||
border: 'none',
|
||||
backgroundImage: 'none',
|
||||
fontWeight: 'bold',
|
||||
width: '170px'
|
||||
}
|
||||
},
|
||||
{
|
||||
xtype: 'textfield',
|
||||
fieldLabel: _('ID_CREATE_DATE'),
|
||||
value: data.PRO_CREATE_DATE,
|
||||
readOnly: true,
|
||||
style: {
|
||||
border: 'none',
|
||||
backgroundImage: 'none',
|
||||
fontWeight: 'bold',
|
||||
width: '170px'
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
|
||||
@@ -755,24 +815,91 @@ Ext.onReady(function(){
|
||||
}
|
||||
});
|
||||
} else {
|
||||
fieldset = {
|
||||
xtype : 'fieldset',
|
||||
autoHeight : true,
|
||||
defaults : {
|
||||
width : 170,
|
||||
xtype:'label',
|
||||
labelStyle : 'padding: 0px;',
|
||||
style: 'font-weight: bold'
|
||||
},
|
||||
items : [
|
||||
{fieldLabel: _('ID_TITLE'), text: data.TAS_TITLE},
|
||||
{fieldLabel: _('ID_DESCRIPTION'), text: data.TAS_DESCRIPTION},
|
||||
{fieldLabel: _('ID_INIT_DATE'), text: data.INIT_DATE_LABEL},
|
||||
{fieldLabel: _('ID_DUE_DATE'), text: data.DUE_DATE_LABEL},
|
||||
{fieldLabel: _('ID_FINISH_DATE'), text: data.FINISH},
|
||||
{fieldLabel: _('ID_TASK_DURATION'), text: data.DURATION}
|
||||
]
|
||||
}
|
||||
fieldset = {
|
||||
xtype : 'fieldset',
|
||||
title: _('ID_INFORMATION'),
|
||||
autoHeight : true,
|
||||
defaults : {
|
||||
width : 170,
|
||||
xtype:'label',
|
||||
labelStyle : 'padding: 0px;',
|
||||
style: 'font-weight: bold'
|
||||
},
|
||||
items : [
|
||||
{
|
||||
xtype: 'textfield',
|
||||
fieldLabel: _('ID_TITLE'),
|
||||
value: data.TAS_TITLE,
|
||||
readOnly: true,
|
||||
style: {
|
||||
border: 'none',
|
||||
backgroundImage: 'none',
|
||||
fontWeight: 'bold',
|
||||
width: '170px'
|
||||
}
|
||||
},
|
||||
{
|
||||
xtype: 'textfield',
|
||||
fieldLabel: _('ID_DESCRIPTION'),
|
||||
value: data.TAS_DESCRIPTION,
|
||||
readOnly: true,
|
||||
style: {
|
||||
border: 'none',
|
||||
backgroundImage: 'none',
|
||||
fontWeight: 'bold',
|
||||
width: '170px'
|
||||
}
|
||||
},
|
||||
{
|
||||
xtype: 'textfield',
|
||||
fieldLabel: _('ID_INIT_DATE'),
|
||||
value: data.INIT_DATE_LABEL,
|
||||
readOnly: true,
|
||||
style: {
|
||||
border: 'none',
|
||||
backgroundImage: 'none',
|
||||
fontWeight: 'bold',
|
||||
width: '170px'
|
||||
}
|
||||
},
|
||||
{
|
||||
xtype: 'textfield',
|
||||
fieldLabel: _('ID_DUE_DATE'),
|
||||
value: data.DUE_DATE_LABEL,
|
||||
readOnly: true,
|
||||
style: {
|
||||
border: 'none',
|
||||
backgroundImage: 'none',
|
||||
fontWeight: 'bold',
|
||||
width: '170px'
|
||||
}
|
||||
},
|
||||
{
|
||||
xtype: 'textfield',
|
||||
fieldLabel: _('ID_FINISH_DATE'),
|
||||
value: data.FINISH,
|
||||
readOnly: true,
|
||||
style: {
|
||||
border: 'none',
|
||||
backgroundImage: 'none',
|
||||
fontWeight: 'bold',
|
||||
width: '170px'
|
||||
}
|
||||
},
|
||||
{
|
||||
xtype: 'textfield',
|
||||
fieldLabel: _('ID_TASK_DURATION'),
|
||||
value: data.DURATION,
|
||||
readOnly: true,
|
||||
style: {
|
||||
border: 'none',
|
||||
backgroundImage: 'none',
|
||||
fontWeight: 'bold',
|
||||
width: '170px'
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
|
||||
var frm = new Ext.FormPanel( {
|
||||
labelAlign : 'right',
|
||||
@@ -1322,7 +1449,8 @@ Ext.onReady(function(){
|
||||
url : 'ajaxListener' ,
|
||||
params : {action : 'verifySession'},
|
||||
success: function ( result, request ) {
|
||||
var data = Ext.util.JSON.decode(result.responseText);
|
||||
var data = Ext.util.JSON.decode(result.responseText),
|
||||
i;
|
||||
if( data.lostSession ) {
|
||||
Ext.Msg.show({
|
||||
title: _('ID_ERROR'),
|
||||
@@ -1353,8 +1481,17 @@ Ext.onReady(function(){
|
||||
}
|
||||
});
|
||||
} else {
|
||||
winReassignInCasesList.show();
|
||||
grdpnlUsersToReassign.store.load();
|
||||
winReassignInCasesList.show();
|
||||
grdpnlUsersToReassign.store.load();
|
||||
if (document.getElementsByTagName('input')) {
|
||||
document.getElementsByTagName('input')[1].ariaLabel = "search";
|
||||
document.getElementsByTagName('input')[2].ariaLabel = "pagination";
|
||||
}
|
||||
if (document.getElementsByTagName('button')) {
|
||||
for (i = 0; i < document.getElementsByTagName('button').length; i+= 1) {
|
||||
document.getElementsByTagName('button')[i].ariaLabel = document.getElementsByTagName('button')[i].getAttribute('id');
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
failure: function ( result, request) {
|
||||
@@ -1439,8 +1576,30 @@ Ext.onReady(function(){
|
||||
style: 'font-weight: bold'
|
||||
},
|
||||
items : [
|
||||
{fieldLabel: _("ID_CASE"), text: stringReplace("\\: ", "", _APP_NUM)},
|
||||
{fieldLabel: _("ID_PAUSE_DATE"), text: _ENV_CURRENT_DATE},
|
||||
{
|
||||
xtype: 'textfield',
|
||||
fieldLabel: _('ID_CASE'),
|
||||
value: stringReplace("\\: ", "", _APP_NUM),
|
||||
readOnly: true,
|
||||
style: {
|
||||
border: 'none',
|
||||
backgroundImage: 'none',
|
||||
fontWeight: 'bold',
|
||||
width: '170px'
|
||||
}
|
||||
},
|
||||
{
|
||||
xtype: 'textfield',
|
||||
fieldLabel: _('ID_PAUSE_DATE'),
|
||||
value: _ENV_CURRENT_DATE,
|
||||
readOnly: true,
|
||||
style: {
|
||||
border: 'none',
|
||||
backgroundImage: 'none',
|
||||
fontWeight: 'bold',
|
||||
width: '170px'
|
||||
}
|
||||
},
|
||||
new Ext.form.DateField({
|
||||
id: 'unpauseDate',
|
||||
format: 'Y-m-d',
|
||||
|
||||
@@ -633,7 +633,7 @@ Ext.onReady(function () {
|
||||
value: 'root',
|
||||
allowBlank: false,
|
||||
validator: function (v) {
|
||||
var t = /^[.a-zA-Z_\-]+$/;
|
||||
var t = /^[0-9\.a-zA-Z_\-]+$/;
|
||||
return t.test(v);
|
||||
},
|
||||
listeners: {
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
overflow-y: hidden;
|
||||
}
|
||||
</style>
|
||||
<iframe name="adminFrame" id="adminFrame" src ="clientSetup" width="99%" height="768" frameborder="0">
|
||||
<iframe title="adminFrame" name="adminFrame" id="adminFrame" src ="clientSetup" width="99%" height="768" frameborder="0">
|
||||
<p>Your browser does not support iframes.</p>
|
||||
</iframe>
|
||||
</body>
|
||||
|
||||
@@ -181,7 +181,7 @@ Ext.onReady(function(){
|
||||
},
|
||||
columns: [
|
||||
{id:'CATEGORY_UID', dataIndex: 'CATEGORY_UID', hidden:true, hideable:false},
|
||||
{header: _('ID_CATEGORY_NAME'), dataIndex: 'CATEGORY_NAME', width: 500, hidden:false, align:'left'},
|
||||
{header: _('ID_CATEGORY_NAME'), dataIndex: 'CATEGORY_NAME', width: 500, hidden:false, renderer: categoryNameRenderer, align:'left'},
|
||||
{header: _('ID_PROCESSES'), dataIndex: 'TOTAL_PROCESSES', width: 100, hidden: false, align: 'center'}
|
||||
]
|
||||
});
|
||||
@@ -282,6 +282,11 @@ Ext.onReady(function(){
|
||||
});
|
||||
});
|
||||
|
||||
//Sanitize output
|
||||
categoryNameRenderer = function (value) {
|
||||
return Ext.util.Format.htmlEncode(value);
|
||||
};
|
||||
|
||||
//Funtion Handles Context Menu Opening
|
||||
onMessageContextMenu = function (grid, rowIndex, e) {
|
||||
e.stopEvent();
|
||||
|
||||
@@ -26,10 +26,19 @@
|
||||
<en><![CDATA[Next step]]></en>
|
||||
</NEXT_STEP>
|
||||
<JS type="javascript"><![CDATA[
|
||||
var nextStep = function(oForm)
|
||||
{
|
||||
oForm.action = 'cases_NextStep';
|
||||
oForm.submit();
|
||||
};
|
||||
var i,
|
||||
span,
|
||||
nextStep = function(oForm) {
|
||||
oForm.action = 'cases_NextStep';
|
||||
oForm.submit();
|
||||
};
|
||||
label1 = document.getElementsByTagName('label')[0];
|
||||
label2 = document.getElementsByTagName('label')[1];
|
||||
span1 = document.createElement('span');
|
||||
span1.innerHTML = label1.innerHTML;
|
||||
span2 = document.createElement('span');
|
||||
span2.innerHTML = label2.innerHTML;
|
||||
label1.parentNode.replaceChild(span1, label1);
|
||||
label2.parentNode.replaceChild(span2, label2);
|
||||
]]></JS>
|
||||
</dynaForm>
|
||||
|
||||
@@ -16,8 +16,6 @@
|
||||
{$form.USR_PASSWORD_MASK}
|
||||
{$form.USER_LANG}
|
||||
{$form.URL}
|
||||
{$form.FAILED_LOGINS}
|
||||
|
||||
</fieldset>
|
||||
<fieldset>
|
||||
<label class="panel-login">
|
||||
|
||||
@@ -19,12 +19,11 @@ SELECT LANG_ID, LANG_NAME FROM langOptions
|
||||
<en><![CDATA[Language]]></en>
|
||||
</USER_LANG>
|
||||
<URL type="hidden"/>
|
||||
<FAILED_LOGINS type="hidden"/>
|
||||
<LOGIN_VERIFY_MSG type="private" showInTable="0"/>
|
||||
<BSUBMIT type="button">
|
||||
<en><![CDATA[Login]]></en>
|
||||
</BSUBMIT>
|
||||
<FORGOT_PASWORD_LINK type="link" link="forgotPassword" onclick="" colAlign="right" colWidth="135" style="display:none;">
|
||||
<FORGOT_PASWORD_LINK type="link" link="forgotPassword" onclick="" colAlign="right" colWidth="135">
|
||||
<en><![CDATA[Forgot Password]]></en>
|
||||
</FORGOT_PASWORD_LINK>
|
||||
<JS type="javascript"><![CDATA[
|
||||
@@ -95,9 +94,10 @@ window.onload= function(){
|
||||
}
|
||||
};
|
||||
|
||||
// enable/disable forgot password link
|
||||
if(flagForgotPassword == 'on' || flagForgotPassword == '1') {
|
||||
document.getElementById("form[FORGOT_PASWORD_LINK]").style.display = 'block';//hideRowById('FORGOT_PASWORD_LINK');
|
||||
// delete or not forgot password link
|
||||
if(flagForgotPassword != 'on' && flagForgotPassword != '1') {
|
||||
var element = document.getElementById("form[FORGOT_PASWORD_LINK]");
|
||||
element.parentNode.removeChild(element);
|
||||
}
|
||||
|
||||
var panel;
|
||||
|
||||
Reference in New Issue
Block a user