diff --git a/.make/build/commands/setupCssCompiler.php b/.make/build/commands/setupCssCompiler.php
index af940913b..110639d8c 100644
--- a/.make/build/commands/setupCssCompiler.php
+++ b/.make/build/commands/setupCssCompiler.php
@@ -27,7 +27,7 @@ $iTopFolder = __DIR__."/../../../";
require_once("$iTopFolder/approot.inc.php");
require_once(APPROOT."/application/utils.inc.php");
-if (php_sapi_name() !== 'cli')
+if (PHP_SAPI !== 'cli')
{
throw new \Exception('This script can only run from CLI');
}
@@ -48,4 +48,4 @@ if (!file_exists($sCssFile))
{
fwrite(STDERR, "Failed to compile $sCssFile, exiting.");
exit(1);
-}
\ No newline at end of file
+}
diff --git a/application/utils.inc.php b/application/utils.inc.php
index 98e4b97d0..48e53f4bd 100644
--- a/application/utils.inc.php
+++ b/application/utils.inc.php
@@ -244,13 +244,8 @@ class utils
public static function IsModeCLI()
{
- $sSAPIName = php_sapi_name();
- $sCleanName = strtolower(trim($sSAPIName));
- if ($sCleanName == 'cli') {
- return true;
- } else {
- return false;
- }
+ $sCleanName = strtolower(trim(PHP_SAPI));
+ return ($sCleanName === 'cli');
}
/**
@@ -373,13 +368,13 @@ class utils
}
return self::Sanitize($retValue, $defaultValue, $sSanitizationFilter);
}
-
+
public static function ReadPostedParam($sName, $defaultValue = '', $sSanitizationFilter = 'parameter')
{
$retValue = isset($_POST[$sName]) ? $_POST[$sName] : $defaultValue;
return self::Sanitize($retValue, $defaultValue, $sSanitizationFilter);
}
-
+
public static function Sanitize($value, $defaultValue, $sSanitizationFilter)
{
if ($value === $defaultValue)
@@ -395,7 +390,7 @@ class utils
$retValue = $defaultValue;
}
}
- return $retValue;
+ return $retValue;
}
/**
@@ -551,11 +546,11 @@ class utils
$sMimeType = self::GetFileMimeType($sTmpName);
$oDocument = new ormDocument($doc_content, $sMimeType, $sName);
break;
-
+
case UPLOAD_ERR_NO_FILE:
// no file to load, it's a normal case, just return an empty document
break;
-
+
case UPLOAD_ERR_FORM_SIZE:
case UPLOAD_ERR_INI_SIZE:
throw new FileUploadException(Dict::Format('UI:Error:UploadedFileTooBig', ini_get('upload_max_filesize')));
@@ -564,7 +559,7 @@ class utils
case UPLOAD_ERR_PARTIAL:
throw new FileUploadException(Dict::S('UI:Error:UploadedFileTruncated.'));
break;
-
+
case UPLOAD_ERR_NO_TMP_DIR:
throw new FileUploadException(Dict::S('UI:Error:NoTmpDir'));
break;
@@ -577,7 +572,7 @@ class utils
$sName = is_null($sIndex) ? $aFileInfo['name'] : $aFileInfo['name'][$sIndex];
throw new FileUploadException(Dict::Format('UI:Error:UploadStoppedByExtension_FileName', $sName));
break;
-
+
default:
throw new FileUploadException(Dict::Format('UI:Error:UploadFailedUnknownCause_Code', $sError));
break;
@@ -683,17 +678,17 @@ class utils
return $aSelectedObj;
}
-
+
public static function GetNewTransactionId()
{
return privUITransaction::GetNewTransactionId();
}
-
+
public static function IsTransactionValid($sId, $bRemoveTransaction = true)
{
return privUITransaction::IsTransactionValid($sId, $bRemoveTransaction);
}
-
+
public static function RemoveTransaction($sId)
{
return privUITransaction::RemoveTransaction($sId);
@@ -877,9 +872,9 @@ class utils
$aDateTokens = array_keys($aSpec);
$aDateRegexps = array_values($aSpec);
}
-
+
$sDateRegexp = str_replace($aDateTokens, $aDateRegexps, $sFormat);
-
+
if (preg_match('!^(?
)'.$sDateRegexp.'(?)$!', $sDate, $aMatches))
{
$sYear = isset($aMatches['year']) ? $aMatches['year'] : 0;
@@ -896,7 +891,7 @@ class utils
}
// http://www.spaweditor.com/scripts/regex/index.php
}
-
+
/**
* Convert an old date/time format specification (using % placeholders)
* to a format compatible with DateTime::createFromFormat
@@ -1492,7 +1487,7 @@ class utils
$aResult = [];
// 1st - add standard built-in menu items
- //
+ //
switch($iMenuId)
{
case iPopupMenuExtension::MENU_OBJLIST_ACTIONS:
@@ -1876,7 +1871,7 @@ SQL;
return $sProposed;
}
}
-
+
/**
* Some characters cause troubles with jQuery when used inside DOM IDs, so let's replace them by the safe _ (underscore)
* @param string $sId The ID to sanitize
@@ -1886,7 +1881,7 @@ SQL;
{
return str_replace(array(':', '[', ']', '+', '-', ' '), '_', $sId);
}
-
+
/**
* Helper to execute an HTTP POST request, uses CURL PHP extension
*
@@ -1971,7 +1966,7 @@ SQL;
/**
* Get a standard list of character sets
- *
+ *
* @param array $aAdditionalEncodings Additional values
* @return array of iconv code => english label, sorted by label
*/
@@ -2078,7 +2073,7 @@ SQL;
return $e->getMessage();
}
}
-
+
/**
* Convert (?) plain text to some HTML markup by replacing newlines by
tags
* and escaping HTML entities
@@ -2095,7 +2090,7 @@ SQL;
return str_replace("\n", '
', utils::EscapeHtml($sText));
}
-
+
/**
* Eventually compiles the SASS (.scss) file into the CSS (.css) file
*
@@ -2209,7 +2204,7 @@ SQL;
case 'image/png':
$img = @imagecreatefromstring($oImage->GetData());
break;
-
+
default:
// Unsupported image type, return the image as-is
//throw new Exception("Unsupported image type: '".$oImage->GetMimeType()."'. Cannot resize the image, original image will be used.");
@@ -2223,14 +2218,14 @@ SQL;
else
{
// Let's scale the image, preserving the transparency for GIFs and PNGs
-
+
$fScale = min($iMaxImageWidth / $iWidth, $iMaxImageHeight / $iHeight);
- $iNewWidth = floor($iWidth * $fScale);
- $iNewHeight = floor($iHeight * $fScale);
-
+ $iNewWidth = $iWidth * $fScale;
+ $iNewHeight = $iHeight * $fScale;
+
$new = imagecreatetruecolor($iNewWidth, $iNewHeight);
-
+
// Preserve transparency
if(($oImage->GetMimeType() == "image/gif") || ($oImage->GetMimeType() == "image/png"))
{
@@ -2238,38 +2233,38 @@ SQL;
imagealphablending($new, false);
imagesavealpha($new, true);
}
-
+
imagecopyresampled($new, $img, 0, 0, 0, 0, $iNewWidth, $iNewHeight, $iWidth, $iHeight);
-
+
ob_start();
switch ($oImage->GetMimeType())
{
case 'image/gif':
imagegif($new); // send image to output buffer
break;
-
+
case 'image/jpeg':
imagejpeg($new, null, 80); // null = send image to output buffer, 80 = good quality
break;
-
+
case 'image/png':
imagepng($new, null, 5); // null = send image to output buffer, 5 = medium compression
break;
}
$oResampledImage = new ormDocument(ob_get_contents(), $oImage->GetMimeType(), $oImage->GetFileName());
@ob_end_clean();
-
+
imagedestroy($img);
imagedestroy($new);
-
+
return $oResampledImage;
}
-
+
}
-
+
/**
* Create a 128 bit UUID in the format: {########-####-####-####-############}
- *
+ *
* Note: this method can be run from the command line as well as from the web server.
* Note2: this method is not cryptographically secure! If you need a cryptographically secure value
* consider using open_ssl or PHP 7 methods.
@@ -2307,7 +2302,7 @@ SQL;
{
return ModuleService::GetInstance()->GetCurrentModuleName($iCallDepth + 1);
}
-
+
/**
* **Warning** : returned result can be invalid as we're using backtrace to find the module dir name
*
@@ -2344,7 +2339,7 @@ SQL;
{
return ModuleService::GetInstance()->GetCurrentModuleUrl(1);
}
-
+
/**
* @param string $sProperty The name of the property to retrieve
* @param mixed $defaultvalue
@@ -2354,7 +2349,7 @@ SQL;
{
return ModuleService::GetInstance()->GetCurrentModuleSetting($sProperty, $defaultvalue);
}
-
+
/**
* @param string $sModuleName
* @return string|NULL compiled version of a given module, as it was seen by the compiler
@@ -2363,7 +2358,7 @@ SQL;
{
return ModuleService::GetInstance()->GetCompiledModuleVersion($sModuleName);
}
-
+
/**
* Check if the given path/url is an http(s) URL
* @param string $sPath
@@ -2378,7 +2373,7 @@ SQL;
}
return $bRet;
}
-
+
/**
* Check if the given URL is a link to download a document/image on the CURRENT iTop
* In such a case we can read the content of the file directly in the database (if the users rights allow) and return the ormDocument
@@ -2427,7 +2422,7 @@ SQL;
}
return $result;
}
-
+
/**
* Read the content of a file (and retrieve its MIME type) from either:
* - an URL pointing to a blob (image/document) on the current iTop server
@@ -2471,7 +2466,7 @@ SQL;
'html' => 'text/html',
'exe' => 'application/octet-stream',
);
-
+
$sData = null;
$sMimeType = 'text/plain'; // Default MIME Type: treat the file as a bunch a characters...
$sFileName = 'uploaded-file'; // Default name for downloaded-files
@@ -2529,7 +2524,7 @@ SQL;
}
$sExtension = strtolower(pathinfo($sPath, PATHINFO_EXTENSION));
$sFileName = basename($sPath);
-
+
if (array_key_exists($sExtension, $aKnownExtensions))
{
$sMimeType = $aKnownExtensions[$sExtension];
@@ -2543,7 +2538,7 @@ SQL;
}
return $oUploadedDoc;
}
-
+
protected static function ParseHeaders($aHeaders)
{
$aCleanHeaders = array();
@@ -2568,7 +2563,7 @@ SQL;
}
return $aCleanHeaders;
}
-
+
/**
* @return string a string based on compilation time or (if not available because the datamodel has not been loaded)
* the version of iTop. This string is useful to prevent browser side caching of content that may vary at each
diff --git a/bootstrap.inc.php b/bootstrap.inc.php
index 1714bb10c..8e64d8163 100644
--- a/bootstrap.inc.php
+++ b/bootstrap.inc.php
@@ -68,7 +68,7 @@ if (file_exists(MAINTENANCE_MODE_FILE) && !$bBypassMaintenance)
http_response_code(503);
// Display message depending on the request
include(APPROOT.'application/maintenancemsg.php');
- $sSAPIName = strtoupper(trim(php_sapi_name()));
+ $sSAPIName = strtoupper(trim(PHP_SAPI));
switch (true)
{
diff --git a/templates/base/components/input/set/layout.ready.js.twig b/templates/base/components/input/set/layout.ready.js.twig
index 7a102cb21..8cbaa8e41 100644
--- a/templates/base/components/input/set/layout.ready.js.twig
+++ b/templates/base/components/input/set/layout.ready.js.twig
@@ -4,6 +4,7 @@
{# SET WIDGET #}
{% set oDataProvider = oUIBlock.GetDataProvider() %}
+let optionsBeforeFilter;
let oWidget{{ oUIBlock.GetId() }} = $('#{{ oUIBlock.GetId() }}').selectize({
{# Global options #}
@@ -117,6 +118,7 @@ let oWidget{{ oUIBlock.GetId() }} = $('#{{ oUIBlock.GetId() }}').selectize({
// Filter old options data to keep selected values
// (options with force flag will be kept event if they doesn't be part of the current value)
let options = Object.values(me.options);
+ optionsBeforeFilter = options;
options = options.filter(item => (typeof(item.force) !== "undefined" && item.force === true) || aSelectedItems.includes(item['{{ oDataProvider.GetDataValueField() }}']));
// Merge kept and new values
options = $.merge(options, res.data.search_data);
@@ -235,6 +237,11 @@ let oWidget{{ oUIBlock.GetId() }} = $('#{{ oUIBlock.GetId() }}').selectize({
{% endif %}
},
+ onBlur: function(){
+ this.clearOptionGroups()
+ this.addOption(optionsBeforeFilter)
+ },
+
{# plugin combodo_add_button #}
{% if oUIBlock.HasAddOptionButton() and oUIBlock.HasAddOptionButtonJsOnClick() %}
onAdd: function(){