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(){