N°2996 Remove iTop version from css variables

- $version does not exit anymore in css-variables.css. now its value is computed during setup and equals setup timestamp instead.
    - use precompiled files (declared in datamodels XML files) to check if theme compilation is required or not.
    - referenced images in scss files are included in precompiled file signatures just like scss files md5sum.
    - images declared in scss files with v=$version are reloaded automatically on browser side after each theme compilation (see xxx.png?v=timestamp)
    - precompiled files are replaced if theme compilation occurred. this will avoid same time consuming operation at next setup.
    - code cleanup: arrays / variables renamed
This commit is contained in:
odain
2020-08-14 17:03:16 +02:00
parent 08414296b6
commit a538e3c1a2
14 changed files with 573 additions and 487 deletions

View File

@@ -25,7 +25,7 @@
*/
class ThemeHandler
{
const IMAGE_EXTENSIONS = array('png', 'gif', 'jpg', 'jpeg');
const IMAGE_EXTENSIONS = ['png', 'gif', 'jpg', 'jpeg'];
private static $oCompileCSSService;
/**
@@ -36,19 +36,19 @@ class ThemeHandler
*/
public static function GetDefaultThemeInformation()
{
return array(
return [
'name' => 'light-grey',
'parameters' => array(
'variables' => array(),
'imports' => array(
'parameters' => [
'variables' => [],
'imports' => [
'css-variables' => '../css/css-variables.scss',
),
'stylesheets' => array(
],
'stylesheets' => [
'jqueryui' => '../css/ui-lightness/jqueryui.scss',
'main' => '../css/light-grey.scss',
),
),
);
],
],
];
}
/**
@@ -111,11 +111,11 @@ class ThemeHandler
SetupUtils::builddir($sDefaultThemeDirPath);
}
static::CompileTheme($sThemeId, false, $aDefaultTheme['parameters']);
static::CompileTheme($sThemeId, false, "", $aDefaultTheme['parameters']);
}
// Return absolute url to theme compiled css
return utils::GetAbsoluteUrlModulesRoot().'/branding/themes/'.$sThemeId.'/main.css';
return utils::GetAbsoluteUrlModulesRoot().'branding/themes/'.$sThemeId.'/main.css';
}
/**
@@ -124,36 +124,36 @@ class ThemeHandler
* 2) The produced CSS file exists and its signature is equal to the expected signature (imports, stylesheets, variables)
*
* @param string $sThemeId
* @param mix $sSetupCompilationTimestamp : when setup context this is compilation timestamp. otherwise false.
* @param boolean $bSetup
* @param string $sSetupCompilationTimestamp : setup compilation timestamp in micro secunds
* @param array|null $aThemeParameters Parameters (variables, imports, stylesheets) for the theme, if not passed, will be retrieved from compiled DM
* @param array|null $aImportsPaths Paths where imports can be found. Must end with '/'
* @param string|null $sWorkingPath Path of the folder used during compilation. Must end with a '/'
*
* @throws \CoreException
* @return boolean: indicate whether theme compilation occured
*/
public static function CompileTheme($sThemeId, $sSetupCompilationTimestamp=false, $aThemeParameters = null, $aImportsPaths = null, $sWorkingPath = null)
public static function CompileTheme($sThemeId, $bSetup=false, $sSetupCompilationTimestamp="", $aThemeParameters = null, $aImportsPaths = null, $sWorkingPath = null)
{
if ($sSetupCompilationTimestamp===false)
if ($sSetupCompilationTimestamp==="")
{
$sSetupCompilationTimestamp = microtime(true);
$bSetup = false;
}
else
{
$bSetup = true;
}
$sSetupCompilationTimestampInSecunds = (strpos($sSetupCompilationTimestamp, '.') !==false) ? explode('.', $sSetupCompilationTimestamp)[0] : $sSetupCompilationTimestamp;
$sEnv = APPROOT.'env-'.utils::GetCurrentEnvironment().'/';
// Default working path
if($sWorkingPath === null)
{
$sWorkingPath = APPROOT.'env-'.utils::GetCurrentEnvironment().'/';
$sWorkingPath = $sEnv;
}
// Default import paths (env-*)
if($aImportsPaths === null)
{
$aImportsPaths = array(
APPROOT.'env-'.utils::GetCurrentEnvironment().'/',
);
$aImportsPaths = [ $sEnv];
}
// Note: We do NOT check that the folder exists!
@@ -163,7 +163,11 @@ class ThemeHandler
// Save parameters if passed... (typically during DM compilation)
if(is_array($aThemeParameters))
{
$aThemeParameters = self::PrepareThemeParameterBeforeSavingAndCompiling($aThemeParameters, $sWorkingPath, $sThemeFolderPath, $sSetupCompilationTimestamp);
if (!is_dir($sThemeFolderPath))
{
mkdir($sWorkingPath.'/branding/');
mkdir($sWorkingPath.'/branding/themes/');
}
file_put_contents($sThemeFolderPath.'/theme-parameters.json', json_encode($aThemeParameters));
}
// ... Otherwise, retrieve them from compiled DM (typically when switching current theme in the config. file)
@@ -176,12 +180,14 @@ class ThemeHandler
}
}
$aThemeParametersWithVersion = self::CloneThemeParameterAndIncludeVersion($aThemeParameters, $sSetupCompilationTimestampInSecunds);
$sTmpThemeScssContent = '';
$iStyleLastModified = 0;
clearstatcache();
// Loading files to import and stylesheet to compile, also getting most recent modification time on overall files
$aStylesheetFiles = array();
$aStylesheetFiles = [];
foreach ($aThemeParameters['imports'] as $sImport)
{
$sTmpThemeScssContent .= '@import "'.$sImport.'";'."\n";
@@ -201,14 +207,10 @@ class ThemeHandler
$iStyleLastModified = $iStyleLastModified < $iStylesheetLastModified ? $iStylesheetLastModified : $iStyleLastModified;
}
$aIncludedImages=static::GetIncludedImages($aThemeParameters['variables'], $aStylesheetFiles, $sThemeFolderPath);
$aIncludedImages=static::GetIncludedImages($aThemeParametersWithVersion, $aStylesheetFiles, $sThemeId);
foreach ($aIncludedImages as $sImage)
{
if (!is_file($sImage))
{
IssueLog::Warning("Cannot find $sImage during SCSS $sThemeId precompilation");
}
else
if (is_file($sImage))
{
$iStylesheetLastModified = @filemtime($sImage);
$iStyleLastModified = $iStyleLastModified < $iStylesheetLastModified ? $iStylesheetLastModified : $iStyleLastModified;
@@ -262,13 +264,15 @@ CSS;
static::$oCompileCSSService = new CompileCSSService();
}
//store it again to change $version with latest compiled time
$aThemeParameters = self::PrepareThemeParameterBeforeSavingAndCompiling($aThemeParameters, $sWorkingPath, $sThemeFolderPath, $sSetupCompilationTimestamp);
$sTmpThemeCssContent = static::$oCompileCSSService->CompileCSSFromSASS($sTmpThemeScssContent, $aImportsPaths,
$aThemeParameters['variables']);
$aThemeParametersWithVersion);
file_put_contents($sThemeFolderPath.'/theme-parameters.json', json_encode($aThemeParameters));
file_put_contents($sThemeCssPath, $sSignatureComment.$sTmpThemeCssContent);
SetupLog::Info("Theme $sThemeId file compiled.");
return true;
}
}
return false;
}
/**
@@ -286,12 +290,12 @@ CSS;
*/
public static function ComputeSignature($aThemeParameters, $aImportsPaths, $aIncludedImages)
{
$aSignature = array(
$aSignature = [
'variables' => md5(json_encode($aThemeParameters['variables'])),
'stylesheets' => array(),
'imports' => array(),
'images' => array(),
);
'stylesheets' => [],
'imports' => [],
'images' => []
];
foreach ($aThemeParameters['imports'] as $key => $sImport)
{
@@ -307,7 +311,8 @@ CSS;
{
if (is_file($sImage))
{
$aSignature['images'][$sImage] = md5_file($sImage);
$sUri = str_replace(APPROOT, '', $sImage);
$aSignature['images'][$sUri] = md5_file($sImage);
}
}
@@ -316,25 +321,28 @@ CSS;
/**
* Search for images referenced in stylesheet files
*
* @param array $aThemeParametersVariables
* @param array $aStylesheetFiles
* @param string $sThemeFolderPath : used as relative paths to find css images
* @param string $sThemeId: used only for logging purpose
*
* @return array
* @since 2.8.0
*/
public static function GetIncludedImages($aThemeParametersVariables, $aStylesheetFiles, $sThemeFolderPath)
public static function GetIncludedImages($aThemeParametersVariables, $aStylesheetFiles, $sThemeId)
{
$aCompleteUrls = array();
$aToCompleteUrls = array();
$aMissingVariables = array();
$aFoundVariables = array('version'=>'');
$aMap = array(
$sTargetThemeFolderPath = static::GetCompiledThemeFolderAbsolutePath($sThemeId);
$aCompleteUrls = [];
$aToCompleteUrls = [];
$aMissingVariables = [];
$aFoundVariables = ['version'=>''];
$aMap = [
'aCompleteUrls' => $aCompleteUrls,
'aToCompleteUrls' => $aToCompleteUrls,
'aMissingVariables' => $aMissingVariables,
'aFoundVariables' => $aFoundVariables,
);
];
foreach ($aStylesheetFiles as $sStylesheetFile)
{
@@ -350,8 +358,9 @@ CSS;
}
$aMap = static::ResolveUncompleteUrlsFromScss($aMap, $aThemeParametersVariables, $aStylesheetFiles);
$aImages = array();
foreach ($aMap ['aCompleteUrls'] as $sUrl)
$aImages = [];
foreach ($aMap ['aCompleteUrls'] as $sUri => $sUrl)
{
$sImg = $sUrl;
if (preg_match("/(.*)\?/", $sUrl, $aMatches))
@@ -362,21 +371,56 @@ CSS;
if (static::HasImageExtension($sImg)
&& ! array_key_exists($sImg, $aImages))
{
if (!is_file($sImg))
$sFilePath = realpath($sImg);
if ($sFilePath!==false)
{
$sImg=$sThemeFolderPath.DIRECTORY_SEPARATOR.$sImg;
if (!is_file($sImg))
{
$sImg=preg_replace('#'.DIRECTORY_SEPARATOR.'..#', '', $sImg, 1);
}
$aImages[$sImg]=$sFilePath;
continue;
}
$aImages[$sImg]=$sImg;
$sCanonicalPath = static::CanonicalizePath($sTargetThemeFolderPath.DIRECTORY_SEPARATOR.$sImg);
$sFilePath=realpath($sCanonicalPath);
if ($sFilePath!==false)
{
$aImages[$sImg]=$sFilePath;
continue;
}
SetupLog::Warning("Cannot find $sCanonicalPath ($sImg) during SCSS $sThemeId precompilation");
}
}
return array_values($aImages);
}
/**
* Reduce path without using realpath (works only when file exists)
* @param $path
*
* @return string
*/
public static function CanonicalizePath($path)
{
$path = explode('/', str_replace('//','/', $path));
$stack = array();
foreach ($path as $seg) {
if ($seg == '..') {
// Ignore this segment, remove last segment from stack
array_pop($stack);
continue;
}
if ($seg == '.') {
// Ignore this segment
continue;
}
$stack[] = $seg;
}
return implode('/', $stack);
}
/**
* Complete url using provided variables. Example with $var=1: XX + $var => XX1
* @param $aMap
@@ -422,7 +466,7 @@ CSS;
*/
public static function FindMissingVariables($aThemeParametersVariables, $aMissingVariables, $aFoundVariables, $sContent, $bForceEmptyValueWhenNotFound=false)
{
$aNewMissingVars = array();
$aNewMissingVars = [];
if (!empty($aMissingVariables))
{
foreach ($aMissingVariables as $var)
@@ -464,7 +508,7 @@ CSS;
}
}
return array($aNewMissingVars, $aFoundVariables);
return [ $aNewMissingVars, $aFoundVariables ];
}
/**
@@ -478,6 +522,12 @@ CSS;
{
if (!empty($aFoundVariables))
{
$aFoundVariablesWithEmptyValue = [];
foreach ($aFoundVariables as $aFoundVariable => $sValue)
{
$aFoundVariablesWithEmptyValue[$aFoundVariable] = '';
}
foreach ($aToCompleteUrls as $sUrlTemplate)
{
unset($aToCompleteUrls[$sUrlTemplate]);
@@ -488,12 +538,21 @@ CSS;
}
else
{
$aCompleteUrls[$sUrlTemplate] = $sResolvedUrl;
$sUri = static::ResolveUrl($sUrlTemplate, $aFoundVariablesWithEmptyValue);
$aExplodedUri = explode('?', $sUri);
if (empty($aExplodedUri))
{
$aCompleteUrls[$sUri] = $sResolvedUrl;
}
else
{
$aCompleteUrls[$aExplodedUri[0]] = $sResolvedUrl;
}
}
}
}
return array($aToCompleteUrls, $aCompleteUrls);
return [ $aToCompleteUrls, $aCompleteUrls];
}
/**
@@ -505,10 +564,10 @@ CSS;
*/
public static function GetAllUrlFromScss($aThemeParametersVariables, $sStylesheetFile)
{
$aCompleteUrls = array();
$aToCompleteUrls = array();
$aMissingVariables = array();
$aFoundVariables = array();
$aCompleteUrls = [];
$aToCompleteUrls = [];
$aMissingVariables = [];
$aFoundVariables = [];
if (is_file($sStylesheetFile))
{
@@ -546,12 +605,12 @@ CSS;
}
}
return array(
return [
'aCompleteUrls' => $aCompleteUrls,
'aToCompleteUrls' => $aToCompleteUrls,
'aMissingVariables' => $aMissingVariables,
'aFoundVariables' => $aFoundVariables,
);
'aFoundVariables' => $aFoundVariables
];
}
/**
@@ -563,8 +622,8 @@ CSS;
*/
public static function ResolveUrl($sUrlTemplate, $aFoundVariables)
{
$aPattern=array();
$aReplacement=array();
$aPattern= [];
$aReplacement= [];
foreach ($aFoundVariables as $aFoundVariable => $aFoundVariableValue)
{
//XX + $key + YY
@@ -669,35 +728,25 @@ CSS;
}
/**
* main work is to store compilation timestamp as $version variable
* that way each time there is compilation, images and others will be loaded again on client browser side (apart from cache)
* Clone variable array and include $version with bSetupCompilationTimestamp value
* @param $aThemeParameters
* @param $sWorkingPath
* @param $sThemeFolderPath
* @param $bSetupCompilationTimestamp
*
* @return mixed
* @return array
*/
public static function PrepareThemeParameterBeforeSavingAndCompiling($aThemeParameters, $sWorkingPath, $sThemeFolderPath, $bSetupCompilationTimestamp)
public static function CloneThemeParameterAndIncludeVersion($aThemeParameters, $bSetupCompilationTimestamp)
{
$aThemeParametersVariable = [];
if (array_key_exists('variables', $aThemeParameters))
{
if (is_array($aThemeParameters['variables']))
{
$aThemeParameters['variables']['$version'] = $bSetupCompilationTimestamp;
$aThemeParametersVariable = array_merge([], $aThemeParameters['variables']);
}
}
else
{
$aThemeParameters['variables']['$version'] = $bSetupCompilationTimestamp;
}
if (!is_dir($sThemeFolderPath))
{
mkdir($sWorkingPath.'/branding/');
mkdir($sWorkingPath.'/branding/themes/');
}
return $aThemeParameters;
$aThemeParametersVariable['$version'] = $bSetupCompilationTimestamp;
return $aThemeParametersVariable;
}
}
@@ -710,7 +759,7 @@ class CompileCSSService
{
}
public function CompileCSSFromSASS($sSassContent, $aImportPaths = array(), $aVariables = array()){
public function CompileCSSFromSASS($sSassContent, $aImportPaths = [], $aVariables = []){
return utils::CompileCSSFromSASS($sSassContent, $aImportPaths, $aVariables);
}

View File

@@ -15,7 +15,7 @@
*
* You should have received a copy of the GNU Affero General Public License
*/
$approot-relative: "../../../../../" !default; // relative to env-***/branding/themes/***/main.css
$approot-relative: "../../../../" !default; // relative to env-***/branding/themes/***/main.css
// Base colors
$gray-base: #000 !default;

View File

@@ -1,9 +1,9 @@
/*
=== SIGNATURE BEGIN ===
{"variables":"d751713988987e9331980363e24189ce","stylesheets":{"css-variables":"1d4b4ae2a6fba3db101f8dd1cecab082","jqueryui":"78cfafc3524dac98e61fc2460918d4e5","main":"0dd837aeddc3f407c980e0b20f06dd4c"},"imports":[],"images":[]}
{"variables":"d751713988987e9331980363e24189ce","stylesheets":{"css-variables":"060e015a0f6f638009466e86ca2eb774","jqueryui":"ad705f77a5bce5a224b216a1cd701ae2","main":"0b81dc25d3df76326515b5b7946bc554"},"imports":[],"images":{"css\/ui-lightness\/images\/ui-icons_222222_256x240.png":"3a3c5468f484f07ac4a320d9e22acb8c","css\/ui-lightness\/images\/ui-bg_diagonals-thick_20_666666_40x40.png":"4429d568c67d8dfeb9040273ea0fb8c4","css\/ui-lightness\/images\/ui-icons_E87C1E_256x240.png":"7003dd36cb2aa032c8ec871ce4d4e03d","css\/ui-lightness\/images\/ui-icons_1c94c4_256x240.png":"dbd693dc8e0ef04e90a2f7ac7b390086","css\/ui-lightness\/images\/ui-icons_F26522_256x240.png":"16278ec0c07270be571f4c2e97fcc10c","css\/ui-lightness\/images\/ui-bg_diagonals-thick_18_b81900_40x40.png":"e460a66d4b3e093fc651e62a236267cb","css\/ui-lightness\/images\/ui-icons_ffffff_256x240.png":"41612b0f4a034424f8321c9f824a94da","css\/ui-lightness\/images\/ui-icons_ffd27a_256x240.png":"dda1b6f694b0d196aefc66a1d6d758f6","images\/actions_right.png":"31c8906bd25d27b83a0a2466bf903462","images\/ac-background.gif":"76135f3697b41a15aed787cfd77776c7","images\/green-square.gif":"16ea9a497d72f5e66e4e8ea9ae08024e","images\/tv-item.gif":"719fe2d4566108e73162fb8868d3778c","images\/tv-collapsable.gif":"63a3351ea0d580797c9b8c386aa4f48b","images\/tv-expandable.gif":"a2d1af4128e4a798a7f3390b12a28574","images\/tv-item-last.gif":"2ae7e1d9972ce71e5caa65a086bc5b7e","images\/tv-collapsable-last.gif":"71acaa9d7c2616e9e8b7131a75ca65da","images\/tv-expandable-last.gif":"9d51036b3a8102742709da66789fd0f7","images\/red-header.gif":"c73b8765f0c8c3c183cb6a0c2bb0ec69","images\/green-header.gif":"0e22a09bb8051b2a274b3427ede62e82","images\/orange-header.gif":"ce1f93f0af64431771b4cbd6c99c567b","images\/calendar.png":"ab56e59af3c96ca661821257d376465e","images\/truncated.png":"c6f91108afe8159d417b4dc556cd3b2a","images\/plus.gif":"f00e1e6e1161f48608bb2bbc79b9948c","images\/minus.gif":"6d77c0c0c2f86b6995d1cdf78274eaab","images\/full-screen.png":"b541fadd3f1563856a4b44aeebd9d563","images\/indicator.gif":"03ce3dcc84af110e9da8699a841e5200","images\/delete.png":"93c047549c31a270a037840277cf59d3","images\/bg.gif":"a315146ab814c73632480136576cd271","images\/desc.gif":"0f58b33929095ea17795dd53bbced5d9","images\/info-mini.png":"445c090ed777c5e6a08ac390fa896193","images\/ok.png":"f6973773335fd83d8d2875f9a3c925af","images\/error.png":"1af8a1041016f67669c5fd22dc88c82e","images\/eye-open-555.png":"9940f4e5b1248042c238e1924359fd5e","images\/eye-closed-555.png":"6ad3b0bae791bf61addc9d8ca80a642d","images\/eye-open-fff.png":"b7db2402d4d5c72314c25790a66150d4","images\/eye-closed-fff.png":"f9be7454dbb47b0e0bca3aa370ae7db5","images\/breadcrumb-separator.png":"1e7e50a8f573e230cf1e0f0399c516e8"}}
=== SIGNATURE END ===
*/
/*!
*/
/*!
* Copyright (C) 2013-2020 Combodo SARL
*
* This file is part of iTop.
@@ -97,7 +97,7 @@
background-repeat: no-repeat;
width: 16px;
height: 16px;
background-image: url("../../../../../css/ui-lightness/images/ui-icons_222222_256x240.png?v=v2.7.0-1");
background-image: url("../../../../css/ui-lightness/images/ui-icons_222222_256x240.png?v=1597416338");
filter: hue-rotate(0deg);
}
.ui-widget-icon-block {
@@ -111,7 +111,7 @@
left: 0;
width: 100%;
height: 100%;
background: #666666 url("../../../../../css/ui-lightness/images/ui-bg_diagonals-thick_20_666666_40x40.png?v=v2.7.0-1") 50% 50% repeat;
background: #666666 url("../../../../css/ui-lightness/images/ui-bg_diagonals-thick_20_666666_40x40.png?v=1597416338") 50% 50% repeat;
opacity: 0.5;
filter: Alpha(Opacity=50);
}
@@ -232,7 +232,7 @@
.ui-menu .ui-menu-item {
margin: 0;
cursor: pointer;
list-style-image: url("data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7?v=v2.7.0-1");
list-style-image: url("data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7?v=1597416338");
}
.ui-menu .ui-menu-item-wrapper {
position: relative;
@@ -302,7 +302,7 @@
color: #EA7D1E;
}
.ui-button:hover .ui-icon {
background-image: url("../../../../../css/ui-lightness/images/ui-icons_E87C1E_256x240.png?v=v2.7.0-1");
background-image: url("../../../../css/ui-lightness/images/ui-icons_E87C1E_256x240.png?v=1597416338");
}
.ui-button:active {
text-decoration: none;
@@ -312,7 +312,7 @@
color: #EA7D1E;
}
.ui-button:active .ui-icon {
background-image: url("../../../../../css/ui-lightness/images/ui-icons_E87C1E_256x240.png?v=v2.7.0-1");
background-image: url("../../../../css/ui-lightness/images/ui-icons_E87C1E_256x240.png?v=1597416338");
}
.ui-button:focus {
border: 1px solid #EA7D1E;
@@ -321,13 +321,13 @@
color: #EA7D1E;
}
.ui-button:focus .ui-icon {
background-image: url("../../../../../css/ui-lightness/images/ui-icons_E87C1E_256x240.png?v=v2.7.0-1");
background-image: url("../../../../css/ui-lightness/images/ui-icons_E87C1E_256x240.png?v=1597416338");
}
.ui-button .ui-state-highlight.ui-icon {
background-image: url("../../../../../css/ui-lightness/images/ui-icons_1c94c4_256x240.png?v=v2.7.0-1");
background-image: url("../../../../css/ui-lightness/images/ui-icons_1c94c4_256x240.png?v=1597416338");
}
.ui-button .ui-icon {
background-image: url("../../../../../css/ui-lightness/images/ui-icons_F26522_256x240.png?v=v2.7.0-1");
background-image: url("../../../../css/ui-lightness/images/ui-icons_F26522_256x240.png?v=1597416338");
}
.ui-button-icon-only {
width: 2em;
@@ -979,7 +979,7 @@ body .ui-tooltip {
}
.ui-widget-content .ui-state-default {
border: 1px solid #cccccc;
background: #f1f1f1;
background: #F1F1F1;
font-weight: bold;
color: #555555;
}
@@ -1011,7 +1011,7 @@ body .ui-tooltip {
}
.ui-widget-content .ui-state-error {
border: 1px solid #cd0a0a;
background: #b81900 url("../../../../../css/ui-lightness/images/ui-bg_diagonals-thick_18_b81900_40x40.png?v=v2.7.0-1") 50% 50% repeat;
background: #b81900 url("../../../../css/ui-lightness/images/ui-bg_diagonals-thick_18_b81900_40x40.png?v=1597416338") 50% 50% repeat;
color: #FFFFFF;
}
.ui-widget-content .ui-state-error a {
@@ -1034,7 +1034,7 @@ body .ui-tooltip {
background-image: none;
}
.ui-widget-content .ui-icon {
background-image: url("../../../../../css/ui-lightness/images/ui-icons_222222_256x240.png?v=v2.7.0-1");
background-image: url("../../../../css/ui-lightness/images/ui-icons_222222_256x240.png?v=1597416338");
}
.ui-widget-header {
border: 1px solid #d56e14;
@@ -1047,7 +1047,7 @@ body .ui-tooltip {
}
.ui-widget-header .ui-state-default {
border: 1px solid #cccccc;
background: #f1f1f1;
background: #F1F1F1;
font-weight: bold;
color: #555555;
}
@@ -1079,7 +1079,7 @@ body .ui-tooltip {
}
.ui-widget-header .ui-state-error {
border: 1px solid #cd0a0a;
background: #b81900 url("../../../../../css/ui-lightness/images/ui-bg_diagonals-thick_18_b81900_40x40.png?v=v2.7.0-1") 50% 50% repeat;
background: #b81900 url("../../../../css/ui-lightness/images/ui-bg_diagonals-thick_18_b81900_40x40.png?v=1597416338") 50% 50% repeat;
color: #FFFFFF;
}
.ui-widget-header .ui-state-error a {
@@ -1102,11 +1102,11 @@ body .ui-tooltip {
background-image: none;
}
.ui-widget-header .ui-icon {
background-image: url("../../../../../css/ui-lightness/images/ui-icons_ffffff_256x240.png?v=v2.7.0-1");
background-image: url("../../../../css/ui-lightness/images/ui-icons_ffffff_256x240.png?v=1597416338");
}
.ui-state-default {
border: 1px solid #cccccc;
background: #f1f1f1;
background: #F1F1F1;
font-weight: bold;
color: #555555;
}
@@ -1123,7 +1123,7 @@ body .ui-tooltip {
text-decoration: none;
}
.ui-state-default .ui-icon {
background-image: url("../../../../../css/ui-lightness/images/ui-icons_F26522_256x240.png?v=v2.7.0-1");
background-image: url("../../../../css/ui-lightness/images/ui-icons_F26522_256x240.png?v=1597416338");
}
html .ui-button.ui-state-disabled:hover {
border: 1px solid #cccccc;
@@ -1186,7 +1186,7 @@ a:visited.ui-button {
text-decoration: none;
}
.ui-state-hover .ui-icon {
background-image: url("../../../../../css/ui-lightness/images/ui-icons_E87C1E_256x240.png?v=v2.7.0-1");
background-image: url("../../../../css/ui-lightness/images/ui-icons_E87C1E_256x240.png?v=1597416338");
}
.ui-state-focus {
border: 1px solid #EA7D1E;
@@ -1211,7 +1211,7 @@ a:visited.ui-button {
text-decoration: none;
}
.ui-state-focus .ui-icon {
background-image: url("../../../../../css/ui-lightness/images/ui-icons_E87C1E_256x240.png?v=v2.7.0-1");
background-image: url("../../../../css/ui-lightness/images/ui-icons_E87C1E_256x240.png?v=1597416338");
}
.ui-visual-focus {
box-shadow: 0 0 3px 1px #5e9ed6;
@@ -1239,7 +1239,7 @@ a:visited.ui-button {
text-decoration: none;
}
.ui-state-active .ui-icon {
background-image: url("../../../../../css/ui-lightness/images/ui-icons_E87C1E_256x240.png?v=v2.7.0-1");
background-image: url("../../../../css/ui-lightness/images/ui-icons_E87C1E_256x240.png?v=1597416338");
}
.ui-button.ui-state-active:hover {
border: 1px solid #EA7D1E;
@@ -1260,7 +1260,7 @@ a:visited.ui-button {
color: #363636;
}
.ui-state-highlight .ui-icon {
background-image: url("../../../../../css/ui-lightness/images/ui-icons_1c94c4_256x240.png?v=v2.7.0-1");
background-image: url("../../../../css/ui-lightness/images/ui-icons_1c94c4_256x240.png?v=1597416338");
}
.ui-state-checked {
border: 1px solid #fed22f;
@@ -1268,20 +1268,20 @@ a:visited.ui-button {
}
.ui-state-error {
border: 1px solid #cd0a0a;
background: #b81900 url("../../../../../css/ui-lightness/images/ui-bg_diagonals-thick_18_b81900_40x40.png?v=v2.7.0-1") 50% 50% repeat;
background: #b81900 url("../../../../css/ui-lightness/images/ui-bg_diagonals-thick_18_b81900_40x40.png?v=1597416338") 50% 50% repeat;
color: #FFFFFF;
}
.ui-state-error a {
color: #FFFFFF;
}
.ui-state-error .ui-icon {
background-image: url("../../../../../css/ui-lightness/images/ui-icons_ffd27a_256x240.png?v=v2.7.0-1");
background-image: url("../../../../css/ui-lightness/images/ui-icons_ffd27a_256x240.png?v=1597416338");
}
.ui-state-error-text {
color: #FFFFFF;
}
.ui-state-error-text .ui-icon {
background-image: url("../../../../../css/ui-lightness/images/ui-icons_ffd27a_256x240.png?v=v2.7.0-1");
background-image: url("../../../../css/ui-lightness/images/ui-icons_ffd27a_256x240.png?v=1597416338");
}
.ui-priority-primary {
font-weight: bold;
@@ -1989,7 +1989,7 @@ table.listResults > tbody > tr:hover > * {
visibility: hidden;
}
.edit-image .view-image.dirty.compat {
background-image: url("../../../../../css/ui-lightness/images/ui-bg_diagonals-thick_20_666666_40x40.png?v=v2.7.0-1");
background-image: url("../../../../css/ui-lightness/images/ui-bg_diagonals-thick_20_666666_40x40.png?v=1597416338");
}
.edit-image .view-image.dirty.compat img {
opacity: 0.3;
@@ -2012,7 +2012,7 @@ table.listResults > tbody > tr:hover > * {
opacity: 0.3;
}
.edit-image .edit-buttons .button .ui-icon {
background-image: url("../../../../../css/ui-lightness/images/ui-icons_ffffff_256x240.png?v=v2.7.0-1");
background-image: url("../../../../css/ui-lightness/images/ui-icons_ffffff_256x240.png?v=1597416338");
}
.edit-image .file-input {
display: block;
@@ -2239,7 +2239,7 @@ a.small_action {
background: #EA7D1E;
}
.actions_details span {
background: url("../../../../../images/actions_right.png?v=v2.7.0-1") no-repeat right;
background: url("../../../../images/actions_right.png?v=1597416338") no-repeat right;
color: #fff;
font-weight: bold;
padding-top: 2px;
@@ -2262,7 +2262,7 @@ input.textSearch {
}
.ac_input {
border: 1px solid #7f9db9;
background: #fff url("../../../../../images/ac-background.gif?v=v2.7.0-1") no-repeat right;
background: #fff url("../../../../images/ac-background.gif?v=1597416338") no-repeat right;
}
/* By Rom */
.csvimport_createobj {
@@ -2317,7 +2317,7 @@ input.textSearch {
noborder-top: 1px solid #8b8b8b;
padding: 4px 0px 0px 16px;
font-size: 8pt;
background: url("../../../../../images/green-square.gif?v=v2.7.0-1") no-repeat bottom left;
background: url("../../../../images/green-square.gif?v=1597416338") no-repeat bottom left;
color: #83b217;
font-weight: bold;
text-decoration: none;
@@ -2394,22 +2394,22 @@ td a.CollapsibleLabel.open::before, a.CollapsibleLabel.open::before {
margin-top: -8px;
}
.notreeview li {
background: url("../../../../../images/tv-item.gif?v=v2.7.0-1") 0 0 no-repeat;
background: url("../../../../images/tv-item.gif?v=1597416338") 0 0 no-repeat;
}
.notreeview .collapsable {
background-image: url("../../../../../images/tv-collapsable.gif?v=v2.7.0-1");
background-image: url("../../../../images/tv-collapsable.gif?v=1597416338");
}
.notreeview .expandable {
background-image: url("../../../../../images/tv-expandable.gif?v=v2.7.0-1");
background-image: url("../../../../images/tv-expandable.gif?v=1597416338");
}
.notreeview .last {
background-image: url("../../../../../images/tv-item-last.gif?v=v2.7.0-1");
background-image: url("../../../../images/tv-item-last.gif?v=1597416338");
}
.notreeview .lastCollapsable {
background-image: url("../../../../../images/tv-collapsable-last.gif?v=v2.7.0-1");
background-image: url("../../../../images/tv-collapsable-last.gif?v=1597416338");
}
.notreeview .lastExpandable {
background-image: url("../../../../../images/tv-expandable-last.gif?v=v2.7.0-1");
background-image: url("../../../../images/tv-expandable-last.gif?v=1597416338");
}
#OrganizationSelection {
padding: 5px 0px 16px 20px;
@@ -2584,7 +2584,7 @@ hr.menu-separator {
color: #000;
}
th.red {
background: url("../../../../../images/red-header.gif?v=v2.7.0-1") bottom left repeat-x;
background: url("../../../../images/red-header.gif?v=1597416338") bottom left repeat-x;
color: #000;
}
.green {
@@ -2592,7 +2592,7 @@ th.red {
color: #000;
}
th.green {
background: url("../../../../../images/green-header.gif?v=v2.7.0-1") bottom left repeat-x;
background: url("../../../../images/green-header.gif?v=1597416338") bottom left repeat-x;
color: #000;
}
.orange {
@@ -2600,7 +2600,7 @@ th.green {
color: #000;
}
th.orange {
background: url("../../../../../images/orange-header.gif?v=v2.7.0-1") bottom left repeat-x;
background: url("../../../../images/orange-header.gif?v=1597416338") bottom left repeat-x;
color: #000;
}
/* For Date Picker: Creates a little calendar icon
@@ -2615,7 +2615,7 @@ td a.dp-choose-date, a.dp-choose-date, td a.dp-choose-date:hover, a.dp-choose-da
display: block;
text-indent: -2000px;
overflow: hidden;
background: url("../../../../../images/calendar.png?v=v2.7.0-1") no-repeat;
background: url("../../../../images/calendar.png?v=1597416338") no-repeat;
}
td a.dp-choose-date.dp-disabled, a.dp-choose-date.dp-disabled {
background-position: 0 -20px;
@@ -3282,19 +3282,19 @@ input.dp-applied {
}
/* Beware: IE6 does not support multiple selector with multiple classes, only the last class is used */
table.listResults tr.odd td.truncated, table.listResults tr td.truncated, .wizContainer table.listResults tr.odd td.truncated, .wizContainer table.listResults tr td.truncated {
background: url("../../../../../images/truncated.png?v=v2.7.0-1") bottom repeat-x;
background: url("../../../../images/truncated.png?v=1597416338") bottom repeat-x;
}
/* Beware: IE6 does not support multiple selector with multiple classes, only the last class is used */
table.listResults tr.even td.truncated, .wizContainer table.listResults tr.even td.truncated {
background: #f9f9f1 url("../../../../../images/truncated.png?v=v2.7.0-1") bottom repeat-x;
background: #f9f9f1 url("../../../../images/truncated.png?v=1597416338") bottom repeat-x;
}
/* Beware: IE6 does not support multiple selector with multiple classes, only the last class is used */
table.listResults tr.even td.hover.truncated, .wizContainer table.listResults tr.even td.hover.truncated {
background: #fdf5d0 url("../../../../../images/truncated.png?v=v2.7.0-1") bottom repeat-x;
background: #fdf5d0 url("../../../../images/truncated.png?v=1597416338") bottom repeat-x;
}
/* Beware: IE6 does not support multiple selector with multiple classes, only the last class is used */
table.listResults tr.odd td.hover.truncated, table.listResults tr td.hover.truncated, .wizContainer table.listResults tr.odd td.hover.truncated, .wizContainer table.listResults tr td.hover.truncated {
background: #fdf5d0 url("../../../../../images/truncated.png?v=v2.7.0-1") bottom repeat-x;
background: #fdf5d0 url("../../../../images/truncated.png?v=1597416338") bottom repeat-x;
}
table.listResults.truncated {
border-bottom: 0;
@@ -3402,7 +3402,7 @@ div#logo {
div#logo div {
height: 88px;
width: 244px;
background: url("../../../../../images/itop-logo-2.png?v=v2.7.0-1") left no-repeat;
background: url("../../../../images/itop-logo-2.png?v=1597416338") left no-repeat;
}
#left-pane .ui-layout-north {
overflow: hidden;
@@ -3551,7 +3551,7 @@ span.ui-icon {
margin: 0 2px;
}
.ui-layout-button-pin-down {
background: url("../../../../../images/splitter-bkg.png?v=v2.7.0-1") transparent;
background: url("../../../../images/splitter-bkg.png?v=1597416338") transparent;
width: 16px;
background-position: -144px -144px;
}
@@ -3688,13 +3688,13 @@ span.form_validation {
.caselog_header {
padding: 3px;
border-top: 1px solid #fff;
background: #ddd url("../../../../../images/plus.gif?v=v2.7.0-1") left no-repeat;
background: #ddd url("../../../../images/plus.gif?v=1597416338") left no-repeat;
padding-left: 16px;
cursor: pointer;
width: 100%;
}
.caselog_header.open {
background: #ddd url("../../../../../images/minus.gif?v=v2.7.0-1") left no-repeat;
background: #ddd url("../../../../images/minus.gif?v=1597416338") left no-repeat;
}
.caselog_entry, .caselog_entry_html {
overflow-x: auto;
@@ -3866,7 +3866,7 @@ fieldset .details > .field_container {
height: 15px;
border: 1px #A6A6A6 solid;
cursor: pointer;
background-image: url("../../../../../images/full-screen.png?v=v2.7.0-1");
background-image: url("../../../../images/full-screen.png?v=1597416338");
background-repeat: no-repeat;
background-position: center center;
background-size: 98%;
@@ -3913,7 +3913,7 @@ fieldset .details > .field_container {
padding: 2px;
}
.field_container > div > div.field_value .attribute-edit .field_input_zone.field_input_document .button .ui-icon {
background-image: url("../../../../../css/ui-lightness/images/ui-icons_ffffff_256x240.png?v=v2.7.0-1");
background-image: url("../../../../css/ui-lightness/images/ui-icons_ffffff_256x240.png?v=1597416338");
background-color: #EA7D1E;
}
.field_container > div > div.field_value .attribute-edit .field_input_zone.field_input_image input {
@@ -3980,7 +3980,7 @@ fieldset .details > .field_container {
height: 15px;
border: 1px #A6A6A6 solid;
cursor: pointer;
background-image: url("../../../../../images/full-screen.png?v=v2.7.0-1");
background-image: url("../../../../images/full-screen.png?v=1597416338");
background-repeat: no-repeat;
background-position: center center;
background-size: 98%;
@@ -4045,7 +4045,7 @@ fieldset .details > .field_container {
padding-left: 0.4em;
}
.ac_dlg_loading {
background: white url("../../../../../images/indicator.gif?v=v2.7.0-1") right center no-repeat;
background: white url("../../../../images/indicator.gif?v=1597416338") right center no-repeat;
}
table.pagination {
display: inline-block;
@@ -4112,10 +4112,10 @@ select#org_id {
cursor: not-allowed;
}
.dragHover {
background: url("../../../../../css/ui-lightness/images/ui-bg_diagonals-thick_20_666666_40x40.png?v=v2.7.0-1");
background: url("../../../../css/ui-lightness/images/ui-bg_diagonals-thick_20_666666_40x40.png?v=1597416338");
}
.edit_mode .dashlet {
background: url("../../../../../css/ui-lightness/images/ui-bg_diagonals-thick_20_666666_40x40.png?v=v2.7.0-1");
background: url("../../../../css/ui-lightness/images/ui-bg_diagonals-thick_20_666666_40x40.png?v=1597416338");
padding: 5px;
margin: 0;
position: relative;
@@ -4160,7 +4160,7 @@ table.prop_table {
top: 0;
right: 0;
z-index: 10;
background: transparent url("../../../../../images/delete.png?v=v2.7.0-1") no-repeat center;
background: transparent url("../../../../images/delete.png?v=1597416338") no-repeat center;
}
td.prop_value {
text-align: left;
@@ -4189,7 +4189,7 @@ td.prop_icon {
font-size: 16px;
text-decoration: none;
}
.dashlet-content .display_block {
.main_header h1 {
text-align: left;
}
.dashlet-unknown .dashlet-content, .dashlet-proxy .dashlet-content {
@@ -4352,13 +4352,13 @@ a.summary, a.summary:hover {
height: 12px;
}
.sort_none {
background: url("../../../../../images/bg.gif?v=v2.7.0-1") no-repeat center;
background: url("../../../../images/bg.gif?v=1597416338") no-repeat center;
}
.sort_asc {
background: url("../../../../../images/desc.gif?v=v2.7.0-1") no-repeat center;
background: url("../../../../images/desc.gif?v=1597416338") no-repeat center;
}
.sort_desc {
background: url("../../../../../images/asc.gif?v=v2.7.0-1") no-repeat center;
background: url("../../../../images/asc.gif?v=1597416338") no-repeat center;
}
.sort_hidden {
display: none;
@@ -4381,23 +4381,23 @@ a.summary, a.summary:hover {
}
.message_info {
border: 1px solid #993;
background: url("../../../../../images/info-mini.png?v=v2.7.0-1") 1em 1em no-repeat #ffc;
background: url("../../../../images/info-mini.png?v=1597416338") 1em 1em no-repeat #ffc;
padding-left: 3em;
}
.message_ok {
border: 1px solid #393;
background: url("../../../../../images/ok.png?v=v2.7.0-1") 1em 1em no-repeat #cfc;
background: url("../../../../images/ok.png?v=1597416338") 1em 1em no-repeat #cfc;
padding-left: 3em;
}
.message_warning {
border: 1px solid #ec9800;
background: url("../../../../../images/error.png?v=v2.7.0-1") 1em 1em no-repeat #ffd78d;
background: url("../../../../images/error.png?v=1597416338") 1em 1em no-repeat #ffd78d;
color: #000;
padding-left: 3em;
}
.message_error {
border: 1px solid #933;
background: url("../../../../../images/error.png?v=v2.7.0-1") 1em 1em no-repeat #fcc;
background: url("../../../../images/error.png?v=1597416338") 1em 1em no-repeat #fcc;
padding-left: 3em;
}
.fg-menu a img {
@@ -4528,18 +4528,18 @@ div.explain-printable {
}
#hiddeable_chapters .ui-tabs .ui-tabs-nav li.hideable-chapter span {
padding-left: 20px;
background: url("../../../../../images/eye-open-555.png?v=v2.7.0-1") 2px center no-repeat;
background: url("../../../../images/eye-open-555.png?v=1597416338") 2px center no-repeat;
}
#hiddeable_chapters .ui-tabs .ui-tabs-nav li.hideable-chapter.strikethrough span {
text-decoration: line-through;
background: url("../../../../../images/eye-closed-555.png?v=v2.7.0-1") 2px center no-repeat;
background: url("../../../../images/eye-closed-555.png?v=1597416338") 2px center no-repeat;
}
.printable-version legend {
padding-left: 26px;
background: #1c94c4 url("../../../../../images/eye-open-fff.png?v=v2.7.0-1") 8px center no-repeat;
background: #1c94c4 url("../../../../images/eye-open-fff.png?v=1597416338") 8px center no-repeat;
}
.printable-version .strikethrough legend {
background: #1c94c4 url("../../../../../images/eye-closed-fff.png?v=v2.7.0-1") 8px center no-repeat;
background: #1c94c4 url("../../../../images/eye-closed-fff.png?v=1597416338") 8px center no-repeat;
}
.printable-version fieldset.strikethrough span {
display: none;
@@ -4612,7 +4612,7 @@ span.search-button, span.refresh-button {
cursor: pointer;
width: 16px;
height: 16px;
background-image: url("../../../../../css/ui-lightness/images/ui-icons_222222_256x240.png?v=v2.7.0-1");
background-image: url("../../../../css/ui-lightness/images/ui-icons_222222_256x240.png?v=1597416338");
background-position: -16px -192px;
}
.history_entry_truncated .history_truncated_toggler {
@@ -4697,7 +4697,7 @@ span.search-button, span.refresh-button {
#itop-breadcrumb .breadcrumb-item a::after {
content: '';
position: absolute;
background-image: url("../../../../../images/breadcrumb-separator.png?v=v2.7.0-1");
background-image: url("../../../../images/breadcrumb-separator.png?v=1597416338");
background-repeat: no-repeat;
width: 8px;
height: 16px;
@@ -5215,3 +5215,12 @@ input:checked + .slider:before {
.attachmentsList > tbody > tr > td[role="delete"] {
text-align: center;
}
.ui-dialog .ui-dialog-content .treecontrol {
padding-bottom: 0.3em;
padding-left: 0.2em;
margin-top: -0.3em;
padding-top: 0;
}
.ui-dialog .ui-dialog-content .treecontrol a {
font-size: small;
}

View File

@@ -1,9 +1,9 @@
/*
=== SIGNATURE BEGIN ===
{"variables":"8cfe86f2c55d8eff36d57eb4e83d89f1","stylesheets":{"css-variables":"1d4b4ae2a6fba3db101f8dd1cecab082","jqueryui":"78cfafc3524dac98e61fc2460918d4e5","main":"0dd837aeddc3f407c980e0b20f06dd4c","environment-banner":"3de3ffb8232b9a649e912b570a64bf5d"},"imports":[],"images":[]}
{"variables":"8cfe86f2c55d8eff36d57eb4e83d89f1","stylesheets":{"css-variables":"060e015a0f6f638009466e86ca2eb774","jqueryui":"ad705f77a5bce5a224b216a1cd701ae2","main":"0b81dc25d3df76326515b5b7946bc554","environment-banner":"3de3ffb8232b9a649e912b570a64bf5d"},"imports":[],"images":{"css\/ui-lightness\/images\/ui-icons_222222_256x240.png":"3a3c5468f484f07ac4a320d9e22acb8c","css\/ui-lightness\/images\/ui-bg_diagonals-thick_20_666666_40x40.png":"4429d568c67d8dfeb9040273ea0fb8c4","css\/ui-lightness\/images\/ui-icons_E87C1E_256x240.png":"7003dd36cb2aa032c8ec871ce4d4e03d","css\/ui-lightness\/images\/ui-icons_1c94c4_256x240.png":"dbd693dc8e0ef04e90a2f7ac7b390086","css\/ui-lightness\/images\/ui-icons_F26522_256x240.png":"16278ec0c07270be571f4c2e97fcc10c","css\/ui-lightness\/images\/ui-bg_diagonals-thick_18_b81900_40x40.png":"e460a66d4b3e093fc651e62a236267cb","css\/ui-lightness\/images\/ui-icons_ffffff_256x240.png":"41612b0f4a034424f8321c9f824a94da","css\/ui-lightness\/images\/ui-icons_ffd27a_256x240.png":"dda1b6f694b0d196aefc66a1d6d758f6","images\/actions_right.png":"31c8906bd25d27b83a0a2466bf903462","images\/ac-background.gif":"76135f3697b41a15aed787cfd77776c7","images\/green-square.gif":"16ea9a497d72f5e66e4e8ea9ae08024e","images\/tv-item.gif":"719fe2d4566108e73162fb8868d3778c","images\/tv-collapsable.gif":"63a3351ea0d580797c9b8c386aa4f48b","images\/tv-expandable.gif":"a2d1af4128e4a798a7f3390b12a28574","images\/tv-item-last.gif":"2ae7e1d9972ce71e5caa65a086bc5b7e","images\/tv-collapsable-last.gif":"71acaa9d7c2616e9e8b7131a75ca65da","images\/tv-expandable-last.gif":"9d51036b3a8102742709da66789fd0f7","images\/red-header.gif":"c73b8765f0c8c3c183cb6a0c2bb0ec69","images\/green-header.gif":"0e22a09bb8051b2a274b3427ede62e82","images\/orange-header.gif":"ce1f93f0af64431771b4cbd6c99c567b","images\/calendar.png":"ab56e59af3c96ca661821257d376465e","images\/truncated.png":"c6f91108afe8159d417b4dc556cd3b2a","images\/plus.gif":"f00e1e6e1161f48608bb2bbc79b9948c","images\/minus.gif":"6d77c0c0c2f86b6995d1cdf78274eaab","images\/full-screen.png":"b541fadd3f1563856a4b44aeebd9d563","images\/indicator.gif":"03ce3dcc84af110e9da8699a841e5200","images\/delete.png":"93c047549c31a270a037840277cf59d3","images\/bg.gif":"a315146ab814c73632480136576cd271","images\/desc.gif":"0f58b33929095ea17795dd53bbced5d9","images\/info-mini.png":"445c090ed777c5e6a08ac390fa896193","images\/ok.png":"f6973773335fd83d8d2875f9a3c925af","images\/error.png":"1af8a1041016f67669c5fd22dc88c82e","images\/eye-open-555.png":"9940f4e5b1248042c238e1924359fd5e","images\/eye-closed-555.png":"6ad3b0bae791bf61addc9d8ca80a642d","images\/eye-open-fff.png":"b7db2402d4d5c72314c25790a66150d4","images\/eye-closed-fff.png":"f9be7454dbb47b0e0bca3aa370ae7db5","images\/breadcrumb-separator.png":"1e7e50a8f573e230cf1e0f0399c516e8"}}
=== SIGNATURE END ===
*/
/*!
*/
/*!
* Copyright (C) 2013-2020 Combodo SARL
*
* This file is part of iTop.
@@ -97,7 +97,7 @@
background-repeat: no-repeat;
width: 16px;
height: 16px;
background-image: url("../../../../../css/ui-lightness/images/ui-icons_222222_256x240.png?v=v2.7.0-1");
background-image: url("../../../../css/ui-lightness/images/ui-icons_222222_256x240.png?v=1597416338");
filter: hue-rotate(0deg);
}
.ui-widget-icon-block {
@@ -111,7 +111,7 @@
left: 0;
width: 100%;
height: 100%;
background: #666666 url("../../../../../css/ui-lightness/images/ui-bg_diagonals-thick_20_666666_40x40.png?v=v2.7.0-1") 50% 50% repeat;
background: #666666 url("../../../../css/ui-lightness/images/ui-bg_diagonals-thick_20_666666_40x40.png?v=1597416338") 50% 50% repeat;
opacity: 0.5;
filter: Alpha(Opacity=50);
}
@@ -232,7 +232,7 @@
.ui-menu .ui-menu-item {
margin: 0;
cursor: pointer;
list-style-image: url("data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7?v=v2.7.0-1");
list-style-image: url("data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7?v=1597416338");
}
.ui-menu .ui-menu-item-wrapper {
position: relative;
@@ -302,7 +302,7 @@
color: #EA7D1E;
}
.ui-button:hover .ui-icon {
background-image: url("../../../../../css/ui-lightness/images/ui-icons_E87C1E_256x240.png?v=v2.7.0-1");
background-image: url("../../../../css/ui-lightness/images/ui-icons_E87C1E_256x240.png?v=1597416338");
}
.ui-button:active {
text-decoration: none;
@@ -312,7 +312,7 @@
color: #EA7D1E;
}
.ui-button:active .ui-icon {
background-image: url("../../../../../css/ui-lightness/images/ui-icons_E87C1E_256x240.png?v=v2.7.0-1");
background-image: url("../../../../css/ui-lightness/images/ui-icons_E87C1E_256x240.png?v=1597416338");
}
.ui-button:focus {
border: 1px solid #EA7D1E;
@@ -321,13 +321,13 @@
color: #EA7D1E;
}
.ui-button:focus .ui-icon {
background-image: url("../../../../../css/ui-lightness/images/ui-icons_E87C1E_256x240.png?v=v2.7.0-1");
background-image: url("../../../../css/ui-lightness/images/ui-icons_E87C1E_256x240.png?v=1597416338");
}
.ui-button .ui-state-highlight.ui-icon {
background-image: url("../../../../../css/ui-lightness/images/ui-icons_1c94c4_256x240.png?v=v2.7.0-1");
background-image: url("../../../../css/ui-lightness/images/ui-icons_1c94c4_256x240.png?v=1597416338");
}
.ui-button .ui-icon {
background-image: url("../../../../../css/ui-lightness/images/ui-icons_F26522_256x240.png?v=v2.7.0-1");
background-image: url("../../../../css/ui-lightness/images/ui-icons_F26522_256x240.png?v=1597416338");
}
.ui-button-icon-only {
width: 2em;
@@ -979,7 +979,7 @@ body .ui-tooltip {
}
.ui-widget-content .ui-state-default {
border: 1px solid #cccccc;
background: #f1f1f1;
background: #F1F1F1;
font-weight: bold;
color: #555555;
}
@@ -1011,7 +1011,7 @@ body .ui-tooltip {
}
.ui-widget-content .ui-state-error {
border: 1px solid #cd0a0a;
background: #b81900 url("../../../../../css/ui-lightness/images/ui-bg_diagonals-thick_18_b81900_40x40.png?v=v2.7.0-1") 50% 50% repeat;
background: #b81900 url("../../../../css/ui-lightness/images/ui-bg_diagonals-thick_18_b81900_40x40.png?v=1597416338") 50% 50% repeat;
color: #FFFFFF;
}
.ui-widget-content .ui-state-error a {
@@ -1034,7 +1034,7 @@ body .ui-tooltip {
background-image: none;
}
.ui-widget-content .ui-icon {
background-image: url("../../../../../css/ui-lightness/images/ui-icons_222222_256x240.png?v=v2.7.0-1");
background-image: url("../../../../css/ui-lightness/images/ui-icons_222222_256x240.png?v=1597416338");
}
.ui-widget-header {
border: 1px solid #d56e14;
@@ -1047,7 +1047,7 @@ body .ui-tooltip {
}
.ui-widget-header .ui-state-default {
border: 1px solid #cccccc;
background: #f1f1f1;
background: #F1F1F1;
font-weight: bold;
color: #555555;
}
@@ -1079,7 +1079,7 @@ body .ui-tooltip {
}
.ui-widget-header .ui-state-error {
border: 1px solid #cd0a0a;
background: #b81900 url("../../../../../css/ui-lightness/images/ui-bg_diagonals-thick_18_b81900_40x40.png?v=v2.7.0-1") 50% 50% repeat;
background: #b81900 url("../../../../css/ui-lightness/images/ui-bg_diagonals-thick_18_b81900_40x40.png?v=1597416338") 50% 50% repeat;
color: #FFFFFF;
}
.ui-widget-header .ui-state-error a {
@@ -1102,11 +1102,11 @@ body .ui-tooltip {
background-image: none;
}
.ui-widget-header .ui-icon {
background-image: url("../../../../../css/ui-lightness/images/ui-icons_ffffff_256x240.png?v=v2.7.0-1");
background-image: url("../../../../css/ui-lightness/images/ui-icons_ffffff_256x240.png?v=1597416338");
}
.ui-state-default {
border: 1px solid #cccccc;
background: #f1f1f1;
background: #F1F1F1;
font-weight: bold;
color: #555555;
}
@@ -1123,7 +1123,7 @@ body .ui-tooltip {
text-decoration: none;
}
.ui-state-default .ui-icon {
background-image: url("../../../../../css/ui-lightness/images/ui-icons_F26522_256x240.png?v=v2.7.0-1");
background-image: url("../../../../css/ui-lightness/images/ui-icons_F26522_256x240.png?v=1597416338");
}
html .ui-button.ui-state-disabled:hover {
border: 1px solid #cccccc;
@@ -1186,7 +1186,7 @@ a:visited.ui-button {
text-decoration: none;
}
.ui-state-hover .ui-icon {
background-image: url("../../../../../css/ui-lightness/images/ui-icons_E87C1E_256x240.png?v=v2.7.0-1");
background-image: url("../../../../css/ui-lightness/images/ui-icons_E87C1E_256x240.png?v=1597416338");
}
.ui-state-focus {
border: 1px solid #EA7D1E;
@@ -1211,7 +1211,7 @@ a:visited.ui-button {
text-decoration: none;
}
.ui-state-focus .ui-icon {
background-image: url("../../../../../css/ui-lightness/images/ui-icons_E87C1E_256x240.png?v=v2.7.0-1");
background-image: url("../../../../css/ui-lightness/images/ui-icons_E87C1E_256x240.png?v=1597416338");
}
.ui-visual-focus {
box-shadow: 0 0 3px 1px #5e9ed6;
@@ -1239,7 +1239,7 @@ a:visited.ui-button {
text-decoration: none;
}
.ui-state-active .ui-icon {
background-image: url("../../../../../css/ui-lightness/images/ui-icons_E87C1E_256x240.png?v=v2.7.0-1");
background-image: url("../../../../css/ui-lightness/images/ui-icons_E87C1E_256x240.png?v=1597416338");
}
.ui-button.ui-state-active:hover {
border: 1px solid #EA7D1E;
@@ -1260,7 +1260,7 @@ a:visited.ui-button {
color: #363636;
}
.ui-state-highlight .ui-icon {
background-image: url("../../../../../css/ui-lightness/images/ui-icons_1c94c4_256x240.png?v=v2.7.0-1");
background-image: url("../../../../css/ui-lightness/images/ui-icons_1c94c4_256x240.png?v=1597416338");
}
.ui-state-checked {
border: 1px solid #fed22f;
@@ -1268,20 +1268,20 @@ a:visited.ui-button {
}
.ui-state-error {
border: 1px solid #cd0a0a;
background: #b81900 url("../../../../../css/ui-lightness/images/ui-bg_diagonals-thick_18_b81900_40x40.png?v=v2.7.0-1") 50% 50% repeat;
background: #b81900 url("../../../../css/ui-lightness/images/ui-bg_diagonals-thick_18_b81900_40x40.png?v=1597416338") 50% 50% repeat;
color: #FFFFFF;
}
.ui-state-error a {
color: #FFFFFF;
}
.ui-state-error .ui-icon {
background-image: url("../../../../../css/ui-lightness/images/ui-icons_ffd27a_256x240.png?v=v2.7.0-1");
background-image: url("../../../../css/ui-lightness/images/ui-icons_ffd27a_256x240.png?v=1597416338");
}
.ui-state-error-text {
color: #FFFFFF;
}
.ui-state-error-text .ui-icon {
background-image: url("../../../../../css/ui-lightness/images/ui-icons_ffd27a_256x240.png?v=v2.7.0-1");
background-image: url("../../../../css/ui-lightness/images/ui-icons_ffd27a_256x240.png?v=1597416338");
}
.ui-priority-primary {
font-weight: bold;
@@ -1989,7 +1989,7 @@ table.listResults > tbody > tr:hover > * {
visibility: hidden;
}
.edit-image .view-image.dirty.compat {
background-image: url("../../../../../css/ui-lightness/images/ui-bg_diagonals-thick_20_666666_40x40.png?v=v2.7.0-1");
background-image: url("../../../../css/ui-lightness/images/ui-bg_diagonals-thick_20_666666_40x40.png?v=1597416338");
}
.edit-image .view-image.dirty.compat img {
opacity: 0.3;
@@ -2012,7 +2012,7 @@ table.listResults > tbody > tr:hover > * {
opacity: 0.3;
}
.edit-image .edit-buttons .button .ui-icon {
background-image: url("../../../../../css/ui-lightness/images/ui-icons_ffffff_256x240.png?v=v2.7.0-1");
background-image: url("../../../../css/ui-lightness/images/ui-icons_ffffff_256x240.png?v=1597416338");
}
.edit-image .file-input {
display: block;
@@ -2239,7 +2239,7 @@ a.small_action {
background: #EA7D1E;
}
.actions_details span {
background: url("../../../../../images/actions_right.png?v=v2.7.0-1") no-repeat right;
background: url("../../../../images/actions_right.png?v=1597416338") no-repeat right;
color: #fff;
font-weight: bold;
padding-top: 2px;
@@ -2262,7 +2262,7 @@ input.textSearch {
}
.ac_input {
border: 1px solid #7f9db9;
background: #fff url("../../../../../images/ac-background.gif?v=v2.7.0-1") no-repeat right;
background: #fff url("../../../../images/ac-background.gif?v=1597416338") no-repeat right;
}
/* By Rom */
.csvimport_createobj {
@@ -2317,7 +2317,7 @@ input.textSearch {
noborder-top: 1px solid #8b8b8b;
padding: 4px 0px 0px 16px;
font-size: 8pt;
background: url("../../../../../images/green-square.gif?v=v2.7.0-1") no-repeat bottom left;
background: url("../../../../images/green-square.gif?v=1597416338") no-repeat bottom left;
color: #83b217;
font-weight: bold;
text-decoration: none;
@@ -2394,22 +2394,22 @@ td a.CollapsibleLabel.open::before, a.CollapsibleLabel.open::before {
margin-top: -8px;
}
.notreeview li {
background: url("../../../../../images/tv-item.gif?v=v2.7.0-1") 0 0 no-repeat;
background: url("../../../../images/tv-item.gif?v=1597416338") 0 0 no-repeat;
}
.notreeview .collapsable {
background-image: url("../../../../../images/tv-collapsable.gif?v=v2.7.0-1");
background-image: url("../../../../images/tv-collapsable.gif?v=1597416338");
}
.notreeview .expandable {
background-image: url("../../../../../images/tv-expandable.gif?v=v2.7.0-1");
background-image: url("../../../../images/tv-expandable.gif?v=1597416338");
}
.notreeview .last {
background-image: url("../../../../../images/tv-item-last.gif?v=v2.7.0-1");
background-image: url("../../../../images/tv-item-last.gif?v=1597416338");
}
.notreeview .lastCollapsable {
background-image: url("../../../../../images/tv-collapsable-last.gif?v=v2.7.0-1");
background-image: url("../../../../images/tv-collapsable-last.gif?v=1597416338");
}
.notreeview .lastExpandable {
background-image: url("../../../../../images/tv-expandable-last.gif?v=v2.7.0-1");
background-image: url("../../../../images/tv-expandable-last.gif?v=1597416338");
}
#OrganizationSelection {
padding: 5px 0px 16px 20px;
@@ -2584,7 +2584,7 @@ hr.menu-separator {
color: #000;
}
th.red {
background: url("../../../../../images/red-header.gif?v=v2.7.0-1") bottom left repeat-x;
background: url("../../../../images/red-header.gif?v=1597416338") bottom left repeat-x;
color: #000;
}
.green {
@@ -2592,7 +2592,7 @@ th.red {
color: #000;
}
th.green {
background: url("../../../../../images/green-header.gif?v=v2.7.0-1") bottom left repeat-x;
background: url("../../../../images/green-header.gif?v=1597416338") bottom left repeat-x;
color: #000;
}
.orange {
@@ -2600,7 +2600,7 @@ th.green {
color: #000;
}
th.orange {
background: url("../../../../../images/orange-header.gif?v=v2.7.0-1") bottom left repeat-x;
background: url("../../../../images/orange-header.gif?v=1597416338") bottom left repeat-x;
color: #000;
}
/* For Date Picker: Creates a little calendar icon
@@ -2615,7 +2615,7 @@ td a.dp-choose-date, a.dp-choose-date, td a.dp-choose-date:hover, a.dp-choose-da
display: block;
text-indent: -2000px;
overflow: hidden;
background: url("../../../../../images/calendar.png?v=v2.7.0-1") no-repeat;
background: url("../../../../images/calendar.png?v=1597416338") no-repeat;
}
td a.dp-choose-date.dp-disabled, a.dp-choose-date.dp-disabled {
background-position: 0 -20px;
@@ -3282,19 +3282,19 @@ input.dp-applied {
}
/* Beware: IE6 does not support multiple selector with multiple classes, only the last class is used */
table.listResults tr.odd td.truncated, table.listResults tr td.truncated, .wizContainer table.listResults tr.odd td.truncated, .wizContainer table.listResults tr td.truncated {
background: url("../../../../../images/truncated.png?v=v2.7.0-1") bottom repeat-x;
background: url("../../../../images/truncated.png?v=1597416338") bottom repeat-x;
}
/* Beware: IE6 does not support multiple selector with multiple classes, only the last class is used */
table.listResults tr.even td.truncated, .wizContainer table.listResults tr.even td.truncated {
background: #f9f9f1 url("../../../../../images/truncated.png?v=v2.7.0-1") bottom repeat-x;
background: #f9f9f1 url("../../../../images/truncated.png?v=1597416338") bottom repeat-x;
}
/* Beware: IE6 does not support multiple selector with multiple classes, only the last class is used */
table.listResults tr.even td.hover.truncated, .wizContainer table.listResults tr.even td.hover.truncated {
background: #fdf5d0 url("../../../../../images/truncated.png?v=v2.7.0-1") bottom repeat-x;
background: #fdf5d0 url("../../../../images/truncated.png?v=1597416338") bottom repeat-x;
}
/* Beware: IE6 does not support multiple selector with multiple classes, only the last class is used */
table.listResults tr.odd td.hover.truncated, table.listResults tr td.hover.truncated, .wizContainer table.listResults tr.odd td.hover.truncated, .wizContainer table.listResults tr td.hover.truncated {
background: #fdf5d0 url("../../../../../images/truncated.png?v=v2.7.0-1") bottom repeat-x;
background: #fdf5d0 url("../../../../images/truncated.png?v=1597416338") bottom repeat-x;
}
table.listResults.truncated {
border-bottom: 0;
@@ -3402,7 +3402,7 @@ div#logo {
div#logo div {
height: 88px;
width: 244px;
background: url("../../../../../images/itop-logo-2.png?v=v2.7.0-1") left no-repeat;
background: url("../../../../images/itop-logo-2.png?v=1597416338") left no-repeat;
}
#left-pane .ui-layout-north {
overflow: hidden;
@@ -3551,7 +3551,7 @@ span.ui-icon {
margin: 0 2px;
}
.ui-layout-button-pin-down {
background: url("../../../../../images/splitter-bkg.png?v=v2.7.0-1") transparent;
background: url("../../../../images/splitter-bkg.png?v=1597416338") transparent;
width: 16px;
background-position: -144px -144px;
}
@@ -3688,13 +3688,13 @@ span.form_validation {
.caselog_header {
padding: 3px;
border-top: 1px solid #fff;
background: #ddd url("../../../../../images/plus.gif?v=v2.7.0-1") left no-repeat;
background: #ddd url("../../../../images/plus.gif?v=1597416338") left no-repeat;
padding-left: 16px;
cursor: pointer;
width: 100%;
}
.caselog_header.open {
background: #ddd url("../../../../../images/minus.gif?v=v2.7.0-1") left no-repeat;
background: #ddd url("../../../../images/minus.gif?v=1597416338") left no-repeat;
}
.caselog_entry, .caselog_entry_html {
overflow-x: auto;
@@ -3866,7 +3866,7 @@ fieldset .details > .field_container {
height: 15px;
border: 1px #A6A6A6 solid;
cursor: pointer;
background-image: url("../../../../../images/full-screen.png?v=v2.7.0-1");
background-image: url("../../../../images/full-screen.png?v=1597416338");
background-repeat: no-repeat;
background-position: center center;
background-size: 98%;
@@ -3913,7 +3913,7 @@ fieldset .details > .field_container {
padding: 2px;
}
.field_container > div > div.field_value .attribute-edit .field_input_zone.field_input_document .button .ui-icon {
background-image: url("../../../../../css/ui-lightness/images/ui-icons_ffffff_256x240.png?v=v2.7.0-1");
background-image: url("../../../../css/ui-lightness/images/ui-icons_ffffff_256x240.png?v=1597416338");
background-color: #EA7D1E;
}
.field_container > div > div.field_value .attribute-edit .field_input_zone.field_input_image input {
@@ -3980,7 +3980,7 @@ fieldset .details > .field_container {
height: 15px;
border: 1px #A6A6A6 solid;
cursor: pointer;
background-image: url("../../../../../images/full-screen.png?v=v2.7.0-1");
background-image: url("../../../../images/full-screen.png?v=1597416338");
background-repeat: no-repeat;
background-position: center center;
background-size: 98%;
@@ -4045,7 +4045,7 @@ fieldset .details > .field_container {
padding-left: 0.4em;
}
.ac_dlg_loading {
background: white url("../../../../../images/indicator.gif?v=v2.7.0-1") right center no-repeat;
background: white url("../../../../images/indicator.gif?v=1597416338") right center no-repeat;
}
table.pagination {
display: inline-block;
@@ -4112,10 +4112,10 @@ select#org_id {
cursor: not-allowed;
}
.dragHover {
background: url("../../../../../css/ui-lightness/images/ui-bg_diagonals-thick_20_666666_40x40.png?v=v2.7.0-1");
background: url("../../../../css/ui-lightness/images/ui-bg_diagonals-thick_20_666666_40x40.png?v=1597416338");
}
.edit_mode .dashlet {
background: url("../../../../../css/ui-lightness/images/ui-bg_diagonals-thick_20_666666_40x40.png?v=v2.7.0-1");
background: url("../../../../css/ui-lightness/images/ui-bg_diagonals-thick_20_666666_40x40.png?v=1597416338");
padding: 5px;
margin: 0;
position: relative;
@@ -4160,7 +4160,7 @@ table.prop_table {
top: 0;
right: 0;
z-index: 10;
background: transparent url("../../../../../images/delete.png?v=v2.7.0-1") no-repeat center;
background: transparent url("../../../../images/delete.png?v=1597416338") no-repeat center;
}
td.prop_value {
text-align: left;
@@ -4189,7 +4189,7 @@ td.prop_icon {
font-size: 16px;
text-decoration: none;
}
.dashlet-content .display_block {
.main_header h1 {
text-align: left;
}
.dashlet-unknown .dashlet-content, .dashlet-proxy .dashlet-content {
@@ -4352,13 +4352,13 @@ a.summary, a.summary:hover {
height: 12px;
}
.sort_none {
background: url("../../../../../images/bg.gif?v=v2.7.0-1") no-repeat center;
background: url("../../../../images/bg.gif?v=1597416338") no-repeat center;
}
.sort_asc {
background: url("../../../../../images/desc.gif?v=v2.7.0-1") no-repeat center;
background: url("../../../../images/desc.gif?v=1597416338") no-repeat center;
}
.sort_desc {
background: url("../../../../../images/asc.gif?v=v2.7.0-1") no-repeat center;
background: url("../../../../images/asc.gif?v=1597416338") no-repeat center;
}
.sort_hidden {
display: none;
@@ -4381,23 +4381,23 @@ a.summary, a.summary:hover {
}
.message_info {
border: 1px solid #993;
background: url("../../../../../images/info-mini.png?v=v2.7.0-1") 1em 1em no-repeat #ffc;
background: url("../../../../images/info-mini.png?v=1597416338") 1em 1em no-repeat #ffc;
padding-left: 3em;
}
.message_ok {
border: 1px solid #393;
background: url("../../../../../images/ok.png?v=v2.7.0-1") 1em 1em no-repeat #cfc;
background: url("../../../../images/ok.png?v=1597416338") 1em 1em no-repeat #cfc;
padding-left: 3em;
}
.message_warning {
border: 1px solid #ec9800;
background: url("../../../../../images/error.png?v=v2.7.0-1") 1em 1em no-repeat #ffd78d;
background: url("../../../../images/error.png?v=1597416338") 1em 1em no-repeat #ffd78d;
color: #000;
padding-left: 3em;
}
.message_error {
border: 1px solid #933;
background: url("../../../../../images/error.png?v=v2.7.0-1") 1em 1em no-repeat #fcc;
background: url("../../../../images/error.png?v=1597416338") 1em 1em no-repeat #fcc;
padding-left: 3em;
}
.fg-menu a img {
@@ -4528,18 +4528,18 @@ div.explain-printable {
}
#hiddeable_chapters .ui-tabs .ui-tabs-nav li.hideable-chapter span {
padding-left: 20px;
background: url("../../../../../images/eye-open-555.png?v=v2.7.0-1") 2px center no-repeat;
background: url("../../../../images/eye-open-555.png?v=1597416338") 2px center no-repeat;
}
#hiddeable_chapters .ui-tabs .ui-tabs-nav li.hideable-chapter.strikethrough span {
text-decoration: line-through;
background: url("../../../../../images/eye-closed-555.png?v=v2.7.0-1") 2px center no-repeat;
background: url("../../../../images/eye-closed-555.png?v=1597416338") 2px center no-repeat;
}
.printable-version legend {
padding-left: 26px;
background: #1c94c4 url("../../../../../images/eye-open-fff.png?v=v2.7.0-1") 8px center no-repeat;
background: #1c94c4 url("../../../../images/eye-open-fff.png?v=1597416338") 8px center no-repeat;
}
.printable-version .strikethrough legend {
background: #1c94c4 url("../../../../../images/eye-closed-fff.png?v=v2.7.0-1") 8px center no-repeat;
background: #1c94c4 url("../../../../images/eye-closed-fff.png?v=1597416338") 8px center no-repeat;
}
.printable-version fieldset.strikethrough span {
display: none;
@@ -4612,7 +4612,7 @@ span.search-button, span.refresh-button {
cursor: pointer;
width: 16px;
height: 16px;
background-image: url("../../../../../css/ui-lightness/images/ui-icons_222222_256x240.png?v=v2.7.0-1");
background-image: url("../../../../css/ui-lightness/images/ui-icons_222222_256x240.png?v=1597416338");
background-position: -16px -192px;
}
.history_entry_truncated .history_truncated_toggler {
@@ -4697,7 +4697,7 @@ span.search-button, span.refresh-button {
#itop-breadcrumb .breadcrumb-item a::after {
content: '';
position: absolute;
background-image: url("../../../../../images/breadcrumb-separator.png?v=v2.7.0-1");
background-image: url("../../../../images/breadcrumb-separator.png?v=1597416338");
background-repeat: no-repeat;
width: 8px;
height: 16px;
@@ -5215,6 +5215,15 @@ input:checked + .slider:before {
.attachmentsList > tbody > tr > td[role="delete"] {
text-align: center;
}
.ui-dialog .ui-dialog-content .treecontrol {
padding-bottom: 0.3em;
padding-left: 0.2em;
margin-top: -0.3em;
padding-top: 0;
}
.ui-dialog .ui-dialog-content .treecontrol a {
font-size: small;
}
/*!
*
* * Copyright (C) 2013-2020 Combodo SARL

View File

@@ -75,7 +75,7 @@ class MFCompiler
$this->sMainPHPCode .= " * This file was automatically generated by the compiler on ".date('Y-m-d H:i:s')." -- DO NOT EDIT\n";
$this->sMainPHPCode .= " */\n";
$this->sMainPHPCode .= "\n";
$this->sCompilationTimeStamp = microtime(true);
$this->sCompilationTimeStamp = "".microtime(true);
$this->sMainPHPCode .= "define('COMPILATION_TIMESTAMP', '".$this->sCompilationTimeStamp."');\n";
$this->aSnippets = array();
$this->aRelations = array();
@@ -98,14 +98,6 @@ class MFCompiler
{
return $this->aLog;
}
/**
* @return mixed
*/
public function GetCompilationTimeStamp()
{
return $this->sCompilationTimeStamp;
}
/**
@@ -2769,7 +2761,15 @@ EOF;
{
$this->Log("Precompiled file not found: '$sPrecompiledFile'");
}
ThemeHandler::CompileTheme($sThemeId, $this->GetCompilationTimeStamp(), $aThemeParameters, $aImportsPaths, $sTempTargetDir);
$bHasCompiled = ThemeHandler::CompileTheme($sThemeId, true, $this->sCompilationTimeStamp, $aThemeParameters, $aImportsPaths, $sTempTargetDir);
$sInitialPrecompiledFilePath = APPROOT.'datamodels/2.x/'.$aThemeParameters['precompiled_stylesheet'];
if ($bHasCompiled && is_file($sInitialPrecompiledFilePath))
{
SetupLog::Info("Replacing precompiled file $sInitialPrecompiledFilePath for theme $sThemeId for next setup.");
copy($sThemeDir.'/main.css', $sInitialPrecompiledFilePath);
}
}
$this->Log(sprintf('Themes compilation took: %.3f ms for %d themes.', (microtime(true) - $fStart)*1000.0, count($aThemes)));
}

View File

@@ -12,11 +12,11 @@ class ThemeHandlerTest extends ItopTestCase
{
const PATTERN = '|\\\/var[^"]+testimages|';
private $compileCSSServiceMock;
private $cssPath;
private $jsonThemeParamFile;
private $tmpDir;
private $aDirsToCleanup=array();
private $oCompileCSSServiceMock;
private $sCssPath;
private $sJsonThemeParamFile;
private $sTmpDir;
private $aDirsToCleanup= [];
public function setUp()
{
@@ -24,21 +24,22 @@ class ThemeHandlerTest extends ItopTestCase
require_once(APPROOT.'application/themehandler.class.inc.php');
require_once(APPROOT.'setup/modelfactory.class.inc.php');
$this->compileCSSServiceMock = $this->createMock('CompileCSSService');
ThemeHandler::MockCompileCSSService($this->compileCSSServiceMock);
$this->oCompileCSSServiceMock = $this->createMock('CompileCSSService');
ThemeHandler::mockCompileCSSService($this->oCompileCSSServiceMock);
$this->tmpDir=$this->tmpdir();
$aDirsToCleanup[] = $this->tmpDir;
$this->sTmpDir=$this->tmpdir();
$aDirsToCleanup[] = $this->sTmpDir;
$this->recurseMkdir($this->tmpDir."/branding/themes/basque-red");
$this->cssPath = $this->tmpDir . '/branding/themes/basque-red/main.css';
$this->jsonThemeParamFile = $this->tmpDir . '/branding/themes/basque-red/theme-parameters.json';
$this->recurse_copy(APPROOT."/test/application/theme-handler/expected/css", $this->tmpDir."/branding/css");
$this->recurseMkdir($this->sTmpDir."/branding/themes/basque-red");
$this->sCssPath = $this->sTmpDir . '/branding/themes/basque-red/main.css';
$this->sJsonThemeParamFile = $this->sTmpDir . '/branding/themes/basque-red/theme-parameters.json';
$this->recurse_copy(APPROOT."/test/application/theme-handler/expected/css", $this->sTmpDir."/branding/css");
}
public function tearDown()
{
parent::tearDown();
foreach ($this->aDirsToCleanup as $dir)
{
$this->rrmdir($dir);
@@ -61,15 +62,15 @@ class ThemeHandlerTest extends ItopTestCase
}
function tmpdir() {
$tmpfile=tempnam(sys_get_temp_dir(),'');
if (file_exists($tmpfile))
$sTmpfile=tempnam(sys_get_temp_dir(),'');
if (file_exists($sTmpfile))
{
unlink($tmpfile);
unlink($sTmpfile);
}
mkdir($tmpfile);
if (is_dir($tmpfile))
mkdir($sTmpfile);
if (is_dir($sTmpfile))
{
return $tmpfile;
return $sTmpfile;
}
return sys_get_temp_dir();
@@ -93,83 +94,103 @@ class ThemeHandlerTest extends ItopTestCase
/**
* Test used to be notified by CI when precompiled styles are not up to date anymore in code repository.
*
* @param $xmlDataCusto
* @dataProvider providePrecompiledStyleSheets
* @param $sPrecompiledStylesheet
* @param $oTheme
*
* @throws \Exception
*/
public function testValidatePrecompiledStyles($xmlDataCusto)
public function testValidatePrecompiledStyles()
{
echo "=== datamodel custo: $xmlDataCusto\n";
$oDom = new MFDocument();
$oDom->load($xmlDataCusto);
/**DOMNodeList **/$oThemeNodes=$oDom->GetNodes("/itop_design/branding/themes/theme");
$this->assertNotNull($oThemeNodes);
$aErrors = [];
$aDataModelFiles=glob(dirname(__FILE__)."/../../datamodels/2.x/**/datamodel*.xml");
$aImportsPaths = [APPROOT.'datamodels'];
// Parsing themes from DM
foreach($oThemeNodes as $oTheme)
foreach ($aDataModelFiles as $sXmlDataCustoFilePath)
{
$sPrecompiledStylesheet = $oTheme->GetChildText('precompiled_stylesheet', '');
if (empty($sPrecompiledStylesheet))
if (is_file($sXmlDataCustoFilePath))
{
continue;
$sContent = file_get_contents($sXmlDataCustoFilePath);
if (strpos($sContent, "precompiled_stylesheet") !== false)
{
$oDom = new MFDocument();
$oDom->load($sXmlDataCustoFilePath);
$oThemeNodes = $oDom->GetNodes("/itop_design/branding/themes/theme");
// Parsing themes from DM
foreach ($oThemeNodes as $oTheme)
{
/** @var \MFElement $oTheme */
$sPrecompiledStylesheetUri = $oTheme->GetChildText('precompiled_stylesheet', '');
if (empty($sPrecompiledStylesheetUri))
{
continue;
}
$sThemeId = $oTheme->getAttribute('id');
echo "=== theme: $sThemeId ===\n";
$sPreCompiledSig = ThemeHandler::GetSignature(dirname(__FILE__)."/../../datamodels/2.x/".$sPrecompiledStylesheetUri);
echo " precompiled signature: $sPreCompiledSig\n";
if (empty($sPreCompiledSig))
{
$aErrors[] = "Signature in precompiled theme '".$sThemeId."' is not retrievable (cf precompiledsheet $sPrecompiledStylesheetUri / datamodel $sXmlDataCustoFilePath)";
continue;
}
$aThemeParameters = [
'variables' => [],
'imports' => [],
'stylesheets' => [],
'precompiled_stylesheet' => $sPrecompiledStylesheetUri,
];
/** @var \DOMNodeList $oVariables */
$oVariables = $oTheme->GetNodes('variables/variable');
foreach ($oVariables as $oVariable)
{
$sVariableId = $oVariable->getAttribute('id');
$aThemeParameters['variables'][$sVariableId] = $oVariable->GetText();
}
$aStylesheetFiles = [];
/** @var \DOMNodeList $oImports */
$oImports = $oTheme->GetNodes('imports/import');
foreach ($oImports as $oImport)
{
$sImportId = $oImport->getAttribute('id');
$aThemeParameters['imports'][$sImportId] = $oImport->GetText();
$sFile = ThemeHandler::FindStylesheetFile($oImport->GetText(), $aImportsPaths);
$aStylesheetFiles[] = $sFile;
}
/** @var \DOMNodeList $oStylesheets */
$oStylesheets = $oTheme->GetNodes('stylesheets/stylesheet');
foreach ($oStylesheets as $oStylesheet)
{
$sStylesheetId = $oStylesheet->getAttribute('id');
$aThemeParameters['stylesheets'][$sStylesheetId] = $oStylesheet->GetText();
$sFile = ThemeHandler::FindStylesheetFile($oStylesheet->GetText(), $aImportsPaths);
$aStylesheetFiles[] = $sFile;
}
$aIncludedImages = ThemeHandler::GetIncludedImages($aThemeParameters['variables'], $aStylesheetFiles, $sThemeId);
$compiled_json_sig = ThemeHandler::ComputeSignature($aThemeParameters, $aImportsPaths, $aIncludedImages);
echo " current signature: $compiled_json_sig\n";
if ($sPreCompiledSig !== $compiled_json_sig)
{
$aErrors[] = "Precompiled signature does not match currently compiled one on theme '".$sThemeId."' (cf precompiledsheet $sPrecompiledStylesheetUri / datamodel $sXmlDataCustoFilePath)";
continue;
}
}
}
}
$sThemeId = $oTheme->getAttribute('id');
echo "=== theme: $sThemeId ===\n";
$precompiledSig= ThemeHandler::GetSignature(dirname(__FILE__)."/../../datamodels/2.x/".$sPrecompiledStylesheet);
echo " precompiled signature: $precompiledSig\n";
$this->assertFalse(empty($precompiledSig), "Signature in precompiled theme '".$sThemeId."' is not retrievable (cf precompiledsheet $sPrecompiledStylesheet / datamodel $xmlDataCusto)");
$aThemeParameters = array(
'variables' => array(),
'imports' => array(),
'stylesheets' => array(),
'precompiled_stylesheet' => '',
);
$aThemeParameters['precompiled_stylesheet'] = $sPrecompiledStylesheet;
/** @var \DOMNodeList $oVariables */
$oVariables = $oTheme->GetNodes('variables/variable');
foreach($oVariables as $oVariable)
{
$sVariableId = $oVariable->getAttribute('id');
$aThemeParameters['variables'][$sVariableId] = $oVariable->GetText();
}
/** @var \DOMNodeList $oImports */
$aStylesheetFiles = array();
$aImportsPaths = array(APPROOT.'datamodels');
$oImports = $oTheme->GetNodes('imports/import');
foreach($oImports as $oImport)
{
$sImportId = $oImport->getAttribute('id');
$aThemeParameters['imports'][$sImportId] = $oImport->GetText();
$sFile = ThemeHandler::FindStylesheetFile($oImport->GetText(), $aImportsPaths);
$aStylesheetFiles[] = $sFile;
}
/** @var \DOMNodeList $oStylesheets */
$oStylesheets = $oTheme->GetNodes('stylesheets/stylesheet');
foreach($oStylesheets as $oStylesheet)
{
$sStylesheetId = $oStylesheet->getAttribute('id');
$aThemeParameters['stylesheets'][$sStylesheetId] = $oStylesheet->GetText();
$sFile = ThemeHandler::FindStylesheetFile($oStylesheet->GetText(), $aImportsPaths);
$aStylesheetFiles[] = $sFile;
}
$sThemeFolderPath = APPROOT.'env-production/branding/themes/'.$sThemeId.'/test';
if (!$this->recurseMkdir($sThemeFolderPath))
{
$this->assertTrue(false, "Cannot create directory $sThemeFolderPath");
}
$aIncludedImages=ThemeHandler::GetIncludedImages($aThemeParameters['variables'], $aStylesheetFiles, $sThemeFolderPath);
$compiled_json_sig = ThemeHandler::ComputeSignature($aThemeParameters, $aImportsPaths, $aIncludedImages);
echo " current signature: $compiled_json_sig\n";
rmdir($sThemeFolderPath);
$this->assertEquals($precompiledSig, $compiled_json_sig, "Precompiled signature does not match currently compiled one on theme '".$sThemeId."' (cf precompiledsheet $sPrecompiledStylesheet / datamodel $xmlDataCusto)");
}
$this->assertEquals([], $aErrors, "Precompiled files are not up to date. please have a look.");
}
function recurseMkdir($dir)
@@ -188,43 +209,22 @@ class ThemeHandlerTest extends ItopTestCase
return @mkdir($dir);
}
public function providePrecompiledStyleSheets()
{
$datamodelfiles=glob(dirname(__FILE__)."/../../datamodels/2.x/**/datamodel*.xml");
$test_set = array();
foreach ($datamodelfiles as $datamodelfile)
{
if (is_file($datamodelfile) &&
$datamodelfile=="/var/www/html/iTop/test/application/../../datamodels/2.x/itop-config-mgmt/datamodel.itop-config-mgmt.xml")
{
$content=file_get_contents($datamodelfile);
if (strpos($content, "precompiled_stylesheet")!==false)
{
$test_set[$datamodelfile]=array($datamodelfile);
}
}
}
return $test_set;
}
public function testGetSignature()
{
$sig = ThemeHandler::GetSignature(APPROOT.'test/application/theme-handler/expected/themes/basque-red/main.css');
$expect_sig=<<<JSON
{"variables":"37c31105548fce44fecca5cb34e455c9","stylesheets":{"css-variables":"1d4b4ae2a6fba3db101f8dd1cecab082","jqueryui":"78cfafc3524dac98e61fc2460918d4e5","main":"52d8a7c5530ceb3a4d777364fa4e1eea"},"imports":[],"images":[]}
$sSig = ThemeHandler::GetSignature(APPROOT.'test/application/theme-handler/expected/themes/basque-red/main.css');
$sExpectedSig=<<<JSON
{"variables":"37c31105548fce44fecca5cb34e455c9","stylesheets":{"css-variables":"3c3f5adf98b9dbf893658314436c4b93","jqueryui":"78cfafc3524dac98e61fc2460918d4e5","main":"52d8a7c5530ceb3a4d777364fa4e1eea"},"imports":[],"images":{"css\/ui-lightness\/images\/ui-icons_222222_256x240.png":"3a3c5468f484f07ac4a320d9e22acb8c","css\/ui-lightness\/images\/ui-bg_diagonals-thick_20_666666_40x40.png":"4429d568c67d8dfeb9040273ea0fb8c4","css\/ui-lightness\/images\/ui-icons_E87C1E_256x240.png":"7003dd36cb2aa032c8ec871ce4d4e03d","css\/ui-lightness\/images\/ui-icons_1c94c4_256x240.png":"dbd693dc8e0ef04e90a2f7ac7b390086","css\/ui-lightness\/images\/ui-icons_F26522_256x240.png":"16278ec0c07270be571f4c2e97fcc10c","css\/ui-lightness\/images\/ui-bg_diagonals-thick_18_b81900_40x40.png":"e460a66d4b3e093fc651e62a236267cb","css\/ui-lightness\/images\/ui-icons_ffffff_256x240.png":"41612b0f4a034424f8321c9f824a94da","css\/ui-lightness\/images\/ui-icons_ffd27a_256x240.png":"dda1b6f694b0d196aefc66a1d6d758f6","images\/actions_right.png":"31c8906bd25d27b83a0a2466bf903462","images\/ac-background.gif":"76135f3697b41a15aed787cfd77776c7","images\/green-square.gif":"16ea9a497d72f5e66e4e8ea9ae08024e","images\/tv-item.gif":"719fe2d4566108e73162fb8868d3778c","images\/tv-collapsable.gif":"63a3351ea0d580797c9b8c386aa4f48b","images\/tv-expandable.gif":"a2d1af4128e4a798a7f3390b12a28574","images\/tv-item-last.gif":"2ae7e1d9972ce71e5caa65a086bc5b7e","images\/tv-collapsable-last.gif":"71acaa9d7c2616e9e8b7131a75ca65da","images\/tv-expandable-last.gif":"9d51036b3a8102742709da66789fd0f7","images\/red-header.gif":"c73b8765f0c8c3c183cb6a0c2bb0ec69","images\/green-header.gif":"0e22a09bb8051b2a274b3427ede62e82","images\/orange-header.gif":"ce1f93f0af64431771b4cbd6c99c567b","images\/calendar.png":"ab56e59af3c96ca661821257d376465e","images\/truncated.png":"c6f91108afe8159d417b4dc556cd3b2a","images\/plus.gif":"f00e1e6e1161f48608bb2bbc79b9948c","images\/minus.gif":"6d77c0c0c2f86b6995d1cdf78274eaab","images\/full-screen.png":"b541fadd3f1563856a4b44aeebd9d563","images\/indicator.gif":"03ce3dcc84af110e9da8699a841e5200","images\/delete.png":"93c047549c31a270a037840277cf59d3","images\/bg.gif":"a315146ab814c73632480136576cd271","images\/desc.gif":"0f58b33929095ea17795dd53bbced5d9","images\/info-mini.png":"445c090ed777c5e6a08ac390fa896193","images\/ok.png":"f6973773335fd83d8d2875f9a3c925af","images\/error.png":"1af8a1041016f67669c5fd22dc88c82e","images\/eye-open-555.png":"9940f4e5b1248042c238e1924359fd5e","images\/eye-closed-555.png":"6ad3b0bae791bf61addc9d8ca80a642d","images\/eye-open-fff.png":"b7db2402d4d5c72314c25790a66150d4","images\/eye-closed-fff.png":"f9be7454dbb47b0e0bca3aa370ae7db5","images\/breadcrumb-separator.png":"1e7e50a8f573e230cf1e0f0399c516e8"}}
JSON;
$this->assertEquals($expect_sig,$sig);
$this->assertEquals($sExpectedSig, $sSig);
}
public function testGetVarSignature()
{
$sig=<<<JSON
$sSignature=<<<JSON
{"variables":"37c31105548fce44fecca5cb34e455c9","stylesheets":{"css-variables":"934888ebb4991d4c76555be6b6d1d5cc","jqueryui":"78cfafc3524dac98e61fc2460918d4e5","main":"52d8a7c5530ceb3a4d777364fa4e1eea"},"imports":[]}
JSON;
$var_sig = ThemeHandler::GetVarSignature($sig);
$var_sig = ThemeHandler::GetVarSignature($sSignature);
$this->assertEquals("37c31105548fce44fecca5cb34e455c9",$var_sig);
}
@@ -237,43 +237,42 @@ JSON;
*/
public function testCompileThemeWithoutCssFile_FocusOnParamAttribute($readFromParamAttributeFromJson=false)
{
$expectJsonFilePath = APPROOT.'test/application/theme-handler/expected/themes/basque-red/theme-parameters.json';
$expectedThemeParamJson = file_get_contents($expectJsonFilePath);
$aThemeParameters = json_decode($expectedThemeParamJson, true);
if (is_file($this->jsonThemeParamFile))
$sExpectJsonFilePath = APPROOT.'test/application/theme-handler/expected/themes/basque-red/theme-parameters.json';
$sExpectedThemeParamJson = file_get_contents($sExpectJsonFilePath);
$aThemeParameters = json_decode($sExpectedThemeParamJson, true);
if (is_file($this->sJsonThemeParamFile))
{
unlink($this->jsonThemeParamFile);
unlink($this->sJsonThemeParamFile);
}
if (is_file($this->cssPath))
if (is_file($this->sCssPath))
{
unlink($this->cssPath);
unlink($this->sCssPath);
}
$this->compileCSSServiceMock->expects($this->exactly(1))
$this->oCompileCSSServiceMock->expects($this->exactly(1))
->method("CompileCSSFromSASS")
->willReturn("====CSSCOMPILEDCONTENT====");
$sSetupCompilationTimestamp = microtime(true);
if($readFromParamAttributeFromJson)
{
copy($expectJsonFilePath, $this->jsonThemeParamFile);
ThemeHandler::CompileTheme('basque-red', $sSetupCompilationTimestamp, null, array($this->tmpDir.'/branding/themes/'), $this->tmpDir);
copy($sExpectJsonFilePath, $this->sJsonThemeParamFile);
$this->assertTrue(ThemeHandler::CompileTheme('basque-red', true, "COMPILATIONTIMESTAMP", null, [$this->sTmpDir.'/branding/themes/'], $this->sTmpDir));
}
else
{
ThemeHandler::CompileTheme('basque-red', $sSetupCompilationTimestamp, $aThemeParameters, array($this->tmpDir.'/branding/themes/'), $this->tmpDir);
$this->assertTrue(ThemeHandler::CompileTheme('basque-red', true, "COMPILATIONTIMESTAMP", $aThemeParameters, [$this->sTmpDir.'/branding/themes/'], $this->sTmpDir));
}
$this->assertTrue(is_file($this->cssPath));
$this->assertEquals($expectedThemeParamJson, file_get_contents($this->jsonThemeParamFile));
$this->assertEquals(file_get_contents(APPROOT . 'test/application/theme-handler/expected/themes/basque-red/main.css'), file_get_contents($this->cssPath));
$this->assertTrue(is_file($this->sCssPath));
$this->assertEquals($sExpectedThemeParamJson, file_get_contents($this->sJsonThemeParamFile));
$this->assertEquals(file_get_contents(APPROOT . 'test/application/theme-handler/expected/themes/basque-red/main.css'), file_get_contents($this->sCssPath));
}
public function CompileThemesProviderWithoutCss()
{
return array(
"pass ParamAttributes and Save them in Json" => array(false),
"use them from saved json" => array(true)
);
return [
"pass ParamAttributes and Save them in Json" => [false],
"use them from saved json" => [true]
];
}
/**
@@ -286,26 +285,26 @@ JSON;
*/
public function testCompileThemesEmptyArray($ThemeParametersJson, $CompileCount=0)
{
$cssPath = $this->tmpDir . '/branding/themes/basque-red/main.css';
copy(APPROOT . 'test/application/theme-handler/expected/themes/basque-red/main.css', $cssPath);
$sCssPath = $this->sTmpDir . '/branding/themes/basque-red/main.css';
copy(APPROOT . 'test/application/theme-handler/expected/themes/basque-red/main.css', $sCssPath);
$this->compileCSSServiceMock->expects($this->exactly($CompileCount))
$this->oCompileCSSServiceMock->expects($this->exactly($CompileCount))
->method("CompileCSSFromSASS")
->willReturn("====CSSCOMPILEDCONTENT====");
$sSetupCompilationTimestamp = microtime(true);
ThemeHandler::CompileTheme('basque-red', $sSetupCompilationTimestamp, json_decode($ThemeParametersJson, true), array($this->tmpDir.'/branding/themes/'), $this->tmpDir);
$this->assertEquals($CompileCount!=0,ThemeHandler::CompileTheme('basque-red', true, "COMPILATIONTIMESTAMP", json_decode($ThemeParametersJson, true), [$this->sTmpDir.'/branding/themes/'], $this->sTmpDir));
}
public function CompileThemesProviderEmptyArray()
{
$emptyImports = '{"variables":{"brand-primary":"#C53030","hover-background-color":"#F6F6F6","icons-filter":"grayscale(1)","search-form-container-bg-color":"#4A5568"},"imports":[],"stylesheets":{"jqueryui":"..\/css\/ui-lightness\/jqueryui.scss","main":"..\/css\/light-grey.scss"}}';
$emptyStyleSheets='{"variables":{"brand-primary":"#C53030","hover-background-color":"#F6F6F6","icons-filter":"grayscale(1)","search-form-container-bg-color":"#4A5568"},"imports":{"css-variables":"..\/css\/css-variables.scss"},"stylesheets":[]}';
$emptyVars='{"variables":[],"imports":{"css-variables":"..\/css\/css-variables.scss"},"stylesheets":{"jqueryui":"..\/css\/ui-lightness\/jqueryui.scss","main":"..\/css\/light-grey.scss"}}';
return array(
"empty imports" => array($emptyImports),
"empty styles" => array($emptyStyleSheets),
"empty vars" => array($emptyVars, 1),
);
$aEmptyImports = '{"variables":{"brand-primary":"#C53030","hover-background-color":"#F6F6F6","icons-filter":"grayscale(1)","search-form-container-bg-color":"#4A5568"},"imports":[],"stylesheets":{"jqueryui":"..\/css\/ui-lightness\/jqueryui.scss","main":"..\/css\/light-grey.scss"}}';
$aEmptyStyleSheets='{"variables":{"brand-primary":"#C53030","hover-background-color":"#F6F6F6","icons-filter":"grayscale(1)","search-form-container-bg-color":"#4A5568"},"imports":{"css-variables":"..\/css\/css-variables.scss"},"stylesheets":[]}';
$aEmptyVars='{"variables":[],"imports":{"css-variables":"..\/css\/css-variables.scss"},"stylesheets":{"jqueryui":"..\/css\/ui-lightness\/jqueryui.scss","main":"..\/css\/light-grey.scss"}}';
return [
"empty imports" => [$aEmptyImports],
"empty styles" => [$aEmptyStyleSheets],
"empty vars" => [$aEmptyVars, 1],
];
}
/**
@@ -322,23 +321,23 @@ JSON;
$sImportModifiedMainCssPath="test/application/theme-handler/expected/themes/basque-red/main_importmodified.css";
$sStylesheetFilePath = '/branding/css/light-grey.scss';
$sImageFilePath = 'test/application/theme-handler/copied/testimages/images/green-header.gif';
return array(
"setup context: variables list modified without any file touched" => array($sModifiedVariableThemeParameterJson, 1,false,false,false,$sImportFilePath, $sVarChangedMainCssPath),
"setup context: variables list modified with files touched" => array($sModifiedVariableThemeParameterJson, 1,false,true,false,$sImportFilePath, $sVarChangedMainCssPath, false),
"itop page/theme loading; variables list modified without any file touched" => array($sModifiedVariableThemeParameterJson, 0,false,false,false,$sImportFilePath, $sVarChangedMainCssPath, false),
return [
"setup context: variables list modified without any file touched" => [$sModifiedVariableThemeParameterJson, 1,false,false,false,$sImportFilePath, $sVarChangedMainCssPath],
"setup context: variables list modified with files touched" => [$sModifiedVariableThemeParameterJson, 1,false,true,false,$sImportFilePath, $sVarChangedMainCssPath, false],
"itop page/theme loading; variables list modified without any file touched" => [$sModifiedVariableThemeParameterJson, 0,false,false,false,$sImportFilePath, $sVarChangedMainCssPath, false],
//imports
"import file missing" => array($sInitialThemeParamJson, 0, true, false, false, $sImportFilePath),
"import file touched" => array($sInitialThemeParamJson, 0, false, true, false, $sImportFilePath),
"import file modified" => array($sInitialThemeParamJson, 1, false, false, true, $sImportFilePath, $sImportModifiedMainCssPath),
"import file missing" => [$sInitialThemeParamJson, 0, true, false, false, $sImportFilePath],
"import file touched" => [$sInitialThemeParamJson, 0, false, true, false, $sImportFilePath],
"import file modified" => [$sInitialThemeParamJson, 1, false, false, true, $sImportFilePath, $sImportModifiedMainCssPath],
//stylesheets
"stylesheets file missing" => array($sInitialThemeParamJson, 0, true, false, false, $sStylesheetFilePath),
"stylesheets file touched" => array($sInitialThemeParamJson, 0, false, true, false, $sStylesheetFilePath),
"stylesheets file modified" => array($sInitialThemeParamJson, 1, false, false, true, $sStylesheetFilePath, $sStylesheetMainCssPath),
"stylesheets file missing" => [$sInitialThemeParamJson, 0, true, false, false, $sStylesheetFilePath],
"stylesheets file touched" => [$sInitialThemeParamJson, 0, false, true, false, $sStylesheetFilePath],
"stylesheets file modified" => [$sInitialThemeParamJson, 1, false, false, true, $sStylesheetFilePath, $sStylesheetMainCssPath],
//images
"image file missing" => array($sInitialThemeParamJson, 0, true, false, false, $sImageFilePath),
"image file touched" => array($sInitialThemeParamJson, 0, false, true, false, $sImageFilePath),
"image file modified" => array($sInitialThemeParamJson, 1, false, false, true, $sImageFilePath, $sImageMainCssPath),
);
"image file missing" => [$sInitialThemeParamJson, 0, true, false, false, $sImageFilePath],
"image file touched" => [$sInitialThemeParamJson, 0, false, true, false, $sImageFilePath],
"image file modified" => [$sInitialThemeParamJson, 1, false, false, true, $sImageFilePath, $sImageMainCssPath],
];
}
@@ -357,12 +356,10 @@ JSON;
*/
public function testCompileThemes($ThemeParametersJson, $iCompileCSSFromSASSCount, $bMissingFile=false, $bFilesTouchedRecently=false, $bFileMd5sumModified=false, $sFileToTest=null, $sExpectedMainCssPath=null, $bSetup=true)
{
$sSetupCompilationTimestamp = ($bSetup) ? microtime(true) : false;
$sAfterReplacementCssVariableMd5sum='';
if (is_file($this->tmpDir.'/'.$sFileToTest))
if (is_file($this->sTmpDir.'/'.$sFileToTest))
{
$sFileToTest=$this->tmpDir.'/'.$sFileToTest;
$sFileToTest=$this->sTmpDir.'/'.$sFileToTest;
}
else
{
@@ -376,7 +373,7 @@ JSON;
$this->recurse_copy(APPROOT .'test/application/theme-handler/expected/testimages/', $sAbsoluteImagePath);
//change approot-relative in css-variable to use absolute path
$sCssVarPath = $this->tmpDir."/branding/css/css-variables.scss";
$sCssVarPath = $this->sTmpDir."/branding/css/css-variables.scss";
$sBeforeReplacementCssVariableMd5sum = md5_file($sCssVarPath);
echo 'BEFORE :' . $sBeforeReplacementCssVariableMd5sum .' ' . $sCssVarPath . ' ';
$sCssVariableContent = file_get_contents($sCssVarPath);
@@ -400,7 +397,7 @@ JSON;
$sReplacement = rtrim($sAbsoluteImagePath, '/');
$sReplacement=preg_replace('|\/|', '\/', $sReplacement);
$sMainCssContent = preg_replace(static::PATTERN, $sReplacement, $sMainCssContent);
$cssPath = $this->tmpDir . '/branding/themes/basque-red/main.css';
$cssPath = $this->sTmpDir . '/branding/themes/basque-red/main.css';
echo 'PUT md5sum: '.$sAfterReplacementCssVariableMd5sum.' in '.$cssPath.' ';
file_put_contents($cssPath, $sMainCssContent);
@@ -428,12 +425,12 @@ JSON;
$sAfterReplacementCssVariableMd5sum = md5_file($sCssVarPath);
}
$this->compileCSSServiceMock->expects($this->exactly($iCompileCSSFromSASSCount))
$this->oCompileCSSServiceMock->expects($this->exactly($iCompileCSSFromSASSCount))
->method("CompileCSSFromSASS")
->willReturn("====CSSCOMPILEDCONTENT====");
$aThemeParameters = json_decode($ThemeParametersJson, true);
ThemeHandler::CompileTheme('basque-red', $sSetupCompilationTimestamp, $aThemeParameters, array($this->tmpDir.'/branding/themes/'), $this->tmpDir);
$this->assertEquals($iCompileCSSFromSASSCount!=0,ThemeHandler::CompileTheme('basque-red', $bSetup, "COMPILATIONTIMESTAMP", $aThemeParameters, [$this->sTmpDir.'/branding/themes/'], $this->sTmpDir));
if ($iCompileCSSFromSASSCount==1)
{
@@ -443,9 +440,9 @@ JSON;
$this->assertTrue(false, "Cannot find expected main css file $sExpectedMainCssFile");
}
$aPatterns = array(static::PATTERN, '/'.$sBeforeReplacementCssVariableMd5sum.'/');
$aPatterns = [static::PATTERN, '/'.$sBeforeReplacementCssVariableMd5sum.'/'];
$aPatterns[] = "/8100523d2e76a70266f3e7110e2fe5fb/";
$aReplacements = array($sReplacement, $sAfterReplacementCssVariableMd5sum);
$aReplacements = [$sReplacement, $sAfterReplacementCssVariableMd5sum];
$aReplacements[] = md5(json_encode($aThemeParameters['variables']));
var_dump($aReplacements);
$this->DoInnerJsonValidation($sExpectedMainCssFile, $cssPath, $aPatterns, $aReplacements);
@@ -469,6 +466,7 @@ JSON;
$aExpectedJson = json_decode($sExpectedJson, true);
/** @var array $aActualJson */
$aActualJson = json_decode(ThemeHandler::GetSignature($sActualCssFile), true);
echo (ThemeHandler::GetSignature($sActualCssFile));
$this->assertEquals($aExpectedJson, $aActualJson, "CSS file dont match ($sExpectedCssFile / $sActualCssFile)");
}
@@ -482,21 +480,21 @@ JSON;
*/
public function testGetAllUrlFromScss($sScssFile)
{
$aIncludedUrls = ThemeHandler::GetAllUrlFromScss(array('attr' => "123"),APPROOT.$sScssFile);
$this->assertEquals(array('approot-relative', 'version', 'version1'), array_values($aIncludedUrls['aMissingVariables']));
$this->assertEquals(array("attr"=>"123"),
$aIncludedUrls = ThemeHandler::GetAllUrlFromScss(['attr' => "123"],APPROOT.$sScssFile);
$this->assertEquals(['approot-relative', 'version', 'version1'], array_values($aIncludedUrls['aMissingVariables']));
$this->assertEquals(["attr"=>"123"],
$aIncludedUrls['aFoundVariables']);
$aExpectedCompletedUrls = array(
$aExpectedCompletedUrls = [
'css/ui-lightness/images/tutu.jpg',
"css/ui-lightness/images/tata.jpeg",
"css/ui-lightness/images/tete.jpeg?g=123"
);
$aExpectedToCompleteUrls = array(
];
$aExpectedToCompleteUrls = [
'\'abc/\'+ $approot-relative + "css/ui-lightness/images/toutou.png?v=" + $version',
"\$approot-relative + \"css/ui-lightness/images/toto.png?v=\" + \$version",
'$approot-relative + \'css/ui-lightness/images/titi.gif?v=\' + $version1',
'"data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7?v=" + $version',
);
];
$aIncludedUrls['aCompleteUrls'];
$this->assertEquals($aExpectedCompletedUrls, array_values($aIncludedUrls['aCompleteUrls']));
@@ -508,7 +506,7 @@ JSON;
*/
public function GetAllUrlFromScssProvider()
{
return array('test-getimages.scss' => array('test/application/theme-handler/getimages/test-getimages.scss'));
return ['test-getimages.scss' => ['test/application/theme-handler/getimages/test-getimages.scss']];
}
public function testFindMissingVariables()
@@ -525,9 +523,9 @@ $default-font-family: Trebuchet MS,Tahoma,Verdana,Arial,sans-serif !default;
$icons-filter: hue-rotate(0deg) !default;
$toto : titi;
SCSS;
$aMissingVariables = array('gabu', 'toto', 'approot-relative', 'approot-relative2', 'gray-base', 'gray-darker', 'brand-primary', 'brand-primary-lightest', 'content-color', 'default-font-family', 'icons-filter');
list($aMissingVariables, $aFoundVariables) = ThemeHandler::FindMissingVariables(array('gabu' => 'zomeu'), $aMissingVariables, array("a" => "b"), $sContent);
$aExpectedFoundVariables = array(
$aMissingVariables = ['gabu', 'toto', 'approot-relative', 'approot-relative2', 'gray-base', 'gray-darker', 'brand-primary', 'brand-primary-lightest', 'content-color', 'default-font-family', 'icons-filter'];
list($aMissingVariables, $aFoundVariables) = ThemeHandler::FindMissingVariables(['gabu' => 'zomeu'], $aMissingVariables, ["a" => "b"], $sContent);
$aExpectedFoundVariables = [
'gabu' => 'zomeu',
'toto' => 'titi',
'approot-relative' => '../../../../../',
@@ -538,9 +536,9 @@ SCSS;
'default-font-family' => 'Trebuchet MS,Tahoma,Verdana,Arial,sans-serif',
'icons-filter' => 'hue-rotate(0deg)',
'toto' => 'titi',
);
];
$this->assertEquals($aExpectedFoundVariables, $aFoundVariables);
$this->assertEquals(array('gray-darker', 'brand-primary', 'brand-primary-lightest'), $aMissingVariables);
$this->assertEquals(['gray-darker', 'brand-primary', 'brand-primary-lightest'], $aMissingVariables);
}
/**
@@ -557,32 +555,56 @@ SCSS;
public function ResolveUrlProvider()
{
return array(
'XXX + $key1 UNresolved' => array("abc/'+ \$key1", array('key'=>'123'), false),
'$key1 + XXX UNresolved' => array("\$key1 + abs", array('key'=>'123'), false),
'XXX + $key UNresolved' => array("abc/'+ \$unknownkey", array('key'=>'123'), false),
'XXX + $key resolved' => array("abc/'+ \$key", array('key'=>'123'), "abc/123"),
'XXX + $key1 resolved' => array("abc/'+ \$key1", array('key1'=>'123'), "abc/123"),
'$key + XXX resolved' => array("\$key + \"/abc", array('key'=>'123'), "123/abc"),
'XXX + $key + YYY resolved' => array("abc/'+ \$key + '/def", array('key'=>'123'), "abc/123/def"),
);
return [
'XXX + $key1 UNresolved' => ["abc/'+ \$key1", ['key'=>'123'], false],
'$key1 + XXX UNresolved' => ["\$key1 + abs", ['key'=>'123'], false],
'XXX + $key UNresolved' => ["abc/'+ \$unknownkey", ['key'=>'123'], false],
'XXX + $key resolved' => ["abc/'+ \$key", ['key'=>'123'], "abc/123"],
'XXX + $key1 resolved' => ["abc/'+ \$key1", ['key1'=>'123'], "abc/123"],
'$key + XXX resolved' => ["\$key + \"/abc", ['key'=>'123'], "123/abc"],
'XXX + $key + YYY resolved' => ["abc/'+ \$key + '/def", ['key'=>'123'], "abc/123/def"],
];
}
public function testGetIncludedImages()
{
$aStylesheetFile=glob($this->tmpDir."/branding/css/*.scss");
$aStylesheetFile[]=$this->tmpDir."/branding/css/ui-lightness/jqueryui.scss";
$aStylesheetFile=glob($this->sTmpDir."/branding/css/*.scss");
$aStylesheetFile[]=$this->sTmpDir."/branding/css/ui-lightness/jqueryui.scss";
$expectJsonFilePath = APPROOT.'test/application/theme-handler/expected/themes/basque-red/theme-parameters.json';
$expectedThemeParamJson = file_get_contents($expectJsonFilePath);
$aThemeParametersVariables = json_decode($expectedThemeParamJson, true);
$aIncludedImages = ThemeHandler::GetIncludedImages($aThemeParametersVariables['variables'], $aStylesheetFile, "RELATIVEPATH");
$aExpectedImages = json_decode(file_get_contents(APPROOT.'test/application/theme-handler/getimages/expected-getimages.json'), true);
$this->assertEquals($aExpectedImages, $aIncludedImages);
foreach ($aIncludedImages as $sImagePath)
//simulate adding timestamp
$aThemeParametersVariables['variables']['$version'] = microtime(true);
$aIncludedImages = ThemeHandler::GetIncludedImages($aThemeParametersVariables['variables'], $aStylesheetFile, "basque-red");
$aExpectedUris = json_decode(file_get_contents(APPROOT.'test/application/theme-handler/getimages/expected-getimages.json'), true);
$aExpectedImages = [];
foreach ($aExpectedUris as $sExpectedUri)
{
$sFilename = str_replace('RELATIVEPATH', dirname($this->cssPath), $sImagePath);
$this->assertTrue(is_file($sFilename), "Image $sFilename does not exist");
$aExpectedImages[] = APPROOT . $sExpectedUri;
}
$this->assertEquals($aExpectedImages, $aIncludedImages);
}
/**
* @param $sPath
* @param $sExpectedCanonicalPath
* @dataProvider CanonicalizePathProvider
*/
public function testCanonicalizePath($sExpectedCanonicalPath, $sPath)
{
$this->assertEquals($sExpectedCanonicalPath, ThemeHandler::CanonicalizePath($sPath), "Failed to reduce path $sPath");
}
public function CanonicalizePathProvider()
{
return [
[ '/var/www/html/iTop/images/itop-logo-2.png', '/var/www/html/iTop/env-production/branding/themes/light-grey/../../../../images/itop-logo-2.png' ],
[ '/var/www/html/iTop/env-production/branding/themes/light-grey/images/', '/var/www/html/iTop/env-production/branding/themes/light-grey/images/' ],
[ '/var/www/html/iTop/css/ui-lightness/images/ui-icons_222222_256x240.png', '/var/www/html/iTop/env-production//branding/themes/light-grey//../../../../css/ui-lightness/images/ui-icons_222222_256x240.png' ]
];
}
}

View File

@@ -15,7 +15,7 @@
*
* You should have received a copy of the GNU Affero General Public License
*/
$approot-relative: "../../../../../" !default; // relative to env-***/branding/themes/***/main.css
$approot-relative: "../../../../" !default; // relative to env-***/branding/themes/***/main.css
// Base colors
$gray-base: #000 !default;

View File

@@ -1,6 +1,6 @@
/*
=== SIGNATURE BEGIN ===
{"variables":"37c31105548fce44fecca5cb34e455c9","stylesheets":{"css-variables":"1d4b4ae2a6fba3db101f8dd1cecab082","jqueryui":"78cfafc3524dac98e61fc2460918d4e5","main":"52d8a7c5530ceb3a4d777364fa4e1eea"},"imports":[],"images":[]}
{"variables":"37c31105548fce44fecca5cb34e455c9","stylesheets":{"css-variables":"3c3f5adf98b9dbf893658314436c4b93","jqueryui":"78cfafc3524dac98e61fc2460918d4e5","main":"52d8a7c5530ceb3a4d777364fa4e1eea"},"imports":[],"images":{"css\/ui-lightness\/images\/ui-icons_222222_256x240.png":"3a3c5468f484f07ac4a320d9e22acb8c","css\/ui-lightness\/images\/ui-bg_diagonals-thick_20_666666_40x40.png":"4429d568c67d8dfeb9040273ea0fb8c4","css\/ui-lightness\/images\/ui-icons_E87C1E_256x240.png":"7003dd36cb2aa032c8ec871ce4d4e03d","css\/ui-lightness\/images\/ui-icons_1c94c4_256x240.png":"dbd693dc8e0ef04e90a2f7ac7b390086","css\/ui-lightness\/images\/ui-icons_F26522_256x240.png":"16278ec0c07270be571f4c2e97fcc10c","css\/ui-lightness\/images\/ui-bg_diagonals-thick_18_b81900_40x40.png":"e460a66d4b3e093fc651e62a236267cb","css\/ui-lightness\/images\/ui-icons_ffffff_256x240.png":"41612b0f4a034424f8321c9f824a94da","css\/ui-lightness\/images\/ui-icons_ffd27a_256x240.png":"dda1b6f694b0d196aefc66a1d6d758f6","images\/actions_right.png":"31c8906bd25d27b83a0a2466bf903462","images\/ac-background.gif":"76135f3697b41a15aed787cfd77776c7","images\/green-square.gif":"16ea9a497d72f5e66e4e8ea9ae08024e","images\/tv-item.gif":"719fe2d4566108e73162fb8868d3778c","images\/tv-collapsable.gif":"63a3351ea0d580797c9b8c386aa4f48b","images\/tv-expandable.gif":"a2d1af4128e4a798a7f3390b12a28574","images\/tv-item-last.gif":"2ae7e1d9972ce71e5caa65a086bc5b7e","images\/tv-collapsable-last.gif":"71acaa9d7c2616e9e8b7131a75ca65da","images\/tv-expandable-last.gif":"9d51036b3a8102742709da66789fd0f7","images\/red-header.gif":"c73b8765f0c8c3c183cb6a0c2bb0ec69","images\/green-header.gif":"0e22a09bb8051b2a274b3427ede62e82","images\/orange-header.gif":"ce1f93f0af64431771b4cbd6c99c567b","images\/calendar.png":"ab56e59af3c96ca661821257d376465e","images\/truncated.png":"c6f91108afe8159d417b4dc556cd3b2a","images\/plus.gif":"f00e1e6e1161f48608bb2bbc79b9948c","images\/minus.gif":"6d77c0c0c2f86b6995d1cdf78274eaab","images\/full-screen.png":"b541fadd3f1563856a4b44aeebd9d563","images\/indicator.gif":"03ce3dcc84af110e9da8699a841e5200","images\/delete.png":"93c047549c31a270a037840277cf59d3","images\/bg.gif":"a315146ab814c73632480136576cd271","images\/desc.gif":"0f58b33929095ea17795dd53bbced5d9","images\/info-mini.png":"445c090ed777c5e6a08ac390fa896193","images\/ok.png":"f6973773335fd83d8d2875f9a3c925af","images\/error.png":"1af8a1041016f67669c5fd22dc88c82e","images\/eye-open-555.png":"9940f4e5b1248042c238e1924359fd5e","images\/eye-closed-555.png":"6ad3b0bae791bf61addc9d8ca80a642d","images\/eye-open-fff.png":"b7db2402d4d5c72314c25790a66150d4","images\/eye-closed-fff.png":"f9be7454dbb47b0e0bca3aa370ae7db5","images\/breadcrumb-separator.png":"1e7e50a8f573e230cf1e0f0399c516e8"}}
=== SIGNATURE END ===
*/
====CSSCOMPILEDCONTENT====

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -1,42 +1,39 @@
[
"RELATIVEPATH/../../../../../css/ui-lightness/images/ui-bg_diagonals-thick_20_666666_40x40.png",
"RELATIVEPATH/../../../../../css/ui-lightness/images/ui-icons_ffffff_256x240.png",
"RELATIVEPATH/../../../../../images/actions_right.png",
"RELATIVEPATH/../../../../../images/ac-background.gif",
"RELATIVEPATH/../../../../../images/green-square.gif",
"RELATIVEPATH/../../../../../images/tv-item.gif",
"RELATIVEPATH/../../../../../images/tv-collapsable.gif",
"RELATIVEPATH/../../../../../images/tv-expandable.gif",
"RELATIVEPATH/../../../../../images/tv-item-last.gif",
"RELATIVEPATH/../../../../../images/tv-collapsable-last.gif",
"RELATIVEPATH/../../../../../images/tv-expandable-last.gif",
"RELATIVEPATH/../../../../../images/red-header.gif",
"RELATIVEPATH/../../../../../images/green-header.gif",
"RELATIVEPATH/../../../../../images/orange-header.gif",
"RELATIVEPATH/../../../../../images/calendar.png",
"RELATIVEPATH/../../../../../images/truncated.png",
"RELATIVEPATH/../../../../../images/itop-logo-2.png",
"RELATIVEPATH/../../../../../images/splitter-bkg.png",
"RELATIVEPATH/../../../../../images/plus.gif",
"RELATIVEPATH/../../../../../images/minus.gif",
"RELATIVEPATH/../../../../../images/full-screen.png",
"RELATIVEPATH/../../../../../images/indicator.gif",
"RELATIVEPATH/../../../../../images/delete.png",
"RELATIVEPATH/../../../../../images/bg.gif",
"RELATIVEPATH/../../../../../images/desc.gif",
"RELATIVEPATH/../../../../../images/asc.gif",
"RELATIVEPATH/../../../../../images/info-mini.png",
"RELATIVEPATH/../../../../../images/ok.png",
"RELATIVEPATH/../../../../../images/error.png",
"RELATIVEPATH/../../../../../images/eye-open-555.png",
"RELATIVEPATH/../../../../../images/eye-closed-555.png",
"RELATIVEPATH/../../../../../images/eye-open-fff.png",
"RELATIVEPATH/../../../../../images/eye-closed-fff.png",
"RELATIVEPATH/../../../../../css/ui-lightness/images/ui-icons_222222_256x240.png",
"RELATIVEPATH/../../../../../images/breadcrumb-separator.png",
"RELATIVEPATH/../../../../../css/ui-lightness/images/ui-icons_E87C1E_256x240.png",
"RELATIVEPATH/../../../../../css/ui-lightness/images/ui-icons_1c94c4_256x240.png",
"RELATIVEPATH/../../../../../css/ui-lightness/images/ui-icons_F26522_256x240.png",
"RELATIVEPATH/../../../../../css/ui-lightness/images/ui-bg_diagonals-thick_18_b81900_40x40.png",
"RELATIVEPATH/../../../../../css/ui-lightness/images/ui-icons_ffd27a_256x240.png"
"css/ui-lightness/images/ui-bg_diagonals-thick_20_666666_40x40.png",
"css/ui-lightness/images/ui-icons_ffffff_256x240.png",
"images/actions_right.png",
"images/ac-background.gif",
"images/green-square.gif",
"images/tv-item.gif",
"images/tv-collapsable.gif",
"images/tv-expandable.gif",
"images/tv-item-last.gif",
"images/tv-collapsable-last.gif",
"images/tv-expandable-last.gif",
"images/red-header.gif",
"images/green-header.gif",
"images/orange-header.gif",
"images/calendar.png",
"images/truncated.png",
"images/plus.gif",
"images/minus.gif",
"images/full-screen.png",
"images/indicator.gif",
"images/delete.png",
"images/bg.gif",
"images/desc.gif",
"images/info-mini.png",
"images/ok.png",
"images/error.png",
"images/eye-open-555.png",
"images/eye-closed-555.png",
"images/eye-open-fff.png",
"images/eye-closed-fff.png",
"css/ui-lightness/images/ui-icons_222222_256x240.png",
"images/breadcrumb-separator.png",
"css/ui-lightness/images/ui-icons_E87C1E_256x240.png",
"css/ui-lightness/images/ui-icons_1c94c4_256x240.png",
"css/ui-lightness/images/ui-icons_F26522_256x240.png",
"css/ui-lightness/images/ui-bg_diagonals-thick_18_b81900_40x40.png",
"css/ui-lightness/images/ui-icons_ffd27a_256x240.png"
]