From 7b8c390a80242658830b076d6f1f2b9b829075dc Mon Sep 17 00:00:00 2001 From: odain-cbd <56586767+odain-cbd@users.noreply.github.com> Date: Fri, 7 Aug 2020 16:20:12 +0200 Subject: [PATCH] Revert "Faster compilation of themes" --- .make/release/update-versions.php | 1 + .make/release/update.classes.inc.php | 20 + application/themehandler.class.inc.php | 631 +- application/utils.inc.php | 8 +- css/css-variables.scss | 1 - .../datamodel.itop-config-mgmt.xml | 2 - .../precompiled-themes/light-grey/main.css | 5217 ---------------- .../precompiled-themes/test-red/main.css | 5246 ----------------- setup/compiler.class.inc.php | 21 +- test/application/ThemeHandlerTest.php | 596 -- .../ui-bg_diagonals-thick_18_b81900_40x40.png | Bin 418 -> 0 bytes .../ui-bg_diagonals-thick_20_666666_40x40.png | Bin 312 -> 0 bytes .../images/ui-icons_1c94c4_256x240.png | Bin 4549 -> 0 bytes .../images/ui-icons_222222_256x240.png | Bin 6922 -> 0 bytes .../images/ui-icons_E87C1E_256x240.png | Bin 4549 -> 0 bytes .../images/ui-icons_F26522_256x240.png | Bin 4549 -> 0 bytes .../images/ui-icons_ffd27a_256x240.png | Bin 4549 -> 0 bytes .../images/ui-icons_ffffff_256x240.png | Bin 6299 -> 0 bytes .../testimages/images/ac-background.gif | Bin 61 -> 0 bytes .../testimages/images/actions_right.png | Bin 240 -> 0 bytes .../copied/testimages/images/bg.gif | Bin 64 -> 0 bytes .../images/breadcrumb-separator.png | Bin 324 -> 0 bytes .../copied/testimages/images/calendar.png | Bin 676 -> 0 bytes .../copied/testimages/images/delete.png | Bin 842 -> 0 bytes .../copied/testimages/images/desc.gif | Bin 54 -> 0 bytes .../copied/testimages/images/error.png | Bin 543 -> 0 bytes .../testimages/images/eye-closed-555.png | Bin 274 -> 0 bytes .../testimages/images/eye-closed-fff.png | Bin 237 -> 0 bytes .../copied/testimages/images/eye-open-555.png | Bin 355 -> 0 bytes .../copied/testimages/images/eye-open-fff.png | Bin 327 -> 0 bytes .../copied/testimages/images/full-screen.png | Bin 1011 -> 0 bytes .../copied/testimages/images/green-header.gif | Bin 124 -> 0 bytes .../copied/testimages/images/green-square.gif | Bin 56 -> 0 bytes .../copied/testimages/images/indicator.gif | Bin 1553 -> 0 bytes .../copied/testimages/images/info-mini.png | Bin 850 -> 0 bytes .../copied/testimages/images/minus.gif | Bin 139 -> 0 bytes .../copied/testimages/images/ok.png | Bin 643 -> 0 bytes .../testimages/images/orange-header.gif | Bin 122 -> 0 bytes .../copied/testimages/images/plus.gif | Bin 142 -> 0 bytes .../copied/testimages/images/red-header.gif | Bin 122 -> 0 bytes .../copied/testimages/images/truncated.png | Bin 1429 -> 0 bytes .../testimages/images/tv-collapsable-last.gif | Bin 85 -> 0 bytes .../testimages/images/tv-collapsable.gif | Bin 781 -> 0 bytes .../testimages/images/tv-expandable-last.gif | Bin 89 -> 0 bytes .../testimages/images/tv-expandable.gif | Bin 787 -> 0 bytes .../copied/testimages/images/tv-item-last.gif | Bin 65 -> 0 bytes .../copied/testimages/images/tv-item.gif | Bin 750 -> 0 bytes .../expected/css/css-variables.scss | 123 - .../expected/css/light-grey.scss | 3893 ------------ .../expected/css/ui-lightness/jqueryui.scss | 1910 ------ .../ui-bg_diagonals-thick_18_b81900_40x40.png | Bin 418 -> 0 bytes .../ui-bg_diagonals-thick_20_666666_40x40.png | Bin 312 -> 0 bytes .../images/ui-icons_1c94c4_256x240.png | Bin 4549 -> 0 bytes .../images/ui-icons_222222_256x240.png | Bin 6922 -> 0 bytes .../images/ui-icons_E87C1E_256x240.png | Bin 4549 -> 0 bytes .../images/ui-icons_F26522_256x240.png | Bin 4549 -> 0 bytes .../images/ui-icons_ffd27a_256x240.png | Bin 4549 -> 0 bytes .../images/ui-icons_ffffff_256x240.png | Bin 6299 -> 0 bytes .../testimages/images/ac-background.gif | Bin 61 -> 0 bytes .../testimages/images/actions_right.png | Bin 240 -> 0 bytes .../expected/testimages/images/bg.gif | Bin 64 -> 0 bytes .../images/breadcrumb-separator.png | Bin 324 -> 0 bytes .../expected/testimages/images/calendar.png | Bin 676 -> 0 bytes .../expected/testimages/images/delete.png | Bin 842 -> 0 bytes .../expected/testimages/images/desc.gif | Bin 54 -> 0 bytes .../expected/testimages/images/error.png | Bin 543 -> 0 bytes .../testimages/images/eye-closed-555.png | Bin 274 -> 0 bytes .../testimages/images/eye-closed-fff.png | Bin 237 -> 0 bytes .../testimages/images/eye-open-555.png | Bin 355 -> 0 bytes .../testimages/images/eye-open-fff.png | Bin 327 -> 0 bytes .../testimages/images/full-screen.png | Bin 1011 -> 0 bytes .../testimages/images/green-header.gif | Bin 120 -> 0 bytes .../testimages/images/green-square.gif | Bin 56 -> 0 bytes .../expected/testimages/images/indicator.gif | Bin 1553 -> 0 bytes .../expected/testimages/images/info-mini.png | Bin 850 -> 0 bytes .../expected/testimages/images/minus.gif | Bin 139 -> 0 bytes .../expected/testimages/images/ok.png | Bin 643 -> 0 bytes .../testimages/images/orange-header.gif | Bin 122 -> 0 bytes .../expected/testimages/images/plus.gif | Bin 142 -> 0 bytes .../expected/testimages/images/red-header.gif | Bin 122 -> 0 bytes .../expected/testimages/images/truncated.png | Bin 1429 -> 0 bytes .../testimages/images/tv-collapsable-last.gif | Bin 85 -> 0 bytes .../testimages/images/tv-collapsable.gif | Bin 781 -> 0 bytes .../testimages/images/tv-expandable-last.gif | Bin 89 -> 0 bytes .../testimages/images/tv-expandable.gif | Bin 787 -> 0 bytes .../testimages/images/tv-item-last.gif | Bin 65 -> 0 bytes .../expected/testimages/images/tv-item.gif | Bin 750 -> 0 bytes .../expected/themes/basque-red/main.css | 6 - .../themes/basque-red/main_imagemodified.css | 6 - .../themes/basque-red/main_importmodified.css | 6 - .../themes/basque-red/main_stylesheet.css | 6 - .../basque-red/main_testcompilethemes.css | 6 - .../themes/basque-red/main_varchanged.css | 6 - .../themes/basque-red/theme-parameters.json | 1 - .../getimages/expected-getimages.json | 42 - .../getimages/imagefolder2/subdir/tutu.png | 0 .../getimages/test-getimages.scss | 9 - 97 files changed, 39 insertions(+), 17718 deletions(-) delete mode 100644 datamodels/2.x/itop-config-mgmt/precompiled-themes/light-grey/main.css delete mode 100644 datamodels/2.x/itop-config-mgmt/precompiled-themes/test-red/main.css delete mode 100644 test/application/ThemeHandlerTest.php delete mode 100644 test/application/theme-handler/copied/testimages/css/ui-lightness/images/ui-bg_diagonals-thick_18_b81900_40x40.png delete mode 100644 test/application/theme-handler/copied/testimages/css/ui-lightness/images/ui-bg_diagonals-thick_20_666666_40x40.png delete mode 100644 test/application/theme-handler/copied/testimages/css/ui-lightness/images/ui-icons_1c94c4_256x240.png delete mode 100644 test/application/theme-handler/copied/testimages/css/ui-lightness/images/ui-icons_222222_256x240.png delete mode 100644 test/application/theme-handler/copied/testimages/css/ui-lightness/images/ui-icons_E87C1E_256x240.png delete mode 100644 test/application/theme-handler/copied/testimages/css/ui-lightness/images/ui-icons_F26522_256x240.png delete mode 100644 test/application/theme-handler/copied/testimages/css/ui-lightness/images/ui-icons_ffd27a_256x240.png delete mode 100644 test/application/theme-handler/copied/testimages/css/ui-lightness/images/ui-icons_ffffff_256x240.png delete mode 100644 test/application/theme-handler/copied/testimages/images/ac-background.gif delete mode 100644 test/application/theme-handler/copied/testimages/images/actions_right.png delete mode 100644 test/application/theme-handler/copied/testimages/images/bg.gif delete mode 100644 test/application/theme-handler/copied/testimages/images/breadcrumb-separator.png delete mode 100644 test/application/theme-handler/copied/testimages/images/calendar.png delete mode 100644 test/application/theme-handler/copied/testimages/images/delete.png delete mode 100644 test/application/theme-handler/copied/testimages/images/desc.gif delete mode 100644 test/application/theme-handler/copied/testimages/images/error.png delete mode 100644 test/application/theme-handler/copied/testimages/images/eye-closed-555.png delete mode 100644 test/application/theme-handler/copied/testimages/images/eye-closed-fff.png delete mode 100644 test/application/theme-handler/copied/testimages/images/eye-open-555.png delete mode 100644 test/application/theme-handler/copied/testimages/images/eye-open-fff.png delete mode 100644 test/application/theme-handler/copied/testimages/images/full-screen.png delete mode 100644 test/application/theme-handler/copied/testimages/images/green-header.gif delete mode 100644 test/application/theme-handler/copied/testimages/images/green-square.gif delete mode 100644 test/application/theme-handler/copied/testimages/images/indicator.gif delete mode 100644 test/application/theme-handler/copied/testimages/images/info-mini.png delete mode 100644 test/application/theme-handler/copied/testimages/images/minus.gif delete mode 100644 test/application/theme-handler/copied/testimages/images/ok.png delete mode 100644 test/application/theme-handler/copied/testimages/images/orange-header.gif delete mode 100644 test/application/theme-handler/copied/testimages/images/plus.gif delete mode 100644 test/application/theme-handler/copied/testimages/images/red-header.gif delete mode 100644 test/application/theme-handler/copied/testimages/images/truncated.png delete mode 100644 test/application/theme-handler/copied/testimages/images/tv-collapsable-last.gif delete mode 100644 test/application/theme-handler/copied/testimages/images/tv-collapsable.gif delete mode 100644 test/application/theme-handler/copied/testimages/images/tv-expandable-last.gif delete mode 100644 test/application/theme-handler/copied/testimages/images/tv-expandable.gif delete mode 100644 test/application/theme-handler/copied/testimages/images/tv-item-last.gif delete mode 100644 test/application/theme-handler/copied/testimages/images/tv-item.gif delete mode 100644 test/application/theme-handler/expected/css/css-variables.scss delete mode 100644 test/application/theme-handler/expected/css/light-grey.scss delete mode 100644 test/application/theme-handler/expected/css/ui-lightness/jqueryui.scss delete mode 100644 test/application/theme-handler/expected/testimages/css/ui-lightness/images/ui-bg_diagonals-thick_18_b81900_40x40.png delete mode 100644 test/application/theme-handler/expected/testimages/css/ui-lightness/images/ui-bg_diagonals-thick_20_666666_40x40.png delete mode 100644 test/application/theme-handler/expected/testimages/css/ui-lightness/images/ui-icons_1c94c4_256x240.png delete mode 100644 test/application/theme-handler/expected/testimages/css/ui-lightness/images/ui-icons_222222_256x240.png delete mode 100644 test/application/theme-handler/expected/testimages/css/ui-lightness/images/ui-icons_E87C1E_256x240.png delete mode 100644 test/application/theme-handler/expected/testimages/css/ui-lightness/images/ui-icons_F26522_256x240.png delete mode 100644 test/application/theme-handler/expected/testimages/css/ui-lightness/images/ui-icons_ffd27a_256x240.png delete mode 100644 test/application/theme-handler/expected/testimages/css/ui-lightness/images/ui-icons_ffffff_256x240.png delete mode 100644 test/application/theme-handler/expected/testimages/images/ac-background.gif delete mode 100644 test/application/theme-handler/expected/testimages/images/actions_right.png delete mode 100644 test/application/theme-handler/expected/testimages/images/bg.gif delete mode 100644 test/application/theme-handler/expected/testimages/images/breadcrumb-separator.png delete mode 100644 test/application/theme-handler/expected/testimages/images/calendar.png delete mode 100644 test/application/theme-handler/expected/testimages/images/delete.png delete mode 100644 test/application/theme-handler/expected/testimages/images/desc.gif delete mode 100644 test/application/theme-handler/expected/testimages/images/error.png delete mode 100644 test/application/theme-handler/expected/testimages/images/eye-closed-555.png delete mode 100644 test/application/theme-handler/expected/testimages/images/eye-closed-fff.png delete mode 100644 test/application/theme-handler/expected/testimages/images/eye-open-555.png delete mode 100644 test/application/theme-handler/expected/testimages/images/eye-open-fff.png delete mode 100644 test/application/theme-handler/expected/testimages/images/full-screen.png delete mode 100644 test/application/theme-handler/expected/testimages/images/green-header.gif delete mode 100644 test/application/theme-handler/expected/testimages/images/green-square.gif delete mode 100644 test/application/theme-handler/expected/testimages/images/indicator.gif delete mode 100644 test/application/theme-handler/expected/testimages/images/info-mini.png delete mode 100644 test/application/theme-handler/expected/testimages/images/minus.gif delete mode 100644 test/application/theme-handler/expected/testimages/images/ok.png delete mode 100644 test/application/theme-handler/expected/testimages/images/orange-header.gif delete mode 100644 test/application/theme-handler/expected/testimages/images/plus.gif delete mode 100644 test/application/theme-handler/expected/testimages/images/red-header.gif delete mode 100644 test/application/theme-handler/expected/testimages/images/truncated.png delete mode 100644 test/application/theme-handler/expected/testimages/images/tv-collapsable-last.gif delete mode 100644 test/application/theme-handler/expected/testimages/images/tv-collapsable.gif delete mode 100644 test/application/theme-handler/expected/testimages/images/tv-expandable-last.gif delete mode 100644 test/application/theme-handler/expected/testimages/images/tv-expandable.gif delete mode 100644 test/application/theme-handler/expected/testimages/images/tv-item-last.gif delete mode 100644 test/application/theme-handler/expected/testimages/images/tv-item.gif delete mode 100644 test/application/theme-handler/expected/themes/basque-red/main.css delete mode 100644 test/application/theme-handler/expected/themes/basque-red/main_imagemodified.css delete mode 100644 test/application/theme-handler/expected/themes/basque-red/main_importmodified.css delete mode 100644 test/application/theme-handler/expected/themes/basque-red/main_stylesheet.css delete mode 100644 test/application/theme-handler/expected/themes/basque-red/main_testcompilethemes.css delete mode 100644 test/application/theme-handler/expected/themes/basque-red/main_varchanged.css delete mode 100644 test/application/theme-handler/expected/themes/basque-red/theme-parameters.json delete mode 100644 test/application/theme-handler/getimages/expected-getimages.json delete mode 100644 test/application/theme-handler/getimages/imagefolder2/subdir/tutu.png delete mode 100644 test/application/theme-handler/getimages/test-getimages.scss diff --git a/.make/release/update-versions.php b/.make/release/update-versions.php index 488131d4bf..0f1dcd24e5 100644 --- a/.make/release/update-versions.php +++ b/.make/release/update-versions.php @@ -25,6 +25,7 @@ require_once (__DIR__.DIRECTORY_SEPARATOR.'update.classes.inc.php'); /** @var \FileVersionUpdater[] $aFilesUpdaters */ $aFilesUpdaters = array( new iTopVersionFileUpdater(), + new CssVariablesFileUpdater(), new DatamodelsModulesFiles(), ); diff --git a/.make/release/update.classes.inc.php b/.make/release/update.classes.inc.php index d344455c07..6e20ee0d7c 100644 --- a/.make/release/update.classes.inc.php +++ b/.make/release/update.classes.inc.php @@ -89,6 +89,26 @@ class iTopVersionFileUpdater extends AbstractSingleFileVersionUpdater } } +class CssVariablesFileUpdater extends AbstractSingleFileVersionUpdater +{ + public function __construct() + { + parent::__construct('css/css-variables.scss'); + } + + /** + * @inheritDoc + */ + public function UpdateFileContent($sVersionLabel, $sFileContent, $sFileFullPath) + { + return preg_replace( + '/(\$version: "v)[^"]*(";)/', + '${1}'.$sVersionLabel.'${2}', + $sFileContent + ); + } +} + abstract class AbstractGlobFileVersionUpdater extends FileVersionUpdater { protected $sGlobPattern; diff --git a/application/themehandler.class.inc.php b/application/themehandler.class.inc.php index 8dbd016add..de2fb21ca0 100644 --- a/application/themehandler.class.inc.php +++ b/application/themehandler.class.inc.php @@ -25,9 +25,6 @@ */ class ThemeHandler { - const IMAGE_EXTENSIONS = array('png', 'gif', 'jpg', 'jpeg'); - - private static $oCompileCSSService; /** * Return default theme name and parameters * @@ -111,7 +108,7 @@ class ThemeHandler SetupUtils::builddir($sDefaultThemeDirPath); } - static::CompileTheme($sThemeId, false, $aDefaultTheme['parameters']); + static::CompileTheme($sThemeId, $aDefaultTheme['parameters']); } // Return absolute url to theme compiled css @@ -119,29 +116,17 @@ class ThemeHandler } /** - * Compile the $sThemeId theme, the actual compilation is skipped when either - * 1) The produced CSS file exists and is more recent than any of its components (imports, stylesheets) - * 2) The produced CSS file exists and its signature is equal to the expected signature (imports, stylesheets, variables) + * Compile the $sThemeId theme * * @param string $sThemeId - * @param mix $sSetupCompilationTimestamp : when setup context this is compilation timestamp. otherwise false. * @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 */ - public static function CompileTheme($sThemeId, $sSetupCompilationTimestamp=false, $aThemeParameters = null, $aImportsPaths = null, $sWorkingPath = null) + public static function CompileTheme($sThemeId, $aThemeParameters = null, $aImportsPaths = null, $sWorkingPath = null) { - if ($sSetupCompilationTimestamp===false) - { - $sSetupCompilationTimestamp = microtime(true); - $bSetup = false; - } - else - { - $bSetup = true; - } // Default working path if($sWorkingPath === null) { @@ -163,7 +148,6 @@ class ThemeHandler // Save parameters if passed... (typically during DM compilation) if(is_array($aThemeParameters)) { - $aThemeParameters = self::PrepareThemeParameterBeforeSavingAndCompiling($aThemeParameters, $sWorkingPath, $sThemeFolderPath, $sSetupCompilationTimestamp); 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) @@ -180,626 +164,27 @@ class ThemeHandler $iStyleLastModified = 0; clearstatcache(); // Loading files to import and stylesheet to compile, also getting most recent modification time on overall files - - $aStylesheetFiles = array(); foreach ($aThemeParameters['imports'] as $sImport) { $sTmpThemeScssContent .= '@import "'.$sImport.'";'."\n"; - $sFile = static::FindStylesheetFile($sImport, $aImportsPaths); - $iImportLastModified = @filemtime($sFile); - $aStylesheetFiles[] = $sFile; + $iImportLastModified = @filemtime($sWorkingPath.$sImport); $iStyleLastModified = $iStyleLastModified < $iImportLastModified ? $iImportLastModified : $iStyleLastModified; } foreach ($aThemeParameters['stylesheets'] as $sStylesheet) { $sTmpThemeScssContent .= '@import "'.$sStylesheet.'";'."\n"; - $sFile = static::FindStylesheetFile($sStylesheet, $aImportsPaths); - $iStylesheetLastModified = @filemtime($sFile); - $aStylesheetFiles[] = $sFile; + $iStylesheetLastModified = @filemtime($sWorkingPath.$sStylesheet); $iStyleLastModified = $iStyleLastModified < $iStylesheetLastModified ? $iStylesheetLastModified : $iStyleLastModified; } - $aIncludedImages=static::GetIncludedImages($aThemeParameters['variables'], $aStylesheetFiles, $sThemeFolderPath, $aImportsPaths); - foreach ($aIncludedImages as $sImage) - { - if (!is_file($sImage)) - { - IssueLog::Warning("Cannot find $sImage during SCSS $sThemeId precompilation"); - } - else - { - $iStylesheetLastModified = @filemtime($sImage); - $iStyleLastModified = $iStyleLastModified < $iStylesheetLastModified ? $iStylesheetLastModified : $iStyleLastModified; - } - } - // Checking if our compiled css is outdated - $iFilemetime = @filemtime($sThemeCssPath); - $bFileExists = file_exists($sThemeCssPath); - $bVarSignatureChanged=false; - if ($bFileExists && $bSetup) + if (!file_exists($sThemeCssPath) || (is_writable($sThemeFolderPath) && (@filemtime($sThemeCssPath) < $iStyleLastModified))) { - $sPrecompiledSignature = static::GetSignature($sThemeCssPath); - //check variable signature has changed which is independant from any file modification - if (!empty($sPrecompiledSignature)){ - $sPreviousVariableSignature = static::GetVarSignature($sPrecompiledSignature); - $sCurrentVariableSignature = md5(json_encode($aThemeParameters['variables'])); - $bVarSignatureChanged= ($sPreviousVariableSignature!==$sCurrentVariableSignature); - } + $sTmpThemeCssContent = utils::CompileCSSFromSASS($sTmpThemeScssContent, $aImportsPaths, $aThemeParameters['variables']); + file_put_contents($sThemeCssPath, $sTmpThemeCssContent); } - - if (!$bFileExists || $bVarSignatureChanged || (is_writable($sThemeFolderPath) && ($iFilemetime < $iStyleLastModified))) - { - // Dates don't match. Second chance: check if the already compiled stylesheet exists and is consistent based on its signature - $sActualSignature = static::ComputeSignature($aThemeParameters, $aImportsPaths, $aIncludedImages); - - if ($bFileExists && !$bSetup) - { - $sPrecompiledSignature = static::GetSignature($sThemeCssPath); - } - - if (!empty($sPrecompiledSignature) && $sActualSignature == $sPrecompiledSignature) - { - touch($sThemeCssPath); // Stylesheet is up to date, mark it as more recent to speedup next time - } - else - { - // Alas, we really need to recompile - // Add the signature to the generated CSS file so that the file can be used as a precompiled stylesheet if needed - $sSignatureComment = - <<CompileCSSFromSASS($sTmpThemeScssContent, $aImportsPaths, - $aThemeParameters['variables']); - file_put_contents($sThemeFolderPath.'/theme-parameters.json', json_encode($aThemeParameters)); - file_put_contents($sThemeCssPath, $sSignatureComment.$sTmpThemeCssContent); - } - } - } - - /** - * Compute the signature of a theme defined by its theme parameters. The signature is a JSON structure of - * 1) one MD5 of all the variables/values (JSON encoded) - * 2) the MD5 of each stylesheet file - * 3) the MD5 of each import file - * - * @param string[] $aThemeParameters - * @param string[] $aImportsPaths - * @param string[] $aIncludedImages - * - * @return string - * @throws \Exception - */ - public static function ComputeSignature($aThemeParameters, $aImportsPaths, $aIncludedImages) - { - $aSignature = array( - 'variables' => md5(json_encode($aThemeParameters['variables'])), - 'stylesheets' => array(), - 'imports' => array(), - 'images' => array(), - ); - - foreach ($aThemeParameters['imports'] as $key => $sImport) - { - $sFile = static::FindStylesheetFile($sImport, $aImportsPaths); - $aSignature['stylesheets'][$key] = md5_file($sFile); - } - foreach ($aThemeParameters['stylesheets'] as $key => $sStylesheet) - { - $sFile = static::FindStylesheetFile($sStylesheet, $aImportsPaths); - $aSignature['stylesheets'][$key] = md5_file($sFile); - } - foreach ($aIncludedImages as $sImage) - { - if (is_file($sImage)) - { - $aSignature['images'][$sImage] = md5_file($sImage); - } - } - - return json_encode($aSignature); - } - - /** - * Search for images referenced in stylesheet files - * @param array $aThemeParametersVariables - * @param array $aStylesheetFiles - * @param string $sThemeFolderPath : used as relative paths to find css images - * - * @return array - * @since 2.8.0 - */ - public static function GetIncludedImages($aThemeParametersVariables, $aStylesheetFiles, $sThemeFolderPath, $aImportsPaths) - { - $aCompleteUrls = array(); - $aToCompleteUrls = array(); - $aMissingVariables = array(); - $aFoundVariables = array('version'=>''); - $aMap = array( - 'aCompleteUrls' => $aCompleteUrls, - 'aToCompleteUrls' => $aToCompleteUrls, - 'aMissingVariables' => $aMissingVariables, - 'aFoundVariables' => $aFoundVariables, - ); - - foreach ($aStylesheetFiles as $sStylesheetFile) - { - $aRes = static::GetAllUrlFromScss($aThemeParametersVariables, $sStylesheetFile); - /** @var array $aVal */ - foreach($aMap as $key => $aVal) - { - if (array_key_exists($key, $aMap)) - { - $aMap[$key] = array_merge($aVal, $aRes[$key]); - } - } - } - - $aMap = static::ResolveUncompleteUrlsFromScss($aMap, $aThemeParametersVariables, $aStylesheetFiles); - $aImages = array(); - $aAllImagesMap = false; - foreach ($aMap ['aCompleteUrls'] as $sUri => $sUrl) - { - $sImg = $sUrl; - if (preg_match("/(.*)\?/", $sUrl, $aMatches)) - { - $sImg=$aMatches[1]; - } - - if (static::HasImageExtension($sImg) - && ! array_key_exists($sImg, $aImages)) - { - $sFilePath = realpath($sImg); - if ($sFilePath!==false) - { - $aImages[$sImg]=$sFilePath; - continue; - } - - $sFilePath=realpath($sThemeFolderPath.DIRECTORY_SEPARATOR.$sImg); - if ($sFilePath!==false) - { - $aImages[$sImg]=$sFilePath; - continue; - } - - if ($aAllImagesMap===false) - { - //$aAllImagesMap = static::GetAllImagesMap($aImportsPaths); - $aAllImagesMap = static::ScanFolderImages(APPROOT); - } - - $sFileName = basename($sImg); - if (array_key_exists($sFileName, $aAllImagesMap)) - { - foreach ($aAllImagesMap[$sFileName] as $sFilePath) - { - echo "=========== \n $sUri \n => $sFilePath\n".strpos($sFilePath, $sUri)."\n"; - if (strpos($sFilePath, $sUri)!==false) - { - $aImages[$sImg]=$sFilePath; - break; - } - } - } - - echo "!!!!!!!!!!!\n"; - } - } - - return array_values($aImages); - } - - public static function GetAllImagesMap($aImportsPaths) - { - $aImagesMap = []; - foreach ($aImportsPaths as $sFolder) - { - if (is_dir($sFolder)) - { - $aImagesMap = array_merge($aImagesMap, static::ScanFolderImages($sFolder)); - } - } - return $aImagesMap; - } - - - public static function ScanFolderImages($sFolder) - { - //var_dump($sFolder); - $aImagesMap = []; - foreach (scandir($sFolder) as $sFile) - { - if (in_array($sFile,array(".",".."))) - { - continue; - } - $sFilePath = $sFolder . DIRECTORY_SEPARATOR . $sFile; - if (is_dir($sFilePath)) - { - $aImagesMap = array_merge($aImagesMap, static::ScanFolderImages($sFilePath)); - } - else if (static::HasImageExtension($sFilePath)) - { - if (array_key_exists($sFile, $aImagesMap)) - { - $aImagesMap[$sFile][] = $sFilePath; - } - else - { - $aImagesMap[$sFile] = [ $sFilePath ] ; - } - } - } - - return $aImagesMap; - } - - /** - * Complete url using provided variables. Example with $var=1: XX + $var => XX1 - * @param $aMap - * @param $aThemeParametersVariables - * @param $aStylesheetFile - * - * @return mixed - */ - public static function ResolveUncompleteUrlsFromScss($aMap, $aThemeParametersVariables, $aStylesheetFile) - { - $sContent=""; - foreach ($aStylesheetFile as $sStylesheetFile) - { - if (is_file($sStylesheetFile)) - { - $sContent .= '\n' . file_get_contents($sStylesheetFile); - } - } - - $aMissingVariables=$aMap['aMissingVariables']; - $aFoundVariables=$aMap['aFoundVariables']; - $aToCompleteUrls=$aMap['aToCompleteUrls']; - $aCompleteUrls=$aMap['aCompleteUrls']; - list($aMissingVariables, $aFoundVariables) = static::FindMissingVariables($aThemeParametersVariables, $aMissingVariables, $aFoundVariables, $sContent, true); - list($aToCompleteUrls, $aCompleteUrls) = static::ResolveUrls($aFoundVariables, $aToCompleteUrls, $aCompleteUrls); - $aMap['aMissingVariables']=$aMissingVariables; - $aMap['aFoundVariables']=$aFoundVariables; - $aMap['aToCompleteUrls']=$aToCompleteUrls; - $aMap['aCompleteUrls']=$aCompleteUrls; - return $aMap; - } - - /** - * Find missing variable values from SCSS content based on their name. - * - * @param $aThemeParametersVariables - * @param $aMissingVariables - * @param $aFoundVariables - * @param $sContent : scss content - * @param bool $bForceEmptyValueWhenNotFound - * - * @return array - */ - public static function FindMissingVariables($aThemeParametersVariables, $aMissingVariables, $aFoundVariables, $sContent, $bForceEmptyValueWhenNotFound=false) - { - $aNewMissingVars = array(); - if (!empty($aMissingVariables)) - { - foreach ($aMissingVariables as $var) - { - if (array_key_exists($var, $aThemeParametersVariables)) - { - $aFoundVariables[$var] = $aThemeParametersVariables[$var]; - } - else - { - if (preg_match_all("/\\\$$var\s*:\s*[\"']{0,1}(.*)[\"']{0,1};/", $sContent, $aValues)) - { - $sValue = $aValues[1][0]; - if (preg_match_all("/([^!]+)!/", $sValue, $aSubValues)) - { - $sValue = trim($aSubValues[1][0], ' "\''); - } - - if (strpos($sValue, '$') === false) - { - $aFoundVariables[$var] = $sValue; - } - else{ - $aNewMissingVars[] = $var; - } - } - else - { - if ($bForceEmptyValueWhenNotFound) - { - $aFoundVariables[$var] = ''; - } - else - { - $aNewMissingVars[] = $var; - } - } - } - } - } - - return array($aNewMissingVars, $aFoundVariables); - } - - /** - * @param $aFoundVariables - * @param array $aToCompleteUrls - * @param array $aCompleteUrls - * - * @return array - */ - public static function ResolveUrls($aFoundVariables, array $aToCompleteUrls, array $aCompleteUrls) - { - if (!empty($aFoundVariables)) - { - $aFoundVariablesWithEmptyValue = []; - foreach ($aFoundVariables as $aFoundVariable => $sValue) - { - $aFoundVariablesWithEmptyValue[$aFoundVariable] = ''; - } - - foreach ($aToCompleteUrls as $sUrlTemplate) - { - unset($aToCompleteUrls[$sUrlTemplate]); - $sResolvedUrl = static::ResolveUrl($sUrlTemplate, $aFoundVariables); - if ($sResolvedUrl == false) - { - $aToCompleteUrls[$sUrlTemplate] = $sUrlTemplate; - } - else - { - $sUri = static::ResolveUrl($sUrlTemplate, $aFoundVariablesWithEmptyValue); - $aExplodedUri = explode('?', $sUri); - if (empty($aExplodedUri)) - { - $aCompleteUrls[$sUri] = $sResolvedUrl; - } - else - { - $aCompleteUrls[$aExplodedUri[0]] = $sResolvedUrl; - } - } - } - } - - return array($aToCompleteUrls, $aCompleteUrls); - } - - /** - * Find all referenced URLs from a SCSS file. - * @param $aThemeParametersVariables - * @param $sStylesheetFile - * - * @return array - */ - public static function GetAllUrlFromScss($aThemeParametersVariables, $sStylesheetFile) - { - $aCompleteUrls = array(); - $aToCompleteUrls = array(); - $aMissingVariables = array(); - $aFoundVariables = array(); - - if (is_file($sStylesheetFile)) - { - $sContent = file_get_contents($sStylesheetFile); - if (preg_match_all("/url\s*\((.*)\)/", $sContent, $aMatches)) - { - foreach ($aMatches[1] as $path) - { - if (!array_key_exists($path, $aCompleteUrls) - && !array_key_exists($path, $aToCompleteUrls)) - { - if (preg_match_all("/\\$([\w-_]+)/", $path, $aCurrentVars)) - { - /** @var string $aCurrentVars */ - foreach ($aCurrentVars[1] as $var) - { - if (!array_key_exists($var, $aMissingVariables)) - { - $aMissingVariables[$var] = $var; - } - } - $aToCompleteUrls[$path] = $path; - } - else - { - $aCompleteUrls[$path] = trim($path, "\"'"); - } - } - } - } - if (!empty($aMissingVariables)) - { - list($aMissingVariables, $aFoundVariables) = static::FindMissingVariables($aThemeParametersVariables, $aMissingVariables, $aFoundVariables, $sContent); - list($aToCompleteUrls, $aCompleteUrls) = static::ResolveUrls($aFoundVariables, $aToCompleteUrls, $aCompleteUrls); - } - } - - return array( - 'aCompleteUrls' => $aCompleteUrls, - 'aToCompleteUrls' => $aToCompleteUrls, - 'aMissingVariables' => $aMissingVariables, - 'aFoundVariables' => $aFoundVariables, - ); - } - - /** - * Calculate url based on its template + variables. - * @param $sUrlTemplate - * @param $aFoundVariables - * - * @return bool|string - */ - public static function ResolveUrl($sUrlTemplate, $aFoundVariables) - { - $aPattern=array(); - $aReplacement=array(); - foreach ($aFoundVariables as $aFoundVariable => $aFoundVariableValue) - { - //XX + $key + YY - $aPattern[]="/['\"]\s*\+\s*\\\$" . $aFoundVariable . "[\s\+]+\s*['\"]/"; - $aReplacement[]=$aFoundVariableValue; - //$key + YY - $aPattern[]="/\\\$" . $aFoundVariable. "[\s\+]+\s*['\"]/"; - $aReplacement[]=$aFoundVariableValue; - //XX + $key - $aPattern[]="/['\"]\s*[\+\s]+\\\$" . $aFoundVariable . "$/"; - $aReplacement[]=$aFoundVariableValue; - } - $sResolvedUrl=preg_replace($aPattern, $aReplacement, $sUrlTemplate); - if (strpos($sResolvedUrl, "+")!==false) - { - return false; - } - return trim($sResolvedUrl, "\"'"); - } - - /** - * indicate whether a string ends with image suffix. - * @param $path - * - * @return bool - */ - private static function HasImageExtension($path) - { - foreach (static::IMAGE_EXTENSIONS as $sExt) - { - if (endsWith($path, $sExt)) - { - return true; - } - } - return false; - } - - - /** - * Extract the signature for a generated CSS file. The signature MUST be alone one line immediately - * followed (on the next line) by the === SIGNATURE END === pattern - * - * Note the signature can be place anywhere in the CSS file (obviously inside a CSS comment !) but the - * function will be faster if the signature is at the beginning of the file (since the file is scanned from the start) - * - * @param $sFilepath - * - * @return string - */ - public static function GetSignature($sFilepath) - { - $sPreviousLine = ''; - $hFile = @fopen($sFilepath, "r"); - if ($hFile !== false) - { - $sLine = ''; - do - { - $sPreviousLine = $sLine; - $sLine = rtrim(fgets($hFile)); // Remove the trailing \n - } - while (($sLine !== false) && ($sLine != '=== SIGNATURE END ===')); - fclose($hFile); - } - return $sPreviousLine; - } - - public static function GetVarSignature($JsonSignature) - { - $aJsonArray = json_decode($JsonSignature, true); - if (array_key_exists('variables', $aJsonArray)) - { - return $aJsonArray['variables']; - } - return false; - } - - /** - * Find the given file in the list of ImportsPaths directory - * @param string $sFile - * @param string[] $aImportsPaths - * @throws Exception - * @return string - */ - public static function FindStylesheetFile($sFile, $aImportsPaths) - { - foreach($aImportsPaths as $sPath) - { - $sImportedFile = realpath($sPath.'/'.$sFile); - if (file_exists($sImportedFile)) - { - return $sImportedFile; - } - } - return ''; // Not found, fail silently, maybe the SCSS compiler knowns better... - } - - public static function MockCompileCSSService($oCompileCSSServiceMock) - { - static::$oCompileCSSService = $oCompileCSSServiceMock; - } - - /** - * 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) - * @param $aThemeParameters - * @param $sWorkingPath - * @param $sThemeFolderPath - * - * @return mixed - */ - public static function PrepareThemeParameterBeforeSavingAndCompiling($aThemeParameters, $sWorkingPath, $sThemeFolderPath, $bSetupCompilationTimestamp) - { - if (array_key_exists('variables', $aThemeParameters)) - { - if (is_array($aThemeParameters['variables'])) - { - $aThemeParameters['variables']['$version'] = $bSetupCompilationTimestamp; - } - } - else - { - $aThemeParameters['variables']['$version'] = $bSetupCompilationTimestamp; - } - - if (!is_dir($sThemeFolderPath)) - { - mkdir($sWorkingPath.'/branding/'); - mkdir($sWorkingPath.'/branding/themes/'); - } - - return $aThemeParameters; } } -class CompileCSSService -{ - /** - * CompileCSSService constructor. - */ - public function __construct() - { - } - - public function CompileCSSFromSASS($sSassContent, $aImportPaths = array(), $aVariables = array()){ - return utils::CompileCSSFromSASS($sSassContent, $aImportPaths, $aVariables); - } - -} - diff --git a/application/utils.inc.php b/application/utils.inc.php index 53e65814e8..28e1c5a9b2 100644 --- a/application/utils.inc.php +++ b/application/utils.inc.php @@ -1860,13 +1860,17 @@ class utils } /** - * @deprecated * @param string $sModuleName * @return string|NULL compiled version of a given module, as it was seen by the compiler */ public static function GetCompiledModuleVersion($sModuleName) { - return static::GetCacheBusterTimestamp(); + $aModulesInfo = GetModulesInfo(); + if (array_key_exists($sModuleName, $aModulesInfo)) + { + return $aModulesInfo[$sModuleName]['version']; + } + return null; } /** diff --git a/css/css-variables.scss b/css/css-variables.scss index b017a9cf27..8a752928f0 100644 --- a/css/css-variables.scss +++ b/css/css-variables.scss @@ -16,7 +16,6 @@ * You should have received a copy of the GNU Affero General Public License */ - // Beware the version number MUST be enclosed with quotes otherwise v2.3.0 becomes v2 0.3 .0 $version: "v2.8.0"; $approot-relative: "../../../../../" !default; // relative to env-***/branding/themes/***/main.css diff --git a/datamodels/2.x/itop-config-mgmt/datamodel.itop-config-mgmt.xml b/datamodels/2.x/itop-config-mgmt/datamodel.itop-config-mgmt.xml index 58719ee786..af44aa376d 100755 --- a/datamodels/2.x/itop-config-mgmt/datamodel.itop-config-mgmt.xml +++ b/datamodels/2.x/itop-config-mgmt/datamodel.itop-config-mgmt.xml @@ -8384,7 +8384,6 @@ ../css/ui-lightness/jqueryui.scss ../css/light-grey.scss - itop-config-mgmt/precompiled-themes/light-grey/main.css @@ -8400,7 +8399,6 @@ ../css/light-grey.scss ../css/backoffice-environment-banner.scss - itop-config-mgmt/precompiled-themes/test-red/main.css diff --git a/datamodels/2.x/itop-config-mgmt/precompiled-themes/light-grey/main.css b/datamodels/2.x/itop-config-mgmt/precompiled-themes/light-grey/main.css deleted file mode 100644 index 9fbd0b990d..0000000000 --- a/datamodels/2.x/itop-config-mgmt/precompiled-themes/light-grey/main.css +++ /dev/null @@ -1,5217 +0,0 @@ -/* -=== SIGNATURE BEGIN === -{"variables":"d751713988987e9331980363e24189ce","stylesheets":{"css-variables":"1d4b4ae2a6fba3db101f8dd1cecab082","jqueryui":"78cfafc3524dac98e61fc2460918d4e5","main":"0dd837aeddc3f407c980e0b20f06dd4c"},"imports":[],"images":[]} -=== SIGNATURE END === - */ - /*! - * Copyright (C) 2013-2020 Combodo SARL - * - * This file is part of iTop. - * - * iTop is free software; you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * iTop is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - */ -/*! jQuery UI - v1.12.1 - 2018-02-20 - * http://jqueryui.com - * Includes: draggable.css, core.css, resizable.css, selectable.css, sortable.css, accordion.css, autocomplete.css, menu.css, button.css, controlgroup.css, checkboxradio.css, datepicker.css, dialog.css, progressbar.css, selectmenu.css, slider.css, spinner.css, tabs.css, tooltip.css, theme.css - * To view and modify this theme, visit http://jqueryui.com/themeroller/?scope=&folderName=custom-theme&bgImgOpacityError=18&bgImgOpacityHighlight=75&bgImgOpacityActive=65&bgImgOpacityHover=100&bgImgOpacityDefault=100&bgImgOpacityContent=100&bgImgOpacityHeader=35&cornerRadiusShadow=5px&offsetLeftShadow=-5px&offsetTopShadow=-5px&thicknessShadow=5px&opacityShadow=20&bgImgOpacityShadow=10&bgTextureShadow=flat&bgColorShadow=%23000000&opacityOverlay=50&bgImgOpacityOverlay=20&bgTextureOverlay=diagonals_thick&bgColorOverlay=%23666666&iconColorError=%23ffd27a&fcError=%23ffffff&borderColorError=%23cd0a0a&bgTextureError=diagonals_thick&bgColorError=%23b81900&iconColorHighlight=%231c94c4&fcHighlight=%23363636&borderColorHighlight=%23fed22f&bgTextureHighlight=flat&bgColorHighlight=%23ffe45c&iconColorActive=%23E87C1E&fcActive=%23E87C1E&borderColorActive=%23E87C1E&bgTextureActive=flat&bgColorActive=%23ffffff&iconColorHover=%23E87C1E&fcHover=%23E87C1E&borderColorHover=%23E87C1E&bgTextureHover=flat&bgColorHover=%23fde17c&iconColorDefault=%23F26522&fcDefault=%23555555&borderColorDefault=%23cccccc&bgTextureDefault=flat&bgColorDefault=%23f1f1f1&iconColorContent=%23222222&fcContent=%23333333&borderColorContent=%23dddddd&bgTextureContent=flat&bgColorContent=%23eeeeee&iconColorHeader=%23ffffff&fcHeader=%23ffffff&borderColorHeader=%23F26522&bgTextureHeader=flat&bgColorHeader=%23E87C1E&cornerRadius=0&fwDefault=bold&fsDefault=1.1em&ffDefault=Trebuchet%20MS%2CTahoma%2CVerdana%2CArial%2Csans-serif - * Copyright jQuery Foundation and other contributors; Licensed MIT - * The original css file has been scssized (through www.css2scss.com) - */ -.ui-draggable-handle { - -ms-touch-action: none; - touch-action: none; -} -.ui-helper-hidden { - display: none; -} -.ui-helper-hidden-accessible { - border: 0; - clip: rect(0 0 0 0); - height: 1px; - margin: -1px; - overflow: hidden; - padding: 0; - position: absolute; - width: 1px; -} -.ui-helper-reset { - margin: 0; - padding: 0; - border: 0; - outline: 0; - line-height: 1.3; - text-decoration: none; - font-size: 100%; - list-style: none; -} -.ui-helper-clearfix:before { - content: ""; - display: table; - border-collapse: collapse; -} -.ui-helper-clearfix:after { - content: ""; - display: table; - border-collapse: collapse; - clear: both; -} -.ui-helper-zfix { - width: 100%; - height: 100%; - top: 0; - left: 0; - position: absolute; - opacity: 0; - filter: Alpha(Opacity=0); -} -.ui-front { - z-index: 100; -} -.ui-state-disabled { - cursor: default !important; - pointer-events: none; - opacity: 0.35; - filter: Alpha(Opacity=35); - background-image: none; -} -.ui-state-disabled .ui-icon { - filter: Alpha(Opacity=35); -} -.ui-icon { - display: inline-block; - vertical-align: middle; - margin-top: -0.25em; - position: relative; - text-indent: -99999px; - overflow: hidden; - 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"); - filter: hue-rotate(0deg); -} -.ui-widget-icon-block { - left: 50%; - margin-left: -8px; - display: block; -} -.ui-widget-overlay { - position: fixed; - top: 0; - 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; - opacity: 0.5; - filter: Alpha(Opacity=50); -} -.ui-resizable { - position: relative; -} -.ui-resizable-handle { - position: absolute; - font-size: 0.1px; - display: block; - -ms-touch-action: none; - touch-action: none; -} -.ui-resizable-disabled .ui-resizable-handle { - display: none; -} -.ui-resizable-autohide .ui-resizable-handle { - display: none; -} -.ui-resizable-n { - cursor: n-resize; - height: 7px; - width: 100%; - top: -5px; - left: 0; -} -.ui-resizable-s { - cursor: s-resize; - height: 7px; - width: 100%; - bottom: -5px; - left: 0; -} -.ui-resizable-e { - cursor: e-resize; - width: 7px; - right: -5px; - top: 0; - height: 100%; -} -.ui-resizable-w { - cursor: w-resize; - width: 7px; - left: -5px; - top: 0; - height: 100%; -} -.ui-resizable-se { - cursor: se-resize; - width: 12px; - height: 12px; - right: 1px; - bottom: 1px; -} -.ui-resizable-sw { - cursor: sw-resize; - width: 9px; - height: 9px; - left: -5px; - bottom: -5px; -} -.ui-resizable-nw { - cursor: nw-resize; - width: 9px; - height: 9px; - left: -5px; - top: -5px; -} -.ui-resizable-ne { - cursor: ne-resize; - width: 9px; - height: 9px; - right: -5px; - top: -5px; -} -.ui-selectable { - -ms-touch-action: none; - touch-action: none; -} -.ui-selectable-helper { - position: absolute; - z-index: 100; - border: 1px dotted black; -} -.ui-sortable-handle { - -ms-touch-action: none; - touch-action: none; -} -.ui-accordion .ui-accordion-header { - display: block; - cursor: pointer; - position: relative; - margin: 2px 0 0 0; - padding: 0.5em 0.5em 0.5em 0.7em; - font-size: 100%; -} -.ui-accordion .ui-accordion-content { - padding: 1em 2.2em; - border-top: 0; - overflow: auto; -} -.ui-autocomplete { - position: absolute; - top: 0; - left: 0; - cursor: default; -} -.ui-menu { - list-style: none; - padding: 0; - margin: 0; - display: block; - outline: 0; -} -.ui-menu .ui-menu { - position: absolute; -} -.ui-menu .ui-menu-item { - margin: 0; - cursor: pointer; - list-style-image: url("data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7?v=v2.7.0-1"); -} -.ui-menu .ui-menu-item-wrapper { - position: relative; - padding: 3px 1em 3px 0.4em; -} -.ui-menu .ui-menu-divider { - margin: 5px 0; - height: 0; - font-size: 0; - line-height: 0; - border-width: 1px 0 0 0; -} -.ui-menu .ui-state-focus { - margin: -1px; -} -.ui-menu .ui-state-active { - margin: -1px; -} -.ui-menu .ui-icon { - position: absolute; - top: 0; - bottom: 0; - left: 0.2em; - margin: auto 0; -} -.ui-menu .ui-menu-icon { - left: auto; - right: 0; -} -.ui-menu-icons { - position: relative; -} -.ui-menu-icons .ui-menu-item-wrapper { - padding-left: 2em; -} -.ui-button { - padding: 0.4em 1em; - display: inline-block; - position: relative; - line-height: normal; - margin-right: 0.1em; - cursor: pointer; - vertical-align: middle; - text-align: center; - -webkit-user-select: none; - -moz-user-select: none; - -ms-user-select: none; - user-select: none; - overflow: visible; - text-decoration: none; - border: 1px solid #cccccc; - background: #f1f1f1; - font-weight: bold; - color: #555555; -} -.ui-button:link { - text-decoration: none; -} -.ui-button:visited { - text-decoration: none; -} -.ui-button:hover { - text-decoration: none; - border: 1px solid #EA7D1E; - background: #fde17c; - font-weight: bold; - color: #EA7D1E; -} -.ui-button:hover .ui-icon { - background-image: url("../../../../../css/ui-lightness/images/ui-icons_E87C1E_256x240.png?v=v2.7.0-1"); -} -.ui-button:active { - text-decoration: none; - border: 1px solid #EA7D1E; - background: #ffffff; - font-weight: bold; - color: #EA7D1E; -} -.ui-button:active .ui-icon { - background-image: url("../../../../../css/ui-lightness/images/ui-icons_E87C1E_256x240.png?v=v2.7.0-1"); -} -.ui-button:focus { - border: 1px solid #EA7D1E; - background: #fde17c; - font-weight: bold; - color: #EA7D1E; -} -.ui-button:focus .ui-icon { - background-image: url("../../../../../css/ui-lightness/images/ui-icons_E87C1E_256x240.png?v=v2.7.0-1"); -} -.ui-button .ui-state-highlight.ui-icon { - background-image: url("../../../../../css/ui-lightness/images/ui-icons_1c94c4_256x240.png?v=v2.7.0-1"); -} -.ui-button .ui-icon { - background-image: url("../../../../../css/ui-lightness/images/ui-icons_F26522_256x240.png?v=v2.7.0-1"); -} -.ui-button-icon-only { - width: 2em; - box-sizing: border-box; - text-indent: -9999px; - white-space: nowrap; -} -.ui-button-icon-only .ui-icon { - position: absolute; - top: 50%; - left: 50%; - margin-top: -8px; - margin-left: -8px; -} -input.ui-button.ui-button-icon-only { - text-indent: 0; -} -.ui-button.ui-icon-notext .ui-icon { - padding: 0; - width: 2.1em; - height: 2.1em; - text-indent: -9999px; - white-space: nowrap; -} -input.ui-button.ui-icon-notext .ui-icon { - width: auto; - height: auto; - text-indent: 0; - white-space: normal; - padding: 0.4em 1em; -} -input.ui-button::-moz-focus-inner { - border: 0; - padding: 0; -} -button.ui-button::-moz-focus-inner { - border: 0; - padding: 0; -} -.ui-controlgroup { - vertical-align: middle; - display: inline-block; -} -.ui-controlgroup > .ui-controlgroup-item { - float: left; - margin-left: 0; - margin-right: 0; -} -.ui-controlgroup > .ui-controlgroup-item:focus { - z-index: 9999; -} -.ui-controlgroup > .ui-controlgroup-item.ui-visual-focus { - z-index: 9999; -} -.ui-controlgroup .ui-controlgroup-label { - padding: 0.4em 1em; -} -.ui-controlgroup .ui-controlgroup-label span { - font-size: 80%; -} -.ui-controlgroup-vertical > .ui-controlgroup-item { - display: block; - float: none; - width: 100%; - margin-top: 0; - margin-bottom: 0; - text-align: left; -} -.ui-controlgroup-vertical .ui-controlgroup-item { - box-sizing: border-box; -} -.ui-controlgroup-vertical .ui-controlgroup-label + .ui-controlgroup-item { - border-top: none; -} -.ui-controlgroup-vertical .ui-controlgroup-label.ui-widget-content { - border-bottom: none; -} -.ui-controlgroup-vertical .ui-spinner-input { - width: calc(100% - 2.4em); -} -.ui-controlgroup-vertical .ui-spinner .ui-spinner-up { - border-top-style: solid; -} -.ui-controlgroup-horizontal .ui-controlgroup-label + .ui-controlgroup-item { - border-left: none; -} -.ui-controlgroup-horizontal .ui-controlgroup-label.ui-widget-content { - border-right: none; -} -.ui-checkboxradio-label .ui-icon-background { - box-shadow: inset 1px 1px 1px #ccc; - border-radius: 0.12em; - border: none; -} -.ui-checkboxradio-radio-label .ui-icon-background { - width: 16px; - height: 16px; - border-radius: 1em; - overflow: visible; - border: none; -} -.ui-checkboxradio-radio-label.ui-checkboxradio-checked .ui-icon { - background-image: none; - width: 8px; - height: 8px; - border-width: 4px; - border-style: solid; -} -.ui-checkboxradio-radio-label.ui-checkboxradio-checked:hover .ui-icon { - background-image: none; - width: 8px; - height: 8px; - border-width: 4px; - border-style: solid; -} -.ui-checkboxradio-disabled { - pointer-events: none; -} -.ui-datepicker { - width: 17em; - padding: 0.2em 0.2em 0; - display: none; -} -.ui-datepicker .ui-datepicker-header { - position: relative; - padding: 0.2em 0; -} -.ui-datepicker .ui-datepicker-prev { - position: absolute; - top: 2px; - width: 1.8em; - height: 1.8em; - left: 2px; -} -.ui-datepicker .ui-datepicker-prev span { - display: block; - position: absolute; - left: 50%; - margin-left: -8px; - top: 50%; - margin-top: -8px; -} -.ui-datepicker .ui-datepicker-next { - position: absolute; - top: 2px; - width: 1.8em; - height: 1.8em; - right: 2px; -} -.ui-datepicker .ui-datepicker-next span { - display: block; - position: absolute; - left: 50%; - margin-left: -8px; - top: 50%; - margin-top: -8px; -} -.ui-datepicker .ui-datepicker-prev-hover { - top: 1px; - left: 1px; -} -.ui-datepicker .ui-datepicker-next-hover { - top: 1px; - right: 1px; -} -.ui-datepicker .ui-datepicker-title { - margin: 0 2.3em; - line-height: 1.8em; - text-align: center; -} -.ui-datepicker .ui-datepicker-title select { - font-size: 1em; - margin: 1px 0; -} -.ui-datepicker select.ui-datepicker-month { - width: 45%; -} -.ui-datepicker select.ui-datepicker-year { - width: 45%; -} -.ui-datepicker table { - width: 100%; - font-size: 0.9em; - border-collapse: collapse; - margin: 0 0 0.4em; -} -.ui-datepicker th { - padding: 0.7em 0.3em; - text-align: center; - font-weight: bold; - border: 0; -} -.ui-datepicker td { - border: 0; - padding: 1px; -} -.ui-datepicker td span { - display: block; - padding: 0.2em; - text-align: right; - text-decoration: none; -} -.ui-datepicker td a { - display: block; - padding: 0.2em; - text-align: right; - text-decoration: none; -} -.ui-datepicker .ui-datepicker-buttonpane { - background-image: none; - margin: 0.7em 0 0 0; - padding: 0 0.2em; - border-left: 0; - border-right: 0; - border-bottom: 0; -} -.ui-datepicker .ui-datepicker-buttonpane button { - float: right; - margin: 0.5em 0.2em 0.4em; - cursor: pointer; - padding: 0.2em 0.6em 0.3em 0.6em; - width: auto; - overflow: visible; -} -.ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current { - float: left; -} -.ui-datepicker .ui-icon { - display: block; - text-indent: -99999px; - overflow: hidden; - background-repeat: no-repeat; - left: 0.5em; - top: 0.3em; -} -.ui-datepicker.ui-datepicker-multi { - width: auto; -} -.ui-datepicker-multi .ui-datepicker-group { - float: left; -} -.ui-datepicker-multi .ui-datepicker-group table { - width: 95%; - margin: 0 auto 0.4em; -} -.ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header { - border-left-width: 0; -} -.ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header { - border-left-width: 0; -} -.ui-datepicker-multi .ui-datepicker-buttonpane { - clear: left; -} -.ui-datepicker-multi-2 .ui-datepicker-group { - width: 50%; -} -.ui-datepicker-multi-3 .ui-datepicker-group { - width: 33.3%; -} -.ui-datepicker-multi-4 .ui-datepicker-group { - width: 25%; -} -.ui-datepicker-row-break { - clear: both; - width: 100%; - font-size: 0; -} -.ui-datepicker-rtl { - direction: rtl; -} -.ui-datepicker-rtl .ui-datepicker-prev { - right: 2px; - left: auto; -} -.ui-datepicker-rtl .ui-datepicker-prev:hover { - right: 1px; - left: auto; -} -.ui-datepicker-rtl .ui-datepicker-next { - left: 2px; - right: auto; -} -.ui-datepicker-rtl .ui-datepicker-next:hover { - left: 1px; - right: auto; -} -.ui-datepicker-rtl .ui-datepicker-buttonpane { - clear: right; -} -.ui-datepicker-rtl .ui-datepicker-buttonpane button { - float: left; -} -.ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current { - float: right; -} -.ui-datepicker-rtl .ui-datepicker-group { - float: right; -} -.ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header { - border-right-width: 0; - border-left-width: 1px; -} -.ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header { - border-right-width: 0; - border-left-width: 1px; -} -.ui-dialog { - position: absolute; - top: 0; - left: 0; - padding: 0.2em; - outline: 0; -} -.ui-dialog .ui-dialog-titlebar { - padding: 0.4em 1em; - position: relative; -} -.ui-dialog .ui-dialog-title { - float: left; - margin: 0.1em 0; - white-space: nowrap; - width: 90%; - overflow: hidden; - text-overflow: ellipsis; -} -.ui-dialog .ui-dialog-titlebar-close { - position: absolute; - right: 0.3em; - top: 50%; - width: 20px; - margin: -10px 0 0 0; - padding: 1px; - height: 20px; -} -.ui-dialog .ui-dialog-content { - position: relative; - border: 0; - padding: 0.5em 1em; - background: none; - overflow: auto; -} -.ui-dialog .ui-dialog-buttonpane { - text-align: left; - border-width: 1px 0 0 0; - background-image: none; - margin-top: 0.5em; - padding: 0.3em 1em 0.5em 0.4em; -} -.ui-dialog .ui-dialog-buttonpane .ui-dialog-buttonset { - float: right; -} -.ui-dialog .ui-dialog-buttonpane button { - margin: 0.5em 0.4em 0.5em 0; - cursor: pointer; -} -.ui-dialog .ui-resizable-n { - height: 2px; - top: 0; -} -.ui-dialog .ui-resizable-e { - width: 2px; - right: 0; -} -.ui-dialog .ui-resizable-s { - height: 2px; - bottom: 0; -} -.ui-dialog .ui-resizable-w { - width: 2px; - left: 0; -} -.ui-dialog .ui-resizable-se { - width: 7px; - height: 7px; - right: 0; - bottom: 0; -} -.ui-dialog .ui-resizable-sw { - width: 7px; - height: 7px; - left: 0; - bottom: 0; -} -.ui-dialog .ui-resizable-ne { - width: 7px; - height: 7px; - right: 0; - top: 0; -} -.ui-dialog .ui-resizable-nw { - width: 7px; - height: 7px; - left: 0; - top: 0; -} -.ui-draggable .ui-dialog-titlebar { - cursor: move; -} -.ui-progressbar { - height: 2em; - text-align: left; - overflow: hidden; -} -.ui-progressbar .ui-progressbar-value { - margin: -1px; - height: 100%; -} -.ui-progressbar .ui-progressbar-overlay { - background: url("data:image/gif;base64,R0lGODlhKAAoAIABAAAAAP///yH/C05FVFNDQVBFMi4wAwEAAAAh+QQJAQABACwAAAAAKAAoAAACkYwNqXrdC52DS06a7MFZI+4FHBCKoDeWKXqymPqGqxvJrXZbMx7Ttc+w9XgU2FB3lOyQRWET2IFGiU9m1frDVpxZZc6bfHwv4c1YXP6k1Vdy292Fb6UkuvFtXpvWSzA+HycXJHUXiGYIiMg2R6W459gnWGfHNdjIqDWVqemH2ekpObkpOlppWUqZiqr6edqqWQAAIfkECQEAAQAsAAAAACgAKAAAApSMgZnGfaqcg1E2uuzDmmHUBR8Qil95hiPKqWn3aqtLsS18y7G1SzNeowWBENtQd+T1JktP05nzPTdJZlR6vUxNWWjV+vUWhWNkWFwxl9VpZRedYcflIOLafaa28XdsH/ynlcc1uPVDZxQIR0K25+cICCmoqCe5mGhZOfeYSUh5yJcJyrkZWWpaR8doJ2o4NYq62lAAACH5BAkBAAEALAAAAAAoACgAAAKVDI4Yy22ZnINRNqosw0Bv7i1gyHUkFj7oSaWlu3ovC8GxNso5fluz3qLVhBVeT/Lz7ZTHyxL5dDalQWPVOsQWtRnuwXaFTj9jVVh8pma9JjZ4zYSj5ZOyma7uuolffh+IR5aW97cHuBUXKGKXlKjn+DiHWMcYJah4N0lYCMlJOXipGRr5qdgoSTrqWSq6WFl2ypoaUAAAIfkECQEAAQAsAAAAACgAKAAAApaEb6HLgd/iO7FNWtcFWe+ufODGjRfoiJ2akShbueb0wtI50zm02pbvwfWEMWBQ1zKGlLIhskiEPm9R6vRXxV4ZzWT2yHOGpWMyorblKlNp8HmHEb/lCXjcW7bmtXP8Xt229OVWR1fod2eWqNfHuMjXCPkIGNileOiImVmCOEmoSfn3yXlJWmoHGhqp6ilYuWYpmTqKUgAAIfkECQEAAQAsAAAAACgAKAAAApiEH6kb58biQ3FNWtMFWW3eNVcojuFGfqnZqSebuS06w5V80/X02pKe8zFwP6EFWOT1lDFk8rGERh1TTNOocQ61Hm4Xm2VexUHpzjymViHrFbiELsefVrn6XKfnt2Q9G/+Xdie499XHd2g4h7ioOGhXGJboGAnXSBnoBwKYyfioubZJ2Hn0RuRZaflZOil56Zp6iioKSXpUAAAh+QQJAQABACwAAAAAKAAoAAACkoQRqRvnxuI7kU1a1UU5bd5tnSeOZXhmn5lWK3qNTWvRdQxP8qvaC+/yaYQzXO7BMvaUEmJRd3TsiMAgswmNYrSgZdYrTX6tSHGZO73ezuAw2uxuQ+BbeZfMxsexY35+/Qe4J1inV0g4x3WHuMhIl2jXOKT2Q+VU5fgoSUI52VfZyfkJGkha6jmY+aaYdirq+lQAACH5BAkBAAEALAAAAAAoACgAAAKWBIKpYe0L3YNKToqswUlvznigd4wiR4KhZrKt9Upqip61i9E3vMvxRdHlbEFiEXfk9YARYxOZZD6VQ2pUunBmtRXo1Lf8hMVVcNl8JafV38aM2/Fu5V16Bn63r6xt97j09+MXSFi4BniGFae3hzbH9+hYBzkpuUh5aZmHuanZOZgIuvbGiNeomCnaxxap2upaCZsq+1kAACH5BAkBAAEALAAAAAAoACgAAAKXjI8By5zf4kOxTVrXNVlv1X0d8IGZGKLnNpYtm8Lr9cqVeuOSvfOW79D9aDHizNhDJidFZhNydEahOaDH6nomtJjp1tutKoNWkvA6JqfRVLHU/QUfau9l2x7G54d1fl995xcIGAdXqMfBNadoYrhH+Mg2KBlpVpbluCiXmMnZ2Sh4GBqJ+ckIOqqJ6LmKSllZmsoq6wpQAAAh+QQJAQABACwAAAAAKAAoAAAClYx/oLvoxuJDkU1a1YUZbJ59nSd2ZXhWqbRa2/gF8Gu2DY3iqs7yrq+xBYEkYvFSM8aSSObE+ZgRl1BHFZNr7pRCavZ5BW2142hY3AN/zWtsmf12p9XxxFl2lpLn1rseztfXZjdIWIf2s5dItwjYKBgo9yg5pHgzJXTEeGlZuenpyPmpGQoKOWkYmSpaSnqKileI2FAAACH5BAkBAAEALAAAAAAoACgAAAKVjB+gu+jG4kORTVrVhRlsnn2dJ3ZleFaptFrb+CXmO9OozeL5VfP99HvAWhpiUdcwkpBH3825AwYdU8xTqlLGhtCosArKMpvfa1mMRae9VvWZfeB2XfPkeLmm18lUcBj+p5dnN8jXZ3YIGEhYuOUn45aoCDkp16hl5IjYJvjWKcnoGQpqyPlpOhr3aElaqrq56Bq7VAAAOw=="); - height: 100%; - filter: alpha(opacity=25); - opacity: 0.25; -} -.ui-progressbar-indeterminate .ui-progressbar-value { - background-image: none; -} -.ui-selectmenu-menu { - padding: 0; - margin: 0; - position: absolute; - top: 0; - left: 0; - display: none; -} -.ui-selectmenu-menu .ui-menu { - overflow: auto; - overflow-x: hidden; - padding-bottom: 1px; -} -.ui-selectmenu-menu .ui-menu .ui-selectmenu-optgroup { - font-size: 1em; - font-weight: bold; - line-height: 1.5; - padding: 2px 0.4em; - margin: 0.5em 0 0 0; - height: auto; - border: 0; -} -.ui-selectmenu-open { - display: block; -} -.ui-selectmenu-text { - display: block; - margin-right: 20px; - overflow: hidden; - text-overflow: ellipsis; -} -.ui-selectmenu-button.ui-button { - text-align: left; - white-space: nowrap; - width: 14em; -} -.ui-selectmenu-icon.ui-icon { - float: right; - margin-top: 0; -} -.ui-slider { - position: relative; - text-align: left; -} -.ui-slider .ui-slider-handle { - position: absolute; - z-index: 2; - width: 1.2em; - height: 1.2em; - cursor: default; - -ms-touch-action: none; - touch-action: none; -} -.ui-slider .ui-slider-range { - position: absolute; - z-index: 1; - font-size: 0.7em; - display: block; - border: 0; - background-position: 0 0; -} -.ui-slider.ui-state-disabled .ui-slider-handle { - filter: inherit; -} -.ui-slider.ui-state-disabled .ui-slider-range { - filter: inherit; -} -.ui-slider-horizontal { - height: 0.8em; -} -.ui-slider-horizontal .ui-slider-handle { - top: -0.3em; - margin-left: -0.6em; -} -.ui-slider-horizontal .ui-slider-range { - top: 0; - height: 100%; -} -.ui-slider-horizontal .ui-slider-range-min { - left: 0; -} -.ui-slider-horizontal .ui-slider-range-max { - right: 0; -} -.ui-slider-vertical { - width: 0.8em; - height: 100px; -} -.ui-slider-vertical .ui-slider-handle { - left: -0.3em; - margin-left: 0; - margin-bottom: -0.6em; -} -.ui-slider-vertical .ui-slider-range { - left: 0; - width: 100%; -} -.ui-slider-vertical .ui-slider-range-min { - bottom: 0; -} -.ui-slider-vertical .ui-slider-range-max { - top: 0; -} -.ui-spinner { - position: relative; - display: inline-block; - overflow: hidden; - padding: 0; - vertical-align: middle; -} -.ui-spinner a.ui-spinner-button { - border-top-style: none; - border-bottom-style: none; - border-right-style: none; -} -.ui-spinner-input { - border: none; - background: none; - color: inherit; - padding: 0.222em 0; - margin: 0.2em 0; - vertical-align: middle; - margin-left: 0.4em; - margin-right: 2em; -} -.ui-spinner-button { - width: 1.6em; - height: 50%; - font-size: 0.5em; - padding: 0; - margin: 0; - text-align: center; - position: absolute; - cursor: default; - display: block; - overflow: hidden; - right: 0; -} -.ui-spinner-up { - top: 0; -} -.ui-spinner-down { - bottom: 0; -} -.ui-tabs { - position: relative; - padding: 0.2em; -} -.ui-tabs .ui-tabs-nav { - margin: 0; - padding: 0.2em 0.2em 0; -} -.ui-tabs .ui-tabs-nav li { - list-style: none; - float: left; - position: relative; - top: 0; - margin: 1px 0.2em 0 0; - border-bottom-width: 0; - padding: 0; - white-space: nowrap; -} -.ui-tabs .ui-tabs-nav .ui-tabs-anchor { - float: left; - padding: 0.5em 1em; - text-decoration: none; -} -.ui-tabs .ui-tabs-nav li.ui-tabs-active { - margin-bottom: -1px; - padding-bottom: 1px; -} -.ui-tabs .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor { - cursor: text; -} -.ui-tabs .ui-tabs-nav li.ui-state-disabled .ui-tabs-anchor { - cursor: text; -} -.ui-tabs .ui-tabs-nav li.ui-tabs-loading .ui-tabs-anchor { - cursor: text; -} -.ui-tabs .ui-tabs-panel { - display: block; - border-width: 0; - padding: 1em 1.4em; - background: none; -} -.ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor { - cursor: pointer; -} -.ui-tooltip { - padding: 8px; - position: absolute; - z-index: 9999; - max-width: 300px; -} -body .ui-tooltip { - border-width: 2px; -} -.ui-widget { - font-family: Trebuchet MS, Tahoma, Verdana, Arial, sans-serif; - font-size: 1.1em; -} -.ui-widget .ui-widget { - font-size: 1em; -} -.ui-widget input { - font-family: Trebuchet MS, Tahoma, Verdana, Arial, sans-serif; - font-size: 1em; -} -.ui-widget select { - font-family: Trebuchet MS, Tahoma, Verdana, Arial, sans-serif; - font-size: 1em; -} -.ui-widget textarea { - font-family: Trebuchet MS, Tahoma, Verdana, Arial, sans-serif; - font-size: 1em; -} -.ui-widget button { - font-family: Trebuchet MS, Tahoma, Verdana, Arial, sans-serif; - font-size: 1em; -} -.ui-widget.ui-widget-content { - border: 1px solid #cccccc; -} -.ui-widget-content { - border: 1px solid #dddddd; - background: #eeeeee; - color: #333333; -} -.ui-widget-content a { - color: #333333; -} -.ui-widget-content .ui-state-default { - border: 1px solid #cccccc; - background: #f1f1f1; - font-weight: bold; - color: #555555; -} -.ui-widget-content .ui-state-hover { - border: 1px solid #EA7D1E; - background: #fde17c; - font-weight: bold; - color: #EA7D1E; -} -.ui-widget-content .ui-state-focus { - border: 1px solid #EA7D1E; - background: #fde17c; - font-weight: bold; - color: #EA7D1E; -} -.ui-widget-content .ui-state-active { - border: 1px solid #EA7D1E; - background: #FFFFFF; - font-weight: bold; - color: #EA7D1E; -} -.ui-widget-content .ui-state-highlight { - border: 1px solid #fed22f; - background: #ffe45c; - color: #363636; -} -.ui-widget-content .ui-state-highlight a { - color: #363636; -} -.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; - color: #FFFFFF; -} -.ui-widget-content .ui-state-error a { - color: #FFFFFF; -} -.ui-widget-content .ui-state-error-text { - color: #FFFFFF; -} -.ui-widget-content .ui-priority-primary { - font-weight: bold; -} -.ui-widget-content .ui-priority-secondary { - opacity: 0.7; - filter: Alpha(Opacity=70); - font-weight: normal; -} -.ui-widget-content .ui-state-disabled { - opacity: 0.35; - filter: Alpha(Opacity=35); - 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"); -} -.ui-widget-header { - border: 1px solid #d56e14; - background: #EA7D1E; - color: #FFFFFF; - font-weight: bold; -} -.ui-widget-header a { - color: #FFFFFF; -} -.ui-widget-header .ui-state-default { - border: 1px solid #cccccc; - background: #f1f1f1; - font-weight: bold; - color: #555555; -} -.ui-widget-header .ui-state-hover { - border: 1px solid #EA7D1E; - background: #fde17c; - font-weight: bold; - color: #EA7D1E; -} -.ui-widget-header .ui-state-focus { - border: 1px solid #EA7D1E; - background: #fde17c; - font-weight: bold; - color: #EA7D1E; -} -.ui-widget-header .ui-state-active { - border: 1px solid #EA7D1E; - background: #FFFFFF; - font-weight: bold; - color: #EA7D1E; -} -.ui-widget-header .ui-state-highlight { - border: 1px solid #fed22f; - background: #ffe45c; - color: #363636; -} -.ui-widget-header .ui-state-highlight a { - color: #363636; -} -.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; - color: #FFFFFF; -} -.ui-widget-header .ui-state-error a { - color: #FFFFFF; -} -.ui-widget-header .ui-state-error-text { - color: #FFFFFF; -} -.ui-widget-header .ui-priority-primary { - font-weight: bold; -} -.ui-widget-header .ui-priority-secondary { - opacity: 0.7; - filter: Alpha(Opacity=70); - font-weight: normal; -} -.ui-widget-header .ui-state-disabled { - opacity: 0.35; - filter: Alpha(Opacity=35); - 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"); -} -.ui-state-default { - border: 1px solid #cccccc; - background: #f1f1f1; - font-weight: bold; - color: #555555; -} -.ui-state-default a { - color: #555555; - text-decoration: none; -} -.ui-state-default a:link { - color: #555555; - text-decoration: none; -} -.ui-state-default a:visited { - color: #555555; - 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"); -} -html .ui-button.ui-state-disabled:hover { - border: 1px solid #cccccc; - background: #f1f1f1; - font-weight: bold; - color: #555555; -} -html .ui-button.ui-state-disabled:active { - border: 1px solid #cccccc; - background: #f1f1f1; - font-weight: bold; - color: #555555; -} -a.ui-button { - color: #555555; - text-decoration: none; -} -a.ui-button:hover { - color: #EA7D1E; - text-decoration: none; -} -a.ui-button:focus { - color: #EA7D1E; - text-decoration: none; -} -a.ui-button:active { - border: 1px solid #EA7D1E; - background: #ffffff; - font-weight: bold; - color: #EA7D1E; -} -a:link.ui-button { - color: #555555; - text-decoration: none; -} -a:visited.ui-button { - color: #555555; - text-decoration: none; -} -.ui-state-hover { - border: 1px solid #EA7D1E; - background: #fde17c; - font-weight: bold; - color: #EA7D1E; -} -.ui-state-hover a { - color: #EA7D1E; - text-decoration: none; -} -.ui-state-hover a:hover { - color: #EA7D1E; - text-decoration: none; -} -.ui-state-hover a:link { - color: #EA7D1E; - text-decoration: none; -} -.ui-state-hover a:visited { - color: #EA7D1E; - 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"); -} -.ui-state-focus { - border: 1px solid #EA7D1E; - background: #fde17c; - font-weight: bold; - color: #EA7D1E; -} -.ui-state-focus a { - color: #EA7D1E; - text-decoration: none; -} -.ui-state-focus a:hover { - color: #EA7D1E; - text-decoration: none; -} -.ui-state-focus a:link { - color: #EA7D1E; - text-decoration: none; -} -.ui-state-focus a:visited { - color: #EA7D1E; - 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"); -} -.ui-visual-focus { - box-shadow: 0 0 3px 1px #5e9ed6; -} -.ui-state-active { - border: 1px solid #EA7D1E; - background: #FFFFFF; - font-weight: bold; - color: #EA7D1E; -} -.ui-state-active .ui-icon-background { - border: #EA7D1E; - background-color: #EA7D1E; -} -.ui-state-active a { - color: #EA7D1E; - text-decoration: none; -} -.ui-state-active a:link { - color: #EA7D1E; - text-decoration: none; -} -.ui-state-active a:visited { - color: #EA7D1E; - 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"); -} -.ui-button.ui-state-active:hover { - border: 1px solid #EA7D1E; - background: #ffffff; - font-weight: bold; - color: #EA7D1E; -} -.ui-icon-background { - border: #EA7D1E; - background-color: #EA7D1E; -} -.ui-state-highlight { - border: 1px solid #fed22f; - background: #ffe45c; - color: #363636; -} -.ui-state-highlight a { - color: #363636; -} -.ui-state-highlight .ui-icon { - background-image: url("../../../../../css/ui-lightness/images/ui-icons_1c94c4_256x240.png?v=v2.7.0-1"); -} -.ui-state-checked { - border: 1px solid #fed22f; - background: #ffe45c; -} -.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; - 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"); -} -.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"); -} -.ui-priority-primary { - font-weight: bold; -} -.ui-priority-secondary { - opacity: 0.7; - filter: Alpha(Opacity=70); - font-weight: normal; -} -.ui-icon-blank { - background-position: 16px 16px; -} -.ui-icon-caret-1-n { - background-position: 0 0; -} -.ui-icon-caret-1-ne { - background-position: -16px 0; -} -.ui-icon-caret-1-e { - background-position: -32px 0; -} -.ui-icon-caret-1-se { - background-position: -48px 0; -} -.ui-icon-caret-1-s { - background-position: -65px 0; -} -.ui-icon-caret-1-sw { - background-position: -80px 0; -} -.ui-icon-caret-1-w { - background-position: -96px 0; -} -.ui-icon-caret-1-nw { - background-position: -112px 0; -} -.ui-icon-caret-2-n-s { - background-position: -128px 0; -} -.ui-icon-caret-2-e-w { - background-position: -144px 0; -} -.ui-icon-triangle-1-n { - background-position: 0 -16px; -} -.ui-icon-triangle-1-ne { - background-position: -16px -16px; -} -.ui-icon-triangle-1-e { - background-position: -32px -16px; -} -.ui-icon-triangle-1-se { - background-position: -48px -16px; -} -.ui-icon-triangle-1-s { - background-position: -65px -16px; -} -.ui-icon-triangle-1-sw { - background-position: -80px -16px; -} -.ui-icon-triangle-1-w { - background-position: -96px -16px; -} -.ui-icon-triangle-1-nw { - background-position: -112px -16px; -} -.ui-icon-triangle-2-n-s { - background-position: -128px -16px; -} -.ui-icon-triangle-2-e-w { - background-position: -144px -16px; -} -.ui-icon-arrow-1-n { - background-position: 0 -32px; -} -.ui-icon-arrow-1-ne { - background-position: -16px -32px; -} -.ui-icon-arrow-1-e { - background-position: -32px -32px; -} -.ui-icon-arrow-1-se { - background-position: -48px -32px; -} -.ui-icon-arrow-1-s { - background-position: -65px -32px; -} -.ui-icon-arrow-1-sw { - background-position: -80px -32px; -} -.ui-icon-arrow-1-w { - background-position: -96px -32px; -} -.ui-icon-arrow-1-nw { - background-position: -112px -32px; -} -.ui-icon-arrow-2-n-s { - background-position: -128px -32px; -} -.ui-icon-arrow-2-ne-sw { - background-position: -144px -32px; -} -.ui-icon-arrow-2-e-w { - background-position: -160px -32px; -} -.ui-icon-arrow-2-se-nw { - background-position: -176px -32px; -} -.ui-icon-arrowstop-1-n { - background-position: -192px -32px; -} -.ui-icon-arrowstop-1-e { - background-position: -208px -32px; -} -.ui-icon-arrowstop-1-s { - background-position: -224px -32px; -} -.ui-icon-arrowstop-1-w { - background-position: -240px -32px; -} -.ui-icon-arrowthick-1-n { - background-position: 1px -48px; -} -.ui-icon-arrowthick-1-ne { - background-position: -16px -48px; -} -.ui-icon-arrowthick-1-e { - background-position: -32px -48px; -} -.ui-icon-arrowthick-1-se { - background-position: -48px -48px; -} -.ui-icon-arrowthick-1-s { - background-position: -64px -48px; -} -.ui-icon-arrowthick-1-sw { - background-position: -80px -48px; -} -.ui-icon-arrowthick-1-w { - background-position: -96px -48px; -} -.ui-icon-arrowthick-1-nw { - background-position: -112px -48px; -} -.ui-icon-arrowthick-2-n-s { - background-position: -128px -48px; -} -.ui-icon-arrowthick-2-ne-sw { - background-position: -144px -48px; -} -.ui-icon-arrowthick-2-e-w { - background-position: -160px -48px; -} -.ui-icon-arrowthick-2-se-nw { - background-position: -176px -48px; -} -.ui-icon-arrowthickstop-1-n { - background-position: -192px -48px; -} -.ui-icon-arrowthickstop-1-e { - background-position: -208px -48px; -} -.ui-icon-arrowthickstop-1-s { - background-position: -224px -48px; -} -.ui-icon-arrowthickstop-1-w { - background-position: -240px -48px; -} -.ui-icon-arrowreturnthick-1-w { - background-position: 0 -64px; -} -.ui-icon-arrowreturnthick-1-n { - background-position: -16px -64px; -} -.ui-icon-arrowreturnthick-1-e { - background-position: -32px -64px; -} -.ui-icon-arrowreturnthick-1-s { - background-position: -48px -64px; -} -.ui-icon-arrowreturn-1-w { - background-position: -64px -64px; -} -.ui-icon-arrowreturn-1-n { - background-position: -80px -64px; -} -.ui-icon-arrowreturn-1-e { - background-position: -96px -64px; -} -.ui-icon-arrowreturn-1-s { - background-position: -112px -64px; -} -.ui-icon-arrowrefresh-1-w { - background-position: -128px -64px; -} -.ui-icon-arrowrefresh-1-n { - background-position: -144px -64px; -} -.ui-icon-arrowrefresh-1-e { - background-position: -160px -64px; -} -.ui-icon-arrowrefresh-1-s { - background-position: -176px -64px; -} -.ui-icon-arrow-4 { - background-position: 0 -80px; -} -.ui-icon-arrow-4-diag { - background-position: -16px -80px; -} -.ui-icon-extlink { - background-position: -32px -80px; -} -.ui-icon-newwin { - background-position: -48px -80px; -} -.ui-icon-refresh { - background-position: -64px -80px; -} -.ui-icon-shuffle { - background-position: -80px -80px; -} -.ui-icon-transfer-e-w { - background-position: -96px -80px; -} -.ui-icon-transferthick-e-w { - background-position: -112px -80px; -} -.ui-icon-folder-collapsed { - background-position: 0 -96px; -} -.ui-icon-folder-open { - background-position: -16px -96px; -} -.ui-icon-document { - background-position: -32px -96px; -} -.ui-icon-document-b { - background-position: -48px -96px; -} -.ui-icon-note { - background-position: -64px -96px; -} -.ui-icon-mail-closed { - background-position: -80px -96px; -} -.ui-icon-mail-open { - background-position: -96px -96px; -} -.ui-icon-suitcase { - background-position: -112px -96px; -} -.ui-icon-comment { - background-position: -128px -96px; -} -.ui-icon-person { - background-position: -144px -96px; -} -.ui-icon-print { - background-position: -160px -96px; -} -.ui-icon-trash { - background-position: -176px -96px; -} -.ui-icon-locked { - background-position: -192px -96px; -} -.ui-icon-unlocked { - background-position: -208px -96px; -} -.ui-icon-bookmark { - background-position: -224px -96px; -} -.ui-icon-tag { - background-position: -240px -96px; -} -.ui-icon-home { - background-position: 0 -112px; -} -.ui-icon-flag { - background-position: -16px -112px; -} -.ui-icon-calendar { - background-position: -32px -112px; -} -.ui-icon-cart { - background-position: -48px -112px; -} -.ui-icon-pencil { - background-position: -64px -112px; -} -.ui-icon-clock { - background-position: -80px -112px; -} -.ui-icon-disk { - background-position: -96px -112px; -} -.ui-icon-calculator { - background-position: -112px -112px; -} -.ui-icon-zoomin { - background-position: -128px -112px; -} -.ui-icon-zoomout { - background-position: -144px -112px; -} -.ui-icon-search { - background-position: -160px -112px; -} -.ui-icon-wrench { - background-position: -176px -112px; -} -.ui-icon-gear { - background-position: -192px -112px; -} -.ui-icon-heart { - background-position: -208px -112px; -} -.ui-icon-star { - background-position: -224px -112px; -} -.ui-icon-link { - background-position: -240px -112px; -} -.ui-icon-cancel { - background-position: 0 -128px; -} -.ui-icon-plus { - background-position: -16px -128px; -} -.ui-icon-plusthick { - background-position: -32px -128px; -} -.ui-icon-minus { - background-position: -48px -128px; -} -.ui-icon-minusthick { - background-position: -64px -128px; -} -.ui-icon-close { - background-position: -80px -128px; -} -.ui-icon-closethick { - background-position: -96px -128px; -} -.ui-icon-key { - background-position: -112px -128px; -} -.ui-icon-lightbulb { - background-position: -128px -128px; -} -.ui-icon-scissors { - background-position: -144px -128px; -} -.ui-icon-clipboard { - background-position: -160px -128px; -} -.ui-icon-copy { - background-position: -176px -128px; -} -.ui-icon-contact { - background-position: -192px -128px; -} -.ui-icon-image { - background-position: -208px -128px; -} -.ui-icon-video { - background-position: -224px -128px; -} -.ui-icon-script { - background-position: -240px -128px; -} -.ui-icon-alert { - background-position: 0 -144px; -} -.ui-icon-info { - background-position: -16px -144px; -} -.ui-icon-notice { - background-position: -32px -144px; -} -.ui-icon-help { - background-position: -48px -144px; -} -.ui-icon-check { - background-position: -64px -144px; -} -.ui-icon-bullet { - background-position: -80px -144px; -} -.ui-icon-radio-on { - background-position: -96px -144px; -} -.ui-icon-radio-off { - background-position: -112px -144px; -} -.ui-icon-pin-w { - background-position: -128px -144px; -} -.ui-icon-pin-s { - background-position: -144px -144px; -} -.ui-icon-play { - background-position: 0 -160px; -} -.ui-icon-pause { - background-position: -16px -160px; -} -.ui-icon-seek-next { - background-position: -32px -160px; -} -.ui-icon-seek-prev { - background-position: -48px -160px; -} -.ui-icon-seek-end { - background-position: -64px -160px; -} -.ui-icon-seek-start { - background-position: -80px -160px; -} -.ui-icon-seek-first { - background-position: -80px -160px; -} -.ui-icon-stop { - background-position: -96px -160px; -} -.ui-icon-eject { - background-position: -112px -160px; -} -.ui-icon-volume-off { - background-position: -128px -160px; -} -.ui-icon-volume-on { - background-position: -144px -160px; -} -.ui-icon-power { - background-position: 0 -176px; -} -.ui-icon-signal-diag { - background-position: -16px -176px; -} -.ui-icon-signal { - background-position: -32px -176px; -} -.ui-icon-battery-0 { - background-position: -48px -176px; -} -.ui-icon-battery-1 { - background-position: -64px -176px; -} -.ui-icon-battery-2 { - background-position: -80px -176px; -} -.ui-icon-battery-3 { - background-position: -96px -176px; -} -.ui-icon-circle-plus { - background-position: 0 -192px; -} -.ui-icon-circle-minus { - background-position: -16px -192px; -} -.ui-icon-circle-close { - background-position: -32px -192px; -} -.ui-icon-circle-triangle-e { - background-position: -48px -192px; -} -.ui-icon-circle-triangle-s { - background-position: -64px -192px; -} -.ui-icon-circle-triangle-w { - background-position: -80px -192px; -} -.ui-icon-circle-triangle-n { - background-position: -96px -192px; -} -.ui-icon-circle-arrow-e { - background-position: -112px -192px; -} -.ui-icon-circle-arrow-s { - background-position: -128px -192px; -} -.ui-icon-circle-arrow-w { - background-position: -144px -192px; -} -.ui-icon-circle-arrow-n { - background-position: -160px -192px; -} -.ui-icon-circle-zoomin { - background-position: -176px -192px; -} -.ui-icon-circle-zoomout { - background-position: -192px -192px; -} -.ui-icon-circle-check { - background-position: -208px -192px; -} -.ui-icon-circlesmall-plus { - background-position: 0 -208px; -} -.ui-icon-circlesmall-minus { - background-position: -16px -208px; -} -.ui-icon-circlesmall-close { - background-position: -32px -208px; -} -.ui-icon-squaresmall-plus { - background-position: -48px -208px; -} -.ui-icon-squaresmall-minus { - background-position: -64px -208px; -} -.ui-icon-squaresmall-close { - background-position: -80px -208px; -} -.ui-icon-grip-dotted-vertical { - background-position: 0 -224px; -} -.ui-icon-grip-dotted-horizontal { - background-position: -16px -224px; -} -.ui-icon-grip-solid-vertical { - background-position: -32px -224px; -} -.ui-icon-grip-solid-horizontal { - background-position: -48px -224px; -} -.ui-icon-gripsmall-diagonal-se { - background-position: -64px -224px; -} -.ui-icon-grip-diagonal-se { - background-position: -80px -224px; -} -.ui-corner-all { - border-top-left-radius: 0; - border-top-right-radius: 0; - border-bottom-left-radius: 0; - border-bottom-right-radius: 0; -} -.ui-corner-top { - border-top-left-radius: 0; - border-top-right-radius: 0; -} -.ui-corner-left { - border-top-left-radius: 0; - border-bottom-left-radius: 0; -} -.ui-corner-tl { - border-top-left-radius: 0; -} -.ui-corner-right { - border-top-right-radius: 0; - border-bottom-right-radius: 0; -} -.ui-corner-tr { - border-top-right-radius: 0; -} -.ui-corner-bottom { - border-bottom-left-radius: 0; - border-bottom-right-radius: 0; -} -.ui-corner-bl { - border-bottom-left-radius: 0; -} -.ui-corner-br { - border-bottom-right-radius: 0; -} -.ui-widget-shadow { - -webkit-box-shadow: -5px -5px 5px #000000; - box-shadow: -5px -5px 5px #000000; -} -/*! - * Copyright (C) 2013-2020 Combodo SARL - * - * This file is part of iTop. - * - * iTop is free software; you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * iTop is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - */ -/* CSS Document */ -body { - font-family: Tahoma, Verdana, Arial, Helvetica; - font-size: 10pt; - background-color: #FFFFFF; - color: #000; - margin: 0; - /* Remove body margin/padding */ - padding: 0; - overflow: hidden; - /* Remove scroll bars on browser window */ -} -body.printable-version { - margin: 1.5em; - overflow: auto; -} -/* to prevent flicker, hide the pane's content until it's ready */ -.ui-layout-center, .ui-layout-north, .ui-layout-south { - display: none; -} -.ui-layout-content { - padding-left: 10px; -} -.ui-layout-content .ui-tabs-nav li { - /* Overriding jQuery UI theme to see active tab better */ - margin-bottom: 2px; -} -.ui-layout-content .ui-tabs-nav li.ui-tabs-active { - padding-bottom: 3px; -} -.raw_output { - font-family: Courier-New, Courier, Arial, Helvetica; - font-size: 8pt; - background-color: #eeeeee; - color: #000; - border: 1px dashed #000; - padding: 0.25em; - margin-top: 1em; -} -h1 { - font-family: Tahoma, Verdana, Arial, Helvetica; - color: #000; - font-weight: bold; - font-size: 12pt; -} -h2 { - font-family: Tahoma, Verdana, Arial, Helvetica; - color: #000; - font-weight: normal; - font-size: 12pt; -} -h3 { - font-family: Tahoma, Verdana, Arial, Helvetica; - color: #000; - font-weight: normal; - font-size: 10pt; -} -label { - cursor: pointer; -} -.hilite, .hilite a, .hilite a:visited { - color: #EA7D1E; - text-decoration: none; -} -table.datatable { - width: 100%; - border: 0; - padding: 0; -} -td.menucontainer { - text-align: right; -} -table.listResults { - padding: 0px; - border-top: 3px solid #F1F1F1; - border-left: 3px solid #F1F1F1; - border-bottom: 3px solid #e6e6e1; - border-right: 3px solid #e6e6e1; - width: 100%; - background-color: #FFFFFF; -} -table.listResults td { - padding: 2px; -} -table.listResults td .view-image { - width: inherit !important; - height: inherit !important; -} -table.listResults td .view-image img { - max-width: 48px !important; - max-height: 48px !important; - display: block; - margin-left: auto; - margin-right: auto; -} -table.listResults > tbody > tr > * { - transition: background-color 400ms linear; -} -table.listResults > tbody > tr:hover > * { - cursor: pointer; -} -table.listResults > tbody > tr.selected:hover > * { - /* hover on lines is currently done toggling td.hover, and having a rule for links */ - background-color: #f1a564; - color: #000; -} -table.listResults > tbody > tr:hover > * { - /* hover on lines is currently done toggling td.hover, and having a rule for links */ - background-color: #fdf5d0; - color: #000; -} -.edit-image .view-image { - display: inline-block; -} -.edit-image .view-image img[src=""], .edit-image .view-image img[src="null"] { - 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"); -} -.edit-image .view-image.dirty.compat img { - opacity: 0.3; -} -.edit-image .edit-buttons { - display: inline-block; - vertical-align: top; - margin-top: 4px; - margin-left: 3px; -} -.edit-image .edit-buttons .button { - cursor: pointer; - margin-bottom: 3px; - padding: 2px; - background-color: #EA7D1E; -} -.edit-image .edit-buttons .button.disabled { - cursor: default; - background-color: #555555; - 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"); -} -.edit-image .file-input { - display: block; -} -/* Center the image both horizontally and vertically, withing a box which size is fixed (depends on the attribute definition) */ -.details .view-image { - text-align: center; - padding: 2px; - border: 2px solid #ddd; - border-radius: 6px; -} -.details .view-image img { - display: inline-block; - vertical-align: middle; - max-width: 90% !important; - max-height: 90% !important; - cursor: zoom-in; -} -.details .view-image .helper-middle { - display: inline-block; - height: 100%; - vertical-align: middle; -} -table.listContainer { - border: 0; - padding: 0; - margin: 0; - width: 100%; - clear: both; -} -tr.containerHeader, tr.containerHeader td { - background: transparent; -} -tr.even td, .wizContainer tr.even td { - background-color: #F1F1F1; -} -tr.red_even td, .wizContainer tr.red_even td { - background-color: #f97e75; - color: #FFFFFF; -} -tr.red td, .wizContainer tr.red td { - background-color: #f9a397; - color: #FFFFFF; -} -tr.orange_even td, .wizContainer tr.orange_even td { - background-color: #f4d07a; -} -tr.orange td, .wizContainer tr.orange td { - background-color: #f4e96c; -} -tr.green_even td, .wizContainer tr.green_even td { - background-color: #bee5a3; -} -tr.green td, .wizContainer tr.green td { - background-color: #b3e5b4; -} -tr td.hover, tr.even td.hover, .hover a, .hover a:visited, .hover a:hover, .wizContainer tr.even td.hover, .wizContainer tr td.hover { - color: #000; -} -th { - font-family: Tahoma, Verdana, Arial, Helvetica; - font-size: 8pt; - color: #1c94c4; - height: 20px; - background: #F1F1F1 bottom repeat-x; -} -th.header { - cursor: pointer; - background-repeat: no-repeat; - background-position: center right; - background-repeat: no-repeat; - padding-right: 16px; -} -th.headerSortUp { - text-decoration: underline; - cursor: pointer; - padding-right: 5px; -} -th.headerSortUp::after { - font-family: "Font Awesome 5 Free"; - text-align: right; - content: '\f0d7'; - color: #1c94c4; - float: right; -} -th.headerSortDown { - text-decoration: underline; - cursor: pointer; - padding-right: 5px; -} -th.headerSortDown::after { - font-family: "Font Awesome 5 Free"; - text-align: right; - content: '\f0d8'; - color: #1c94c4; - float: right; -} -td { - font-family: Tahoma, Verdana, Arial, Helvetica; - font-size: 12px; - color: #696969; - nobackground-color: #ffffff; - padding: 0px; -} -tr.clicked td { - font-family: Tahoma, Verdana, Arial, Helvetica; - font-size: smaller; - background-color: #ffcfe8; -} -td.label { - vertical-align: top; -} -td.label span { - font-family: Tahoma, Verdana, Arial, Helvetica; - font-size: 12px; - color: #000; - padding: 5px; - padding-right: 10px; - font-weight: bold; - vertical-align: top; - text-align: right; - display: block; -} -fieldset td.label span { - padding: 3px; - padding-right: 10px; -} -fieldset { - margin-top: 3px; - -moz-border-radius: 6px; - -webkit-border-radius: 6px; - border-radius: 6px; - border-style: solid; - border-color: #ddd; -} -legend { - font-family: Tahoma, Verdana, Arial, Helvetica; - font-size: 12px; - padding: 8px; - color: #fff; - background-color: #1c94c4; - font-weight: bold; - -moz-border-radius: 6px; - -webkit-border-radius: 6px; - border-radius: 6px; -} -legend.transparent { - background: transparent; - color: #333333; - font-size: 1em; - font-weight: normal; - padding: 0; -} -.ui-widget-content td legend a, .ui-widget-content td legend a:hover, .ui-widget-content td legend a:visited { - color: #fff; -} -.ui-widget-content td a, p a, p a:visited, td a, td a:visited { - text-decoration: none; - color: #1c94c4; -} -.ui-widget-content td a.cke_button, .ui-widget-content td a.cke_toolbox_collapser, .ui-widget-content td a.cke_combo_button, cke_dialog a { - padding-left: 0; - background-image: none; -} -.ui-widget-content td a:hover, p a:hover, td a:hover { - text-decoration: underline; - color: #EA7D1E; -} -.cke_reset_all *:hover { - text-decoration: none; - color: #000; -} -table.cke_dialog_contents a.cke_dialog_ui_button_ok { - color: #000; - border-color: #EA7D1E; - background: #EA7D1E; -} -.cke_notifications_area { - display: none; -} -.hljs { - padding: 0.9em !important; - box-shadow: 0 0px 3px 2px inset rgba(0, 0, 0, 0.4); - border-radius: 3px; -} -td a.no-arrow, td a.no-arrow:visited, .SearchDrawer a.no-arrow, .SearchDrawer a.no-arrow:visited { - text-decoration: none; - color: #000; - padding-left: 0px; - background: inherit; -} -td a.no-arrow:hover { - text-decoration: underline; - color: #d81515; - padding-left: 0px; - background: inherit; -} -td a:hover .text_decoration, td a:visited:hover .text_decoration { - color: #d56e14; -} -td a .text_decoration, td a:visited .text_decoration { - vertical-align: baseline; - text-decoration: none; - color: #EA7D1E; - margin-right: 8px; - transition: color 0.2s ease-in-out; -} -a.small_action { - font-family: Tahoma, Verdana, Arial, Helvetica; - font-size: 8pt; - color: #000; - text-decoration: none; -} -.display_block { - padding: 0.25em; -} -.actions_details { - float: right; - margin-top: 10px; - margin-right: 10px; - padding-left: 5px; - padding-top: 2px; - padding-bottom: 2px; - background: #EA7D1E; -} -.actions_details span { - background: url("../../../../../images/actions_right.png?v=v2.7.0-1") no-repeat right; - color: #fff; - font-weight: bold; - padding-top: 2px; - padding-bottom: 2px; - padding-right: 12px; -} -.actions_details a { - text-decoration: none; -} -.loading { - noborder: 1px dashed #CCC; - background: #b9c1c8; - padding: 0.25em; -} -input.textSearch { - border: 1px solid #000; - font-family: Tahoma, Verdana, Arial, Helvetica, sans-serif; - font-size: 12px; - color: #000; -} -.ac_input { - border: 1px solid #7f9db9; - background: #fff url("../../../../../images/ac-background.gif?v=v2.7.0-1") no-repeat right; -} -/* By Rom */ -.csvimport_createobj { - color: #AA0000; - background-color: #EEEEEE; -} -.csvimport_error { - font-weight: bold; - color: #FF0000; - background-color: #EEEEEE; -} -.csvimport_warning { - color: #CC8888; - background-color: #EEEEEE; -} -.csvimport_ok { - color: #000; - background-color: #BBFFBB; -} -.csvimport_reconkey { - font-style: italic; - color: #888888; - background-color: #FFFFFF; -} -.csvimport_extreconkey { - color: #888888; - background-color: #FFFFFF; -} -#accordion { - display: none; -} -#accordion h3 { - padding: 10px; -} -.ui-accordion-content ul { - list-style: none; - list-style-image: none; - padding-left: 16px; - margin-top: 8px; -} -.ui-accordion-content li.submenu { - margin-top: 8px; -} -.ui-accordion-content ul ul { - padding: 8px 0px 8px 8px; - margin: 0; - list-style: none; - list-style-image: none; - border: 0; -} -.nothing { - 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; - color: #83b217; - font-weight: bold; - text-decoration: none; -} -div.ui-accordion-content { - padding-top: 10px; - padding-left: 10px; -} -.ui-accordion-content a, ui-accordion-content a:visited { - color: #1c94c4; - text-decoration: none; -} -.ui-accordion-content a:hover { - color: #EA7D1E; - text-decoration: none; -} -.ui-accordion-content ul { - padding-left: 0; - margin-top: 0; -} -.ui-accordion-content li { - color: #555555; - text-decoration: none; - margin: 0; - padding: 0px 0pt 0px 6px; - font-size: 9pt; - font-weight: normal; - border: 0; -} -.ui-accordion-content li::before { - font-family: "Font Awesome 5 Free"; - content: "\f0da"; - color: #EA7D1E; - font-weight: 900; - margin-right: 6px; - font-size: 10px; -} -td a.CollapsibleLabel, a.CollapsibleLabel { - margin: 0; - padding: 0; - font-size: 8pt; - text-decoration: none; - color: #555555; -} -td a.CollapsibleLabel::before, a.CollapsibleLabel::before { - font-family: "Font Awesome 5 Free"; - color: #EA7D1E; - content: "\f0da"; - font-weight: 900; - margin: 0 5px; - font-size: 10px; -} -/* Beware: IE6 does not support multiple selector with multiple classes, only the last class is used */ -td a.CollapsibleLabel.open, a.CollapsibleLabel.open { - margin: 0; - padding: 0px 0pt 0px 16px; - font-size: 8pt; - text-decoration: none; - color: #EA7D1E; -} -td a.CollapsibleLabel.open::before, a.CollapsibleLabel.open::before { - font-family: "Font Awesome 5 Free"; - color: #EA7D1E; - content: '\f0d7'; - margin-right: 6px; - font-size: 10px; -} -.page_header { - background-color: #F1F1F1; - padding: 5px; -} -/* move up a header immediately following a display block (i.e. "actions" menu) */ -.display_block + .page_header { - margin-top: -8px; -} -.notreeview li { - background: url("../../../../../images/tv-item.gif?v=v2.7.0-1") 0 0 no-repeat; -} -.notreeview .collapsable { - background-image: url("../../../../../images/tv-collapsable.gif?v=v2.7.0-1"); -} -.notreeview .expandable { - background-image: url("../../../../../images/tv-expandable.gif?v=v2.7.0-1"); -} -.notreeview .last { - background-image: url("../../../../../images/tv-item-last.gif?v=v2.7.0-1"); -} -.notreeview .lastCollapsable { - background-image: url("../../../../../images/tv-collapsable-last.gif?v=v2.7.0-1"); -} -.notreeview .lastExpandable { - background-image: url("../../../../../images/tv-expandable-last.gif?v=v2.7.0-1"); -} -#OrganizationSelection { - padding: 5px 0px 16px 20px; -} -/* popup menus */ -div.itop_popup { - margin: 0; - padding: 0; - float: right; -} -div.itop_popup > ul > li { - list-style: none; - cursor: pointer; - position: relative; -} -div.actions_menu > ul { - height: 19px; - line-height: 17px; - vertical-align: middle; - display: block; - nowidth: 70px; - padding-left: 5px; - /* Nasty work-around for IE... en attendant mieux */ - background: #EA7D1E; - cursor: pointer; - margin: 0; -} -div.actions_menu > ul > li { - float: left; - list-style: none; - font-size: 11px; - font-family: Tahoma, sans-serif; - height: 17px; - padding-right: 10px; - padding-left: 4px; - font-weight: bold; - color: #fff; - vertical-align: middle; - margin: 0; -} -div.actions_menu > ul > li > i { - margin-left: 5px; -} -#logOffBtn > ul > li { - list-style: none; - vertical-align: middle; - margin: 0; - padding-left: 10px; - padding-right: 10px; - cursor: pointer; -} -#logOffBtn > ul { - list-style: none; - vertical-align: middle; - margin: 0; - padding: 0; - height: 25px; -} -.itop_popup > ul > li > ul, #logOffBtn > ul > li > ul { - box-shadow: 3px 3px 5px 0px rgba(0, 0, 0, 0.5); -} -.itop_popup li a, #logOffBtn li a { - display: block; - padding: 5px 12px; - text-decoration: none; - nowidth: 70px; - color: #000; - font-weight: bold; - white-space: nowrap; - background: #fff; -} -#logOffBtn li span { - display: block; - padding: 5px 12px; - text-decoration: none; - nowidth: 70px; - color: #000; - white-space: nowrap; - background: #fff; -} -.itop_popup ul { - padding-left: 0; -} -.menucontainer div.toolkit_menu { - background: #EA7D1E; - margin-left: 10px; -} -.menucontainer div.toolkit_menu > ul > li { - float: left; - list-style: none; - font-size: 11px; - font-family: Tahoma, sans-serif; - height: 19px; - padding-right: 4px; - padding-left: 6px; - font-weight: bold; - color: #fff; - vertical-align: middle; - line-height: 17px; - margin: 0; -} -.menucontainer div.toolkit_menu > ul > li > i:nth-child(1) { - font-size: 13px; - padding-top: 3px; -} -.menucontainer div.toolkit_menu > ul > li > i:nth-child(2) { - margin-left: 5px; -} -.itop_popup li a:hover, #logOffBtn li a:hover { - background: #1A4473; -} -.itop_popup ul > li > ul, #logOffBtn ul > li > ul { - border: 1px solid black; - background: #fff; -} -.itop_popup li > ul, #logOffBtn li > ul { - margin: 0; - padding: 0; - position: absolute; - display: none; - border-top: 1px solid white; - z-index: 1500; -} -.itop_popup li ul li, #logOffBtn li ul li { - float: none; - display: inline; -} -.itop_popup li ul li a, #logOffBtn li ul li a { - width: auto; - text-align: left; -} -.itop_popup li ul li a:hover, #logOffBtn li ul li a:hover { - background: #EA7D1E; - color: #fff; - font-weight: bold; -} -.itop_popup > ul { - margin: 0; -} -hr.menu-separator { - border: none 0; - border-top: 1px solid #ccc; - color: #ccc; - background-color: transparent; - height: 1px; - margin: 3px; - cursor: default; -} -/************************************/ -.wizHeader { - background: #1c94c4; - padding: 15px; -} -.wizContainer { - border: 5px solid #1c94c4; - background: #d6e8ef; - padding: 5px; -} -.wizContainer table tr td { - background: transparent; -} -.alignRight { - text-align: right; - padding: 3px; -} -.alignLeft { - text-align: left; - padding: 3px; -} -.red { - background-color: #ff6000; - color: #000; -} -th.red { - background: url("../../../../../images/red-header.gif?v=v2.7.0-1") bottom left repeat-x; - color: #000; -} -.green { - background-color: #00cc00; - color: #000; -} -th.green { - background: url("../../../../../images/green-header.gif?v=v2.7.0-1") bottom left repeat-x; - color: #000; -} -.orange { - background-color: #ffde00; - color: #000; -} -th.orange { - background: url("../../../../../images/orange-header.gif?v=v2.7.0-1") bottom left repeat-x; - color: #000; -} -/* For Date Picker: Creates a little calendar icon - * instead of a text link for "Choose date" - */ -td a.dp-choose-date, a.dp-choose-date, td a.dp-choose-date:hover, a.dp-choose-date:hover, td a.dp-choose-date:visited, a.dp-choose-date:visited { - float: left; - width: 16px; - height: 16px; - padding: 0; - margin: 5px 3px 0; - display: block; - text-indent: -2000px; - overflow: hidden; - background: url("../../../../../images/calendar.png?v=v2.7.0-1") no-repeat; -} -td a.dp-choose-date.dp-disabled, a.dp-choose-date.dp-disabled { - background-position: 0 -20px; - cursor: default; -} -/* For Date Picker: makes the input field shorter once the date picker code - * has run (to allow space for the calendar icon) - */ -input.dp-applied { - width: 140px; - float: left; -} -/* For search forms */ -.mini_tabs a { - text-decoration: none; - font-weight: bold; - color: #ccc; - background-color: #333; - padding-left: 1em; - padding-right: 1em; - padding-bottom: 0.25em; -} -.mini_tabs a.selected { - color: #fff; - background-color: #1c94c4; - padding-top: 0.25em; -} -.mini_tabs ul { - margin: -10px; -} -.mini_tabs ul li { - float: right; - list-style: none; - nopadding-left: 1em; - nopadding-right: 1em; - margin-top: 0; -} -/* Search forms v2 */ -.search_box { - box-sizing: border-box; - position: relative; - z-index: 1100; - /* To be over the table block/unblock UI. Not very sure about this. */ - text-align: center; - /* Used when form is closed */ - /* Sizing reset */ -} -.search_box * { - box-sizing: border-box; -} -.search_form_handler { - position: relative; - z-index: 10; - width: 100%; - margin-left: auto; - margin-right: auto; - font-size: 12px; - text-align: left; - /* To compensate .search_box:text-align */ - border: 1px solid #1c94c4; - /* Sizing reset */ -} -.search_form_handler * { - box-sizing: border-box; - /* Hyperlink reset */ -} -.search_form_handler a { - color: inherit; - text-decoration: none; - /* Input reset */ -} -.search_form_handler input[type="text"], .search_form_handler select { - padding: 1px 2px; -} -.search_form_handler:not(.closed) .sf_title .sft_short { - display: none; -} -.search_form_handler:not(.closed) .sf_title .sft_hint, .search_form_handler:not(.closed) .sf_title .sfobs_hint, .search_form_handler:not(.closed) .sf_title .sft_toggler { - margin-top: 4px; -} -.search_form_handler:not(.closed) .sf_title .sft_toggler { - transform: rotateX(180deg); - transition: transform 0.5s linear; -} -.search_form_handler.closed { - margin-bottom: 0.5em; - width: 150px; - overflow: hidden; - border-radius: 4px; - background-color: #1c94c4; -} -.search_form_handler.closed .sf_criterion_area { - height: 0; - opacity: 0; - padding: 0; -} -.search_form_handler.closed .sf_title { - padding: 6px 8px; - text-align: center; - font-size: 12px; -} -.search_form_handler.closed .sf_title .sft_long { - display: none; -} -.search_form_handler.closed .sf_title .sft_hint, .search_form_handler.closed .sf_title .sfobs_hint { - display: none; -} -.search_form_handler:not(.no_auto_submit) .sft_hint { - display: none; -} -.search_form_handler:not(.no_auto_submit) .sfc_fg_apply { - display: none; -} -.search_form_handler.no_auto_submit .sfc_fg_search { - display: none; -} -.search_form_handler.no_auto_submit .sft_hint { - display: inline-block; -} -.search_form_handler:not(.hide_obsolete_data) .sfobs_hint { - display: none; -} -.search_form_handler.hide_obsolete_data .sfobs_hint { - display: inline-block; -} -.search_form_handler.hide_obsolete_data.no_auto_submit .sfobs_hint { - margin-left: 30px; -} -.search_form_handler .sf_title { - transition: opacity 0.3s, background-color 0.3s, color 0.3s linear; - padding: 8px 10px; - margin: 0; - color: #FFFFFF; - background-color: #1c94c4; - cursor: pointer; -} -.search_form_handler .sf_title .sft_hint, .search_form_handler .sf_title .sfobs_hint { - font-size: 8pt; - font-style: italic; -} -.search_form_handler .sf_title .sft_toggler { - margin-left: 0.7em; - transition: color 0.2s ease-in-out, transform 0.4s ease-in-out; -} -.search_form_handler .sf_title .sft_toggler:hover { - color: #F1F1F1; -} -.search_form_handler .sf_message { - display: none; - margin: 8px 8px 0px 8px; - border-radius: 0px; -} -.search_form_handler .sf_criterion_area { - /*display: none;*/ - padding: 8px 8px 3px 8px; - /* padding-bottom must equals to padding-top - .search_form_criteria:margin-bottom */ - background-color: #FFFFFF; -} -.search_form_handler .sf_criterion_area .sf_criterion_row { - position: relative; -} -.search_form_handler .sf_criterion_area .sf_criterion_row:not(:first-child) { - margin-top: 20px; -} -.search_form_handler .sf_criterion_area .sf_criterion_row:not(:first-child)::before { - content: ""; - position: absolute; - top: -12px; - left: 0px; - width: 100%; - border-top: 1px solid #CCCCCC; -} -.search_form_handler .sf_criterion_area .sf_criterion_row:not(:first-child)::after { - content: "or"; - /* TODO: Make this into a dict entry */ - position: absolute; - top: -20px; - left: 8px; - padding-left: 5px; - padding-right: 5px; - color: #808080; - background-color: #FFFFFF; - /* Must match .sf_criterion_area:background-color */ -} -.search_form_handler .sf_criterion_area .sf_criterion_row .sf_criterion_group { - display: inline; - /* Common style between criterion and more criterion */ -} -.search_form_handler .sf_criterion_area .search_form_criteria, .search_form_handler .sf_criterion_area .sf_more_criterion, .search_form_handler .sf_criterion_area .sf_button { - position: relative; - display: inline-block; - margin-right: 10px; - margin-bottom: 5px; - vertical-align: top; -} -.search_form_handler .sf_criterion_area .search_form_criteria.opened, .search_form_handler .sf_criterion_area .sf_more_criterion.opened, .search_form_handler .sf_criterion_area .sf_button.opened { - margin-bottom: 0px; - /* To compensate the .sfc/.sfm_header:padding-bottom: 13px */ -} -.search_form_handler .sf_criterion_area .search_form_criteria.opened .sfc_header, .search_form_handler .sf_criterion_area .sf_more_criterion.opened .sfc_header, .search_form_handler .sf_criterion_area .sf_button.opened .sfc_header, .search_form_handler .sf_criterion_area .search_form_criteria.opened .sfm_header, .search_form_handler .sf_criterion_area .sf_more_criterion.opened .sfm_header, .search_form_handler .sf_criterion_area .sf_button.opened .sfm_header { - border-bottom: none !important; - box-shadow: none !important; - padding-bottom: 13px; - /* Must be equal to .search_form_criteria:margin-bottom + this:padding-bottom */ -} -.search_form_handler .sf_criterion_area .search_form_criteria > *, .search_form_handler .sf_criterion_area .sf_more_criterion > *, .search_form_handler .sf_criterion_area .sf_button > * { - padding: 7px 8px; - vertical-align: top; - border: 1px solid #CCCCCC; - border-radius: 1px; - box-shadow: 0 1px 1px rgba(0, 0, 0, 0.15); -} -.search_form_handler .sf_criterion_area .search_form_criteria .sfc_form_group, .search_form_handler .sf_criterion_area .sf_more_criterion .sfc_form_group, .search_form_handler .sf_criterion_area .sf_button .sfc_form_group, .search_form_handler .sf_criterion_area .search_form_criteria .sfm_content, .search_form_handler .sf_criterion_area .sf_more_criterion .sfm_content, .search_form_handler .sf_criterion_area .sf_button .sfm_content { - position: absolute; - z-index: -1; - min-width: 100%; - left: 0px; - margin-top: -1px; -} -.search_form_handler .sf_criterion_area .search_form_criteria .sfc_form_group .sfc_fg_buttons, .search_form_handler .sf_criterion_area .sf_more_criterion .sfc_form_group .sfc_fg_buttons, .search_form_handler .sf_criterion_area .sf_button .sfc_form_group .sfc_fg_buttons, .search_form_handler .sf_criterion_area .search_form_criteria .sfm_content .sfc_fg_buttons, .search_form_handler .sf_criterion_area .sf_more_criterion .sfm_content .sfc_fg_buttons, .search_form_handler .sf_criterion_area .sf_button .sfm_content .sfc_fg_buttons { - white-space: nowrap; - /* Criteria tags */ -} -.search_form_handler .sf_criterion_area .search_form_criteria { - /* Non editable criteria */ -} -.search_form_handler .sf_criterion_area .search_form_criteria.locked { - background-color: #F1F1F1; -} -.search_form_handler .sf_criterion_area .search_form_criteria.locked .sfc_title { - user-select: none; - cursor: initial; - /* Draft criteria (modifications not applied) */ -} -.search_form_handler .sf_criterion_area .search_form_criteria.draft .sfc_header, .search_form_handler .sf_criterion_area .search_form_criteria.draft .sfc_form_group { - border-style: dashed; -} -.search_form_handler .sf_criterion_area .search_form_criteria.draft .sfc_title { - font-style: italic; - /* Opened criteria (form group displayed) */ -} -.search_form_handler .sf_criterion_area .search_form_criteria.opened { - z-index: 1; - /* To be over other criterion */ -} -.search_form_handler .sf_criterion_area .search_form_criteria.opened .sfc_toggle { - transform: rotateX(-180deg); -} -.search_form_handler .sf_criterion_area .search_form_criteria.opened .sfc_form_group { - display: block; -} -.search_form_handler .sf_criterion_area .search_form_criteria.opened_left .sfc_form_group { - left: auto; - right: 0px; - /* Add "and" on criterion but the one and submit button */ -} -.search_form_handler .sf_criterion_area .search_form_criteria:not(:last-of-type) { - margin-right: 30px; -} -.search_form_handler .sf_criterion_area .search_form_criteria:not(:last-of-type)::after { - /* TODO: Find an elegant way to do this, without hardcoding the content (could be a