From eb40968e3418583191417b68a6f1be5f4fa8114f Mon Sep 17 00:00:00 2001 From: odain Date: Tue, 25 Oct 2022 09:26:57 +0200 Subject: [PATCH 01/44] ci: add CreateContactlessUser method in test framework --- test/ItopDataTestCase.php | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/test/ItopDataTestCase.php b/test/ItopDataTestCase.php index 47c945e561..9825a9e17c 100644 --- a/test/ItopDataTestCase.php +++ b/test/ItopDataTestCase.php @@ -414,6 +414,20 @@ class ItopDataTestCase extends ItopTestCase * @throws Exception */ protected function CreateUser($sLogin, $iProfileId, $sPassword=null, $iContactid=2) + { + $oUser = $this->CreateContactlessUser($sLogin, $iProfileId, $sPassword); + $oUser->Set('contactid', $iContactid); + return $oUser; + } + + /** + * @param string $sLogin + * @param int $iProfileId + * + * @return \DBObject + * @throws Exception + */ + protected function CreateContactlessUser($sLogin, $iProfileId, $sPassword=null) { if (empty($sPassword)){ $sPassword = $sLogin; @@ -424,7 +438,6 @@ class ItopDataTestCase extends ItopTestCase $oUserProfile->Set('reason', 'UNIT Tests'); $oSet = DBObjectSet::FromObject($oUserProfile); $oUser = $this->createObject('UserLocal', array( - 'contactid' => $iContactid, 'login' => $sLogin, 'password' => $sPassword, 'language' => 'EN US', From 6638eb4adc4213226945568512da50661a6e7363 Mon Sep 17 00:00:00 2001 From: odain Date: Wed, 26 Oct 2022 09:50:56 +0200 Subject: [PATCH 02/44] ci: adapt impersonate test to any friendlyname output --- test/core/CMDBObjectTest.php | 30 ++++++++++++++++++++---------- 1 file changed, 20 insertions(+), 10 deletions(-) diff --git a/test/core/CMDBObjectTest.php b/test/core/CMDBObjectTest.php index fd2368fc0f..9b8713e051 100644 --- a/test/core/CMDBObjectTest.php +++ b/test/core/CMDBObjectTest.php @@ -108,8 +108,8 @@ class CMDBObjectTest extends ItopDataTestCase $sAdminLogin = "admin-user-".$sUid; $sImpersonatedLogin = "impersonated-user-".$sUid; - $iAdminUserId = $this->CreateUserForImpersonation($sAdminLogin, 'Administrator', 'AdminName', 'AdminSurName'); - $this->CreateUserForImpersonation($sImpersonatedLogin, 'Configuration Manager', 'ImpersonatedName', 'ImpersonatedSurName'); + $oAdminUser = $this->CreateUserForImpersonation($sAdminLogin, 'Administrator', 'AdminName', 'AdminSurName'); + $oImpersonatedUser = $this->CreateUserForImpersonation($sImpersonatedLogin, 'Configuration Manager', 'ImpersonatedName', 'ImpersonatedSurName'); $_SESSION = []; \UserRights::Login($sAdminLogin); @@ -124,28 +124,31 @@ class CMDBObjectTest extends ItopDataTestCase if (is_null($sTrackInfo)){ CMDBObject::SetTrackInfo(null); } else { + $sTrackInfo = $this->ReplaceByFriendlyNames($sTrackInfo, $oAdminUser, $oImpersonatedUser); CMDBObject::SetTrackInfo($sTrackInfo); } $this->CreateSimpleObject(); if (is_null($sTrackInfo)){ - self::assertEquals("AdminSurName AdminName", CMDBObject::GetCurrentChange()->Get('userinfo'), + self::assertEquals($oAdminUser->GetFriendlyName(), CMDBObject::GetCurrentChange()->Get('userinfo'), 'TrackInfo : no impersonation'); } else { self::assertEquals($sTrackInfo, CMDBObject::GetCurrentChange()->Get('userinfo'), 'TrackInfo : no impersonation'); } - self::assertEquals($iAdminUserId, CMDBObject::GetCurrentChange()->Get('user_id'), + self::assertEquals($oAdminUser->GetKey(), CMDBObject::GetCurrentChange()->Get('user_id'), 'TrackInfo : admin userid'); \UserRights::Impersonate($sImpersonatedLogin); $this->CreateSimpleObject(); if (is_null($sExpectedChangeLogWhenImpersonation)){ - self::assertEquals("AdminSurName AdminName on behalf of ImpersonatedSurName ImpersonatedName", CMDBObject::GetCurrentChange()->Get('userinfo'), + $sExpectedMsg = $this->ReplaceByFriendlyNames("AdminSurName AdminName on behalf of ImpersonatedSurName ImpersonatedName", $oAdminUser, $oImpersonatedUser); + self::assertEquals($sExpectedMsg, CMDBObject::GetCurrentChange()->Get('userinfo'), 'TrackInfo : impersonation'); } else { - self::assertEquals($sExpectedChangeLogWhenImpersonation, CMDBObject::GetCurrentChange()->Get('userinfo'), + $sExpectedMsg = $this->ReplaceByFriendlyNames($sExpectedChangeLogWhenImpersonation, $oAdminUser, $oImpersonatedUser); + self::assertEquals($sExpectedMsg, CMDBObject::GetCurrentChange()->Get('userinfo'), 'TrackInfo : impersonation'); } @@ -155,13 +158,13 @@ class CMDBObjectTest extends ItopDataTestCase \UserRights::Deimpersonate(); $this->CreateSimpleObject(); if (is_null($sTrackInfo)){ - self::assertEquals("AdminSurName AdminName", CMDBObject::GetCurrentChange()->Get('userinfo'), + self::assertEquals($oAdminUser->GetFriendlyName(), CMDBObject::GetCurrentChange()->Get('userinfo'), 'TrackInfo : no impersonation'); } else { self::assertEquals($sTrackInfo, CMDBObject::GetCurrentChange()->Get('userinfo'), 'TrackInfo : no impersonation'); } - self::assertEquals($iAdminUserId, CMDBObject::GetCurrentChange()->Get('user_id'), + self::assertEquals($oAdminUser->GetKey(), CMDBObject::GetCurrentChange()->Get('user_id'), 'TrackInfo : admin userid'); // restore initial conditions @@ -169,6 +172,12 @@ class CMDBObjectTest extends ItopDataTestCase CMDBObject::SetTrackInfo($sInitialTrackInfo); } + private function ReplaceByFriendlyNames($sMessage, $oAdminUser, $oImpersonatedUser) : string { + $sNewMessage = str_replace('AdminSurName AdminName', $oAdminUser->GetFriendlyName(), $sMessage); + $sNewMessage = str_replace('ImpersonatedSurName ImpersonatedName', $oImpersonatedUser->GetFriendlyName(), $sNewMessage); + return $sNewMessage; + } + private function CreateSimpleObject(){ /** @var \DocumentWeb $oTestObject */ $oTestObject = MetaModel::NewObject('DocumentWeb'); @@ -178,7 +187,7 @@ class CMDBObjectTest extends ItopDataTestCase $oTestObject->DBWrite(); } - private function CreateUserForImpersonation($sLogin, $sProfileName, $sName, $sSurname): int { + private function CreateUserForImpersonation($sLogin, $sProfileName, $sName, $sSurname): \UserLocal { /** @var \Person $oPerson */ $oPerson = $this->createObject('Person', array( 'name' => $sName, @@ -187,8 +196,9 @@ class CMDBObjectTest extends ItopDataTestCase )); $oProfile = \MetaModel::GetObjectFromOQL("SELECT URP_Profiles WHERE name = :name", array('name' => $sProfileName), true); + /** @var \UserLocal $oUser */ $oUser = $this->CreateUser($sLogin, $oProfile->GetKey(), "1234567Azert@", $oPerson->GetKey()); - return $oUser->GetKey(); + return $oUser; } } From c6e4466c5368d114168fc65722028af70a5819c3 Mon Sep 17 00:00:00 2001 From: odain Date: Wed, 26 Oct 2022 14:03:11 +0200 Subject: [PATCH 03/44] ci: fix ItopDataTestCase CreateUser contactid unset --- test/ItopDataTestCase.php | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/test/ItopDataTestCase.php b/test/ItopDataTestCase.php index 9825a9e17c..339bfcd652 100644 --- a/test/ItopDataTestCase.php +++ b/test/ItopDataTestCase.php @@ -410,13 +410,14 @@ class ItopDataTestCase extends ItopTestCase * @param string $sLogin * @param int $iProfileId * - * @return \DBObject + * @return \UserLocal * @throws Exception */ protected function CreateUser($sLogin, $iProfileId, $sPassword=null, $iContactid=2) { $oUser = $this->CreateContactlessUser($sLogin, $iProfileId, $sPassword); $oUser->Set('contactid', $iContactid); + $oUser->DBWrite(); return $oUser; } @@ -424,7 +425,7 @@ class ItopDataTestCase extends ItopTestCase * @param string $sLogin * @param int $iProfileId * - * @return \DBObject + * @return \UserLocal * @throws Exception */ protected function CreateContactlessUser($sLogin, $iProfileId, $sPassword=null) @@ -437,6 +438,7 @@ class ItopDataTestCase extends ItopTestCase $oUserProfile->Set('profileid', $iProfileId); $oUserProfile->Set('reason', 'UNIT Tests'); $oSet = DBObjectSet::FromObject($oUserProfile); + /** @var \UserLocal $oUser */ $oUser = $this->createObject('UserLocal', array( 'login' => $sLogin, 'password' => $sPassword, From 40e24c25a2da758214fbb9906949e15893298b46 Mon Sep 17 00:00:00 2001 From: "denis.flaven@combodo.com" Date: Mon, 14 Nov 2022 18:37:20 +0100 Subject: [PATCH 04/44] =?UTF-8?q?N=C2=B05619=20-=20hide=20newsroom=20menu?= =?UTF-8?q?=20when=20no=20provider?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../PopoverMenu/NewsroomMenu/NewsroomMenuFactory.php | 10 ++++++++++ .../Layout/NavigationMenu/NavigationMenuFactory.php | 2 +- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/sources/application/UI/Base/Component/PopoverMenu/NewsroomMenu/NewsroomMenuFactory.php b/sources/application/UI/Base/Component/PopoverMenu/NewsroomMenu/NewsroomMenuFactory.php index 1b11b869d7..efc1473610 100644 --- a/sources/application/UI/Base/Component/PopoverMenu/NewsroomMenu/NewsroomMenuFactory.php +++ b/sources/application/UI/Base/Component/PopoverMenu/NewsroomMenu/NewsroomMenuFactory.php @@ -49,6 +49,16 @@ class NewsroomMenuFactory return $oMenu; } + /** + * Check if there is any Newsroom provider configured + * @return boolean + */ + public static function HasProviders() + { + $aProviders = MetaModel::EnumPlugins('iNewsroomProvider'); + return count($aProviders) > 0; + } + /** * Prepare parameters for the newsroom JS widget * diff --git a/sources/application/UI/Base/Layout/NavigationMenu/NavigationMenuFactory.php b/sources/application/UI/Base/Layout/NavigationMenu/NavigationMenuFactory.php index 744541d6d0..513ca903b7 100644 --- a/sources/application/UI/Base/Layout/NavigationMenu/NavigationMenuFactory.php +++ b/sources/application/UI/Base/Layout/NavigationMenu/NavigationMenuFactory.php @@ -48,7 +48,7 @@ class NavigationMenuFactory { $oNewsroomMenu = null; - if (MetaModel::GetConfig()->Get('newsroom_enabled')) + if (MetaModel::GetConfig()->Get('newsroom_enabled') && NewsroomMenuFactory::HasProviders()) { $oNewsroomMenu = NewsroomMenuFactory::MakeNewsroomMenuForNavigationMenu(); } From e3f5dbfc8024f7936c7e7f9afe9f0ab9df992588 Mon Sep 17 00:00:00 2001 From: odain Date: Tue, 15 Nov 2022 09:49:36 +0100 Subject: [PATCH 05/44] =?UTF-8?q?N=C2=B05620=20-=20Hide=20the=20organizati?= =?UTF-8?q?on=20filter=20with=20a=20conf=20parameter?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- core/config.class.inc.php | 12 ++++++++++-- .../Base/Layout/NavigationMenu/NavigationMenu.php | 13 +++++++++---- 2 files changed, 19 insertions(+), 6 deletions(-) diff --git a/core/config.class.inc.php b/core/config.class.inc.php index e8d2f88c2d..24df38c920 100644 --- a/core/config.class.inc.php +++ b/core/config.class.inc.php @@ -333,6 +333,14 @@ class Config 'source_of_value' => '', 'show_in_conf_sample' => false, ], + 'allow_menu_organization_filter' => [ + 'type' => 'bool', + 'description' => 'Display organization filter in menu', + 'default' => true, + 'value' => true, + 'source_of_value' => '', + 'show_in_conf_sample' => false, + ], 'allow_target_creation' => [ 'type' => 'bool', 'description' => 'Displays the + button on external keys to create target objects', @@ -1861,7 +1869,7 @@ class Config } if (strlen($sNoise) > 0) { - // Note: sNoise is an html output, but so far it was ok for me (e.g. showing the entire call stack) + // Note: sNoise is an html output, but so far it was ok for me (e.g. showing the entire call stack) throw new ConfigException('Syntax error in configuration file', array('file' => $sConfigFile, 'error' => ''.htmlentities($sNoise, ENT_QUOTES, 'UTF-8').'')); } @@ -2671,7 +2679,7 @@ class ConfigPlaceholdersResolver } $sPattern = '/\%(env|server)\((\w+)\)(?:\?:(\w*))?\%/'; //3 capturing groups, ie `%env(HTTP_PORT)?:8080%` produce: `env` `HTTP_PORT` and `8080`. - + if (! preg_match_all($sPattern, $rawValue, $aMatchesCollection, PREG_SET_ORDER)) { return $rawValue; diff --git a/sources/application/UI/Base/Layout/NavigationMenu/NavigationMenu.php b/sources/application/UI/Base/Layout/NavigationMenu/NavigationMenu.php index 6229d755cb..ef061a615f 100644 --- a/sources/application/UI/Base/Layout/NavigationMenu/NavigationMenu.php +++ b/sources/application/UI/Base/Layout/NavigationMenu/NavigationMenu.php @@ -196,7 +196,7 @@ class NavigationMenu extends UIBlock implements iKeyboardShortcut } return ''; } - + /** * @return array */ @@ -301,6 +301,11 @@ class NavigationMenu extends UIBlock implements iKeyboardShortcut $this->bHasSiloSelected = false; $this->sSiloLabel = null; + \IssueLog::Info("test allow_menu_organization_filter", null, ['allow_menu_organization_filter' => MetaModel::GetConfig()->Get('allow_menu_organization_filter')]); + if (! MetaModel::GetConfig()->Get('allow_menu_organization_filter')){ + return; + } + //TODO 3.0 Use components if we have the time to build select/autocomplete components before release // List of visible Organizations $iCount = 0; @@ -343,7 +348,7 @@ class NavigationMenu extends UIBlock implements iKeyboardShortcut $this->aSiloSelection['html'] = '
'; //'; $oPage = new \CaptureWebPage(); - + $oWidget = new UIExtKeyWidget('Organization', 'org_id', '', true /* search mode */); $iMaxComboLength = MetaModel::GetConfig()->Get('max_combo_length'); $this->aSiloSelection['html'] .= $oWidget->DisplaySelect($oPage, $iMaxComboLength, false, Dict::S('UI:Layout:NavigationMenu:Silo:Label'), $oSet, $iCurrentOrganization, false, 'c[org_id]', '', @@ -376,7 +381,7 @@ $sAddClearButton JS; } } - + /** * Compute if the menu is expanded or collapsed * @@ -479,4 +484,4 @@ JS; { return "[data-role='".static::BLOCK_CODE."']"; } -} \ No newline at end of file +} From 34d8e52c229391668433a42e22a2881e827deb25 Mon Sep 17 00:00:00 2001 From: odain Date: Tue, 15 Nov 2022 09:55:12 +0100 Subject: [PATCH 12/44] =?UTF-8?q?N=C2=B05620=20-=20remove=20debug=20log?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../application/UI/Base/Layout/NavigationMenu/NavigationMenu.php | 1 - 1 file changed, 1 deletion(-) diff --git a/sources/application/UI/Base/Layout/NavigationMenu/NavigationMenu.php b/sources/application/UI/Base/Layout/NavigationMenu/NavigationMenu.php index ef061a615f..96ef70cc5d 100644 --- a/sources/application/UI/Base/Layout/NavigationMenu/NavigationMenu.php +++ b/sources/application/UI/Base/Layout/NavigationMenu/NavigationMenu.php @@ -301,7 +301,6 @@ class NavigationMenu extends UIBlock implements iKeyboardShortcut $this->bHasSiloSelected = false; $this->sSiloLabel = null; - \IssueLog::Info("test allow_menu_organization_filter", null, ['allow_menu_organization_filter' => MetaModel::GetConfig()->Get('allow_menu_organization_filter')]); if (! MetaModel::GetConfig()->Get('allow_menu_organization_filter')){ return; } From 1bbcd9656a2105808793e4e1b6ee92a82860d2ff Mon Sep 17 00:00:00 2001 From: "denis.flaven@combodo.com" Date: Thu, 17 Nov 2022 11:09:12 +0100 Subject: [PATCH 13/44] =?UTF-8?q?N=C2=B05619=20-=20fixed=20crash=20when=20?= =?UTF-8?q?no=20provider=20at=20all!?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../UI/Base/Layout/NavigationMenu/NavigationMenu.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/sources/application/UI/Base/Layout/NavigationMenu/NavigationMenu.php b/sources/application/UI/Base/Layout/NavigationMenu/NavigationMenu.php index 96ef70cc5d..3e6c6f2430 100644 --- a/sources/application/UI/Base/Layout/NavigationMenu/NavigationMenu.php +++ b/sources/application/UI/Base/Layout/NavigationMenu/NavigationMenu.php @@ -35,6 +35,7 @@ use MetaModel; use UIExtKeyWidget; use UserRights; use utils; +use Combodo\iTop\Application\UI\Base\Component\PopoverMenu\NewsroomMenu\NewsroomMenuFactory; /** * Class NavigationMenu @@ -269,7 +270,7 @@ class NavigationMenu extends UIBlock implements iKeyboardShortcut */ public function IsNewsroomEnabled(): bool { - return MetaModel::GetConfig()->Get('newsroom_enabled'); + return (MetaModel::GetConfig()->Get('newsroom_enabled') && NewsroomMenuFactory::HasProviders()); } /** From 0864f05d9faa180d5dcf300e8fb7686a8b1a39b9 Mon Sep 17 00:00:00 2001 From: odain Date: Mon, 21 Nov 2022 09:56:56 +0100 Subject: [PATCH 14/44] =?UTF-8?q?N=C2=B05620=20-=20conf=20param=20renaming?= =?UTF-8?q?=20+=20backward=20compatibility=20test?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- core/config.class.inc.php | 16 ++--- .../Layout/NavigationMenu/NavigationMenu.php | 7 +- .../UI/Base/Layout/NavigationMenuTest.php | 65 +++++++++++++++++++ 3 files changed, 78 insertions(+), 10 deletions(-) create mode 100644 test/application/UI/Base/Layout/NavigationMenuTest.php diff --git a/core/config.class.inc.php b/core/config.class.inc.php index 24df38c920..9222939512 100644 --- a/core/config.class.inc.php +++ b/core/config.class.inc.php @@ -333,14 +333,6 @@ class Config 'source_of_value' => '', 'show_in_conf_sample' => false, ], - 'allow_menu_organization_filter' => [ - 'type' => 'bool', - 'description' => 'Display organization filter in menu', - 'default' => true, - 'value' => true, - 'source_of_value' => '', - 'show_in_conf_sample' => false, - ], 'allow_target_creation' => [ 'type' => 'bool', 'description' => 'Displays the + button on external keys to create target objects', @@ -1246,6 +1238,14 @@ class Config 'source_of_value' => '', 'show_in_conf_sample' => false, ], + 'navigation_menu.show_organization_filter' => [ + 'type' => 'bool', + 'description' => 'Display organization filter in menu', + 'default' => true, + 'value' => true, + 'source_of_value' => '', + 'show_in_conf_sample' => false, + ], 'quick_create.enabled' => [ 'type' => 'bool', 'description' => 'Whether or not the quick create is enabled', diff --git a/sources/application/UI/Base/Layout/NavigationMenu/NavigationMenu.php b/sources/application/UI/Base/Layout/NavigationMenu/NavigationMenu.php index 3e6c6f2430..548c76f96d 100644 --- a/sources/application/UI/Base/Layout/NavigationMenu/NavigationMenu.php +++ b/sources/application/UI/Base/Layout/NavigationMenu/NavigationMenu.php @@ -19,7 +19,6 @@ namespace Combodo\iTop\Application\UI\Base\Layout\NavigationMenu; - use ApplicationContext; use ApplicationMenu; use appUserPreferences; @@ -291,6 +290,10 @@ class NavigationMenu extends UIBlock implements iKeyboardShortcut } } + public function IsSiloSelectionEnabled() : bool { + return MetaModel::GetConfig()->Get('navigation_menu.show_organization_filter'); + } + /** * @return void * @throws \CoreException @@ -302,7 +305,7 @@ class NavigationMenu extends UIBlock implements iKeyboardShortcut $this->bHasSiloSelected = false; $this->sSiloLabel = null; - if (! MetaModel::GetConfig()->Get('allow_menu_organization_filter')){ + if (! $this->IsSiloSelectionEnabled()){ return; } diff --git a/test/application/UI/Base/Layout/NavigationMenuTest.php b/test/application/UI/Base/Layout/NavigationMenuTest.php new file mode 100644 index 0000000000..ca36ef34a7 --- /dev/null +++ b/test/application/UI/Base/Layout/NavigationMenuTest.php @@ -0,0 +1,65 @@ + [ true ], + 'hide menu' => [ false ], + ]; + } + + /** + * @dataProvider IsAllowedProvider + * test used to make sure backward compatibility is ensured + */ + public function testIsAllowed($bExpectedIsAllowed=true){ + \MetaModel::GetConfig()->Set('navigation_menu.show_organization_filter', $bExpectedIsAllowed); + $oNavigationMenu = new NavigationMenu( + $this->createMock(ApplicationContext::class), + $this->createMock(PopoverMenu::class)); + + $isAllowed = $oNavigationMenu->IsSiloSelectionEnabled(); + $this->assertEquals($bExpectedIsAllowed, $isAllowed); + } + + public function testIsAllowed_BackwardCompatibility_NoVariableInConfFile(){ + \MetaModel::GetConfig()->Set('navigation_menu.show_organization_filter', false); + + $sTmpFilePath = tempnam(sys_get_temp_dir(), 'test_'); + $oInitConfig = \MetaModel::GetConfig(); + $oInitConfig->WriteToFile($sTmpFilePath); + + //remove variable for the test + $aLines = file($sTmpFilePath); + + $aRows = array(); + + foreach ($aLines as $key => $sLine) { + if (!preg_match('/navigation_menu.show_organization_filter/', $sLine)) { + $aRows[] = $sLine; + } + } + + file_put_contents($sTmpFilePath, implode("\n", $aRows)); + $oTempConfig = new \Config($sTmpFilePath); + + $isAllowed = $oTempConfig->Get('navigation_menu.show_organization_filter'); + + $this->assertEquals(true, $isAllowed); + unlink($sTmpFilePath); + } +} From 02e63fff64e1f1dc8e10dbdaa8b8cf244889d681 Mon Sep 17 00:00:00 2001 From: Molkobain Date: Tue, 22 Nov 2022 13:28:02 +0100 Subject: [PATCH 15/44] Add PHPDoc --- .../UI/Base/Layout/NavigationMenu/NavigationMenu.php | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/sources/application/UI/Base/Layout/NavigationMenu/NavigationMenu.php b/sources/application/UI/Base/Layout/NavigationMenu/NavigationMenu.php index ee4c1f4984..6dd7b91d69 100644 --- a/sources/application/UI/Base/Layout/NavigationMenu/NavigationMenu.php +++ b/sources/application/UI/Base/Layout/NavigationMenu/NavigationMenu.php @@ -289,6 +289,10 @@ class NavigationMenu extends UIBlock implements iKeyboardShortcut } } + /** + * @return True if the silo selection is enabled, false otherwise + * @since 3.1.0 + */ public function IsSiloSelectionEnabled() : bool { return MetaModel::GetConfig()->Get('navigation_menu.show_organization_filter'); } From e1807f598fa4d356c208cf19d75eb478230ef354 Mon Sep 17 00:00:00 2001 From: odain Date: Tue, 22 Nov 2022 13:46:33 +0100 Subject: [PATCH 16/44] =?UTF-8?q?N=C2=B05620-fix=20ci?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../UI/Base/Layout/NavigationMenuTest.php | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/test/application/UI/Base/Layout/NavigationMenuTest.php b/test/application/UI/Base/Layout/NavigationMenuTest.php index ca36ef34a7..821befcaf6 100644 --- a/test/application/UI/Base/Layout/NavigationMenuTest.php +++ b/test/application/UI/Base/Layout/NavigationMenuTest.php @@ -7,14 +7,16 @@ use Combodo\iTop\Application\UI\Base\Component\PopoverMenu\PopoverMenu; use Combodo\iTop\Application\UI\Base\Layout\NavigationMenu\NavigationMenu; use Combodo\iTop\Test\UnitTest\ItopDataTestCase; +/** + * + * @runTestsInSeparateProcesses + * @preserveGlobalState disabled + * @backupGlobals disabled + * Class NavigationMenuTest + * + * @package UI\Base\Layout + */ class NavigationMenuTest extends ItopDataTestCase { - - public function setUp(): void - { - parent::setUp(); - require_once(APPROOT.'application/themehandler.class.inc.php'); - } - public function IsAllowedProvider(){ return [ 'show menu' => [ true ], From 163276a6c2b45e8b62f34352eea52e900b68602e Mon Sep 17 00:00:00 2001 From: odain Date: Wed, 23 Nov 2022 09:24:21 +0100 Subject: [PATCH 17/44] =?UTF-8?q?N=C2=B05620-merge=20fix?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../UI/Base/Layout/NavigationMenu/NavigationMenu.php | 4 ---- 1 file changed, 4 deletions(-) diff --git a/sources/application/UI/Base/Layout/NavigationMenu/NavigationMenu.php b/sources/application/UI/Base/Layout/NavigationMenu/NavigationMenu.php index deb928b845..3a7c9c9050 100644 --- a/sources/application/UI/Base/Layout/NavigationMenu/NavigationMenu.php +++ b/sources/application/UI/Base/Layout/NavigationMenu/NavigationMenu.php @@ -290,10 +290,6 @@ class NavigationMenu extends UIBlock implements iKeyboardShortcut } } - public function IsSiloSelectionEnabled() : bool { - return MetaModel::GetConfig()->Get('navigation_menu.show_organization_filter'); - } - /** * @return True if the silo selection is enabled, false otherwise * @since 3.1.0 From 49748a0374a34be8c6377a8114886f88277d2503 Mon Sep 17 00:00:00 2001 From: odain Date: Mon, 19 Dec 2022 14:22:45 +0100 Subject: [PATCH 18/44] =?UTF-8?q?N=C2=B05753=20-=20exposer=20l'API=20Rest?= =?UTF-8?q?=20dans=20le=20SaaS=20-=20ugly=20way=20of=20passing=20API=20sco?= =?UTF-8?q?pe=20to=20rest.php=20during=20login?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- webservices/rest.php | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/webservices/rest.php b/webservices/rest.php index 61ab77db0c..199326a5be 100644 --- a/webservices/rest.php +++ b/webservices/rest.php @@ -28,7 +28,7 @@ require_once(APPROOT.'core/restservices.class.inc.php'); /** * Result structure that is specific to the hardcoded verb 'list_operations' - */ + */ class RestResultListOperations extends RestResult { public $version; @@ -94,12 +94,12 @@ $oKPI = new ExecutionKPI(); try { utils::UseParamFile(); - - $oKPI->ComputeAndReport('Data model loaded'); + $oKPI->ComputeAndReport('Data model loaded'); + \Combodo\iTop\Application\Helper\Session::Set("ENDPOINT_CATEGORY", 'WEBSERVICE'); $iRet = LoginWebPage::DoLogin(false, false, LoginWebPage::EXIT_RETURN); // Starting with iTop 2.2.0 portal users are no longer allowed to access the REST/JSON API $oKPI->ComputeAndReport('User login'); - + if ($iRet == LoginWebPage::EXIT_CODE_OK) { // Extra validation of the profile @@ -116,23 +116,23 @@ try case LoginWebPage::EXIT_CODE_MISSINGLOGIN: throw new Exception("Missing parameter 'auth_user'", RestResult::MISSING_AUTH_USER); break; - + case LoginWebPage::EXIT_CODE_MISSINGPASSWORD: throw new Exception("Missing parameter 'auth_pwd'", RestResult::MISSING_AUTH_PWD); break; - + case LoginWebPage::EXIT_CODE_WRONGCREDENTIALS: throw new Exception("Invalid login", RestResult::UNAUTHORIZED); break; - + case LoginWebPage::EXIT_CODE_PORTALUSERNOTAUTHORIZED: throw new Exception("Portal user is not allowed", RestResult::UNAUTHORIZED); break; - + case LoginWebPage::EXIT_CODE_NOTAUTHORIZED: throw new Exception("This user is not authorized to use the web services. (The profile REST Services User is required to access the REST web services)", RestResult::UNAUTHORIZED); break; - + default: throw new Exception("Unknown authentication error (retCode=$iRet)", RestResult::UNAUTHORIZED); } @@ -224,7 +224,7 @@ try /** @var iRestServiceProvider $oRS */ $oRS = $aOpToRestService[$sOperation]['service_provider']; $sProvider = get_class($oRS); - + CMDBObject::SetTrackOrigin('webservice-rest'); $oResult = $oRS->ExecOperation($sVersion, $sOperation, $aJsonData); } @@ -293,4 +293,4 @@ if (MetaModel::GetConfig()->Get('log_rest_service')) $oLog->SetTrim('json_output', $sResponse); $oLog->DBInsertNoReload(); -} \ No newline at end of file +} From 9400b697eb08537b61a29d87e08698ab3585649e Mon Sep 17 00:00:00 2001 From: "denis.flaven@combodo.com" Date: Mon, 19 Dec 2022 15:55:52 +0100 Subject: [PATCH 19/44] =?UTF-8?q?N=C2=B05620=20Also=20hide=20the=20favorit?= =?UTF-8?q?e=20orgs=20in=20preferences?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pages/preferences.php | 89 ++++++++++++++++++++++--------------------- 1 file changed, 46 insertions(+), 43 deletions(-) diff --git a/pages/preferences.php b/pages/preferences.php index b21b8fac1d..0b4202b23b 100644 --- a/pages/preferences.php +++ b/pages/preferences.php @@ -139,55 +139,58 @@ JS // ////////////////////////////////////////////////////////////////////////// - $oFavoriteOrganizationsBlock = new Panel(Dict::S('UI:FavoriteOrganizations'), array(), 'grey', 'ibo-favorite-organizations'); - $oFavoriteOrganizationsBlock->SetSubTitle(Dict::S('UI:FavoriteOrganizations+')); - $oFavoriteOrganizationsBlock->AddCSSClass('ibo-datatable-panel'); - $oFavoriteOrganizationsForm = new Form(); - $oFavoriteOrganizationsBlock->AddSubBlock($oFavoriteOrganizationsForm); - // Favorite organizations: the organizations listed in the drop-down menu - $sOQL = ApplicationMenu::GetFavoriteSiloQuery(); - $oFilter = DBObjectSearch::FromOQL($sOQL); - $oBlock = new DisplayBlock($oFilter, 'list', false); + $bIsSiloSelectionEnabled = MetaModel::GetConfig()->Get('navigation_menu.show_organization_filter'); + if ($bIsSiloSelectionEnabled) + { + $oFavoriteOrganizationsBlock = new Panel(Dict::S('UI:FavoriteOrganizations'), array(), 'grey', 'ibo-favorite-organizations'); + $oFavoriteOrganizationsBlock->SetSubTitle(Dict::S('UI:FavoriteOrganizations+')); + $oFavoriteOrganizationsBlock->AddCSSClass('ibo-datatable-panel'); + $oFavoriteOrganizationsForm = new Form(); + $oFavoriteOrganizationsBlock->AddSubBlock($oFavoriteOrganizationsForm); + // Favorite organizations: the organizations listed in the drop-down menu + $sOQL = ApplicationMenu::GetFavoriteSiloQuery(); + $oFilter = DBObjectSearch::FromOQL($sOQL); + $oBlock = new DisplayBlock($oFilter, 'list', false); - $aFavoriteOrgs = appUserPreferences::GetPref('favorite_orgs', null); + $aFavoriteOrgs = appUserPreferences::GetPref('favorite_orgs', null); - $sIdFavoriteOrganizations = 1; - $oFavoriteOrganizationsForm->AddSubBlock($oBlock->GetDisplay($oP, $sIdFavoriteOrganizations, [ - 'menu' => false, - 'selection_mode' => true, - 'selection_type' => 'multiple', - 'table_id' => 'user_prefs', - 'surround_with_panel' => false, - 'selected_rows' => $aFavoriteOrgs, - ])); - $oFavoriteOrganizationsForm->AddSubBlock($oAppContext->GetForFormBlock()); + $sIdFavoriteOrganizations = 1; + $oFavoriteOrganizationsForm->AddSubBlock($oBlock->GetDisplay($oP, $sIdFavoriteOrganizations, [ + 'menu' => false, + 'selection_mode' => true, + 'selection_type' => 'multiple', + 'table_id' => 'user_prefs', + 'surround_with_panel' => false, + 'selected_rows' => $aFavoriteOrgs, + ])); + $oFavoriteOrganizationsForm->AddSubBlock($oAppContext->GetForFormBlock()); - // Button toolbar - $oFavoriteOrganizationsToolBar = ToolbarUIBlockFactory::MakeForButton(null, ['ibo-is-fullwidth']); - $oFavoriteOrganizationsForm->AddSubBlock($oFavoriteOrganizationsToolBar); + // Button toolbar + $oFavoriteOrganizationsToolBar = ToolbarUIBlockFactory::MakeForButton(null, ['ibo-is-fullwidth']); + $oFavoriteOrganizationsForm->AddSubBlock($oFavoriteOrganizationsToolBar); - // - Cancel button - $oFavoriteOrganizationsCancelButton = ButtonUIBlockFactory::MakeForCancel(Dict::S('UI:Button:Cancel')); - $oFavoriteOrganizationsToolBar->AddSubBlock($oFavoriteOrganizationsCancelButton); - $oFavoriteOrganizationsCancelButton->SetOnClickJsCode("window.location.href = '$sURL'"); - // - Submit button - $oFavoriteOrganizationsSubmitButton = ButtonUIBlockFactory::MakeForPrimaryAction(Dict::S('UI:Button:Apply'), 'operation', 'apply', true); - $oFavoriteOrganizationsToolBar->AddSubBlock($oFavoriteOrganizationsSubmitButton); + // - Cancel button + $oFavoriteOrganizationsCancelButton = ButtonUIBlockFactory::MakeForCancel(Dict::S('UI:Button:Cancel')); + $oFavoriteOrganizationsToolBar->AddSubBlock($oFavoriteOrganizationsCancelButton); + $oFavoriteOrganizationsCancelButton->SetOnClickJsCode("window.location.href = '$sURL'"); + // - Submit button + $oFavoriteOrganizationsSubmitButton = ButtonUIBlockFactory::MakeForPrimaryAction(Dict::S('UI:Button:Apply'), 'operation', 'apply', true); + $oFavoriteOrganizationsToolBar->AddSubBlock($oFavoriteOrganizationsSubmitButton); - // TODO 3.0 have this code work again, currently it prevents the display of favorite organizations and shortcuts. - // if ($aFavoriteOrgs == null) { - // // All checked - // $oP->add_ready_script( - // <<AddMainBlock($oFavoriteOrganizationsBlock); + // TODO 3.0 have this code work again, currently it prevents the display of favorite organizations and shortcuts. + // if ($aFavoriteOrgs == null) { + // // All checked + // $oP->add_ready_script( + // <<AddMainBlock($oFavoriteOrganizationsBlock); + } ////////////////////////////////////////////////////////////////////////// // // Shortcuts From 973c435138af9a94f488d3ec01d4d221854f23b8 Mon Sep 17 00:00:00 2001 From: odain Date: Wed, 21 Dec 2022 14:38:45 +0100 Subject: [PATCH 20/44] =?UTF-8?q?Revert=20"N=C2=B05753=20-=20exposer=20l'A?= =?UTF-8?q?PI=20Rest=20dans=20le=20SaaS=20-=20ugly=20way=20of=20passing=20?= =?UTF-8?q?API=20scope=20to=20rest.php=20during=20login"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This reverts commit 49748a0374a34be8c6377a8114886f88277d2503. --- webservices/rest.php | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/webservices/rest.php b/webservices/rest.php index 199326a5be..61ab77db0c 100644 --- a/webservices/rest.php +++ b/webservices/rest.php @@ -28,7 +28,7 @@ require_once(APPROOT.'core/restservices.class.inc.php'); /** * Result structure that is specific to the hardcoded verb 'list_operations' - */ + */ class RestResultListOperations extends RestResult { public $version; @@ -94,12 +94,12 @@ $oKPI = new ExecutionKPI(); try { utils::UseParamFile(); - + $oKPI->ComputeAndReport('Data model loaded'); - \Combodo\iTop\Application\Helper\Session::Set("ENDPOINT_CATEGORY", 'WEBSERVICE'); + $iRet = LoginWebPage::DoLogin(false, false, LoginWebPage::EXIT_RETURN); // Starting with iTop 2.2.0 portal users are no longer allowed to access the REST/JSON API $oKPI->ComputeAndReport('User login'); - + if ($iRet == LoginWebPage::EXIT_CODE_OK) { // Extra validation of the profile @@ -116,23 +116,23 @@ try case LoginWebPage::EXIT_CODE_MISSINGLOGIN: throw new Exception("Missing parameter 'auth_user'", RestResult::MISSING_AUTH_USER); break; - + case LoginWebPage::EXIT_CODE_MISSINGPASSWORD: throw new Exception("Missing parameter 'auth_pwd'", RestResult::MISSING_AUTH_PWD); break; - + case LoginWebPage::EXIT_CODE_WRONGCREDENTIALS: throw new Exception("Invalid login", RestResult::UNAUTHORIZED); break; - + case LoginWebPage::EXIT_CODE_PORTALUSERNOTAUTHORIZED: throw new Exception("Portal user is not allowed", RestResult::UNAUTHORIZED); break; - + case LoginWebPage::EXIT_CODE_NOTAUTHORIZED: throw new Exception("This user is not authorized to use the web services. (The profile REST Services User is required to access the REST web services)", RestResult::UNAUTHORIZED); break; - + default: throw new Exception("Unknown authentication error (retCode=$iRet)", RestResult::UNAUTHORIZED); } @@ -224,7 +224,7 @@ try /** @var iRestServiceProvider $oRS */ $oRS = $aOpToRestService[$sOperation]['service_provider']; $sProvider = get_class($oRS); - + CMDBObject::SetTrackOrigin('webservice-rest'); $oResult = $oRS->ExecOperation($sVersion, $sOperation, $aJsonData); } @@ -293,4 +293,4 @@ if (MetaModel::GetConfig()->Get('log_rest_service')) $oLog->SetTrim('json_output', $sResponse); $oLog->DBInsertNoReload(); -} +} \ No newline at end of file From 9bbc7342b8e7226ac6b5edcf67b3bae23dd73ef6 Mon Sep 17 00:00:00 2001 From: odain Date: Wed, 21 Dec 2022 15:22:52 +0100 Subject: [PATCH 21/44] enhance test framework: let AddProfileToUser work on any User not only UserLocal --- test/ItopDataTestCase.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/ItopDataTestCase.php b/test/ItopDataTestCase.php index 339bfcd652..16aff5d969 100644 --- a/test/ItopDataTestCase.php +++ b/test/ItopDataTestCase.php @@ -27,8 +27,8 @@ namespace Combodo\iTop\Test\UnitTest; */ use ArchivedObjectException; -use CMDBSource; use CMDBObject; +use CMDBSource; use Contact; use DBObject; use DBObjectSet; @@ -465,7 +465,7 @@ class ItopDataTestCase extends ItopTestCase /** @var DBObjectSet $oSet */ $oSet = $oUser->Get('profile_list'); $oSet->AddItem($oUserProfile); - $oUser = $this->updateObject('UserLocal', $oUser->GetKey(), array( + $oUser = $this->updateObject(\User::class, $oUser->GetKey(), array( 'profile_list' => $oSet, )); $this->debug("Updated {$oUser->GetName()} ({$oUser->GetKey()})"); From 809b371520f1b52aa9f588a48ccfb92d72d43113 Mon Sep 17 00:00:00 2001 From: odain Date: Wed, 21 Dec 2022 15:23:49 +0100 Subject: [PATCH 22/44] =?UTF-8?q?N=C2=B05753=20-=20add=20config=20paramete?= =?UTF-8?q?r=20allow=5Frest=5Fservices=5Fvia=5Ftokens=20to=20bypass=20rest?= =?UTF-8?q?=20secure=20profile=20option?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- core/config.class.inc.php | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/core/config.class.inc.php b/core/config.class.inc.php index 9222939512..6c2c94c0ef 100644 --- a/core/config.class.inc.php +++ b/core/config.class.inc.php @@ -1424,6 +1424,14 @@ class Config 'source_of_value' => '', 'show_in_conf_sample' => false, ], + 'allow_rest_services_via_tokens' => [ + 'type' => 'bool', + 'description' => 'When set to true, REST endpoint token authorization works even with secure_rest_services set.', + 'default' => false, + 'value' => false, + 'source_of_value' => '', + 'show_in_conf_sample' => false, + ], 'search_manual_submit' => [ 'type' => 'array', 'description' => 'Force manual submit of search all requests', From 045985cd5be6c8e805545c47ca763ccbb8032fb7 Mon Sep 17 00:00:00 2001 From: odain Date: Thu, 16 Feb 2023 15:56:49 +0100 Subject: [PATCH 23/44] 5891-renable badly named tests --- test/core/{AttributeDefTest.inc.php => AttributeDefTest.php} | 0 .../{BulkChangeExtKeyTest.inc.php => BulkChangeExtKeyTest.php} | 0 test/core/{BulkChangeTest.inc.php => BulkChangeTest.php} | 0 test/webservices/{ImportTest.inc.php => ImportTest.php} | 0 4 files changed, 0 insertions(+), 0 deletions(-) rename test/core/{AttributeDefTest.inc.php => AttributeDefTest.php} (100%) rename test/core/{BulkChangeExtKeyTest.inc.php => BulkChangeExtKeyTest.php} (100%) rename test/core/{BulkChangeTest.inc.php => BulkChangeTest.php} (100%) rename test/webservices/{ImportTest.inc.php => ImportTest.php} (100%) diff --git a/test/core/AttributeDefTest.inc.php b/test/core/AttributeDefTest.php similarity index 100% rename from test/core/AttributeDefTest.inc.php rename to test/core/AttributeDefTest.php diff --git a/test/core/BulkChangeExtKeyTest.inc.php b/test/core/BulkChangeExtKeyTest.php similarity index 100% rename from test/core/BulkChangeExtKeyTest.inc.php rename to test/core/BulkChangeExtKeyTest.php diff --git a/test/core/BulkChangeTest.inc.php b/test/core/BulkChangeTest.php similarity index 100% rename from test/core/BulkChangeTest.inc.php rename to test/core/BulkChangeTest.php diff --git a/test/webservices/ImportTest.inc.php b/test/webservices/ImportTest.php similarity index 100% rename from test/webservices/ImportTest.inc.php rename to test/webservices/ImportTest.php From 9db2205241c97c71b82ab559d54058031e6fd5c8 Mon Sep 17 00:00:00 2001 From: odain Date: Thu, 16 Feb 2023 16:59:43 +0100 Subject: [PATCH 24/44] =?UTF-8?q?N=C2=B05891=20-=20fix=20and=20enable=20te?= =?UTF-8?q?sts?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- test/core/BulkChangeExtKeyTest.php | 6 +++--- test/core/BulkChangeTest.php | 6 +++--- test/webservices/ImportTest.php | 4 ++-- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/test/core/BulkChangeExtKeyTest.php b/test/core/BulkChangeExtKeyTest.php index ebc7f9a161..181fc095af 100644 --- a/test/core/BulkChangeExtKeyTest.php +++ b/test/core/BulkChangeExtKeyTest.php @@ -180,7 +180,7 @@ class BulkChangeExtKeyTest extends ItopDataTestCase { ); $this->performBulkChangeTest( - "invalid value for attribute", + "Invalid value for attribute", "Ambiguous: found 2 objects", null, $bIsRackReconKey, @@ -206,7 +206,7 @@ class BulkChangeExtKeyTest extends ItopDataTestCase { $aCsvData = [["UnexistingRackDescription"]]; $aExtKeys = ["org_id" => ["name" => 0], "rack_id" => ["name" => 1, "description" => 3]]; - $sSearchLinkUrl = 'UI.php?operation=search&filter=%5B%22SELECT+%60Rack%60+FROM+Rack+AS+%60Rack%60+WHERE+%28%28%60Rack%60.%60name%60+%3D+%3Aname%29+AND+%28%60Rack%60.%60description%60+%3D+%3Adescription%29%29%22%2C%7B%22name%22%3A%22UnexistingRack%22%2C%22description%22%3A%22UnexistingRackDescription%22%7D%2C%5B%5D%5D' + $sSearchLinkUrl = 'UI.php?operation=search&filter=%255B%2522SELECT%2B%2560Rack%2560%2BFROM%2BRack%2BAS%2B%2560Rack%2560%2BWHERE%2B%2528%2528%2560Rack%2560.%2560name%2560%2B%253D%2B%253Aname%2529%2BAND%2B%2528%2560Rack%2560.%2560description%2560%2B%253D%2B%253Adescription%2529%2529%2522%252C%257B%2522name%2522%253A%2522UnexistingRack%2522%252C%2522description%2522%253A%2522UnexistingRackDescription%2522%257D%252C%255B%255D%255D' ; $this->performBulkChangeTest( "No match for value 'UnexistingRack UnexistingRackDescription'", @@ -238,7 +238,7 @@ class BulkChangeExtKeyTest extends ItopDataTestCase { public function performBulkChangeTest($sExpectedDisplayableValue, $sExpectedDescription, $oOrg, $bIsRackReconKey, $aAdditionalCsvData=null, $aExtKeys=null, $sSearchLinkUrl=null, $sError="Object not found") { if ($sSearchLinkUrl===null){ - $sSearchLinkUrl = 'UI.php?operation=search&filter=%5B%22SELECT+%60Rack%60+FROM+Rack+AS+%60Rack%60+WHERE+%28%60Rack%60.%60name%60+%3D+%3Aname%29%22%2C%7B%22name%22%3A%22UnexistingRack%22%7D%2C%5B%5D%5D'; + $sSearchLinkUrl = 'UI.php?operation=search&filter=%255B%2522SELECT%2B%2560Rack%2560%2BFROM%2BRack%2BAS%2B%2560Rack%2560%2BWHERE%2B%2528%2560Rack%2560.%2560name%2560%2B%253D%2B%253Aname%2529%2522%252C%257B%2522name%2522%253A%2522UnexistingRack%2522%257D%252C%255B%255D%255D'; } if (is_null($oOrg)){ $iOrgId = $this->getTestOrgId(); diff --git a/test/core/BulkChangeTest.php b/test/core/BulkChangeTest.php index 25c72d6f68..0cc1c4d5f0 100644 --- a/test/core/BulkChangeTest.php +++ b/test/core/BulkChangeTest.php @@ -23,7 +23,7 @@ class BulkChangeTest extends ItopDataTestCase { //bug 2888: csv import / data synchro issue with password validation public function testPasswordBulkChangeIssue() { - /** @var Personn $oPerson */ + /** @var \Person $oPerson */ $oPerson = $this->createObject('Person', array( 'first_name' => 'isaac', 'name' => 'asimov', @@ -145,7 +145,7 @@ class BulkChangeTest extends ItopDataTestCase { ["name" => 1, "id" => 2, "status" => 3, "purchase_date" => 4], ["org_id" => ["name" => 0]], ["id"], - [ "org_id" => "invalid value for attribute", 1 => "Server1", 2 => "1", 3 => "production", 4 => "", "id" => 1, "__STATUS__" => "Issue: Unexpected attribute value(s)"], + [ "org_id" => "Invalid value for attribute", 1 => "Server1", 2 => "1", 3 => "production", 4 => "", "id" => 1, "__STATUS__" => "Issue: Unexpected attribute value(s)"], ], "Case 6 : Unexpected value" => [ [["Demo", "Server1", "1", "", ""]], @@ -351,7 +351,7 @@ class BulkChangeTest extends ItopDataTestCase { ["name" => 1, "id" => 2, "status" => 3, "purchase_date" => 4], ["org_id" => ["name" => 0]], ["id"], - [ 0 => "", "org_id" => "invalid value for attribute", 1 => "ServerTest", 2 => "1", 3 => "production", 4 => "", "id" => 1, "__STATUS__" => "Issue: Unexpected attribute value(s)", + [ 0 => "", "org_id" => "Invalid value for attribute", 1 => "ServerTest", 2 => "1", 3 => "production", 4 => "", "id" => 1, "__STATUS__" => "Issue: Unexpected attribute value(s)", "__ERRORS__" => "Null not allowed", ], ], diff --git a/test/webservices/ImportTest.php b/test/webservices/ImportTest.php index 0f10350c81..0741d1fa5c 100644 --- a/test/webservices/ImportTest.php +++ b/test/webservices/ImportTest.php @@ -2,7 +2,6 @@ namespace Combodo\iTop\Test\UnitTest\Webservices; -use CMDBSource; use Combodo\iTop\Test\UnitTest\ItopDataTestCase; use MetaModel; @@ -12,11 +11,12 @@ use MetaModel; * @backupGlobals disabled */ class ImportTest extends ItopDataTestCase { + const USE_TRANSACTION = false; private $sUrl; private $sUid; private $sLogin; - private $sPassword = "Iuytrez9876543ç_è-("; + private $sPassword = "abcDEF12345##"; private $sTmpFile = ""; private $oOrg; From cd48d2ad37b4ec635debdd5bb11988560bebecba Mon Sep 17 00:00:00 2001 From: odain Date: Mon, 20 Feb 2023 12:40:44 +0100 Subject: [PATCH 25/44] =?UTF-8?q?N=C2=B04762=20-=20Designer=20customizatio?= =?UTF-8?q?n=20of=20menus=20moved=20in=20itop-structure=20crashs=20in=20iT?= =?UTF-8?q?op=203.0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- core/config.class.inc.php | 8 + setup/compiler.class.inc.php | 569 +++++++++++++++++++-- setup/parentmenunodecompiler.class.inc.php | 150 ++++++ test/setup/MFCompilerMenuTest.php | 78 +++ 4 files changed, 761 insertions(+), 44 deletions(-) create mode 100644 setup/parentmenunodecompiler.class.inc.php create mode 100644 test/setup/MFCompilerMenuTest.php diff --git a/core/config.class.inc.php b/core/config.class.inc.php index 6c2c94c0ef..f2f0f655f4 100644 --- a/core/config.class.inc.php +++ b/core/config.class.inc.php @@ -333,6 +333,14 @@ class Config 'source_of_value' => '', 'show_in_conf_sample' => false, ], + 'set_menu_compilation_algorithm' => [ + 'type' => 'string', + 'description' => 'setup menu compilation algorithm version (N°4762)', + 'default' => 'v1', + 'value' => 'v1', + 'source_of_value' => '', + 'show_in_conf_sample' => false, + ], 'allow_target_creation' => [ 'type' => 'bool', 'description' => 'Displays the + button on external keys to create target objects', diff --git a/setup/compiler.class.inc.php b/setup/compiler.class.inc.php index ed636380bc..6804acbe5a 100644 --- a/setup/compiler.class.inc.php +++ b/setup/compiler.class.inc.php @@ -24,14 +24,14 @@ use Combodo\iTop\DesignElement; require_once(APPROOT.'setup/setuputils.class.inc.php'); require_once(APPROOT.'setup/modelfactory.class.inc.php'); require_once(APPROOT.'core/moduledesign.class.inc.php'); - +require_once(APPROOT.'setup/parentmenunodecompiler.class.inc.php'); class DOMFormatException extends Exception { /** * Overrides the Exception default constructor to automatically add informations about the concerned node (path and * line number) - * + * * @param string $message * @param $code * @param $previous @@ -49,7 +49,7 @@ class DOMFormatException extends Exception /** * Compiler class - */ + */ class MFCompiler { const DATA_PRECOMPILED_FOLDER = 'data'.DIRECTORY_SEPARATOR.'precompiled_styles'.DIRECTORY_SEPARATOR; @@ -274,7 +274,11 @@ class MFCompiler try { - $this->DoCompile($sTempTargetDir, $sFinalTargetDir, $oP = null, $bUseSymbolicLinks); + if ($oConfig->Get('set_menu_compilation_algorithm') === 'v2'){ + $this->DoNewCompile($sTempTargetDir, $sFinalTargetDir, $oP = null, $bUseSymbolicLinks); + } else { + $this->DoCompile($sTempTargetDir, $sFinalTargetDir, $oP = null, $bUseSymbolicLinks); + } } catch (Exception $e) { @@ -315,7 +319,7 @@ class MFCompiler apc_clear_cache(); } } - + /** * Perform the actual "Compilation" of all modules @@ -418,7 +422,7 @@ class MFCompiler $sCompiledCode .= $this->CompileConstant($oConstant)."\n"; } } - + if (array_key_exists($sModuleName, $this->aSnippets)) { foreach( $this->aSnippets[$sModuleName]['before'] as $aSnippet) @@ -581,7 +585,7 @@ EOF; $sCompiledCode .= $aSnippet['content']."\n"; } } - + // Create (overwrite if existing) the compiled file // if (strlen($sCompiledCode) > 0) @@ -625,7 +629,7 @@ EOF; $aWebservicesFiles[] = "MetaModel::IncludeModule(MODULESROOT.'/$sRelativeDir/$sRelFileName');"; } } // foreach module - + // Compile the dictionaries -out of the modules // $sDictDir = $sTempTargetDir.'/dictionaries'; @@ -654,7 +658,7 @@ EOF; $this->sMainPHPCode .= $aSnippet['content']."\n"; } } - + // Compile the portals $oPortalsNode = $this->oFactory->GetNodes('/itop_design/portals')->item(0); $this->CompilePortals($oPortalsNode, $sTempTargetDir, $sFinalTargetDir); @@ -666,7 +670,7 @@ EOF; // Compile the XML parameters $oParametersNode = $this->oFactory->GetNodes('/itop_design/module_parameters')->item(0); $this->CompileParameters($oParametersNode, $sTempTargetDir, $sFinalTargetDir); - + if (array_key_exists('_core_', $this->aSnippets)) { foreach( $this->aSnippets['_core_']['after'] as $aSnippet) @@ -700,7 +704,7 @@ EOF; $sCurrDate = date(DATE_ISO8601); // Autoload $sPHPFile = $sTempTargetDir.'/autoload.php'; - $sPHPFileContent = + $sPHPFileContent = << array('version' => string, 'root_dir' => string) + + // Determine the target modules for the MENUS + // + $aMenuNodes = []; + $aMenusByModule = []; + foreach ($this->oFactory->GetNodes('menus/menu') as $oMenuNode) + { + $sMenuId = $oMenuNode->getAttribute('id'); + $aMenuNodes[$sMenuId] = $oMenuNode; + + $sModuleMenu = $oMenuNode->getAttribute('_created_in'); + $aMenusByModule[$sModuleMenu][] = $sMenuId; + } + + // Determine the target module (exactly one!) for USER RIGHTS + // This used to be based solely on the module which created the user_rights node first + // Unfortunately, our sample extension was delivered with the xml structure, resulting in the new module to be the recipient of the compilation + // Then model.itop-profiles-itil would not exist... resulting in an error after the compilation (and the actual product of the compiler would never be included + // The bullet proof implementation would be to compile in a separate directory as it has been done with the dictionaries... that's another story + $aModules = $this->oFactory->GetLoadedModules(); + $sUserRightsModule = ''; + foreach ($aModules as $foo => $oModule) { + if ($oModule->GetName() == 'itop-profiles-itil') { + $sUserRightsModule = 'itop-profiles-itil'; + break; + } + } + $oUserRightsNode = $this->oFactory->GetNodes('user_rights')->item(0); + if ($oUserRightsNode && ($sUserRightsModule == '')) { + // Legacy algorithm (itop <= 2.0.3) + $sUserRightsModule = $oUserRightsNode->getAttribute('_created_in'); + } + $this->Log("User Rights module found: '$sUserRightsModule'"); + + // List root classes + // + $this->aRootClasses = []; + foreach ($this->oFactory->ListRootClasses() as $oClass) { + $this->Log("Root class (with child classes): ".$oClass->getAttribute('id')); + $this->aRootClasses[$oClass->getAttribute('id')] = $oClass; + } + + $this->LoadSnippets(); + + // Compile, module by module + // + $aModules = $this->oFactory->GetLoadedModules(); + $aDataModelFiles = []; + $aWebservicesFiles = []; + $iStart = strlen(realpath(APPROOT)); + $sRelFinalTargetDir = substr($sFinalTargetDir, strlen(APPROOT)); + + $this->WriteStaticOnlyHtaccess($sTempTargetDir); + $this->WriteStaticOnlyWebConfig($sTempTargetDir); + + static::SetUseSymbolicLinksFlag($bUseSymbolicLinks); + + $aParentModuleRootDirs = []; + $aParentMenuNodes = []; + foreach ($aModules as $foo => $oModule) { + $sModuleName = $oModule->GetName(); + $sModuleVersion = $oModule->GetVersion(); + + $sModuleRootDir = $oModule->GetRootDir(); + if ($sModuleRootDir != '') { + $sModuleRootDir = realpath($sModuleRootDir); + $sRelativeDir = basename($sModuleRootDir); + if ($bUseSymbolicLinks) { + $sRealRelativeDir = substr($sModuleRootDir, $iStart); + } else { + $sRealRelativeDir = $sRelFinalTargetDir.'/'.$sRelativeDir; + } + + // Push the other module files + SetupUtils::copydir($sModuleRootDir, $sTempTargetDir.'/'.$sRelativeDir, $bUseSymbolicLinks); + } else { + $sRelativeDir = $sModuleName; + $sRealRelativeDir = $sModuleName; + } + $aModulesInfo[$sModuleName] = array('root_dir' => $sRealRelativeDir, 'version' => $sModuleVersion); + + $sCompiledCode = ''; + + $oConstants = $this->oFactory->ListConstants($sModuleName); + if ($oConstants->length > 0) + { + foreach($oConstants as $oConstant) + { + $sCompiledCode .= $this->CompileConstant($oConstant)."\n"; + } + } + + if (array_key_exists($sModuleName, $this->aSnippets)) + { + foreach( $this->aSnippets[$sModuleName]['before'] as $aSnippet) + { + $sCompiledCode .= "\n"; + $sCompiledCode .= "/**\n"; + $sCompiledCode .= " * Snippet: {$aSnippet['snippet_id']}\n"; + $sCompiledCode .= " */\n"; + $sCompiledCode .= $aSnippet['content']."\n"; + } + } + + + $oClasses = $this->oFactory->ListClasses($sModuleName); + $iClassCount = $oClasses->length; + if ($iClassCount == 0) + { + $this->Log("Found module without classes declared: $sModuleName"); + } + else + { + /** @var \MFElement $oClass */ + foreach($oClasses as $oClass) + { + $sClass = $oClass->getAttribute("id"); + $aAllClasses[] = $sClass; + try + { + $sCompiledCode .= $this->CompileClass($oClass, $sTempTargetDir, $sFinalTargetDir, $sRelativeDir); + } + catch (DOMFormatException $e) + { + $sMessage = "Failed to process class '$sClass', "; + if (!empty($sModuleRootDir)) { + $sMessage .= "from '$sModuleRootDir': "; + } + $sMessage .= $e->getMessage(); + throw new Exception($sMessage); + } + } + } + + if (!array_key_exists($sModuleName, $aMenusByModule)) + { + $this->Log("Found module without menus declared: $sModuleName"); + } + else + { + $sMenuCreationClass = 'MenuCreation_'.preg_replace('/[^A-Za-z0-9_]/', '_', $sModuleName); + $sCompiledCode .= + <<GetChildText('parent', null)) + { + $aMenusToLoad[] = $sParent; + if (!array_key_exists($sParent, $aParentModuleRootDirs)){ + $aParentModuleRootDirs[$sParent] = $sModuleRootDir; + } + } + // Note: the order matters: the parents must be defined BEFORE + $aMenusToLoad[] = $sMenuId; + } + $aMenusToLoad = array_unique($aMenusToLoad); + $aMenuLinesForAll = []; + $aMenuLinesForAdmins = []; + $aAdminMenus = []; + foreach($aMenusToLoad as $sMenuId) + { + $oMenuNode = $aMenuNodes[$sMenuId]; + if (is_null($oMenuNode)) + { + throw new Exception("Module '{$oModule->GetId()}' (location : '$sModuleRootDir') contains an unknown menuId : '$sMenuId'"); + } + if ($oMenuNode->getAttribute("xsi:type") == 'MenuGroup' || array_key_exists($sMenuId, $aParentModuleRootDirs)) + { + $aParentMenuNodes[$sMenuId] = $oMenuNode; + $sParent = $oMenuNode->GetChildText('parent', null); + if (($oMenuNode->GetChildText('enable_admin_only') == '1') || isset($aAdminMenus[$sParent])) + { + $aAdminMenus[$sMenuId] = true; + } + continue; + + // Note: this algorithm is wrong + // 1 - the module may appear empty in the current module, while children are defined in other modules + // 2 - check recursively that child nodes are not empty themselves + // Future algorithm: + // a- browse the modules and build the menu tree + // b- browse the tree and blacklist empty menus + // c- before compiling, discard if blacklisted + } + try + { + $aMenuLines = $this->CompileMenu($oMenuNode, $sTempTargetDir, $sFinalTargetDir, $sRelativeDir, $oP); + } + catch (DOMFormatException $e) + { + throw new Exception("Failed to process menu '$sMenuId', from '$sModuleRootDir': ".$e->getMessage()); + } + $sParent = $oMenuNode->GetChildText('parent', null); + if (($oMenuNode->GetChildText('enable_admin_only') == '1') || isset($aAdminMenus[$sParent])) + { + $aMenuLinesForAdmins = array_merge($aMenuLinesForAdmins, $aMenuLines); + $aAdminMenus[$oMenuNode->getAttribute("id")] = true; + } + else + { + $aMenuLinesForAll = array_merge($aMenuLinesForAll, $aMenuLines); + } + } + $sIndent = "\t\t"; + foreach ($aMenuLinesForAll as $sPHPLine) + { + $sCompiledCode .= $sIndent.$sPHPLine."\n"; + } + if (count($aMenuLinesForAdmins) > 0) + { + $sCompiledCode .= $sIndent."if (UserRights::IsAdministrator())\n"; + $sCompiledCode .= $sIndent."{\n"; + foreach ($aMenuLinesForAdmins as $sPHPLine) + { + $sCompiledCode .= $sIndent."\t".$sPHPLine."\n"; + } + $sCompiledCode .= $sIndent."}\n"; + } + $sCompiledCode .= + <<CompileUserRights($oUserRightsNode); + } + + if (array_key_exists($sModuleName, $this->aSnippets)) + { + foreach( $this->aSnippets[$sModuleName]['after'] as $aSnippet) + { + $sCompiledCode .= "\n"; + $sCompiledCode .= "/**\n"; + $sCompiledCode .= " * Snippet: {$aSnippet['snippet_id']}\n"; + $sCompiledCode .= " */\n"; + $sCompiledCode .= $aSnippet['content']."\n"; + } + } + + // Create (overwrite if existing) the compiled file + // + if (strlen($sCompiledCode) > 0) + { + // We have compiled something: write the code somewhere + // + if (strlen($sModuleRootDir) > 0) + { + // Write the code into the given module as model..php + // + $sResultFile = $sTempTargetDir.'/'.$sRelativeDir.'/model.'.$sModuleName.'.php'; + $this->WritePHPFile($sResultFile, $sModuleName, $sModuleVersion, $sCompiledCode); + } + else + { + // Write the code into core/main.php + // + $this->sMainPHPCode .= + <<sMainPHPCode .= $sCompiledCode; + } + } + else + { + $this->Log("Compilation of module $sModuleName in version $sModuleVersion produced not code at all. No file written."); + } + + // files to include (PHP datamodels) + foreach($oModule->GetFilesToInclude('business') as $sRelFileName) + { + $aDataModelFiles[] = "MetaModel::IncludeModule(MODULESROOT.'/$sRelativeDir/$sRelFileName');"; + } + // files to include (PHP webservices providers) + foreach($oModule->GetFilesToInclude('webservices') as $sRelFileName) + { + $aWebservicesFiles[] = "MetaModel::IncludeModule(MODULESROOT.'/$sRelativeDir/$sRelFileName');"; + } + } // foreach module + + // Compile the dictionaries -out of the modules + // + $sDictDir = $sTempTargetDir.'/dictionaries'; + if (!is_dir($sDictDir)) + { + $this->Log("Creating directory $sDictDir"); + mkdir($sDictDir, 0777, true); + } + + $oDictionaries = $this->oFactory->GetNodes('dictionaries/dictionary'); + $this->CompileDictionaries($oDictionaries, $sTempTargetDir, $sFinalTargetDir); + + // Compile the branding + // + $oBrandingNode = $this->oFactory->GetNodes('branding')->item(0); + $this->CompileBranding($oBrandingNode, $sTempTargetDir, $sFinalTargetDir); + + if (array_key_exists('_core_', $this->aSnippets)) + { + foreach( $this->aSnippets['_core_']['before'] as $aSnippet) + { + $this->sMainPHPCode .= "\n"; + $this->sMainPHPCode .= "/**\n"; + $this->sMainPHPCode .= " * Snippet: {$aSnippet['snippet_id']}\n"; + $this->sMainPHPCode .= " */\n"; + $this->sMainPHPCode .= $aSnippet['content']."\n"; + } + } + + // Compile the portals + $oPortalsNode = $this->oFactory->GetNodes('/itop_design/portals')->item(0); + $this->CompilePortals($oPortalsNode, $sTempTargetDir, $sFinalTargetDir); + + // Create module design XML files + $oModuleDesignsNode = $this->oFactory->GetNodes('/itop_design/module_designs')->item(0); + $this->CompileModuleDesigns($oModuleDesignsNode, $sTempTargetDir, $sFinalTargetDir); + + // Compile the XML parameters + $oParametersNode = $this->oFactory->GetNodes('/itop_design/module_parameters')->item(0); + $this->CompileParameters($oParametersNode, $sTempTargetDir, $sFinalTargetDir); + + if (array_key_exists('_core_', $this->aSnippets)) + { + foreach( $this->aSnippets['_core_']['after'] as $aSnippet) + { + $this->sMainPHPCode .= "\n"; + $this->sMainPHPCode .= "/**\n"; + $this->sMainPHPCode .= " * Snippet: {$aSnippet['snippet_id']}\n"; + $this->sMainPHPCode .= " */\n"; + $this->sMainPHPCode .= $aSnippet['content']."\n"; + } + } + + if (count($this->aRelations) > 0) + { + $this->sMainPHPCode .= "\n"; + $this->sMainPHPCode .= "/**\n"; + $this->sMainPHPCode .= " * Relations\n"; + $this->sMainPHPCode .= " */\n"; + foreach($this->aRelations as $sRelationCode => $aData) + { + $sRelCodeSafe = addslashes($sRelationCode); + $this->sMainPHPCode .= "MetaModel::RegisterRelation('$sRelCodeSafe');\n"; + } + } + + // Write core/main.php + SetupUtils::builddir($sTempTargetDir.'/core'); + $sPHPFile = $sTempTargetDir.'/core/main.php'; + file_put_contents($sPHPFile, $this->sMainPHPCode); + + $this->GenerateMenuNodePhpCode($aParentModuleRootDirs, $aParentMenuNodes, $aAdminMenus, $sTempTargetDir, $sFinalTargetDir, $sRelativeDir, $oP); + + $sCurrDate = date(DATE_ISO8601); + // Autoload + $sPHPFile = $sTempTargetDir.'/autoload.php'; + $sPHPFileContent = + << $sModuleRootDir) { + $oCompileParentMenuNode->CompileParentMenuNode($sMenuId); + } + + $aMenuLinesForAdmins = $oCompileParentMenuNode->GetMenuLinesForAdmins(); + $aMenuLinesForAll = $oCompileParentMenuNode->GetMenuLinesForAll(); + + $sCurrDate = date(DATE_ISO8601); + $sCompiledCode = + << 0) + { + $sCompiledCode .= $sIndent."if (UserRights::IsAdministrator())\n"; + $sCompiledCode .= $sIndent."{\n"; + foreach ($aMenuLinesForAdmins as $sPHPLine) + { + $sCompiledCode .= $sIndent."\t".$sPHPLine."\n"; + } + $sCompiledCode .= $sIndent."}\n"; + } + + $sCompiledCode .= << 'OPT_ATT_MUSTCHANGE', 'hidden' => 'OPT_ATT_HIDDEN', ); - + $aFlags = array(); foreach ($aNodeAttributeToFlag as $sNodeAttribute => $sFlag) { @@ -778,7 +1259,7 @@ EOF } if (empty($aFlags)) { - $aFlags[] = 'OPT_ATT_NORMAL'; // When no flag is defined, reset the state to "normal" + $aFlags[] = 'OPT_ATT_NORMAL'; // When no flag is defined, reset the state to "normal" } $sRes = implode(' | ', $aFlags); return $sRes; @@ -800,7 +1281,7 @@ EOF 'details' => 'LINKSET_TRACKING_DETAILS', 'all' => 'LINKSET_TRACKING_ALL', ); - + static $aXmlToPHP_Others = array( 'none' => 'ATTRIBUTE_TRACKING_NONE', 'all' => 'ATTRIBUTE_TRACKING_ALL', @@ -841,7 +1322,7 @@ EOF 'in_place' => 'LINKSET_EDITMODE_INPLACE', 'add_remove' => 'LINKSET_EDITMODE_ADDREMOVE', ); - + if (!array_key_exists($sEditMode, $aXmlToPHP)) { throw new DOMFormatException("Edit mode: unknown value '$sEditMode'"); @@ -849,10 +1330,10 @@ EOF return $aXmlToPHP[$sEditMode]; } - + /** * Format a path (file or url) as an absolute path or relative to the module or the app - */ + */ protected function PathToPHP($sPath, $sModuleRelativeDir, $bIsUrl = false) { if ($sPath == '') @@ -945,7 +1426,7 @@ EOF else { throw new DOMFormatException("missing (or empty) mandatory tag '$sTag' under the tag '".$oNode->nodeName."'"); - } + } } /** @@ -1049,7 +1530,7 @@ EOF /** * Adds quotes and escape characters - */ + */ protected function QuoteForPHP($sStr, $bSimpleQuotes = false) { if ($bSimpleQuotes) @@ -1084,7 +1565,7 @@ EOF $sScalar = (string)(int)$sText; } break; - + case 'float': if (is_null($sText)) { @@ -1096,7 +1577,7 @@ EOF $sScalar = (string)(float)$sText; } break; - + case 'bool': if (is_null($sText)) { @@ -1328,7 +1809,7 @@ EOF // $oField $sAttCode = $oField->getAttribute('id'); $sAttType = $oField->getAttribute('xsi:type'); - + $aDependencies = array(); $oDependencies = $oField->GetOptionalElement('dependencies'); if (!is_null($oDependencies)) @@ -1340,9 +1821,9 @@ EOF } } $sDependencies = 'array('.implode(', ', $aDependencies).')'; - + $aParameters = array(); - + if ($sAttType == 'AttributeLinkedSetIndirect') { $aParameters['linked_class'] = $this->GetMandatoryPropString($oField, 'linked_class'); @@ -2416,7 +2897,7 @@ CSS; * @return array * @throws \DOMFormatException */ - protected function CompileMenu($oMenu, $sTempTargetDir, $sFinalTargetDir, $sModuleRelativeDir, $oP) + public function CompileMenu($oMenu, $sTempTargetDir, $sFinalTargetDir, $sModuleRelativeDir, $oP) { $this->CompileFiles($oMenu, $sTempTargetDir.'/'.$sModuleRelativeDir, $sFinalTargetDir.'/'.$sModuleRelativeDir, $sModuleRelativeDir); @@ -2512,11 +2993,11 @@ CSS; case '1': $sSearchFormOpen = 'true'; break; - + case '0': $sSearchFormOpen = 'false'; break; - + default: $sSearchFormOpen = 'true'; } @@ -2605,7 +3086,7 @@ CSS; foreach($this->oFactory->ListFields($oClass) as $oField) { $sAttType = $oField->getAttribute('xsi:type'); - + if (($sAttType == 'AttributeExternalKey') || ($sAttType == 'AttributeHierarchicalKey')) { $sOnTargetDel = $oField->GetChildText('on_target_delete'); @@ -2631,7 +3112,7 @@ CSS; $oClasses = $oGroup->GetUniqueElement('classes'); foreach($oClasses->getElementsByTagName('class') as $oClass) { - + $sClass = $oClass->getAttribute("id"); $aClasses[] = $sClass; @@ -2649,7 +3130,7 @@ CSS; $aProfiles[1] = array( 'name' => 'Administrator', 'description' => 'Has the rights on everything (bypassing any control)', - ); + ); $aGrants = array(); $oProfiles = $oUserRightsNode->GetUniqueElement('profiles'); @@ -2681,7 +3162,7 @@ CSS; } $sGrant = $oAction->GetText(); $bGrant = ($sGrant == 'allow'); - + if ($sGroupId == '*') { $aGrantClasses = array('*'); @@ -2920,7 +3401,7 @@ Dict::SetLanguagesList( $sLanguagesDump ); EOF; - + file_put_contents($sLanguagesFile, $sLanguagesFileContent); } @@ -2957,7 +3438,7 @@ EOF; { throw new DOMFormatException('Could not find the file with ref '.$sFileId); } - + $sName = $oNodes->item(0)->GetChildText('name'); $sData = base64_decode($oNodes->item(0)->GetChildText('data')); $aPathInfo = pathinfo($sName); @@ -2971,7 +3452,7 @@ EOF; } $oParentNode = $oFileRef->parentNode; $oParentNode->removeChild($oFileRef); - + $oTextNode = $oParentNode->ownerDocument->createTextNode($sRelativePath.'/images/'.$sFile); $oParentNode->appendChild($oTextNode); } @@ -3284,8 +3765,8 @@ EOF; { SetupUtils::rrmdir($sTempTargetDir.'/branding/images'); } - - // Compile themes + + // Compile themes $this->CompileThemes($oBrandingNode, $sTempTargetDir); } } @@ -3326,11 +3807,11 @@ EOF; { $aPortalsConfig[$sPortalId]['deny'][] = $oProfile->getAttribute('id'); } - } + } } - + uasort($aPortalsConfig, array(get_class($this), 'SortOnRank')); - + $this->sMainPHPCode .= "\n"; $this->sMainPHPCode .= "/**\n"; $this->sMainPHPCode .= " * Portal(s) definition(s) extracted from the XML definition at compile time\n"; @@ -3373,7 +3854,7 @@ EOF; $oParamsReader = new MFParameters($oParams); $aParametersConfig[$sModuleId] = $oParamsReader->GetAll(); } - + $this->sMainPHPCode .= "\n"; $this->sMainPHPCode .= "/**\n"; $this->sMainPHPCode .= " * Modules parameters extracted from the XML definition at compile time\n"; diff --git a/setup/parentmenunodecompiler.class.inc.php b/setup/parentmenunodecompiler.class.inc.php new file mode 100644 index 0000000000..0f23aeef14 --- /dev/null +++ b/setup/parentmenunodecompiler.class.inc.php @@ -0,0 +1,150 @@ +oMFCompiler = $oMFCompiler; + $this->aParentModuleRootDirs = $aParentModuleRootDirs; + $this->aParentMenuNodes = $aParentMenuNodes; + $this->aAdminMenus = $aAdminMenus; + $this->sTempTargetDir = $sTempTargetDir; + $this->sFinalTargetDir = $sFinalTargetDir; + $this->sRelativeDir = $sRelativeDir; + $this->oP = $oP; + } + + public function CompileParentMenuNode(string $sMenuId) : void + { + $sStatus = array_key_exists($sMenuId, $this->aMenuProcessStatus) ? $this->aMenuProcessStatus[$sMenuId] : null; + if ($sStatus === self::COMPILED){ + //node already processed before + return; + } else if ($sStatus === self::COMPILING){ + throw new \Exception("Cyclic dependency between parent menus ($sMenuId)"); + } + + $this->aMenuProcessStatus[$sMenuId] = self::COMPILING; + + try { + if (! array_key_exists($sMenuId, $this->aParentMenuNodes)){ + throw new Exception("Failed to process parent menu '$sMenuId' that is referenced by a child but not defined"); + } + $oMenuNode = $this->aParentMenuNodes[$sMenuId]; + + $sParent = $oMenuNode->GetChildText('parent', null); + if (! empty($sParent)){ + //compile parents before (even parent of parents ... recursively) + $this->CompileParentMenuNode($sParent); + } + + if (! array_key_exists($sMenuId, $this->aParentModuleRootDirs)){ + throw new Exception("Failed to process parent menu '$sMenuId' that is referenced by a child but not defined"); + } + $sModuleRootDir = $this->aParentModuleRootDirs[$sMenuId]; + + $aMenuLines = $this->oMFCompiler->CompileMenu($oMenuNode, $this->sTempTargetDir, $this->sFinalTargetDir, $this->sRelativeDir, $this->oP); + } catch (DOMFormatException $e) { + throw new Exception("Failed to process menu '$sMenuId', from '$sModuleRootDir': ".$e->getMessage()); + } + $sParent = $oMenuNode->GetChildText('parent', null); + if (($oMenuNode->GetChildText('enable_admin_only') == '1') || isset($this->aAdminMenus[$sParent])) { + $this->aMenuLinesForAdmins = array_merge($this->aMenuLinesForAdmins, $aMenuLines); + $this->aAdminMenus[$oMenuNode->getAttribute("id")] = true; + } else { + $this->aMenuLinesForAll = array_merge($this->aMenuLinesForAll, $aMenuLines); + } + + $this->aMenuProcessStatus[$sMenuId] = self::COMPILED; + } + + public function GetMenuLinesForAdmins(): array { + return $this->aMenuLinesForAdmins; + } + + public function GetMenuLinesForAll(): array { + return $this->aMenuLinesForAll; + } + + +} diff --git a/test/setup/MFCompilerMenuTest.php b/test/setup/MFCompilerMenuTest.php new file mode 100644 index 0000000000..c7803cb6f3 --- /dev/null +++ b/test/setup/MFCompilerMenuTest.php @@ -0,0 +1,78 @@ + ['production'], + 'phpunit' => ['phpunit'], + ]; + } + /** + * @dataProvider CompileMenusProvider + */ + public function testCompileMenus($sEnv){ + if(\utils::GetCurrentEnvironment() != $sEnv) { + $sConfigFilePath = \utils::GetConfigFilePath($sEnv); + + //copy conf from production to phpunit context + $sDirPath = dirname($sConfigFilePath); + if (! is_dir($sDirPath)){ + mkdir($sDirPath); + } + $oConfig = new Config(\utils::GetConfigFilePath()); + $oConfig->WriteToFile($sConfigFilePath); + + $oConfig = new Config($sConfigFilePath); + $oConfig->Set('set_menu_compilation_algorithm', 'v2', 'test', true); + $oConfig->WriteToFile(); + $oRunTimeEnvironment = new RunTimeEnvironment($sEnv); + $oRunTimeEnvironment->CompileFrom(\utils::GetCurrentEnvironment()); + $oConfig->Set('set_menu_compilation_algorithm', 'v1', 'test', true); + $oConfig->WriteToFile(); + } + + $sConfigFile = APPCONF.\utils::GetCurrentEnvironment().'/'.ITOP_CONFIG_FILE; + MetaModel::Startup($sConfigFile, false /* $bModelOnly */, true /* $bAllowCache */, false /* $bTraceSourceFiles */, $sEnv); + + $aMenuGroups = ApplicationMenu::GetMenuGroups(); + $this->assertNotEquals([], $aMenuGroups); + + if (! is_null(static::$aPreviousEnvMenus)){ + $this->assertEquals(static::$aPreviousEnvMenus, $aMenuGroups); + } else { + $this->assertNotEquals([], $aMenuGroups); + } + static::$aPreviousEnvMenus = $aMenuGroups; + + //$this->InvokeNonPublicMethod(MFCompiler::class, 'CompileThemes', $this->oMFCompiler, [$oBrandingNode, $this->sTmpDir]); + } +} From 28df2942e41b2aa08540c74d5d532502027c6e6c Mon Sep 17 00:00:00 2001 From: odain Date: Thu, 23 Feb 2023 16:29:45 +0100 Subject: [PATCH 26/44] =?UTF-8?q?N=C2=B06022=20-=20Make=20synchro=20script?= =?UTF-8?q?s=20work=20by=20http=20via=20token=20authentication=20with=20SY?= =?UTF-8?q?NCHRO=20scopes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- synchro/synchro_exec.php | 7 +++++-- synchro/synchro_import.php | 5 ++++- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/synchro/synchro_exec.php b/synchro/synchro_exec.php index 46f5f11abd..ba0f901aec 100644 --- a/synchro/synchro_exec.php +++ b/synchro/synchro_exec.php @@ -46,7 +46,7 @@ function UsageAndExit($oP) } else { - $oP->p("The parameter 'data_sources' is mandatory, and must contain a comma separated list of data sources\n"); + $oP->p("The parameter 'data_sources' is mandatory, and must contain a comma separated list of data sources\n"); } $oP->output(); exit -2; @@ -105,6 +105,9 @@ if (utils::IsModeCLI()) else { require_once(APPROOT.'/application/loginwebpage.class.inc.php'); + + //N°6022 - Make synchro scripts work by http via token authentication with SYNCHRO scopes + $oCtx = new ContextTag(ContextTag::TAG_SYNCHRO); LoginWebPage::DoLogin(); // Check user rights and prompt if needed } @@ -166,7 +169,7 @@ foreach(explode(',', $sDataSourcesList) as $iSDS) } catch(Exception $e) { - $oP->add($e->getMessage()); + $oP->add($e->getMessage()); if ($bSimulate) { CMDBSource::Query('ROLLBACK'); diff --git a/synchro/synchro_import.php b/synchro/synchro_import.php index 9ece8bc642..935d824dec 100644 --- a/synchro/synchro_import.php +++ b/synchro/synchro_import.php @@ -255,7 +255,7 @@ if (utils::IsModeCLI()) { // Next steps: // specific arguments: 'csvfile' - // + // $sAuthUser = ReadMandatoryParam($oP, 'auth_user', 'raw_data'); $sAuthPwd = ReadMandatoryParam($oP, 'auth_pwd', 'raw_data'); $sCsvFile = ReadMandatoryParam($oP, 'csvfile', 'raw_data'); @@ -282,6 +282,9 @@ if (utils::IsModeCLI()) else { require_once APPROOT.'/application/loginwebpage.class.inc.php'; + + //N°6022 - Make synchro scripts work by http via token authentication with SYNCHRO scopes + $oCtx = new ContextTag(ContextTag::TAG_SYNCHRO); LoginWebPage::DoLogin(); // Check user rights and prompt if needed $sCSVData = utils::ReadPostedParam('csvdata', '', 'raw_data'); From 60b08586c274bac465ce534a8f00a1d007405539 Mon Sep 17 00:00:00 2001 From: odain Date: Fri, 24 Feb 2023 10:08:05 +0100 Subject: [PATCH 27/44] =?UTF-8?q?N=C2=B04762-fix=20fresh=20install=20setup?= =?UTF-8?q?=20crash?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- setup/compiler.class.inc.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup/compiler.class.inc.php b/setup/compiler.class.inc.php index 6804acbe5a..247ee68a3b 100644 --- a/setup/compiler.class.inc.php +++ b/setup/compiler.class.inc.php @@ -274,7 +274,7 @@ class MFCompiler try { - if ($oConfig->Get('set_menu_compilation_algorithm') === 'v2'){ + if (! is_null($oConfig) && $oConfig->Get('set_menu_compilation_algorithm') === 'v2'){ $this->DoNewCompile($sTempTargetDir, $sFinalTargetDir, $oP = null, $bUseSymbolicLinks); } else { $this->DoCompile($sTempTargetDir, $sFinalTargetDir, $oP = null, $bUseSymbolicLinks); From 0533916dad1cf0e895dff2f34e2c7239ff870f5e Mon Sep 17 00:00:00 2001 From: odain Date: Tue, 28 Feb 2023 14:54:26 +0100 Subject: [PATCH 28/44] 4762-menu compilation rework after brainstorming --- application/menunode.class.inc.php | 41 +- core/config.class.inc.php | 8 - setup/compiler.class.inc.php | 492 +-------------------- setup/parentmenunodecompiler.class.inc.php | 150 ------- test/setup/MFCompilerMenuTest.php | 53 ++- 5 files changed, 64 insertions(+), 680 deletions(-) delete mode 100644 setup/parentmenunodecompiler.class.inc.php diff --git a/application/menunode.class.inc.php b/application/menunode.class.inc.php index b4db18ae05..0369c41351 100644 --- a/application/menunode.class.inc.php +++ b/application/menunode.class.inc.php @@ -103,7 +103,7 @@ class ApplicationMenu { self::$sFavoriteSiloQuery = $sOQL; } - + /** * Get the query used to limit the list of displayed organizations in the drop-down menu * @return string The OQL query returning a list of Organization objects @@ -273,12 +273,23 @@ class ApplicationMenu continue; } + $aSubMenuNodes = static::GetSubMenuNodes($sMenuGroupIdx, $aExtraParams); + if (! MFCompiler::$bUseLegacyMenuCompilation && !($oMenuNode instanceof ShortcutMenuNode)){ + if (is_array($aSubMenuNodes) && 0 === sizeof($aSubMenuNodes)){ + IssueLog::Error('Empty menu node not displayed', LogChannels::CONSOLE, [ + 'menu_node_class' => get_class($oMenuNode), + 'menu_node_label' => $oMenuNode->GetLabel(), + ]); + continue; + } + } + $aMenuGroups[] = [ 'sId' => $oMenuNode->GetMenuID(), 'sIconCssClasses' => $oMenuNode->GetDecorationClasses(), 'sInitials' => $oMenuNode->GetInitials(), 'sTitle' => $oMenuNode->GetTitle(), - 'aSubMenuNodes' => static::GetSubMenuNodes($sMenuGroupIdx, $aExtraParams), + 'aSubMenuNodes' => $aSubMenuNodes, ]; } @@ -525,7 +536,7 @@ EOF return -1; } - + /** * Retrieves the currently active menu (if any, otherwise the first menu is the default) * @return string The Id of the currently active menu @@ -533,7 +544,7 @@ EOF public static function GetActiveNodeId() { $oAppContext = new ApplicationContext(); - $sMenuId = $oAppContext->GetCurrentValue('menu', null); + $sMenuId = $oAppContext->GetCurrentValue('menu', null); if ($sMenuId === null) { $sMenuId = self::GetDefaultMenuId(); @@ -643,7 +654,7 @@ abstract class MenuNode /** * Stimulus to check: if the user can 'apply' this stimulus, then she/he can see this menu - */ + */ protected $m_aEnableStimuli; /** @@ -804,7 +815,7 @@ abstract class MenuNode { return false; } - + /** * Add a limiting display condition for the same menu node. The conditions will be combined with a AND * @param $oMenuNode MenuNode Another definition of the same menu node, with potentially different access restriction @@ -977,7 +988,7 @@ class TemplateMenuNode extends MenuNode * @var string */ protected $sTemplateFile; - + /** * Create a menu item based on a custom template and inserts it into the application's main menu * @param string $sMenuId Unique identifier of the menu (used to identify the menu for bookmarking, and for getting the labels from the dictionary) @@ -1048,7 +1059,7 @@ class OQLMenuNode extends MenuNode * @var bool|null */ protected $bSearchFormOpen; - + /** * Extra parameters to be passed to the display block to fine tune its appearence */ @@ -1081,7 +1092,7 @@ class OQLMenuNode extends MenuNode // Enhancement: we could set as the "enable" condition that the user has enough rights to "read" the objects // of the class specified by the OQL... } - + /** * Set some extra parameters to be passed to the display block to fine tune its appearence * @param array $aParams paramCode => value. See DisplayBlock::GetDisplay for the meaning of the parameters @@ -1109,7 +1120,7 @@ class OQLMenuNode extends MenuNode 'Menu_'.$this->GetMenuId(), $this->bSearch, // Search pane $this->bSearchFormOpen, // Search open - $oPage, + $oPage, array_merge($this->m_aParams, $aExtraParams), true ); @@ -1343,10 +1354,10 @@ class NewObjectMenuNode extends MenuNode { // Enable this menu, only if the current user has enough rights to create such an object, or an object of // any child class - + $aSubClasses = MetaModel::EnumChildClasses($this->sClass, ENUM_CHILD_CLASSES_ALL); // Including the specified class itself $bActionIsAllowed = false; - + foreach($aSubClasses as $sCandidateClass) { if (!MetaModel::IsAbstract($sCandidateClass) && (UserRights::IsActionAllowed($sCandidateClass, UR_ACTION_MODIFY) == UR_ALLOWED_YES)) @@ -1355,7 +1366,7 @@ class NewObjectMenuNode extends MenuNode break; // Enough for now } } - return $bActionIsAllowed; + return $bActionIsAllowed; } /** @@ -1497,7 +1508,7 @@ class DashboardMenuNode extends MenuNode throw new Exception("Error: failed to load dashboard file: '{$this->sDashboardFile}'"); } } - + } /** @@ -1538,7 +1549,7 @@ class ShortcutContainerMenuNode extends MenuNode $sName = $this->GetMenuId().'_'.$oShortcut->GetKey(); new ShortcutMenuNode($sName, $oShortcut, $this->GetIndex(), $fRank++); } - + // Complete the tree // parent::PopulateChildMenus(); diff --git a/core/config.class.inc.php b/core/config.class.inc.php index f2f0f655f4..6c2c94c0ef 100644 --- a/core/config.class.inc.php +++ b/core/config.class.inc.php @@ -333,14 +333,6 @@ class Config 'source_of_value' => '', 'show_in_conf_sample' => false, ], - 'set_menu_compilation_algorithm' => [ - 'type' => 'string', - 'description' => 'setup menu compilation algorithm version (N°4762)', - 'default' => 'v1', - 'value' => 'v1', - 'source_of_value' => '', - 'show_in_conf_sample' => false, - ], 'allow_target_creation' => [ 'type' => 'bool', 'description' => 'Displays the + button on external keys to create target objects', diff --git a/setup/compiler.class.inc.php b/setup/compiler.class.inc.php index 247ee68a3b..2edc2a197d 100644 --- a/setup/compiler.class.inc.php +++ b/setup/compiler.class.inc.php @@ -24,7 +24,6 @@ use Combodo\iTop\DesignElement; require_once(APPROOT.'setup/setuputils.class.inc.php'); require_once(APPROOT.'setup/modelfactory.class.inc.php'); require_once(APPROOT.'core/moduledesign.class.inc.php'); -require_once(APPROOT.'setup/parentmenunodecompiler.class.inc.php'); class DOMFormatException extends Exception { @@ -91,6 +90,8 @@ class MFCompiler */ const REBUILD_HKEYS_NEVER = APPROOT.'data/.setup-rebuild-hkeys-never'; + public static $bUseLegacyMenuCompilation = false; + /** @var \ModelFactory */ protected $oFactory; @@ -127,6 +128,10 @@ class MFCompiler $this->aClassesCSSRules = []; } + public static function UseLegacyMenuCompilation(){ + self::$bUseLegacyMenuCompilation = true; + } + protected function Log($sText) { $this->aLog[] = $sText; @@ -274,11 +279,7 @@ class MFCompiler try { - if (! is_null($oConfig) && $oConfig->Get('set_menu_compilation_algorithm') === 'v2'){ - $this->DoNewCompile($sTempTargetDir, $sFinalTargetDir, $oP = null, $bUseSymbolicLinks); - } else { - $this->DoCompile($sTempTargetDir, $sFinalTargetDir, $oP = null, $bUseSymbolicLinks); - } + $this->DoCompile($sTempTargetDir, $sFinalTargetDir, $oP = null, $bUseSymbolicLinks); } catch (Exception $e) { @@ -510,7 +511,7 @@ EOF; { throw new Exception("Module '{$oModule->GetId()}' (location : '$sModuleRootDir') contains an unknown menuId : '$sMenuId'"); } - if ($oMenuNode->getAttribute("xsi:type") == 'MenuGroup') + if (self::$bUseLegacyMenuCompilation && $oMenuNode->getAttribute("xsi:type") == 'MenuGroup') { // Note: this algorithm is wrong // 1 - the module may appear empty in the current module, while children are defined in other modules @@ -724,483 +725,6 @@ EOF } // DoCompile() - /** - * @since 3.0.x N°4762 - * Perform the enhanced "Compilation" of all modules - * @param string $sTempTargetDir - * @param string $sFinalTargetDir - * @param Page $oP - * @param bool $bUseSymbolicLinks - * @throws Exception - */ - protected function DoNewCompile($sTempTargetDir, $sFinalTargetDir, $oP = null, $bUseSymbolicLinks = false) - { - $aAllClasses = []; // flat list of classes - $aModulesInfo = []; // Hash array of module_name => array('version' => string, 'root_dir' => string) - - // Determine the target modules for the MENUS - // - $aMenuNodes = []; - $aMenusByModule = []; - foreach ($this->oFactory->GetNodes('menus/menu') as $oMenuNode) - { - $sMenuId = $oMenuNode->getAttribute('id'); - $aMenuNodes[$sMenuId] = $oMenuNode; - - $sModuleMenu = $oMenuNode->getAttribute('_created_in'); - $aMenusByModule[$sModuleMenu][] = $sMenuId; - } - - // Determine the target module (exactly one!) for USER RIGHTS - // This used to be based solely on the module which created the user_rights node first - // Unfortunately, our sample extension was delivered with the xml structure, resulting in the new module to be the recipient of the compilation - // Then model.itop-profiles-itil would not exist... resulting in an error after the compilation (and the actual product of the compiler would never be included - // The bullet proof implementation would be to compile in a separate directory as it has been done with the dictionaries... that's another story - $aModules = $this->oFactory->GetLoadedModules(); - $sUserRightsModule = ''; - foreach ($aModules as $foo => $oModule) { - if ($oModule->GetName() == 'itop-profiles-itil') { - $sUserRightsModule = 'itop-profiles-itil'; - break; - } - } - $oUserRightsNode = $this->oFactory->GetNodes('user_rights')->item(0); - if ($oUserRightsNode && ($sUserRightsModule == '')) { - // Legacy algorithm (itop <= 2.0.3) - $sUserRightsModule = $oUserRightsNode->getAttribute('_created_in'); - } - $this->Log("User Rights module found: '$sUserRightsModule'"); - - // List root classes - // - $this->aRootClasses = []; - foreach ($this->oFactory->ListRootClasses() as $oClass) { - $this->Log("Root class (with child classes): ".$oClass->getAttribute('id')); - $this->aRootClasses[$oClass->getAttribute('id')] = $oClass; - } - - $this->LoadSnippets(); - - // Compile, module by module - // - $aModules = $this->oFactory->GetLoadedModules(); - $aDataModelFiles = []; - $aWebservicesFiles = []; - $iStart = strlen(realpath(APPROOT)); - $sRelFinalTargetDir = substr($sFinalTargetDir, strlen(APPROOT)); - - $this->WriteStaticOnlyHtaccess($sTempTargetDir); - $this->WriteStaticOnlyWebConfig($sTempTargetDir); - - static::SetUseSymbolicLinksFlag($bUseSymbolicLinks); - - $aParentModuleRootDirs = []; - $aParentMenuNodes = []; - foreach ($aModules as $foo => $oModule) { - $sModuleName = $oModule->GetName(); - $sModuleVersion = $oModule->GetVersion(); - - $sModuleRootDir = $oModule->GetRootDir(); - if ($sModuleRootDir != '') { - $sModuleRootDir = realpath($sModuleRootDir); - $sRelativeDir = basename($sModuleRootDir); - if ($bUseSymbolicLinks) { - $sRealRelativeDir = substr($sModuleRootDir, $iStart); - } else { - $sRealRelativeDir = $sRelFinalTargetDir.'/'.$sRelativeDir; - } - - // Push the other module files - SetupUtils::copydir($sModuleRootDir, $sTempTargetDir.'/'.$sRelativeDir, $bUseSymbolicLinks); - } else { - $sRelativeDir = $sModuleName; - $sRealRelativeDir = $sModuleName; - } - $aModulesInfo[$sModuleName] = array('root_dir' => $sRealRelativeDir, 'version' => $sModuleVersion); - - $sCompiledCode = ''; - - $oConstants = $this->oFactory->ListConstants($sModuleName); - if ($oConstants->length > 0) - { - foreach($oConstants as $oConstant) - { - $sCompiledCode .= $this->CompileConstant($oConstant)."\n"; - } - } - - if (array_key_exists($sModuleName, $this->aSnippets)) - { - foreach( $this->aSnippets[$sModuleName]['before'] as $aSnippet) - { - $sCompiledCode .= "\n"; - $sCompiledCode .= "/**\n"; - $sCompiledCode .= " * Snippet: {$aSnippet['snippet_id']}\n"; - $sCompiledCode .= " */\n"; - $sCompiledCode .= $aSnippet['content']."\n"; - } - } - - - $oClasses = $this->oFactory->ListClasses($sModuleName); - $iClassCount = $oClasses->length; - if ($iClassCount == 0) - { - $this->Log("Found module without classes declared: $sModuleName"); - } - else - { - /** @var \MFElement $oClass */ - foreach($oClasses as $oClass) - { - $sClass = $oClass->getAttribute("id"); - $aAllClasses[] = $sClass; - try - { - $sCompiledCode .= $this->CompileClass($oClass, $sTempTargetDir, $sFinalTargetDir, $sRelativeDir); - } - catch (DOMFormatException $e) - { - $sMessage = "Failed to process class '$sClass', "; - if (!empty($sModuleRootDir)) { - $sMessage .= "from '$sModuleRootDir': "; - } - $sMessage .= $e->getMessage(); - throw new Exception($sMessage); - } - } - } - - if (!array_key_exists($sModuleName, $aMenusByModule)) - { - $this->Log("Found module without menus declared: $sModuleName"); - } - else - { - $sMenuCreationClass = 'MenuCreation_'.preg_replace('/[^A-Za-z0-9_]/', '_', $sModuleName); - $sCompiledCode .= - <<GetChildText('parent', null)) - { - $aMenusToLoad[] = $sParent; - if (!array_key_exists($sParent, $aParentModuleRootDirs)){ - $aParentModuleRootDirs[$sParent] = $sModuleRootDir; - } - } - // Note: the order matters: the parents must be defined BEFORE - $aMenusToLoad[] = $sMenuId; - } - $aMenusToLoad = array_unique($aMenusToLoad); - $aMenuLinesForAll = []; - $aMenuLinesForAdmins = []; - $aAdminMenus = []; - foreach($aMenusToLoad as $sMenuId) - { - $oMenuNode = $aMenuNodes[$sMenuId]; - if (is_null($oMenuNode)) - { - throw new Exception("Module '{$oModule->GetId()}' (location : '$sModuleRootDir') contains an unknown menuId : '$sMenuId'"); - } - if ($oMenuNode->getAttribute("xsi:type") == 'MenuGroup' || array_key_exists($sMenuId, $aParentModuleRootDirs)) - { - $aParentMenuNodes[$sMenuId] = $oMenuNode; - $sParent = $oMenuNode->GetChildText('parent', null); - if (($oMenuNode->GetChildText('enable_admin_only') == '1') || isset($aAdminMenus[$sParent])) - { - $aAdminMenus[$sMenuId] = true; - } - continue; - - // Note: this algorithm is wrong - // 1 - the module may appear empty in the current module, while children are defined in other modules - // 2 - check recursively that child nodes are not empty themselves - // Future algorithm: - // a- browse the modules and build the menu tree - // b- browse the tree and blacklist empty menus - // c- before compiling, discard if blacklisted - } - try - { - $aMenuLines = $this->CompileMenu($oMenuNode, $sTempTargetDir, $sFinalTargetDir, $sRelativeDir, $oP); - } - catch (DOMFormatException $e) - { - throw new Exception("Failed to process menu '$sMenuId', from '$sModuleRootDir': ".$e->getMessage()); - } - $sParent = $oMenuNode->GetChildText('parent', null); - if (($oMenuNode->GetChildText('enable_admin_only') == '1') || isset($aAdminMenus[$sParent])) - { - $aMenuLinesForAdmins = array_merge($aMenuLinesForAdmins, $aMenuLines); - $aAdminMenus[$oMenuNode->getAttribute("id")] = true; - } - else - { - $aMenuLinesForAll = array_merge($aMenuLinesForAll, $aMenuLines); - } - } - $sIndent = "\t\t"; - foreach ($aMenuLinesForAll as $sPHPLine) - { - $sCompiledCode .= $sIndent.$sPHPLine."\n"; - } - if (count($aMenuLinesForAdmins) > 0) - { - $sCompiledCode .= $sIndent."if (UserRights::IsAdministrator())\n"; - $sCompiledCode .= $sIndent."{\n"; - foreach ($aMenuLinesForAdmins as $sPHPLine) - { - $sCompiledCode .= $sIndent."\t".$sPHPLine."\n"; - } - $sCompiledCode .= $sIndent."}\n"; - } - $sCompiledCode .= - <<CompileUserRights($oUserRightsNode); - } - - if (array_key_exists($sModuleName, $this->aSnippets)) - { - foreach( $this->aSnippets[$sModuleName]['after'] as $aSnippet) - { - $sCompiledCode .= "\n"; - $sCompiledCode .= "/**\n"; - $sCompiledCode .= " * Snippet: {$aSnippet['snippet_id']}\n"; - $sCompiledCode .= " */\n"; - $sCompiledCode .= $aSnippet['content']."\n"; - } - } - - // Create (overwrite if existing) the compiled file - // - if (strlen($sCompiledCode) > 0) - { - // We have compiled something: write the code somewhere - // - if (strlen($sModuleRootDir) > 0) - { - // Write the code into the given module as model..php - // - $sResultFile = $sTempTargetDir.'/'.$sRelativeDir.'/model.'.$sModuleName.'.php'; - $this->WritePHPFile($sResultFile, $sModuleName, $sModuleVersion, $sCompiledCode); - } - else - { - // Write the code into core/main.php - // - $this->sMainPHPCode .= - <<sMainPHPCode .= $sCompiledCode; - } - } - else - { - $this->Log("Compilation of module $sModuleName in version $sModuleVersion produced not code at all. No file written."); - } - - // files to include (PHP datamodels) - foreach($oModule->GetFilesToInclude('business') as $sRelFileName) - { - $aDataModelFiles[] = "MetaModel::IncludeModule(MODULESROOT.'/$sRelativeDir/$sRelFileName');"; - } - // files to include (PHP webservices providers) - foreach($oModule->GetFilesToInclude('webservices') as $sRelFileName) - { - $aWebservicesFiles[] = "MetaModel::IncludeModule(MODULESROOT.'/$sRelativeDir/$sRelFileName');"; - } - } // foreach module - - // Compile the dictionaries -out of the modules - // - $sDictDir = $sTempTargetDir.'/dictionaries'; - if (!is_dir($sDictDir)) - { - $this->Log("Creating directory $sDictDir"); - mkdir($sDictDir, 0777, true); - } - - $oDictionaries = $this->oFactory->GetNodes('dictionaries/dictionary'); - $this->CompileDictionaries($oDictionaries, $sTempTargetDir, $sFinalTargetDir); - - // Compile the branding - // - $oBrandingNode = $this->oFactory->GetNodes('branding')->item(0); - $this->CompileBranding($oBrandingNode, $sTempTargetDir, $sFinalTargetDir); - - if (array_key_exists('_core_', $this->aSnippets)) - { - foreach( $this->aSnippets['_core_']['before'] as $aSnippet) - { - $this->sMainPHPCode .= "\n"; - $this->sMainPHPCode .= "/**\n"; - $this->sMainPHPCode .= " * Snippet: {$aSnippet['snippet_id']}\n"; - $this->sMainPHPCode .= " */\n"; - $this->sMainPHPCode .= $aSnippet['content']."\n"; - } - } - - // Compile the portals - $oPortalsNode = $this->oFactory->GetNodes('/itop_design/portals')->item(0); - $this->CompilePortals($oPortalsNode, $sTempTargetDir, $sFinalTargetDir); - - // Create module design XML files - $oModuleDesignsNode = $this->oFactory->GetNodes('/itop_design/module_designs')->item(0); - $this->CompileModuleDesigns($oModuleDesignsNode, $sTempTargetDir, $sFinalTargetDir); - - // Compile the XML parameters - $oParametersNode = $this->oFactory->GetNodes('/itop_design/module_parameters')->item(0); - $this->CompileParameters($oParametersNode, $sTempTargetDir, $sFinalTargetDir); - - if (array_key_exists('_core_', $this->aSnippets)) - { - foreach( $this->aSnippets['_core_']['after'] as $aSnippet) - { - $this->sMainPHPCode .= "\n"; - $this->sMainPHPCode .= "/**\n"; - $this->sMainPHPCode .= " * Snippet: {$aSnippet['snippet_id']}\n"; - $this->sMainPHPCode .= " */\n"; - $this->sMainPHPCode .= $aSnippet['content']."\n"; - } - } - - if (count($this->aRelations) > 0) - { - $this->sMainPHPCode .= "\n"; - $this->sMainPHPCode .= "/**\n"; - $this->sMainPHPCode .= " * Relations\n"; - $this->sMainPHPCode .= " */\n"; - foreach($this->aRelations as $sRelationCode => $aData) - { - $sRelCodeSafe = addslashes($sRelationCode); - $this->sMainPHPCode .= "MetaModel::RegisterRelation('$sRelCodeSafe');\n"; - } - } - - // Write core/main.php - SetupUtils::builddir($sTempTargetDir.'/core'); - $sPHPFile = $sTempTargetDir.'/core/main.php'; - file_put_contents($sPHPFile, $this->sMainPHPCode); - - $this->GenerateMenuNodePhpCode($aParentModuleRootDirs, $aParentMenuNodes, $aAdminMenus, $sTempTargetDir, $sFinalTargetDir, $sRelativeDir, $oP); - - $sCurrDate = date(DATE_ISO8601); - // Autoload - $sPHPFile = $sTempTargetDir.'/autoload.php'; - $sPHPFileContent = - << $sModuleRootDir) { - $oCompileParentMenuNode->CompileParentMenuNode($sMenuId); - } - - $aMenuLinesForAdmins = $oCompileParentMenuNode->GetMenuLinesForAdmins(); - $aMenuLinesForAll = $oCompileParentMenuNode->GetMenuLinesForAll(); - - $sCurrDate = date(DATE_ISO8601); - $sCompiledCode = - << 0) - { - $sCompiledCode .= $sIndent."if (UserRights::IsAdministrator())\n"; - $sCompiledCode .= $sIndent."{\n"; - foreach ($aMenuLinesForAdmins as $sPHPLine) - { - $sCompiledCode .= $sIndent."\t".$sPHPLine."\n"; - } - $sCompiledCode .= $sIndent."}\n"; - } - - $sCompiledCode .= <<oMFCompiler = $oMFCompiler; - $this->aParentModuleRootDirs = $aParentModuleRootDirs; - $this->aParentMenuNodes = $aParentMenuNodes; - $this->aAdminMenus = $aAdminMenus; - $this->sTempTargetDir = $sTempTargetDir; - $this->sFinalTargetDir = $sFinalTargetDir; - $this->sRelativeDir = $sRelativeDir; - $this->oP = $oP; - } - - public function CompileParentMenuNode(string $sMenuId) : void - { - $sStatus = array_key_exists($sMenuId, $this->aMenuProcessStatus) ? $this->aMenuProcessStatus[$sMenuId] : null; - if ($sStatus === self::COMPILED){ - //node already processed before - return; - } else if ($sStatus === self::COMPILING){ - throw new \Exception("Cyclic dependency between parent menus ($sMenuId)"); - } - - $this->aMenuProcessStatus[$sMenuId] = self::COMPILING; - - try { - if (! array_key_exists($sMenuId, $this->aParentMenuNodes)){ - throw new Exception("Failed to process parent menu '$sMenuId' that is referenced by a child but not defined"); - } - $oMenuNode = $this->aParentMenuNodes[$sMenuId]; - - $sParent = $oMenuNode->GetChildText('parent', null); - if (! empty($sParent)){ - //compile parents before (even parent of parents ... recursively) - $this->CompileParentMenuNode($sParent); - } - - if (! array_key_exists($sMenuId, $this->aParentModuleRootDirs)){ - throw new Exception("Failed to process parent menu '$sMenuId' that is referenced by a child but not defined"); - } - $sModuleRootDir = $this->aParentModuleRootDirs[$sMenuId]; - - $aMenuLines = $this->oMFCompiler->CompileMenu($oMenuNode, $this->sTempTargetDir, $this->sFinalTargetDir, $this->sRelativeDir, $this->oP); - } catch (DOMFormatException $e) { - throw new Exception("Failed to process menu '$sMenuId', from '$sModuleRootDir': ".$e->getMessage()); - } - $sParent = $oMenuNode->GetChildText('parent', null); - if (($oMenuNode->GetChildText('enable_admin_only') == '1') || isset($this->aAdminMenus[$sParent])) { - $this->aMenuLinesForAdmins = array_merge($this->aMenuLinesForAdmins, $aMenuLines); - $this->aAdminMenus[$oMenuNode->getAttribute("id")] = true; - } else { - $this->aMenuLinesForAll = array_merge($this->aMenuLinesForAll, $aMenuLines); - } - - $this->aMenuProcessStatus[$sMenuId] = self::COMPILED; - } - - public function GetMenuLinesForAdmins(): array { - return $this->aMenuLinesForAdmins; - } - - public function GetMenuLinesForAll(): array { - return $this->aMenuLinesForAll; - } - - -} diff --git a/test/setup/MFCompilerMenuTest.php b/test/setup/MFCompilerMenuTest.php index c7803cb6f3..6926e159dc 100644 --- a/test/setup/MFCompilerMenuTest.php +++ b/test/setup/MFCompilerMenuTest.php @@ -19,11 +19,14 @@ use RunTimeEnvironment; */ class MFCompilerMenuTest extends ItopTestCase { private static $aPreviousEnvMenus; + private static $aPreviousEnvMenuCount; public function setUp(): void { parent::setUp(); require_once(APPROOT.'setup/compiler.class.inc.php'); require_once(APPROOT.'setup/modelfactory.class.inc.php'); + require_once(APPROOT.'application/utils.inc.php'); + } public function tearDown(): void { @@ -32,40 +35,37 @@ class MFCompilerMenuTest extends ItopTestCase { public function CompileMenusProvider(){ return [ - 'production' => ['production'], - 'phpunit' => ['phpunit'], + 'legacy_algo' => [ 'sEnv' => 'legacy_algo', 'bLegacyMenuCompilation' => true ], + 'menu_compilation_fix' => [ 'sEnv' => 'menu_compilation_fix', 'bLegacyMenuCompilation' => false ], ]; } /** * @dataProvider CompileMenusProvider */ - public function testCompileMenus($sEnv){ - if(\utils::GetCurrentEnvironment() != $sEnv) { - $sConfigFilePath = \utils::GetConfigFilePath($sEnv); + public function testCompileMenus($sEnv, $bLegacyMenuCompilation){ + $sConfigFilePath = \utils::GetConfigFilePath($sEnv); - //copy conf from production to phpunit context - $sDirPath = dirname($sConfigFilePath); - if (! is_dir($sDirPath)){ - mkdir($sDirPath); - } - $oConfig = new Config(\utils::GetConfigFilePath()); - $oConfig->WriteToFile($sConfigFilePath); - - $oConfig = new Config($sConfigFilePath); - $oConfig->Set('set_menu_compilation_algorithm', 'v2', 'test', true); - $oConfig->WriteToFile(); - $oRunTimeEnvironment = new RunTimeEnvironment($sEnv); - $oRunTimeEnvironment->CompileFrom(\utils::GetCurrentEnvironment()); - $oConfig->Set('set_menu_compilation_algorithm', 'v1', 'test', true); - $oConfig->WriteToFile(); + //copy conf from production to phpunit context + $sDirPath = dirname($sConfigFilePath); + if (! is_dir($sDirPath)){ + mkdir($sDirPath); } + $oConfig = new Config(\utils::GetConfigFilePath()); + $oConfig->WriteToFile($sConfigFilePath); + + $oConfig = new Config($sConfigFilePath); + if ($bLegacyMenuCompilation){ + MFCompiler::UseLegacyMenuCompilation(); + } + $oConfig->WriteToFile(); + $oRunTimeEnvironment = new RunTimeEnvironment($sEnv); + $oRunTimeEnvironment->CompileFrom(\utils::GetCurrentEnvironment()); + $oConfig->WriteToFile(); $sConfigFile = APPCONF.\utils::GetCurrentEnvironment().'/'.ITOP_CONFIG_FILE; MetaModel::Startup($sConfigFile, false /* $bModelOnly */, true /* $bAllowCache */, false /* $bTraceSourceFiles */, $sEnv); $aMenuGroups = ApplicationMenu::GetMenuGroups(); - $this->assertNotEquals([], $aMenuGroups); - if (! is_null(static::$aPreviousEnvMenus)){ $this->assertEquals(static::$aPreviousEnvMenus, $aMenuGroups); } else { @@ -73,6 +73,13 @@ class MFCompilerMenuTest extends ItopTestCase { } static::$aPreviousEnvMenus = $aMenuGroups; - //$this->InvokeNonPublicMethod(MFCompiler::class, 'CompileThemes', $this->oMFCompiler, [$oBrandingNode, $this->sTmpDir]); + $aMenuCount = ApplicationMenu::GetMenusCount(); + + if (! is_null(static::$aPreviousEnvMenuCount)){ + $this->assertEquals(static::$aPreviousEnvMenuCount, $aMenuCount); + } else { + $this->assertNotEquals([], $aMenuCount); + } + static::$aPreviousEnvMenuCount = $aMenuCount; } } From 9c0b906ded92895ac34d25edd16af1a28bf82b3b Mon Sep 17 00:00:00 2001 From: Denis Date: Fri, 3 Mar 2023 14:12:09 +0100 Subject: [PATCH 29/44] =?UTF-8?q?N=C2=B05922=20-=20Fix=20plus=20button=20s?= =?UTF-8?q?emantic=20on=20ext.=20key=20widget=20(#448)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * N°5922 - Enhance plus button on extkeywidget * Properly reset the target class when closing the dialog * Make icon buttons as actual clickable links for BeHat * Apply suggestions from code review Review by Guillaume. Thanks! Co-authored-by: Molkobain --- application/ui.extkeywidget.class.inc.php | 12 +++++++----- css/backoffice/components/_field.scss | 3 +++ js/extkeywidget.js | 16 +++++++++++----- pages/ajax.render.php | 5 +++-- 4 files changed, 24 insertions(+), 12 deletions(-) diff --git a/application/ui.extkeywidget.class.inc.php b/application/ui.extkeywidget.class.inc.php index 22f12f736c..15871a260b 100644 --- a/application/ui.extkeywidget.class.inc.php +++ b/application/ui.extkeywidget.class.inc.php @@ -5,6 +5,7 @@ */ use Combodo\iTop\Application\UI\Base\Component\Form\FormUIBlockFactory; +use Combodo\iTop\Application\UI\Base\Component\Input\InputUIBlockFactory; use Combodo\iTop\Application\UI\Base\Layout\UIContentBlockUIBlockFactory; use Combodo\iTop\Core\MetaModel\FriendlyNameType; @@ -323,12 +324,12 @@ EOF EOF ); $sHTMLValue .= "
"; - $sHTMLValue .= "
iId}\" onClick=\"oACWidget_{$this->iId}.Clear();\" data-tooltip-content='".Dict::S('UI:Button:Clear')."'>
"; + $sHTMLValue .= " iId}\" onClick=\"oACWidget_{$this->iId}.Clear();\" data-tooltip-content='".Dict::S('UI:Button:Clear')."'>"; } if ($bCreate && $bExtensions) { $sCallbackName = (MetaModel::IsAbstract($this->sTargetClass)) ? 'SelectObjectClass' : 'CreateObject'; - $sHTMLValue .= "
iId}\" onClick=\"oACWidget_{$this->iId}.{$sCallbackName}();\" data-tooltip-content='".Dict::S('UI:Button:Create')."'>
"; + $sHTMLValue .= "iId}\" onClick=\"oACWidget_{$this->iId}.{$sCallbackName}();\" data-tooltip-content='".Dict::S('UI:Button:Create')."'>"; $oPage->add_ready_script( <<iId}').length == 0) @@ -339,7 +340,7 @@ JS ); } if ($bExtensions && MetaModel::IsHierarchicalClass($this->sTargetClass) !== false) { - $sHTMLValue .= "
iId}\" onClick=\"oACWidget_{$this->iId}.HKDisplay();\" data-tooltip-content='".Dict::S('UI:Button:SearchInHierarchy')."'>
"; + $sHTMLValue .= "iId}\" onClick=\"oACWidget_{$this->iId}.HKDisplay();\" data-tooltip-content='".Dict::S('UI:Button:SearchInHierarchy')."'>"; $oPage->add_ready_script( <<iId}').length == 0) @@ -350,7 +351,7 @@ JS ); } if ($oAllowedValues->CountExceeds($iMaxComboLength)) { - $sHTMLValue .= "
iId}\" onClick=\"oACWidget_{$this->iId}.Search();\" data-tooltip-content='".Dict::S('UI:Button:Search')."'>
"; + $sHTMLValue .= " iId}\" onClick=\"oACWidget_{$this->iId}.Search();\" data-tooltip-content='".Dict::S('UI:Button:Search')."'>"; } $sHTMLValue .= "
"; $sHTMLValue .= ""; @@ -904,7 +905,7 @@ JS { // For security reasons: check that the "proposed" class is actually a subclass of the linked class // and that the current user is allowed to create objects of this class - $aSubClasses = MetaModel::EnumChildClasses($this->sTargetClass); + $aSubClasses = MetaModel::EnumChildClasses($this->sTargetClass, ENUM_CHILD_CLASSES_ALL); $aPossibleClasses = array(); foreach($aSubClasses as $sCandidateClass) { @@ -924,6 +925,7 @@ JS $sDialogTitleEscaped = addslashes($sDialogTitle); $oPage->add_ready_script("$('#ac_create_$this->iId').dialog({ width: 'auto', height: 'auto', maxHeight: $(window).height() - 50, autoOpen: false, modal: true, title: '$sDialogTitleEscaped'});\n"); $oPage->add_ready_script("$('#ac_create_{$this->iId} form').removeAttr('onsubmit');"); + $oPage->add_ready_script("$('#ac_create_{$this->iId} form').find('select').attr('id', 'ac_create_{$this->iId}_select');"); $oPage->add_ready_script("$('#ac_create_{$this->iId} form').on('submit.uilinksWizard', oACWidget_{$this->iId}.DoSelectObjectClass);"); } diff --git a/css/backoffice/components/_field.scss b/css/backoffice/components/_field.scss index 736a756b3a..daa40251e4 100644 --- a/css/backoffice/components/_field.scss +++ b/css/backoffice/components/_field.scss @@ -253,3 +253,6 @@ $ibo-field--enable-bulk--checkbox--margin-left: $ibo-spacing-300 !default; margin-left: $ibo-field--enable-bulk--checkbox--margin-left; } +.ibo-input-select--action-buttons a { + @extend %ibo-hyperlink-inherited-colors; +} \ No newline at end of file diff --git a/js/extkeywidget.js b/js/extkeywidget.js index 62210f4d08..38862366f7 100644 --- a/js/extkeywidget.js +++ b/js/extkeywidget.js @@ -634,7 +634,7 @@ function ExtKeyWidget(id, sTargetClass, sFilter, sTitle, bSelectMode, oWizHelper // will force it be of the same class as the previous call) me.sTargetClass = me.sOriginalTargetClass; - me.CreateObject(oWizHelper); + me.CreateObject(); }; this.DoSelectObjectClass = function () { @@ -646,13 +646,12 @@ function ExtKeyWidget(id, sTargetClass, sFilter, sTitle, bSelectMode, oWizHelper // Setting new target class me.sTargetClass = oSelectedClass.val(); - // Opening real creation form + me.CreateObject(true); $('#ac_create_'+me.id).dialog('close'); - me.CreateObject(); }; - this.CreateObject = function (oWizHelper) { + this.CreateObject = function (bTargetClassSelected) { if ($('#'+me.id).prop('disabled')) { return; } // Disabled, do nothing @@ -670,7 +669,8 @@ function ExtKeyWidget(id, sTargetClass, sFilter, sTitle, bSelectMode, oWizHelper sAttCode: me.sAttCode, 'json': me.oWizardHelper.ToJSON(), operation: 'objectCreationForm', - ajax_promise_id: sPromiseId + ajax_promise_id: sPromiseId, + bTargetClassSelected: bTargetClassSelected }; // Make sure that we cancel any pending request before issuing another @@ -678,6 +678,7 @@ function ExtKeyWidget(id, sTargetClass, sFilter, sTitle, bSelectMode, oWizHelper me.StopPendingRequest(); // Run the query and get the result back directly in HTML + var sLocalTargetClass = me.sTargetClass; // Remember the target class since it will be reset when closing the dialog me.ajax_request = $.post(AddAppContext(GetAbsoluteUrlAppRoot()+'pages/ajax.render.php'), theMap, function (data) { $('#ajax_'+me.id).html(data); @@ -687,6 +688,7 @@ function ExtKeyWidget(id, sTargetClass, sFilter, sTitle, bSelectMode, oWizHelper // Modify the action of the cancel button $('#ac_create_'+me.id+' button.cancel').off('click').on('click', me.CloseCreateObject); me.ajax_request = null; + me.sTargetClass = sLocalTargetClass; // Adjust the dialog's size to fit into the screen if ($('#ac_create_'+me.id).width() > ($(window).width()-40)) { $('#ac_create_'+me.id).width($(window).width()-40); @@ -714,6 +716,10 @@ function ExtKeyWidget(id, sTargetClass, sFilter, sTitle, bSelectMode, oWizHelper $('#ac_create_'+me.id).dialog("destroy"); $('#ac_create_'+me.id).remove(); $('#ajax_'+me.id).html(''); + // Resetting target class to its original value + // (If not done, closing the dialog and trying to create a object again + // will force it be of the same class as the previous call) + me.sTargetClass = me.sOriginalTargetClass; }; this.DoCreateObject = function () { diff --git a/pages/ajax.render.php b/pages/ajax.render.php index ff255bb96d..98e7b36f24 100644 --- a/pages/ajax.render.php +++ b/pages/ajax.render.php @@ -410,9 +410,10 @@ try $iInputId = utils::ReadParam('iInputId', ''); $sAttCode = utils::ReadParam('sAttCode', ''); $sJson = utils::ReadParam('json', '', false, 'raw_data'); - // Building form, if target class is abstract we ask the user for the desired leaf class + $bTargetClassSelected = utils::ReadParam('bTargetClassSelected', '', false, 'raw_data'); + // Building form, if target class has child classes we ask the user for the desired leaf class, unless we've already done just that $oWidget = new UIExtKeyWidget($sTargetClass, $iInputId, $sAttCode, false); - if(MetaModel::IsAbstract($sTargetClass)) + if(!$bTargetClassSelected && MetaModel::HasChildrenClasses($sTargetClass)) { $oWidget->GetClassSelectionForm($oPage); } From 7176bc8686c01998592bd263a71bd0f0d141c259 Mon Sep 17 00:00:00 2001 From: odain Date: Thu, 2 Mar 2023 08:51:42 +0100 Subject: [PATCH 30/44] =?UTF-8?q?N=C2=B04762=20-=20menu=20compilation:=20f?= =?UTF-8?q?ix=20broken=20menus=20scenario=20via=20AVA6=20delta=20XML=20N?= =?UTF-8?q?=C2=B04762-enhance=20test?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- application/menunode.class.inc.php | 3 +- setup/compiler.class.inc.php | 97 +----- setup/parentmenunodecompiler.class.inc.php | 287 ++++++++++++++++++ test/setup/MFCompilerMenuTest.php | 68 ++++- .../datamodels/delta_broken_menus.xml | 14 + 5 files changed, 380 insertions(+), 89 deletions(-) create mode 100644 setup/parentmenunodecompiler.class.inc.php create mode 100644 tests/php-unit-tests/unitary-tests/setup/ressources/datamodels/delta_broken_menus.xml diff --git a/application/menunode.class.inc.php b/application/menunode.class.inc.php index 0369c41351..ea1e3f14c0 100644 --- a/application/menunode.class.inc.php +++ b/application/menunode.class.inc.php @@ -9,6 +9,7 @@ use Combodo\iTop\Application\Helper\WebResourcesHelper; require_once(APPROOT.'/application/utils.inc.php'); require_once(APPROOT.'/application/template.class.inc.php'); require_once(APPROOT."/application/user.dashboard.class.inc.php"); +require_once(APPROOT."/setup/parentmenunodecompiler.class.inc.php"); /** @@ -274,7 +275,7 @@ class ApplicationMenu } $aSubMenuNodes = static::GetSubMenuNodes($sMenuGroupIdx, $aExtraParams); - if (! MFCompiler::$bUseLegacyMenuCompilation && !($oMenuNode instanceof ShortcutMenuNode)){ + if (! ParentMenuNodeCompiler::$bUseLegacyMenuCompilation && !($oMenuNode instanceof ShortcutMenuNode)){ if (is_array($aSubMenuNodes) && 0 === sizeof($aSubMenuNodes)){ IssueLog::Error('Empty menu node not displayed', LogChannels::CONSOLE, [ 'menu_node_class' => get_class($oMenuNode), diff --git a/setup/compiler.class.inc.php b/setup/compiler.class.inc.php index 2edc2a197d..da354f8eb5 100644 --- a/setup/compiler.class.inc.php +++ b/setup/compiler.class.inc.php @@ -23,6 +23,7 @@ use Combodo\iTop\DesignElement; require_once(APPROOT.'setup/setuputils.class.inc.php'); require_once(APPROOT.'setup/modelfactory.class.inc.php'); +require_once(APPROOT.'setup/parentmenunodecompiler.class.inc.php'); require_once(APPROOT.'core/moduledesign.class.inc.php'); class DOMFormatException extends Exception @@ -90,8 +91,6 @@ class MFCompiler */ const REBUILD_HKEYS_NEVER = APPROOT.'data/.setup-rebuild-hkeys-never'; - public static $bUseLegacyMenuCompilation = false; - /** @var \ModelFactory */ protected $oFactory; @@ -128,10 +127,6 @@ class MFCompiler $this->aClassesCSSRules = []; } - public static function UseLegacyMenuCompilation(){ - self::$bUseLegacyMenuCompilation = true; - } - protected function Log($sText) { $this->aLog[] = $sText; @@ -332,21 +327,16 @@ class MFCompiler */ protected function DoCompile($sTempTargetDir, $sFinalTargetDir, $oP = null, $bUseSymbolicLinks = false) { - $aAllClasses = array(); // flat list of classes - $aModulesInfo = array(); // Hash array of module_name => array('version' => string, 'root_dir' => string) + $aAllClasses = []; // flat list of classes + $aModulesInfo = []; // Hash array of module_name => array('version' => string, 'root_dir' => string) // Determine the target modules for the MENUS - // - $aMenuNodes = array(); - $aMenusByModule = array(); - foreach ($this->oFactory->GetNodes('menus/menu') as $oMenuNode) - { - $sMenuId = $oMenuNode->getAttribute('id'); - $aMenuNodes[$sMenuId] = $oMenuNode; - $sModuleMenu = $oMenuNode->getAttribute('_created_in'); - $aMenusByModule[$sModuleMenu][] = $sMenuId; - } + /** + * @since 3.1 N°4762 + */ + $oParentMenuNodeCompiler = new ParentMenuNodeCompiler($this); + $oParentMenuNodeCompiler->LoadXmlMenus($this->oFactory); // Determine the target module (exactly one!) for USER RIGHTS // This used to be based solely on the module which created the user_rights node first @@ -391,6 +381,7 @@ class MFCompiler static::SetUseSymbolicLinksFlag($bUseSymbolicLinks); + $oParentMenuNodeCompiler->LoadModuleMenuInfo($aModules); foreach ($aModules as $foo => $oModule) { $sModuleName = $oModule->GetName(); $sModuleVersion = $oModule->GetVersion(); @@ -466,7 +457,7 @@ class MFCompiler } } - if (!array_key_exists($sModuleName, $aMenusByModule)) + if (is_null($oParentMenuNodeCompiler->GetMenusByModule($sModuleName))) { $this->Log("Found module without menus declared: $sModuleName"); } @@ -486,75 +477,19 @@ class $sMenuCreationClass extends ModuleHandlerAPI global \$__comp_menus__; // ensure that the global variable is indeed global ! EOF; - // Preliminary: determine parent menus not defined within the current module - $aMenusToLoad = array(); - $aParentMenus = array(); - foreach($aMenusByModule[$sModuleName] as $sMenuId) - { - $oMenuNode = $aMenuNodes[$sMenuId]; - if ($sParent = $oMenuNode->GetChildText('parent', null)) - { - $aMenusToLoad[] = $sParent; - $aParentMenus[] = $sParent; - } - // Note: the order matters: the parents must be defined BEFORE - $aMenusToLoad[] = $sMenuId; - } - $aMenusToLoad = array_unique($aMenusToLoad); - $aMenuLinesForAll = array(); - $aMenuLinesForAdmins = array(); - $aAdminMenus = array(); - foreach($aMenusToLoad as $sMenuId) - { - $oMenuNode = $aMenuNodes[$sMenuId]; - if (is_null($oMenuNode)) - { - throw new Exception("Module '{$oModule->GetId()}' (location : '$sModuleRootDir') contains an unknown menuId : '$sMenuId'"); - } - if (self::$bUseLegacyMenuCompilation && $oMenuNode->getAttribute("xsi:type") == 'MenuGroup') - { - // Note: this algorithm is wrong - // 1 - the module may appear empty in the current module, while children are defined in other modules - // 2 - check recursively that child nodes are not empty themselves - // Future algorithm: - // a- browse the modules and build the menu tree - // b- browse the tree and blacklist empty menus - // c- before compiling, discard if blacklisted - if (!in_array($oMenuNode->getAttribute("id"), $aParentMenus)) - { - // Discard empty menu groups - continue; - } - } - try - { - $aMenuLines = $this->CompileMenu($oMenuNode, $sTempTargetDir, $sFinalTargetDir, $sRelativeDir, $oP); - } - catch (DOMFormatException $e) - { - throw new Exception("Failed to process menu '$sMenuId', from '$sModuleRootDir': ".$e->getMessage()); - } - $sParent = $oMenuNode->GetChildText('parent', null); - if (($oMenuNode->GetChildText('enable_admin_only') == '1') || isset($aAdminMenus[$sParent])) - { - $aMenuLinesForAdmins = array_merge($aMenuLinesForAdmins, $aMenuLines); - $aAdminMenus[$oMenuNode->getAttribute("id")] = true; - } - else - { - $aMenuLinesForAll = array_merge($aMenuLinesForAll, $aMenuLines); - } - } + + $oParentMenuNodeCompiler->CompileModuleMenus($oModule, $sTempTargetDir, $sFinalTargetDir, $sRelativeDir, $oP); + $sIndent = "\t\t"; - foreach ($aMenuLinesForAll as $sPHPLine) + foreach ($oParentMenuNodeCompiler->GetMenuLinesForAll() as $sPHPLine) { $sCompiledCode .= $sIndent.$sPHPLine."\n"; } - if (count($aMenuLinesForAdmins) > 0) + if (count($oParentMenuNodeCompiler->GetMenuLinesForAdmins()) > 0) { $sCompiledCode .= $sIndent."if (UserRights::IsAdministrator())\n"; $sCompiledCode .= $sIndent."{\n"; - foreach ($aMenuLinesForAdmins as $sPHPLine) + foreach ($oParentMenuNodeCompiler->GetMenuLinesForAdmins() as $sPHPLine) { $sCompiledCode .= $sIndent."\t".$sPHPLine."\n"; } diff --git a/setup/parentmenunodecompiler.class.inc.php b/setup/parentmenunodecompiler.class.inc.php new file mode 100644 index 0000000000..374a915ced --- /dev/null +++ b/setup/parentmenunodecompiler.class.inc.php @@ -0,0 +1,287 @@ +oMFCompiler = $oMFCompiler; + } + + public static function UseLegacyMenuCompilation(){ + self::$bUseLegacyMenuCompilation = true; + } + + /** + * @param \ModelFactory $oFactory + * Initialize menu nodes arrays + * @return void + */ + public function LoadXmlMenus(\ModelFactory $oFactory) : void { + foreach ($oFactory->GetNodes('menus/menu') as $oMenuNode) { + $sMenuId = $oMenuNode->getAttribute('id'); + $this->aMenuNodes[$sMenuId] = $oMenuNode; + + $sModuleMenu = $oMenuNode->getAttribute('_created_in'); + $this->aMenusByModule[$sModuleMenu][] = $sMenuId; + } + } + + /** + * @param $aModules + * Initialize arrays related to parent/child menus + * @return void + */ + public function LoadModuleMenuInfo($aModules) : void + { + foreach ($aModules as $foo => $oModule) { + $sModuleRootDir = $oModule->GetRootDir(); + $sModuleName = $oModule->GetName(); + + if (array_key_exists($sModuleName, $this->aMenusByModule)) { + $aMenusToLoad = []; + $aParentMenus = []; + + foreach ($this->aMenusByModule[$sModuleName] as $sMenuId) { + $oMenuNode = $this->aMenuNodes[$sMenuId]; + + if (self::$bUseLegacyMenuCompilation){ + if ($sParent = $oMenuNode->GetChildText('parent', null)) { + $aMenusToLoad[] = $sParent; + $aParentMenus[] = $sParent; + } + } else { + if ($oMenuNode->getAttribute("xsi:type") == 'MenuGroup') { + $this->aParentModuleRootDirs[$sMenuId] = $sModuleRootDir; + } + + if ($sParent = $oMenuNode->GetChildText('parent', null)) { + $aMenusToLoad[] = $sParent; + $aParentMenus[] = $sParent; + + $this->aParentModuleRootDirs[$sParent] = $sModuleRootDir; + } + + if (array_key_exists($sMenuId, $this->aParentModuleRootDirs)){ + $this->aParentMenuNodes[$sMenuId] = $oMenuNode; + } + } + + // Note: the order matters: the parents must be defined BEFORE + $aMenusToLoad[] = $sMenuId; + } + + $this->aMenusToLoadByModule[$sModuleName] = array_unique($aMenusToLoad); + $this->aParentMenusByModule[$sModuleName] = array_unique($aParentMenus); + } + } + } + + /** + * Perform the actual "Compilation" for one module at a time + * @param \MFModule $oModule + * @param string $sTempTargetDir + * @param string $sFinalTargetDir + * @param string $sRelativeDir + * @param Page $oP + * + * @return void + * @throws \Exception + */ + public function CompileModuleMenus(MFModule $oModule, $sTempTargetDir, $sFinalTargetDir, $sRelativeDir, $oP = null) : void + { + $this->aMenuLinesForAdmins = []; + $this->aMenuLinesForAll = []; + $aAdminMenus = []; + + $sModuleRootDir = $oModule->GetRootDir(); + $sModuleName = $oModule->GetName(); + + $aParentMenus = $this->aParentMenusByModule[$sModuleName]; + foreach($this->aMenusToLoadByModule[$sModuleName] as $sMenuId) + { + $oMenuNode = $this->aMenuNodes[$sMenuId]; + if (is_null($oMenuNode)) + { + throw new Exception("Module '{$oModule->GetId()}' (location : '$sModuleRootDir') contains an unknown menuId : '$sMenuId'"); + } + + if (self::$bUseLegacyMenuCompilation) { + if ($oMenuNode->getAttribute("xsi:type") == 'MenuGroup') { + // Note: this algorithm is wrong + // 1 - the module may appear empty in the current module, while children are defined in other modules + // 2 - check recursively that child nodes are not empty themselves + // Future algorithm: + // a- browse the modules and build the menu tree + // b- browse the tree and blacklist empty menus + // c- before compiling, discard if blacklisted + if (! in_array($oMenuNode->getAttribute("id"), $aParentMenus)) { + // Discard empty menu groups + continue; + } + } + } else { + if (array_key_exists($sMenuId, $this->aParentMenuNodes)) { + // compile parent menus recursively + $this->CompileParentMenuNode($sMenuId, $sTempTargetDir, $sFinalTargetDir, $sRelativeDir, $oP); + continue; + } + } + + try + { + //both new/legacy algo: compile leaf menu + $aMenuLines = $this->oMFCompiler->CompileMenu($oMenuNode, $sTempTargetDir, $sFinalTargetDir, $sRelativeDir, $oP); + } + catch (DOMFormatException $e) + { + throw new Exception("Failed to process menu '$sMenuId', from '$sModuleRootDir': ".$e->getMessage()); + } + + $sParent = $oMenuNode->GetChildText('parent', null); + if (($oMenuNode->GetChildText('enable_admin_only') == '1') || isset($aAdminMenus[$sParent]) || isset($this->aParentAdminMenus[$sParent])) + { + $this->aMenuLinesForAdmins = array_merge($this->aMenuLinesForAdmins, $aMenuLines); + $aAdminMenus[$oMenuNode->getAttribute("id")] = true; + } + else + { + $this->aMenuLinesForAll = array_merge($this->aMenuLinesForAll, $aMenuLines); + } + } + } + + /** + * Perform parent menu compilation including its ancestrors (recursively) + * @param string $sMenuId + * @param string $sTempTargetDir + * @param string $sFinalTargetDir + * @param string $sRelativeDir + * @param Page $oP + * + * @return void + * @throws \Exception + */ + public function CompileParentMenuNode(string $sMenuId, $sTempTargetDir, $sFinalTargetDir, $sRelativeDir, $oP = null) : void + { + $oMenuNode = $this->aParentMenuNodes[$sMenuId]; + $sStatus = array_key_exists($sMenuId, $this->aMenuProcessStatus) ? $this->aMenuProcessStatus[$sMenuId] : null; + if ($sStatus === self::COMPILED){ + //node already processed before + return; + } else if ($sStatus === self::COMPILING){ + throw new \Exception("Cyclic dependency between parent menus ($sMenuId)"); + } + + $this->aMenuProcessStatus[$sMenuId] = self::COMPILING; + + try { + $sParent = $oMenuNode->GetChildText('parent', null); + if (! empty($sParent)){ + //compile parents before (even parent of parents ... recursively) + $this->CompileParentMenuNode($sParent, $sTempTargetDir, $sFinalTargetDir, $sRelativeDir, $oP); + } + + if (! array_key_exists($sMenuId, $this->aParentModuleRootDirs)){ + throw new Exception("Failed to process parent menu '$sMenuId' that is referenced by a child but not defined"); + } + $sModuleRootDir = $this->aParentModuleRootDirs[$sMenuId]; + $aMenuLines = $this->oMFCompiler->CompileMenu($oMenuNode, $sTempTargetDir, $sFinalTargetDir, $sRelativeDir, $oP); + } catch (DOMFormatException $e) { + throw new Exception("Failed to process menu '$sMenuId', from '$sModuleRootDir': ".$e->getMessage()); + } + $sParent = $oMenuNode->GetChildText('parent', null); + if (($oMenuNode->GetChildText('enable_admin_only') == '1') || isset($this->aParentAdminMenus[$sParent])) { + $this->aMenuLinesForAdmins = array_merge($this->aMenuLinesForAdmins, $aMenuLines); + $this->aParentAdminMenus[$oMenuNode->getAttribute("id")] = true; + } else { + $this->aMenuLinesForAll = array_merge($this->aMenuLinesForAll, $aMenuLines); + } + + $this->aMenuProcessStatus[$sMenuId] = self::COMPILED; + } + + public function GetMenusByModule(string $sModuleName) : ?array + { + if (array_key_exists($sModuleName, $this->aMenusByModule)) { + return $this->aMenusByModule[$sModuleName]; + } + + return null; + } + + public function GetMenuLinesForAdmins(): array { + return $this->aMenuLinesForAdmins; + } + + public function GetMenuLinesForAll(): array { + return $this->aMenuLinesForAll; + } +} diff --git a/test/setup/MFCompilerMenuTest.php b/test/setup/MFCompilerMenuTest.php index 6926e159dc..a59bda1951 100644 --- a/test/setup/MFCompilerMenuTest.php +++ b/test/setup/MFCompilerMenuTest.php @@ -7,6 +7,7 @@ use Combodo\iTop\Test\UnitTest\ItopTestCase; use Config; use MetaModel; use MFCompiler; +use ParentMenuNodeCompiler; use RunTimeEnvironment; /** @@ -14,8 +15,8 @@ use RunTimeEnvironment; * @runTestsInSeparateProcesses * @preserveGlobalState disabled * @backupGlobals disabled - * @since 3.0.x N°4762 - * @covers \MFCompiler::UseLatestPrecompiledFile + * @since 3.1 N°4762 + * @covers \MFCompiler::DoCompile */ class MFCompilerMenuTest extends ItopTestCase { private static $aPreviousEnvMenus; @@ -23,22 +24,26 @@ class MFCompilerMenuTest extends ItopTestCase { public function setUp(): void { parent::setUp(); - require_once(APPROOT.'setup/compiler.class.inc.php'); - require_once(APPROOT.'setup/modelfactory.class.inc.php'); - require_once(APPROOT.'application/utils.inc.php'); - + $this->RequireOnceItopFile('setup/compiler.class.inc.php'); + $this->RequireOnceItopFile('setup/modelfactory.class.inc.php'); + $this->RequireOnceItopFile('application/utils.inc.php'); } public function tearDown(): void { parent::tearDown(); } + private function GetCurrentEnvDeltaXmlPath(string $sEnv) : string { + return APPROOT."data/$sEnv.delta.xml"; + } + public function CompileMenusProvider(){ return [ 'legacy_algo' => [ 'sEnv' => 'legacy_algo', 'bLegacyMenuCompilation' => true ], 'menu_compilation_fix' => [ 'sEnv' => 'menu_compilation_fix', 'bLegacyMenuCompilation' => false ], ]; } + /** * @dataProvider CompileMenusProvider */ @@ -55,7 +60,7 @@ class MFCompilerMenuTest extends ItopTestCase { $oConfig = new Config($sConfigFilePath); if ($bLegacyMenuCompilation){ - MFCompiler::UseLegacyMenuCompilation(); + ParentMenuNodeCompiler::UseLegacyMenuCompilation(); } $oConfig->WriteToFile(); $oRunTimeEnvironment = new RunTimeEnvironment($sEnv); @@ -82,4 +87,53 @@ class MFCompilerMenuTest extends ItopTestCase { } static::$aPreviousEnvMenuCount = $aMenuCount; } + + public function CompileMenusWithDeltaProvider(){ + return [ + 'Menus are broken with specific delta XML using LEGACY algo' => [ 'sDeltaFile' => 'delta_broken_menus.xml', 'sEnv' => 'broken_menus', 'bLegacyMenuCompilation' => true ], + 'Menus repaired using same delta XML with NEW algo' => [ 'sDeltaFile' => 'delta_broken_menus.xml', 'sEnv' => 'fixed_menus', 'bLegacyMenuCompilation' => false ], + ]; + } + + /** + * @dataProvider CompileMenusWithDeltaProvider + */ + public function testCompileMenusWithDelta($sDeltaFile, $sEnv, $bLegacyMenuCompilation){ + $sProvidedDeltaPath = __DIR__.'/ressources/datamodels/'.$sDeltaFile; + if (is_file($sProvidedDeltaPath)){ + $sDeltaXmlPath = $this->GetCurrentEnvDeltaXmlPath($sEnv); + copy($sProvidedDeltaPath, $sDeltaXmlPath); + } + $sConfigFilePath = \utils::GetConfigFilePath($sEnv); + + //copy conf from production to phpunit context + $sDirPath = dirname($sConfigFilePath); + if (! is_dir($sDirPath)){ + mkdir($sDirPath); + } + $oConfig = new Config(\utils::GetConfigFilePath()); + $oConfig->WriteToFile($sConfigFilePath); + + $oConfig = new Config($sConfigFilePath); + if ($bLegacyMenuCompilation){ + ParentMenuNodeCompiler::UseLegacyMenuCompilation(); + } + $oConfig->WriteToFile(); + $oRunTimeEnvironment = new RunTimeEnvironment($sEnv); + $oRunTimeEnvironment->CompileFrom(\utils::GetCurrentEnvironment()); + $oConfig->WriteToFile(); + + if ($bLegacyMenuCompilation){ + /** + * PHP Notice: Undefined index: ConfigManagement in /var/www/html/iTop/env-broken_menus/itop-structure/model.itop-structure.php on line 925 + */ + error_reporting(E_ALL & ~E_NOTICE); + $this->expectErrorMessage("Call to a member function GetIndex() on null"); + } + $sConfigFile = APPCONF.\utils::GetCurrentEnvironment().'/'.ITOP_CONFIG_FILE; + MetaModel::Startup($sConfigFile, false /* $bModelOnly */, true /* $bAllowCache */, false /* $bTraceSourceFiles */, $sEnv); + + $this->assertNotEquals([], ApplicationMenu::GetMenuGroups()); + $this->assertNotEquals([], ApplicationMenu::GetMenusCount()); + } } diff --git a/tests/php-unit-tests/unitary-tests/setup/ressources/datamodels/delta_broken_menus.xml b/tests/php-unit-tests/unitary-tests/setup/ressources/datamodels/delta_broken_menus.xml new file mode 100644 index 0000000000..73bbd57377 --- /dev/null +++ b/tests/php-unit-tests/unitary-tests/setup/ressources/datamodels/delta_broken_menus.xml @@ -0,0 +1,14 @@ + + + + + ConfigManagementOverview + + + ConfigManagementOverview + + + ConfigManagementOverview + + + From 7b0a569c6402aa6ce7bd6a830c09ff475aa7e433 Mon Sep 17 00:00:00 2001 From: odain Date: Tue, 7 Mar 2023 14:07:17 +0100 Subject: [PATCH 31/44] =?UTF-8?q?N=C2=B04762=20-=20menu=20compilation:=20f?= =?UTF-8?q?ix=20ci=20(merge=20issue)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- test/setup/MFCompilerMenuTest.php | 6 +++--- .../setup/ressources/datamodels/delta_broken_menus.xml | 0 2 files changed, 3 insertions(+), 3 deletions(-) rename {tests/php-unit-tests/unitary-tests => test}/setup/ressources/datamodels/delta_broken_menus.xml (100%) diff --git a/test/setup/MFCompilerMenuTest.php b/test/setup/MFCompilerMenuTest.php index a59bda1951..ef71e8e6f1 100644 --- a/test/setup/MFCompilerMenuTest.php +++ b/test/setup/MFCompilerMenuTest.php @@ -24,9 +24,9 @@ class MFCompilerMenuTest extends ItopTestCase { public function setUp(): void { parent::setUp(); - $this->RequireOnceItopFile('setup/compiler.class.inc.php'); - $this->RequireOnceItopFile('setup/modelfactory.class.inc.php'); - $this->RequireOnceItopFile('application/utils.inc.php'); + require_once APPROOT . 'setup/compiler.class.inc.php'; + require_once APPROOT . 'setup/modelfactory.class.inc.php'; + require_once APPROOT . 'application/utils.inc.php'; } public function tearDown(): void { diff --git a/tests/php-unit-tests/unitary-tests/setup/ressources/datamodels/delta_broken_menus.xml b/test/setup/ressources/datamodels/delta_broken_menus.xml similarity index 100% rename from tests/php-unit-tests/unitary-tests/setup/ressources/datamodels/delta_broken_menus.xml rename to test/setup/ressources/datamodels/delta_broken_menus.xml From 251fd3c67bfed5da85ad3d65dd8a76f997bb8e24 Mon Sep 17 00:00:00 2001 From: "denis.flaven@combodo.com" Date: Tue, 28 Mar 2023 14:44:10 +0200 Subject: [PATCH 32/44] =?UTF-8?q?N=C2=B06132=20-=20disable=20tabs=20dynami?= =?UTF-8?q?cally?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- js/layouts/tab-container/regular-tabs.js | 14 ++++++++++-- js/layouts/tab-container/scrollable-tabs.js | 13 ++++++++++- js/layouts/tab-container/tab-container.js | 25 ++++++++++++++++++--- 3 files changed, 46 insertions(+), 6 deletions(-) diff --git a/js/layouts/tab-container/regular-tabs.js b/js/layouts/tab-container/regular-tabs.js index fc2b509bce..fc5cc5f7c8 100644 --- a/js/layouts/tab-container/regular-tabs.js +++ b/js/layouts/tab-container/regular-tabs.js @@ -124,5 +124,15 @@ $.widget( "itop.regulartabs", $.ui.tabs, { this._off( prevPanels.not( this.panels ) ); } }, - -}); \ No newline at end of file + // JQuery UI overload + disable: function(index){ + let panel = this._getPanelForTab( index ); + panel.css({display: 'none'}); + this._super( index ); + }, + enable: function(index) { + let panel = this._getPanelForTab( index ); + panel.css({display: 'block'}); + this._super( index ); + }, +}); diff --git a/js/layouts/tab-container/scrollable-tabs.js b/js/layouts/tab-container/scrollable-tabs.js index 3b9c1d2e17..c529897e23 100644 --- a/js/layouts/tab-container/scrollable-tabs.js +++ b/js/layouts/tab-container/scrollable-tabs.js @@ -377,4 +377,15 @@ $.widget( "itop.scrollabletabs", $.ui.tabs, { setTab : function(tab){ this.active = tab; }, -}); \ No newline at end of file + // JQuery UI overload + disable: function(index){ + let panel = this._getPanelForTab( this.tabs[index] ); + panel.css({display: 'none'}); + this._super( index ); + }, + enable: function(index) { + let panel = this._getPanelForTab( this.tabs[index] ); + panel.css({display: 'block'}); + this._super( index ); + }, +}); diff --git a/js/layouts/tab-container/tab-container.js b/js/layouts/tab-container/tab-container.js index 7040529ac2..451881d813 100644 --- a/js/layouts/tab-container/tab-container.js +++ b/js/layouts/tab-container/tab-container.js @@ -297,6 +297,10 @@ $(function() const sTabId = oTabHeaderElem.attr('data-tab-id'); const oMatchingExtraTabElem = this.element.find(this.js_selectors.extra_tab_toggler+'[href="#'+sTabId+'"]'); + // Disabled tabs are never added to the ExtraTabs list + if (oTabHeaderElem.attr('aria-disabled') == 'true') { + bIsVisible = true; + } // Manually check if the tab header is visible if the info isn't passed if (bIsVisible === null) { bIsVisible = CombodoGlobalToolbox.IsElementVisibleToTheUser(oTabHeaderElem[0], true, 2); @@ -326,7 +330,7 @@ $(function() * @return {string} The [data-tab-id] of the iIdx-th tab (zero based). Can return undefined if it has not [data-tab-id] attribute * @private */ - _getTabIdFromTabIndex(iIdx) { + _getTabIdFromTabIndex: function(iIdx) { return this.element.children(this.js_selectors.tabs_list).children(this.js_selectors.tab_header).eq(iIdx).attr('data-tab-id'); }, /** @@ -334,10 +338,25 @@ $(function() * @return {number} The index (zero based) of the tab. If no matching tab, 0 will be returned. * @private */ - _getTabIndexFromTabId(sId) { + _getTabIndexFromTabId: function(sId) { const oTabElem = this.element.children(this.js_selectors.tabs_list).children(this.js_selectors.tab_header+'[data-tab-id="'+sId+'"]'); return oTabElem.length === 0 ? 0 : oTabElem.prevAll().length; - } + }, + _getTabElementFromTabIndex: function(iIdx) { + return this.element.children(this.js_selectors.tabs_list).children(this.js_selectors.tab_header).eq(iIdx); + }, + disableTab: function(iIdx){ + let tabsWidget = this.GetTabsWidget(); + tabsWidget.disable(iIdx); + let tabElement = this._getTabElementFromTabIndex(iIdx); + this._updateTabHeaderDisplay(tabElement); + }, + enableTab: function(iIdx){ + let tabsWidget = this.GetTabsWidget(); + tabsWidget.enable(iIdx); + let tabElement = this._getTabElementFromTabIndex(iIdx); + this._updateTabHeaderDisplay(tabElement); + } }); }); From e87f5af465d87ae0ada07fcb55e0d2fd96dd746c Mon Sep 17 00:00:00 2001 From: Denis Date: Thu, 30 Mar 2023 13:25:55 +0200 Subject: [PATCH 33/44] Apply suggestions from code review JS cleanup after review Co-authored-by: Molkobain --- js/layouts/tab-container/regular-tabs.js | 9 +++++---- js/layouts/tab-container/scrollable-tabs.js | 5 +++-- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/js/layouts/tab-container/regular-tabs.js b/js/layouts/tab-container/regular-tabs.js index fc5cc5f7c8..24b92cd12f 100644 --- a/js/layouts/tab-container/regular-tabs.js +++ b/js/layouts/tab-container/regular-tabs.js @@ -126,13 +126,14 @@ $.widget( "itop.regulartabs", $.ui.tabs, { }, // JQuery UI overload disable: function(index){ - let panel = this._getPanelForTab( index ); - panel.css({display: 'none'}); + const panel = this._getPanelForTab( index ); + panel.hide(); this._super( index ); }, + // JQuery UI overload enable: function(index) { - let panel = this._getPanelForTab( index ); - panel.css({display: 'block'}); + const panel = this._getPanelForTab( index ); + panel.show(); this._super( index ); }, }); diff --git a/js/layouts/tab-container/scrollable-tabs.js b/js/layouts/tab-container/scrollable-tabs.js index c529897e23..91b679e2c5 100644 --- a/js/layouts/tab-container/scrollable-tabs.js +++ b/js/layouts/tab-container/scrollable-tabs.js @@ -379,12 +379,13 @@ $.widget( "itop.scrollabletabs", $.ui.tabs, { }, // JQuery UI overload disable: function(index){ - let panel = this._getPanelForTab( this.tabs[index] ); + const panel = this._getPanelForTab( this.tabs[index] ); panel.css({display: 'none'}); this._super( index ); }, + // JQuery UI overload enable: function(index) { - let panel = this._getPanelForTab( this.tabs[index] ); + const panel = this._getPanelForTab( this.tabs[index] ); panel.css({display: 'block'}); this._super( index ); }, From b9a00b15f5f83599e70d3e951a93fb4b3b2cb0f6 Mon Sep 17 00:00:00 2001 From: "denis.flaven@combodo.com" Date: Thu, 30 Mar 2023 14:16:26 +0200 Subject: [PATCH 34/44] Disable tabs by ID instead of index Disabled tabs are visible (with a 'not-allowed' cursor) instead of being hidden from the extra tabs menu. --- css/backoffice/utils/helpers/_misc.scss | 4 ++ js/layouts/tab-container/tab-container.js | 53 +++++++++++++++-------- 2 files changed, 39 insertions(+), 18 deletions(-) diff --git a/css/backoffice/utils/helpers/_misc.scss b/css/backoffice/utils/helpers/_misc.scss index 845208ba1e..93ee5dc8ed 100644 --- a/css/backoffice/utils/helpers/_misc.scss +++ b/css/backoffice/utils/helpers/_misc.scss @@ -35,6 +35,10 @@ $ibo-sticky-sentinel-bottom--height: $ibo-sticky-sentinel--height !default; opacity: 1 !important; /* Note: !important is necessary as it needs to overload any standard rules */ } +.ibo-is-disabled { + cursor: not-allowed !important; /* Note: !important is necessary as it needs to overload any standard rules */ +} + /****************************/ /* Disposition / alignement */ /****************************/ diff --git a/js/layouts/tab-container/tab-container.js b/js/layouts/tab-container/tab-container.js index 451881d813..ff5b0746b4 100644 --- a/js/layouts/tab-container/tab-container.js +++ b/js/layouts/tab-container/tab-container.js @@ -15,6 +15,7 @@ $(function() css_classes: { is_hidden: 'ibo-is-hidden', + is_disabled: 'ibo-is-disabled', is_transparent: 'ibo-is-transparent', is_opaque: 'ibo-is-opaque', is_scrollable: 'ibo-is-scrollable', @@ -252,6 +253,11 @@ $(function() // Prevent anchor default behaviour oEvent.preventDefault(); + if (oExtraTabTogglerElem.attr('aria-disabled') === true) { + // Corresponding tab is disabled, do nothing + oEvent.preventStopPropagation(); + return; + } // Trigger click event on real tab toggler (the hidden one) const sTargetTabId = oExtraTabTogglerElem.attr('href').replace(/#/, ''); this.element.find(this.js_selectors.tab_header+'[data-tab-id="'+sTargetTabId+'"] '+this.js_selectors.tab_toggler).trigger('click'); @@ -297,21 +303,30 @@ $(function() const sTabId = oTabHeaderElem.attr('data-tab-id'); const oMatchingExtraTabElem = this.element.find(this.js_selectors.extra_tab_toggler+'[href="#'+sTabId+'"]'); - // Disabled tabs are never added to the ExtraTabs list + // Disabled tabs should be disabled in the ExtraTabs list as well + let bIsDisabled = false; if (oTabHeaderElem.attr('aria-disabled') == 'true') { - bIsVisible = true; + bIsDisabled = true; } // Manually check if the tab header is visible if the info isn't passed if (bIsVisible === null) { - bIsVisible = CombodoGlobalToolbox.IsElementVisibleToTheUser(oTabHeaderElem[0], true, 2); - } + bIsVisible = CombodoGlobalToolbox.IsElementVisibleToTheUser(oTabHeaderElem[0], true, 2); + } // Hide/show the corresponding extra tab element - if (bIsVisible) { - oMatchingExtraTabElem.addClass(this.css_classes.is_hidden); - } else { - oMatchingExtraTabElem.removeClass(this.css_classes.is_hidden); - } + if (bIsVisible) { + oMatchingExtraTabElem.addClass(this.css_classes.is_hidden); + } else { + oMatchingExtraTabElem.removeClass(this.css_classes.is_hidden); + } + // Enable/disable the corresponding extra tab element + if (bIsDisabled) { + oMatchingExtraTabElem.attr('aria-disabled', 'true'); + oMatchingExtraTabElem.addClass(this.css_classes.is_disabled); + } else { + oMatchingExtraTabElem.attr('aria-disabled', 'false'); + oMatchingExtraTabElem.removeClass(this.css_classes.is_disabled); + } }, // - Update extra tabs list _updateExtraTabsList: function () { @@ -343,19 +358,21 @@ $(function() return oTabElem.length === 0 ? 0 : oTabElem.prevAll().length; }, - _getTabElementFromTabIndex: function(iIdx) { - return this.element.children(this.js_selectors.tabs_list).children(this.js_selectors.tab_header).eq(iIdx); + _getTabElementFromTabId: function(sId) { + return this.element.children(this.js_selectors.tabs_list).children(this.js_selectors.tab_header+'[data-tab-id="'+sId+'"]'); }, - disableTab: function(iIdx){ - let tabsWidget = this.GetTabsWidget(); + disableTab: function(sId){ + const tabsWidget = this.GetTabsWidget(); + const iIdx = this._getTabIndexFromTabId(sId); tabsWidget.disable(iIdx); - let tabElement = this._getTabElementFromTabIndex(iIdx); - this._updateTabHeaderDisplay(tabElement); + const tabElement = this._getTabElementFromTabId(sId); + this._updateTabHeaderDisplay(tabElement); }, - enableTab: function(iIdx){ - let tabsWidget = this.GetTabsWidget(); + enableTab: function(sId){ + const tabsWidget = this.GetTabsWidget(); + const iIdx = this._getTabIndexFromTabId(sId); tabsWidget.enable(iIdx); - let tabElement = this._getTabElementFromTabIndex(iIdx); + const tabElement = this._getTabElementFromTabId(sId); this._updateTabHeaderDisplay(tabElement); } }); From 94ea8e60e852d0ce1d8385cf03c9d2a031fdfe62 Mon Sep 17 00:00:00 2001 From: "denis.flaven@combodo.com" Date: Thu, 30 Mar 2023 14:29:29 +0200 Subject: [PATCH 35/44] Typo! --- js/layouts/tab-container/tab-container.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/js/layouts/tab-container/tab-container.js b/js/layouts/tab-container/tab-container.js index ff5b0746b4..73b687e384 100644 --- a/js/layouts/tab-container/tab-container.js +++ b/js/layouts/tab-container/tab-container.js @@ -253,9 +253,9 @@ $(function() // Prevent anchor default behaviour oEvent.preventDefault(); - if (oExtraTabTogglerElem.attr('aria-disabled') === true) { + if (oExtraTabTogglerElem.attr('aria-disabled') === 'true') { // Corresponding tab is disabled, do nothing - oEvent.preventStopPropagation(); + oEvent.stopPropagation(); return; } // Trigger click event on real tab toggler (the hidden one) From 477f2f51e9045d4eb8365c0b2fb7b6e775ae9539 Mon Sep 17 00:00:00 2001 From: Molkobain Date: Thu, 30 Mar 2023 16:50:08 +0200 Subject: [PATCH 36/44] Update code to match conventions --- js/layouts/tab-container/scrollable-tabs.js | 4 ++-- js/layouts/tab-container/tab-container.js | 16 +++++++++++++++- 2 files changed, 17 insertions(+), 3 deletions(-) diff --git a/js/layouts/tab-container/scrollable-tabs.js b/js/layouts/tab-container/scrollable-tabs.js index 91b679e2c5..9ffaec8a03 100644 --- a/js/layouts/tab-container/scrollable-tabs.js +++ b/js/layouts/tab-container/scrollable-tabs.js @@ -380,13 +380,13 @@ $.widget( "itop.scrollabletabs", $.ui.tabs, { // JQuery UI overload disable: function(index){ const panel = this._getPanelForTab( this.tabs[index] ); - panel.css({display: 'none'}); + panel.hide(); this._super( index ); }, // JQuery UI overload enable: function(index) { const panel = this._getPanelForTab( this.tabs[index] ); - panel.css({display: 'block'}); + panel.show(); this._super( index ); }, }); diff --git a/js/layouts/tab-container/tab-container.js b/js/layouts/tab-container/tab-container.js index 73b687e384..a3ba68bbd5 100644 --- a/js/layouts/tab-container/tab-container.js +++ b/js/layouts/tab-container/tab-container.js @@ -305,7 +305,7 @@ $(function() // Disabled tabs should be disabled in the ExtraTabs list as well let bIsDisabled = false; - if (oTabHeaderElem.attr('aria-disabled') == 'true') { + if (oTabHeaderElem.attr('aria-disabled') === 'true') { bIsDisabled = true; } // Manually check if the tab header is visible if the info isn't passed @@ -358,9 +358,19 @@ $(function() return oTabElem.length === 0 ? 0 : oTabElem.prevAll().length; }, + /** + * @param sId {string} The [data-tab-id] of the tab + * @return {Object} The jQuery object representing the tab element + * + * @private + */ _getTabElementFromTabId: function(sId) { return this.element.children(this.js_selectors.tabs_list).children(this.js_selectors.tab_header+'[data-tab-id="'+sId+'"]'); }, + /** + * @param sId {string} The [data-tab-id] of the tab + * @return {Object} The jQuery object representing the tab element + */ disableTab: function(sId){ const tabsWidget = this.GetTabsWidget(); const iIdx = this._getTabIndexFromTabId(sId); @@ -368,6 +378,10 @@ $(function() const tabElement = this._getTabElementFromTabId(sId); this._updateTabHeaderDisplay(tabElement); }, + /** + * @param sId {string} The [data-tab-id] of the tab + * @return {Object} The jQuery object representing the tab element + */ enableTab: function(sId){ const tabsWidget = this.GetTabsWidget(); const iIdx = this._getTabIndexFromTabId(sId); From 6c2db1e687a4cfe51be661904e02d6641f56e59c Mon Sep 17 00:00:00 2001 From: "denis.flaven@combodo.com" Date: Mon, 3 Apr 2023 13:45:32 +0200 Subject: [PATCH 37/44] Fixed tab activation afeter re-enabling. --- js/layouts/tab-container/regular-tabs.js | 4 ++-- js/layouts/tab-container/scrollable-tabs.js | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/js/layouts/tab-container/regular-tabs.js b/js/layouts/tab-container/regular-tabs.js index 24b92cd12f..bafbf85e87 100644 --- a/js/layouts/tab-container/regular-tabs.js +++ b/js/layouts/tab-container/regular-tabs.js @@ -127,13 +127,13 @@ $.widget( "itop.regulartabs", $.ui.tabs, { // JQuery UI overload disable: function(index){ const panel = this._getPanelForTab( index ); - panel.hide(); + panel.addClass('ibo-is-hidden'); // Do not use .hide() since it alters the tab state this._super( index ); }, // JQuery UI overload enable: function(index) { const panel = this._getPanelForTab( index ); - panel.show(); + panel.removeClass('ibo-is-hidden'); // Do not use .show() since it alters the tab state this._super( index ); }, }); diff --git a/js/layouts/tab-container/scrollable-tabs.js b/js/layouts/tab-container/scrollable-tabs.js index 9ffaec8a03..9a088db095 100644 --- a/js/layouts/tab-container/scrollable-tabs.js +++ b/js/layouts/tab-container/scrollable-tabs.js @@ -380,13 +380,13 @@ $.widget( "itop.scrollabletabs", $.ui.tabs, { // JQuery UI overload disable: function(index){ const panel = this._getPanelForTab( this.tabs[index] ); - panel.hide(); + panel.addClass('ibo-is-hidden'); // Do not use .hide() since it alters the tab state this._super( index ); }, // JQuery UI overload enable: function(index) { const panel = this._getPanelForTab( this.tabs[index] ); - panel.show(); + panel.removeClass('ibo-is-hidden'); // Do not use .show() since it alters the tab state this._super( index ); }, }); From ddc9952ec1e83d6d1527861fa7973fb08de91010 Mon Sep 17 00:00:00 2001 From: jf-cbd Date: Wed, 12 Apr 2023 14:25:06 +0200 Subject: [PATCH 38/44] =?UTF-8?q?=20N=C2=B06179=20-=20Tooltip=20attribute?= =?UTF-8?q?=20in=20field=20component=20(in=20Twig)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../UI/Base/Component/Field/Field.php | 26 +++++++++++++++++++ .../Component/Field/FieldUIBlockFactory.php | 9 ++++--- .../base/components/field/layout.html.twig | 3 +++ 3 files changed, 35 insertions(+), 3 deletions(-) diff --git a/sources/application/UI/Base/Component/Field/Field.php b/sources/application/UI/Base/Component/Field/Field.php index 73a1ff6536..d763826511 100644 --- a/sources/application/UI/Base/Component/Field/Field.php +++ b/sources/application/UI/Base/Component/Field/Field.php @@ -46,6 +46,8 @@ class Field extends UIContentBlock /** @var string */ protected $sLabel; /** @var string */ + protected $sTooltip = ''; + /** @var string */ protected $sValueId; /** @var string */ @@ -354,4 +356,28 @@ class Field extends UIContentBlock return $this; } + + /** + * @return string + */ + public function GetTooltip(): string + { + return $this->sTooltip; + } + + /** + * @param string $sTooltip + * + * @return $this + */ + public function SetTooltip(string $sTooltip) + { + $this->sTooltip = $sTooltip; + return $this; + } + + public function HasTooltip() : bool + { + return $this->GetTooltip() !== ''; + } } \ No newline at end of file diff --git a/sources/application/UI/Base/Component/Field/FieldUIBlockFactory.php b/sources/application/UI/Base/Component/Field/FieldUIBlockFactory.php index d45703168d..052ceb4aeb 100644 --- a/sources/application/UI/Base/Component/Field/FieldUIBlockFactory.php +++ b/sources/application/UI/Base/Component/Field/FieldUIBlockFactory.php @@ -86,23 +86,26 @@ class FieldUIBlockFactory extends AbstractUIBlockFactory return $oField; } - public static function MakeLarge(string $sLabel, string $sValueHtml = '') + public static function MakeLarge(string $sLabel, string $sValueHtml = '', string $sTooltip = '') { $oField = new Field($sLabel, new Html($sValueHtml)); + $oField->SetTooltip($sTooltip); $oField->SetLayout(Field::ENUM_FIELD_LAYOUT_LARGE); return $oField; } - public static function MakeSmall(string $sLabel, string $sValueHtml = '') + public static function MakeSmall(string $sLabel, string $sValueHtml = '', string $sTooltip = '') { $oField = new Field($sLabel, new Html($sValueHtml)); + $oField->SetTooltip($sTooltip); $oField->SetLayout(Field::ENUM_FIELD_LAYOUT_SMALL); return $oField; } - public static function MakeStandard(string $sLabel = '', string $sLayout = Field::ENUM_FIELD_LAYOUT_SMALL, ?string $sId = null) + public static function MakeStandard(string $sLabel = '', string $sLayout = Field::ENUM_FIELD_LAYOUT_SMALL, ?string $sId = null, string $sTooltip = '') { $oField = new Field($sLabel, null, $sId); + $oField->SetTooltip($sTooltip); $oField->SetLayout($sLayout); return $oField; diff --git a/templates/base/components/field/layout.html.twig b/templates/base/components/field/layout.html.twig index 0b09b8488a..4f582bfeb2 100644 --- a/templates/base/components/field/layout.html.twig +++ b/templates/base/components/field/layout.html.twig @@ -23,6 +23,9 @@ {% endif %} >
{{ oUIBlock.GetLabel()|raw }} + {% if oUIBlock.HasTooltip() %} + + {% endif %} {% if oUIBlock.GetLayout() == constant("Combodo\\iTop\\Application\\UI\\Base\\Component\\Field\\Field::ENUM_FIELD_LAYOUT_LARGE") %} {% if oUIBlock.GetComments() %}
{{ oUIBlock.GetComments()|raw }}
From 7cb6af0a2b9645dc5e16221ca90568e588408281 Mon Sep 17 00:00:00 2001 From: jf-cbd Date: Wed, 12 Apr 2023 14:25:06 +0200 Subject: [PATCH 39/44] fix for 6179 (with description instead of tooltip) PR fix --- .../Component/Field/FieldUIBlockFactory.php | 25 +++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/sources/application/UI/Base/Component/Field/FieldUIBlockFactory.php b/sources/application/UI/Base/Component/Field/FieldUIBlockFactory.php index 052ceb4aeb..2d64cc694a 100644 --- a/sources/application/UI/Base/Component/Field/FieldUIBlockFactory.php +++ b/sources/application/UI/Base/Component/Field/FieldUIBlockFactory.php @@ -86,6 +86,14 @@ class FieldUIBlockFactory extends AbstractUIBlockFactory return $oField; } + /** + * @api + * @param string $sLabel + * @param string $sValueHtml + * @param string $sTooltip + * + * @return \Combodo\iTop\Application\UI\Base\Component\Field\Field + */ public static function MakeLarge(string $sLabel, string $sValueHtml = '', string $sTooltip = '') { $oField = new Field($sLabel, new Html($sValueHtml)); @@ -94,6 +102,14 @@ class FieldUIBlockFactory extends AbstractUIBlockFactory return $oField; } + /** + * @api + * @param string $sLabel + * @param string $sValueHtml + * @param string $sTooltip + * + * @return \Combodo\iTop\Application\UI\Base\Component\Field\Field + */ public static function MakeSmall(string $sLabel, string $sValueHtml = '', string $sTooltip = '') { $oField = new Field($sLabel, new Html($sValueHtml)); @@ -102,6 +118,15 @@ class FieldUIBlockFactory extends AbstractUIBlockFactory return $oField; } + /** + * @api + * @param string $sLabel + * @param string $sLayout + * @param string|null $sId + * @param string $sTooltip + * + * @return \Combodo\iTop\Application\UI\Base\Component\Field\Field + */ public static function MakeStandard(string $sLabel = '', string $sLayout = Field::ENUM_FIELD_LAYOUT_SMALL, ?string $sId = null, string $sTooltip = '') { $oField = new Field($sLabel, null, $sId); From 6b448e29f550e8647c95829c685a2799ad48626a Mon Sep 17 00:00:00 2001 From: jf-cbd Date: Wed, 19 Apr 2023 10:17:37 +0200 Subject: [PATCH 40/44] PR fix --- .../UI/Base/Component/Field/Field.php | 28 +++++++++++++------ .../Component/Field/FieldUIBlockFactory.php | 18 ++++++------ .../base/components/field/layout.html.twig | 4 +-- 3 files changed, 30 insertions(+), 20 deletions(-) diff --git a/sources/application/UI/Base/Component/Field/Field.php b/sources/application/UI/Base/Component/Field/Field.php index d763826511..5ffac78685 100644 --- a/sources/application/UI/Base/Component/Field/Field.php +++ b/sources/application/UI/Base/Component/Field/Field.php @@ -9,6 +9,7 @@ namespace Combodo\iTop\Application\UI\Base\Component\Field; use Combodo\iTop\Application\UI\Base\Layout\UIContentBlock; use Combodo\iTop\Application\UI\Base\UIBlock; +use utils; /** * @since 3.0.0 @@ -45,8 +46,11 @@ class Field extends UIContentBlock protected $sValueRaw; /** @var string */ protected $sLabel; - /** @var string */ - protected $sTooltip = ''; + /** + * @var string + * @since 3.1.0 + */ + protected $sDescription = ''; /** @var string */ protected $sValueId; @@ -359,25 +363,31 @@ class Field extends UIContentBlock /** * @return string + * @since 3.1.0 */ - public function GetTooltip(): string + public function GetDescription(): string { - return $this->sTooltip; + return $this->sDescription; } /** - * @param string $sTooltip + * @param string $sDescription * * @return $this + * @since 3.1.0 */ - public function SetTooltip(string $sTooltip) + public function SetDescription(string $sDescription) { - $this->sTooltip = $sTooltip; + $this->sDescription = $sDescription; return $this; } - public function HasTooltip() : bool + /* + * @return bool + * @since 3.1.0 + */ + public function HasDescription(): bool { - return $this->GetTooltip() !== ''; + return utils::IsNotNullOrEmptyString($this->GetDescription()); } } \ No newline at end of file diff --git a/sources/application/UI/Base/Component/Field/FieldUIBlockFactory.php b/sources/application/UI/Base/Component/Field/FieldUIBlockFactory.php index 2d64cc694a..c2ee3fe7f9 100644 --- a/sources/application/UI/Base/Component/Field/FieldUIBlockFactory.php +++ b/sources/application/UI/Base/Component/Field/FieldUIBlockFactory.php @@ -90,14 +90,14 @@ class FieldUIBlockFactory extends AbstractUIBlockFactory * @api * @param string $sLabel * @param string $sValueHtml - * @param string $sTooltip + * @param string $sDescription * * @return \Combodo\iTop\Application\UI\Base\Component\Field\Field */ - public static function MakeLarge(string $sLabel, string $sValueHtml = '', string $sTooltip = '') + public static function MakeLarge(string $sLabel, string $sValueHtml = '', string $sDescription = '') { $oField = new Field($sLabel, new Html($sValueHtml)); - $oField->SetTooltip($sTooltip); + $oField->SetDescription($sDescription); $oField->SetLayout(Field::ENUM_FIELD_LAYOUT_LARGE); return $oField; } @@ -106,14 +106,14 @@ class FieldUIBlockFactory extends AbstractUIBlockFactory * @api * @param string $sLabel * @param string $sValueHtml - * @param string $sTooltip + * @param string $sDescription * * @return \Combodo\iTop\Application\UI\Base\Component\Field\Field */ - public static function MakeSmall(string $sLabel, string $sValueHtml = '', string $sTooltip = '') + public static function MakeSmall(string $sLabel, string $sValueHtml = '', string $sDescription = '') { $oField = new Field($sLabel, new Html($sValueHtml)); - $oField->SetTooltip($sTooltip); + $oField->SetDescription($sDescription); $oField->SetLayout(Field::ENUM_FIELD_LAYOUT_SMALL); return $oField; } @@ -123,14 +123,14 @@ class FieldUIBlockFactory extends AbstractUIBlockFactory * @param string $sLabel * @param string $sLayout * @param string|null $sId - * @param string $sTooltip + * @param string $sDescription * * @return \Combodo\iTop\Application\UI\Base\Component\Field\Field */ - public static function MakeStandard(string $sLabel = '', string $sLayout = Field::ENUM_FIELD_LAYOUT_SMALL, ?string $sId = null, string $sTooltip = '') + public static function MakeStandard(string $sLabel = '', string $sLayout = Field::ENUM_FIELD_LAYOUT_SMALL, ?string $sId = null, string $sDescription = '') { $oField = new Field($sLabel, null, $sId); - $oField->SetTooltip($sTooltip); + $oField->SetDescription($sDescription); $oField->SetLayout($sLayout); return $oField; diff --git a/templates/base/components/field/layout.html.twig b/templates/base/components/field/layout.html.twig index 4f582bfeb2..fb7a858f6d 100644 --- a/templates/base/components/field/layout.html.twig +++ b/templates/base/components/field/layout.html.twig @@ -23,8 +23,8 @@ {% endif %} >
{{ oUIBlock.GetLabel()|raw }} - {% if oUIBlock.HasTooltip() %} - + {% if oUIBlock.HasDescription() %} + {% endif %} {% if oUIBlock.GetLayout() == constant("Combodo\\iTop\\Application\\UI\\Base\\Component\\Field\\Field::ENUM_FIELD_LAYOUT_LARGE") %} {% if oUIBlock.GetComments() %} From 1b3b2e8a699243d1ff638809d6476b1007880655 Mon Sep 17 00:00:00 2001 From: odain Date: Thu, 4 May 2023 11:51:56 +0200 Subject: [PATCH 41/44] =?UTF-8?q?N=C2=B06171=20-=20Password=20Expiration:?= =?UTF-8?q?=20can=20expire=20mode=20has=20no=20effect=20on=20user=20who=20?= =?UTF-8?q?have=20never=20changed=20their=20password?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../2.x/authent-local/model.authent-local.php | 40 ++++-- test/coreExtensions/UserLocalTest.php | 114 ++++++++++++++++-- 2 files changed, 131 insertions(+), 23 deletions(-) diff --git a/datamodels/2.x/authent-local/model.authent-local.php b/datamodels/2.x/authent-local/model.authent-local.php index 86b30120ca..ef732e16d7 100755 --- a/datamodels/2.x/authent-local/model.authent-local.php +++ b/datamodels/2.x/authent-local/model.authent-local.php @@ -3,7 +3,7 @@ // // This file is part of iTop. // -// iTop is free software; you can redistribute it and/or modify +// 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. @@ -69,7 +69,7 @@ class UserLocal extends UserInternal const EXPIRE_NEVER = 'never_expire'; const EXPIRE_FORCE = 'force_expire'; const EXPIRE_ONE_TIME_PWD = 'otp_expire'; - + /** @var UserLocalPasswordValidity|null */ protected $m_oPasswordValidity = null; @@ -160,7 +160,7 @@ class UserLocal extends UserInternal /** * Use with care! - */ + */ public function SetPassword($sNewPassword) { $this->Set('password', $sNewPassword); @@ -197,19 +197,39 @@ class UserLocal extends UserInternal protected function OnWrite() { - if (empty($this->m_oPasswordValidity)) - { - return; - } - if (array_key_exists('password_renewed_date', $this->ListChanges())) { return; } + if (empty($this->m_oPasswordValidity)) + { + //password unchanged + if (is_null($this->Get('password_renewed_date'))) + { + //initialize password_renewed_date with User creation date + $sKey = $this->GetKey(); +$sOql = <<Fetch(); + if (! is_null($oCMDBChangeOpCreate)) + { + $oUserCreationDateTime = \DateTime::createFromFormat(AttributeDateTime::GetInternalFormat(), $oCMDBChangeOpCreate->Get('date')); + $sCreationDate = $oUserCreationDateTime->format(\AttributeDate::GetInternalFormat()); + $this->Set('password_renewed_date', $sCreationDate); + } + } + return; + } + $sNow = date(\AttributeDate::GetInternalFormat()); $this->Set('password_renewed_date', $sNow); - + // Reset the "force" expiration flag when the user updates her/his own password! if ($this->IsCurrentUser()) { @@ -294,7 +314,7 @@ class UserLocal extends UserInternal { $this->m_aCheckIssues[] = $this->m_oPasswordValidity->getPasswordValidityMessage(); } - + // A User cannot force a one-time password on herself/himself if ($this->IsCurrentUser()) { if (array_key_exists('expiration', $this->ListChanges()) && ($this->Get('expiration') == self::EXPIRE_ONE_TIME_PWD)) { diff --git a/test/coreExtensions/UserLocalTest.php b/test/coreExtensions/UserLocalTest.php index 65864b1370..f093c397dc 100644 --- a/test/coreExtensions/UserLocalTest.php +++ b/test/coreExtensions/UserLocalTest.php @@ -8,7 +8,13 @@ namespace coreExtensions; +use AttributeDate; use Combodo\iTop\Test\UnitTest\ItopDataTestCase; +use Config; +use Dict; +use MetaModel; +use ormLinkSet; +use URP_UserProfile; use UserLocal; /** @@ -34,23 +40,23 @@ class UserLocalTest extends ItopDataTestCase */ public function testValidatePassword($sPassword, $aValidatorNames, $aConfigValueMap, $bExpectedCheckStatus, $expectedCheckIssues = null, $sUserLanguage = null) { - $configMock = $this->createMock(\Config::class); + $configMock = $this->createMock(Config::class); $configMock ->method('GetModuleSetting') ->willReturnMap($aConfigValueMap); restore_error_handler(); if (isset($sUserLanguage)) { - \Dict::SetUserLanguage($sUserLanguage); + Dict::SetUserLanguage($sUserLanguage); } /** @var UserLocal $oUserLocal */ - $oUserLocal = \MetaModel::NewObject('UserLocal', array('login' => 'john')); - /** @var \ormLinkSet $oProfileSet */ + $oUserLocal = MetaModel::NewObject(UserLocal::class, array('login' => 'john')); + /** @var ormLinkSet $oProfileSet */ $oProfileSet = $oUserLocal->Get('profile_list'); $oProfileSet->AddItem( - \MetaModel::NewObject('URP_UserProfile', array('profileid' => 1)) + MetaModel::NewObject(URP_UserProfile::class, array('profileid' => 1)) ); $aValidatorCollection = array(); @@ -242,9 +248,10 @@ class UserLocalTest extends ItopDataTestCase */ public function testPasswordRenewal($sBefore, $sExpectedAfter) { - $oBefore = is_null($sBefore) ? null : date(\AttributeDate::GetInternalFormat(), strtotime($sBefore)); - $oNow = date(\AttributeDate::GetInternalFormat()); - $oExpectedAfter = is_null($sExpectedAfter) ? null : date(\AttributeDate::GetInternalFormat(), strtotime($sExpectedAfter)); + $sDateFormat = AttributeDate::GetInternalFormat(); + $oBefore = is_null($sBefore) ? null : date($sDateFormat, strtotime($sBefore)); + $oNow = date($sDateFormat); + $oExpectedAfter = is_null($sExpectedAfter) ? null : date($sDateFormat, strtotime($sExpectedAfter)); $aUserLocalValues = array('login' => 'john'); if (!is_null($oBefore)) @@ -253,15 +260,14 @@ class UserLocalTest extends ItopDataTestCase } /** @var UserLocal $oUserLocal */ - $oUserLocal = \MetaModel::NewObject('UserLocal', $aUserLocalValues); - /** @var \ormLinkSet $oProfileSet */ + $oUserLocal = MetaModel::NewObject(UserLocal::class, $aUserLocalValues); + /** @var ormLinkSet $oProfileSet */ $oProfileSet = $oUserLocal->Get('profile_list'); $oProfileSet->AddItem( - \MetaModel::NewObject('URP_UserProfile', array('profileid' => 1)) + MetaModel::NewObject(URP_UserProfile::class, array('profileid' => 1)) ); - $this->assertEquals($oBefore, $oUserLocal->Get('password_renewed_date')); //INSERT @@ -270,17 +276,19 @@ class UserLocalTest extends ItopDataTestCase $this->assertEquals($oNow, $oUserLocal->Get('password_renewed_date'), 'INSERT sets the "password_renewed_date" to the current date'); //UPDATE password_renewed_date + $oUserLocal = MetaModel::GetObject(UserLocal::class, $oUserLocal->GetKey()); $oUserLocal->Set('password_renewed_date', $oBefore); $oUserLocal->DBWrite(); $this->assertEquals($oBefore, $oUserLocal->Get('password_renewed_date'), 'UPDATE can target and change the "password_renewed_date"'); //UPDATE password + $oUserLocal = MetaModel::GetObject(UserLocal::class, $oUserLocal->GetKey()); $oUserLocal->Set('password', 'fooBar1???1'); $oUserLocal->DBWrite(); $this->assertEquals($oExpectedAfter, $oUserLocal->Get('password_renewed_date'), 'UPDATE "password" fields trigger automatic change of the "password_renewed_date" field'); - //UPDATE both password & password_renewed_date + $oUserLocal = MetaModel::GetObject(UserLocal::class, $oUserLocal->GetKey()); $oUserLocal->Set('password', 'fooBar1???2'); $oUserLocal->Set('password_renewed_date', $oBefore); $oUserLocal->DBWrite(); @@ -304,5 +312,85 @@ class UserLocalTest extends ItopDataTestCase ), ); } + + /** + * @dataProvider CanExpireFixProvider + * + */ + public function testCanExpireFix($sExpirationMode, $sBefore, bool $bRenewedDateTouched) + { + $oBefore = is_null($sBefore) ? null : date(AttributeDate::GetInternalFormat(), strtotime($sBefore)); + $oNow = date(AttributeDate::GetInternalFormat()); + $oExpectedAfter = $bRenewedDateTouched ? $oNow : $oBefore; + + $aUserLocalValues = array('login' => 'john'); + if (!is_null($oBefore)) + { + $aUserLocalValues['password_renewed_date'] = $oBefore; + } + + /** @var UserLocal $oUserLocal */ + $oUserLocal = MetaModel::NewObject(UserLocal::class, $aUserLocalValues); + /** @var ormLinkSet $oProfileSet */ + $oProfileSet = $oUserLocal->Get('profile_list'); + + $oProfileSet->AddItem( + MetaModel::NewObject(URP_UserProfile::class, array('profileid' => 1)) + ); + + $this->assertEquals($oBefore, $oUserLocal->Get('password_renewed_date')); + + //INSERT + $oUserLocal->Set('password', 'fooBar1???'); + $oUserLocal->DBWrite(); + $this->assertEquals($oNow, $oUserLocal->Get('password_renewed_date'), 'INSERT sets the "password_renewed_date" to the current date'); + + $oUserLocal = MetaModel::GetObject(UserLocal::class, $oUserLocal->GetKey()); + $oUserLocal->Set('password_renewed_date', $oBefore); + $oUserLocal->DBWrite(); + $this->assertEquals($oBefore, $oUserLocal->Get('password_renewed_date'), 'UPDATE can target and change the "password_renewed_date"'); + + //UPDATE password + $oUserLocal = MetaModel::GetObject(UserLocal::class, $oUserLocal->GetKey()); + $oUserLocal->Set('expiration', $sExpirationMode); + $oUserLocal->DBWrite(); + $this->assertEquals($oExpectedAfter, $oUserLocal->Get('password_renewed_date'), 'UPDATE "password" fields trigger automatic change of the "password_renewed_date" field'); + } + + public function CanExpireFixProvider() + { + return array( + 'EXPIRE_CAN: nominal case' => array( + 'sExpirationMode' => 'can_expire', + 'oExpectedBefore' => null, + 'bRenewedDateTouched' => true, + ), + 'EXPIRE_NEVER (default mode): nothing changed on UserLocal' => array( + 'sExpirationMode' => 'never_expire', + 'oExpectedBefore' => null, + 'bRenewedDateTouched' => false, + ), + 'EXPIRE_FORCE: nominal case' => array( + 'sExpirationMode' => 'force_expire', + 'oExpectedBefore' => null, + 'bRenewedDateTouched' => true, + ), + 'EXPIRE_ONE_TIME_PWD: nominal case' => array( + 'sExpirationMode' => 'otp_expire', + 'oExpectedBefore' => null, + 'bRenewedDateTouched' => true, + ), + 'date initiated' => array( + 'sExpirationMode' => 'can_expire', + 'oBefore' => '-1 day', + 'bRenewedDateTouched' => false, + ), + 'date initiated in the future' => array( + 'sExpirationMode' => 'can_expire', + 'oBefore' => '+1 day', + 'bRenewedDateTouched' => false, + ), + ); + } } From bd1e4389f74065b043d2b21a42b200f14ab8c0dd Mon Sep 17 00:00:00 2001 From: odain Date: Mon, 15 May 2023 16:57:30 +0200 Subject: [PATCH 42/44] =?UTF-8?q?N=C2=B06293=20-=20[ERGO]=20Symplify=20ava?= =?UTF-8?q?tar=20menu=20-=20first=20prototype=20to=20sort=20user=20menus?= =?UTF-8?q?=20after=20setup=20on=20page=20loading?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- core/config.class.inc.php | 8 ++ .../PopoverMenu/PopoverMenuFactory.php | 67 ++++++++++--- .../PopoverMenu/PopoverMenuFactoryTest.php | 96 +++++++++++++++++++ 3 files changed, 157 insertions(+), 14 deletions(-) create mode 100644 tests/php-unit-tests/unitary-tests/application/UI/Base/Component/PopoverMenu/PopoverMenuFactoryTest.php diff --git a/core/config.class.inc.php b/core/config.class.inc.php index de99120333..50a6a07987 100644 --- a/core/config.class.inc.php +++ b/core/config.class.inc.php @@ -1265,6 +1265,14 @@ class Config 'source_of_value' => '', 'show_in_conf_sample' => false, ], + 'navigation_menu.sorted_popup_user_menu_items' => [ + 'type' => 'array', + 'description' => 'Sort user menu items after setup on page load', + 'default' => [], + 'value' => false, + 'source_of_value' => '', + 'show_in_conf_sample' => false, + ], 'quick_create.enabled' => [ 'type' => 'bool', 'description' => 'Whether or not the quick create is enabled', diff --git a/sources/application/UI/Base/Component/PopoverMenu/PopoverMenuFactory.php b/sources/application/UI/Base/Component/PopoverMenu/PopoverMenuFactory.php index 6bb2b0ed90..e358708b9c 100644 --- a/sources/application/UI/Base/Component/PopoverMenu/PopoverMenuFactory.php +++ b/sources/application/UI/Base/Component/PopoverMenu/PopoverMenuFactory.php @@ -21,13 +21,14 @@ namespace Combodo\iTop\Application\UI\Base\Component\PopoverMenu; +use Combodo\iTop\Application\UI\Base\Component\PopoverMenu\PopoverMenuItem\PopoverMenuItem; use Combodo\iTop\Application\UI\Base\Component\PopoverMenu\PopoverMenuItem\PopoverMenuItemFactory; use Dict; +use iPopupMenuExtension; use JSPopupMenuItem; use MetaModel; use SeparatorPopupMenuItem; use URLPopupMenuItem; -use iPopupMenuExtension; use UserRights; use utils; @@ -56,30 +57,68 @@ class PopoverMenuFactory ->SetHorizontalPosition(PopoverMenu::ENUM_HORIZONTAL_POSITION_ALIGN_OUTER_RIGHT) ->SetVerticalPosition(PopoverMenu::ENUM_VERTICAL_POSITION_ABOVE); + $aUserMenuItems = []; + // Allowed portals $aAllowedPortalsItems = static::PrepareAllowedPortalsItemsForUserMenu(); - if (!empty($aAllowedPortalsItems)) { - $oMenu->AddSection('allowed_portals') - ->SetItems('allowed_portals', $aAllowedPortalsItems); - } + self::AddPopoverMenuItems($aAllowedPortalsItems, $aUserMenuItems); // User related pages - $oMenu->AddSection('user_related') - ->SetItems('user_related', static::PrepareUserRelatedItemsForUserMenu()); + self::AddPopoverMenuItems(static::PrepareUserRelatedItemsForUserMenu(), $aUserMenuItems); // API: iPopupMenuExtension::MENU_USER_ACTIONS $aAPIItems = static::PrepareAPIItemsForUserMenu($oMenu); - if (count($aAPIItems) > 0) { - $oMenu->AddSection('popup_menu_extension-menu_user_actions') - ->SetItems('popup_menu_extension-menu_user_actions', $aAPIItems); - } + self::AddPopoverMenuItems($aAPIItems, $aUserMenuItems); // Misc links - $oMenu->AddSection('misc') - ->SetItems('misc', static::PrepareMiscItemsForUserMenu()); + /*$oMenu->AddSection('misc') + ->SetItems('misc', static::PrepareMiscItemsForUserMenu());*/ + self::AddPopoverMenuItems(static::PrepareMiscItemsForUserMenu(), $aUserMenuItems); + self::SortPopoverMenuItems($aUserMenuItems); + + $oMenu->AddSection('misc') + ->AddItems('misc', $aUserMenuItems); return $oMenu; } + + /** + * @param PopoverMenuItem[] $aPopoverMenuItem + * @param PopoverMenuItem[] $aUserMenuItems + * + * @return void + */ + private static function AddPopoverMenuItems(array $aPopoverMenuItem, array &$aUserMenuItems) : void { + foreach ($aPopoverMenuItem as $oPopoverMenuItem){ + $aUserMenuItems[$oPopoverMenuItem->GetUID()] = $oPopoverMenuItem; + } + } + + /** + * @param PopoverMenuItem[] $aPopoverMenuItem + * @param PopoverMenuItem[] $aUserMenuItems + * + * @return void + */ + private static function SortPopoverMenuItems(array &$aUserMenuItems) : void { + $aSortedMenusFromConfig = MetaModel::GetConfig()->Get('navigation_menu.sorted_popup_user_menu_items'); + if (!is_array($aSortedMenusFromConfig) || empty($aSortedMenusFromConfig)){ + return; + } + + $aSortedMenus = []; + foreach ($aSortedMenusFromConfig as $sMenuUID){ + if (array_key_exists($sMenuUID, $aUserMenuItems)){ + $aSortedMenus[]=$aUserMenuItems[$sMenuUID]; + unset($aUserMenuItems[$sMenuUID]); + } + } + + foreach ($aUserMenuItems as $oMenu){ + $aSortedMenus[]=$oMenu; + } + $aUserMenuItems = $aSortedMenus; + } /** * Return the allowed portals items for the current user @@ -273,4 +312,4 @@ class PopoverMenuFactory return $oMenu; } -} \ No newline at end of file +} diff --git a/tests/php-unit-tests/unitary-tests/application/UI/Base/Component/PopoverMenu/PopoverMenuFactoryTest.php b/tests/php-unit-tests/unitary-tests/application/UI/Base/Component/PopoverMenu/PopoverMenuFactoryTest.php new file mode 100644 index 0000000000..5072c2aa37 --- /dev/null +++ b/tests/php-unit-tests/unitary-tests/application/UI/Base/Component/PopoverMenu/PopoverMenuFactoryTest.php @@ -0,0 +1,96 @@ + [ + 'aConf' => null, + 'aExpectedMenuUIDs' => $aNotSortedMenuUIDs + ], + 'not an array conf' => [ + 'aConf' => "wrong conf", + 'aExpectedMenuUIDs' => $aNotSortedMenuUIDs + ], + 'default conf' => [ + 'aConf' => [], + 'aExpectedMenuUIDs' => $aNotSortedMenuUIDs + ], + 'same order in conf' => [ + 'aConf' => [ + 'portal:itop-portal', + 'UI:Preferences', + 'UI:Help', + 'UI:AboutBox', + ], + 'aExpectedMenuUIDs' => $aNotSortedMenuUIDs + ], + 'first menus sorted and last one missing in conf' => [ + 'aConf' => [ + "portal:itop-portal", + "UI:Preferences", + ], + 'aExpectedMenuUIDs' => $aNotSortedMenuUIDs + ], + 'some menus but not all sorted' => [ + 'aConf' => [ + 'UI:Preferences', + 'UI:AboutBox', + ], + 'aExpectedMenuUIDs' => [ + 'UI_Preferences', + 'UI_AboutBox', + 'portal_itop_portal', + 'UI_Help', + ] + ], + 'all user menu sorted' => [ + 'aConf' => [ + 'UI:Preferences', + 'UI:AboutBox', + 'portal:itop-portal', + 'UI:Help', + ], + 'aExpectedMenuUIDs' => [ + 'UI_Preferences', + 'UI_AboutBox', + 'portal_itop_portal', + 'UI_Help', + ] + ], + ]; + } + /** + * @dataProvider MakeUserMenuForNavigationMenuProvider + */ + public function testMakeUserMenuForNavigationMenu($aConf, $aExpectedMenuUIDs){ + if (! is_null($aConf)){ + \MetaModel::GetConfig()->Set('navigation_menu.sorted_popup_user_menu_items', $aConf); + } + + $aRes = PopoverMenuFactory::MakeUserMenuForNavigationMenu()->GetSections(); + $this->assertTrue(array_key_exists('misc', $aRes)); + $aUIDsWithDummyRandoString = array_keys($aRes['misc']['aItems']); + //replace ibo-popover-menu--item-6464cdca5ecf4214716943--UI_AboutBox by UI_AboutBox (for ex) + $aUIDs = preg_replace('/ibo-popover-menu--item-([^\-]+)--/', '', $aUIDsWithDummyRandoString); + $this->assertEquals($aExpectedMenuUIDs, $aUIDs); + } +} From 1e41e805a282e147ce2a5748623036740b75cb8e Mon Sep 17 00:00:00 2001 From: "denis.flaven@combodo.com" Date: Thu, 25 May 2023 17:33:38 +0200 Subject: [PATCH 43/44] API for Welcome Popup --- application/applicationextension.inc.php | 45 ++++ application/datamodel.application.xml | 30 +++ application/templates/welcome_popup.html | 29 --- css/backoffice/pages/_welcome-popup.scss | 42 +++- .../precompiled-themes/original.main.css | 12 + dictionaries/de.dictionary.itop.ui.php | 1 + dictionaries/en.dictionary.itop.ui.php | 1 + dictionaries/es_cr.dictionary.itop.ui.php | 1 + dictionaries/fr.dictionary.itop.ui.php | 1 + images/welcome.jpg | Bin 23197 -> 0 bytes lib/composer/autoload_classmap.php | 7 + lib/composer/autoload_static.php | 7 + pages/UI.php | 14 +- pages/ajax.render.php | 25 +- .../WelcomePopup/DefaultWelcomePopup.php | 27 ++ .../WelcomePopup/WelcomePopupService.php | 234 ++++++++++++++++++ sources/Controller/WelcomePopupController.php | 24 ++ .../default_welcome_popup.html.twig | 10 + .../welcome_popup/welcome_popup.html.twig | 37 ++- .../welcome_popup/welcome_popup.ready.js.twig | 50 +++- .../WelcomePopup/WelcomePopupTest.php | 221 +++++++++++++++++ 21 files changed, 750 insertions(+), 68 deletions(-) delete mode 100644 application/templates/welcome_popup.html create mode 100644 datamodels/2.x/combodo-backoffice-darkmoon-theme/precompiled-themes/original.main.css delete mode 100644 images/welcome.jpg create mode 100644 sources/Application/WelcomePopup/DefaultWelcomePopup.php create mode 100644 sources/Application/WelcomePopup/WelcomePopupService.php create mode 100644 sources/Controller/WelcomePopupController.php create mode 100644 templates/pages/backoffice/welcome_popup/default_welcome_popup.html.twig create mode 100644 tests/php-unit-tests/unitary-tests/application/WelcomePopup/WelcomePopupTest.php diff --git a/application/applicationextension.inc.php b/application/applicationextension.inc.php index f877239ce1..8c8e05e593 100644 --- a/application/applicationextension.inc.php +++ b/application/applicationextension.inc.php @@ -2184,5 +2184,50 @@ class RestUtils */ interface iModuleExtension { + /** + * @api + */ public function __construct(); +} + +/** + * Interface to provide messages to be displayed in the "Welcome Popup" + * + * @api + * @private + * @since 3.1.0 + */ +interface iWelcomePopup +{ + // Importance for ordering messages + // Just two levels since less important messages have nothing to do in the welcome popup + const IMPORTANCE_CRITICAL = 0; + const IMPORTANCE_HIGH = 1; + /** + * @return [['importance' => IMPORTANCE_CRITICAL|IMPORTANCE_HIGH, 'id' => '...', 'title' => '', 'html' => '', 'twig' => '']] + */ + public function GetMessages(); + /** + * The message specified by the given Id has been acknowledged by the current user + * @param string $sMessageId + */ + public function AcknowledgeMessage(string $sMessageId): void; +} + +/** + * Inherit from this class to provide messages to be displayed in the "Welcome Popup" + * + * @api + * @since 3.1.0 + */ +abstract class AbstractWelcomePopup implements iWelcomePopup +{ + public function GetMessages() + { + return []; + } + public function AcknowledgeMessage(string $sMessageId): void + { + return; + } } \ No newline at end of file diff --git a/application/datamodel.application.xml b/application/datamodel.application.xml index 9616b1b990..363e11e90b 100644 --- a/application/datamodel.application.xml +++ b/application/datamodel.application.xml @@ -40,6 +40,36 @@ + + DBObject + + /* Acknowledge welcome popup messages */ + false + + autoincrement + priv_welcome_popup_acknowledge + + + + message_uuid + + false + + + user_id + User + false + DEL_SILENT + + + acknowledge_date + + false + + + + + diff --git a/application/templates/welcome_popup.html b/application/templates/welcome_popup.html deleted file mode 100644 index 6f6397db52..0000000000 --- a/application/templates/welcome_popup.html +++ /dev/null @@ -1,29 +0,0 @@ -
- -

-

-

UI:WelcomeMenu:Title

-

- - - - - -
-UI:WelcomeMenu:LeftBlock - -UI:WelcomeMenu:RightBlock -
-
diff --git a/css/backoffice/pages/_welcome-popup.scss b/css/backoffice/pages/_welcome-popup.scss index e20bd7b7c7..eea1af5f2d 100644 --- a/css/backoffice/pages/_welcome-popup.scss +++ b/css/backoffice/pages/_welcome-popup.scss @@ -17,7 +17,9 @@ $ibo-welcome-popup--text--options--bottom: 10px !default; #welcome_popup{ display: flex; - +} +.ibo-welcome-popup--columns{ + display: flex; } .ibo-welcome-popup--image{ display: flex; @@ -44,7 +46,39 @@ $ibo-welcome-popup--text--options--bottom: 10px !default; } } } -.ibo-welcome-popup--text--options{ - position: absolute; - bottom: $ibo-welcome-popup--text--options--bottom; +.ibo-welcome-popup--dialog { + width: 60rem; +} +.ibo-welcome-popup--content { + width: 100%; + .ibo-welcome-popup--message { + width: 100%; + min-height: 12rem; + } + .ibo-welcome-popup--button { + width: 100%; + text-align: center; + padding-top: 1rem; + position: absolute; + bottom: 4.5rem; + } +} +.ibo-welcome-popup--indicators { + width: 100%; + display: block; + text-align: center; + padding-top: 1.5rem; + padding-bottom: 0; + height: 3rem; + .ibo-welcome-popup--indicator { + width: 1rem; + height: 1rem; + border-radius: 0.5rem; + background-color: $ibo-color-secondary-600; + display: inline-block; + cursor: pointer; + } + .ibo-welcome-popup--active { + background-color: $ibo-color-information-600 !important; + } } \ No newline at end of file diff --git a/datamodels/2.x/combodo-backoffice-darkmoon-theme/precompiled-themes/original.main.css b/datamodels/2.x/combodo-backoffice-darkmoon-theme/precompiled-themes/original.main.css new file mode 100644 index 0000000000..a45e0c648d --- /dev/null +++ b/datamodels/2.x/combodo-backoffice-darkmoon-theme/precompiled-themes/original.main.css @@ -0,0 +1,12 @@ +/* +=== SIGNATURE BEGIN === +{"variables":"d751713988987e9331980363e24189ce","stylesheets":{"fullmoon":"18b8c59bb2be4f8490ead6fd6465aa95","editor":"811370f12f8f3db4d7569b699761c696","datamodel-compiled-scss-rules":"3fc3340989950a881b64934384d4a71e"},"variable_imports":{"nord-scss-variables":"de08012c8304a1097b2a6e44280b5086","darkmoon-scss-variables":"4cfc12fee531e33c596113525e74e3a5"},"images":{"images\/full-screen.png":"b541fadd3f1563856a4b44aeebd9d563","images\/tv-item.gif":"719fe2d4566108e73162fb8868d3778c","images\/tv-collapsable.gif":"63a3351ea0d580797c9b8c386aa4f48b","images\/tv-expandable.gif":"a2d1af4128e4a798a7f3390b12a28574","images\/tv-item-last.gif":"2ae7e1d9972ce71e5caa65a086bc5b7e","images\/tv-collapsable-last.gif":"71acaa9d7c2616e9e8b7131a75ca65da","images\/tv-expandable-last.gif":"9d51036b3a8102742709da66789fd0f7","images\/tv-folder.gif":"9f41e1454905fd7416f89aa4380a65e1","images\/tv-file.gif":"9ab0e28d85d8ab5eb954fc28f6ac1e80"},"utility_imports":{"..\/css\/backoffice\/utils\/_all.scss":"4ad9e64e998b8702c6f4ec0550d8d6c2","..\/css\/backoffice\/utils\/variables\/_all.scss":"b62e15ec99ea8c5d887ab5d2d4c48073","..\/css\/backoffice\/utils\/variables\/colors\/_all.scss":"6f1ae96aa486f919f8c5d650c4be2b35","..\/css\/backoffice\/utils\/variables\/colors\/_base.scss":"56c34d3585027c646ec372b4190a1a7f","..\/css\/backoffice\/utils\/variables\/colors\/_base-palette.scss":"3e6de1e802252954559ba47b327bc309","..\/css\/backoffice\/utils\/variables\/colors\/_semantic-palette.scss":"a0ab2becf07b9006246b4b7a3da56d4b","..\/css\/backoffice\/utils\/variables\/colors\/_lifecycle-palette.scss":"edbdd28bc92158002a11811a80fd5d84","..\/css\/backoffice\/utils\/variables\/_border-radius.scss":"67b8bb1a9ab917c8c09439d384216db4","..\/css\/backoffice\/utils\/variables\/_depression.scss":"c2280a7253b0993f3ab7b56498db654a","..\/css\/backoffice\/utils\/variables\/_elevation.scss":"46f2c32b1749b900872f544230371a2b","..\/css\/backoffice\/utils\/variables\/_path.scss":"9b6885881e7c4a3e3a00c2ed0c133cdf","..\/css\/backoffice\/utils\/variables\/_size.scss":"dbf6f836c5e9c66321887d266bb0f308","..\/css\/backoffice\/utils\/variables\/_spacing.scss":"28eb94c65f05e69b46142aa449acf402","..\/css\/backoffice\/utils\/variables\/_typography.scss":"d30240b6ae58d7485fbbdcfe5dc6ce8c","..\/css\/backoffice\/utils\/variables\/_base.scss":"d1fab58362b8bcfdf27ccc82fa6cc5d4","..\/css\/backoffice\/utils\/functions\/_all.scss":"98ab57d45bb4dab9d71a86bb9fb2fdad","..\/css\/backoffice\/utils\/functions\/_color.scss":"64d9a49df5587f3ebb3beccbebea2368","..\/css\/backoffice\/utils\/mixins\/_all.scss":"e7d77b97c6a069bc0b09b74517fcc5f6","..\/css\/backoffice\/utils\/helpers\/_all.scss":"082454639198198654edf0f941389c9c","..\/css\/backoffice\/utils\/helpers\/_border-radius.scss":"6a26fe83af24b025047e90d2e6fe7507","..\/css\/backoffice\/utils\/helpers\/_color.scss":"3c8bc772ab4bf802f6e59acbc3272d55","..\/css\/backoffice\/utils\/helpers\/_depression.scss":"0ea78b619fb6bc167a159d577d9c53e3","..\/css\/backoffice\/utils\/helpers\/_elevation.scss":"d393fa35752e05fb9c4fc2237bebbc8e","..\/css\/backoffice\/utils\/helpers\/_font-icon.scss":"40f9bdd2aa1761522d507a425e11a649","..\/css\/backoffice\/utils\/helpers\/_typography.scss":"9f29681d56f707b85b55cd478dc0e4b9","..\/css\/backoffice\/utils\/helpers\/_misc.scss":"20ac307d1314439dd023e70d304f4447","..\/css\/backoffice\/utils\/helpers\/_class-icon.scss":"144e7fbf08196a3c46b6f3d9846cff0a","..\/css\/backoffice\/vendors\/_all.scss":"0979c290741138f5afdee1151dbf6d77","..\/css\/backoffice\/vendors\/_bulma-variables-overload.scss":"03e154b0aa3bc15c30055c295643dfca","..\/css\/backoffice\/vendors\/..\/..\/..\/node_modules\/bulma-scss\/utilities\/_all.scss":"e374bc4ffb043b458d29e319b37fec03","..\/css\/backoffice\/vendors\/..\/..\/..\/node_modules\/bulma-scss\/utilities\/_initial-variables.scss":"527552844220a961a10b9af7b75add8b","..\/css\/backoffice\/vendors\/..\/..\/..\/node_modules\/bulma-scss\/utilities\/_functions.scss":"b39215085d7b424be74e05ae0c9a096b","..\/css\/backoffice\/vendors\/..\/..\/..\/node_modules\/bulma-scss\/utilities\/_animations.scss":"9eeec504cab94a45a597592020b7f0e7","..\/css\/backoffice\/vendors\/..\/..\/..\/node_modules\/bulma-scss\/utilities\/_mixins.scss":"6201fa9f37198a13291708785bed8c9c","..\/css\/backoffice\/vendors\/..\/..\/..\/node_modules\/bulma-scss\/utilities\/_controls.scss":"d2fd10c6dc0750b99b1f40952e8a4562","..\/css\/backoffice\/vendors\/..\/..\/..\/node_modules\/bulma-scss\/base\/_all.scss":"22cda0b152315361269f768c4a0e08d0","..\/css\/backoffice\/vendors\/..\/..\/..\/node_modules\/bulma-scss\/base\/_minireset.scss":"53ee547c0bff77ba3e6353def2f8729b","..\/css\/backoffice\/vendors\/..\/..\/..\/node_modules\/bulma-scss\/base\/_generic.scss":"c6a82d37120ed7d2dc7a64dccac78efd","..\/css\/backoffice\/vendors\/..\/..\/..\/node_modules\/bulma-scss\/elements\/_content.scss":"4123c3d4d782cfbaaa8d4726f3a0425a","..\/css\/backoffice\/vendors\/_ckeditor.scss":"6e8959c11d32b2ff18f0b9311bb229f9","..\/css\/backoffice\/vendors\/_c3.scss":"67e85e5dca90ff7359d3e93fdf60d083","..\/css\/backoffice\/vendors\/_tippy.scss":"28551f4fbcd0aedc1e2deca98de1f735","..\/css\/backoffice\/vendors\/_jqueryui.scss":"cd247942214d778d8721165535c7762e","..\/css\/backoffice\/vendors\/_jquery-multiselect.scss":"9e58b3df3ea9cfee07d933daf626f381","..\/css\/backoffice\/vendors\/_datatables.scss":"3a02a47e9bb576062daca339ed8ce34c","..\/css\/backoffice\/vendors\/_jquery-treeview.scss":"4b1c6fd7adf40559c618c0eef75ed951","..\/css\/backoffice\/vendors\/_jquery-blockui.scss":"896ca889ddc740ddc186f6c53acda565","..\/css\/backoffice\/vendors\/_magnific-popup.scss":"651c701491c80f3070748aea4c10df34","..\/css\/backoffice\/vendors\/_selectize.scss":"d944bf615982b8724d45e568cdfd1522","..\/css\/backoffice\/base\/_all.scss":"558d5216604cb41b86793d513b9b427c","..\/css\/backoffice\/base\/_base.scss":"c1ea8efbdb3859e1d280789f7a04f016","..\/css\/backoffice\/base\/_typography.scss":"d3fe6b58526f49a9f30f6cdbf09204f2","..\/css\/backoffice\/components\/_all.scss":"34672a1fe56533372898e0837156260d","..\/css\/backoffice\/components\/_alert.scss":"00ad2abe7a23814f10f8d335d9125011","..\/css\/backoffice\/components\/_button.scss":"631c3d071af32d7594e589ffcaaf8dc8","..\/css\/backoffice\/components\/_button-group.scss":"ddff8a511b0155cf7de5fd8d2129afff","..\/css\/backoffice\/components\/_breadcrumbs.scss":"d958b19b860261e5edce9b86f8989dcf","..\/css\/backoffice\/components\/_quick-create.scss":"dad66636d9cdb57d4958b566f26d06e6","..\/css\/backoffice\/components\/_global-search.scss":"c0ba075ab3819090d9aca2674faa0b7b","..\/css\/backoffice\/components\/popover-menu\/_popover-menu.scss":"df56706d5f1b6fea881275b29c83cd5b","..\/css\/backoffice\/components\/popover-menu\/_popover-menu-item.scss":"f8c97c88680ba1ec6b23a630bf126da8","..\/css\/backoffice\/components\/_newsroom-menu.scss":"40501458a9d7597d56e3b68e2ce7a1c8","..\/css\/backoffice\/components\/_panel.scss":"b61375f790cf580bfd1715ba042b3fae","..\/css\/backoffice\/components\/_collapsible-section.scss":"75d696fbded5c4924cc4b9f7811ec68f","..\/css\/backoffice\/components\/_modal.scss":"59f3780d094682fdb3caf72e8e548333","..\/css\/backoffice\/components\/dashlet\/_all.scss":"b385664d72427211449e126e84aa569f","..\/css\/backoffice\/components\/dashlet\/_dashlet.scss":"d01a28405200be86f6dc80301294bf4c","..\/css\/backoffice\/components\/dashlet\/_dashlet-badge.scss":"6c3d13fe510b8979671151b20b35401e","..\/css\/backoffice\/components\/dashlet\/_dashlet-header-static.scss":"e59fade683e16a868d650883d4709617","..\/css\/backoffice\/components\/dashlet\/_dashlet-header-dynamic.scss":"5ec620b7422eefd82f2b81efed8eb17f","..\/css\/backoffice\/components\/input\/_all.scss":"5c7ce9d539e0d013694b6a26ae1b8b97","..\/css\/backoffice\/components\/input\/_input.scss":"3809d4ca16b29cca914b89a5acef3abb","..\/css\/backoffice\/components\/input\/_input-checkbox.scss":"abe96ce9ca97d41391444ea3e78f5bb9","..\/css\/backoffice\/components\/input\/_input-date.scss":"a84faa2f6ec3ee4c9e33bbf34074fa3f","..\/css\/backoffice\/components\/input\/_input-datetime.scss":"6b5555ebc6a86523574ca2820cf83577","..\/css\/backoffice\/components\/input\/_input-duration.scss":"a731eddd2c7b9aef723b02e0b65985de","..\/css\/backoffice\/components\/input\/_input-image.scss":"42c5b5abcde8ce3710cba701e9bd00f6","..\/css\/backoffice\/components\/input\/_input-richtext.scss":"07f4c65829c575b7d728fe8257fca215","..\/css\/backoffice\/components\/input\/_input-select.scss":"8f89ba7746711734816f923b54fb3add","..\/css\/backoffice\/components\/input\/_input-select-icon.scss":"1a0b416edc9cd634c0f17f30d341e547","..\/css\/backoffice\/components\/input\/_input-string.scss":"59f3780d094682fdb3caf72e8e548333","..\/css\/backoffice\/components\/input\/_input-one-way-password.scss":"87fd24c0c7ab1195a27094a79f67a8f1","..\/css\/backoffice\/components\/input\/_input-set.scss":"865a68e750f79b3f9e56786d6c2feb0b","..\/css\/backoffice\/components\/input\/_input-text.scss":"fc9a33a291ed62e83efefdbda77555e7","..\/css\/backoffice\/components\/_pill.scss":"c7f9f9b61043331fe38be0a5e287669d","..\/css\/backoffice\/components\/_prop.scss":"8ca0dd553e3772da165841d782ff6e57","..\/css\/backoffice\/components\/_title.scss":"355806429e2ef9e15590119c56c91cce","..\/css\/backoffice\/components\/_datatable.scss":"67bcbc87747e764a49f8700c7c585be9","..\/css\/backoffice\/components\/_form.scss":"7a67f1ce93c1911320f35d4ae21c7f0a","..\/css\/backoffice\/components\/_fieldset.scss":"191d28ab6c78d15c131fbaa3e136ddb4","..\/css\/backoffice\/components\/_field.scss":"de3b3b79abe9693d549a213dc2adf5f3","..\/css\/backoffice\/components\/toolbar\/_all.scss":"d5eb50f38b0a9b3ed11510c604c5918b","..\/css\/backoffice\/components\/toolbar\/_toolbar.scss":"6161441a72be2769fca5d508d4cee299","..\/css\/backoffice\/components\/toolbar\/_toolbar-spacer.scss":"4ec67ee81463a3a47a7a9df9e7a06080","..\/css\/backoffice\/components\/toolbar\/_separator.scss":"e8e5a7d9e35ea695f9727c27529afdb7","..\/css\/backoffice\/components\/_richtext.scss":"59f3780d094682fdb3caf72e8e548333","..\/css\/backoffice\/components\/_formtable.scss":"028c5a8ca9bb33cdcb277436437f4971","..\/css\/backoffice\/components\/_formtablerow.scss":"028c5a8ca9bb33cdcb277436437f4971","..\/css\/backoffice\/components\/_search-form.scss":"e6f5d3a0da2be04fcc4e67d18f2aeb17","..\/css\/backoffice\/components\/_field-badge.scss":"38692963080288a8325c9e426a269c74","..\/css\/backoffice\/components\/_file-select.scss":"31e7a997da6d70700d00f31b6788f690","..\/css\/backoffice\/components\/_medallion-icon.scss":"73e84c66b1070e2d4464aa30e3d3c768","..\/css\/backoffice\/layout\/_all.scss":"5c50b58ad1026cdd8861d87c22ce4513","..\/css\/backoffice\/layout\/_navigation-menu.scss":"b59cacde1d5c765805f1844dc9f59a85","..\/css\/backoffice\/layout\/_top-bar.scss":"8e04bc9bf197678a5b55c53bd6447f15","..\/css\/backoffice\/layout\/_content.scss":"bc03eff9cacfc9f4fe613c1ea7ad5d0a","..\/css\/backoffice\/layout\/tab-container\/_tab-container.scss":"7f02ce7e1e03a2f7a924493f742a08c5","..\/css\/backoffice\/layout\/tab-container\/_tab.scss":"028c5a8ca9bb33cdcb277436437f4971","..\/css\/backoffice\/layout\/multi-column\/_multi-column.scss":"a3bd6424719a0b6196686e770f784014","..\/css\/backoffice\/layout\/multi-column\/_column.scss":"0041fb40ed0a05a26b07a7923ea3009c","..\/css\/backoffice\/layout\/dashboard\/_all.scss":"a17ee88767a61d2789dc7e1e43fb17f1","..\/css\/backoffice\/layout\/dashboard\/_dashboard.scss":"96e071ddb7dee0bc36aa2326f1530653","..\/css\/backoffice\/layout\/dashboard\/_dashboard-editor.scss":"0a9edc12987a9a2ea3060cd1067b34e8","..\/css\/backoffice\/layout\/wizard-container\/_wizard-container.scss":"84101487af2ce14b2b7941c760416c33","..\/css\/backoffice\/layout\/object\/_object-details.scss":"5ee4248f9e6ddb01295ba88e2a813aba","..\/css\/backoffice\/layout\/activity-panel\/_all.scss":"546b722b1a748bde41a678aa865ee67d","..\/css\/backoffice\/layout\/activity-panel\/_activity-panel.scss":"b5676b8527574567704b0a3007c022ad","..\/css\/backoffice\/layout\/activity-panel\/_caselog-entry-form.scss":"f9d0bd1c0ed277aade5732bc830869eb","..\/css\/backoffice\/layout\/activity-panel\/_activity-entry.scss":"b84cab116d7cd8e6ff2853500fa6628c","..\/css\/backoffice\/layout\/activity-panel\/_caselog-entry.scss":"867e5c22f25bd95ada1e9698e99f5234","..\/css\/backoffice\/layout\/activity-panel\/_transition-entry.scss":"cf8212f89285040b224f493e5d64a816","..\/css\/backoffice\/layout\/activity-panel\/_edits-entry.scss":"1899e6018c8586d2cb2cd35132324b7e","..\/css\/backoffice\/layout\/activity-panel\/_notification-entry.scss":"461b27be17165557807433c8fa66c07d","..\/css\/backoffice\/application\/_all.scss":"de4aa12caf01a7d79056915b9ad58673","..\/css\/backoffice\/application\/display-block\/_all.scss":"b81c3c3291412431611a43b0c7eec72d","..\/css\/backoffice\/application\/display-block\/_block-csv.scss":"3cba3f9f15b648693825c8f122610650","..\/css\/backoffice\/application\/display-block\/_block-list.scss":"fef575d1f57574a99272b85f1b41eee2","..\/css\/backoffice\/application\/tabular-fields\/_all.scss":"bb7b8281324c87d26a0d22abd8b1ba8b","..\/css\/backoffice\/application\/tabular-fields\/_tabular-fields-selector.scss":"4ae78f1af36f21afaca04a89c4147e71","..\/css\/backoffice\/pages\/_all.scss":"c95bf2962a9be5575ed32e8cbc87bf83","..\/css\/backoffice\/pages\/_base.scss":"e089a9c02db3930aecd81d6cda3f32a6","..\/css\/backoffice\/pages\/_preferences.scss":"47111e8cb0dbf85dcdedb7e6a5be45a0","..\/css\/backoffice\/pages\/_attachments.scss":"bb7de626f3b36e803135df30fa8da71b","..\/css\/backoffice\/pages\/_impact-analysis.scss":"9aad4e214a84acef6bc7bc4c86c532be","..\/css\/backoffice\/pages\/_audit.scss":"48e1f03c5a3e31195b22a861721fce31","..\/css\/backoffice\/pages\/_data-synchro.scss":"d6c1eeca2d6473325656f571053b383f","..\/css\/backoffice\/pages\/_datamodel-viewer.scss":"536dc679266eecbda1518929e73b6410","..\/css\/backoffice\/pages\/_csv-import.scss":"5bd044c3770b81339f276f06a335ea7a","..\/css\/backoffice\/pages\/_global-search.scss":"8c01ff4b2c536ef5e5a53f4ca74980b3","..\/css\/backoffice\/pages\/_run-query.scss":"505911cef16a4c399033bfbecbb616ce","..\/css\/backoffice\/pages\/_welcome-popup.scss":"24ed7e9b464b2227ea78742851c2f353","..\/css\/backoffice\/blocks-integrations\/_all.scss":"ef60f7c36d5e28340d611a84b1c2fa7e","..\/css\/backoffice\/blocks-integrations\/alert\/_all.scss":"4d870bd603525e90378ffed9bbb2b448","..\/css\/backoffice\/blocks-integrations\/alert\/_alert-with-blocks.scss":"7ef408cc779ea029db9e0b13b74cce0f","..\/css\/backoffice\/blocks-integrations\/button\/_all.scss":"00901236f8e910ef13b6f1bd5cd45512","..\/css\/backoffice\/blocks-integrations\/button\/_button-with-button.scss":"2c6f01cc22d0bfa2093099b29f400702","..\/css\/backoffice\/blocks-integrations\/button\/_button-with-button-group.scss":"e117d48704df344aeaf8751785467486","..\/css\/backoffice\/blocks-integrations\/collapsible-section\/_all.scss":"638f28965ab9ca521c133cad94d89ffa","..\/css\/backoffice\/blocks-integrations\/collapsible-section\/_collapsible-section-with-blocks.scss":"2b6d54a377a3dd6bf9ef95fa311ecc58","..\/css\/backoffice\/blocks-integrations\/collapsible-section\/_collapsible-section-within-caselog-list.scss":"5801ed35287052e48452c9e9227d5ce2","..\/css\/backoffice\/blocks-integrations\/collapsible-section\/_collapsible-section-within-alert.scss":"701869874ba293c5118079b62fb5d84f","..\/css\/backoffice\/blocks-integrations\/datatable\/_all.scss":"56745c2d06c920d3cbb766667d6266bb","..\/css\/backoffice\/blocks-integrations\/datatable\/_datatable-with-blocks.scss":"63c3b8baee07aa4be0bbff22600e51f9","..\/css\/backoffice\/blocks-integrations\/datatable\/_datatable-within-panel.scss":"5641191ddfaf0193be54d5d91dbb2a30","..\/css\/backoffice\/blocks-integrations\/display-block\/_all.scss":"5a5ed7a46554f893b6e187f4e786ae25","..\/css\/backoffice\/blocks-integrations\/display-block\/_display-block-with-blocks.scss":"effa7cf7175dabec23e7c2913d695cc6","..\/css\/backoffice\/blocks-integrations\/field\/_all.scss":"a5231382ad4e1fdabd91819a8dc72e6c","..\/css\/backoffice\/blocks-integrations\/field\/_field-with-field.scss":"b8e4e1b104bea79572949feef2fba8a2","..\/css\/backoffice\/blocks-integrations\/field\/_field-with-fieldset.scss":"4dbe83ec93f874fce4227f54fb91ded8","..\/css\/backoffice\/blocks-integrations\/fieldset\/_all.scss":"39b072cf5b36ac44ad3a6600ce478cbd","..\/css\/backoffice\/blocks-integrations\/fieldset\/_fieldset-with-field.scss":"adaa89ad149517ed94452dd011d1c78b","..\/css\/backoffice\/blocks-integrations\/fieldset\/_fieldset-with-fieldset.scss":"10697b71aae94960d32927c72dbfc007","..\/css\/backoffice\/blocks-integrations\/fieldset\/_fieldset-with-multicolumn.scss":"576b80563de26c3bab1a43deee6ef926","..\/css\/backoffice\/blocks-integrations\/form\/_all.scss":"b70c461655578d228554bc1be0b73b93","..\/css\/backoffice\/blocks-integrations\/form\/_form-with-form.scss":"6712546b0cf7836b42d948c75816d211","..\/css\/backoffice\/blocks-integrations\/input\/_all.scss":"080cc2af5ee3c106f47300429e0a77af","..\/css\/backoffice\/blocks-integrations\/input\/_input-with-label.scss":"09f14fc2ce8dfdaf56ff2444ab754984","..\/css\/backoffice\/blocks-integrations\/input\/_input-within-datatable.scss":"5b29a66710a04eac12114ff149dca56e","..\/css\/backoffice\/blocks-integrations\/panel\/_all.scss":"502fc8c4ff7a0073bd9b63c6beee5c53","..\/css\/backoffice\/blocks-integrations\/panel\/_panel-with-blocks.scss":"9e55aa7d1ebf163c4dbc2f67752ba732","..\/css\/backoffice\/blocks-integrations\/panel\/_panel-within-main-content.scss":"11f773a9951845af07c4d53f60a9ec5f","..\/css\/backoffice\/blocks-integrations\/panel\/_panel-within-modal.scss":"c9eca2a3600e33c642406855ee9050fb","..\/css\/backoffice\/blocks-integrations\/pill\/_all.scss":"ea4c950b3421b10c32e5c48f1a6f5539","..\/css\/backoffice\/blocks-integrations\/pill\/_pill-with-pill.scss":"d0084039ff9b4e330c4ef2ba17111b00","..\/css\/backoffice\/blocks-integrations\/dashlet\/_all.scss":"d5777561380a250211331ad4431bd15f","..\/css\/backoffice\/blocks-integrations\/dashlet\/_dashlet-within-dashboard.scss":"2ba232ac9810596c42b2b7e2e85f075d","..\/css\/backoffice\/blocks-integrations\/_add-to-dashboard.scss":"025abc61dece0c6c13d6ffd345aec9ad","..\/css\/backoffice\/blocks-integrations\/_caselog-entry-form-within-activity-panel.scss":"ce0bd212dfcce5bfef6fd623706255da","..\/css\/backoffice\/blocks-integrations\/_tab-container-within-panel.scss":"6b5276ba5987a00357834c45169e3bdf","..\/css\/backoffice\/blocks-integrations\/_object-details-with-tab-container.scss":"ee09bc6539e0168c407ab2fccaa25144","..\/css\/backoffice\/blocks-integrations\/_medallion-with-blocklist.scss":"dc917f57e71b9b99cb00241f23a9bc67","..\/css\/backoffice\/blocks-integrations\/_field-badge-within-datatable.scss":"6d3a3598a271b9d6eac37af5ddc532ce","..\/css\/backoffice\/blocks-integrations\/_jquery-blockui-within-dialog.scss":"d0d276a5f19c3d75ac304782f7f3b07e","..\/css\/backoffice\/blocks-integrations\/_jquery-blockui-within-datatable.scss":"e68b5c5622b7c5372ed7110548704eda","..\/css\/backoffice\/themes\/_all.scss":"e7d77b97c6a069bc0b09b74517fcc5f6","..\/css\/backoffice\/_fallback.scss":"be12ae72f5050ceb543dd3f082a4dd71","..\/css\/backoffice\/_shame.scss":"8d7ae95ae0694b63efb6b85ef1cae6a6"}} +=== SIGNATURE END === +*/ +:root{--ibo-color-white-100:white;--ibo-color-white-200:#f2f2f2;--ibo-color-transparent:rgba(255, 255, 255, 0);--ibo-color-grey-50:#ECEFF4;--ibo-color-grey-100:#E5E9F0;--ibo-color-grey-200:#D8DEE9;--ibo-color-grey-300:#7b88a1;--ibo-color-grey-400:#616e88;--ibo-color-grey-500:#4C566A;--ibo-color-grey-600:#434C5E;--ibo-color-grey-700:#3B4252;--ibo-color-grey-800:#2E3440;--ibo-color-grey-900:#191c22;--ibo-color-grey-950:#0e1013;--ibo-color-blue-grey-50:#f1f5f8;--ibo-color-blue-grey-100:#cfd8dc;--ibo-color-blue-grey-200:#b0bec5;--ibo-color-blue-grey-300:#90a4ae;--ibo-color-blue-grey-400:#78909c;--ibo-color-blue-grey-500:#607d8b;--ibo-color-blue-grey-600:#546e7a;--ibo-color-blue-grey-700:#455a64;--ibo-color-blue-grey-800:#37474f;--ibo-color-blue-grey-900:#263238;--ibo-color-blue-grey-950:#1b2428;--ibo-color-blue-100:#ebf8ff;--ibo-color-blue-200:#bee3f8;--ibo-color-blue-300:#90cef4;--ibo-color-blue-400:#63b4ed;--ibo-color-blue-500:#429ae1;--ibo-color-blue-600:#3182ce;--ibo-color-blue-700:#2b6bb0;--ibo-color-blue-800:#2c5382;--ibo-color-blue-900:#2a4265;--ibo-color-blue-950:#253750;--ibo-color-cyan-100:#c9eef2;--ibo-color-cyan-200:#80deea;--ibo-color-cyan-300:#4dd0e1;--ibo-color-cyan-400:#26c5da;--ibo-color-cyan-500:#00bbd4;--ibo-color-cyan-600:#00aac1;--ibo-color-cyan-700:#0096a7;--ibo-color-cyan-800:#00838f;--ibo-color-cyan-900:#006164;--ibo-color-cyan-950:#003636;--ibo-color-green-100:#dcedc8;--ibo-color-green-200:#c5e1a5;--ibo-color-green-300:#aed581;--ibo-color-green-400:#9ccc65;--ibo-color-green-500:#8ac34a;--ibo-color-green-600:#7cb342;--ibo-color-green-700:#689f38;--ibo-color-green-800:#558b2f;--ibo-color-green-900:#33691e;--ibo-color-green-950:#235816;--ibo-color-orange-100:floralwhite;--ibo-color-orange-200:#feebc8;--ibo-color-orange-300:#fbd38d;--ibo-color-orange-400:#f6ae55;--ibo-color-orange-500:#ea7d1e;--ibo-color-orange-600:#dd6c20;--ibo-color-orange-700:#c05621;--ibo-color-orange-800:#9c4221;--ibo-color-orange-900:#7b341e;--ibo-color-orange-950:#572819;--ibo-color-red-100:#faf2f3;--ibo-color-red-200:#f2e0e2;--ibo-color-red-300:#dfb1b5;--ibo-color-red-400:#d5979d;--ibo-color-red-500:#c97a82;--ibo-color-red-600:#BF616A;--ibo-color-red-700:#b44953;--ibo-color-red-800:#973d46;--ibo-color-red-900:#7d333a;--ibo-color-red-950:#491d1d;--ibo-color-pink-100:#fff5f7;--ibo-color-pink-200:#fed7e2;--ibo-color-pink-300:#fbb6ce;--ibo-color-pink-400:#f688b4;--ibo-color-pink-500:#ed64a6;--ibo-color-pink-600:#d53f8c;--ibo-color-pink-700:#b83280;--ibo-color-pink-800:#97266d;--ibo-color-pink-900:#702459;--ibo-color-pink-950:#511a40}:root{--ibo-color-primary-100:#bfdde6;--ibo-color-primary-200:#a5cfdc;--ibo-color-primary-300:#88C0D0;--ibo-color-primary-400:#6eb2c6;--ibo-color-primary-500:#81A1C1;--ibo-color-primary-600:#698fb5;--ibo-color-primary-700:#7693b8;--ibo-color-primary-800:#5E81AC;--ibo-color-primary-900:#384f6c;--ibo-color-primary-950:#26374b;--ibo-color-secondary-100:#E5E9F0;--ibo-color-secondary-200:#D8DEE9;--ibo-color-secondary-300:#7b88a1;--ibo-color-secondary-400:#616e88;--ibo-color-secondary-500:#4C566A;--ibo-color-secondary-600:#434C5E;--ibo-color-secondary-700:#3B4252;--ibo-color-secondary-800:#2E3440;--ibo-color-secondary-900:#191c22;--ibo-color-secondary-950:#0e1013;--ibo-color-information-100:#ebf8ff;--ibo-color-information-200:#bee3f8;--ibo-color-information-300:#90cef4;--ibo-color-information-400:#63b4ed;--ibo-color-information-500:#429ae1;--ibo-color-information-600:#3182ce;--ibo-color-information-700:#2b6bb0;--ibo-color-information-800:#2c5382;--ibo-color-information-900:#2a4265;--ibo-color-information-950:#253750;--ibo-color-success-100:#dcedc8;--ibo-color-success-200:#c5e1a5;--ibo-color-success-300:#aed581;--ibo-color-success-400:#9ccc65;--ibo-color-success-500:#8ac34a;--ibo-color-success-600:#7cb342;--ibo-color-success-700:#689f38;--ibo-color-success-800:#558b2f;--ibo-color-success-900:#33691e;--ibo-color-success-950:#235816;--ibo-color-warning-100:floralwhite;--ibo-color-warning-200:#feebc8;--ibo-color-warning-300:#fbd38d;--ibo-color-warning-400:#f6ae55;--ibo-color-warning-500:#ea7d1e;--ibo-color-warning-600:#dd6c20;--ibo-color-warning-700:#c05621;--ibo-color-warning-800:#9c4221;--ibo-color-warning-900:#7b341e;--ibo-color-warning-950:#572819;--ibo-color-danger-100:#faf2f3;--ibo-color-danger-200:#f2e0e2;--ibo-color-danger-300:#dfb1b5;--ibo-color-danger-400:#d5979d;--ibo-color-danger-500:#c97a82;--ibo-color-danger-600:#BF616A;--ibo-color-danger-700:#b44953;--ibo-color-danger-800:#973d46;--ibo-color-danger-900:#7d333a;--ibo-color-danger-950:#491d1d;--ibo-color-error-100:#faf2f3;--ibo-color-error-200:#f2e0e2;--ibo-color-error-300:#dfb1b5;--ibo-color-error-400:#d5979d;--ibo-color-error-500:#c97a82;--ibo-color-error-600:#BF616A;--ibo-color-error-700:#b44953;--ibo-color-error-800:#973d46;--ibo-color-error-900:#7d333a;--ibo-color-error-950:#491d1d;--ibo-caselog-color-highlight-1:#689f38;--ibo-caselog-color-highlight-2:#b83280;--ibo-caselog-color-highlight-3:#f6ae55;--ibo-caselog-color-highlight-4:#3182ce;--ibo-caselog-color-highlight-5:#80deea}:root{--ibo-lifecycle-new-state-primary-color:#2c5382;--ibo-lifecycle-new-state-secondary-color:white;--ibo-lifecycle-neutral-state-primary-color:#2c5382;--ibo-lifecycle-neutral-state-secondary-color:white;--ibo-lifecycle-waiting-state-primary-color:#f6ae55;--ibo-lifecycle-waiting-state-secondary-color:white;--ibo-lifecycle-success-state-primary-color:#689f38;--ibo-lifecycle-success-state-secondary-color:white;--ibo-lifecycle-failure-state-primary-color:#b83280;--ibo-lifecycle-failure-state-secondary-color:white;--ibo-lifecycle-frozen-state-primary-color:#D8DEE9;--ibo-lifecycle-frozen-state-secondary-color:#3B4252;--ibo-lifecycle-active-state-primary-color:#689f38;--ibo-lifecycle-active-state-secondary-color:white;--ibo-lifecycle-inactive-state-primary-color:#f6ae55;--ibo-lifecycle-inactive-state-secondary-color:white}:root{--ibo-border-radius-100:1px;--ibo-border-radius-300:3px;--ibo-border-radius-500:5px;--ibo-border-radius-700:10px;--ibo-border-radius-900:16px;--ibo-border-radius-full:100%}:root{--ibo-elevation-100:inset 0 1px 1px 0 rgba(0, 0, 0, 0.15)}:root{--ibo-elevation-100:0 1px 2px rgba(0, 0, 0, 0.25), 0 1px 3px rgba(0, 0, 0, 0.12);--ibo-elevation-200:0 2px 4px rgba(0, 0, 0, 0.12), 0 3px 6px rgba(0, 0, 0, 0.15);--ibo-elevation-300:0 3px 6px rgba(0, 0, 0, 0.1), 0 10px 20px rgba(0, 0, 0, 0.15);--ibo-elevation-400:0 5px 10px rgba(0, 0, 0, 0.05), 0 15px 25px rgba(0, 0, 0, 0.15);--ibo-elevation-500:0 20px 40px rgba(0, 0, 0, 0.2)}:root{--ibo-size-0:0;--ibo-size-50:2px;--ibo-size-100:4px;--ibo-size-150:8px;--ibo-size-200:12px;--ibo-size-250:16px;--ibo-size-300:24px;--ibo-size-350:32px;--ibo-size-400:48px;--ibo-size-450:64px;--ibo-size-500:96px;--ibo-size-550:128px;--ibo-size-600:192px;--ibo-size-650:256px;--ibo-size-700:384px;--ibo-size-750:512px;--ibo-size-800:640px;--ibo-size-850:768px;--ibo-size-900:896px}:root{--ibo-spacing-0:0;--ibo-spacing-100:2px;--ibo-spacing-200:4px;--ibo-spacing-300:8px;--ibo-spacing-400:12px;--ibo-spacing-500:16px;--ibo-spacing-600:24px;--ibo-spacing-700:32px;--ibo-spacing-800:48px;--ibo-spacing-900:64px}:root{--ibo-font-size-50:0.83rem;--ibo-font-size-100:1rem;--ibo-font-size-150:1.17rem;--ibo-font-size-200:1.33rem;--ibo-font-size-250:1.5rem;--ibo-font-size-300:1.67rem;--ibo-font-size-350:1.83rem;--ibo-font-size-400:2rem;--ibo-font-size-450:2.5rem;--ibo-font-size-500:3rem;--ibo-font-size-550:4rem}:root{--ibo-font-weight-100:100;--ibo-font-weight-200:200;--ibo-font-weight-300:300;--ibo-font-weight-400:400;--ibo-font-weight-500:500;--ibo-font-weight-600:600;--ibo-font-weight-700:700;--ibo-font-weight-800:800;--ibo-font-weight-900:900;--ibo-font-weight-950:950}:root{--ibo-font-family-base:Raleway;--ibo-font-family-monospace:monospace;--ibo-font-family-code:monospace}.ibo-datatable .ibo-field-badge::before{border-radius:100%}.ibo-text.ibo-is-primary{color:#5E81AC}.ibo-text.ibo-is-secondary,.ui-dialog .ibo-text.ui-button,.ibo-text.ui-datepicker-current,.ibo-text.ui-datepicker-close{color:#2E3440}.ibo-text.ibo-is-neutral,.ui-dialog .ibo-text.ui-button.ui-dialog-titlebar-close{color:#2E3440}.ibo-text.ibo-is-information{color:#2c5382}.ibo-text.ibo-is-success{color:#558b2f}.ibo-text.ibo-is-failure{color:#973d46}.ibo-text.ibo-is-warning{color:#9c4221}.ibo-text.ibo-is-danger{color:#973d46}.ibo-text.ibo-is-grey{color:#2E3440}.ibo-text.ibo-is-blue-grey{color:#37474f}.ibo-text.ibo-is-blue{color:#2c5382}.ibo-text.ibo-is-cyan{color:#00838f}.ibo-text.ibo-is-green{color:#558b2f}.ibo-text.ibo-is-orange{color:#9c4221}.ibo-text.ibo-is-red{color:#973d46}.ibo-text.ibo-is-pink{color:#97266d}.ibo-activity-panel--tab-title-decoration{box-shadow:inset 0 1px 1px 0 rgba(0, 0, 0, 0.15)}.ibo-top-bar,.ibo-tab-container--extra-tabs-list{box-shadow:0 1px 2px rgba(0, 0, 0, 0.25), 0 1px 3px rgba(0, 0, 0, 0.12)}ul.cke_autocomplete_panel,.ibo-breadcrumbs--previous-items-list,.ibo-quick-create--input.selectize-control.single .selectize-dropdown,.ibo-popover-menu,.ui-menu,.ui-multiselect-menu,.ibo-input-select-icon--menu,.graph_config .toolkit_menu.graph>ul>li ul,.ibo-activity-panel--filter-options{box-shadow:0 3px 6px rgba(0, 0, 0, 0.1), 0 10px 20px rgba(0, 0, 0, 0.15)}.dataTables_scrollHead thead tr th.sorting::after,.ibo-breadcrumbs--item:not(:last-child)::after,.ibo-breadcrumbs--previous-items-list-toggler:not(:last-child)::after,.ibo-prop--apply.ui-state-error:after,.ibo-sort-order::after{font-family:"Font Awesome 5 Free";font-weight:900;-webkit-font-smoothing:antialiased;display:inline-block;font-style:normal;font-variant:normal;text-rendering:auto;line-height:1}.ibo-font-size-50,.ibo-field--fullscreen-toggler,.ibo-activity-panel--tab-title-draft-indicator,.ibo-activity-entry--sub-information{font-size:0.83rem}.ibo-font-size-100,.dataTables_paginate a.paginate_button,.ibo-quick-create--drawer,.ibo-global-search--drawer,.ibo-dashlet-header-dynamic--label,.ibo-datatable--toolbar,.object-ref-icon.text_decoration,.object-ref-icon-disabled.text_decoration,.ibo-criterion-area,.ibo-dashboard-editor--properties table td .ibo-field,.ibo-dashboard--available-dashlets table td .ibo-field,.ibo-dashlet--properties table td .ibo-field,.ibo-dashboard-editor--properties table th .ibo-field,.ibo-dashboard--available-dashlets table th .ibo-field,.ibo-dashlet--properties table th .ibo-field,.ibo-caselog-list .ibo-collapsible-section .ibo-collapsible-section--header .ibo-collapsible-section--title,.ibo-caselog-list .ibo-collapsible-section .ibo-collapsible-section--body,.ibo-alert--body .ibo-collapsible-section .ibo-collapsible-section--header .ibo-collapsible-section--title,.ibo-alert--body .ibo-collapsible-section .ibo-collapsible-section--body{font-size:1rem}.ibo-font-size-150,.ibo-alert,.ibo-breadcrumbs--item-icon,.ibo-panel--subtitle,.ibo-panel--body,.ibo-dashlet-badge--action-create,.ibo-prop-header,.ibo-field,.sf_results_placeholder,.ibo-input-file-select--container .ibo-input-file-select .ibo-input-file-select--file-name,.ibo-tab-container--tabs-list,.ibo-dashboard-editor--properties-subtitle,.ibo-dashboard--available-dashlet--title,.ibo-dashlet--properties--title,.ibo-activity-entry--medallion{font-size:1.17rem}.ibo-font-size-200,.dataTables_paginate a.paginate_button.previous,.dataTables_paginate a.paginate_button.next{font-size:1.33rem}.ibo-font-size-250,.ibo-collapsible-section .ibo-collapsible-section--header .ibo-collapsible-section--title,.ibo-fieldset-legend,.ibo-dashboard-editor--properties-subtitle,.ibo-dashboard--available-dashlet--title,.ibo-dashlet--properties--title,legend,.ibo-top-bar--toolbar-dashboard-title,.ibo-tab-container--tab-container--label>span,.ibo-dashboard-editor--properties-title{font-size:1.5rem}.ibo-font-size-300,.ibo-title--for-object-details,.ibo-tab--temporary-remote-content--button{font-size:1.67rem}.ibo-font-size-350,.ibo-panel--title,.ibo-dashlet-header-static--body,.ibo-title-for-dashlet--title{font-size:1.83rem}.ibo-font-size-400{font-size:2rem}.ibo-font-size-450{font-size:2.5rem}.ibo-font-size-500{font-size:3rem}.ibo-font-size-550{font-size:4rem}.ibo-font-weight-100{font-weight:100}.ibo-font-weight-200{font-weight:200}.ibo-font-weight-300{font-weight:300}.ibo-font-weight-400{font-weight:400}.ibo-font-weight-500{font-weight:500}.ibo-font-weight-600,.ibo-navigation-menu--notifications-show-all-multiple~.ibo-popover-menu .ibo-navigation-menu--notifications-show-all-multiple--counter,.ibo-navigation-menu--notifications-show-all-multiple~.ui-menu .ibo-navigation-menu--notifications-show-all-multiple--counter,.ibo-navigation-menu--notifications-show-all-multiple~.ui-multiselect-menu .ibo-navigation-menu--notifications-show-all-multiple--counter,.ibo-navigation-menu--notifications-show-all-multiple~.ibo-input-select-icon--menu .ibo-navigation-menu--notifications-show-all-multiple--counter,.graph_config .toolkit_menu.graph>ul>li .ibo-navigation-menu--notifications-show-all-multiple~ul .ibo-navigation-menu--notifications-show-all-multiple--counter,.ibo-field--label{font-weight:600}.ibo-font-weight-700,ul.cke_autocomplete_panel .ibo-vendors-ckeditor--autocomplete-item-title,.ibo-alert .ibo-alert--title,.ibo-tab-container--tab-header.ui-tabs-active,.ui-tabs-active.ibo-tab-container--extra-tabs-container{font-weight:700}.ibo-font-weight-800{font-weight:800}.ibo-font-weight-900{font-weight:900}.ibo-font-weight-950{font-weight:950}.ibo-font-ral-nor-50,.ibo-navigation-menu--menu-filter-hotkey{font-size:0.83rem;font-family:"Raleway", "sans-serif", "system-ui";font-weight:400;-webkit-font-feature-settings:"lnum";-moz-font-feature-settings:"lnum";font-feature-settings:"lnum"}.ibo-font-ral-nor-100,.ui-datepicker .ui-datepicker-title select,.ui-multiselect-checkboxes label,.ibo-navigation-menu--user-info .ibo-navigation-menu--user-organization,.dataModelSchema text,.tooltipD3{font-size:1rem;font-family:"Raleway", "sans-serif", "system-ui";font-weight:400;-webkit-font-feature-settings:"lnum";-moz-font-feature-settings:"lnum";font-feature-settings:"lnum"}.ibo-font-ral-nor-150,.ibo-input,.ui-autocomplete-input,.ui-multiselect,.dataTables_length select,.ui_tpicker_hour_slider>select,.ui_tpicker_minute_slider>select,.ui_tpicker_second_slider>select,select.ibo-input-select-placeholder,.search_form_handler .sf_criterion_area .search_form_criteria .sfc_form_group .sfc_fg_operators .sfc_fg_operator .sfc_op_content input[type="text"],.search_form_handler .sf_filter .sff_input_wrapper input[type="text"],.ibo-input-select.ibo-input-selectize input,.ibo-input-selectize.ui-multiselect input,.ui_tpicker_hour_slider>select.ibo-input-selectize input,.ui_tpicker_minute_slider>select.ibo-input-selectize input,.ui_tpicker_second_slider>select.ibo-input-selectize input,select.ibo-input-selectize.ibo-input-select-placeholder input,.ibo-title--subtitle,.ibo-navigation-menu--menu-nodes ul li>a,.ibo-navigation-menu--menu-nodes ul li>span,.ibo-navigation-menu--user-info .ibo-navigation-menu--user-notifications,.ibo-datamodel-viewer--details .ibo-panel--subtitle,.ibo-global-search--result--title{font-size:1.17rem;font-family:"Raleway", "sans-serif", "system-ui";font-weight:400;-webkit-font-feature-settings:"lnum";-moz-font-feature-settings:"lnum";font-feature-settings:"lnum"}.ibo-font-ral-nor-200,.ibo-collapsible-section .ibo-collapsible-section--body,.ibo-navigation-menu--menu-group{font-size:1.33rem;font-family:"Raleway", "sans-serif", "system-ui";font-weight:400;-webkit-font-feature-settings:"lnum";-moz-font-feature-settings:"lnum";font-feature-settings:"lnum"}.ibo-font-ral-nor-250,.ui-dialog-title,.ibo-navigation-menu--user-info .ibo-navigation-menu--user-welcome-message,.ibo-welcome-popup--text{font-size:1.5rem;font-family:"Raleway", "sans-serif", "system-ui";font-weight:400;-webkit-font-feature-settings:"lnum";-moz-font-feature-settings:"lnum";font-feature-settings:"lnum"}.ibo-font-ral-nor-300,.ibo-quick-create--input.selectize-control.single .selectize-input>input,.ibo-quick-create--input.selectize-control.single .selectize-input.input-active>input,.ibo-quick-create--input.selectize-control.single .selectize-input>.item,.ibo-quick-create--input.selectize-control.single .selectize-input.input-active>.item,.ibo-global-search--input,.ibo-global-search--input:hover,.ibo-global-search--input:focus,.ibo-global-search--input:active{font-size:1.67rem;font-family:"Raleway", "sans-serif", "system-ui";font-weight:400;-webkit-font-feature-settings:"lnum";-moz-font-feature-settings:"lnum";font-feature-settings:"lnum"}.ibo-font-ral-nor-350,.ibo-navigation-menu--menu-nodes-title{font-size:1.83rem;font-family:"Raleway", "sans-serif", "system-ui";font-weight:400;-webkit-font-feature-settings:"lnum";-moz-font-feature-settings:"lnum";font-feature-settings:"lnum"}.ibo-font-ral-nor-400,.ibo-quick-create--icon,.ibo-global-search--icon{font-size:2rem;font-family:"Raleway", "sans-serif", "system-ui";font-weight:400;-webkit-font-feature-settings:"lnum";-moz-font-feature-settings:"lnum";font-feature-settings:"lnum"}.ibo-font-ral-nor-450{font-size:2.5rem;font-family:"Raleway", "sans-serif", "system-ui";font-weight:400;-webkit-font-feature-settings:"lnum";-moz-font-feature-settings:"lnum";font-feature-settings:"lnum"}.ibo-font-ral-nor-500{font-size:3rem;font-family:"Raleway", "sans-serif", "system-ui";font-weight:400;-webkit-font-feature-settings:"lnum";-moz-font-feature-settings:"lnum";font-feature-settings:"lnum"}.ibo-font-ral-nor-550{font-size:4rem;font-family:"Raleway", "sans-serif", "system-ui";font-weight:400;-webkit-font-feature-settings:"lnum";-moz-font-feature-settings:"lnum";font-feature-settings:"lnum"}.ibo-font-ral-med-50{font-size:0.83rem;font-family:"Raleway", "sans-serif", "system-ui";font-weight:500;-webkit-font-feature-settings:"lnum";-moz-font-feature-settings:"lnum";font-feature-settings:"lnum"}.ibo-font-ral-med-100,.dataTable th,.dataTable td,.ibo-breadcrumbs--item,.ibo-breadcrumbs--previous-items-list-toggler,.ibo-breadcrumbs--previous-item,body{font-size:1rem;font-family:"Raleway", "sans-serif", "system-ui";font-weight:500;-webkit-font-feature-settings:"lnum";-moz-font-feature-settings:"lnum";font-feature-settings:"lnum"}.ibo-font-ral-med-150,.ui-multiselect-checkboxes li{font-size:1.17rem;font-family:"Raleway", "sans-serif", "system-ui";font-weight:500;-webkit-font-feature-settings:"lnum";-moz-font-feature-settings:"lnum";font-feature-settings:"lnum"}.ibo-font-ral-med-200{font-size:1.33rem;font-family:"Raleway", "sans-serif", "system-ui";font-weight:500;-webkit-font-feature-settings:"lnum";-moz-font-feature-settings:"lnum";font-feature-settings:"lnum"}.ibo-font-ral-med-250,.ibo-dashlet-badge--action-list{font-size:1.5rem;font-family:"Raleway", "sans-serif", "system-ui";font-weight:500;-webkit-font-feature-settings:"lnum";-moz-font-feature-settings:"lnum";font-feature-settings:"lnum"}.ibo-font-ral-med-300,.ibo-title--text{font-size:1.67rem;font-family:"Raleway", "sans-serif", "system-ui";font-weight:500;-webkit-font-feature-settings:"lnum";-moz-font-feature-settings:"lnum";font-feature-settings:"lnum"}.ibo-font-ral-med-350{font-size:1.83rem;font-family:"Raleway", "sans-serif", "system-ui";font-weight:500;-webkit-font-feature-settings:"lnum";-moz-font-feature-settings:"lnum";font-feature-settings:"lnum"}.ibo-font-ral-med-400{font-size:2rem;font-family:"Raleway", "sans-serif", "system-ui";font-weight:500;-webkit-font-feature-settings:"lnum";-moz-font-feature-settings:"lnum";font-feature-settings:"lnum"}.ibo-font-ral-med-450{font-size:2.5rem;font-family:"Raleway", "sans-serif", "system-ui";font-weight:500;-webkit-font-feature-settings:"lnum";-moz-font-feature-settings:"lnum";font-feature-settings:"lnum"}.ibo-font-ral-med-500{font-size:3rem;font-family:"Raleway", "sans-serif", "system-ui";font-weight:500;-webkit-font-feature-settings:"lnum";-moz-font-feature-settings:"lnum";font-feature-settings:"lnum"}.ibo-font-ral-med-550{font-size:4rem;font-family:"Raleway", "sans-serif", "system-ui";font-weight:500;-webkit-font-feature-settings:"lnum";-moz-font-feature-settings:"lnum";font-feature-settings:"lnum"}.ibo-font-ral-bol-50,.ibo-field--label>.ibo-has-description::after,.ibo-navigation-menu--menu-filter-clear,.ibo-input-with-label--label.ibo-has-description::after{font-size:0.83rem;font-family:"Raleway", "sans-serif", "system-ui";font-weight:700;-webkit-font-feature-settings:"lnum";-moz-font-feature-settings:"lnum";font-feature-settings:"lnum"}.ibo-font-ral-bol-100,.ui-multiselect-header ul,.ui-multiselect-checkboxes li.ui-multiselect-optgroup-label,.ibo-navigation-menu--menu-node-counter,#tooltipD3_top{font-size:1rem;font-family:"Raleway", "sans-serif", "system-ui";font-weight:700;-webkit-font-feature-settings:"lnum";-moz-font-feature-settings:"lnum";font-feature-settings:"lnum"}.ibo-font-ral-bol-150,.ibo-alert.ibo-is-primary a,.ibo-alert.ibo-is-secondary a,.ui-dialog .ibo-alert.ui-button a,.ibo-alert.ui-datepicker-current a,.ibo-alert.ui-datepicker-close a,.ibo-alert.ibo-is-neutral a,.ui-dialog .ibo-alert.ui-button.ui-dialog-titlebar-close a,.ibo-alert.ibo-is-information a,.ibo-alert.ibo-is-success a,.ibo-alert.ibo-is-failure a,.ibo-alert.ibo-is-warning a,.ibo-alert.ibo-is-danger a,.ibo-alert.ibo-is-grey a,.ibo-alert.ibo-is-blue-grey a,.ibo-alert.ibo-is-blue a,.ibo-alert.ibo-is-cyan a,.ibo-alert.ibo-is-green a,.ibo-alert.ibo-is-orange a,.ibo-alert.ibo-is-red a,.ibo-alert.ibo-is-pink a{font-size:1.17rem;font-family:"Raleway", "sans-serif", "system-ui";font-weight:700;-webkit-font-feature-settings:"lnum";-moz-font-feature-settings:"lnum";font-feature-settings:"lnum"}.ibo-font-ral-bol-200,.ibo-dashlet-header-dynamic--count{font-size:1.33rem;font-family:"Raleway", "sans-serif", "system-ui";font-weight:700;-webkit-font-feature-settings:"lnum";-moz-font-feature-settings:"lnum";font-feature-settings:"lnum"}.ibo-font-ral-bol-250,.ibo-dashboard--top-bar .ibo-dashboard--top-bar-title{font-size:1.5rem;font-family:"Raleway", "sans-serif", "system-ui";font-weight:700;-webkit-font-feature-settings:"lnum";-moz-font-feature-settings:"lnum";font-feature-settings:"lnum"}.ibo-font-ral-bol-300{font-size:1.67rem;font-family:"Raleway", "sans-serif", "system-ui";font-weight:700;-webkit-font-feature-settings:"lnum";-moz-font-feature-settings:"lnum";font-feature-settings:"lnum"}.ibo-font-ral-bol-350{font-size:1.83rem;font-family:"Raleway", "sans-serif", "system-ui";font-weight:700;-webkit-font-feature-settings:"lnum";-moz-font-feature-settings:"lnum";font-feature-settings:"lnum"}.ibo-font-ral-bol-400{font-size:2rem;font-family:"Raleway", "sans-serif", "system-ui";font-weight:700;-webkit-font-feature-settings:"lnum";-moz-font-feature-settings:"lnum";font-feature-settings:"lnum"}.ibo-font-ral-bol-450,.ibo-dashlet-badge--action-list-count{font-size:2.5rem;font-family:"Raleway", "sans-serif", "system-ui";font-weight:700;-webkit-font-feature-settings:"lnum";-moz-font-feature-settings:"lnum";font-feature-settings:"lnum"}.ibo-font-ral-bol-500{font-size:3rem;font-family:"Raleway", "sans-serif", "system-ui";font-weight:700;-webkit-font-feature-settings:"lnum";-moz-font-feature-settings:"lnum";font-feature-settings:"lnum"}.ibo-font-ral-bol-550{font-size:4rem;font-family:"Raleway", "sans-serif", "system-ui";font-weight:700;-webkit-font-feature-settings:"lnum";-moz-font-feature-settings:"lnum";font-feature-settings:"lnum"}.ibo-font-ral-sembol-50{font-size:0.83rem;font-family:"Raleway", "sans-serif", "system-ui";font-weight:600;-webkit-font-feature-settings:"lnum";-moz-font-feature-settings:"lnum";font-feature-settings:"lnum"}.ibo-font-ral-sembol-100,.dataTables_paginate a.paginate_button.current,.dataTables_scrollHead thead tr th,.ibo-button,.ui-dialog .ui-button,.ui-datepicker-current,.ui-datepicker-close{font-size:1rem;font-family:"Raleway", "sans-serif", "system-ui";font-weight:600;-webkit-font-feature-settings:"lnum";-moz-font-feature-settings:"lnum";font-feature-settings:"lnum"}.ibo-font-ral-sembol-150{font-size:1.17rem;font-family:"Raleway", "sans-serif", "system-ui";font-weight:600;-webkit-font-feature-settings:"lnum";-moz-font-feature-settings:"lnum";font-feature-settings:"lnum"}.ibo-font-ral-sembol-200{font-size:1.33rem;font-family:"Raleway", "sans-serif", "system-ui";font-weight:600;-webkit-font-feature-settings:"lnum";-moz-font-feature-settings:"lnum";font-feature-settings:"lnum"}.ibo-font-ral-sembol-250{font-size:1.5rem;font-family:"Raleway", "sans-serif", "system-ui";font-weight:600;-webkit-font-feature-settings:"lnum";-moz-font-feature-settings:"lnum";font-feature-settings:"lnum"}.ibo-font-ral-sembol-300,.ibo-welcome-popup--text>div>div:first-child{font-size:1.67rem;font-family:"Raleway", "sans-serif", "system-ui";font-weight:600;-webkit-font-feature-settings:"lnum";-moz-font-feature-settings:"lnum";font-feature-settings:"lnum"}.ibo-font-ral-sembol-350{font-size:1.83rem;font-family:"Raleway", "sans-serif", "system-ui";font-weight:600;-webkit-font-feature-settings:"lnum";-moz-font-feature-settings:"lnum";font-feature-settings:"lnum"}.ibo-font-ral-sembol-400{font-size:2rem;font-family:"Raleway", "sans-serif", "system-ui";font-weight:600;-webkit-font-feature-settings:"lnum";-moz-font-feature-settings:"lnum";font-feature-settings:"lnum"}.ibo-font-ral-sembol-450{font-size:2.5rem;font-family:"Raleway", "sans-serif", "system-ui";font-weight:600;-webkit-font-feature-settings:"lnum";-moz-font-feature-settings:"lnum";font-feature-settings:"lnum"}.ibo-font-ral-sembol-500{font-size:3rem;font-family:"Raleway", "sans-serif", "system-ui";font-weight:600;-webkit-font-feature-settings:"lnum";-moz-font-feature-settings:"lnum";font-feature-settings:"lnum"}.ibo-font-ral-sembol-550{font-size:4rem;font-family:"Raleway", "sans-serif", "system-ui";font-weight:600;-webkit-font-feature-settings:"lnum";-moz-font-feature-settings:"lnum";font-feature-settings:"lnum"}.ibo-font-ral-ita-50,.ibo-navigation-menu--menu-filter-hint{font-size:0.83rem;font-family:"Raleway", "sans-serif", "system-ui";font-weight:400;font-style:italic;-webkit-font-feature-settings:"lnum";-moz-font-feature-settings:"lnum";font-feature-settings:"lnum"}.ibo-font-ral-ita-100,.ibo-quick-create--compartment--placeholder-hint,.ibo-global-search--compartment--placeholder-hint,.ibo-navigation-menu--menu--placeholder-hint,.ibo-activity-panel--body--placeholder-hint{font-size:1rem;font-family:"Raleway", "sans-serif", "system-ui";font-weight:400;font-style:italic;-webkit-font-feature-settings:"lnum";-moz-font-feature-settings:"lnum";font-feature-settings:"lnum"}.ibo-font-ral-ita-150{font-size:1.17rem;font-family:"Raleway", "sans-serif", "system-ui";font-weight:400;font-style:italic;-webkit-font-feature-settings:"lnum";-moz-font-feature-settings:"lnum";font-feature-settings:"lnum"}.ibo-font-ral-ita-200{font-size:1.33rem;font-family:"Raleway", "sans-serif", "system-ui";font-weight:400;font-style:italic;-webkit-font-feature-settings:"lnum";-moz-font-feature-settings:"lnum";font-feature-settings:"lnum"}.ibo-font-ral-ita-250{font-size:1.5rem;font-family:"Raleway", "sans-serif", "system-ui";font-weight:400;font-style:italic;-webkit-font-feature-settings:"lnum";-moz-font-feature-settings:"lnum";font-feature-settings:"lnum"}.ibo-font-ral-ita-300{font-size:1.67rem;font-family:"Raleway", "sans-serif", "system-ui";font-weight:400;font-style:italic;-webkit-font-feature-settings:"lnum";-moz-font-feature-settings:"lnum";font-feature-settings:"lnum"}.ibo-font-ral-ita-350{font-size:1.83rem;font-family:"Raleway", "sans-serif", "system-ui";font-weight:400;font-style:italic;-webkit-font-feature-settings:"lnum";-moz-font-feature-settings:"lnum";font-feature-settings:"lnum"}.ibo-font-ral-ita-400{font-size:2rem;font-family:"Raleway", "sans-serif", "system-ui";font-weight:400;font-style:italic;-webkit-font-feature-settings:"lnum";-moz-font-feature-settings:"lnum";font-feature-settings:"lnum"}.ibo-font-ral-ita-450{font-size:2.5rem;font-family:"Raleway", "sans-serif", "system-ui";font-weight:400;font-style:italic;-webkit-font-feature-settings:"lnum";-moz-font-feature-settings:"lnum";font-feature-settings:"lnum"}.ibo-font-ral-ita-500{font-size:3rem;font-family:"Raleway", "sans-serif", "system-ui";font-weight:400;font-style:italic;-webkit-font-feature-settings:"lnum";-moz-font-feature-settings:"lnum";font-feature-settings:"lnum"}.ibo-font-ral-ita-550{font-size:4rem;font-family:"Raleway", "sans-serif", "system-ui";font-weight:400;font-style:italic;-webkit-font-feature-settings:"lnum";-moz-font-feature-settings:"lnum";font-feature-settings:"lnum"}.ibo-font-code-50{font-size:0.83rem;font-family:monospace;font-weight:400}.ibo-font-code-100{font-size:1rem;font-family:monospace;font-weight:400}.ibo-font-code-150,.ibo-is-code,.ibo-input-text.ibo-is-code,textarea.ibo-is-code{font-size:1.17rem;font-family:monospace;font-weight:400}.ibo-font-code-200{font-size:1.33rem;font-family:monospace;font-weight:400}.ibo-font-code-250{font-size:1.5rem;font-family:monospace;font-weight:400}.ibo-font-code-300{font-size:1.67rem;font-family:monospace;font-weight:400}.ibo-font-code-350{font-size:1.83rem;font-family:monospace;font-weight:400}.ibo-font-code-400{font-size:2rem;font-family:monospace;font-weight:400}.ibo-font-code-450{font-size:2.5rem;font-family:monospace;font-weight:400}.ibo-font-code-500{font-size:3rem;font-family:monospace;font-weight:400}.ibo-font-code-550{font-size:4rem;font-family:monospace;font-weight:400}.ibo-is-visible{display:inherit !important;visibility:visible !important}.ibo-is-hidden{display:none !important}.ibo-is-transparent{opacity:0 !important}.ibo-is-opaque{opacity:1 !important}.ibo-is-fullwidth{width:100%}ul.cke_autocomplete_panel .ibo-vendors-ckeditor--autocomplete-item-image,.ibo-panel--header-left,.ibo-panel--icon,.ibo-dashlet-header-static--icon-container,.ibo-input-image--image-view,.ibo-input-select--autocomplete-item-image,.ibo-pill,.ibo-title--icon,.ibo-datatable--toolbar-left,.ibo-datatable--toolbar-right,.ibo-field--fullscreen-toggler,.ibo-navigation-menu--bottom-part,.ibo-navigation-menu--user-info,.ibo-navigation-menu--user-info .ibo-navigation-menu--user-picture,.ibo-tab-container--tab-toggler,.ibo-tab-container--extra-tabs-list-toggler,.ibo-object-details--status-dot,.ibo-activity-panel--togglers,.ibo-activity-panel--tabs-togglers,.ibo-activity-panel--tab-title,.ibo-activity-panel--tab-toolbar-actions,.ibo-activity-panel--tab-toolbar-action,.ibo-activity-panel--body--placeholder-image,.ibo-activity-panel--body--placeholder-hint,.ibo-activity-panel--closed-cover,.ibo-caselog-entry-form--lock-icon,.ibo-activity-entry--medallion,.ibo-activity-panel--load-more-entries-container,.ibo-activity-panel--load-entries-button{display:flex;justify-content:center;align-items:center}.dataTables_paginate,.ibo-dashlet-badge--action-list,.ibo-input,.ui-autocomplete-input,.ui-multiselect,.dataTables_length select,.ui_tpicker_hour_slider>select,.ui_tpicker_minute_slider>select,.ui_tpicker_second_slider>select,select.ibo-input-select-placeholder,.search_form_handler .sf_criterion_area .search_form_criteria .sfc_form_group .sfc_fg_operators .sfc_fg_operator .sfc_op_content input[type="text"],.search_form_handler .sf_filter .sff_input_wrapper input[type="text"],.ibo-toolbar.ibo-toolbar--button,.ibo-activity-panel--tab-toolbar-left-actions,.ibo-activity-panel--tab-toolbar-middle-actions,.ibo-activity-panel--tab-toolbar-right-actions,.ibo-activity-panel--filter-option,.ibo-activity-panel--entry-forms-confirmation-preference,.ibo-caselog-entry-form--lock-indicator,.ibo-caselog-entry-form--action-buttons--main-actions{display:flex;align-items:center}.ibo-dashlet-badge--action-create,.ibo-title,.ibo-title--subtitle,.ibo-object-details--status,.ibo-activity-panel--add-caselog-entry-button{display:flex;align-items:baseline}.ibo-breadcrumbs,.ibo-quick-create,.ibo-quick-create--head,.ibo-global-search,.ibo-global-search--head,.ibo-top-bar,.ibo-top-bar--quick-actions,.ibo-top-bar--toolbar,.ibo-top-bar--toolbar-dashboard-menu-toggler,.ibo-tab-container--tabs-list,.ibo-tab-container--tab-header,.ibo-tab-container--extra-tabs-container,.ibo-dashboard--top-bar{display:flex;align-items:stretch}html.ibo-has-fullscreen-descendant{position:fixed !important;width:0 !important;height:0 !important}body.ibo-has-fullscreen-descendant{width:0 !important;height:0 !important;overflow:hidden !important}.ibo-has-fullscreen-descendant{position:static !important;overflow:visible !important;z-index:1050 !important}.ibo-is-fullscreen{position:absolute;top:0 !important;left:0 !important;margin:0 !important;padding:0 !important;width:100vw;height:100vh;overflow:auto;z-index:1050}.ibo-text-truncated-with-ellipsis,.ui-dialog .ui-dialog-title,.ibo-button--label,.ibo-breadcrumbs--item-label,.ibo-quick-create--compartment-element,.ibo-quick-create--compartment-results--element>.option,.ibo-global-search--compartment-element,.ibo-dashlet-badge--action-list-label,.ibo-input-select--autocomplete-item-txt,.attribute-set .attribute-set-item,.selectize-control.multi .selectize-input.ibo-input-set .attribute-set-item,.selectize-control.multi .ibo-quick-create--input.selectize-control.single .ibo-input-set.selectize-input.input-active .attribute-set-item,.ibo-quick-create--input.selectize-control.single .selectize-control.multi .ibo-input-set.selectize-input.input-active .attribute-set-item,.ibo-navigation-menu--menu-group-title,.ibo-navigation-menu--menu-nodes-title,.ibo-top-bar--toolbar-dashboard-title,.ibo-tab-container--tab-toggler,.ibo-tab-container--extra-tabs-list-toggler,.ibo-tab-container--tab-toggler-label,.ibo-tab-container--extra-tab-toggler,.ibo-object-details>.ibo-panel--header .ibo-panel--subtitle,.ibo-activity-panel--tab-title-text,.ibo-activity-panel--filter-option{white-space:nowrap;overflow-x:hidden;text-overflow:ellipsis}.dataTables_paginate a.paginate_button,.ibo-dashlet-badge--action-list:hover,.ibo-dashlet-badge--action-list:active,.ibo-field--fullscreen-toggler,.search_form_handler a,.ibo-navigation-menu--menu-filter-clear,.ibo-navigation-menu--menu-filter-hint-close,.ibo-tab-container--tab-toggler,.ibo-tab-container--extra-tabs-list-toggler,.ibo-activity-panel--load-entries-button{color:inherit}.dataTables_paginate a.paginate_button:hover,.dataTables_paginate .ibo-quick-create--compartment-results--element>.paginate_button.option:hover,.ibo-dashlet-badge--action-list:hover,.ibo-dashlet-badge--action-list:active:hover,.ibo-field--fullscreen-toggler:hover,.search_form_handler a:hover,.search_form_handler .ibo-quick-create--compartment-results--element>.option:hover,.ibo-navigation-menu--menu-filter-clear:hover,.ibo-navigation-menu--menu-filter-hint-close:hover,.ibo-tab-container--tab-toggler:hover,.ibo-tab-container--extra-tabs-list-toggler:hover,.ibo-activity-panel--load-entries-button:hover,.dataTables_paginate a.paginate_button:active,.ibo-dashlet-badge--action-list:hover:active,.ibo-dashlet-badge--action-list:active,.ibo-field--fullscreen-toggler:active,.search_form_handler a:active,.ibo-navigation-menu--menu-filter-clear:active,.ibo-navigation-menu--menu-filter-hint-close:active,.ibo-tab-container--tab-toggler:active,.ibo-tab-container--extra-tabs-list-toggler:active,.ibo-activity-panel--load-entries-button:active{color:inherit}.ibo-is-broken-hyperlink{text-decoration:line-through;cursor:help}.ibo-is-code{background-color:#2E3440;padding:1.25rem 1.5rem}.ibo-add-margin-top-250{margin-top:12px}.ibo-is-html-content{}.ibo-is-html-content table{width:unset !important;max-width:max-content}.ibo-is-html-content table{border-collapse:separate;border-spacing:2px}.ibo-is-html-content>code,.ibo-is-html-content code:not(.hljs){color:inherit}.ibo-sticky-sentinel{position:absolute;left:0;right:0;visibility:hidden}.ibo-sticky-sentinel-top{top:0;height:0}.ibo-sticky-sentinel-bottom{bottom:0;height:0}.ibo-class-icon.ibo-is-small{width:32px;min-width:32px;max-height:32px}.ibo-class-icon.ibo-is-medium{width:48px;min-width:48px;max-height:48px}.ibo-class-icon.ibo-is-large{width:64px;min-width:64px;max-height:64px}@keyframes spinAround{from{transform:rotate(0deg)}to{transform:rotate(359deg)}}.content:not(:last-child),.ibo-is-html-content:not(:last-child){margin-bottom:1.5rem}/* minireset.css v0.0.6 | MIT License | github.com/jgthms/minireset.css */html,body,p,ol,ul,li,dl,dt,dd,blockquote,figure,fieldset,legend,textarea,pre,iframe,hr,h1,h2,h3,h4,h5,h6{margin:0;padding:0}h1,h2,h3,h4,h5,h6{font-size:100%;font-weight:normal}ul{list-style:none}button,input,select,textarea{margin:0}html{box-sizing:border-box}*,*::before,*::after{box-sizing:inherit}img,video{height:auto;max-width:100%}iframe{border:0}table{border-collapse:collapse;border-spacing:0}td,th{padding:0}td:not([align]),th:not([align]){text-align:inherit}html{background-color:white;font-size:16px;-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;min-width:300px;overflow-x:hidden;overflow-y:auto;text-rendering:optimizeLegibility;text-size-adjust:100%}article,aside,figure,footer,header,hgroup,section{display:block}body,button,input,select,textarea{font-family:"Raleway", "sans-serif", "system-ui"}code,pre{-moz-osx-font-smoothing:auto;-webkit-font-smoothing:auto;font-family:monospace}body{color:#191c22;font-size:1rem;font-weight:500;line-height:1.5}a{color:#3273dc;cursor:pointer;text-decoration:none}a strong{color:currentColor}a:hover,.ibo-quick-create--compartment-results--element>.option:hover{color:#363636}code{background-color:#7b88a1;color:#5E81AC;font-size:0.875em;font-weight:normal;padding:0.25em 0.5em 0.25em}hr{background-color:whitesmoke;border:none;display:block;height:2px;margin:1.5rem 0}img{height:auto;max-width:100%}input[type="checkbox"],input[type="radio"]{vertical-align:baseline}small{font-size:0.875em}span{font-style:inherit;font-weight:inherit}strong{color:inherit;font-weight:700}fieldset{border:none}pre{-webkit-overflow-scrolling:touch;background-color:#434C5E;color:#E5E9F0;font-size:0.875em;overflow-x:auto;padding:1.25rem 1.5rem;white-space:pre;word-wrap:normal}pre code{background-color:transparent;color:currentColor;font-size:1em;padding:0}table td,table th{vertical-align:top}table td:not([align]),table th:not([align]){text-align:inherit}table th{color:inherit}.content li+li,.ibo-is-html-content li+li{margin-top:0.25em}.content p:not(:last-child),.ibo-is-html-content p:not(:last-child),.content dl:not(:last-child),.ibo-is-html-content dl:not(:last-child),.content ol:not(:last-child),.ibo-is-html-content ol:not(:last-child),.content ul:not(:last-child),.ibo-is-html-content ul:not(:last-child),.content blockquote:not(:last-child),.ibo-is-html-content blockquote:not(:last-child),.content pre:not(:last-child),.ibo-is-html-content pre:not(:last-child),.content table:not(:last-child),.ibo-is-html-content table:not(:last-child){margin-bottom:1em}.content h1,.ibo-is-html-content h1,.content h2,.ibo-is-html-content h2,.content h3,.ibo-is-html-content h3,.content h4,.ibo-is-html-content h4,.content h5,.ibo-is-html-content h5,.content h6,.ibo-is-html-content h6{color:inherit;font-weight:600;line-height:1.125}.content h1,.ibo-is-html-content h1{font-size:2em;margin-bottom:0.5em}.content h1:not(:first-child),.ibo-is-html-content h1:not(:first-child){margin-top:1em}.content h2,.ibo-is-html-content h2{font-size:1.75em;margin-bottom:0.5714em}.content h2:not(:first-child),.ibo-is-html-content h2:not(:first-child){margin-top:1.1428em}.content h3,.ibo-is-html-content h3{font-size:1.5em;margin-bottom:0.6666em}.content h3:not(:first-child),.ibo-is-html-content h3:not(:first-child){margin-top:1.3333em}.content h4,.ibo-is-html-content h4{font-size:1.25em;margin-bottom:0.8em}.content h5,.ibo-is-html-content h5{font-size:1.125em;margin-bottom:0.8888em}.content h6,.ibo-is-html-content h6{font-size:1em;margin-bottom:1em}.content blockquote,.ibo-is-html-content blockquote{background-color:whitesmoke;border-left:5px solid #dbdbdb;padding:1.25em 1.5em}.content ol,.ibo-is-html-content ol{list-style-position:outside;margin-left:2em;margin-top:1em}.content ol:not([type]),.ibo-is-html-content ol:not([type]){list-style-type:decimal}.content ol:not([type]).is-lower-alpha,.ibo-is-html-content ol:not([type]).is-lower-alpha{list-style-type:lower-alpha}.content ol:not([type]).is-lower-roman,.ibo-is-html-content ol:not([type]).is-lower-roman{list-style-type:lower-roman}.content ol:not([type]).is-upper-alpha,.ibo-is-html-content ol:not([type]).is-upper-alpha{list-style-type:upper-alpha}.content ol:not([type]).is-upper-roman,.ibo-is-html-content ol:not([type]).is-upper-roman{list-style-type:upper-roman}.content ul,.ibo-is-html-content ul{list-style:disc outside;margin-left:2em;margin-top:1em}.content ul ul,.ibo-is-html-content ul ul{list-style-type:circle;margin-top:0.5em}.content ul ul ul,.ibo-is-html-content ul ul ul{list-style-type:square}.content dd,.ibo-is-html-content dd{margin-left:2em}.content figure,.ibo-is-html-content figure{margin-left:2em;margin-right:2em;text-align:center}.content figure:not(:first-child),.ibo-is-html-content figure:not(:first-child){margin-top:2em}.content figure:not(:last-child),.ibo-is-html-content figure:not(:last-child){margin-bottom:2em}.content figure img,.ibo-is-html-content figure img{display:inline-block}.content figure figcaption,.ibo-is-html-content figure figcaption{font-style:italic}.content pre,.ibo-is-html-content pre{-webkit-overflow-scrolling:touch;overflow-x:auto;padding:1.25em 1.5em;white-space:pre;word-wrap:normal}.content sup,.ibo-is-html-content sup,.content sub,.ibo-is-html-content sub{font-size:75%}.content table,.ibo-is-html-content table{width:100%}.content table td,.ibo-is-html-content table td,.content table th,.ibo-is-html-content table th{border:'invalid on purpose';border-width:'invalid on purpose';padding:'invalid on purpose';vertical-align:top}.content table th,.ibo-is-html-content table th{color:'invalid on purpose'}.content table th:not([align]),.ibo-is-html-content table th:not([align]){text-align:inherit}.content table thead td,.ibo-is-html-content table thead td,.content table thead th,.ibo-is-html-content table thead th{border-width:'invalid on purpose';color:'invalid on purpose'}.content table tfoot td,.ibo-is-html-content table tfoot td,.content table tfoot th,.ibo-is-html-content table tfoot th{border-width:'invalid on purpose';color:'invalid on purpose'}.content table tbody tr:last-child td,.ibo-is-html-content table tbody tr:last-child td,.content table tbody tr:last-child th,.ibo-is-html-content table tbody tr:last-child th{border-bottom-width:0}.content .tabs li+li,.ibo-is-html-content .tabs li+li{margin-top:0}.content.is-small,.is-small.ibo-is-html-content{font-size:0.75rem}.content.is-medium,.is-medium.ibo-is-html-content{font-size:1.25rem}.content.is-large,.is-large.ibo-is-html-content{font-size:1.5rem}.ibo-vendors-ckeditor--toolbar-fullscreen-button{display:none}.cke_toolbox_collapser.cke_toolbox_collapser_min~.ibo-vendors-ckeditor--toolbar-fullscreen-button{display:block;width:12px;height:11px;border:1px #A6A6A6 solid;cursor:pointer;background-position:center center !important;background-repeat:no-repeat !important;background-size:100% !important;background-image:url('../../../../images/full-screen.png') !important}.cke_toolbox_collapser.cke_toolbox_collapser_min~.ibo-vendors-ckeditor--toolbar-fullscreen-button:hover{background-color:#CCC}.hljs{padding:0.9rem !important;box-shadow:0 0px 3px 2px inset rgba(0, 0, 0, 0.4);border-radius:3px;white-space:pre-line}.ibo-hljs-container{padding:0 !important}ul.cke_autocomplete_panel{background-color:white;border:none;border-radius:3px}ul.cke_autocomplete_panel .ibo-vendors-ckeditor--autocomplete-item{display:flex;justify-content:left;align-items:center}ul.cke_autocomplete_panel .ibo-vendors-ckeditor--autocomplete-item-image{width:25px;height:25px;min-width:25px;min-height:25px;background-position:center center;background-size:100%;border-radius:100%;margin-right:0.5rem;background-color:#ebf8ff;border:1px solid #434C5E}ul.cke_autocomplete_panel .ibo-vendors-ckeditor--autocomplete-item-title{white-space:nowrap;color:#3A3A3A}.ibo-vendors-ckeditor--display-content .cke_editable,.ibo-field--value .HTML .cke_editable,.ibo-caselog-entry .ibo-activity-entry--main-information-content .cke_editable{line-height:1.4}.ibo-vendors-ckeditor--display-content figure,.ibo-field--value .HTML figure,.ibo-caselog-entry .ibo-activity-entry--main-information-content figure{border:solid 1px #ccc;border-radius:2px}.ibo-vendors-ckeditor--display-content p,.ibo-field--value .HTML p,.ibo-caselog-entry .ibo-activity-entry--main-information-content p{margin-top:0.25em;margin-bottom:0.25em}.c3 path:not(.c3-legend-item-tile),.c3 line:not(.c3-legend-item-tile){stroke:#7b88a1 !important}.c3-chart-arc path:not(.c3-legend-item-tile){stroke:white !important}.c3-axis{fill:#D8DEE9 !important}.c3-tooltip th{background-color:#434C5E !important;color:#E5E9F0 !important}.c3-tooltip td{background-color:#434C5E !important}.c3-legend-background{fill:#f2f2f2 !important;stroke:white !important}.c3-tooltip{background-color:#434C5E !important}.c3-tooltip tr{border:1px solid #CCC}.c3-legend-item{fill:#E5E9F0 !important}.tippy-content{white-space:pre-line}.ui-dialog{box-sizing:content-box;display:flex;flex-direction:column;position:absolute;top:0;left:0;background-color:#2E3440;border-radius:5px;overflow:hidden;outline:0;z-index:21}.ui-dialog .ui-dialog-titlebar{padding:0.4em 30px;position:relative;background-color:#2E3440;height:50px;border-bottom:solid 1px #4C566A;display:flex;flex-direction:row;align-items:center;justify-content:space-between}.ui-dialog .ui-dialog-title{float:left;margin:0.1em 0;width:100%;padding-right:24px}.ui-dialog .ui-dialog-titlebar-close{position:absolute;right:0;top:0.4em;width:20px;margin:-10px 0 0 0;padding:1px;height:20px}.ui-dialog .ui-dialog-content{box-sizing:content-box;position:relative;padding:16px 30px;overflow:auto}.ui-dialog .ui-dialog-buttonpane{margin-top:auto;text-align:left;border-width:1px 0 0 0;background-image:none;padding:0.4em 30px;position:relative;background-color:#2E3440;border-top:solid 1px #4C566A;height:50px}.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-dialog .ui-button>.ui-icon{background-image:none;float:unset;margin:auto}.ui-dialog .ui-button>.ui-icon.ui-icon-closethick::after{content:'\f00d';font-family:'Font Awesome 5 Free';font-weight:600;text-indent:0;position:absolute;left:0px;width:100%;top:4px}.ui-button-icon-only{text-indent:-9999px;white-space:nowrap}.ui-widget-overlay.ui-front{position:fixed;top:0;left:0;width:100%;height:100%;opacity:0.6;filter:Alpha(Opacity=60);background-color:#37474f}.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-layout-pane{overflow:auto}.ui-datepicker{background-color:white;border-radius:5px;box-shadow:0 1px 2px rgba(0, 0, 0, 0.25), 0 1px 3px rgba(0, 0, 0, 0.12);z-index:32 !important;padding:0 8px 5px 8px}.ui-datepicker .ui-datepicker-header{position:relative;margin:8px 8px 4px 8px;padding-top:24px}.ui-datepicker .ui-datepicker-prev,.ui-datepicker .ui-datepicker-next{position:absolute;top:0}.ui-datepicker .ui-datepicker-prev{left:0}.ui-datepicker .ui-datepicker-next{right:0}.ui-datepicker .ui-datepicker-title{display:flex;justify-content:space-evenly}.ui-datepicker .ui-datepicker-title select{flex-grow:1}.ui-datepicker .ui-datepicker-year{margin-left:8px}.ui-datepicker .ui-datepicker-calendar{margin:0 8px 8px 8px}.ui-datepicker th{padding:0.7em 0.3em;text-align:center;font-weight:bold}.ui-datepicker td{padding:1px}.ui-datepicker td span,.ui-datepicker td a{display:block;padding:0.2em 0;text-align:center;width:23px;border-radius:100%;color:#c05621}.ui-datepicker td span.ui-state-active,.ui-datepicker td a.ui-state-active{background-color:#c05621;color:floralwhite}.ui-datepicker td span.ui-state-highlight:not(.ui-state-active),.ui-datepicker td a.ui-state-highlight:not(.ui-state-active){background-color:#feebc8}.ui-datepicker td span.ui-state-hover:not(.ui-state-active),.ui-datepicker td a.ui-state-hover:not(.ui-state-active){color:#7b341e}.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-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-slider{position:relative;text-align:left;background-color:#E5E9F0;border:solid 1px #434C5E;border-radius:3px}.ui-slider .ui-slider-handle{background-color:white;border:solid 1px #434C5E;border-radius:3px;position:absolute;z-index:2;width:1.4em;height:1.4em;-ms-touch-action:none;touch-action:none;cursor:pointer}.ui-slider .ui-slider-handle:hover,.ui-slider .ui-slider-handle:active{border:solid 1px #c05621}.ui-slider .ui-slider-range{position:absolute;z-index:1;font-size:0.7em;display:block;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.2em;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-autocomplete{position:absolute;top:0;left:0;cursor:default;z-index:100}.ui-autocomplete .ui-menu-item{padding:0}.ui-autocomplete-input{width:auto;display:inline}.ui-helper-hidden-accessible{clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.ui-tabs-tab.ui-state-disabled a{cursor:not-allowed !important}.ui-multiselect{width:auto !important;padding-left:0.7em !important;padding-right:1.5em !important;text-align:left;white-space:nowrap;overflow:hidden;display:grid}button.ui-multiselect>span{overflow:hidden}.ui-multiselect span.ui-icon{float:right}.ui-multiselect-single .ui-multiselect-checkboxes input{position:absolute !important;top:auto !important;left:-9999px}.ui-multiselect-single .ui-multiselect-checkboxes label{padding:5px !important}.ui-multiselect-header{margin-bottom:3px;padding:3px 0}.ui-multiselect-header ul{padding-left:24px}.ui-multiselect-header ul li{float:left;padding:0 10px 0 0}.ui-multiselect-header span.ui-icon{float:left}.ui-multiselect-header li.ui-multiselect-close{float:right;text-align:right;padding-right:0}.ui-multiselect-menu{display:none;padding:3px;position:absolute;z-index:10000;text-align:left}.ui-multiselect-checkboxes{position:relative;overflow-y:scroll !important}.ui-multiselect-checkboxes label{display:flex;align-items:center;cursor:pointer;padding:3px 1px}.ui-multiselect-checkboxes label input{margin-right:5px;position:relative;top:1px}.ui-multiselect-checkboxes li{clear:both;padding-right:3px}.ui-multiselect-checkboxes li.ui-multiselect-optgroup-label{text-align:center}.ui-multiselect-checkboxes li.ui-multiselect-optgroup-label a{display:block;padding:3px;margin:1px 0;text-decoration:none}.ui-dialog-titlebar.ui-multiselect-header{padding-left:20px;padding-right:20px}.ui-dialog-titlebar.ui-multiselect-header ul{padding-left:0;width:100%}.ui-dialog-titlebar.ui-multiselect-header a{color:#191c22;font-weight:normal}.ui-multiselect,.ui-multiselect-menu,.ui-multiselect-header{background-color:#E5E9F0}button.ui-multiselect{padding-right:10px !important}button.ui-multiselect .fas{float:right;padding-left:10px}.dataTables_paginate{color:#D8DEE9}.dataTables_paginate a.paginate_button{display:inline-flex;justify-content:center;align-items:center;padding:0 5px;min-width:20px;height:20px;border-radius:3px}.dataTables_paginate a.paginate_button:hover,.dataTables_paginate .ibo-quick-create--compartment-results--element>.paginate_button.option:hover{background-color:#3B4252}.dataTables_paginate a.paginate_button.disabled{color:#434C5E;background-color:transparent;cursor:default}.dataTables_paginate a.paginate_button.current{color:#D8DEE9;background-color:#191c22;box-shadow:inset 0px 1px 0px rgba(0, 0, 0, 0.15)}.dataTables_length select{}.dataTables_length select[aria-controls]{display:inline-flex;width:unset;min-width:50px;height:20px;padding:0 4px}.dataTables_scrollHead{}.dataTables_scrollHead thead tr th{cursor:pointer}.dataTables_scrollHead thead tr th.sorting::after{position:absolute;right:calc((12px - 8px) / 2);content:"\f0dc";opacity:0.3;line-height:inherit}.dataTables_scrollHead thead tr th.sorting_asc:after{content:"\f0d8";opacity:1}.dataTables_scrollHead thead tr th.sorting_desc:after{content:"\f0d7";opacity:1}.dataTables_scrollHeadInner{border-bottom:1px solid #616e88}.dataTable th,.dataTable td{position:relative;padding:10px 12px}.dataTable tr:nth-child(odd){background-color:#3B4252}.dataTable tr:nth-child(even){background-color:#2E3440}.dataTable tr.ibo-is-red{background-color:#b44953}.dataTable tr.ibo-is-danger{background-color:#b44953}.dataTable tr.ibo-is-alert{background-color:#b44953}.dataTable tr.ibo-is-orange{background-color:#c05621}.dataTable tr.ibo-is-warning{background-color:#d08770}.dataTable tr.ibo-is-blue{background-color:#5e81ac}.dataTable tr.ibo-is-info{background-color:#5e81ac}.treeview,.treeview ul{padding:0;margin:0;list-style:none}.treeview div.hitarea{height:15px;width:15px;margin-left:-15px;float:left;cursor:pointer}.treeview li{margin:0;padding:3px 0 3px 16px}.treeview a.selected{background-color:#E5E9F0}#treecontrol{margin:1em 0}.treeview .hover{color:#698fb5;cursor:pointer}.treeview li{background:url('../../../..//images/tv-item.gif') 0 0 no-repeat}.treeview .collapsable{background-image:url('../../../..//images/tv-collapsable.gif')}.treeview .expandable{background-image:url('../../../..//images/tv-expandable.gif')}.treeview .last{background-image:url('../../../..//images/tv-item-last.gif')}.treeview .lastCollapsable{background-image:url('../../../..//images/tv-collapsable-last.gif')}.treeview .lastExpandable{background-image:url('../../../..//images/tv-expandable-last.gif')}.filetree li{padding:3px 0 1px 16px}.filetree span.folder,.filetree span.file{padding-left:16px;display:block;height:15px}.filetree span.folder{background:url('../../../..//images/tv-folder.gif') 0 0 no-repeat}.filetree span.file{background:url('../../../..//images/tv-file.gif') 0 0 no-repeat}.blockUI.blockOverlay{background-color:#2E3440}.blockUI.blockMsg{font-size:6em;text-align:center;color:#D8DEE9;border:none;background-color:transparent}.mfp-bg{z-index:1100}.mfp-wrap{z-index:1101}/* + * @copyright Copyright (C) 2010-2021 Combodo SARL + * @license http://opensource.org/licenses/AGPL-3.0 + */.selectize-dropdown-content{max-height:unset}.selectize-input input,.ibo-quick-create--input.selectize-control.single .selectize-input.input-active input{color:#E5E9F0}:root{--ibo-scrollbar--scrollbar-width:8px;--ibo-scrollbar--scrollbar-height:8px;--ibo-scrollbar--scrollbar-track-background-color:#3B4252;--ibo-scrollbar--scrollbar-track-border-radius:5px;--ibo-scrollbar--scrollbar-thumb-background-color:#191c22;--ibo-scrollbar--scrollbar-thumb-border:none;--ibo-scrollbar--scrollbar-thumb-border-radius:5px;--ibo-hyperlink-color:#a5cfdc;--ibo-hyperlink-color--on-hover:#6eb2c6;--ibo-hyperlink-color--on-active:#81A1C1}*,*::before,*::after{box-sizing:border-box}*{scrollbar-width:thin;scrollbar-color:var(--ibo-scrollbar--scrollbar-thumb-background-color) var(--ibo-scrollbar--scrollbar-track-background-color)}*::-webkit-scrollbar{width:var(--ibo-scrollbar--scrollbar-width);height:var(--ibo-scrollbar--scrollbar-height)}*::-webkit-scrollbar-track{background-color:var(--ibo-scrollbar--scrollbar-track-background-color);border-radius:var(--ibo-scrollbar--scrollbar-track-border-radius)}* ::-webkit-scrollbar-thumb{background-color:var(--ibo-scrollbar--scrollbar-thumb-background-color);border:var(--ibo-scrollbar--scrollbar-thumb-border);border-radius:var(--ibo-scrollbar--scrollbar-thumb-border-radius)}html{font-size:12px}a{color:var(--ibo-hyperlink-color);text-decoration:none}a:hover,.ibo-quick-create--compartment-results--element>.option:hover,a:active,a:visited{text-decoration:none}a:hover,.ibo-quick-create--compartment-results--element>.option:hover{color:var(--ibo-hyperlink-color--on-hover)}a:active{color:var(--ibo-hyperlink-color--on-active)}@font-face{font-family:Raleway;font-weight:100;font-style:normal;font-display:swap;src:local('Raleway Thin'), url('../../../../node_modules/@fontsource/raleway/files/raleway-all-100-normal.woff') format('woff')}@font-face{font-family:Raleway;font-weight:100;font-style:italic;font-display:swap;src:local('Raleway Thin'), url('../../../../node_modules/@fontsource/raleway/files/raleway-all-100-italic.woff') format('woff')}@font-face{font-family:Raleway;font-weight:200;font-style:normal;font-display:swap;src:local('Raleway ExtraLight'), url('../../../../node_modules/@fontsource/raleway/files/raleway-all-200-normal.woff') format('woff')}@font-face{font-family:Raleway;font-weight:200;font-style:italic;font-display:swap;src:local('Raleway ExtraLight'), url('../../../../node_modules/@fontsource/raleway/files/raleway-all-200-italic.woff') format('woff')}@font-face{font-family:Raleway;font-weight:300;font-style:normal;font-display:swap;src:local('Raleway Light'), url('../../../../node_modules/@fontsource/raleway/files/raleway-all-300-normal.woff') format('woff')}@font-face{font-family:Raleway;font-weight:300;font-style:italic;font-display:swap;src:local('Raleway Light'), url('../../../../node_modules/@fontsource/raleway/files/raleway-all-300-italic.woff') format('woff')}@font-face{font-family:Raleway;font-weight:400;font-style:normal;font-display:swap;src:local('Raleway'), url('../../../../node_modules/@fontsource/raleway/files/raleway-all-400-normal.woff') format('woff')}@font-face{font-family:Raleway;font-weight:400;font-style:italic;font-display:swap;src:local('Raleway'), url('../../../../node_modules/@fontsource/raleway/files/raleway-all-400-italic.woff') format('woff')}@font-face{font-family:Raleway;font-weight:500;font-style:normal;font-display:swap;src:local('Raleway Medium'), url('../../../../node_modules/@fontsource/raleway/files/raleway-all-500-normal.woff') format('woff')}@font-face{font-family:Raleway;font-weight:500;font-style:italic;font-display:swap;src:local('Raleway Medium'), url('../../../../node_modules/@fontsource/raleway/files/raleway-all-500-italic.woff') format('woff')}@font-face{font-family:Raleway;font-weight:600;font-style:normal;font-display:swap;src:local('Raleway SemiBold'), url('../../../../node_modules/@fontsource/raleway/files/raleway-all-600-normal.woff') format('woff')}@font-face{font-family:Raleway;font-weight:600;font-style:italic;font-display:swap;src:local('Raleway SemiBold'), url('../../../../node_modules/@fontsource/raleway/files/raleway-all-600-italic.woff') format('woff')}@font-face{font-family:Raleway;font-weight:700;font-style:normal;font-display:swap;src:local('Raleway'), url('../../../../node_modules/@fontsource/raleway/files/raleway-all-700-normal.woff') format('woff')}@font-face{font-family:Raleway;font-weight:700;font-style:italic;font-display:swap;src:local('Raleway'), url('../../../../node_modules/@fontsource/raleway/files/raleway-all-700-italic.woff') format('woff')}@font-face{font-family:Raleway;font-weight:800;font-style:normal;font-display:swap;src:local('Raleway ExtraBold'), url('../../../../node_modules/@fontsource/raleway/files/raleway-all-800-normal.woff') format('woff')}@font-face{font-family:Raleway;font-weight:800;font-style:italic;font-display:swap;src:local('Raleway ExtraBold'), url('../../../../node_modules/@fontsource/raleway/files/raleway-all-800-italic.woff') format('woff')}@font-face{font-family:Raleway;font-weight:900;font-style:normal;font-display:swap;src:local('Raleway Black'), url('../../../../node_modules/@fontsource/raleway/files/raleway-all-900-normal.woff') format('woff')}@font-face{font-family:Raleway;font-weight:900;font-style:italic;font-display:swap;src:local('Raleway Black'), url('../../../../node_modules/@fontsource/raleway/files/raleway-all-900-italic.woff') format('woff')}.ibo-alert.ibo-is-primary{background-color:#384f6c;color:#a5cfdc}.ibo-alert.ibo-is-primary a{color:#a5cfdc}.ibo-alert.ibo-is-primary::before{background-color:#7693b8}.ibo-alert.ibo-is-secondary,.ui-dialog .ibo-alert.ui-button,.ibo-alert.ui-datepicker-current,.ibo-alert.ui-datepicker-close{background-color:#191c22;color:#D8DEE9}.ibo-alert.ibo-is-secondary a,.ui-dialog .ibo-alert.ui-button a,.ibo-alert.ui-datepicker-current a,.ibo-alert.ui-datepicker-close a{color:#D8DEE9}.ibo-alert.ibo-is-secondary::before,.ui-dialog .ibo-alert.ui-button::before,.ibo-alert.ui-datepicker-current::before,.ibo-alert.ui-datepicker-close::before{background-color:#3B4252}.ibo-alert.ibo-is-neutral,.ui-dialog .ibo-alert.ui-button.ui-dialog-titlebar-close{background-color:#191c22;color:#D8DEE9}.ibo-alert.ibo-is-neutral a,.ui-dialog .ibo-alert.ui-button.ui-dialog-titlebar-close a{color:#D8DEE9}.ibo-alert.ibo-is-neutral::before,.ui-dialog .ibo-alert.ui-button.ui-dialog-titlebar-close::before{background-color:#3B4252}.ibo-alert.ibo-is-information{background-color:#2a4265;color:#bee3f8}.ibo-alert.ibo-is-information a{color:#bee3f8}.ibo-alert.ibo-is-information::before{background-color:#2b6bb0}.ibo-alert.ibo-is-success{background-color:#33691e;color:#dcedc8}.ibo-alert.ibo-is-success a{color:#dcedc8}.ibo-alert.ibo-is-success::before{background-color:#689f38}.ibo-alert.ibo-is-failure{background-color:#7d333a;color:#f2e0e2}.ibo-alert.ibo-is-failure a{color:#f2e0e2}.ibo-alert.ibo-is-failure::before{background-color:#b44953}.ibo-alert.ibo-is-warning{background-color:#7b341e;color:#feebc8}.ibo-alert.ibo-is-warning a{color:#feebc8}.ibo-alert.ibo-is-warning::before{background-color:#c05621}.ibo-alert.ibo-is-danger{background-color:#7d333a;color:#f2e0e2}.ibo-alert.ibo-is-danger a{color:#f2e0e2}.ibo-alert.ibo-is-danger::before{background-color:#b44953}.ibo-alert.ibo-is-grey{background-color:#191c22;color:#D8DEE9}.ibo-alert.ibo-is-grey a{color:#D8DEE9}.ibo-alert.ibo-is-grey::before{background-color:#3B4252}.ibo-alert.ibo-is-blue-grey{background-color:#263238;color:#b0bec5}.ibo-alert.ibo-is-blue-grey a{color:#b0bec5}.ibo-alert.ibo-is-blue-grey::before{background-color:#455a64}.ibo-alert.ibo-is-blue{background-color:#2a4265;color:#bee3f8}.ibo-alert.ibo-is-blue a{color:#bee3f8}.ibo-alert.ibo-is-blue::before{background-color:#2b6bb0}.ibo-alert.ibo-is-cyan{background-color:#006164;color:#c9eef2}.ibo-alert.ibo-is-cyan a{color:#c9eef2}.ibo-alert.ibo-is-cyan::before{background-color:#2b6bb0}.ibo-alert.ibo-is-green{background-color:#33691e;color:#dcedc8}.ibo-alert.ibo-is-green a{color:#dcedc8}.ibo-alert.ibo-is-green::before{background-color:#689f38}.ibo-alert.ibo-is-orange{background-color:#7b341e;color:#feebc8}.ibo-alert.ibo-is-orange a{color:#feebc8}.ibo-alert.ibo-is-orange::before{background-color:#c05621}.ibo-alert.ibo-is-red{background-color:#7d333a;color:#f2e0e2}.ibo-alert.ibo-is-red a{color:#f2e0e2}.ibo-alert.ibo-is-red::before{background-color:#b44953}.ibo-alert.ibo-is-pink{background-color:#702459;color:#fed7e2}.ibo-alert.ibo-is-pink a{color:#fed7e2}.ibo-alert.ibo-is-pink::before{background-color:#b83280}.ibo-alert{position:relative;padding:18px 20px;min-height:30px;border-radius:3px;overflow:hidden}.ibo-alert::before{display:block;position:absolute;top:0;left:0;content:'';width:4px;height:100%}.ibo-alert .ibo-alert--title{cursor:pointer}.ibo-alert.ibo-is-opened .ibo-alert--minimize-button,.ibo-alert.ibo-input-select-icon--menu .ibo-alert--minimize-button{display:block}.ibo-alert.ibo-is-opened .ibo-alert--maximize-button,.ibo-alert.ibo-input-select-icon--menu .ibo-alert--maximize-button{display:none}.ibo-alert:not(.ibo-is-opened){padding:5px 20px}.ibo-alert:not(.ibo-is-opened) .ibo-alert--title{padding-bottom:0}.ibo-alert:not(.ibo-is-opened) .ibo-alert--minimize-button{display:none}.ibo-alert:not(.ibo-is-opened) .ibo-alert--maximize-button{display:block}.ibo-alert:not(.ibo-is-opened) .ibo-alert--body{display:none}.ibo-alert--title+.ibo-alert--body{margin-top:4px}.ibo-alert--action-button{position:absolute;cursor:pointer;top:5px}.ibo-alert--action-button:hover i{opacity:0.8}.ibo-alert--action-button.ibo-alert--maximize-button,.ibo-alert--action-button.ibo-alert--minimize-button{right:30px}.ibo-alert--action-button.ibo-alert--close-button{right:10px}.ibo-button.ibo-is-regular.ibo-is-neutral,.ui-dialog .ibo-is-regular.ibo-is-neutral.ui-button,.ui-dialog .ibo-is-neutral.ui-button,.ui-dialog .ui-button.ui-dialog-titlebar-close,.ui-dialog .ibo-is-neutral.ui-button.ui-datepicker-current,.ui-dialog .ui-button.ui-datepicker-current.ui-dialog-titlebar-close,.ui-dialog .ibo-is-neutral.ui-button.ui-datepicker-close,.ui-dialog .ui-button.ui-datepicker-close.ui-dialog-titlebar-close,.ui-dialog .ibo-is-regular.ui-button.ui-dialog-titlebar-close,.ui-dialog .ui-button.ui-dialog-titlebar-close.ui-datepicker-current,.ui-dialog .ui-button.ui-dialog-titlebar-close.ui-datepicker-close,.ibo-is-regular.ibo-is-neutral.ui-datepicker-current,.ui-dialog .ibo-is-neutral.ui-datepicker-current.ui-button,.ui-dialog .ui-datepicker-current.ui-button.ui-dialog-titlebar-close,.ibo-is-neutral.ui-datepicker-current,.ibo-is-neutral.ui-datepicker-current.ui-datepicker-close,.ui-dialog .ui-datepicker-current.ui-datepicker-close.ui-button.ui-dialog-titlebar-close,.ui-dialog .ibo-is-regular.ui-datepicker-current.ui-button.ui-dialog-titlebar-close,.ui-dialog .ui-datepicker-current.ui-button.ui-dialog-titlebar-close.ui-datepicker-close,.ibo-is-regular.ibo-is-neutral.ui-datepicker-close,.ui-dialog .ibo-is-neutral.ui-datepicker-close.ui-button,.ui-dialog .ui-datepicker-close.ui-button.ui-dialog-titlebar-close,.ibo-is-neutral.ui-datepicker-close.ui-datepicker-current,.ui-dialog .ui-datepicker-close.ui-datepicker-current.ui-button.ui-dialog-titlebar-close,.ibo-is-neutral.ui-datepicker-close,.ui-dialog .ibo-is-regular.ui-datepicker-close.ui-button.ui-dialog-titlebar-close,.ui-dialog .ui-datepicker-close.ui-button.ui-dialog-titlebar-close.ui-datepicker-current,.ui-dialog .ibo-button.ibo-is-neutral.ui-button,.ui-dialog .ibo-button.ui-button.ui-dialog-titlebar-close,.ibo-button.ibo-is-neutral.ui-datepicker-current,.ui-dialog .ibo-button.ui-datepicker-current.ui-button.ui-dialog-titlebar-close,.ibo-button.ibo-is-neutral.ui-datepicker-close,.ui-dialog .ibo-button.ui-datepicker-close.ui-button.ui-dialog-titlebar-close,.ui-dialog .ibo-button.ibo-is-regular.ui-button.ui-dialog-titlebar-close,.ui-dialog .ibo-is-regular.ui-button.ui-dialog-titlebar-close.ui-datepicker-current,.ui-dialog .ui-button.ui-dialog-titlebar-close.ui-datepicker-current.ui-datepicker-close,.ui-dialog .ibo-is-regular.ui-button.ui-dialog-titlebar-close.ui-datepicker-close,.ui-dialog .ui-button.ui-dialog-titlebar-close.ui-datepicker-close.ui-datepicker-current,.ui-dialog .ibo-button.ui-button.ui-dialog-titlebar-close.ui-datepicker-current,.ui-dialog .ibo-button.ui-button.ui-dialog-titlebar-close.ui-datepicker-close{background-color:#434C5E;color:#D8DEE9;box-shadow:0px 2px 0px #616e88}.ibo-button.ibo-is-regular.ibo-is-neutral:hover,.ui-dialog .ibo-is-regular.ibo-is-neutral.ui-button:hover,.ui-dialog .ibo-is-neutral.ui-button:hover,.ui-dialog .ui-button.ui-dialog-titlebar-close:hover,.ui-dialog .ibo-is-neutral.ui-button.ui-datepicker-current:hover,.ui-dialog .ui-button.ui-datepicker-current.ui-dialog-titlebar-close:hover,.ui-dialog .ibo-is-neutral.ui-button.ui-datepicker-close:hover,.ui-dialog .ui-button.ui-datepicker-close.ui-dialog-titlebar-close:hover,.ui-dialog .ibo-is-regular.ui-button.ui-dialog-titlebar-close:hover,.ui-dialog .ui-button.ui-dialog-titlebar-close.ui-datepicker-current:hover,.ui-dialog .ui-button.ui-dialog-titlebar-close.ui-datepicker-close:hover,.ibo-is-regular.ibo-is-neutral.ui-datepicker-current:hover,.ui-dialog .ibo-is-neutral.ui-datepicker-current.ui-button:hover,.ui-dialog .ui-datepicker-current.ui-button.ui-dialog-titlebar-close:hover,.ibo-is-neutral.ui-datepicker-current:hover,.ibo-is-neutral.ui-datepicker-current.ui-datepicker-close:hover,.ui-dialog .ui-datepicker-current.ui-datepicker-close.ui-button.ui-dialog-titlebar-close:hover,.ui-dialog .ibo-is-regular.ui-datepicker-current.ui-button.ui-dialog-titlebar-close:hover,.ui-dialog .ui-datepicker-current.ui-button.ui-dialog-titlebar-close.ui-datepicker-close:hover,.ibo-is-regular.ibo-is-neutral.ui-datepicker-close:hover,.ui-dialog .ibo-is-neutral.ui-datepicker-close.ui-button:hover,.ui-dialog .ui-datepicker-close.ui-button.ui-dialog-titlebar-close:hover,.ibo-is-neutral.ui-datepicker-close.ui-datepicker-current:hover,.ui-dialog .ui-datepicker-close.ui-datepicker-current.ui-button.ui-dialog-titlebar-close:hover,.ibo-is-neutral.ui-datepicker-close:hover,.ui-dialog .ibo-is-regular.ui-datepicker-close.ui-button.ui-dialog-titlebar-close:hover,.ui-dialog .ui-datepicker-close.ui-button.ui-dialog-titlebar-close.ui-datepicker-current:hover,.ui-dialog .ibo-button.ibo-is-neutral.ui-button:hover,.ui-dialog .ibo-button.ui-button.ui-dialog-titlebar-close:hover,.ibo-button.ibo-is-neutral.ui-datepicker-current:hover,.ui-dialog .ibo-button.ui-datepicker-current.ui-button.ui-dialog-titlebar-close:hover,.ibo-button.ibo-is-neutral.ui-datepicker-close:hover,.ui-dialog .ibo-button.ui-datepicker-close.ui-button.ui-dialog-titlebar-close:hover,.ui-dialog .ibo-button.ibo-is-regular.ui-button.ui-dialog-titlebar-close:hover,.ui-dialog .ibo-is-regular.ui-button.ui-dialog-titlebar-close.ui-datepicker-current:hover,.ui-dialog .ui-button.ui-dialog-titlebar-close.ui-datepicker-current.ui-datepicker-close:hover,.ui-dialog .ibo-is-regular.ui-button.ui-dialog-titlebar-close.ui-datepicker-close:hover,.ui-dialog .ui-button.ui-dialog-titlebar-close.ui-datepicker-close.ui-datepicker-current:hover,.ui-dialog .ibo-button.ui-button.ui-dialog-titlebar-close.ui-datepicker-current:hover,.ui-dialog .ibo-button.ui-button.ui-dialog-titlebar-close.ui-datepicker-close:hover{background-color:#4C566A;color:#E5E9F0;box-shadow:0px 2px 0px #616e88}.ibo-button.ibo-is-regular.ibo-is-neutral:active,.ui-dialog .ibo-is-regular.ibo-is-neutral.ui-button:active,.ui-dialog .ibo-is-neutral.ui-button:active,.ui-dialog .ui-button.ui-dialog-titlebar-close:active,.ui-dialog .ibo-is-neutral.ui-button.ui-datepicker-current:active,.ui-dialog .ui-button.ui-datepicker-current.ui-dialog-titlebar-close:active,.ui-dialog .ibo-is-neutral.ui-button.ui-datepicker-close:active,.ui-dialog .ui-button.ui-datepicker-close.ui-dialog-titlebar-close:active,.ui-dialog .ibo-is-regular.ui-button.ui-dialog-titlebar-close:active,.ui-dialog .ui-button.ui-dialog-titlebar-close.ui-datepicker-current:active,.ui-dialog .ui-button.ui-dialog-titlebar-close.ui-datepicker-close:active,.ibo-is-regular.ibo-is-neutral.ui-datepicker-current:active,.ui-dialog .ibo-is-neutral.ui-datepicker-current.ui-button:active,.ui-dialog .ui-datepicker-current.ui-button.ui-dialog-titlebar-close:active,.ibo-is-neutral.ui-datepicker-current:active,.ibo-is-neutral.ui-datepicker-current.ui-datepicker-close:active,.ui-dialog .ui-datepicker-current.ui-datepicker-close.ui-button.ui-dialog-titlebar-close:active,.ui-dialog .ibo-is-regular.ui-datepicker-current.ui-button.ui-dialog-titlebar-close:active,.ui-dialog .ui-datepicker-current.ui-button.ui-dialog-titlebar-close.ui-datepicker-close:active,.ibo-is-regular.ibo-is-neutral.ui-datepicker-close:active,.ui-dialog .ibo-is-neutral.ui-datepicker-close.ui-button:active,.ui-dialog .ui-datepicker-close.ui-button.ui-dialog-titlebar-close:active,.ibo-is-neutral.ui-datepicker-close.ui-datepicker-current:active,.ui-dialog .ui-datepicker-close.ui-datepicker-current.ui-button.ui-dialog-titlebar-close:active,.ibo-is-neutral.ui-datepicker-close:active,.ui-dialog .ibo-is-regular.ui-datepicker-close.ui-button.ui-dialog-titlebar-close:active,.ui-dialog .ui-datepicker-close.ui-button.ui-dialog-titlebar-close.ui-datepicker-current:active,.ui-dialog .ibo-button.ibo-is-neutral.ui-button:active,.ui-dialog .ibo-button.ui-button.ui-dialog-titlebar-close:active,.ibo-button.ibo-is-neutral.ui-datepicker-current:active,.ui-dialog .ibo-button.ui-datepicker-current.ui-button.ui-dialog-titlebar-close:active,.ibo-button.ibo-is-neutral.ui-datepicker-close:active,.ui-dialog .ibo-button.ui-datepicker-close.ui-button.ui-dialog-titlebar-close:active,.ui-dialog .ibo-button.ibo-is-regular.ui-button.ui-dialog-titlebar-close:active,.ui-dialog .ibo-is-regular.ui-button.ui-dialog-titlebar-close.ui-datepicker-current:active,.ui-dialog .ui-button.ui-dialog-titlebar-close.ui-datepicker-current.ui-datepicker-close:active,.ui-dialog .ibo-is-regular.ui-button.ui-dialog-titlebar-close.ui-datepicker-close:active,.ui-dialog .ui-button.ui-dialog-titlebar-close.ui-datepicker-close.ui-datepicker-current:active,.ui-dialog .ibo-button.ui-button.ui-dialog-titlebar-close.ui-datepicker-current:active,.ui-dialog .ibo-button.ui-button.ui-dialog-titlebar-close.ui-datepicker-close:active{background-color:#4C566A;color:#D8DEE9;box-shadow:inset 0px 2px 0px #616e88 , 0px 2px 0px #4C566A}.ibo-button.ibo-is-regular.ibo-is-neutral:disabled,.ui-dialog .ibo-is-regular.ibo-is-neutral.ui-button:disabled,.ui-dialog .ibo-is-neutral.ui-button:disabled,.ui-dialog .ui-button.ui-dialog-titlebar-close:disabled,.ui-dialog .ibo-is-neutral.ui-button.ui-datepicker-current:disabled,.ui-dialog .ui-button.ui-datepicker-current.ui-dialog-titlebar-close:disabled,.ui-dialog .ibo-is-neutral.ui-button.ui-datepicker-close:disabled,.ui-dialog .ui-button.ui-datepicker-close.ui-dialog-titlebar-close:disabled,.ui-dialog .ibo-is-regular.ui-button.ui-dialog-titlebar-close:disabled,.ui-dialog .ui-button.ui-dialog-titlebar-close.ui-datepicker-current:disabled,.ui-dialog .ui-button.ui-dialog-titlebar-close.ui-datepicker-close:disabled,.ibo-is-regular.ibo-is-neutral.ui-datepicker-current:disabled,.ui-dialog .ibo-is-neutral.ui-datepicker-current.ui-button:disabled,.ui-dialog .ui-datepicker-current.ui-button.ui-dialog-titlebar-close:disabled,.ibo-is-neutral.ui-datepicker-current:disabled,.ibo-is-neutral.ui-datepicker-current.ui-datepicker-close:disabled,.ui-dialog .ui-datepicker-current.ui-datepicker-close.ui-button.ui-dialog-titlebar-close:disabled,.ui-dialog .ibo-is-regular.ui-datepicker-current.ui-button.ui-dialog-titlebar-close:disabled,.ui-dialog .ui-datepicker-current.ui-button.ui-dialog-titlebar-close.ui-datepicker-close:disabled,.ibo-is-regular.ibo-is-neutral.ui-datepicker-close:disabled,.ui-dialog .ibo-is-neutral.ui-datepicker-close.ui-button:disabled,.ui-dialog .ui-datepicker-close.ui-button.ui-dialog-titlebar-close:disabled,.ibo-is-neutral.ui-datepicker-close.ui-datepicker-current:disabled,.ui-dialog .ui-datepicker-close.ui-datepicker-current.ui-button.ui-dialog-titlebar-close:disabled,.ibo-is-neutral.ui-datepicker-close:disabled,.ui-dialog .ibo-is-regular.ui-datepicker-close.ui-button.ui-dialog-titlebar-close:disabled,.ui-dialog .ui-datepicker-close.ui-button.ui-dialog-titlebar-close.ui-datepicker-current:disabled,.ui-dialog .ibo-button.ibo-is-neutral.ui-button:disabled,.ui-dialog .ibo-button.ui-button.ui-dialog-titlebar-close:disabled,.ibo-button.ibo-is-neutral.ui-datepicker-current:disabled,.ui-dialog .ibo-button.ui-datepicker-current.ui-button.ui-dialog-titlebar-close:disabled,.ibo-button.ibo-is-neutral.ui-datepicker-close:disabled,.ui-dialog .ibo-button.ui-datepicker-close.ui-button.ui-dialog-titlebar-close:disabled,.ui-dialog .ibo-button.ibo-is-regular.ui-button.ui-dialog-titlebar-close:disabled,.ui-dialog .ibo-is-regular.ui-button.ui-dialog-titlebar-close.ui-datepicker-current:disabled,.ui-dialog .ui-button.ui-dialog-titlebar-close.ui-datepicker-current.ui-datepicker-close:disabled,.ui-dialog .ibo-is-regular.ui-button.ui-dialog-titlebar-close.ui-datepicker-close:disabled,.ui-dialog .ui-button.ui-dialog-titlebar-close.ui-datepicker-close.ui-datepicker-current:disabled,.ui-dialog .ibo-button.ui-button.ui-dialog-titlebar-close.ui-datepicker-current:disabled,.ui-dialog .ibo-button.ui-button.ui-dialog-titlebar-close.ui-datepicker-close:disabled{background-color:#7b88a1;color:#3B4252;box-shadow:inset 0px 2px 0px #7b88a1}.ibo-button.ibo-is-regular.ibo-is-primary,.ui-dialog .ibo-is-regular.ibo-is-primary.ui-button,.ui-dialog .ibo-is-primary.ui-button,.ui-dialog .ibo-is-primary.ui-button.ui-datepicker-current,.ui-dialog .ibo-is-primary.ui-button.ui-datepicker-close,.ibo-is-regular.ibo-is-primary.ui-datepicker-current,.ui-dialog .ibo-is-primary.ui-datepicker-current.ui-button,.ibo-is-primary.ui-datepicker-current,.ibo-is-primary.ui-datepicker-current.ui-datepicker-close,.ibo-is-regular.ibo-is-primary.ui-datepicker-close,.ui-dialog .ibo-is-primary.ui-datepicker-close.ui-button,.ibo-is-primary.ui-datepicker-close.ui-datepicker-current,.ibo-is-primary.ui-datepicker-close,.ui-dialog .ibo-button.ibo-is-primary.ui-button,.ibo-button.ibo-is-primary.ui-datepicker-current,.ibo-button.ibo-is-primary.ui-datepicker-close{background-color:#7693b8;color:white;box-shadow:0px 2px 0px #6eb2c6}.ibo-button.ibo-is-regular.ibo-is-primary:hover,.ui-dialog .ibo-is-regular.ibo-is-primary.ui-button:hover,.ui-dialog .ibo-is-primary.ui-button:hover,.ui-dialog .ibo-is-primary.ui-button.ui-datepicker-current:hover,.ui-dialog .ibo-is-primary.ui-button.ui-datepicker-close:hover,.ibo-is-regular.ibo-is-primary.ui-datepicker-current:hover,.ui-dialog .ibo-is-primary.ui-datepicker-current.ui-button:hover,.ibo-is-primary.ui-datepicker-current:hover,.ibo-is-primary.ui-datepicker-current.ui-datepicker-close:hover,.ibo-is-regular.ibo-is-primary.ui-datepicker-close:hover,.ui-dialog .ibo-is-primary.ui-datepicker-close.ui-button:hover,.ibo-is-primary.ui-datepicker-close.ui-datepicker-current:hover,.ibo-is-primary.ui-datepicker-close:hover,.ui-dialog .ibo-button.ibo-is-primary.ui-button:hover,.ibo-button.ibo-is-primary.ui-datepicker-current:hover,.ibo-button.ibo-is-primary.ui-datepicker-close:hover{background-color:#698fb5;color:white;box-shadow:0px 2px 0px #6eb2c6}.ibo-button.ibo-is-regular.ibo-is-primary:active,.ui-dialog .ibo-is-regular.ibo-is-primary.ui-button:active,.ui-dialog .ibo-is-primary.ui-button:active,.ui-dialog .ibo-is-primary.ui-button.ui-datepicker-current:active,.ui-dialog .ibo-is-primary.ui-button.ui-datepicker-close:active,.ibo-is-regular.ibo-is-primary.ui-datepicker-current:active,.ui-dialog .ibo-is-primary.ui-datepicker-current.ui-button:active,.ibo-is-primary.ui-datepicker-current:active,.ibo-is-primary.ui-datepicker-current.ui-datepicker-close:active,.ibo-is-regular.ibo-is-primary.ui-datepicker-close:active,.ui-dialog .ibo-is-primary.ui-datepicker-close.ui-button:active,.ibo-is-primary.ui-datepicker-close.ui-datepicker-current:active,.ibo-is-primary.ui-datepicker-close:active,.ui-dialog .ibo-button.ibo-is-primary.ui-button:active,.ibo-button.ibo-is-primary.ui-datepicker-current:active,.ibo-button.ibo-is-primary.ui-datepicker-close:active{background-color:#698fb5;color:white;box-shadow:inset 0px 2px 0px #6eb2c6 , 0px 2px 0px #698fb5}.ibo-button.ibo-is-regular.ibo-is-primary:disabled,.ui-dialog .ibo-is-regular.ibo-is-primary.ui-button:disabled,.ui-dialog .ibo-is-primary.ui-button:disabled,.ui-dialog .ibo-is-primary.ui-button.ui-datepicker-current:disabled,.ui-dialog .ibo-is-primary.ui-button.ui-datepicker-close:disabled,.ibo-is-regular.ibo-is-primary.ui-datepicker-current:disabled,.ui-dialog .ibo-is-primary.ui-datepicker-current.ui-button:disabled,.ibo-is-primary.ui-datepicker-current:disabled,.ibo-is-primary.ui-datepicker-current.ui-datepicker-close:disabled,.ibo-is-regular.ibo-is-primary.ui-datepicker-close:disabled,.ui-dialog .ibo-is-primary.ui-datepicker-close.ui-button:disabled,.ibo-is-primary.ui-datepicker-close.ui-datepicker-current:disabled,.ibo-is-primary.ui-datepicker-close:disabled,.ui-dialog .ibo-button.ibo-is-primary.ui-button:disabled,.ibo-button.ibo-is-primary.ui-datepicker-current:disabled,.ibo-button.ibo-is-primary.ui-datepicker-close:disabled{background-color:#7b88a1;color:#3B4252;box-shadow:inset 0px 2px 0px #7b88a1}.ibo-button.ibo-is-regular.ibo-is-secondary,.ui-dialog .ibo-is-regular.ibo-is-secondary.ui-button,.ui-dialog .ibo-is-secondary.ui-button,.ui-dialog .ui-button,.ui-dialog .ui-button.ui-datepicker-current,.ui-dialog .ui-button.ui-datepicker-close,.ui-dialog .ibo-is-secondary.ui-button.ui-datepicker-current,.ui-dialog .ui-button.ui-datepicker-current.ui-datepicker-close,.ui-dialog .ibo-is-secondary.ui-button.ui-datepicker-close,.ui-dialog .ui-button.ui-datepicker-close.ui-datepicker-current,.ui-dialog .ibo-is-regular.ui-button,.ui-dialog .ibo-is-regular.ui-button.ui-datepicker-current,.ui-dialog .ibo-is-regular.ui-button.ui-datepicker-close,.ibo-is-regular.ibo-is-secondary.ui-datepicker-current,.ui-dialog .ibo-is-secondary.ui-datepicker-current.ui-button,.ui-dialog .ui-datepicker-current.ui-button,.ui-dialog .ui-datepicker-current.ui-button.ui-datepicker-close,.ibo-is-secondary.ui-datepicker-current,.ui-datepicker-current,.ui-datepicker-current.ui-datepicker-close,.ibo-is-secondary.ui-datepicker-current.ui-datepicker-close,.ui-dialog .ui-datepicker-current.ui-datepicker-close.ui-button,.ui-dialog .ibo-is-regular.ui-datepicker-current.ui-button,.ibo-is-regular.ui-datepicker-current,.ibo-is-regular.ui-datepicker-current.ui-datepicker-close,.ibo-is-regular.ibo-is-secondary.ui-datepicker-close,.ui-dialog .ibo-is-secondary.ui-datepicker-close.ui-button,.ui-dialog .ui-datepicker-close.ui-button,.ui-dialog .ui-datepicker-close.ui-button.ui-datepicker-current,.ibo-is-secondary.ui-datepicker-close.ui-datepicker-current,.ui-dialog .ui-datepicker-close.ui-datepicker-current.ui-button,.ui-datepicker-close.ui-datepicker-current,.ibo-is-secondary.ui-datepicker-close,.ui-datepicker-close,.ui-dialog .ibo-is-regular.ui-datepicker-close.ui-button,.ibo-is-regular.ui-datepicker-close.ui-datepicker-current,.ibo-is-regular.ui-datepicker-close,.ui-dialog .ibo-button.ibo-is-secondary.ui-button,.ui-dialog .ibo-button.ui-button,.ui-dialog .ibo-button.ui-button.ui-datepicker-current,.ui-dialog .ibo-button.ui-button.ui-datepicker-close,.ibo-button.ibo-is-secondary.ui-datepicker-current,.ui-dialog .ibo-button.ui-datepicker-current.ui-button,.ibo-button.ui-datepicker-current,.ibo-button.ui-datepicker-current.ui-datepicker-close,.ibo-button.ibo-is-secondary.ui-datepicker-close,.ui-dialog .ibo-button.ui-datepicker-close.ui-button,.ibo-button.ui-datepicker-close.ui-datepicker-current,.ibo-button.ui-datepicker-close,.ui-dialog .ibo-button.ibo-is-regular.ui-button,.ibo-button.ibo-is-regular.ui-datepicker-current,.ibo-button.ibo-is-regular.ui-datepicker-close{background-color:#434C5E;color:#D8DEE9;box-shadow:0px 2px 0px #616e88}.ibo-button.ibo-is-regular.ibo-is-secondary:hover,.ui-dialog .ibo-is-regular.ibo-is-secondary.ui-button:hover,.ui-dialog .ibo-is-secondary.ui-button:hover,.ui-dialog .ui-button:hover,.ui-dialog .ui-button.ui-datepicker-current:hover,.ui-dialog .ui-button.ui-datepicker-close:hover,.ui-dialog .ibo-is-secondary.ui-button.ui-datepicker-current:hover,.ui-dialog .ui-button.ui-datepicker-current.ui-datepicker-close:hover,.ui-dialog .ibo-is-secondary.ui-button.ui-datepicker-close:hover,.ui-dialog .ui-button.ui-datepicker-close.ui-datepicker-current:hover,.ui-dialog .ibo-is-regular.ui-button:hover,.ui-dialog .ibo-is-regular.ui-button.ui-datepicker-current:hover,.ui-dialog .ibo-is-regular.ui-button.ui-datepicker-close:hover,.ibo-is-regular.ibo-is-secondary.ui-datepicker-current:hover,.ui-dialog .ibo-is-secondary.ui-datepicker-current.ui-button:hover,.ui-dialog .ui-datepicker-current.ui-button:hover,.ui-dialog .ui-datepicker-current.ui-button.ui-datepicker-close:hover,.ibo-is-secondary.ui-datepicker-current:hover,.ui-datepicker-current:hover,.ui-datepicker-current.ui-datepicker-close:hover,.ibo-is-secondary.ui-datepicker-current.ui-datepicker-close:hover,.ui-dialog .ui-datepicker-current.ui-datepicker-close.ui-button:hover,.ui-dialog .ibo-is-regular.ui-datepicker-current.ui-button:hover,.ibo-is-regular.ui-datepicker-current:hover,.ibo-is-regular.ui-datepicker-current.ui-datepicker-close:hover,.ibo-is-regular.ibo-is-secondary.ui-datepicker-close:hover,.ui-dialog .ibo-is-secondary.ui-datepicker-close.ui-button:hover,.ui-dialog .ui-datepicker-close.ui-button:hover,.ui-dialog .ui-datepicker-close.ui-button.ui-datepicker-current:hover,.ibo-is-secondary.ui-datepicker-close.ui-datepicker-current:hover,.ui-dialog .ui-datepicker-close.ui-datepicker-current.ui-button:hover,.ui-datepicker-close.ui-datepicker-current:hover,.ibo-is-secondary.ui-datepicker-close:hover,.ui-datepicker-close:hover,.ui-dialog .ibo-is-regular.ui-datepicker-close.ui-button:hover,.ibo-is-regular.ui-datepicker-close.ui-datepicker-current:hover,.ibo-is-regular.ui-datepicker-close:hover,.ui-dialog .ibo-button.ibo-is-secondary.ui-button:hover,.ui-dialog .ibo-button.ui-button:hover,.ui-dialog .ibo-button.ui-button.ui-datepicker-current:hover,.ui-dialog .ibo-button.ui-button.ui-datepicker-close:hover,.ibo-button.ibo-is-secondary.ui-datepicker-current:hover,.ui-dialog .ibo-button.ui-datepicker-current.ui-button:hover,.ibo-button.ui-datepicker-current:hover,.ibo-button.ui-datepicker-current.ui-datepicker-close:hover,.ibo-button.ibo-is-secondary.ui-datepicker-close:hover,.ui-dialog .ibo-button.ui-datepicker-close.ui-button:hover,.ibo-button.ui-datepicker-close.ui-datepicker-current:hover,.ibo-button.ui-datepicker-close:hover,.ui-dialog .ibo-button.ibo-is-regular.ui-button:hover,.ibo-button.ibo-is-regular.ui-datepicker-current:hover,.ibo-button.ibo-is-regular.ui-datepicker-close:hover{background-color:#4C566A;color:#E5E9F0;box-shadow:0px 2px 0px #616e88}.ibo-button.ibo-is-regular.ibo-is-secondary:active,.ui-dialog .ibo-is-regular.ibo-is-secondary.ui-button:active,.ui-dialog .ibo-is-secondary.ui-button:active,.ui-dialog .ui-button:active,.ui-dialog .ui-button.ui-datepicker-current:active,.ui-dialog .ui-button.ui-datepicker-close:active,.ui-dialog .ibo-is-secondary.ui-button.ui-datepicker-current:active,.ui-dialog .ui-button.ui-datepicker-current.ui-datepicker-close:active,.ui-dialog .ibo-is-secondary.ui-button.ui-datepicker-close:active,.ui-dialog .ui-button.ui-datepicker-close.ui-datepicker-current:active,.ui-dialog .ibo-is-regular.ui-button:active,.ui-dialog .ibo-is-regular.ui-button.ui-datepicker-current:active,.ui-dialog .ibo-is-regular.ui-button.ui-datepicker-close:active,.ibo-is-regular.ibo-is-secondary.ui-datepicker-current:active,.ui-dialog .ibo-is-secondary.ui-datepicker-current.ui-button:active,.ui-dialog .ui-datepicker-current.ui-button:active,.ui-dialog .ui-datepicker-current.ui-button.ui-datepicker-close:active,.ibo-is-secondary.ui-datepicker-current:active,.ui-datepicker-current:active,.ui-datepicker-current.ui-datepicker-close:active,.ibo-is-secondary.ui-datepicker-current.ui-datepicker-close:active,.ui-dialog .ui-datepicker-current.ui-datepicker-close.ui-button:active,.ui-dialog .ibo-is-regular.ui-datepicker-current.ui-button:active,.ibo-is-regular.ui-datepicker-current:active,.ibo-is-regular.ui-datepicker-current.ui-datepicker-close:active,.ibo-is-regular.ibo-is-secondary.ui-datepicker-close:active,.ui-dialog .ibo-is-secondary.ui-datepicker-close.ui-button:active,.ui-dialog .ui-datepicker-close.ui-button:active,.ui-dialog .ui-datepicker-close.ui-button.ui-datepicker-current:active,.ibo-is-secondary.ui-datepicker-close.ui-datepicker-current:active,.ui-dialog .ui-datepicker-close.ui-datepicker-current.ui-button:active,.ui-datepicker-close.ui-datepicker-current:active,.ibo-is-secondary.ui-datepicker-close:active,.ui-datepicker-close:active,.ui-dialog .ibo-is-regular.ui-datepicker-close.ui-button:active,.ibo-is-regular.ui-datepicker-close.ui-datepicker-current:active,.ibo-is-regular.ui-datepicker-close:active,.ui-dialog .ibo-button.ibo-is-secondary.ui-button:active,.ui-dialog .ibo-button.ui-button:active,.ui-dialog .ibo-button.ui-button.ui-datepicker-current:active,.ui-dialog .ibo-button.ui-button.ui-datepicker-close:active,.ibo-button.ibo-is-secondary.ui-datepicker-current:active,.ui-dialog .ibo-button.ui-datepicker-current.ui-button:active,.ibo-button.ui-datepicker-current:active,.ibo-button.ui-datepicker-current.ui-datepicker-close:active,.ibo-button.ibo-is-secondary.ui-datepicker-close:active,.ui-dialog .ibo-button.ui-datepicker-close.ui-button:active,.ibo-button.ui-datepicker-close.ui-datepicker-current:active,.ibo-button.ui-datepicker-close:active,.ui-dialog .ibo-button.ibo-is-regular.ui-button:active,.ibo-button.ibo-is-regular.ui-datepicker-current:active,.ibo-button.ibo-is-regular.ui-datepicker-close:active{background-color:#4C566A;color:#D8DEE9;box-shadow:inset 0px 2px 0px #616e88 , 0px 2px 0px #4C566A}.ibo-button.ibo-is-regular.ibo-is-secondary:disabled,.ui-dialog .ibo-is-regular.ibo-is-secondary.ui-button:disabled,.ui-dialog .ibo-is-secondary.ui-button:disabled,.ui-dialog .ui-button:disabled,.ui-dialog .ui-button.ui-datepicker-current:disabled,.ui-dialog .ui-button.ui-datepicker-close:disabled,.ui-dialog .ibo-is-secondary.ui-button.ui-datepicker-current:disabled,.ui-dialog .ui-button.ui-datepicker-current.ui-datepicker-close:disabled,.ui-dialog .ibo-is-secondary.ui-button.ui-datepicker-close:disabled,.ui-dialog .ui-button.ui-datepicker-close.ui-datepicker-current:disabled,.ui-dialog .ibo-is-regular.ui-button:disabled,.ui-dialog .ibo-is-regular.ui-button.ui-datepicker-current:disabled,.ui-dialog .ibo-is-regular.ui-button.ui-datepicker-close:disabled,.ibo-is-regular.ibo-is-secondary.ui-datepicker-current:disabled,.ui-dialog .ibo-is-secondary.ui-datepicker-current.ui-button:disabled,.ui-dialog .ui-datepicker-current.ui-button:disabled,.ui-dialog .ui-datepicker-current.ui-button.ui-datepicker-close:disabled,.ibo-is-secondary.ui-datepicker-current:disabled,.ui-datepicker-current:disabled,.ui-datepicker-current.ui-datepicker-close:disabled,.ibo-is-secondary.ui-datepicker-current.ui-datepicker-close:disabled,.ui-dialog .ui-datepicker-current.ui-datepicker-close.ui-button:disabled,.ui-dialog .ibo-is-regular.ui-datepicker-current.ui-button:disabled,.ibo-is-regular.ui-datepicker-current:disabled,.ibo-is-regular.ui-datepicker-current.ui-datepicker-close:disabled,.ibo-is-regular.ibo-is-secondary.ui-datepicker-close:disabled,.ui-dialog .ibo-is-secondary.ui-datepicker-close.ui-button:disabled,.ui-dialog .ui-datepicker-close.ui-button:disabled,.ui-dialog .ui-datepicker-close.ui-button.ui-datepicker-current:disabled,.ibo-is-secondary.ui-datepicker-close.ui-datepicker-current:disabled,.ui-dialog .ui-datepicker-close.ui-datepicker-current.ui-button:disabled,.ui-datepicker-close.ui-datepicker-current:disabled,.ibo-is-secondary.ui-datepicker-close:disabled,.ui-datepicker-close:disabled,.ui-dialog .ibo-is-regular.ui-datepicker-close.ui-button:disabled,.ibo-is-regular.ui-datepicker-close.ui-datepicker-current:disabled,.ibo-is-regular.ui-datepicker-close:disabled,.ui-dialog .ibo-button.ibo-is-secondary.ui-button:disabled,.ui-dialog .ibo-button.ui-button:disabled,.ui-dialog .ibo-button.ui-button.ui-datepicker-current:disabled,.ui-dialog .ibo-button.ui-button.ui-datepicker-close:disabled,.ibo-button.ibo-is-secondary.ui-datepicker-current:disabled,.ui-dialog .ibo-button.ui-datepicker-current.ui-button:disabled,.ibo-button.ui-datepicker-current:disabled,.ibo-button.ui-datepicker-current.ui-datepicker-close:disabled,.ibo-button.ibo-is-secondary.ui-datepicker-close:disabled,.ui-dialog .ibo-button.ui-datepicker-close.ui-button:disabled,.ibo-button.ui-datepicker-close.ui-datepicker-current:disabled,.ibo-button.ui-datepicker-close:disabled,.ui-dialog .ibo-button.ibo-is-regular.ui-button:disabled,.ibo-button.ibo-is-regular.ui-datepicker-current:disabled,.ibo-button.ibo-is-regular.ui-datepicker-close:disabled{background-color:#7b88a1;color:#3B4252;box-shadow:inset 0px 2px 0px #7b88a1}.ibo-button.ibo-is-regular.ibo-is-danger,.ui-dialog .ibo-is-regular.ibo-is-danger.ui-button,.ui-dialog .ibo-is-danger.ui-button,.ui-dialog .ibo-is-danger.ui-button.ui-datepicker-current,.ui-dialog .ibo-is-danger.ui-button.ui-datepicker-close,.ibo-is-regular.ibo-is-danger.ui-datepicker-current,.ui-dialog .ibo-is-danger.ui-datepicker-current.ui-button,.ibo-is-danger.ui-datepicker-current,.ibo-is-danger.ui-datepicker-current.ui-datepicker-close,.ibo-is-regular.ibo-is-danger.ui-datepicker-close,.ui-dialog .ibo-is-danger.ui-datepicker-close.ui-button,.ibo-is-danger.ui-datepicker-close.ui-datepicker-current,.ibo-is-danger.ui-datepicker-close,.ui-dialog .ibo-button.ibo-is-danger.ui-button,.ibo-button.ibo-is-danger.ui-datepicker-current,.ibo-button.ibo-is-danger.ui-datepicker-close{background-color:#b44953;color:white;box-shadow:0px 2px 0px #c97a82}.ibo-button.ibo-is-regular.ibo-is-danger:hover,.ui-dialog .ibo-is-regular.ibo-is-danger.ui-button:hover,.ui-dialog .ibo-is-danger.ui-button:hover,.ui-dialog .ibo-is-danger.ui-button.ui-datepicker-current:hover,.ui-dialog .ibo-is-danger.ui-button.ui-datepicker-close:hover,.ibo-is-regular.ibo-is-danger.ui-datepicker-current:hover,.ui-dialog .ibo-is-danger.ui-datepicker-current.ui-button:hover,.ibo-is-danger.ui-datepicker-current:hover,.ibo-is-danger.ui-datepicker-current.ui-datepicker-close:hover,.ibo-is-regular.ibo-is-danger.ui-datepicker-close:hover,.ui-dialog .ibo-is-danger.ui-datepicker-close.ui-button:hover,.ibo-is-danger.ui-datepicker-close.ui-datepicker-current:hover,.ibo-is-danger.ui-datepicker-close:hover,.ui-dialog .ibo-button.ibo-is-danger.ui-button:hover,.ibo-button.ibo-is-danger.ui-datepicker-current:hover,.ibo-button.ibo-is-danger.ui-datepicker-close:hover{background-color:#BF616A;color:white;box-shadow:0px 2px 0px #c97a82}.ibo-button.ibo-is-regular.ibo-is-danger:active,.ui-dialog .ibo-is-regular.ibo-is-danger.ui-button:active,.ui-dialog .ibo-is-danger.ui-button:active,.ui-dialog .ibo-is-danger.ui-button.ui-datepicker-current:active,.ui-dialog .ibo-is-danger.ui-button.ui-datepicker-close:active,.ibo-is-regular.ibo-is-danger.ui-datepicker-current:active,.ui-dialog .ibo-is-danger.ui-datepicker-current.ui-button:active,.ibo-is-danger.ui-datepicker-current:active,.ibo-is-danger.ui-datepicker-current.ui-datepicker-close:active,.ibo-is-regular.ibo-is-danger.ui-datepicker-close:active,.ui-dialog .ibo-is-danger.ui-datepicker-close.ui-button:active,.ibo-is-danger.ui-datepicker-close.ui-datepicker-current:active,.ibo-is-danger.ui-datepicker-close:active,.ui-dialog .ibo-button.ibo-is-danger.ui-button:active,.ibo-button.ibo-is-danger.ui-datepicker-current:active,.ibo-button.ibo-is-danger.ui-datepicker-close:active{background-color:#BF616A;color:white;box-shadow:inset 0px 2px 0px #c97a82 , 0px 2px 0px #BF616A}.ibo-button.ibo-is-regular.ibo-is-danger:disabled,.ui-dialog .ibo-is-regular.ibo-is-danger.ui-button:disabled,.ui-dialog .ibo-is-danger.ui-button:disabled,.ui-dialog .ibo-is-danger.ui-button.ui-datepicker-current:disabled,.ui-dialog .ibo-is-danger.ui-button.ui-datepicker-close:disabled,.ibo-is-regular.ibo-is-danger.ui-datepicker-current:disabled,.ui-dialog .ibo-is-danger.ui-datepicker-current.ui-button:disabled,.ibo-is-danger.ui-datepicker-current:disabled,.ibo-is-danger.ui-datepicker-current.ui-datepicker-close:disabled,.ibo-is-regular.ibo-is-danger.ui-datepicker-close:disabled,.ui-dialog .ibo-is-danger.ui-datepicker-close.ui-button:disabled,.ibo-is-danger.ui-datepicker-close.ui-datepicker-current:disabled,.ibo-is-danger.ui-datepicker-close:disabled,.ui-dialog .ibo-button.ibo-is-danger.ui-button:disabled,.ibo-button.ibo-is-danger.ui-datepicker-current:disabled,.ibo-button.ibo-is-danger.ui-datepicker-close:disabled{background-color:#7b88a1;color:#3B4252;box-shadow:inset 0px 2px 0px #7b88a1}.ibo-button.ibo-is-regular.ibo-is-success,.ui-dialog .ibo-is-regular.ibo-is-success.ui-button,.ui-dialog .ibo-is-success.ui-button,.ui-dialog .ibo-is-success.ui-button.ui-datepicker-current,.ui-dialog .ibo-is-success.ui-button.ui-datepicker-close,.ibo-is-regular.ibo-is-success.ui-datepicker-current,.ui-dialog .ibo-is-success.ui-datepicker-current.ui-button,.ibo-is-success.ui-datepicker-current,.ibo-is-success.ui-datepicker-current.ui-datepicker-close,.ibo-is-regular.ibo-is-success.ui-datepicker-close,.ui-dialog .ibo-is-success.ui-datepicker-close.ui-button,.ibo-is-success.ui-datepicker-close.ui-datepicker-current,.ibo-is-success.ui-datepicker-close,.ui-dialog .ibo-button.ibo-is-success.ui-button,.ibo-button.ibo-is-success.ui-datepicker-current,.ibo-button.ibo-is-success.ui-datepicker-close{background-color:#689f38;color:white;box-shadow:0px 2px 0px #33691e}.ibo-button.ibo-is-regular.ibo-is-success:hover,.ui-dialog .ibo-is-regular.ibo-is-success.ui-button:hover,.ui-dialog .ibo-is-success.ui-button:hover,.ui-dialog .ibo-is-success.ui-button.ui-datepicker-current:hover,.ui-dialog .ibo-is-success.ui-button.ui-datepicker-close:hover,.ibo-is-regular.ibo-is-success.ui-datepicker-current:hover,.ui-dialog .ibo-is-success.ui-datepicker-current.ui-button:hover,.ibo-is-success.ui-datepicker-current:hover,.ibo-is-success.ui-datepicker-current.ui-datepicker-close:hover,.ibo-is-regular.ibo-is-success.ui-datepicker-close:hover,.ui-dialog .ibo-is-success.ui-datepicker-close.ui-button:hover,.ibo-is-success.ui-datepicker-close.ui-datepicker-current:hover,.ibo-is-success.ui-datepicker-close:hover,.ui-dialog .ibo-button.ibo-is-success.ui-button:hover,.ibo-button.ibo-is-success.ui-datepicker-current:hover,.ibo-button.ibo-is-success.ui-datepicker-close:hover{background-color:#558b2f;color:white;box-shadow:0px 2px 0px #33691e}.ibo-button.ibo-is-regular.ibo-is-success:active,.ui-dialog .ibo-is-regular.ibo-is-success.ui-button:active,.ui-dialog .ibo-is-success.ui-button:active,.ui-dialog .ibo-is-success.ui-button.ui-datepicker-current:active,.ui-dialog .ibo-is-success.ui-button.ui-datepicker-close:active,.ibo-is-regular.ibo-is-success.ui-datepicker-current:active,.ui-dialog .ibo-is-success.ui-datepicker-current.ui-button:active,.ibo-is-success.ui-datepicker-current:active,.ibo-is-success.ui-datepicker-current.ui-datepicker-close:active,.ibo-is-regular.ibo-is-success.ui-datepicker-close:active,.ui-dialog .ibo-is-success.ui-datepicker-close.ui-button:active,.ibo-is-success.ui-datepicker-close.ui-datepicker-current:active,.ibo-is-success.ui-datepicker-close:active,.ui-dialog .ibo-button.ibo-is-success.ui-button:active,.ibo-button.ibo-is-success.ui-datepicker-current:active,.ibo-button.ibo-is-success.ui-datepicker-close:active{background-color:#558b2f;color:white;box-shadow:inset 0px 2px 0px #33691e , 0px 2px 0px #558b2f}.ibo-button.ibo-is-regular.ibo-is-success:disabled,.ui-dialog .ibo-is-regular.ibo-is-success.ui-button:disabled,.ui-dialog .ibo-is-success.ui-button:disabled,.ui-dialog .ibo-is-success.ui-button.ui-datepicker-current:disabled,.ui-dialog .ibo-is-success.ui-button.ui-datepicker-close:disabled,.ibo-is-regular.ibo-is-success.ui-datepicker-current:disabled,.ui-dialog .ibo-is-success.ui-datepicker-current.ui-button:disabled,.ibo-is-success.ui-datepicker-current:disabled,.ibo-is-success.ui-datepicker-current.ui-datepicker-close:disabled,.ibo-is-regular.ibo-is-success.ui-datepicker-close:disabled,.ui-dialog .ibo-is-success.ui-datepicker-close.ui-button:disabled,.ibo-is-success.ui-datepicker-close.ui-datepicker-current:disabled,.ibo-is-success.ui-datepicker-close:disabled,.ui-dialog .ibo-button.ibo-is-success.ui-button:disabled,.ibo-button.ibo-is-success.ui-datepicker-current:disabled,.ibo-button.ibo-is-success.ui-datepicker-close:disabled{background-color:#7b88a1;color:#3B4252;box-shadow:inset 0px 2px 0px #7b88a1}.ibo-button.ibo-is-regular.ibo-is-red,.ui-dialog .ibo-is-regular.ibo-is-red.ui-button,.ui-dialog .ibo-is-red.ui-button,.ui-dialog .ibo-is-red.ui-button.ui-datepicker-current,.ui-dialog .ibo-is-red.ui-button.ui-datepicker-close,.ibo-is-regular.ibo-is-red.ui-datepicker-current,.ui-dialog .ibo-is-red.ui-datepicker-current.ui-button,.ibo-is-red.ui-datepicker-current,.ibo-is-red.ui-datepicker-current.ui-datepicker-close,.ibo-is-regular.ibo-is-red.ui-datepicker-close,.ui-dialog .ibo-is-red.ui-datepicker-close.ui-button,.ibo-is-red.ui-datepicker-close.ui-datepicker-current,.ibo-is-red.ui-datepicker-close,.ui-dialog .ibo-button.ibo-is-red.ui-button,.ibo-button.ibo-is-red.ui-datepicker-current,.ibo-button.ibo-is-red.ui-datepicker-close{background-color:#b44953;color:white;box-shadow:0px 2px 0px #c97a82}.ibo-button.ibo-is-regular.ibo-is-red:hover,.ui-dialog .ibo-is-regular.ibo-is-red.ui-button:hover,.ui-dialog .ibo-is-red.ui-button:hover,.ui-dialog .ibo-is-red.ui-button.ui-datepicker-current:hover,.ui-dialog .ibo-is-red.ui-button.ui-datepicker-close:hover,.ibo-is-regular.ibo-is-red.ui-datepicker-current:hover,.ui-dialog .ibo-is-red.ui-datepicker-current.ui-button:hover,.ibo-is-red.ui-datepicker-current:hover,.ibo-is-red.ui-datepicker-current.ui-datepicker-close:hover,.ibo-is-regular.ibo-is-red.ui-datepicker-close:hover,.ui-dialog .ibo-is-red.ui-datepicker-close.ui-button:hover,.ibo-is-red.ui-datepicker-close.ui-datepicker-current:hover,.ibo-is-red.ui-datepicker-close:hover,.ui-dialog .ibo-button.ibo-is-red.ui-button:hover,.ibo-button.ibo-is-red.ui-datepicker-current:hover,.ibo-button.ibo-is-red.ui-datepicker-close:hover{background-color:#BF616A;color:white;box-shadow:0px 2px 0px #c97a82}.ibo-button.ibo-is-regular.ibo-is-red:active,.ui-dialog .ibo-is-regular.ibo-is-red.ui-button:active,.ui-dialog .ibo-is-red.ui-button:active,.ui-dialog .ibo-is-red.ui-button.ui-datepicker-current:active,.ui-dialog .ibo-is-red.ui-button.ui-datepicker-close:active,.ibo-is-regular.ibo-is-red.ui-datepicker-current:active,.ui-dialog .ibo-is-red.ui-datepicker-current.ui-button:active,.ibo-is-red.ui-datepicker-current:active,.ibo-is-red.ui-datepicker-current.ui-datepicker-close:active,.ibo-is-regular.ibo-is-red.ui-datepicker-close:active,.ui-dialog .ibo-is-red.ui-datepicker-close.ui-button:active,.ibo-is-red.ui-datepicker-close.ui-datepicker-current:active,.ibo-is-red.ui-datepicker-close:active,.ui-dialog .ibo-button.ibo-is-red.ui-button:active,.ibo-button.ibo-is-red.ui-datepicker-current:active,.ibo-button.ibo-is-red.ui-datepicker-close:active{background-color:#BF616A;color:white;box-shadow:inset 0px 2px 0px #c97a82 , 0px 2px 0px #BF616A}.ibo-button.ibo-is-regular.ibo-is-red:disabled,.ui-dialog .ibo-is-regular.ibo-is-red.ui-button:disabled,.ui-dialog .ibo-is-red.ui-button:disabled,.ui-dialog .ibo-is-red.ui-button.ui-datepicker-current:disabled,.ui-dialog .ibo-is-red.ui-button.ui-datepicker-close:disabled,.ibo-is-regular.ibo-is-red.ui-datepicker-current:disabled,.ui-dialog .ibo-is-red.ui-datepicker-current.ui-button:disabled,.ibo-is-red.ui-datepicker-current:disabled,.ibo-is-red.ui-datepicker-current.ui-datepicker-close:disabled,.ibo-is-regular.ibo-is-red.ui-datepicker-close:disabled,.ui-dialog .ibo-is-red.ui-datepicker-close.ui-button:disabled,.ibo-is-red.ui-datepicker-close.ui-datepicker-current:disabled,.ibo-is-red.ui-datepicker-close:disabled,.ui-dialog .ibo-button.ibo-is-red.ui-button:disabled,.ibo-button.ibo-is-red.ui-datepicker-current:disabled,.ibo-button.ibo-is-red.ui-datepicker-close:disabled{background-color:#7b88a1;color:#3B4252;box-shadow:inset 0px 2px 0px #7b88a1}.ibo-button.ibo-is-regular.ibo-is-green,.ui-dialog .ibo-is-regular.ibo-is-green.ui-button,.ui-dialog .ibo-is-green.ui-button,.ui-dialog .ibo-is-green.ui-button.ui-datepicker-current,.ui-dialog .ibo-is-green.ui-button.ui-datepicker-close,.ibo-is-regular.ibo-is-green.ui-datepicker-current,.ui-dialog .ibo-is-green.ui-datepicker-current.ui-button,.ibo-is-green.ui-datepicker-current,.ibo-is-green.ui-datepicker-current.ui-datepicker-close,.ibo-is-regular.ibo-is-green.ui-datepicker-close,.ui-dialog .ibo-is-green.ui-datepicker-close.ui-button,.ibo-is-green.ui-datepicker-close.ui-datepicker-current,.ibo-is-green.ui-datepicker-close,.ui-dialog .ibo-button.ibo-is-green.ui-button,.ibo-button.ibo-is-green.ui-datepicker-current,.ibo-button.ibo-is-green.ui-datepicker-close{background-color:#689f38;color:white;box-shadow:0px 2px 0px #33691e}.ibo-button.ibo-is-regular.ibo-is-green:hover,.ui-dialog .ibo-is-regular.ibo-is-green.ui-button:hover,.ui-dialog .ibo-is-green.ui-button:hover,.ui-dialog .ibo-is-green.ui-button.ui-datepicker-current:hover,.ui-dialog .ibo-is-green.ui-button.ui-datepicker-close:hover,.ibo-is-regular.ibo-is-green.ui-datepicker-current:hover,.ui-dialog .ibo-is-green.ui-datepicker-current.ui-button:hover,.ibo-is-green.ui-datepicker-current:hover,.ibo-is-green.ui-datepicker-current.ui-datepicker-close:hover,.ibo-is-regular.ibo-is-green.ui-datepicker-close:hover,.ui-dialog .ibo-is-green.ui-datepicker-close.ui-button:hover,.ibo-is-green.ui-datepicker-close.ui-datepicker-current:hover,.ibo-is-green.ui-datepicker-close:hover,.ui-dialog .ibo-button.ibo-is-green.ui-button:hover,.ibo-button.ibo-is-green.ui-datepicker-current:hover,.ibo-button.ibo-is-green.ui-datepicker-close:hover{background-color:#558b2f;color:white;box-shadow:0px 2px 0px #33691e}.ibo-button.ibo-is-regular.ibo-is-green:active,.ui-dialog .ibo-is-regular.ibo-is-green.ui-button:active,.ui-dialog .ibo-is-green.ui-button:active,.ui-dialog .ibo-is-green.ui-button.ui-datepicker-current:active,.ui-dialog .ibo-is-green.ui-button.ui-datepicker-close:active,.ibo-is-regular.ibo-is-green.ui-datepicker-current:active,.ui-dialog .ibo-is-green.ui-datepicker-current.ui-button:active,.ibo-is-green.ui-datepicker-current:active,.ibo-is-green.ui-datepicker-current.ui-datepicker-close:active,.ibo-is-regular.ibo-is-green.ui-datepicker-close:active,.ui-dialog .ibo-is-green.ui-datepicker-close.ui-button:active,.ibo-is-green.ui-datepicker-close.ui-datepicker-current:active,.ibo-is-green.ui-datepicker-close:active,.ui-dialog .ibo-button.ibo-is-green.ui-button:active,.ibo-button.ibo-is-green.ui-datepicker-current:active,.ibo-button.ibo-is-green.ui-datepicker-close:active{background-color:#558b2f;color:white;box-shadow:inset 0px 2px 0px #33691e , 0px 2px 0px #558b2f}.ibo-button.ibo-is-regular.ibo-is-green:disabled,.ui-dialog .ibo-is-regular.ibo-is-green.ui-button:disabled,.ui-dialog .ibo-is-green.ui-button:disabled,.ui-dialog .ibo-is-green.ui-button.ui-datepicker-current:disabled,.ui-dialog .ibo-is-green.ui-button.ui-datepicker-close:disabled,.ibo-is-regular.ibo-is-green.ui-datepicker-current:disabled,.ui-dialog .ibo-is-green.ui-datepicker-current.ui-button:disabled,.ibo-is-green.ui-datepicker-current:disabled,.ibo-is-green.ui-datepicker-current.ui-datepicker-close:disabled,.ibo-is-regular.ibo-is-green.ui-datepicker-close:disabled,.ui-dialog .ibo-is-green.ui-datepicker-close.ui-button:disabled,.ibo-is-green.ui-datepicker-close.ui-datepicker-current:disabled,.ibo-is-green.ui-datepicker-close:disabled,.ui-dialog .ibo-button.ibo-is-green.ui-button:disabled,.ibo-button.ibo-is-green.ui-datepicker-current:disabled,.ibo-button.ibo-is-green.ui-datepicker-close:disabled{background-color:#7b88a1;color:#3B4252;box-shadow:inset 0px 2px 0px #7b88a1}.ibo-button.ibo-is-regular.ibo-is-cyan,.ui-dialog .ibo-is-regular.ibo-is-cyan.ui-button,.ui-dialog .ibo-is-cyan.ui-button,.ui-dialog .ibo-is-cyan.ui-button.ui-datepicker-current,.ui-dialog .ibo-is-cyan.ui-button.ui-datepicker-close,.ibo-is-regular.ibo-is-cyan.ui-datepicker-current,.ui-dialog .ibo-is-cyan.ui-datepicker-current.ui-button,.ibo-is-cyan.ui-datepicker-current,.ibo-is-cyan.ui-datepicker-current.ui-datepicker-close,.ibo-is-regular.ibo-is-cyan.ui-datepicker-close,.ui-dialog .ibo-is-cyan.ui-datepicker-close.ui-button,.ibo-is-cyan.ui-datepicker-close.ui-datepicker-current,.ibo-is-cyan.ui-datepicker-close,.ui-dialog .ibo-button.ibo-is-cyan.ui-button,.ibo-button.ibo-is-cyan.ui-datepicker-current,.ibo-button.ibo-is-cyan.ui-datepicker-close{background-color:#00bbd4;color:white;box-shadow:0px 2px 0px #006164}.ibo-button.ibo-is-regular.ibo-is-cyan:hover,.ui-dialog .ibo-is-regular.ibo-is-cyan.ui-button:hover,.ui-dialog .ibo-is-cyan.ui-button:hover,.ui-dialog .ibo-is-cyan.ui-button.ui-datepicker-current:hover,.ui-dialog .ibo-is-cyan.ui-button.ui-datepicker-close:hover,.ibo-is-regular.ibo-is-cyan.ui-datepicker-current:hover,.ui-dialog .ibo-is-cyan.ui-datepicker-current.ui-button:hover,.ibo-is-cyan.ui-datepicker-current:hover,.ibo-is-cyan.ui-datepicker-current.ui-datepicker-close:hover,.ibo-is-regular.ibo-is-cyan.ui-datepicker-close:hover,.ui-dialog .ibo-is-cyan.ui-datepicker-close.ui-button:hover,.ibo-is-cyan.ui-datepicker-close.ui-datepicker-current:hover,.ibo-is-cyan.ui-datepicker-close:hover,.ui-dialog .ibo-button.ibo-is-cyan.ui-button:hover,.ibo-button.ibo-is-cyan.ui-datepicker-current:hover,.ibo-button.ibo-is-cyan.ui-datepicker-close:hover{background-color:#0096a7;color:white;box-shadow:0px 2px 0px #006164}.ibo-button.ibo-is-regular.ibo-is-cyan:active,.ui-dialog .ibo-is-regular.ibo-is-cyan.ui-button:active,.ui-dialog .ibo-is-cyan.ui-button:active,.ui-dialog .ibo-is-cyan.ui-button.ui-datepicker-current:active,.ui-dialog .ibo-is-cyan.ui-button.ui-datepicker-close:active,.ibo-is-regular.ibo-is-cyan.ui-datepicker-current:active,.ui-dialog .ibo-is-cyan.ui-datepicker-current.ui-button:active,.ibo-is-cyan.ui-datepicker-current:active,.ibo-is-cyan.ui-datepicker-current.ui-datepicker-close:active,.ibo-is-regular.ibo-is-cyan.ui-datepicker-close:active,.ui-dialog .ibo-is-cyan.ui-datepicker-close.ui-button:active,.ibo-is-cyan.ui-datepicker-close.ui-datepicker-current:active,.ibo-is-cyan.ui-datepicker-close:active,.ui-dialog .ibo-button.ibo-is-cyan.ui-button:active,.ibo-button.ibo-is-cyan.ui-datepicker-current:active,.ibo-button.ibo-is-cyan.ui-datepicker-close:active{background-color:#0096a7;color:white;box-shadow:inset 0px 2px 0px #006164 , 0px 2px 0px #0096a7}.ibo-button.ibo-is-regular.ibo-is-cyan:disabled,.ui-dialog .ibo-is-regular.ibo-is-cyan.ui-button:disabled,.ui-dialog .ibo-is-cyan.ui-button:disabled,.ui-dialog .ibo-is-cyan.ui-button.ui-datepicker-current:disabled,.ui-dialog .ibo-is-cyan.ui-button.ui-datepicker-close:disabled,.ibo-is-regular.ibo-is-cyan.ui-datepicker-current:disabled,.ui-dialog .ibo-is-cyan.ui-datepicker-current.ui-button:disabled,.ibo-is-cyan.ui-datepicker-current:disabled,.ibo-is-cyan.ui-datepicker-current.ui-datepicker-close:disabled,.ibo-is-regular.ibo-is-cyan.ui-datepicker-close:disabled,.ui-dialog .ibo-is-cyan.ui-datepicker-close.ui-button:disabled,.ibo-is-cyan.ui-datepicker-close.ui-datepicker-current:disabled,.ibo-is-cyan.ui-datepicker-close:disabled,.ui-dialog .ibo-button.ibo-is-cyan.ui-button:disabled,.ibo-button.ibo-is-cyan.ui-datepicker-current:disabled,.ibo-button.ibo-is-cyan.ui-datepicker-close:disabled{background-color:#7b88a1;color:#3B4252;box-shadow:inset 0px 2px 0px #7b88a1}.ibo-button.ibo-is-alternative.ibo-is-neutral,.ui-dialog .ibo-is-alternative.ibo-is-neutral.ui-button,.ui-dialog .ibo-is-neutral.ui-button.ui-dialog-titlebar-close,.ui-dialog .ui-button.ui-dialog-titlebar-close,.ui-dialog .ibo-is-alternative.ui-button.ui-dialog-titlebar-close,.ibo-is-alternative.ibo-is-neutral.ui-datepicker-current,.ui-dialog .ibo-is-neutral.ui-datepicker-current.ui-button.ui-dialog-titlebar-close,.ui-dialog .ui-datepicker-current.ui-button.ui-dialog-titlebar-close,.ui-dialog .ibo-is-alternative.ui-datepicker-current.ui-button.ui-dialog-titlebar-close,.ibo-is-alternative.ibo-is-neutral.ui-datepicker-close,.ui-dialog .ibo-is-neutral.ui-datepicker-close.ui-button.ui-dialog-titlebar-close,.ui-dialog .ui-datepicker-close.ui-button.ui-dialog-titlebar-close,.ui-dialog .ibo-is-alternative.ui-datepicker-close.ui-button.ui-dialog-titlebar-close,.ui-dialog .ibo-button.ibo-is-neutral.ui-button.ui-dialog-titlebar-close,.ui-dialog .ibo-is-neutral.ui-button.ui-dialog-titlebar-close.ui-datepicker-current,.ui-dialog .ui-button.ui-dialog-titlebar-close.ui-datepicker-current,.ui-dialog .ibo-is-neutral.ui-button.ui-dialog-titlebar-close.ui-datepicker-close,.ui-dialog .ui-button.ui-dialog-titlebar-close.ui-datepicker-close,.ui-dialog .ibo-button.ui-button.ui-dialog-titlebar-close,.ui-dialog .ibo-button.ibo-is-alternative.ui-button.ui-dialog-titlebar-close,.ui-dialog .ibo-is-alternative.ui-button.ui-dialog-titlebar-close.ui-datepicker-current,.ui-dialog .ibo-is-alternative.ui-button.ui-dialog-titlebar-close.ui-datepicker-close{background-color:transparent;color:#7b88a1;box-shadow:0px 2px 0px transparent}.ibo-button.ibo-is-alternative.ibo-is-neutral:hover,.ui-dialog .ibo-is-alternative.ibo-is-neutral.ui-button:hover,.ui-dialog .ibo-is-neutral.ui-button.ui-dialog-titlebar-close:hover,.ui-dialog .ui-button.ui-dialog-titlebar-close:hover,.ui-dialog .ibo-is-alternative.ui-button.ui-dialog-titlebar-close:hover,.ibo-is-alternative.ibo-is-neutral.ui-datepicker-current:hover,.ui-dialog .ibo-is-neutral.ui-datepicker-current.ui-button.ui-dialog-titlebar-close:hover,.ui-dialog .ui-datepicker-current.ui-button.ui-dialog-titlebar-close:hover,.ui-dialog .ibo-is-alternative.ui-datepicker-current.ui-button.ui-dialog-titlebar-close:hover,.ibo-is-alternative.ibo-is-neutral.ui-datepicker-close:hover,.ui-dialog .ibo-is-neutral.ui-datepicker-close.ui-button.ui-dialog-titlebar-close:hover,.ui-dialog .ui-datepicker-close.ui-button.ui-dialog-titlebar-close:hover,.ui-dialog .ibo-is-alternative.ui-datepicker-close.ui-button.ui-dialog-titlebar-close:hover,.ui-dialog .ibo-button.ibo-is-neutral.ui-button.ui-dialog-titlebar-close:hover,.ui-dialog .ibo-is-neutral.ui-button.ui-dialog-titlebar-close.ui-datepicker-current:hover,.ui-dialog .ui-button.ui-dialog-titlebar-close.ui-datepicker-current:hover,.ui-dialog .ibo-is-neutral.ui-button.ui-dialog-titlebar-close.ui-datepicker-close:hover,.ui-dialog .ui-button.ui-dialog-titlebar-close.ui-datepicker-close:hover,.ui-dialog .ibo-button.ui-button.ui-dialog-titlebar-close:hover,.ui-dialog .ibo-button.ibo-is-alternative.ui-button.ui-dialog-titlebar-close:hover,.ui-dialog .ibo-is-alternative.ui-button.ui-dialog-titlebar-close.ui-datepicker-current:hover,.ui-dialog .ibo-is-alternative.ui-button.ui-dialog-titlebar-close.ui-datepicker-close:hover{background-color:#3B4252;color:#7b88a1;box-shadow:0px 2px 0px #3B4252}.ibo-button.ibo-is-alternative.ibo-is-neutral:active,.ui-dialog .ibo-is-alternative.ibo-is-neutral.ui-button:active,.ui-dialog .ibo-is-neutral.ui-button.ui-dialog-titlebar-close:active,.ui-dialog .ui-button.ui-dialog-titlebar-close:active,.ui-dialog .ibo-is-alternative.ui-button.ui-dialog-titlebar-close:active,.ibo-is-alternative.ibo-is-neutral.ui-datepicker-current:active,.ui-dialog .ibo-is-neutral.ui-datepicker-current.ui-button.ui-dialog-titlebar-close:active,.ui-dialog .ui-datepicker-current.ui-button.ui-dialog-titlebar-close:active,.ui-dialog .ibo-is-alternative.ui-datepicker-current.ui-button.ui-dialog-titlebar-close:active,.ibo-is-alternative.ibo-is-neutral.ui-datepicker-close:active,.ui-dialog .ibo-is-neutral.ui-datepicker-close.ui-button.ui-dialog-titlebar-close:active,.ui-dialog .ui-datepicker-close.ui-button.ui-dialog-titlebar-close:active,.ui-dialog .ibo-is-alternative.ui-datepicker-close.ui-button.ui-dialog-titlebar-close:active,.ui-dialog .ibo-button.ibo-is-neutral.ui-button.ui-dialog-titlebar-close:active,.ui-dialog .ibo-is-neutral.ui-button.ui-dialog-titlebar-close.ui-datepicker-current:active,.ui-dialog .ui-button.ui-dialog-titlebar-close.ui-datepicker-current:active,.ui-dialog .ibo-is-neutral.ui-button.ui-dialog-titlebar-close.ui-datepicker-close:active,.ui-dialog .ui-button.ui-dialog-titlebar-close.ui-datepicker-close:active,.ui-dialog .ibo-button.ui-button.ui-dialog-titlebar-close:active,.ui-dialog .ibo-button.ibo-is-alternative.ui-button.ui-dialog-titlebar-close:active,.ui-dialog .ibo-is-alternative.ui-button.ui-dialog-titlebar-close.ui-datepicker-current:active,.ui-dialog .ibo-is-alternative.ui-button.ui-dialog-titlebar-close.ui-datepicker-close:active{background-color:#3B4252;color:#7b88a1;box-shadow:inset 0px 2px 0px #3B4252 , 0px 2px 0px #3B4252}.ibo-button.ibo-is-alternative.ibo-is-neutral:disabled,.ui-dialog .ibo-is-alternative.ibo-is-neutral.ui-button:disabled,.ui-dialog .ibo-is-neutral.ui-button.ui-dialog-titlebar-close:disabled,.ui-dialog .ui-button.ui-dialog-titlebar-close:disabled,.ui-dialog .ibo-is-alternative.ui-button.ui-dialog-titlebar-close:disabled,.ibo-is-alternative.ibo-is-neutral.ui-datepicker-current:disabled,.ui-dialog .ibo-is-neutral.ui-datepicker-current.ui-button.ui-dialog-titlebar-close:disabled,.ui-dialog .ui-datepicker-current.ui-button.ui-dialog-titlebar-close:disabled,.ui-dialog .ibo-is-alternative.ui-datepicker-current.ui-button.ui-dialog-titlebar-close:disabled,.ibo-is-alternative.ibo-is-neutral.ui-datepicker-close:disabled,.ui-dialog .ibo-is-neutral.ui-datepicker-close.ui-button.ui-dialog-titlebar-close:disabled,.ui-dialog .ui-datepicker-close.ui-button.ui-dialog-titlebar-close:disabled,.ui-dialog .ibo-is-alternative.ui-datepicker-close.ui-button.ui-dialog-titlebar-close:disabled,.ui-dialog .ibo-button.ibo-is-neutral.ui-button.ui-dialog-titlebar-close:disabled,.ui-dialog .ibo-is-neutral.ui-button.ui-dialog-titlebar-close.ui-datepicker-current:disabled,.ui-dialog .ui-button.ui-dialog-titlebar-close.ui-datepicker-current:disabled,.ui-dialog .ibo-is-neutral.ui-button.ui-dialog-titlebar-close.ui-datepicker-close:disabled,.ui-dialog .ui-button.ui-dialog-titlebar-close.ui-datepicker-close:disabled,.ui-dialog .ibo-button.ui-button.ui-dialog-titlebar-close:disabled,.ui-dialog .ibo-button.ibo-is-alternative.ui-button.ui-dialog-titlebar-close:disabled,.ui-dialog .ibo-is-alternative.ui-button.ui-dialog-titlebar-close.ui-datepicker-current:disabled,.ui-dialog .ibo-is-alternative.ui-button.ui-dialog-titlebar-close.ui-datepicker-close:disabled{background-color:transparent;color:#434C5E;box-shadow:inset 0px 2px 0px transparent}.ibo-button.ibo-is-alternative.ibo-is-primary,.ui-dialog .ibo-is-alternative.ibo-is-primary.ui-button,.ui-dialog .ibo-is-primary.ui-button.ui-dialog-titlebar-close,.ibo-is-alternative.ibo-is-primary.ui-datepicker-current,.ui-dialog .ibo-is-primary.ui-datepicker-current.ui-button.ui-dialog-titlebar-close,.ibo-is-alternative.ibo-is-primary.ui-datepicker-close,.ui-dialog .ibo-is-primary.ui-datepicker-close.ui-button.ui-dialog-titlebar-close,.ui-dialog .ibo-button.ibo-is-primary.ui-button.ui-dialog-titlebar-close,.ui-dialog .ibo-is-primary.ui-button.ui-dialog-titlebar-close.ui-datepicker-current,.ui-dialog .ibo-is-primary.ui-button.ui-dialog-titlebar-close.ui-datepicker-close{background-color:transparent;color:#88C0D0;box-shadow:0px 2px 0px transparent}.ibo-button.ibo-is-alternative.ibo-is-primary:hover,.ui-dialog .ibo-is-alternative.ibo-is-primary.ui-button:hover,.ui-dialog .ibo-is-primary.ui-button.ui-dialog-titlebar-close:hover,.ibo-is-alternative.ibo-is-primary.ui-datepicker-current:hover,.ui-dialog .ibo-is-primary.ui-datepicker-current.ui-button.ui-dialog-titlebar-close:hover,.ibo-is-alternative.ibo-is-primary.ui-datepicker-close:hover,.ui-dialog .ibo-is-primary.ui-datepicker-close.ui-button.ui-dialog-titlebar-close:hover,.ui-dialog .ibo-button.ibo-is-primary.ui-button.ui-dialog-titlebar-close:hover,.ui-dialog .ibo-is-primary.ui-button.ui-dialog-titlebar-close.ui-datepicker-current:hover,.ui-dialog .ibo-is-primary.ui-button.ui-dialog-titlebar-close.ui-datepicker-close:hover{background-color:#384f6c;color:#88C0D0;box-shadow:0px 2px 0px #384f6c}.ibo-button.ibo-is-alternative.ibo-is-primary:active,.ui-dialog .ibo-is-alternative.ibo-is-primary.ui-button:active,.ui-dialog .ibo-is-primary.ui-button.ui-dialog-titlebar-close:active,.ibo-is-alternative.ibo-is-primary.ui-datepicker-current:active,.ui-dialog .ibo-is-primary.ui-datepicker-current.ui-button.ui-dialog-titlebar-close:active,.ibo-is-alternative.ibo-is-primary.ui-datepicker-close:active,.ui-dialog .ibo-is-primary.ui-datepicker-close.ui-button.ui-dialog-titlebar-close:active,.ui-dialog .ibo-button.ibo-is-primary.ui-button.ui-dialog-titlebar-close:active,.ui-dialog .ibo-is-primary.ui-button.ui-dialog-titlebar-close.ui-datepicker-current:active,.ui-dialog .ibo-is-primary.ui-button.ui-dialog-titlebar-close.ui-datepicker-close:active{background-color:#384f6c;color:#88C0D0;box-shadow:inset 0px 2px 0px #384f6c , 0px 2px 0px #384f6c}.ibo-button.ibo-is-alternative.ibo-is-primary:disabled,.ui-dialog .ibo-is-alternative.ibo-is-primary.ui-button:disabled,.ui-dialog .ibo-is-primary.ui-button.ui-dialog-titlebar-close:disabled,.ibo-is-alternative.ibo-is-primary.ui-datepicker-current:disabled,.ui-dialog .ibo-is-primary.ui-datepicker-current.ui-button.ui-dialog-titlebar-close:disabled,.ibo-is-alternative.ibo-is-primary.ui-datepicker-close:disabled,.ui-dialog .ibo-is-primary.ui-datepicker-close.ui-button.ui-dialog-titlebar-close:disabled,.ui-dialog .ibo-button.ibo-is-primary.ui-button.ui-dialog-titlebar-close:disabled,.ui-dialog .ibo-is-primary.ui-button.ui-dialog-titlebar-close.ui-datepicker-current:disabled,.ui-dialog .ibo-is-primary.ui-button.ui-dialog-titlebar-close.ui-datepicker-close:disabled{background-color:transparent;color:#434C5E;box-shadow:inset 0px 2px 0px transparent}.ibo-button.ibo-is-alternative.ibo-is-secondary,.ui-dialog .ibo-is-alternative.ibo-is-secondary.ui-button,.ui-dialog .ibo-is-secondary.ui-button.ui-dialog-titlebar-close,.ui-dialog .ui-button.ui-dialog-titlebar-close,.ui-dialog .ui-button.ui-dialog-titlebar-close.ui-datepicker-current,.ui-dialog .ui-button.ui-dialog-titlebar-close.ui-datepicker-close,.ui-dialog .ibo-is-alternative.ui-button,.ui-dialog .ibo-is-alternative.ui-button.ui-datepicker-current,.ui-dialog .ui-button.ui-datepicker-current.ui-dialog-titlebar-close,.ui-dialog .ibo-is-alternative.ui-button.ui-datepicker-close,.ui-dialog .ui-button.ui-datepicker-close.ui-dialog-titlebar-close,.ibo-is-alternative.ibo-is-secondary.ui-datepicker-current,.ui-dialog .ibo-is-secondary.ui-datepicker-current.ui-button.ui-dialog-titlebar-close,.ui-dialog .ui-datepicker-current.ui-button.ui-dialog-titlebar-close,.ui-dialog .ui-datepicker-current.ui-button.ui-dialog-titlebar-close.ui-datepicker-close,.ui-dialog .ibo-is-alternative.ui-datepicker-current.ui-button,.ibo-is-alternative.ui-datepicker-current,.ibo-is-alternative.ui-datepicker-current.ui-datepicker-close,.ui-dialog .ui-datepicker-current.ui-datepicker-close.ui-button.ui-dialog-titlebar-close,.ibo-is-alternative.ibo-is-secondary.ui-datepicker-close,.ui-dialog .ibo-is-secondary.ui-datepicker-close.ui-button.ui-dialog-titlebar-close,.ui-dialog .ui-datepicker-close.ui-button.ui-dialog-titlebar-close,.ui-dialog .ui-datepicker-close.ui-button.ui-dialog-titlebar-close.ui-datepicker-current,.ui-dialog .ibo-is-alternative.ui-datepicker-close.ui-button,.ibo-is-alternative.ui-datepicker-close.ui-datepicker-current,.ui-dialog .ui-datepicker-close.ui-datepicker-current.ui-button.ui-dialog-titlebar-close,.ibo-is-alternative.ui-datepicker-close,.ui-dialog .ibo-button.ibo-is-secondary.ui-button.ui-dialog-titlebar-close,.ui-dialog .ibo-is-secondary.ui-button.ui-dialog-titlebar-close.ui-datepicker-current,.ui-dialog .ui-button.ui-dialog-titlebar-close.ui-datepicker-current.ui-datepicker-close,.ui-dialog .ibo-is-secondary.ui-button.ui-dialog-titlebar-close.ui-datepicker-close,.ui-dialog .ui-button.ui-dialog-titlebar-close.ui-datepicker-close.ui-datepicker-current,.ui-dialog .ibo-button.ui-button.ui-dialog-titlebar-close,.ui-dialog .ibo-button.ui-button.ui-dialog-titlebar-close.ui-datepicker-current,.ui-dialog .ibo-button.ui-button.ui-dialog-titlebar-close.ui-datepicker-close,.ui-dialog .ibo-button.ibo-is-alternative.ui-button,.ibo-button.ibo-is-alternative.ui-datepicker-current,.ui-dialog .ibo-button.ui-datepicker-current.ui-button.ui-dialog-titlebar-close,.ibo-button.ibo-is-alternative.ui-datepicker-close,.ui-dialog .ibo-button.ui-datepicker-close.ui-button.ui-dialog-titlebar-close{background-color:transparent;color:#7b88a1;box-shadow:0px 2px 0px transparent}.ibo-button.ibo-is-alternative.ibo-is-secondary:hover,.ui-dialog .ibo-is-alternative.ibo-is-secondary.ui-button:hover,.ui-dialog .ibo-is-secondary.ui-button.ui-dialog-titlebar-close:hover,.ui-dialog .ui-button.ui-dialog-titlebar-close:hover,.ui-dialog .ui-button.ui-dialog-titlebar-close.ui-datepicker-current:hover,.ui-dialog .ui-button.ui-dialog-titlebar-close.ui-datepicker-close:hover,.ui-dialog .ibo-is-alternative.ui-button:hover,.ui-dialog .ibo-is-alternative.ui-button.ui-datepicker-current:hover,.ui-dialog .ui-button.ui-datepicker-current.ui-dialog-titlebar-close:hover,.ui-dialog .ibo-is-alternative.ui-button.ui-datepicker-close:hover,.ui-dialog .ui-button.ui-datepicker-close.ui-dialog-titlebar-close:hover,.ibo-is-alternative.ibo-is-secondary.ui-datepicker-current:hover,.ui-dialog .ibo-is-secondary.ui-datepicker-current.ui-button.ui-dialog-titlebar-close:hover,.ui-dialog .ui-datepicker-current.ui-button.ui-dialog-titlebar-close:hover,.ui-dialog .ui-datepicker-current.ui-button.ui-dialog-titlebar-close.ui-datepicker-close:hover,.ui-dialog .ibo-is-alternative.ui-datepicker-current.ui-button:hover,.ibo-is-alternative.ui-datepicker-current:hover,.ibo-is-alternative.ui-datepicker-current.ui-datepicker-close:hover,.ui-dialog .ui-datepicker-current.ui-datepicker-close.ui-button.ui-dialog-titlebar-close:hover,.ibo-is-alternative.ibo-is-secondary.ui-datepicker-close:hover,.ui-dialog .ibo-is-secondary.ui-datepicker-close.ui-button.ui-dialog-titlebar-close:hover,.ui-dialog .ui-datepicker-close.ui-button.ui-dialog-titlebar-close:hover,.ui-dialog .ui-datepicker-close.ui-button.ui-dialog-titlebar-close.ui-datepicker-current:hover,.ui-dialog .ibo-is-alternative.ui-datepicker-close.ui-button:hover,.ibo-is-alternative.ui-datepicker-close.ui-datepicker-current:hover,.ui-dialog .ui-datepicker-close.ui-datepicker-current.ui-button.ui-dialog-titlebar-close:hover,.ibo-is-alternative.ui-datepicker-close:hover,.ui-dialog .ibo-button.ibo-is-secondary.ui-button.ui-dialog-titlebar-close:hover,.ui-dialog .ibo-is-secondary.ui-button.ui-dialog-titlebar-close.ui-datepicker-current:hover,.ui-dialog .ui-button.ui-dialog-titlebar-close.ui-datepicker-current.ui-datepicker-close:hover,.ui-dialog .ibo-is-secondary.ui-button.ui-dialog-titlebar-close.ui-datepicker-close:hover,.ui-dialog .ui-button.ui-dialog-titlebar-close.ui-datepicker-close.ui-datepicker-current:hover,.ui-dialog .ibo-button.ui-button.ui-dialog-titlebar-close:hover,.ui-dialog .ibo-button.ui-button.ui-dialog-titlebar-close.ui-datepicker-current:hover,.ui-dialog .ibo-button.ui-button.ui-dialog-titlebar-close.ui-datepicker-close:hover,.ui-dialog .ibo-button.ibo-is-alternative.ui-button:hover,.ibo-button.ibo-is-alternative.ui-datepicker-current:hover,.ui-dialog .ibo-button.ui-datepicker-current.ui-button.ui-dialog-titlebar-close:hover,.ibo-button.ibo-is-alternative.ui-datepicker-close:hover,.ui-dialog .ibo-button.ui-datepicker-close.ui-button.ui-dialog-titlebar-close:hover{background-color:#E5E9F0;color:#191c22;box-shadow:0px 2px 0px #E5E9F0}.ibo-button.ibo-is-alternative.ibo-is-secondary:active,.ui-dialog .ibo-is-alternative.ibo-is-secondary.ui-button:active,.ui-dialog .ibo-is-secondary.ui-button.ui-dialog-titlebar-close:active,.ui-dialog .ui-button.ui-dialog-titlebar-close:active,.ui-dialog .ui-button.ui-dialog-titlebar-close.ui-datepicker-current:active,.ui-dialog .ui-button.ui-dialog-titlebar-close.ui-datepicker-close:active,.ui-dialog .ibo-is-alternative.ui-button:active,.ui-dialog .ibo-is-alternative.ui-button.ui-datepicker-current:active,.ui-dialog .ui-button.ui-datepicker-current.ui-dialog-titlebar-close:active,.ui-dialog .ibo-is-alternative.ui-button.ui-datepicker-close:active,.ui-dialog .ui-button.ui-datepicker-close.ui-dialog-titlebar-close:active,.ibo-is-alternative.ibo-is-secondary.ui-datepicker-current:active,.ui-dialog .ibo-is-secondary.ui-datepicker-current.ui-button.ui-dialog-titlebar-close:active,.ui-dialog .ui-datepicker-current.ui-button.ui-dialog-titlebar-close:active,.ui-dialog .ui-datepicker-current.ui-button.ui-dialog-titlebar-close.ui-datepicker-close:active,.ui-dialog .ibo-is-alternative.ui-datepicker-current.ui-button:active,.ibo-is-alternative.ui-datepicker-current:active,.ibo-is-alternative.ui-datepicker-current.ui-datepicker-close:active,.ui-dialog .ui-datepicker-current.ui-datepicker-close.ui-button.ui-dialog-titlebar-close:active,.ibo-is-alternative.ibo-is-secondary.ui-datepicker-close:active,.ui-dialog .ibo-is-secondary.ui-datepicker-close.ui-button.ui-dialog-titlebar-close:active,.ui-dialog .ui-datepicker-close.ui-button.ui-dialog-titlebar-close:active,.ui-dialog .ui-datepicker-close.ui-button.ui-dialog-titlebar-close.ui-datepicker-current:active,.ui-dialog .ibo-is-alternative.ui-datepicker-close.ui-button:active,.ibo-is-alternative.ui-datepicker-close.ui-datepicker-current:active,.ui-dialog .ui-datepicker-close.ui-datepicker-current.ui-button.ui-dialog-titlebar-close:active,.ibo-is-alternative.ui-datepicker-close:active,.ui-dialog .ibo-button.ibo-is-secondary.ui-button.ui-dialog-titlebar-close:active,.ui-dialog .ibo-is-secondary.ui-button.ui-dialog-titlebar-close.ui-datepicker-current:active,.ui-dialog .ui-button.ui-dialog-titlebar-close.ui-datepicker-current.ui-datepicker-close:active,.ui-dialog .ibo-is-secondary.ui-button.ui-dialog-titlebar-close.ui-datepicker-close:active,.ui-dialog .ui-button.ui-dialog-titlebar-close.ui-datepicker-close.ui-datepicker-current:active,.ui-dialog .ibo-button.ui-button.ui-dialog-titlebar-close:active,.ui-dialog .ibo-button.ui-button.ui-dialog-titlebar-close.ui-datepicker-current:active,.ui-dialog .ibo-button.ui-button.ui-dialog-titlebar-close.ui-datepicker-close:active,.ui-dialog .ibo-button.ibo-is-alternative.ui-button:active,.ibo-button.ibo-is-alternative.ui-datepicker-current:active,.ui-dialog .ibo-button.ui-datepicker-current.ui-button.ui-dialog-titlebar-close:active,.ibo-button.ibo-is-alternative.ui-datepicker-close:active,.ui-dialog .ibo-button.ui-datepicker-close.ui-button.ui-dialog-titlebar-close:active{background-color:#E5E9F0;color:#191c22;box-shadow:inset 0px 2px 0px #D8DEE9 , 0px 2px 0px #E5E9F0}.ibo-button.ibo-is-alternative.ibo-is-secondary:disabled,.ui-dialog .ibo-is-alternative.ibo-is-secondary.ui-button:disabled,.ui-dialog .ibo-is-secondary.ui-button.ui-dialog-titlebar-close:disabled,.ui-dialog .ui-button.ui-dialog-titlebar-close:disabled,.ui-dialog .ui-button.ui-dialog-titlebar-close.ui-datepicker-current:disabled,.ui-dialog .ui-button.ui-dialog-titlebar-close.ui-datepicker-close:disabled,.ui-dialog .ibo-is-alternative.ui-button:disabled,.ui-dialog .ibo-is-alternative.ui-button.ui-datepicker-current:disabled,.ui-dialog .ui-button.ui-datepicker-current.ui-dialog-titlebar-close:disabled,.ui-dialog .ibo-is-alternative.ui-button.ui-datepicker-close:disabled,.ui-dialog .ui-button.ui-datepicker-close.ui-dialog-titlebar-close:disabled,.ibo-is-alternative.ibo-is-secondary.ui-datepicker-current:disabled,.ui-dialog .ibo-is-secondary.ui-datepicker-current.ui-button.ui-dialog-titlebar-close:disabled,.ui-dialog .ui-datepicker-current.ui-button.ui-dialog-titlebar-close:disabled,.ui-dialog .ui-datepicker-current.ui-button.ui-dialog-titlebar-close.ui-datepicker-close:disabled,.ui-dialog .ibo-is-alternative.ui-datepicker-current.ui-button:disabled,.ibo-is-alternative.ui-datepicker-current:disabled,.ibo-is-alternative.ui-datepicker-current.ui-datepicker-close:disabled,.ui-dialog .ui-datepicker-current.ui-datepicker-close.ui-button.ui-dialog-titlebar-close:disabled,.ibo-is-alternative.ibo-is-secondary.ui-datepicker-close:disabled,.ui-dialog .ibo-is-secondary.ui-datepicker-close.ui-button.ui-dialog-titlebar-close:disabled,.ui-dialog .ui-datepicker-close.ui-button.ui-dialog-titlebar-close:disabled,.ui-dialog .ui-datepicker-close.ui-button.ui-dialog-titlebar-close.ui-datepicker-current:disabled,.ui-dialog .ibo-is-alternative.ui-datepicker-close.ui-button:disabled,.ibo-is-alternative.ui-datepicker-close.ui-datepicker-current:disabled,.ui-dialog .ui-datepicker-close.ui-datepicker-current.ui-button.ui-dialog-titlebar-close:disabled,.ibo-is-alternative.ui-datepicker-close:disabled,.ui-dialog .ibo-button.ibo-is-secondary.ui-button.ui-dialog-titlebar-close:disabled,.ui-dialog .ibo-is-secondary.ui-button.ui-dialog-titlebar-close.ui-datepicker-current:disabled,.ui-dialog .ui-button.ui-dialog-titlebar-close.ui-datepicker-current.ui-datepicker-close:disabled,.ui-dialog .ibo-is-secondary.ui-button.ui-dialog-titlebar-close.ui-datepicker-close:disabled,.ui-dialog .ui-button.ui-dialog-titlebar-close.ui-datepicker-close.ui-datepicker-current:disabled,.ui-dialog .ibo-button.ui-button.ui-dialog-titlebar-close:disabled,.ui-dialog .ibo-button.ui-button.ui-dialog-titlebar-close.ui-datepicker-current:disabled,.ui-dialog .ibo-button.ui-button.ui-dialog-titlebar-close.ui-datepicker-close:disabled,.ui-dialog .ibo-button.ibo-is-alternative.ui-button:disabled,.ibo-button.ibo-is-alternative.ui-datepicker-current:disabled,.ui-dialog .ibo-button.ui-datepicker-current.ui-button.ui-dialog-titlebar-close:disabled,.ibo-button.ibo-is-alternative.ui-datepicker-close:disabled,.ui-dialog .ibo-button.ui-datepicker-close.ui-button.ui-dialog-titlebar-close:disabled{background-color:transparent;color:#434C5E;box-shadow:inset 0px 2px 0px transparent}.ibo-button.ibo-is-alternative.ibo-is-danger,.ui-dialog .ibo-is-alternative.ibo-is-danger.ui-button,.ui-dialog .ibo-is-danger.ui-button.ui-dialog-titlebar-close,.ibo-is-alternative.ibo-is-danger.ui-datepicker-current,.ui-dialog .ibo-is-danger.ui-datepicker-current.ui-button.ui-dialog-titlebar-close,.ibo-is-alternative.ibo-is-danger.ui-datepicker-close,.ui-dialog .ibo-is-danger.ui-datepicker-close.ui-button.ui-dialog-titlebar-close,.ui-dialog .ibo-button.ibo-is-danger.ui-button.ui-dialog-titlebar-close,.ui-dialog .ibo-is-danger.ui-button.ui-dialog-titlebar-close.ui-datepicker-current,.ui-dialog .ibo-is-danger.ui-button.ui-dialog-titlebar-close.ui-datepicker-close{background-color:transparent;color:#b44953;box-shadow:0px 2px 0px transparent}.ibo-button.ibo-is-alternative.ibo-is-danger:hover,.ui-dialog .ibo-is-alternative.ibo-is-danger.ui-button:hover,.ui-dialog .ibo-is-danger.ui-button.ui-dialog-titlebar-close:hover,.ibo-is-alternative.ibo-is-danger.ui-datepicker-current:hover,.ui-dialog .ibo-is-danger.ui-datepicker-current.ui-button.ui-dialog-titlebar-close:hover,.ibo-is-alternative.ibo-is-danger.ui-datepicker-close:hover,.ui-dialog .ibo-is-danger.ui-datepicker-close.ui-button.ui-dialog-titlebar-close:hover,.ui-dialog .ibo-button.ibo-is-danger.ui-button.ui-dialog-titlebar-close:hover,.ui-dialog .ibo-is-danger.ui-button.ui-dialog-titlebar-close.ui-datepicker-current:hover,.ui-dialog .ibo-is-danger.ui-button.ui-dialog-titlebar-close.ui-datepicker-close:hover{background-color:#f2e0e2;color:#7d333a;box-shadow:0px 2px 0px #f2e0e2}.ibo-button.ibo-is-alternative.ibo-is-danger:active,.ui-dialog .ibo-is-alternative.ibo-is-danger.ui-button:active,.ui-dialog .ibo-is-danger.ui-button.ui-dialog-titlebar-close:active,.ibo-is-alternative.ibo-is-danger.ui-datepicker-current:active,.ui-dialog .ibo-is-danger.ui-datepicker-current.ui-button.ui-dialog-titlebar-close:active,.ibo-is-alternative.ibo-is-danger.ui-datepicker-close:active,.ui-dialog .ibo-is-danger.ui-datepicker-close.ui-button.ui-dialog-titlebar-close:active,.ui-dialog .ibo-button.ibo-is-danger.ui-button.ui-dialog-titlebar-close:active,.ui-dialog .ibo-is-danger.ui-button.ui-dialog-titlebar-close.ui-datepicker-current:active,.ui-dialog .ibo-is-danger.ui-button.ui-dialog-titlebar-close.ui-datepicker-close:active{background-color:#f2e0e2;color:#7d333a;box-shadow:inset 0px 2px 0px #b44953 , 0px 2px 0px #f2e0e2}.ibo-button.ibo-is-alternative.ibo-is-danger:disabled,.ui-dialog .ibo-is-alternative.ibo-is-danger.ui-button:disabled,.ui-dialog .ibo-is-danger.ui-button.ui-dialog-titlebar-close:disabled,.ibo-is-alternative.ibo-is-danger.ui-datepicker-current:disabled,.ui-dialog .ibo-is-danger.ui-datepicker-current.ui-button.ui-dialog-titlebar-close:disabled,.ibo-is-alternative.ibo-is-danger.ui-datepicker-close:disabled,.ui-dialog .ibo-is-danger.ui-datepicker-close.ui-button.ui-dialog-titlebar-close:disabled,.ui-dialog .ibo-button.ibo-is-danger.ui-button.ui-dialog-titlebar-close:disabled,.ui-dialog .ibo-is-danger.ui-button.ui-dialog-titlebar-close.ui-datepicker-current:disabled,.ui-dialog .ibo-is-danger.ui-button.ui-dialog-titlebar-close.ui-datepicker-close:disabled{background-color:transparent;color:#434C5E;box-shadow:inset 0px 2px 0px transparent}.ibo-button.ibo-is-alternative.ibo-is-success,.ui-dialog .ibo-is-alternative.ibo-is-success.ui-button,.ui-dialog .ibo-is-success.ui-button.ui-dialog-titlebar-close,.ibo-is-alternative.ibo-is-success.ui-datepicker-current,.ui-dialog .ibo-is-success.ui-datepicker-current.ui-button.ui-dialog-titlebar-close,.ibo-is-alternative.ibo-is-success.ui-datepicker-close,.ui-dialog .ibo-is-success.ui-datepicker-close.ui-button.ui-dialog-titlebar-close,.ui-dialog .ibo-button.ibo-is-success.ui-button.ui-dialog-titlebar-close,.ui-dialog .ibo-is-success.ui-button.ui-dialog-titlebar-close.ui-datepicker-current,.ui-dialog .ibo-is-success.ui-button.ui-dialog-titlebar-close.ui-datepicker-close{background-color:transparent;color:#33691e;box-shadow:0px 2px 0px transparent}.ibo-button.ibo-is-alternative.ibo-is-success:hover,.ui-dialog .ibo-is-alternative.ibo-is-success.ui-button:hover,.ui-dialog .ibo-is-success.ui-button.ui-dialog-titlebar-close:hover,.ibo-is-alternative.ibo-is-success.ui-datepicker-current:hover,.ui-dialog .ibo-is-success.ui-datepicker-current.ui-button.ui-dialog-titlebar-close:hover,.ibo-is-alternative.ibo-is-success.ui-datepicker-close:hover,.ui-dialog .ibo-is-success.ui-datepicker-close.ui-button.ui-dialog-titlebar-close:hover,.ui-dialog .ibo-button.ibo-is-success.ui-button.ui-dialog-titlebar-close:hover,.ui-dialog .ibo-is-success.ui-button.ui-dialog-titlebar-close.ui-datepicker-current:hover,.ui-dialog .ibo-is-success.ui-button.ui-dialog-titlebar-close.ui-datepicker-close:hover{background-color:#dcedc8;color:#33691e;box-shadow:0px 2px 0px #dcedc8}.ibo-button.ibo-is-alternative.ibo-is-success:active,.ui-dialog .ibo-is-alternative.ibo-is-success.ui-button:active,.ui-dialog .ibo-is-success.ui-button.ui-dialog-titlebar-close:active,.ibo-is-alternative.ibo-is-success.ui-datepicker-current:active,.ui-dialog .ibo-is-success.ui-datepicker-current.ui-button.ui-dialog-titlebar-close:active,.ibo-is-alternative.ibo-is-success.ui-datepicker-close:active,.ui-dialog .ibo-is-success.ui-datepicker-close.ui-button.ui-dialog-titlebar-close:active,.ui-dialog .ibo-button.ibo-is-success.ui-button.ui-dialog-titlebar-close:active,.ui-dialog .ibo-is-success.ui-button.ui-dialog-titlebar-close.ui-datepicker-current:active,.ui-dialog .ibo-is-success.ui-button.ui-dialog-titlebar-close.ui-datepicker-close:active{background-color:#dcedc8;color:#33691e;box-shadow:inset 0px 2px 0px #689f38 , 0px 2px 0px #dcedc8}.ibo-button.ibo-is-alternative.ibo-is-success:disabled,.ui-dialog .ibo-is-alternative.ibo-is-success.ui-button:disabled,.ui-dialog .ibo-is-success.ui-button.ui-dialog-titlebar-close:disabled,.ibo-is-alternative.ibo-is-success.ui-datepicker-current:disabled,.ui-dialog .ibo-is-success.ui-datepicker-current.ui-button.ui-dialog-titlebar-close:disabled,.ibo-is-alternative.ibo-is-success.ui-datepicker-close:disabled,.ui-dialog .ibo-is-success.ui-datepicker-close.ui-button.ui-dialog-titlebar-close:disabled,.ui-dialog .ibo-button.ibo-is-success.ui-button.ui-dialog-titlebar-close:disabled,.ui-dialog .ibo-is-success.ui-button.ui-dialog-titlebar-close.ui-datepicker-current:disabled,.ui-dialog .ibo-is-success.ui-button.ui-dialog-titlebar-close.ui-datepicker-close:disabled{background-color:transparent;color:#434C5E;box-shadow:inset 0px 2px 0px transparent}.ibo-button.ibo-is-alternative.ibo-is-red,.ui-dialog .ibo-is-alternative.ibo-is-red.ui-button,.ui-dialog .ibo-is-red.ui-button.ui-dialog-titlebar-close,.ibo-is-alternative.ibo-is-red.ui-datepicker-current,.ui-dialog .ibo-is-red.ui-datepicker-current.ui-button.ui-dialog-titlebar-close,.ibo-is-alternative.ibo-is-red.ui-datepicker-close,.ui-dialog .ibo-is-red.ui-datepicker-close.ui-button.ui-dialog-titlebar-close,.ui-dialog .ibo-button.ibo-is-red.ui-button.ui-dialog-titlebar-close,.ui-dialog .ibo-is-red.ui-button.ui-dialog-titlebar-close.ui-datepicker-current,.ui-dialog .ibo-is-red.ui-button.ui-dialog-titlebar-close.ui-datepicker-close{background-color:transparent;color:#b44953;box-shadow:0px 2px 0px transparent}.ibo-button.ibo-is-alternative.ibo-is-red:hover,.ui-dialog .ibo-is-alternative.ibo-is-red.ui-button:hover,.ui-dialog .ibo-is-red.ui-button.ui-dialog-titlebar-close:hover,.ibo-is-alternative.ibo-is-red.ui-datepicker-current:hover,.ui-dialog .ibo-is-red.ui-datepicker-current.ui-button.ui-dialog-titlebar-close:hover,.ibo-is-alternative.ibo-is-red.ui-datepicker-close:hover,.ui-dialog .ibo-is-red.ui-datepicker-close.ui-button.ui-dialog-titlebar-close:hover,.ui-dialog .ibo-button.ibo-is-red.ui-button.ui-dialog-titlebar-close:hover,.ui-dialog .ibo-is-red.ui-button.ui-dialog-titlebar-close.ui-datepicker-current:hover,.ui-dialog .ibo-is-red.ui-button.ui-dialog-titlebar-close.ui-datepicker-close:hover{background-color:#f2e0e2;color:#7d333a;box-shadow:0px 2px 0px #f2e0e2}.ibo-button.ibo-is-alternative.ibo-is-red:active,.ui-dialog .ibo-is-alternative.ibo-is-red.ui-button:active,.ui-dialog .ibo-is-red.ui-button.ui-dialog-titlebar-close:active,.ibo-is-alternative.ibo-is-red.ui-datepicker-current:active,.ui-dialog .ibo-is-red.ui-datepicker-current.ui-button.ui-dialog-titlebar-close:active,.ibo-is-alternative.ibo-is-red.ui-datepicker-close:active,.ui-dialog .ibo-is-red.ui-datepicker-close.ui-button.ui-dialog-titlebar-close:active,.ui-dialog .ibo-button.ibo-is-red.ui-button.ui-dialog-titlebar-close:active,.ui-dialog .ibo-is-red.ui-button.ui-dialog-titlebar-close.ui-datepicker-current:active,.ui-dialog .ibo-is-red.ui-button.ui-dialog-titlebar-close.ui-datepicker-close:active{background-color:#f2e0e2;color:#7d333a;box-shadow:inset 0px 2px 0px #b44953 , 0px 2px 0px #f2e0e2}.ibo-button.ibo-is-alternative.ibo-is-red:disabled,.ui-dialog .ibo-is-alternative.ibo-is-red.ui-button:disabled,.ui-dialog .ibo-is-red.ui-button.ui-dialog-titlebar-close:disabled,.ibo-is-alternative.ibo-is-red.ui-datepicker-current:disabled,.ui-dialog .ibo-is-red.ui-datepicker-current.ui-button.ui-dialog-titlebar-close:disabled,.ibo-is-alternative.ibo-is-red.ui-datepicker-close:disabled,.ui-dialog .ibo-is-red.ui-datepicker-close.ui-button.ui-dialog-titlebar-close:disabled,.ui-dialog .ibo-button.ibo-is-red.ui-button.ui-dialog-titlebar-close:disabled,.ui-dialog .ibo-is-red.ui-button.ui-dialog-titlebar-close.ui-datepicker-current:disabled,.ui-dialog .ibo-is-red.ui-button.ui-dialog-titlebar-close.ui-datepicker-close:disabled{background-color:transparent;color:#434C5E;box-shadow:inset 0px 2px 0px transparent}.ibo-button.ibo-is-alternative.ibo-is-green,.ui-dialog .ibo-is-alternative.ibo-is-green.ui-button,.ui-dialog .ibo-is-green.ui-button.ui-dialog-titlebar-close,.ibo-is-alternative.ibo-is-green.ui-datepicker-current,.ui-dialog .ibo-is-green.ui-datepicker-current.ui-button.ui-dialog-titlebar-close,.ibo-is-alternative.ibo-is-green.ui-datepicker-close,.ui-dialog .ibo-is-green.ui-datepicker-close.ui-button.ui-dialog-titlebar-close,.ui-dialog .ibo-button.ibo-is-green.ui-button.ui-dialog-titlebar-close,.ui-dialog .ibo-is-green.ui-button.ui-dialog-titlebar-close.ui-datepicker-current,.ui-dialog .ibo-is-green.ui-button.ui-dialog-titlebar-close.ui-datepicker-close{background-color:transparent;color:#33691e;box-shadow:0px 2px 0px transparent}.ibo-button.ibo-is-alternative.ibo-is-green:hover,.ui-dialog .ibo-is-alternative.ibo-is-green.ui-button:hover,.ui-dialog .ibo-is-green.ui-button.ui-dialog-titlebar-close:hover,.ibo-is-alternative.ibo-is-green.ui-datepicker-current:hover,.ui-dialog .ibo-is-green.ui-datepicker-current.ui-button.ui-dialog-titlebar-close:hover,.ibo-is-alternative.ibo-is-green.ui-datepicker-close:hover,.ui-dialog .ibo-is-green.ui-datepicker-close.ui-button.ui-dialog-titlebar-close:hover,.ui-dialog .ibo-button.ibo-is-green.ui-button.ui-dialog-titlebar-close:hover,.ui-dialog .ibo-is-green.ui-button.ui-dialog-titlebar-close.ui-datepicker-current:hover,.ui-dialog .ibo-is-green.ui-button.ui-dialog-titlebar-close.ui-datepicker-close:hover{background-color:#dcedc8;color:#33691e;box-shadow:0px 2px 0px #dcedc8}.ibo-button.ibo-is-alternative.ibo-is-green:active,.ui-dialog .ibo-is-alternative.ibo-is-green.ui-button:active,.ui-dialog .ibo-is-green.ui-button.ui-dialog-titlebar-close:active,.ibo-is-alternative.ibo-is-green.ui-datepicker-current:active,.ui-dialog .ibo-is-green.ui-datepicker-current.ui-button.ui-dialog-titlebar-close:active,.ibo-is-alternative.ibo-is-green.ui-datepicker-close:active,.ui-dialog .ibo-is-green.ui-datepicker-close.ui-button.ui-dialog-titlebar-close:active,.ui-dialog .ibo-button.ibo-is-green.ui-button.ui-dialog-titlebar-close:active,.ui-dialog .ibo-is-green.ui-button.ui-dialog-titlebar-close.ui-datepicker-current:active,.ui-dialog .ibo-is-green.ui-button.ui-dialog-titlebar-close.ui-datepicker-close:active{background-color:#dcedc8;color:#33691e;box-shadow:inset 0px 2px 0px #689f38 , 0px 2px 0px #dcedc8}.ibo-button.ibo-is-alternative.ibo-is-green:disabled,.ui-dialog .ibo-is-alternative.ibo-is-green.ui-button:disabled,.ui-dialog .ibo-is-green.ui-button.ui-dialog-titlebar-close:disabled,.ibo-is-alternative.ibo-is-green.ui-datepicker-current:disabled,.ui-dialog .ibo-is-green.ui-datepicker-current.ui-button.ui-dialog-titlebar-close:disabled,.ibo-is-alternative.ibo-is-green.ui-datepicker-close:disabled,.ui-dialog .ibo-is-green.ui-datepicker-close.ui-button.ui-dialog-titlebar-close:disabled,.ui-dialog .ibo-button.ibo-is-green.ui-button.ui-dialog-titlebar-close:disabled,.ui-dialog .ibo-is-green.ui-button.ui-dialog-titlebar-close.ui-datepicker-current:disabled,.ui-dialog .ibo-is-green.ui-button.ui-dialog-titlebar-close.ui-datepicker-close:disabled{background-color:transparent;color:#434C5E;box-shadow:inset 0px 2px 0px transparent}.ibo-button.ibo-is-alternative.ibo-is-cyan,.ui-dialog .ibo-is-alternative.ibo-is-cyan.ui-button,.ui-dialog .ibo-is-cyan.ui-button.ui-dialog-titlebar-close,.ibo-is-alternative.ibo-is-cyan.ui-datepicker-current,.ui-dialog .ibo-is-cyan.ui-datepicker-current.ui-button.ui-dialog-titlebar-close,.ibo-is-alternative.ibo-is-cyan.ui-datepicker-close,.ui-dialog .ibo-is-cyan.ui-datepicker-close.ui-button.ui-dialog-titlebar-close,.ui-dialog .ibo-button.ibo-is-cyan.ui-button.ui-dialog-titlebar-close,.ui-dialog .ibo-is-cyan.ui-button.ui-dialog-titlebar-close.ui-datepicker-current,.ui-dialog .ibo-is-cyan.ui-button.ui-dialog-titlebar-close.ui-datepicker-close{background-color:transparent;color:#006164;box-shadow:0px 2px 0px transparent}.ibo-button.ibo-is-alternative.ibo-is-cyan:hover,.ui-dialog .ibo-is-alternative.ibo-is-cyan.ui-button:hover,.ui-dialog .ibo-is-cyan.ui-button.ui-dialog-titlebar-close:hover,.ibo-is-alternative.ibo-is-cyan.ui-datepicker-current:hover,.ui-dialog .ibo-is-cyan.ui-datepicker-current.ui-button.ui-dialog-titlebar-close:hover,.ibo-is-alternative.ibo-is-cyan.ui-datepicker-close:hover,.ui-dialog .ibo-is-cyan.ui-datepicker-close.ui-button.ui-dialog-titlebar-close:hover,.ui-dialog .ibo-button.ibo-is-cyan.ui-button.ui-dialog-titlebar-close:hover,.ui-dialog .ibo-is-cyan.ui-button.ui-dialog-titlebar-close.ui-datepicker-current:hover,.ui-dialog .ibo-is-cyan.ui-button.ui-dialog-titlebar-close.ui-datepicker-close:hover{background-color:#c9eef2;color:#006164;box-shadow:0px 2px 0px #c9eef2}.ibo-button.ibo-is-alternative.ibo-is-cyan:active,.ui-dialog .ibo-is-alternative.ibo-is-cyan.ui-button:active,.ui-dialog .ibo-is-cyan.ui-button.ui-dialog-titlebar-close:active,.ibo-is-alternative.ibo-is-cyan.ui-datepicker-current:active,.ui-dialog .ibo-is-cyan.ui-datepicker-current.ui-button.ui-dialog-titlebar-close:active,.ibo-is-alternative.ibo-is-cyan.ui-datepicker-close:active,.ui-dialog .ibo-is-cyan.ui-datepicker-close.ui-button.ui-dialog-titlebar-close:active,.ui-dialog .ibo-button.ibo-is-cyan.ui-button.ui-dialog-titlebar-close:active,.ui-dialog .ibo-is-cyan.ui-button.ui-dialog-titlebar-close.ui-datepicker-current:active,.ui-dialog .ibo-is-cyan.ui-button.ui-dialog-titlebar-close.ui-datepicker-close:active{background-color:#c9eef2;color:#006164;box-shadow:inset 0px 2px 0px #00838f , 0px 2px 0px #c9eef2}.ibo-button.ibo-is-alternative.ibo-is-cyan:disabled,.ui-dialog .ibo-is-alternative.ibo-is-cyan.ui-button:disabled,.ui-dialog .ibo-is-cyan.ui-button.ui-dialog-titlebar-close:disabled,.ibo-is-alternative.ibo-is-cyan.ui-datepicker-current:disabled,.ui-dialog .ibo-is-cyan.ui-datepicker-current.ui-button.ui-dialog-titlebar-close:disabled,.ibo-is-alternative.ibo-is-cyan.ui-datepicker-close:disabled,.ui-dialog .ibo-is-cyan.ui-datepicker-close.ui-button.ui-dialog-titlebar-close:disabled,.ui-dialog .ibo-button.ibo-is-cyan.ui-button.ui-dialog-titlebar-close:disabled,.ui-dialog .ibo-is-cyan.ui-button.ui-dialog-titlebar-close.ui-datepicker-current:disabled,.ui-dialog .ibo-is-cyan.ui-button.ui-dialog-titlebar-close.ui-datepicker-close:disabled{background-color:transparent;color:#434C5E;box-shadow:inset 0px 2px 0px transparent}.ibo-button,.ui-dialog .ui-button,.ui-datepicker-current,.ui-datepicker-close{position:relative;display:inline-block;padding:6px 9px;border:0;border-radius:4px;cursor:pointer;text-transform:uppercase;white-space:nowrap}.ibo-button.ibo-action-button,.ui-dialog .ibo-action-button.ui-button,.ibo-action-button.ui-datepicker-current,.ibo-action-button.ui-datepicker-close{float:right}.ibo-button .ibo-button--loading-icon,.ui-dialog .ui-button .ibo-button--loading-icon,.ui-datepicker-current .ibo-button--loading-icon,.ui-datepicker-close .ibo-button--loading-icon{display:none}.ibo-button.ibo-is-loading .ibo-button--icon,.ui-dialog .ibo-is-loading.ui-button .ibo-button--icon,.ibo-is-loading.ui-datepicker-current .ibo-button--icon,.ibo-is-loading.ui-datepicker-close .ibo-button--icon{display:none}.ibo-button.ibo-is-loading .ibo-button--loading-icon,.ui-dialog .ibo-is-loading.ui-button .ibo-button--loading-icon,.ibo-is-loading.ui-datepicker-current .ibo-button--loading-icon,.ibo-is-loading.ui-datepicker-close .ibo-button--loading-icon{display:inline-block}.ibo-button.ibo-is-loading .ibo-button--loading-icon+.ibo-button--label,.ui-dialog .ibo-is-loading.ui-button .ibo-button--loading-icon+.ibo-button--label,.ibo-is-loading.ui-datepicker-current .ibo-button--loading-icon+.ibo-button--label,.ibo-is-loading.ui-datepicker-close .ibo-button--loading-icon+.ibo-button--label{margin-left:4px}.ibo-button--icon+.ibo-button--label{margin-left:4px}.ibo-button--vertical-align{margin-top:4px;margin-bottom:4px}.ibo-button-group{display:inline-flex;flex-wrap:nowrap}.ibo-button-group .ibo-button,.ibo-button-group .ui-dialog .ui-button,.ui-dialog .ibo-button-group .ui-button,.ibo-button-group .ui-datepicker-current,.ibo-button-group .ui-datepicker-close{position:relative}.ibo-button-group .ibo-button:first-child,.ibo-button-group .ui-dialog .ui-button:first-child,.ui-dialog .ibo-button-group .ui-button:first-child,.ibo-button-group .ui-datepicker-current:first-child,.ibo-button-group .ui-datepicker-close:first-child{border-radius:4px 0 0 4px}.ibo-button-group .ibo-button:last-child,.ibo-button-group .ui-dialog .ui-button:last-child,.ui-dialog .ibo-button-group .ui-button:last-child,.ibo-button-group .ui-datepicker-current:last-child,.ibo-button-group .ui-datepicker-close:last-child{border-radius:0 4px 4px 0}.ibo-button-group .ibo-button:not(:first-child):not(:last-child),.ibo-button-group .ui-dialog .ui-button:not(:last-child):not(:first-child),.ui-dialog .ibo-button-group .ui-button:not(:last-child):not(:first-child),.ibo-button-group .ui-datepicker-current:not(:last-child):not(:first-child),.ibo-button-group .ui-datepicker-close:not(:last-child):not(:first-child){border-radius:0}.ibo-button-group .ibo-button+.ibo-button,.ibo-button-group .ui-dialog .ui-button+.ibo-button,.ibo-button-group .ui-dialog .ui-dialog .ui-button+.ui-button,.ui-dialog .ibo-button-group .ui-dialog .ui-button+.ui-button,.ibo-button-group .ui-dialog .ui-button+.ui-datepicker-current,.ibo-button-group .ui-dialog .ui-button+.ui-datepicker-close,.ui-dialog .ibo-button-group .ui-button+.ibo-button,.ibo-button-group .ui-datepicker-current+.ibo-button,.ibo-button-group .ui-dialog .ui-datepicker-current+.ui-button,.ui-dialog .ibo-button-group .ui-datepicker-current+.ui-button,.ibo-button-group .ui-datepicker-current+.ui-datepicker-current,.ibo-button-group .ui-datepicker-current+.ui-datepicker-close,.ibo-button-group .ui-datepicker-close+.ibo-button,.ibo-button-group .ui-dialog .ui-datepicker-close+.ui-button,.ui-dialog .ibo-button-group .ui-datepicker-close+.ui-button,.ibo-button-group .ui-datepicker-close+.ui-datepicker-current,.ibo-button-group .ui-datepicker-close+.ui-datepicker-close,.ibo-button-group .ui-dialog .ibo-button+.ui-button,.ui-dialog .ibo-button-group .ibo-button+.ui-button,.ibo-button-group .ibo-button+.ui-datepicker-current,.ibo-button-group .ibo-button+.ui-datepicker-close{margin-left:0}.ibo-button-group .ibo-button+.ibo-button::before,.ibo-button-group .ui-dialog .ui-button+.ibo-button::before,.ui-dialog .ibo-button-group .ui-button+.ibo-button::before,.ibo-button-group .ui-datepicker-current+.ibo-button::before,.ibo-button-group .ui-datepicker-close+.ibo-button::before,.ibo-button-group .ui-dialog .ibo-button+.ui-button::before,.ui-dialog .ibo-button-group .ibo-button+.ui-button::before,.ibo-button-group .ibo-button+.ui-datepicker-current::before,.ibo-button-group .ibo-button+.ui-datepicker-close::before{content:"";position:absolute;top:6px;bottom:6px;left:0;width:1px;border-left:1px solid transparent}.ibo-button-group>*+*.ibo-is-regular.ibo-is-neutral::before,.ui-dialog .ibo-button-group>*+*.ibo-is-neutral.ui-button::before,.ui-dialog .ibo-button-group>*+*.ui-button.ui-dialog-titlebar-close::before,.ibo-button-group>*+*.ibo-is-neutral.ui-datepicker-current::before,.ui-dialog .ibo-button-group>*+*.ui-datepicker-current.ui-button.ui-dialog-titlebar-close::before,.ibo-button-group>*+*.ibo-is-neutral.ui-datepicker-close::before,.ui-dialog .ibo-button-group>*+*.ui-datepicker-close.ui-button.ui-dialog-titlebar-close::before,.ui-dialog .ibo-button-group>*+*.ibo-is-regular.ui-button.ui-dialog-titlebar-close::before,.ui-dialog .ibo-button-group>*+*.ui-button.ui-dialog-titlebar-close.ui-datepicker-current::before,.ui-dialog .ibo-button-group>*+*.ui-button.ui-dialog-titlebar-close.ui-datepicker-close::before{border-left-color:#7b88a1}.ibo-button-group>*+*.ibo-is-regular.ibo-is-neutral:hover::before,.ui-dialog .ibo-button-group>*+*.ibo-is-neutral.ui-button::before:hover,.ui-dialog .ibo-button-group>*+*.ui-button.ui-dialog-titlebar-close:hover::before,.ibo-button-group>*+*.ibo-is-neutral.ui-datepicker-current::before:hover,.ui-dialog .ibo-button-group>*+*.ui-datepicker-current.ui-button.ui-dialog-titlebar-close:hover::before,.ibo-button-group>*+*.ibo-is-neutral.ui-datepicker-close::before:hover,.ui-dialog .ibo-button-group>*+*.ui-datepicker-close.ui-button.ui-dialog-titlebar-close:hover::before,.ui-dialog .ibo-button-group>*+*.ibo-is-regular.ui-button.ui-dialog-titlebar-close::before:hover,.ui-dialog .ibo-button-group>*+*.ui-button.ui-dialog-titlebar-close.ui-datepicker-current:hover::before,.ui-dialog .ibo-button-group>*+*.ui-button.ui-dialog-titlebar-close.ui-datepicker-close:hover::before{border-left-color:#7b88a1}.ibo-button-group>*+*.ibo-is-regular.ibo-is-neutral:active::before,.ui-dialog .ibo-button-group>*+*.ibo-is-neutral.ui-button::before:active,.ui-dialog .ibo-button-group>*+*.ui-button.ui-dialog-titlebar-close:active::before,.ibo-button-group>*+*.ibo-is-neutral.ui-datepicker-current::before:active,.ui-dialog .ibo-button-group>*+*.ui-datepicker-current.ui-button.ui-dialog-titlebar-close:active::before,.ibo-button-group>*+*.ibo-is-neutral.ui-datepicker-close::before:active,.ui-dialog .ibo-button-group>*+*.ui-datepicker-close.ui-button.ui-dialog-titlebar-close:active::before,.ui-dialog .ibo-button-group>*+*.ibo-is-regular.ui-button.ui-dialog-titlebar-close::before:active,.ui-dialog .ibo-button-group>*+*.ui-button.ui-dialog-titlebar-close.ui-datepicker-current:active::before,.ui-dialog .ibo-button-group>*+*.ui-button.ui-dialog-titlebar-close.ui-datepicker-close:active::before{border-left-color:#7b88a1}.ibo-button-group>*+*.ibo-is-regular.ibo-is-neutral:disabled::before,.ui-dialog .ibo-button-group>*+*.ibo-is-neutral.ui-button::before:disabled,.ui-dialog .ibo-button-group>*+*.ui-button.ui-dialog-titlebar-close:disabled::before,.ibo-button-group>*+*.ibo-is-neutral.ui-datepicker-current::before:disabled,.ui-dialog .ibo-button-group>*+*.ui-datepicker-current.ui-button.ui-dialog-titlebar-close:disabled::before,.ibo-button-group>*+*.ibo-is-neutral.ui-datepicker-close::before:disabled,.ui-dialog .ibo-button-group>*+*.ui-datepicker-close.ui-button.ui-dialog-titlebar-close:disabled::before,.ui-dialog .ibo-button-group>*+*.ibo-is-regular.ui-button.ui-dialog-titlebar-close::before:disabled,.ui-dialog .ibo-button-group>*+*.ui-button.ui-dialog-titlebar-close.ui-datepicker-current:disabled::before,.ui-dialog .ibo-button-group>*+*.ui-button.ui-dialog-titlebar-close.ui-datepicker-close:disabled::before{border-left-color:#4C566A}.ibo-button-group>*+*.ibo-is-regular.ibo-is-primary::before,.ui-dialog .ibo-button-group>*+*.ibo-is-primary.ui-button::before,.ibo-button-group>*+*.ibo-is-primary.ui-datepicker-current::before,.ibo-button-group>*+*.ibo-is-primary.ui-datepicker-close::before{border-left-color:#88C0D0}.ibo-button-group>*+*.ibo-is-regular.ibo-is-primary:hover::before,.ui-dialog .ibo-button-group>*+*.ibo-is-primary.ui-button::before:hover,.ibo-button-group>*+*.ibo-is-primary.ui-datepicker-current::before:hover,.ibo-button-group>*+*.ibo-is-primary.ui-datepicker-close::before:hover{border-left-color:#88C0D0}.ibo-button-group>*+*.ibo-is-regular.ibo-is-primary:active::before,.ui-dialog .ibo-button-group>*+*.ibo-is-primary.ui-button::before:active,.ibo-button-group>*+*.ibo-is-primary.ui-datepicker-current::before:active,.ibo-button-group>*+*.ibo-is-primary.ui-datepicker-close::before:active{border-left-color:#5E81AC}.ibo-button-group>*+*.ibo-is-regular.ibo-is-primary:disabled::before,.ui-dialog .ibo-button-group>*+*.ibo-is-primary.ui-button::before:disabled,.ibo-button-group>*+*.ibo-is-primary.ui-datepicker-current::before:disabled,.ibo-button-group>*+*.ibo-is-primary.ui-datepicker-close::before:disabled{border-left-color:#4C566A}.ibo-button-group>*+*.ibo-is-regular.ibo-is-secondary::before,.ui-dialog .ibo-button-group>*+*.ibo-is-secondary.ui-button::before,.ui-dialog .ibo-button-group>*+*.ui-button::before,.ui-dialog .ibo-button-group>*+*.ui-button.ui-datepicker-current::before,.ui-dialog .ibo-button-group>*+*.ui-button.ui-datepicker-close::before,.ibo-button-group>*+*.ibo-is-secondary.ui-datepicker-current::before,.ui-dialog .ibo-button-group>*+*.ui-datepicker-current.ui-button::before,.ibo-button-group>*+*.ui-datepicker-current::before,.ibo-button-group>*+*.ui-datepicker-current.ui-datepicker-close::before,.ibo-button-group>*+*.ibo-is-secondary.ui-datepicker-close::before,.ui-dialog .ibo-button-group>*+*.ui-datepicker-close.ui-button::before,.ibo-button-group>*+*.ui-datepicker-close.ui-datepicker-current::before,.ibo-button-group>*+*.ui-datepicker-close::before,.ui-dialog .ibo-button-group>*+*.ibo-is-regular.ui-button::before,.ibo-button-group>*+*.ibo-is-regular.ui-datepicker-current::before,.ibo-button-group>*+*.ibo-is-regular.ui-datepicker-close::before{border-left-color:#7b88a1}.ibo-button-group>*+*.ibo-is-regular.ibo-is-secondary:hover::before,.ui-dialog .ibo-button-group>*+*.ibo-is-secondary.ui-button::before:hover,.ui-dialog .ibo-button-group>*+*.ui-button:hover::before,.ui-dialog .ibo-button-group>*+*.ui-button.ui-datepicker-current:hover::before,.ui-dialog .ibo-button-group>*+*.ui-button.ui-datepicker-close:hover::before,.ibo-button-group>*+*.ibo-is-secondary.ui-datepicker-current::before:hover,.ui-dialog .ibo-button-group>*+*.ui-datepicker-current.ui-button:hover::before,.ibo-button-group>*+*.ui-datepicker-current:hover::before,.ibo-button-group>*+*.ui-datepicker-current.ui-datepicker-close:hover::before,.ibo-button-group>*+*.ibo-is-secondary.ui-datepicker-close::before:hover,.ui-dialog .ibo-button-group>*+*.ui-datepicker-close.ui-button:hover::before,.ibo-button-group>*+*.ui-datepicker-close.ui-datepicker-current:hover::before,.ibo-button-group>*+*.ui-datepicker-close:hover::before,.ui-dialog .ibo-button-group>*+*.ibo-is-regular.ui-button::before:hover,.ibo-button-group>*+*.ibo-is-regular.ui-datepicker-current::before:hover,.ibo-button-group>*+*.ibo-is-regular.ui-datepicker-close::before:hover{border-left-color:#7b88a1}.ibo-button-group>*+*.ibo-is-regular.ibo-is-secondary:active::before,.ui-dialog .ibo-button-group>*+*.ibo-is-secondary.ui-button::before:active,.ui-dialog .ibo-button-group>*+*.ui-button:active::before,.ui-dialog .ibo-button-group>*+*.ui-button.ui-datepicker-current:active::before,.ui-dialog .ibo-button-group>*+*.ui-button.ui-datepicker-close:active::before,.ibo-button-group>*+*.ibo-is-secondary.ui-datepicker-current::before:active,.ui-dialog .ibo-button-group>*+*.ui-datepicker-current.ui-button:active::before,.ibo-button-group>*+*.ui-datepicker-current:active::before,.ibo-button-group>*+*.ui-datepicker-current.ui-datepicker-close:active::before,.ibo-button-group>*+*.ibo-is-secondary.ui-datepicker-close::before:active,.ui-dialog .ibo-button-group>*+*.ui-datepicker-close.ui-button:active::before,.ibo-button-group>*+*.ui-datepicker-close.ui-datepicker-current:active::before,.ibo-button-group>*+*.ui-datepicker-close:active::before,.ui-dialog .ibo-button-group>*+*.ibo-is-regular.ui-button::before:active,.ibo-button-group>*+*.ibo-is-regular.ui-datepicker-current::before:active,.ibo-button-group>*+*.ibo-is-regular.ui-datepicker-close::before:active{border-left-color:#D8DEE9}.ibo-button-group>*+*.ibo-is-regular.ibo-is-secondary:disabled::before,.ui-dialog .ibo-button-group>*+*.ibo-is-secondary.ui-button::before:disabled,.ui-dialog .ibo-button-group>*+*.ui-button:disabled::before,.ui-dialog .ibo-button-group>*+*.ui-button.ui-datepicker-current:disabled::before,.ui-dialog .ibo-button-group>*+*.ui-button.ui-datepicker-close:disabled::before,.ibo-button-group>*+*.ibo-is-secondary.ui-datepicker-current::before:disabled,.ui-dialog .ibo-button-group>*+*.ui-datepicker-current.ui-button:disabled::before,.ibo-button-group>*+*.ui-datepicker-current:disabled::before,.ibo-button-group>*+*.ui-datepicker-current.ui-datepicker-close:disabled::before,.ibo-button-group>*+*.ibo-is-secondary.ui-datepicker-close::before:disabled,.ui-dialog .ibo-button-group>*+*.ui-datepicker-close.ui-button:disabled::before,.ibo-button-group>*+*.ui-datepicker-close.ui-datepicker-current:disabled::before,.ibo-button-group>*+*.ui-datepicker-close:disabled::before,.ui-dialog .ibo-button-group>*+*.ibo-is-regular.ui-button::before:disabled,.ibo-button-group>*+*.ibo-is-regular.ui-datepicker-current::before:disabled,.ibo-button-group>*+*.ibo-is-regular.ui-datepicker-close::before:disabled{border-left-color:#4C566A}.ibo-button-group>*+*.ibo-is-regular.ibo-is-danger::before,.ui-dialog .ibo-button-group>*+*.ibo-is-danger.ui-button::before,.ibo-button-group>*+*.ibo-is-danger.ui-datepicker-current::before,.ibo-button-group>*+*.ibo-is-danger.ui-datepicker-close::before{border-left-color:#b44953}.ibo-button-group>*+*.ibo-is-regular.ibo-is-danger:hover::before,.ui-dialog .ibo-button-group>*+*.ibo-is-danger.ui-button::before:hover,.ibo-button-group>*+*.ibo-is-danger.ui-datepicker-current::before:hover,.ibo-button-group>*+*.ibo-is-danger.ui-datepicker-close::before:hover{border-left-color:#b44953}.ibo-button-group>*+*.ibo-is-regular.ibo-is-danger:active::before,.ui-dialog .ibo-button-group>*+*.ibo-is-danger.ui-button::before:active,.ibo-button-group>*+*.ibo-is-danger.ui-datepicker-current::before:active,.ibo-button-group>*+*.ibo-is-danger.ui-datepicker-close::before:active{border-left-color:#b44953}.ibo-button-group>*+*.ibo-is-regular.ibo-is-danger:disabled::before,.ui-dialog .ibo-button-group>*+*.ibo-is-danger.ui-button::before:disabled,.ibo-button-group>*+*.ibo-is-danger.ui-datepicker-current::before:disabled,.ibo-button-group>*+*.ibo-is-danger.ui-datepicker-close::before:disabled{border-left-color:#4C566A}.ibo-button-group>*+*.ibo-is-regular.ibo-is-success::before,.ui-dialog .ibo-button-group>*+*.ibo-is-success.ui-button::before,.ibo-button-group>*+*.ibo-is-success.ui-datepicker-current::before,.ibo-button-group>*+*.ibo-is-success.ui-datepicker-close::before{border-left-color:#558b2f}.ibo-button-group>*+*.ibo-is-regular.ibo-is-success:hover::before,.ui-dialog .ibo-button-group>*+*.ibo-is-success.ui-button::before:hover,.ibo-button-group>*+*.ibo-is-success.ui-datepicker-current::before:hover,.ibo-button-group>*+*.ibo-is-success.ui-datepicker-close::before:hover{border-left-color:#558b2f}.ibo-button-group>*+*.ibo-is-regular.ibo-is-success:active::before,.ui-dialog .ibo-button-group>*+*.ibo-is-success.ui-button::before:active,.ibo-button-group>*+*.ibo-is-success.ui-datepicker-current::before:active,.ibo-button-group>*+*.ibo-is-success.ui-datepicker-close::before:active{border-left-color:#558b2f}.ibo-button-group>*+*.ibo-is-regular.ibo-is-success:disabled::before,.ui-dialog .ibo-button-group>*+*.ibo-is-success.ui-button::before:disabled,.ibo-button-group>*+*.ibo-is-success.ui-datepicker-current::before:disabled,.ibo-button-group>*+*.ibo-is-success.ui-datepicker-close::before:disabled{border-left-color:#4C566A}.ibo-button-group>*+*.ibo-is-regular.ibo-is-red::before,.ui-dialog .ibo-button-group>*+*.ibo-is-red.ui-button::before,.ibo-button-group>*+*.ibo-is-red.ui-datepicker-current::before,.ibo-button-group>*+*.ibo-is-red.ui-datepicker-close::before{border-left-color:#b44953}.ibo-button-group>*+*.ibo-is-regular.ibo-is-red:hover::before,.ui-dialog .ibo-button-group>*+*.ibo-is-red.ui-button::before:hover,.ibo-button-group>*+*.ibo-is-red.ui-datepicker-current::before:hover,.ibo-button-group>*+*.ibo-is-red.ui-datepicker-close::before:hover{border-left-color:#b44953}.ibo-button-group>*+*.ibo-is-regular.ibo-is-red:active::before,.ui-dialog .ibo-button-group>*+*.ibo-is-red.ui-button::before:active,.ibo-button-group>*+*.ibo-is-red.ui-datepicker-current::before:active,.ibo-button-group>*+*.ibo-is-red.ui-datepicker-close::before:active{border-left-color:#b44953}.ibo-button-group>*+*.ibo-is-regular.ibo-is-red:disabled::before,.ui-dialog .ibo-button-group>*+*.ibo-is-red.ui-button::before:disabled,.ibo-button-group>*+*.ibo-is-red.ui-datepicker-current::before:disabled,.ibo-button-group>*+*.ibo-is-red.ui-datepicker-close::before:disabled{border-left-color:#4C566A}.ibo-button-group>*+*.ibo-is-regular.ibo-is-green::before,.ui-dialog .ibo-button-group>*+*.ibo-is-green.ui-button::before,.ibo-button-group>*+*.ibo-is-green.ui-datepicker-current::before,.ibo-button-group>*+*.ibo-is-green.ui-datepicker-close::before{border-left-color:#558b2f}.ibo-button-group>*+*.ibo-is-regular.ibo-is-green:hover::before,.ui-dialog .ibo-button-group>*+*.ibo-is-green.ui-button::before:hover,.ibo-button-group>*+*.ibo-is-green.ui-datepicker-current::before:hover,.ibo-button-group>*+*.ibo-is-green.ui-datepicker-close::before:hover{border-left-color:#558b2f}.ibo-button-group>*+*.ibo-is-regular.ibo-is-green:active::before,.ui-dialog .ibo-button-group>*+*.ibo-is-green.ui-button::before:active,.ibo-button-group>*+*.ibo-is-green.ui-datepicker-current::before:active,.ibo-button-group>*+*.ibo-is-green.ui-datepicker-close::before:active{border-left-color:#558b2f}.ibo-button-group>*+*.ibo-is-regular.ibo-is-green:disabled::before,.ui-dialog .ibo-button-group>*+*.ibo-is-green.ui-button::before:disabled,.ibo-button-group>*+*.ibo-is-green.ui-datepicker-current::before:disabled,.ibo-button-group>*+*.ibo-is-green.ui-datepicker-close::before:disabled{border-left-color:#4C566A}.ibo-button-group>*+*.ibo-is-regular.ibo-is-cyan::before,.ui-dialog .ibo-button-group>*+*.ibo-is-cyan.ui-button::before,.ibo-button-group>*+*.ibo-is-cyan.ui-datepicker-current::before,.ibo-button-group>*+*.ibo-is-cyan.ui-datepicker-close::before{border-left-color:#006164}.ibo-button-group>*+*.ibo-is-regular.ibo-is-cyan:hover::before,.ui-dialog .ibo-button-group>*+*.ibo-is-cyan.ui-button::before:hover,.ibo-button-group>*+*.ibo-is-cyan.ui-datepicker-current::before:hover,.ibo-button-group>*+*.ibo-is-cyan.ui-datepicker-close::before:hover{border-left-color:#006164}.ibo-button-group>*+*.ibo-is-regular.ibo-is-cyan:active::before,.ui-dialog .ibo-button-group>*+*.ibo-is-cyan.ui-button::before:active,.ibo-button-group>*+*.ibo-is-cyan.ui-datepicker-current::before:active,.ibo-button-group>*+*.ibo-is-cyan.ui-datepicker-close::before:active{border-left-color:#0096a7}.ibo-button-group>*+*.ibo-is-regular.ibo-is-cyan:disabled::before,.ui-dialog .ibo-button-group>*+*.ibo-is-cyan.ui-button::before:disabled,.ibo-button-group>*+*.ibo-is-cyan.ui-datepicker-current::before:disabled,.ibo-button-group>*+*.ibo-is-cyan.ui-datepicker-close::before:disabled{border-left-color:#4C566A}.ibo-button-group>*+*.ibo-is-alternative.ibo-is-neutral::before,.ui-dialog .ibo-button-group>*+*.ibo-is-neutral.ui-button.ui-dialog-titlebar-close::before,.ui-dialog .ibo-button-group>*+*.ui-button.ui-dialog-titlebar-close::before,.ui-dialog .ibo-button-group>*+*.ibo-is-alternative.ui-button.ui-dialog-titlebar-close::before{border-left-color:#2E3440}.ibo-button-group>*+*.ibo-is-alternative.ibo-is-neutral:hover::before,.ui-dialog .ibo-button-group>*+*.ibo-is-neutral.ui-button.ui-dialog-titlebar-close::before:hover,.ui-dialog .ibo-button-group>*+*.ui-button.ui-dialog-titlebar-close:hover::before,.ui-dialog .ibo-button-group>*+*.ibo-is-alternative.ui-button.ui-dialog-titlebar-close::before:hover{border-left-color:#2E3440}.ibo-button-group>*+*.ibo-is-alternative.ibo-is-neutral:active::before,.ui-dialog .ibo-button-group>*+*.ibo-is-neutral.ui-button.ui-dialog-titlebar-close::before:active,.ui-dialog .ibo-button-group>*+*.ui-button.ui-dialog-titlebar-close:active::before,.ui-dialog .ibo-button-group>*+*.ibo-is-alternative.ui-button.ui-dialog-titlebar-close::before:active{border-left-color:#2E3440}.ibo-button-group>*+*.ibo-is-alternative.ibo-is-neutral:disabled::before,.ui-dialog .ibo-button-group>*+*.ibo-is-neutral.ui-button.ui-dialog-titlebar-close::before:disabled,.ui-dialog .ibo-button-group>*+*.ui-button.ui-dialog-titlebar-close:disabled::before,.ui-dialog .ibo-button-group>*+*.ibo-is-alternative.ui-button.ui-dialog-titlebar-close::before:disabled{border-left-color:#4C566A}.ibo-button-group>*+*.ibo-is-alternative.ibo-is-primary::before,.ui-dialog .ibo-button-group>*+*.ibo-is-primary.ui-button.ui-dialog-titlebar-close::before{border-left-color:#0096a7}.ibo-button-group>*+*.ibo-is-alternative.ibo-is-primary:hover::before,.ui-dialog .ibo-button-group>*+*.ibo-is-primary.ui-button.ui-dialog-titlebar-close::before:hover{border-left-color:#2E3440}.ibo-button-group>*+*.ibo-is-alternative.ibo-is-primary:active::before,.ui-dialog .ibo-button-group>*+*.ibo-is-primary.ui-button.ui-dialog-titlebar-close::before:active{border-left-color:#2E3440}.ibo-button-group>*+*.ibo-is-alternative.ibo-is-primary:disabled::before,.ui-dialog .ibo-button-group>*+*.ibo-is-primary.ui-button.ui-dialog-titlebar-close::before:disabled{border-left-color:#4C566A}.ibo-button-group>*+*.ibo-is-alternative.ibo-is-secondary::before,.ui-dialog .ibo-button-group>*+*.ibo-is-secondary.ui-button.ui-dialog-titlebar-close::before,.ui-dialog .ibo-button-group>*+*.ui-button.ui-dialog-titlebar-close::before,.ui-dialog .ibo-button-group>*+*.ui-button.ui-dialog-titlebar-close.ui-datepicker-current::before,.ui-dialog .ibo-button-group>*+*.ui-button.ui-dialog-titlebar-close.ui-datepicker-close::before,.ui-dialog .ibo-button-group>*+*.ibo-is-alternative.ui-button::before,.ibo-button-group>*+*.ibo-is-alternative.ui-datepicker-current::before,.ui-dialog .ibo-button-group>*+*.ui-datepicker-current.ui-button.ui-dialog-titlebar-close::before,.ibo-button-group>*+*.ibo-is-alternative.ui-datepicker-close::before,.ui-dialog .ibo-button-group>*+*.ui-datepicker-close.ui-button.ui-dialog-titlebar-close::before{border-left-color:#2E3440}.ibo-button-group>*+*.ibo-is-alternative.ibo-is-secondary:hover::before,.ui-dialog .ibo-button-group>*+*.ibo-is-secondary.ui-button.ui-dialog-titlebar-close::before:hover,.ui-dialog .ibo-button-group>*+*.ui-button.ui-dialog-titlebar-close:hover::before,.ui-dialog .ibo-button-group>*+*.ui-button.ui-dialog-titlebar-close.ui-datepicker-current:hover::before,.ui-dialog .ibo-button-group>*+*.ui-button.ui-dialog-titlebar-close.ui-datepicker-close:hover::before,.ui-dialog .ibo-button-group>*+*.ibo-is-alternative.ui-button::before:hover,.ibo-button-group>*+*.ibo-is-alternative.ui-datepicker-current::before:hover,.ui-dialog .ibo-button-group>*+*.ui-datepicker-current.ui-button.ui-dialog-titlebar-close:hover::before,.ibo-button-group>*+*.ibo-is-alternative.ui-datepicker-close::before:hover,.ui-dialog .ibo-button-group>*+*.ui-datepicker-close.ui-button.ui-dialog-titlebar-close:hover::before{border-left-color:#2E3440}.ibo-button-group>*+*.ibo-is-alternative.ibo-is-secondary:active::before,.ui-dialog .ibo-button-group>*+*.ibo-is-secondary.ui-button.ui-dialog-titlebar-close::before:active,.ui-dialog .ibo-button-group>*+*.ui-button.ui-dialog-titlebar-close:active::before,.ui-dialog .ibo-button-group>*+*.ui-button.ui-dialog-titlebar-close.ui-datepicker-current:active::before,.ui-dialog .ibo-button-group>*+*.ui-button.ui-dialog-titlebar-close.ui-datepicker-close:active::before,.ui-dialog .ibo-button-group>*+*.ibo-is-alternative.ui-button::before:active,.ibo-button-group>*+*.ibo-is-alternative.ui-datepicker-current::before:active,.ui-dialog .ibo-button-group>*+*.ui-datepicker-current.ui-button.ui-dialog-titlebar-close:active::before,.ibo-button-group>*+*.ibo-is-alternative.ui-datepicker-close::before:active,.ui-dialog .ibo-button-group>*+*.ui-datepicker-close.ui-button.ui-dialog-titlebar-close:active::before{border-left-color:#2E3440}.ibo-button-group>*+*.ibo-is-alternative.ibo-is-secondary:disabled::before,.ui-dialog .ibo-button-group>*+*.ibo-is-secondary.ui-button.ui-dialog-titlebar-close::before:disabled,.ui-dialog .ibo-button-group>*+*.ui-button.ui-dialog-titlebar-close:disabled::before,.ui-dialog .ibo-button-group>*+*.ui-button.ui-dialog-titlebar-close.ui-datepicker-current:disabled::before,.ui-dialog .ibo-button-group>*+*.ui-button.ui-dialog-titlebar-close.ui-datepicker-close:disabled::before,.ui-dialog .ibo-button-group>*+*.ibo-is-alternative.ui-button::before:disabled,.ibo-button-group>*+*.ibo-is-alternative.ui-datepicker-current::before:disabled,.ui-dialog .ibo-button-group>*+*.ui-datepicker-current.ui-button.ui-dialog-titlebar-close:disabled::before,.ibo-button-group>*+*.ibo-is-alternative.ui-datepicker-close::before:disabled,.ui-dialog .ibo-button-group>*+*.ui-datepicker-close.ui-button.ui-dialog-titlebar-close:disabled::before{border-left-color:#4C566A}.ibo-button-group>*+*.ibo-is-alternative.ibo-is-danger::before,.ui-dialog .ibo-button-group>*+*.ibo-is-danger.ui-button.ui-dialog-titlebar-close::before{border-left-color:#BF616A}.ibo-button-group>*+*.ibo-is-alternative.ibo-is-danger:hover::before,.ui-dialog .ibo-button-group>*+*.ibo-is-danger.ui-button.ui-dialog-titlebar-close::before:hover{border-left-color:#973d46}.ibo-button-group>*+*.ibo-is-alternative.ibo-is-danger:active::before,.ui-dialog .ibo-button-group>*+*.ibo-is-danger.ui-button.ui-dialog-titlebar-close::before:active{border-left-color:#973d46}.ibo-button-group>*+*.ibo-is-alternative.ibo-is-danger:disabled::before,.ui-dialog .ibo-button-group>*+*.ibo-is-danger.ui-button.ui-dialog-titlebar-close::before:disabled{border-left-color:#4C566A}.ibo-button-group>*+*.ibo-is-alternative.ibo-is-success::before,.ui-dialog .ibo-button-group>*+*.ibo-is-success.ui-button.ui-dialog-titlebar-close::before{border-left-color:#558b2f}.ibo-button-group>*+*.ibo-is-alternative.ibo-is-success:hover::before,.ui-dialog .ibo-button-group>*+*.ibo-is-success.ui-button.ui-dialog-titlebar-close::before:hover{border-left-color:#558b2f}.ibo-button-group>*+*.ibo-is-alternative.ibo-is-success:active::before,.ui-dialog .ibo-button-group>*+*.ibo-is-success.ui-button.ui-dialog-titlebar-close::before:active{border-left-color:#558b2f}.ibo-button-group>*+*.ibo-is-alternative.ibo-is-success:disabled::before,.ui-dialog .ibo-button-group>*+*.ibo-is-success.ui-button.ui-dialog-titlebar-close::before:disabled{border-left-color:#4C566A}.ibo-button-group>*+*.ibo-is-alternative.ibo-is-red::before,.ui-dialog .ibo-button-group>*+*.ibo-is-red.ui-button.ui-dialog-titlebar-close::before{border-left-color:#BF616A}.ibo-button-group>*+*.ibo-is-alternative.ibo-is-red:hover::before,.ui-dialog .ibo-button-group>*+*.ibo-is-red.ui-button.ui-dialog-titlebar-close::before:hover{border-left-color:#973d46}.ibo-button-group>*+*.ibo-is-alternative.ibo-is-red:active::before,.ui-dialog .ibo-button-group>*+*.ibo-is-red.ui-button.ui-dialog-titlebar-close::before:active{border-left-color:#973d46}.ibo-button-group>*+*.ibo-is-alternative.ibo-is-red:disabled::before,.ui-dialog .ibo-button-group>*+*.ibo-is-red.ui-button.ui-dialog-titlebar-close::before:disabled{border-left-color:#4C566A}.ibo-button-group>*+*.ibo-is-alternative.ibo-is-green::before,.ui-dialog .ibo-button-group>*+*.ibo-is-green.ui-button.ui-dialog-titlebar-close::before{border-left-color:#558b2f}.ibo-button-group>*+*.ibo-is-alternative.ibo-is-green:hover::before,.ui-dialog .ibo-button-group>*+*.ibo-is-green.ui-button.ui-dialog-titlebar-close::before:hover{border-left-color:#558b2f}.ibo-button-group>*+*.ibo-is-alternative.ibo-is-green:active::before,.ui-dialog .ibo-button-group>*+*.ibo-is-green.ui-button.ui-dialog-titlebar-close::before:active{border-left-color:#558b2f}.ibo-button-group>*+*.ibo-is-alternative.ibo-is-green:disabled::before,.ui-dialog .ibo-button-group>*+*.ibo-is-green.ui-button.ui-dialog-titlebar-close::before:disabled{border-left-color:#4C566A}.ibo-button-group>*+*.ibo-is-alternative.ibo-is-cyan::before,.ui-dialog .ibo-button-group>*+*.ibo-is-cyan.ui-button.ui-dialog-titlebar-close::before{border-left-color:#00838f}.ibo-button-group>*+*.ibo-is-alternative.ibo-is-cyan:hover::before,.ui-dialog .ibo-button-group>*+*.ibo-is-cyan.ui-button.ui-dialog-titlebar-close::before:hover{border-left-color:#00838f}.ibo-button-group>*+*.ibo-is-alternative.ibo-is-cyan:active::before,.ui-dialog .ibo-button-group>*+*.ibo-is-cyan.ui-button.ui-dialog-titlebar-close::before:active{border-left-color:#00838f}.ibo-button-group>*+*.ibo-is-alternative.ibo-is-cyan:disabled::before,.ui-dialog .ibo-button-group>*+*.ibo-is-cyan.ui-button.ui-dialog-titlebar-close::before:disabled{border-left-color:#4C566A}.ibo-breadcrumbs{position:relative;margin-right:32px}.ibo-breadcrumbs.ibo-is-overflowing{justify-content:right}.ibo-breadcrumbs *{display:flex;align-items:center}.ibo-breadcrumbs--item{color:#a5cfdc}.ibo-breadcrumbs--item:not(:last-child):hover .ibo-breadcrumbs--item-icon>*{opacity:1;filter:none}.ibo-breadcrumbs--item-icon{margin-right:8px;transition:all 0.1s linear}.ibo-breadcrumbs--item-icon>span{color:#6eb2c6;opacity:0.6}.ibo-breadcrumbs--item-icon>img{height:auto;max-width:16px;opacity:0.3;filter:grayscale(100%)}.ibo-breadcrumbs--item-label{display:inline;max-width:100px}.ibo-breadcrumbs--item:not(:last-child)::after,.ibo-breadcrumbs--previous-items-list-toggler:not(:last-child)::after{content:'\f054';margin:0 12px;color:#4C566A}.ibo-breadcrumbs--previous-items-list-toggler{margin-right:24px;color:#3B4252 !important}.ibo-breadcrumbs--previous-items-list-toggler:not(:last-child)::after{position:absolute;right:-24px}.ibo-breadcrumbs--previous-items-list{display:flex;flex-direction:column;align-items:stretch;position:fixed;top:37px;padding:8px 0;background-color:white}.ibo-breadcrumbs--previous-item{color:#a5cfdc;padding:12px 12px}.ibo-breadcrumbs--previous-item .ibo-breadcrumbs--item-label{max-width:200px}@keyframes ibo-quick-create--drawer--opening{from{top:-310px;box-shadow:none}to{top:100%;box-shadow:0 3px 6px rgba(0, 0, 0, 0.1), 0 10px 20px rgba(0, 0, 0, 0.15)}}.ibo-quick-create{position:relative}.ibo-quick-create.ibo-is-opened .ibo-quick-create--input,.ibo-quick-create.ibo-input-select-icon--menu .ibo-quick-create--input{width:245px}.ibo-quick-create.ibo-is-opened .ibo-quick-create--drawer,.ibo-quick-create.ibo-input-select-icon--menu .ibo-quick-create--drawer{animation-name:ibo-quick-create--drawer--opening;animation-delay:0.1s;animation-duration:0.2s;animation-direction:normal;animation-fill-mode:forwards}.ibo-quick-create--head{background-color:#3B4252}.ibo-quick-create--icon{color:#698fb5;align-self:center;padding:0 16px}.ibo-quick-create--icon:hover{color:#7693b8}.ibo-quick-create--icon:active{color:#5E81AC}.ibo-quick-create--input{width:0;border:none;transition:all 0.2s ease-in-out}.ibo-quick-create--input.selectize-control.single{position:sticky;display:flex}.ibo-quick-create--input.selectize-control.single .selectize-input,.ibo-quick-create--input.selectize-control.single .selectize-input.input-active{display:flex;background-color:transparent;background-image:none;border:none;box-shadow:none}.ibo-quick-create--input.selectize-control.single .selectize-input>input,.ibo-quick-create--input.selectize-control.single .selectize-input.input-active>input{color:#E5E9F0;outline:none;border:none}.ibo-quick-create--input.selectize-control.single .selectize-input>input::placeholder,.ibo-quick-create--input.selectize-control.single .selectize-input.input-active>input::placeholder{color:#D8DEE9}.ibo-quick-create--input.selectize-control.single .selectize-input>input:-ms-input-placeholder,.ibo-quick-create--input.selectize-control.single .selectize-input.input-active>input:-ms-input-placeholder,.ibo-quick-create--input.selectize-control.single .selectize-input>input::-ms-input-placeholder,.ibo-quick-create--input.selectize-control.single .selectize-input.input-active>input::-ms-input-placeholder{color:#D8DEE9}.ibo-quick-create--input.selectize-control.single .selectize-input>.item,.ibo-quick-create--input.selectize-control.single .selectize-input.input-active>.item{color:#E5E9F0;line-height:200%}.ibo-quick-create--input.selectize-control.single .selectize-dropdown{background-color:#3B4252;border:none;border-radius:0}.ibo-quick-create--drawer{z-index:-1;position:absolute;left:0;right:0;top:-310px;padding:16px 16px;background-color:#3B4252;box-shadow:none}.ibo-quick-create--compartment-title{margin-top:8px;margin-bottom:8px;padding-left:32px;overflow-x:hidden;color:#7b88a1}.ibo-quick-create--compartment-title>span{position:relative}.ibo-quick-create--compartment-title>span::before,.ibo-quick-create--compartment-title>span::after{content:"";display:inline-block;position:absolute;top:50%;height:1px;width:600px;border-top:1px solid #7b88a1}.ibo-quick-create--compartment-title>span::before{right:100%;margin-right:8px}.ibo-quick-create--compartment-title>span::after{left:100%;margin-left:8px}.ibo-quick-create--compartment-content{color:#D8DEE9}.ibo-quick-create--compartment-element{display:flex;align-items:center;padding:4px 8px;margin-left:-8px;margin-right:-8px;color:inherit}.ibo-quick-create--compartment-element-image{margin-right:8px;width:20px}.ibo-quick-create--compartment-results--container{width:100% !important}.ibo-quick-create--compartment-results--element>.option{padding:4px 8px;margin-left:-8px;margin-right:-8px;color:inherit}.ibo-quick-create--compartment-results--element>.option.active{background-color:#4C566A;border-radius:3px}.ibo-quick-create--compartment-results--element>.option:hover{cursor:pointer}.ibo-quick-create--compartment-results--element>.option .highlight{font-weight:bold}.ibo-quick-create--compartment--placeholder{align-items:center;display:flex;flex-direction:column}.ibo-quick-create--compartment--placeholder-image>svg{width:66%;height:inherit;margin:24px auto 16px auto;display:flex}.ibo-quick-create--compartment--placeholder-hint{text-align:justify;padding:0 8px;color:#D8DEE9}@keyframes ibo-global-search--drawer--opening{from{top:-310px;box-shadow:none}to{top:100%;box-shadow:0 3px 6px rgba(0, 0, 0, 0.1), 0 10px 20px rgba(0, 0, 0, 0.15)}}.ibo-global-search{position:relative}.ibo-global-search.ibo-is-opened .ibo-global-search--input,.ibo-global-search.ibo-input-select-icon--menu .ibo-global-search--input,.ibo-global-search.ibo-is-opened .ibo-global-search--input:hover,.ibo-global-search.ibo-is-opened .ibo-global-search--input:focus,.ibo-global-search.ibo-is-opened .ibo-global-search--input:active,.ibo-global-search.ibo-input-select-icon--menu .ibo-global-search--input:hover,.ibo-global-search.ibo-input-select-icon--menu .ibo-global-search--input:focus,.ibo-global-search.ibo-input-select-icon--menu .ibo-global-search--input:active{padding:8px 8px;width:245px}.ibo-global-search.ibo-is-opened .ibo-global-search--drawer,.ibo-global-search.ibo-input-select-icon--menu .ibo-global-search--drawer{animation-name:ibo-global-search--drawer--opening;animation-delay:0.1s;animation-duration:0.2s;animation-direction:normal;animation-fill-mode:forwards}.ibo-global-search--head{background-color:#3B4252}.ibo-global-search--icon{color:#698fb5;align-self:center;padding:0 16px}.ibo-global-search--icon:hover{color:#7693b8}.ibo-global-search--icon:active{color:#5E81AC}.ibo-global-search--input,.ibo-global-search--input:hover,.ibo-global-search--input:focus,.ibo-global-search--input:active{padding:0;width:0;color:#E5E9F0;background-color:transparent;border:none;outline:none;transition:all 0.2s ease-in-out}.ibo-global-search--input::placeholder,.ibo-global-search--input:hover::placeholder,.ibo-global-search--input:focus::placeholder,.ibo-global-search--input:active::placeholder{color:#D8DEE9}.ibo-global-search--input:-ms-input-placeholder,.ibo-global-search--input:hover:-ms-input-placeholder,.ibo-global-search--input:focus:-ms-input-placeholder,.ibo-global-search--input:active:-ms-input-placeholder,.ibo-global-search--input::-ms-input-placeholder,.ibo-global-search--input:hover::-ms-input-placeholder,.ibo-global-search--input:focus::-ms-input-placeholder,.ibo-global-search--input:active::-ms-input-placeholder{color:#D8DEE9}.ibo-global-search--drawer{z-index:-1;position:absolute;left:0;right:0;top:-310px;padding:16px 16px;background-color:#3B4252;box-shadow:none}.ibo-global-search--compartment-title{margin-bottom:8px;padding-left:32px;overflow-x:hidden;color:#7b88a1}.ibo-global-search--compartment-title>span{position:relative}.ibo-global-search--compartment-title>span::before,.ibo-global-search--compartment-title>span::after{content:"";display:inline-block;position:absolute;top:50%;height:1px;width:600px;border-top:1px solid #7b88a1}.ibo-global-search--compartment-title>span::before{right:100%;margin-right:8px}.ibo-global-search--compartment-title>span::after{left:100%;margin-left:8px}.ibo-global-search--compartment-content{color:#D8DEE9}.ibo-global-search--compartment-element{display:flex;align-items:center;color:inherit}.ibo-global-search--compartment-element:not(:last-child){margin-bottom:8px}.ibo-global-search--compartment-element-image{margin-right:8px;width:20px}.ibo-global-search--compartment--placeholder{align-items:center;display:flex;flex-direction:column}.ibo-global-search--compartment--placeholder-image>svg{width:66%;height:inherit;margin:24px auto 16px auto;display:flex}.ibo-global-search--compartment--placeholder-hint{text-align:justify;padding:0 8px;color:#E5E9F0}.ibo-popover-menu,.ui-menu,.ui-multiselect-menu,.ibo-input-select-icon--menu,.graph_config .toolkit_menu.graph>ul>li ul{display:none;padding:0;background-color:#3B4252;border-radius:3px;flex-wrap:wrap;position:absolute}.ibo-popover-menu.ibo-is-opened,.ibo-is-opened.ui-menu,.ui-menu.ibo-input-select-icon--menu,.ibo-is-opened.ui-multiselect-menu,.ui-multiselect-menu.ibo-input-select-icon--menu,.ibo-is-opened.ibo-input-select-icon--menu,.ibo-input-select-icon--menu,.graph_config .toolkit_menu.graph>ul>li ul.ibo-is-opened,.graph_config .toolkit_menu.graph>ul>li ul.ibo-input-select-icon--menu,.ibo-popover-menu.ibo-input-select-icon--menu,.ibo-input-select-icon--menu.ui-menu,.ibo-input-select-icon--menu.ui-multiselect-menu{display:flex;flex-direction:column}.ibo-popover-menu--toggler-visual-hint{margin-left:0.5rem}.ibo-popover-menu--section,.ui-multiselect-checkboxes{display:flex;flex-direction:column;align-self:flex-start;margin:0 0;width:100%;white-space:nowrap;overflow:hidden}.ibo-popover-menu--section:first-child,.ui-multiselect-checkboxes:first-child{border-radius:3px 3px 0 0}.ibo-popover-menu--section:last-child,.ui-multiselect-checkboxes:last-child{border-radius:0 0 3px 3px}.ibo-popover-menu--item,.ui-menu-item,.ui-multiselect-checkboxes li,.ibo-input-select-icon--menu--item,.graph_config .toolkit_menu.graph>ul>li ul li{padding:12px 24px 12px 16px;color:#D8DEE9}.ibo-popover-menu--item a,.ui-menu-item a,.ui-multiselect-checkboxes li a,.ibo-input-select-icon--menu--item a,.graph_config .toolkit_menu.graph>ul>li ul li a{color:#D8DEE9}.ibo-popover-menu--item:hover,.ui-menu-item:hover,.ui-multiselect-checkboxes li:hover,.ibo-input-select-icon--menu--item:hover,.graph_config .toolkit_menu.graph>ul>li ul li:hover{background-color:#4C566A;color:inherit}.ibo-popover-menu--item.ibo-popover-menu--item-separator,.ibo-popover-menu--item-separator.ui-menu-item,.ui-menu-item.ui-autocomplete-category,.ui-multiselect-checkboxes li.ibo-popover-menu--item-separator,.ui-multiselect-checkboxes li.ui-autocomplete-category,.ibo-popover-menu--item-separator.ibo-input-select-icon--menu--item,.ibo-input-select-icon--menu--item.ui-autocomplete-category,.graph_config .toolkit_menu.graph>ul>li ul li.ibo-popover-menu--item-separator,.graph_config .toolkit_menu.graph>ul>li ul li.ui-autocomplete-category,.ibo-popover-menu--item.ui-autocomplete-category,.ui-autocomplete-category.ui-menu-item,.ui-autocomplete-category.ibo-input-select-icon--menu--item{padding:0;margin:0;background-color:#D8DEE9}.ibo-popover-menu--item--icon{padding-right:5px;color:#3B4252;font-size:1.33rem}#ibo-navigation-menu--notifications-menu{flex-flow:column;min-width:250px}#ibo-navigation-menu--notifications-menu .ibo-navigation-menu--notifications--messages-section{overflow:auto}.ibo-navigation-menu--notifications--show-all-messages,.ibo-navigation-menu--notifications-dismiss-all,.ibo-navigation-menu--notifications-show-all-multiple{overflow-x:inherit;text-align:center;min-height:45px}.ibo-navigation-menu--notifications--item--image{max-width:20px;max-height:20px;margin:0 6px;border-radius:100%}img.ibo-navigation-menu--notifications--item--image[src=""]{display:none}img.ibo-navigation-menu--notifications--item--image:not([src=""])~i.ibo-navigation-menu--notifications--item--image{display:none}.ibo-navigation-menu--notifications--item--bottom-text{display:flex;flex-direction:column;align-items:center;float:right;align-self:center;margin-left:auto}.ibo-navigation-menu--notifications--item--content{padding:0 14px}.ibo-navigation-menu--notifications--item--content img{max-height:100px;padding:5px}.ibo-navigation-menu--notifications-item{display:flex;flex-direction:row}.ibo-navigation-menu--notifications--item--new-message-indicator{width:10px;height:10px;background-color:#429ae1;border-radius:100%;margin-top:4px}.ibo-navigation-menu--notifications-show-all-multiple~.ibo-popover-menu .ibo-navigation-menu--notifications--item--new-message-indicator,.ibo-navigation-menu--notifications-show-all-multiple~.ui-menu .ibo-navigation-menu--notifications--item--new-message-indicator,.ibo-navigation-menu--notifications-show-all-multiple~.ui-multiselect-menu .ibo-navigation-menu--notifications--item--new-message-indicator,.ibo-navigation-menu--notifications-show-all-multiple~.ibo-input-select-icon--menu .ibo-navigation-menu--notifications--item--new-message-indicator,.graph_config .toolkit_menu.graph>ul>li .ibo-navigation-menu--notifications-show-all-multiple~ul .ibo-navigation-menu--notifications--item--new-message-indicator{display:inline-block;margin-right:15px}.ibo-navigation-menu--notifications-dismiss-all--icon{margin:0 10px 0 0}.ibo-popover-menu--item--no-message{text-align:center}.ibo-popover-menu--item--no-message--image>svg{display:flex;width:100%;height:inherit;padding:15px}.ibo-panel.ibo-has-sticky-header>.ibo-panel--header .ibo-panel--title,.ibo-panel.ibo-has-sticky-header>.ibo-panel--header .ibo-panel--subtitle,.ibo-panel.ibo-has-sticky-header>.ibo-panel--header .ibo-panel--icon,.ibo-panel.ibo-has-sticky-header>.ibo-panel--header .ibo-panel--titles,.ibo-object-details.ibo-has-sticky-header>.ibo-panel--header .ibo-panel--header-left{transition:all 0.15s linear}.ibo-panel{--ibo-main-color:#434C5E;position:relative}.ibo-panel.ibo-has-icon .ibo-panel--titles{padding-left:16px}.ibo-panel.ibo-has-icon.ibo-has-medallion-icon .ibo-panel--header-left{position:relative;z-index:1;margin-left:16px}.ibo-panel.ibo-has-icon.ibo-has-medallion-icon>.ibo-panel--header .ibo-panel--header-left .ibo-panel--icon{position:absolute;bottom:-24px;left:0;overflow:hidden;width:72px;height:72px;min-width:72px;min-height:72px;background-color:#434C5E;border:2px solid #3B4252;border-radius:100%}.ibo-panel.ibo-has-icon.ibo-has-medallion-icon>.ibo-panel--header .ibo-panel--header-left .ibo-panel--titles{padding-left:calc(72px + 16px)}.ibo-panel--header{position:relative;z-index:2;display:flex;justify-content:space-between;align-items:flex-end;margin-bottom:4px}.ibo-panel--header-left{justify-content:left}.ibo-panel--icon{width:48px;height:48px;min-width:48px;min-height:48px}.ibo-panel--icon-background{width:100%;height:100%;background-position:center;background-repeat:no-repeat;background-size:contain}.ibo-panel--icon-background--must-contain{background-size:contain}.ibo-panel--icon-background--must-cover{background-size:cover}.ibo-panel--icon-background--must-zoomout{background-size:66.67%}.ibo-panel--title{display:inline-block;color:#D8DEE9;flex-grow:1}.ibo-panel--subtitle{display:flex;color:#a8b0c1}.ibo-panel--body{position:relative;z-index:1;padding:32px 16px 24px 16px;background-color:#3B4252;border:1px solid #232831;border-radius:5px;overflow:hidden}.ibo-panel--body::before{position:absolute;top:0;left:0;display:block;background-color:var(--ibo-main-color);content:"";width:100%;height:8px;padding-bottom:8px}.ibo-panel.ibo-is-primary>.ibo-panel--body::before{background-color:#698fb5}.ibo-panel.ibo-is-secondary>.ibo-panel--body::before,.ui-dialog .ibo-panel.ui-button>.ibo-panel--body::before,.ibo-panel.ui-datepicker-current>.ibo-panel--body::before,.ibo-panel.ui-datepicker-close>.ibo-panel--body::before{background-color:#434C5E}.ibo-panel.ibo-is-neutral>.ibo-panel--body::before,.ui-dialog .ibo-panel.ui-button.ui-dialog-titlebar-close>.ibo-panel--body::before{background-color:#434C5E}.ibo-panel.ibo-is-information>.ibo-panel--body::before{background-color:#3182ce}.ibo-panel.ibo-is-success>.ibo-panel--body::before{background-color:#7cb342}.ibo-panel.ibo-is-failure>.ibo-panel--body::before{background-color:#BF616A}.ibo-panel.ibo-is-warning>.ibo-panel--body::before{background-color:#dd6c20}.ibo-panel.ibo-is-danger>.ibo-panel--body::before{background-color:#BF616A}.ibo-panel.ibo-is-grey>.ibo-panel--body::before{background-color:#434C5E}.ibo-panel.ibo-is-blue-grey>.ibo-panel--body::before{background-color:#546e7a}.ibo-panel.ibo-is-blue>.ibo-panel--body::before{background-color:#2c5382}.ibo-panel.ibo-is-cyan>.ibo-panel--body::before{background-color:#00aac1}.ibo-panel.ibo-is-green>.ibo-panel--body::before{background-color:#7cb342}.ibo-panel.ibo-is-orange>.ibo-panel--body::before{background-color:#dd6c20}.ibo-panel.ibo-is-red>.ibo-panel--body::before{background-color:#BF616A}.ibo-panel.ibo-is-pink>.ibo-panel--body::before{background-color:#d53f8c}.ibo-panel--collapsible-toggler{display:inline-block;margin-right:8px;font-size:1.5rem;color:#616e88;cursor:pointer}.ibo-panel .ibo-panel--collapsible-toggler--opened{display:block}.ibo-panel .ibo-panel--collapsible-toggler--closed{display:none}.ibo-panel:not(.ibo-is-opened) .ibo-panel--collapsible-toggler--closed{display:block}.ibo-panel:not(.ibo-is-opened) .ibo-panel--collapsible-toggler--opened{display:none}.ibo-panel:not(.ibo-is-opened) .ibo-panel--body{display:none}.ibo-panel.ibo-has-sticky-header>.ibo-panel--header{position:sticky;top:0;border:transparent;transition-property:all, top, background-color;transition-duration:0.15s, 0s, 0s;transition-timing-function:linear}.ibo-panel.ibo-has-sticky-header>.ibo-panel--header .ibo-panel--title,.ibo-panel.ibo-has-sticky-header>.ibo-panel--header .ibo-panel--subtitle,.ibo-panel.ibo-has-sticky-header>.ibo-panel--header .ibo-panel--icon,.ibo-panel.ibo-has-sticky-header>.ibo-panel--header .ibo-panel--titles{}.ibo-panel.ibo-has-sticky-header>.ibo-panel--header.ibo-is-sticking{padding-top:4px;padding-bottom:4px;background-color:#3B4252;border:1px solid #616e88;align-items:center}.ibo-panel.ibo-has-sticky-header>.ibo-panel--header.ibo-is-sticking .ibo-panel--title{font-size:1.17rem}.ibo-panel.ibo-has-sticky-header>.ibo-panel--header.ibo-is-sticking .ibo-panel--subtitle{font-size:1rem}.ibo-panel.ibo-has-sticky-header.ibo-has-icon.ibo-has-medallion-icon>.ibo-panel--header{}.ibo-panel.ibo-has-sticky-header.ibo-has-icon.ibo-has-medallion-icon>.ibo-panel--header.ibo-is-sticking .ibo-panel--icon{bottom:-12px;width:48px;height:48px;min-width:48px;min-height:48px;border:1px solid #616e88}.ibo-panel.ibo-has-sticky-header.ibo-has-icon.ibo-has-medallion-icon>.ibo-panel--header.ibo-is-sticking .ibo-panel--titles{padding-left:calc(48px + 16px)}.ibo-collapsible-section--header{display:flex;align-items:stretch}.ibo-collapsible-section.ibo-is-opened .ibo-collapsible-section--minimize-button,.ibo-collapsible-section.ibo-input-select-icon--menu .ibo-collapsible-section--minimize-button{display:block}.ibo-collapsible-section.ibo-is-opened .ibo-collapsible-section--maximize-button,.ibo-collapsible-section.ibo-input-select-icon--menu .ibo-collapsible-section--maximize-button{display:none}.ibo-collapsible-section:not(.ibo-is-opened) .ibo-collapsible-section--minimize-button{display:none}.ibo-collapsible-section:not(.ibo-is-opened) .ibo-collapsible-section--maximize-button{display:block}.ibo-collapsible-section:not(.ibo-is-opened) .ibo-collapsible-section--body{display:none}.ibo-collapsible-section .ibo-collapsible-section--header{cursor:pointer}.ibo-collapsible-section .ibo-collapsible-section--header:hover i{opacity:0.8}.ibo-collapsible-section .ibo-collapsible-section--header .ibo-collapsible-section--action-button{align-self:center}.ibo-collapsible-section .ibo-collapsible-section--header .ibo-collapsible-section--action-button.ibo-collapsible-section--maximize-button,.ibo-collapsible-section .ibo-collapsible-section--header .ibo-collapsible-section--action-button.ibo-collapsible-section--minimize-button{color:#616e88;margin-right:8px}.ibo-collapsible-section .ibo-collapsible-section--header .ibo-collapsible-section--title{color:#D8DEE9;flex-grow:1}.ibo-collapsible-section .ibo-collapsible-section--body{position:relative;padding:24px 16px 16px;background-color:#3B4252;border:solid 1px #616e88;border-radius:5px;overflow:hidden}.ibo-dashlet{position:relative;width:calc(100% - 24px);margin:calc(24px / 2) calc(24px / 2)}.ibo-dashlet.dashlet-selected{position:relative}.ibo-dashlet--is-inline{width:auto}.ibo-details>.ibo-prop--apply{display:table-column}.ibo-details{margin-top:5px}.ibo-dashlet-blocker{position:absolute;z-index:9;top:0;left:0;width:100%;height:100%;cursor:not-allowed}:root{--ibo-dashlet-badge--min-width:200px;--ibo-dashlet-badge--padding-x:16px;--ibo-dashlet-badge--padding-y:16px;--ibo-dashlet-badge--background-color:#3B4252;--ibo-dashlet-badge--border:1px solid #232831;--ibo-dashlet-badge--border-radius:5px}.ibo-dashlet-badge{max-width:350px;flex-basis:200px;flex-grow:1;flex-shrink:1;padding:16px 16px;background-color:#3B4252;border:1px solid #232831;border-radius:5px}.ibo-dashlet-badge--body{display:flex;justify-items:left;align-items:center}.ibo-dashlet-badge--icon-container{margin-right:16px}.ibo-dashlet-badge--icon{width:48px;min-width:48px;max-height:48px}.ibo-dashlet-badge--actions{flex-grow:1;overflow-x:hidden}.ibo-dashlet-badge--action-list{color:inherit}.ibo-dashlet-badge--action-list-count{margin-right:8px}.ibo-dashlet-badge--action-list-label{display:inline-block}.ibo-dashlet-badge--action-create-icon{margin-right:8px}.ibo-dashlet-header-static{padding:16px 16px 0 16px;overflow-x:hidden}.ibo-dashlet-header-static--body{position:relative;display:inline-flex;justify-items:left;align-items:center;margin-left:48px;color:#D8DEE9}.ibo-dashlet-header-static--body::before,.ibo-dashlet-header-static--body::after{content:"";position:absolute;top:50%;width:10000px;height:1px;border-bottom:2px solid #616e88}.ibo-dashlet-header-static--body::before{right:calc(100% + 16px)}.ibo-dashlet-header-static--body::after{left:calc(100% + 16px)}.ibo-dashlet-header-static--icon-container{margin-right:16px}.ibo-dashlet-header-static--icon{width:48px;min-width:48px;max-height:48px}.ibo-dashlet-header-dynamic--container{display:flex;flex-wrap:wrap}.ibo-dashlet-header-dynamic--count{margin-right:10px}.ibo-input,.ui-autocomplete-input,.ui-multiselect,.dataTables_length select,.ui_tpicker_hour_slider>select,.ui_tpicker_minute_slider>select,.ui_tpicker_second_slider>select,select.ibo-input-select-placeholder,.search_form_handler .sf_criterion_area .search_form_criteria .sfc_form_group .sfc_fg_operators .sfc_fg_operator .sfc_op_content input[type="text"],.search_form_handler .sf_filter .sff_input_wrapper input[type="text"]{height:30px;width:100%;background-color:#434C5E;color:#D8DEE9;padding:0 10px;border:1px solid #191c22;border-radius:3px}.ibo-input:focus,.ui-autocomplete-input:focus,.ui-multiselect:focus,.dataTables_length select:focus,.ui_tpicker_hour_slider>select:focus,.ui_tpicker_minute_slider>select:focus,.ui_tpicker_second_slider>select:focus,select.ibo-input-select-placeholder:focus,.search_form_handler .sf_criterion_area .search_form_criteria .sfc_form_group .sfc_fg_operators .sfc_fg_operator .sfc_op_content input[type="text"]:focus,.search_form_handler .sf_filter .sff_input_wrapper input[type="text"]:focus{border:1px solid #88C0D0}.ibo-input:disabled,.ui-autocomplete-input:disabled,.ui-multiselect:disabled,.dataTables_length select:disabled,.ui_tpicker_hour_slider>select:disabled,.ui_tpicker_minute_slider>select:disabled,.ui_tpicker_second_slider>select:disabled,select.ibo-input-select-placeholder:disabled,.search_form_handler .sf_criterion_area .search_form_criteria .sfc_form_group .sfc_fg_operators .sfc_fg_operator .sfc_op_content input[type="text"]:disabled,.search_form_handler .sf_filter .sff_input_wrapper input[type="text"]:disabled{background-color:#4C566A;color:#D8DEE9}.ibo-input::placeholder,.ui-autocomplete-input::placeholder,.ui-multiselect::placeholder,.dataTables_length select::placeholder,.ui_tpicker_hour_slider>select::placeholder,.ui_tpicker_minute_slider>select::placeholder,.ui_tpicker_second_slider>select::placeholder,select.ibo-input-select-placeholder::placeholder,.search_form_handler .sf_criterion_area .search_form_criteria .sfc_form_group .sfc_fg_operators .sfc_fg_operator .sfc_op_content input[type="text"]::placeholder,.search_form_handler .sf_filter .sff_input_wrapper input[type="text"]::placeholder{color:#D8DEE9}textarea.ibo-input,textarea.ui-autocomplete-input,textarea.ui-multiselect{height:unset}.ibo-input-wrapper.is-error .ibo-input,.is-error.ui_tpicker_hour_slider .ibo-input,.is-error.ui_tpicker_hour_slider .ui-autocomplete-input,.is-error.ui_tpicker_hour_slider .ui-multiselect,.is-error.ui_tpicker_hour_slider .dataTables_length select,.dataTables_length .is-error.ui_tpicker_hour_slider select,.is-error.ui_tpicker_hour_slider .ui_tpicker_hour_slider>select,.is-error.ui_tpicker_hour_slider .ui_tpicker_minute_slider>select,.is-error.ui_tpicker_hour_slider .ui_tpicker_second_slider>select,.is-error.ui_tpicker_hour_slider select.ibo-input-select-placeholder,.is-error.ui_tpicker_hour_slider .search_form_handler .sf_criterion_area .search_form_criteria .sfc_form_group .sfc_fg_operators .sfc_fg_operator .sfc_op_content input[type="text"],.search_form_handler .sf_criterion_area .search_form_criteria .sfc_form_group .sfc_fg_operators .sfc_fg_operator .sfc_op_content .is-error.ui_tpicker_hour_slider input[type="text"],.is-error.ui_tpicker_hour_slider .search_form_handler .sf_filter .sff_input_wrapper input[type="text"],.search_form_handler .sf_filter .sff_input_wrapper .is-error.ui_tpicker_hour_slider input[type="text"],.is-error.ui_tpicker_minute_slider .ibo-input,.is-error.ui_tpicker_minute_slider .ui-autocomplete-input,.is-error.ui_tpicker_minute_slider .ui-multiselect,.is-error.ui_tpicker_minute_slider .dataTables_length select,.dataTables_length .is-error.ui_tpicker_minute_slider select,.is-error.ui_tpicker_minute_slider .ui_tpicker_hour_slider>select,.is-error.ui_tpicker_minute_slider .ui_tpicker_minute_slider>select,.is-error.ui_tpicker_minute_slider .ui_tpicker_second_slider>select,.is-error.ui_tpicker_minute_slider select.ibo-input-select-placeholder,.is-error.ui_tpicker_minute_slider .search_form_handler .sf_criterion_area .search_form_criteria .sfc_form_group .sfc_fg_operators .sfc_fg_operator .sfc_op_content input[type="text"],.search_form_handler .sf_criterion_area .search_form_criteria .sfc_form_group .sfc_fg_operators .sfc_fg_operator .sfc_op_content .is-error.ui_tpicker_minute_slider input[type="text"],.is-error.ui_tpicker_minute_slider .search_form_handler .sf_filter .sff_input_wrapper input[type="text"],.search_form_handler .sf_filter .sff_input_wrapper .is-error.ui_tpicker_minute_slider input[type="text"],.is-error.ui_tpicker_second_slider .ibo-input,.is-error.ui_tpicker_second_slider .ui-autocomplete-input,.is-error.ui_tpicker_second_slider .ui-multiselect,.is-error.ui_tpicker_second_slider .dataTables_length select,.dataTables_length .is-error.ui_tpicker_second_slider select,.is-error.ui_tpicker_second_slider .ui_tpicker_hour_slider>select,.is-error.ui_tpicker_second_slider .ui_tpicker_minute_slider>select,.is-error.ui_tpicker_second_slider .ui_tpicker_second_slider>select,.is-error.ui_tpicker_second_slider select.ibo-input-select-placeholder,.is-error.ui_tpicker_second_slider .search_form_handler .sf_criterion_area .search_form_criteria .sfc_form_group .sfc_fg_operators .sfc_fg_operator .sfc_op_content input[type="text"],.search_form_handler .sf_criterion_area .search_form_criteria .sfc_form_group .sfc_fg_operators .sfc_fg_operator .sfc_op_content .is-error.ui_tpicker_second_slider input[type="text"],.is-error.ui_tpicker_second_slider .search_form_handler .sf_filter .sff_input_wrapper input[type="text"],.search_form_handler .sf_filter .sff_input_wrapper .is-error.ui_tpicker_second_slider input[type="text"],.ibo-input-wrapper.is-error .ui-autocomplete-input,.ibo-input-wrapper.is-error .ui-multiselect,.ibo-input-wrapper.is-error .dataTables_length select,.dataTables_length .ibo-input-wrapper.is-error select,.ibo-input-wrapper.is-error .ui_tpicker_hour_slider>select,.ibo-input-wrapper.is-error .ui_tpicker_minute_slider>select,.ibo-input-wrapper.is-error .ui_tpicker_second_slider>select,.ibo-input-wrapper.is-error select.ibo-input-select-placeholder,.ibo-input-wrapper.is-error .search_form_handler .sf_criterion_area .search_form_criteria .sfc_form_group .sfc_fg_operators .sfc_fg_operator .sfc_op_content input[type="text"],.search_form_handler .sf_criterion_area .search_form_criteria .sfc_form_group .sfc_fg_operators .sfc_fg_operator .sfc_op_content .ibo-input-wrapper.is-error input[type="text"],.ibo-input-wrapper.is-error .search_form_handler .sf_filter .sff_input_wrapper input[type="text"],.search_form_handler .sf_filter .sff_input_wrapper .ibo-input-wrapper.is-error input[type="text"],.ibo-input-field-wrapper.is-error .ibo-input,.ibo-input-field-wrapper.is-error .ui-autocomplete-input,.ibo-input-field-wrapper.is-error .ui-multiselect,.ibo-input-field-wrapper.is-error .dataTables_length select,.dataTables_length .ibo-input-field-wrapper.is-error select,.ibo-input-field-wrapper.is-error .ui_tpicker_hour_slider>select,.ibo-input-field-wrapper.is-error .ui_tpicker_minute_slider>select,.ibo-input-field-wrapper.is-error .ui_tpicker_second_slider>select,.ibo-input-field-wrapper.is-error select.ibo-input-select-placeholder,.ibo-input-field-wrapper.is-error .search_form_handler .sf_criterion_area .search_form_criteria .sfc_form_group .sfc_fg_operators .sfc_fg_operator .sfc_op_content input[type="text"],.search_form_handler .sf_criterion_area .search_form_criteria .sfc_form_group .sfc_fg_operators .sfc_fg_operator .sfc_op_content .ibo-input-field-wrapper.is-error input[type="text"],.ibo-input-field-wrapper.is-error .search_form_handler .sf_filter .sff_input_wrapper input[type="text"],.search_form_handler .sf_filter .sff_input_wrapper .ibo-input-field-wrapper.is-error input[type="text"],.ibo-input-wrapper.is-error .ibo-input-vanilla,.is-error.ui_tpicker_hour_slider .ibo-input-vanilla,.is-error.ui_tpicker_minute_slider .ibo-input-vanilla,.is-error.ui_tpicker_second_slider .ibo-input-vanilla,.ibo-input-field-wrapper.is-error .ibo-input-vanilla,.ibo-input-wrapper.is-error .cke,.is-error.ui_tpicker_hour_slider .cke,.is-error.ui_tpicker_minute_slider .cke,.is-error.ui_tpicker_second_slider .cke,.ibo-input-field-wrapper.is-error .cke,.ibo-input-wrapper.is-error textarea,.is-error.ui_tpicker_hour_slider textarea,.is-error.ui_tpicker_minute_slider textarea,.is-error.ui_tpicker_second_slider textarea,.ibo-input-field-wrapper.is-error textarea{border:1px solid #b44953}.ibo-input-wrapper.is-error .ibo-input-vanilla input,.is-error.ui_tpicker_hour_slider .ibo-input-vanilla input,.is-error.ui_tpicker_minute_slider .ibo-input-vanilla input,.is-error.ui_tpicker_second_slider .ibo-input-vanilla input,.ibo-input-field-wrapper.is-error .ibo-input-vanilla input{border:0;background-color:#11ffee00}input.ibo-input-vanilla{width:unset;display:initial}.ibo-input-wrapper--with-buttons,.ibo-input-select-wrapper--with-buttons{position:relative;display:flex}.ibo-field-validation{color:#f2e0e2}.file-input{display:block;position:relative}.ibo-input--label-right{margin-right:4px;display:inline}.ibo-input--label-left{margin-left:4px;display:inline}.disabled{background-color:#4C566A}.ibo-input-checkbox{height:16px;width:auto}.ibo-input-date-wrapper{position:relative}.ibo-input-date{display:inline-block;width:100%}.ibo-input-date+button{position:absolute;display:inline-block;margin-left:-20px;margin-top:5px;padding:0;background-color:transparent;color:#2E3440;border:none}.ibo-input-datetime-wrapper{position:relative}.ibo-input-datetime{display:inline-block;width:100%}.ibo-input-datetime--action-button{position:absolute;display:inline-block;margin-left:-20px;margin-top:5px;padding:0;color:#2E3440}.ui_tpicker_hour_slider>select,.ui_tpicker_minute_slider>select,.ui_tpicker_second_slider>select{width:auto;padding-right:18px}.ibo-input-duration{display:inline-block;width:unset;text-align:right}.ibo-input-image{display:flex;justify-content:flex-start;align-items:flex-start}.ibo-input-image--image-view{position:relative;overflow:hidden;min-height:96px;background-color:#D8DEE9;border-radius:5px}.ibo-input-image--image-view img[src=""],.ibo-input-image--image-view img[src="null"]{visibility:hidden}.ibo-input-image--image-view input[type="file"]{position:absolute;top:0;bottom:0;left:0;right:0;width:100%;opacity:0}.ibo-input-image--edit-buttons{display:flex;flex-direction:column;margin-left:0.5rem}.ibo-input-image--edit-buttons .ibo-button+.ibo-button,.ibo-input-image--edit-buttons .ui-dialog .ui-button+.ibo-button,.ibo-input-image--edit-buttons .ui-dialog .ui-dialog .ui-button+.ui-button,.ui-dialog .ibo-input-image--edit-buttons .ui-dialog .ui-button+.ui-button,.ibo-input-image--edit-buttons .ui-dialog .ui-button+.ui-datepicker-current,.ibo-input-image--edit-buttons .ui-dialog .ui-button+.ui-datepicker-close,.ui-dialog .ibo-input-image--edit-buttons .ui-button+.ibo-button,.ibo-input-image--edit-buttons .ui-datepicker-current+.ibo-button,.ibo-input-image--edit-buttons .ui-dialog .ui-datepicker-current+.ui-button,.ui-dialog .ibo-input-image--edit-buttons .ui-datepicker-current+.ui-button,.ibo-input-image--edit-buttons .ui-datepicker-current+.ui-datepicker-current,.ibo-input-image--edit-buttons .ui-datepicker-current+.ui-datepicker-close,.ibo-input-image--edit-buttons .ui-datepicker-close+.ibo-button,.ibo-input-image--edit-buttons .ui-dialog .ui-datepicker-close+.ui-button,.ui-dialog .ibo-input-image--edit-buttons .ui-datepicker-close+.ui-button,.ibo-input-image--edit-buttons .ui-datepicker-close+.ui-datepicker-current,.ibo-input-image--edit-buttons .ui-datepicker-close+.ui-datepicker-close,.ibo-input-image--edit-buttons .ui-dialog .ibo-button+.ui-button,.ui-dialog .ibo-input-image--edit-buttons .ibo-button+.ui-button,.ibo-input-image--edit-buttons .ibo-button+.ui-datepicker-current,.ibo-input-image--edit-buttons .ibo-button+.ui-datepicker-close{margin-top:0.5rem;margin-left:0}.ibo-input-richtext-placeholder{height:200px;width:100%;visibility:hidden}.ibo-input-select,.ui-multiselect,.ui_tpicker_hour_slider>select,.ui_tpicker_minute_slider>select,.ui_tpicker_second_slider>select,select.ibo-input-select-placeholder{display:inline-flex;min-width:50px}.ibo-input-select:not(.ibo-input-select-autocomplete):not(.ibo-input-selectize),.ui-multiselect:not(.ibo-input-selectize):not(.ibo-input-select-autocomplete),.ui_tpicker_hour_slider>select:not(.ibo-input-selectize):not(.ibo-input-select-autocomplete),.ui_tpicker_minute_slider>select:not(.ibo-input-selectize):not(.ibo-input-select-autocomplete),.ui_tpicker_second_slider>select:not(.ibo-input-selectize):not(.ibo-input-select-autocomplete),select.ibo-input-select-placeholder:not(.ibo-input-selectize):not(.ibo-input-select-autocomplete){appearance:none}.ibo-input-select.ibo-input-selectize,.ibo-input-selectize.ui-multiselect,.ui_tpicker_hour_slider>select.ibo-input-selectize,.ui_tpicker_minute_slider>select.ibo-input-selectize,.ui_tpicker_second_slider>select.ibo-input-selectize,select.ibo-input-selectize.ibo-input-select-placeholder{padding-right:0;padding-left:0;min-width:150px !important}.ibo-input-select.ibo-input-selectize input,.ibo-input-selectize.ui-multiselect input,.ui_tpicker_hour_slider>select.ibo-input-selectize input,.ui_tpicker_minute_slider>select.ibo-input-selectize input,.ui_tpicker_second_slider>select.ibo-input-selectize input,select.ibo-input-selectize.ibo-input-select-placeholder input{border-width:0px;color:inherit;border-color:white;padding-left:10px}.ibo-input-select.ibo-input-selectize>[data-value],.ibo-input-selectize.ui-multiselect>[data-value],.ui_tpicker_hour_slider>select.ibo-input-selectize>[data-value],.ui_tpicker_minute_slider>select.ibo-input-selectize>[data-value],.ui_tpicker_second_slider>select.ibo-input-selectize>[data-value],select.ibo-input-selectize.ibo-input-select-placeholder>[data-value]{height:100%;line-height:30px;padding-left:10px}.ibo-input-select[size],.ui-multiselect[size],.ui_tpicker_hour_slider>select[size],.ui_tpicker_minute_slider>select[size],.ui_tpicker_second_slider>select[size],select.ibo-input-select-placeholder[size]{height:auto}.ibo-input-select[multiple],.ui-multiselect[multiple],.ui_tpicker_hour_slider>select[multiple],.ui_tpicker_minute_slider>select[multiple],.ui_tpicker_second_slider>select[multiple],select.ibo-input-select-placeholder[multiple]{padding-left:unset;padding-right:unset}.ibo-input-select[multiple] option,.ui-multiselect[multiple] option,.ui_tpicker_hour_slider>select[multiple] option,.ui_tpicker_minute_slider>select[multiple] option,.ui_tpicker_second_slider>select[multiple] option,select.ibo-input-select-placeholder[multiple] option{padding:4px 10px}.ibo-input-select-autocomplete{min-width:150px !important;text-overflow:ellipsis}.ibo-input-selectize{min-width:150px !important}.ibo-input-selectize>div{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.ibo-input-selectize>input{background-color:unset;border:unset}.ibo-input-selectize>input:focus{outline:none !important}.ibo-input-selectize.input-active{border:1px solid #88C0D0}.ibo-input-select-wrapper,.ui_tpicker_hour_slider,.ui_tpicker_minute_slider,.ui_tpicker_second_slider{position:relative}.ibo-input-select-wrapper--with-buttons .selectize-control{display:grid;width:100%}.ibo-input-select-wrapper::after,.ui_tpicker_hour_slider::after,.ui_tpicker_minute_slider::after,.ui_tpicker_second_slider::after{position:absolute;content:"\f0d7";font-family:"Font Awesome 5 Free";font-weight:600;height:28px;margin-left:-16px;margin-top:1px;padding-top:3px;background-color:inherit;color:#7b88a1;pointer-events:none}.ibo-input-select-container{display:flex}.ibo-input-select-wrapper--with-buttons:not(.ibo-input-select-autocomplete-wrapper)::after{position:absolute;content:"\f0d7";font-family:"Font Awesome 5 Free";font-weight:600;cursor:pointer;right:8px;height:28px;margin-left:-16px;margin-top:1px;padding-top:3px;background-color:inherit;color:#7b88a1;pointer-events:none}.ibo-input-select--action-buttons{position:absolute;display:flex;height:28px;margin-top:0;margin-right:3px;font-size:1rem;background-color:inherit;color:#7b88a1;padding:0 2px;text-align:right;bottom:0;top:0;right:0}.ibo-input-select-wrapper .ibo-input-select--action-buttons,.ui_tpicker_hour_slider .ibo-input-select--action-buttons,.ui_tpicker_minute_slider .ibo-input-select--action-buttons,.ui_tpicker_second_slider .ibo-input-select--action-buttons{margin-right:20px}.ibo-input-select--action-button{display:flex;align-items:center;padding-left:6px;padding-right:2px;float:right}.selectize-dropdown.ui-autocomplete,.selectize-dropdown.set-dropdown,.selectize-dropdown.plugin-custom_itop{z-index:2000;max-height:50vh;max-width:50em;overflow-y:auto}.selectize-dropdown.ui-menu .ui-state-active{margin:unset;background-color:#4C566A;color:#E5E9F0}.ibo-input-select--autocomplete-item{display:flex;justify-content:left;align-items:center}.ibo-input-select--autocomplete-item-image{width:25px;height:25px;min-width:25px;min-height:25px;background-position:center center;background-size:100%;border-radius:100%;margin-right:0.5rem;background-color:#ebf8ff;border:1px solid #434C5E}.ibo-input-select-icon{display:inline-flex;text-align:left}.ibo-input-select-icon>img{max-height:100%;max-width:100%;padding-right:4px}.ibo-input-select-icon>span{overflow:hidden}.ibo-input-select-icon--menu{position:absolute;z-index:21;max-height:300px;overflow-x:hidden;overflow-y:auto;flex-wrap:nowrap}.ibo-input-select-icon--menu--item>*{width:100%;white-space:nowrap;overflow-x:hidden;text-overflow:ellipsis}.ibo-input-select-icon--menu--item>*>.ibo-input-select-icon--menu--icon{max-width:80px;max-height:45px;margin-right:10px}/* + * @copyright Copyright (C) 2010-2021 Combodo SARL + * @license http://opensource.org/licenses/AGPL-3.0 + */.ibo-input-one-way-password-wrapper>*:not(first-child){margin-top:6px}.ibo-input-set>input{height:100%}.ibo-input-set .item[data-value]>.remove{font-size:18px;padding-top:0.15em;border-left:none}.ibo-input-set.has-items::after{content:"\f067";font-family:"Font Awesome 5 Free";font-weight:600;font-size:10px;position:absolute;right:8px;top:5px}.attribute-set .attribute-set-item,.selectize-control.multi .selectize-input.ibo-input-set .attribute-set-item,.selectize-control.multi .ibo-quick-create--input.selectize-control.single .ibo-input-set.selectize-input.input-active .attribute-set-item,.ibo-quick-create--input.selectize-control.single .selectize-control.multi .ibo-input-set.selectize-input.input-active .attribute-set-item{display:inline-block;margin-top:2px;margin-right:0;margin-bottom:2px;padding:4px 6px;max-width:120px;background:white none;border:none;border-radius:3px;box-shadow:0 1px 1px rgba(0, 0, 0, 0.15), 0 0 1px 1px rgba(241, 241, 241, 0.7);color:#191c22;text-shadow:none}.attribute-set .attribute-set-item:not(:first-child),.selectize-control.multi .selectize-input.ibo-input-set .attribute-set-item:not(:first-child),.selectize-control.multi .ibo-quick-create--input.selectize-control.single .ibo-input-set.selectize-input.input-active .attribute-set-item:not(:first-child),.ibo-quick-create--input.selectize-control.single .selectize-control.multi .ibo-input-set.selectize-input.input-active .attribute-set-item:not(:first-child){margin-left:3px}.attribute-set.history-added .attribute-set-item{font-weight:bold}.attribute-set.history-removed .attribute-set-item{text-decoration:line-through;font-style:italic}.selectize-control.multi .selectize-input.ibo-input-set,.selectize-control.multi .ibo-quick-create--input.selectize-control.single .ibo-input-set.selectize-input.input-active,.ibo-quick-create--input.selectize-control.single .selectize-control.multi .ibo-input-set.selectize-input.input-active{padding:5px 8px}.ibo-input-text,textarea{width:100%;min-height:12rem;padding:10px 12px}.ibo-input-text.ibo-is-code,textarea.ibo-is-code{background-color:#434C5E}.ibo-input-text--export{width:100%;min-height:15em}.ibo-pill.ibo-is-new{color:#2a4265;background-color:#ebf8ff}.ibo-pill.ibo-is-neutral,.ui-dialog .ibo-pill.ui-button.ui-dialog-titlebar-close{color:#2a4265;background-color:#ebf8ff}.ibo-pill.ibo-is-waiting{color:#9c4221;background-color:floralwhite}.ibo-pill.ibo-is-success{color:#33691e;background-color:#dcedc8}.ibo-pill.ibo-is-failure{color:#973d46;background-color:#faf2f3}.ibo-pill.ibo-is-frozen{color:#3B4252;background-color:#E5E9F0}.ibo-pill.ibo-is-active{color:#33691e;background-color:#dcedc8}.ibo-pill.ibo-is-inactive{color:#9c4221;background-color:floralwhite}.ibo-pill{--ibo-main-color--100:#ebf8ff;--ibo-main-color--900:#2a4265;max-width:240px;margin-top:4px;margin-bottom:4px;padding:6px 10px;border-radius:3px;color:var(--ibo-main-color--900);background-color:var(--ibo-main-color--100)}.ibo-pill:hover,.ibo-pill:active{color:inherit}.ibo-prop--apply{width:calc(32px + 12px);padding-left:12px}.ibo-prop--apply.ui-state-error:after{color:#2E3440;content:'\f071';vertical-align:bottom}.ibo-prop--apply.ui-state-error>span{display:none !important}.ibo-prop--cancel{width:calc(32px + 8px);padding-left:8px}.ibo-prop--apply,.ibo-prop--cancel{height:28px}.ibo-prop--apply>span,.ibo-prop--cancel>span{display:block;height:28px;width:32px;text-align:center}.ibo-prop--apply>span>div,.ibo-prop--cancel>span>div{display:inline-flex;justify-content:center;align-items:center;width:100%;height:100%}.ibo-title{color:#E5E9F0;padding:12px 0}.ibo-title--icon{width:90px;height:90px;min-width:90px;min-height:90px;overflow:hidden}.ibo-title--icon>.ibo-title--icon-level-2{width:80px;height:80px;min-width:80px;min-height:80px}.ibo-title--icon>.ibo-title--icon-level-3{width:70px;height:70px;min-width:70px;min-height:70px}.ibo-title--icon-background{width:100%;height:100%;background-position:center;background-repeat:no-repeat;background-size:contain}.ibo-title--icon-background--must-contain{background-size:contain}.ibo-title--icon-background--must-cover{background-size:cover}.ibo-title--icon-background--must-zoomout{background-size:66.67%}.ibo-title--subtitle{margin-top:2px;margin-bottom:2px;flex-wrap:wrap}.ibo-title-for-dashlet{padding-top:2em}.ibo-title-for-dashlet--content{background-color:white;border-radius:5px;border:1px solid;border-color:#616e88;padding-bottom:1em}.ibo-title-separator{border-radius:5px 5px 0 0;border-color:#3182ce;color:#3182ce;background-color:#3182ce;border:3px solid;margin:0;padding:0}:root{--ibo-datatable-panel--table-spacing:48px}.ibo-datatable--toolbar{display:flex;justify-content:space-between;align-items:center;padding:0 6px;color:#7b88a1}.ibo-datatable--toolbar:first-child{margin-bottom:18px}.ibo-datatable--toolbar:not(:first-child){margin-top:18px}.ibo-datatable--toolbar-left>*:not(:first-child),.ibo-datatable--toolbar-right>*:not(:first-child){margin-left:1rem}.ibo-datatable-header{color:#D8DEE9}.ibo-datatable-panel>.ibo-panel--body{padding:32px 0 24px}.ibo-datatable--selection-validation-buttons-toolbar{clear:both;margin-top:10px}.ibo-list-column{max-height:150px;overflow-y:auto}.ibo-sort-order::after{color:#dd6c20}.ibo-sort-order.ibo-is-descending::after{content:'\f0dd'}.ibo-sort-order.ibo-is-ascending::after{content:'\f0de'}.ibo-sort-order.ibo-is-none::after{content:'\f0dc'}.itop-fieldsorter>.selected{background-color:#bee3f8}.ibo-datatable tbody>tr{transition:background-color 300ms linear}.ibo-datatable tbody>tr:hover,.ibo-datatable tbody>tr.selected:hover{cursor:pointer;background-color:#2a4265}.ibo-datatable tbody>tr.selected{background-color:#2b6bb0}.ibo-datatable--selected-count,.ibo-datatable--result-count{padding-right:0.2em;padding-left:0.1em}.ibo-prop-header{padding-bottom:14px}.ibo-fieldset~.ibo-fieldset:not(.ibo-column),fieldset~.ibo-fieldset:not(.ibo-column),.ibo-fieldset~fieldset:not(.ibo-column){margin-top:48px}.ibo-multi-column~.ibo-fieldset,.ibo-multi-column~fieldset{margin-top:48px}.ibo-fieldset-legend,.ibo-dashboard-editor--properties-subtitle,.ibo-dashboard--available-dashlet--title,.ibo-dashlet--properties--title,legend{width:100%;margin-bottom:16px;padding-bottom:4px;border-bottom:2px solid #4C566A}.ibo-field{}.ibo-field:not([data-attribute-type="AttributeBlob"], [data-attribute-type="AttributeFile"], [data-attribute-type="AttributeImage"], [data-attribute-type="AttributeCustomFields"], [data-attribute-type="AttributeTagSet"], [data-attribute-type="AttributeEnumSet"], [data-attribute-type="AttributeClassAttCodeSet"], [data-attribute-type="AttributeQueryAttCodeSet"], .ibo-input-file-select--container){}.ibo-field:not([data-attribute-type="AttributeBlob"], [data-attribute-type="AttributeFile"], [data-attribute-type="AttributeImage"], [data-attribute-type="AttributeCustomFields"], [data-attribute-type="AttributeTagSet"], [data-attribute-type="AttributeEnumSet"], [data-attribute-type="AttributeClassAttCodeSet"], [data-attribute-type="AttributeQueryAttCodeSet"], .ibo-input-file-select--container) .ibo-field--value{word-break:break-word;white-space:inherit}.ibo-field:not([data-attribute-type="AttributeBlob"], [data-attribute-type="AttributeFile"], [data-attribute-type="AttributeImage"], [data-attribute-type="AttributeCustomFields"], [data-attribute-type="AttributeTagSet"], [data-attribute-type="AttributeEnumSet"], [data-attribute-type="AttributeClassAttCodeSet"], [data-attribute-type="AttributeQueryAttCodeSet"], .ibo-input-file-select--container) .ibo-field--value *:not(input, select, textarea){word-break:break-word;white-space:inherit}.ibo-field:not([data-attribute-type="AttributeBlob"], [data-attribute-type="AttributeFile"], [data-attribute-type="AttributeImage"], [data-attribute-type="AttributeCustomFields"], [data-attribute-type="AttributeTagSet"], [data-attribute-type="AttributeEnumSet"], [data-attribute-type="AttributeClassAttCodeSet"], [data-attribute-type="AttributeQueryAttCodeSet"], .ibo-input-file-select--container) .ibo-field--value pre{white-space:break-spaces}.ibo-field-large{display:block}.ibo-field-large .ibo-field--label{position:relative;display:flex;align-items:center;max-width:initial;width:100%}.ibo-field-large .ibo-field-small .ibo-field--label{display:table-cell;vertical-align:top;padding-right:10px;min-width:100px;max-width:145px;width:30%}.ibo-field-large .ibo-field--value{margin-top:2px}.ibo-field-large .ibo-field--value>*{--ibo-scrollbar--scrollbar-track-background-color:#f2f2f2}.ibo-field-large.ibo-is-fullscreen{background-color:#3B4252}.ibo-field-large.ibo-is-fullscreen .ibo-field--label{position:fixed;width:100%;min-width:initial;max-width:initial;padding:4px 8px;background-color:#2E3440;border-bottom:1px solid #616e88}.ibo-field-large.ibo-is-fullscreen .ibo-field--value{padding:36px 8px 4px 8px}.ibo-field-large.ibo-is-fullscreen .ibo-field--value>*{height:initial !important;width:initial !important}.ibo-field-small{display:table;width:100%}.ibo-field-small .ibo-field--label{display:table-cell;vertical-align:top;padding-right:10px}.ibo-field--fullscreen-toggler{width:20px;height:20px;border-radius:5px;cursor:pointer}.ibo-field--fullscreen-toggler:hover{background-color:#4C566A}.ibo-field--label{min-width:100px;max-width:145px;width:30%;word-break:break-word}.ibo-field--label>.ibo-has-description::after{content:"?";padding-left:4px;vertical-align:top;cursor:pointer;color:#7b88a1}.ibo-field--label-small .ibo-field--label{width:20em}.ibo-field--value{width:100%;color:#E5E9F0}.ibo-field--value .HTML table{table-layout:fixed;width:100%}.ibo-field--label>.ibo-field--comments{flex:auto}.ibo-fieldset-legend>.ibo-field--comments,.ibo-dashboard-editor--properties-subtitle>.ibo-field--comments,.ibo-dashboard--available-dashlet--title>.ibo-field--comments,.ibo-dashlet--properties--title>.ibo-field--comments,legend>.ibo-field--comments{padding-bottom:2px;font-size:1.17rem}.ibo-field--comments{display:table-cell;vertical-align:top;width:5em}.ibo-field--comments>input[type="checkbox"]{margin-left:5px;float:right}.ibo-field--comments>.multi_values,.ibo-field--comments>.mono_value,.ibo-field--comments>.ibo-field--comments--synchro{float:right}.mailto,.tel{white-space:nowrap}.mailto .text_decoration,.tel .text_decoration{margin-right:0.5rem;font-size:0.9em}.object-ref-icon.text_decoration,.object-ref-icon-disabled.text_decoration{margin-right:0.5rem}.ibo-field--enable-bulk,.ibo-field--comments--synchro{display:inline;padding:2px 5px;margin:0 0 0 5px;height:calc(100% - 5px);border-radius:5px;font-weight:bold;white-space:nowrap}.ibo-field--enable-bulk--checkbox{margin-left:8px}.ibo-toolbar{display:flex;align-items:center}.ibo-toolbar.ibo-toolbar--action{position:relative}.ibo-toolbar.ibo-toolbar--button{margin-top:16px}.ibo-toolbar-spacer{flex-grow:1}.ibo-toolbar-vertical-separator{display:inline-flex;border-right:1px solid #4C566A;width:1px;height:16px;margin:0 0.75rem}.search_box{box-sizing:border-box;position:relative;z-index:1100;text-align:center}.search_box *{box-sizing:border-box}.search_form_handler{}.search_form_handler a{}.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_toggler{transform:rotateX(180deg);transition:transform 0.5s linear}.search_form_handler.closed{margin-bottom:0.5em;width:150px;overflow:hidden;border-radius:4px}.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_message{display:none;margin:8px 8px 0 8px;border-radius:0px}.search_form_handler .sf_criterion_area{padding:8px 8px 3px 8px}.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 #D8DEE9}.search_form_handler .sf_criterion_area .sf_criterion_row:not(:first-child)::after{content:"or";position:absolute;top:-20px;left:8px;padding-left:5px;padding-right:5px;color:#434C5E;background-color:white}.search_form_handler .sf_criterion_area .sf_criterion_row .sf_criterion_group{display:inline}.search_form_handler .sf_criterion_area .sf_criterion_row .sf_criterion_group .sfc_fg_button,.search_form_handler .sf_criterion_area .sf_criterion_row .sf_criterion_group .sfc_header{border:1px solid #4C566A;border-radius:3px}.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-top:3px;margin-bottom:3px;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:0}.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;padding-bottom:13px}.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:solid 1px #4C566A;border-radius:3px}.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_fg_buttons,.search_form_handler .sf_criterion_area .sf_more_criterion .sfc_fg_buttons,.search_form_handler .sf_criterion_area .sf_button .sfc_fg_buttons,.search_form_handler .sf_criterion_area .search_form_criteria .sfm_buttons,.search_form_handler .sf_criterion_area .sf_more_criterion .sfm_buttons,.search_form_handler .sf_criterion_area .sf_button .sfm_buttons{white-space:nowrap}.search_form_handler .sf_criterion_area .sf_more_criterion,.search_form_handler .sf_criterion_area .sf_button{min-width:34px;text-align:center}.search_form_handler .sf_criterion_area .search_form_criteria{}.search_form_handler .sf_criterion_area .search_form_criteria.locked{background-color:#7b88a1}.search_form_handler .sf_criterion_area .search_form_criteria.locked .sfc_title{user-select:none;cursor:initial}.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;border-color:#434C5E}.search_form_handler .sf_criterion_area .search_form_criteria.draft .sfc_title{font-style:italic}.search_form_handler .sf_criterion_area .search_form_criteria.opened{z-index:1}.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;margin-top:-1px;z-index:-1}.search_form_handler .sf_criterion_area .search_form_criteria.opened_left .sfc_form_group{left:auto;right:0px}.search_form_handler .sf_criterion_area .search_form_criteria:not(:last-of-type){margin-right:12px}.search_form_handler .sf_criterion_area .search_form_criteria>*{background-color:#2E3440;color:#E5E9F0}.search_form_handler .sf_criterion_area .search_form_criteria .sfc_toggle,.search_form_handler .sf_criterion_area .search_form_criteria .sfc_close{position:absolute;top:7px;color:#698fb5}.search_form_handler .sf_criterion_area .search_form_criteria .sfc_locked{position:absolute;top:9px;color:#4C566A}.search_form_handler .sf_criterion_area .search_form_criteria .sfc_toggle{display:inline-block;right:23px;transition:all 0.3s ease-in-out}.search_form_handler .sf_criterion_area .search_form_criteria .sfc_close,.search_form_handler .sf_criterion_area .search_form_criteria .sfc_locked{right:7px}.search_form_handler .sf_criterion_area .search_form_criteria .sfc_title{max-width:240px;padding-right:30px;white-space:nowrap;overflow-x:hidden;text-overflow:ellipsis;cursor:pointer}.search_form_handler .sf_criterion_area .search_form_criteria .sfc_title .sfc_values{font-weight:bold}.search_form_handler .sf_criterion_area .search_form_criteria .sfc_form_group{position:absolute;display:none;max-width:450px;width:max-content;max-height:520px;overflow-x:auto;overflow-y:hidden}.search_form_handler .sf_criterion_area .search_form_criteria .sfc_form_group .sfc_fg_operators{font-size:12px}.search_form_handler .sf_criterion_area .search_form_criteria .sfc_form_group .sfc_fg_operators .sfc_fg_operator.force_hide{display:none !important}.search_form_handler .sf_criterion_area .search_form_criteria .sfc_form_group .sfc_fg_operators .sfc_fg_operator>label{line-height:20px;white-space:nowrap}.search_form_handler .sf_criterion_area .search_form_criteria .sfc_form_group .sfc_fg_operators .sfc_fg_operator>label>*{display:inline-block;vertical-align:middle}.search_form_handler .sf_criterion_area .search_form_criteria .sfc_form_group .sfc_fg_operators .sfc_fg_operator .sfc_op_radio{width:12px;margin:0;margin-right:7px}.search_form_handler .sf_criterion_area .search_form_criteria .sfc_form_group .sfc_fg_operators .sfc_fg_operator .sfc_op_name{width:96px}.search_form_handler .sf_criterion_area .search_form_criteria .sfc_form_group .sfc_fg_operators .sfc_fg_operator .sfc_op_content input[type="text"]{display:unset;width:160px}.search_form_handler .sf_criterion_area .search_form_criteria .sfc_form_group .sfc_fg_operators .sfc_fg_operator .sfc_opc_multichoices label>input{vertical-align:text-top;margin-left:0;margin-right:8px}.search_form_handler .sf_criterion_area .search_form_criteria .sfc_form_group .sfc_fg_operators .sfc_fg_operator .sfc_opc_multichoices .sfc_opc_mc_items_wrapper{max-height:415px;overflow-y:auto;margin:0 -8px}.search_form_handler .sf_criterion_area .search_form_criteria .sfc_form_group .sfc_fg_operators .sfc_fg_operator .sfc_opc_multichoices .sfc_opc_mc_items_wrapper .sfc_opc_mc_items .sfc_opc_mc_items_list{text-align:left}.search_form_handler .sf_criterion_area .search_form_criteria .sfc_form_group .sfc_fg_operators .sfc_fg_operator .sfc_opc_multichoices .sfc_opc_mc_items_wrapper .sfc_opc_mc_items .sfc_opc_mc_items_list.sfc_opc_mc_items_selected{position:relative;padding-top:5px;margin-top:5px}.search_form_handler .sf_criterion_area .search_form_criteria .sfc_form_group .sfc_fg_operators .sfc_fg_operator .sfc_opc_multichoices .sfc_opc_mc_items_wrapper .sfc_opc_mc_items .sfc_opc_mc_items_list.sfc_opc_mc_items_selected::before{content:"";position:absolute;border-top:1px solid #7b88a1;width:calc(100% - 12px);margin-left:6px;top:0px}.search_form_handler .sf_criterion_area .search_form_criteria .sfc_form_group .sfc_fg_operators .sfc_fg_operator .sfc_opc_multichoices .sfc_opc_mc_items_wrapper .sfc_opc_mc_items .sfc_opc_mc_items_list .sfc_opc_mc_placeholder{padding:15px 8px;font-style:italic;text-align:center}.search_form_handler .sf_criterion_area .search_form_criteria .sfc_form_group .sfc_fg_operators .sfc_fg_operator .sfc_opc_multichoices .sfc_opc_mc_items_wrapper .sfc_opc_mc_items .sfc_opc_mc_items_list .sfc_opc_mc_item{padding:4px 8px}.search_form_handler .sf_criterion_area .search_form_criteria .sfc_form_group .sfc_fg_operators .sfc_fg_operator .sfc_opc_multichoices .sfc_opc_mc_items_wrapper .sfc_opc_mc_items .sfc_opc_mc_items_list .sfc_opc_mc_item:hover{background-color:#4C566A}.search_form_handler .sf_criterion_area .search_form_criteria .sfc_form_group .sfc_fg_operators .sfc_fg_operator .sfc_opc_multichoices .sfc_opc_mc_items_wrapper .sfc_opc_mc_items .sfc_opc_mc_items_list .sfc_opc_mc_item label{display:inline-block;width:100%}.search_form_handler .sf_criterion_area .search_form_criteria .sfc_form_group .sfc_fg_operators .sfc_fg_operator .sfc_opc_multichoices .sfc_opc_mc_items_wrapper .sfc_opc_mc_items_hint{margin-top:15px;margin-bottom:15px;padding-left:9px;padding-right:9px;color:#3B4252;font-size:10px;font-style:italic}.search_form_handler .sf_criterion_area .search_form_criteria .sfc_form_group .sfc_fg_operators .sfc_fg_operator .sfc_opc_multichoices .sfc_opc_mc_items_wrapper .sfc_opc_mc_items_hint>span{margin-right:0.5em;font-style:italic}.search_form_handler .sf_criterion_area .search_form_criteria .sfc_form_group .sfc_fg_search,.search_form_handler .sf_criterion_area .search_form_criteria .sfc_form_group .sfc_fg_apply,.search_form_handler .sf_criterion_area .search_form_criteria .sfc_form_group .sfc_fg_cancel{margin-top:8px;font-size:1rem}.search_form_handler .sf_criterion_area .search_form_criteria .sfc_form_group .sfc_fg_search,.search_form_handler .sf_criterion_area .search_form_criteria .sfc_form_group .sfc_fg_apply{margin-right:5px}.search_form_handler .sf_criterion_area .search_form_criteria .sfc_form_group .sfc_fg_more,.search_form_handler .sf_criterion_area .search_form_criteria .sfc_form_group .sfc_fg_less{position:absolute;bottom:7px;right:0px;cursor:pointer;color:#2c5382;font-size:10px;font-weight:bold;border:none;background-color:transparent}.search_form_handler .sf_criterion_area .search_form_criteria .sfc_form_group .sfc_fg_more>span,.search_form_handler .sf_criterion_area .search_form_criteria .sfc_form_group .sfc_fg_less>span{margin-left:3px}.search_form_handler .sf_criterion_area .search_form_criteria .sfc_form_group .sfc_fg_operator:not(:first-of-type),.search_form_handler .sf_criterion_area .search_form_criteria .sfc_form_group .sfc_fg_operator:first-of-type .sfc_op_radio{display:none}.search_form_handler .sf_criterion_area .search_form_criteria .sfc_form_group .sfc_fg_less{display:none}.search_form_handler .sf_criterion_area .search_form_criteria .sfc_form_group .sfc_fg_more{display:inline-block}.search_form_handler .sf_criterion_area .search_form_criteria .sfc_form_group.advanced .sfc_fg_operator{margin-bottom:3px}.search_form_handler .sf_criterion_area .search_form_criteria .sfc_form_group.advanced .sfc_fg_operator:last-of-type{margin-bottom:0}.search_form_handler .sf_criterion_area .search_form_criteria .sfc_form_group.advanced .sfc_fg_operator:not(:first-of-type),.search_form_handler .sf_criterion_area .search_form_criteria .sfc_form_group.advanced .sfc_fg_operator:first-of-type .sfc_op_radio{display:inherit}.search_form_handler .sf_criterion_area .search_form_criteria .sfc_form_group.advanced .sfc_fg_less{display:inline-block}.search_form_handler .sf_criterion_area .search_form_criteria .sfc_form_group.advanced .sfc_fg_more{display:none}.search_form_handler .sf_criterion_area .search_form_criteria .sfc_form_group.advanced .hide_on_advanced{display:none}.search_form_handler .sf_criterion_area .search_form_criteria .sfc_form_group:not(.advanced) .hide_on_less{display:none}.search_form_handler .sf_criterion_area .search_form_criteria.search_form_criteria_raw>*{border-color:transparent}.search_form_handler .sf_criterion_area .search_form_criteria.search_form_criteria_raw .sfc_title{cursor:initial;padding-right:20px}.search_form_handler .sf_criterion_area .search_form_criteria.search_form_criteria_raw .sfc_form_group{display:none}.search_form_handler .sf_criterion_area .search_form_criteria.search_form_criteria_enum .sfc_form_group .sfc_fg_operator_in>label{display:inline-block;width:100%;line-height:initial;white-space:nowrap}.search_form_handler .sf_criterion_area .search_form_criteria.search_form_criteria_enum .sfc_form_group .sfc_fg_operator_in>label .sfc_op_content{width:100%}.search_form_handler .sf_criterion_area .search_form_criteria.search_form_criteria_tag_set .sfc_form_group .sfc_fg_operator_in>label{display:inline-block;width:100%;line-height:initial;white-space:nowrap}.search_form_handler .sf_criterion_area .search_form_criteria.search_form_criteria_tag_set .sfc_form_group .sfc_fg_operator_in>label .sfc_op_content{width:100%}.search_form_handler .sf_criterion_area .search_form_criteria.search_form_criteria_numeric .sfc_fg_operators .sfc_fg_operator.sfc_fg_operator_between .sfc_op_content_from_outer{display:inline}.search_form_handler .sf_criterion_area .search_form_criteria.search_form_criteria_numeric .sfc_fg_operators .sfc_fg_operator.sfc_fg_operator_between .sfc_op_content_until_outer{display:inline;margin-left:5px}.search_form_handler .sf_criterion_area .search_form_criteria.search_form_criteria_numeric .sfc_fg_operators .sfc_fg_operator.sfc_fg_operator_between label.sfc_op_content_from_label,.search_form_handler .sf_criterion_area .search_form_criteria.search_form_criteria_numeric .sfc_fg_operators .sfc_fg_operator.sfc_fg_operator_between label.sfc_op_content_until_label{width:45px;display:inline-block}.search_form_handler .sf_criterion_area .search_form_criteria.search_form_criteria_numeric .sfc_fg_operators .sfc_fg_operator.sfc_fg_operator_between input[type="text"]{width:77px}.search_form_handler .sf_criterion_area .search_form_criteria.search_form_criteria_date_time .sfc_form_group.advanced .sfc_fg_operator_between,.search_form_handler .sf_criterion_area .search_form_criteria.search_form_criteria_date .sfc_form_group.advanced .sfc_fg_operator_between{margin-bottom:5px}.search_form_handler .sf_criterion_area .search_form_criteria.search_form_criteria_date_time .sfc_fg_operator_between_days input,.search_form_handler .sf_criterion_area .search_form_criteria.search_form_criteria_date .sfc_fg_operator_between_days input{width:135px}.search_form_handler .sf_criterion_area .search_form_criteria.search_form_criteria_date_time button.ui-datepicker-trigger,.search_form_handler .sf_criterion_area .search_form_criteria.search_form_criteria_date button.ui-datepicker-trigger{background:none;border:none;height:100%;padding:2px}.search_form_handler .sf_criterion_area .search_form_criteria.search_form_criteria_date_time button.ui-datepicker-trigger img,.search_form_handler .sf_criterion_area .search_form_criteria.search_form_criteria_date button.ui-datepicker-trigger img{vertical-align:middle}.search_form_handler .sf_criterion_area .sf_more_criterion.opened{z-index:2}.search_form_handler .sf_criterion_area .sf_more_criterion.opened .sfm_content{display:inherit}.search_form_handler .sf_criterion_area .sf_more_criterion.opened_left .sfm_content{left:auto;right:0px}.search_form_handler .sf_criterion_area .sf_more_criterion>*{background-color:#2E3440;color:#E5E9F0}.search_form_handler .sf_criterion_area .sf_more_criterion .sfm_toggler .sfm_tg_title{margin-right:7px}.search_form_handler .sf_criterion_area .sf_more_criterion .sfm_toggler .sfm_tg_icon{color:#698fb5}.search_form_handler .sf_criterion_area .sf_more_criterion .sfm_content{display:none;min-width:200px}.search_form_handler .sf_criterion_area .sf_more_criterion .sfm_content .sfm_lists{margin:0 -8px;padding:0 8px;max-height:400px;overflow-x:hidden;overflow-y:auto}.search_form_handler .sf_criterion_area .sf_more_criterion .sfm_content .sfm_lists .sfl_items>li:hover{background-color:#4C566A}.search_form_handler .sf_criterion_area .sf_more_criterion .sfm_content .sfm_buttons{display:none}.search_form_handler .sf_criterion_area .sf_more_criterion .sfm_content .sfm_buttons button{margin-top:8px;margin-right:5px;padding:3px 6px;font-size:11px}.search_form_handler .sf_criterion_area .sf_more_criterion .sfm_content .sfm_buttons button:last-of-type{margin-right:0}.search_form_handler .sf_criterion_area .sf_button{cursor:pointer}.search_form_handler .sf_criterion_area .sf_button>*{background-color:#2E3440;color:#81A1C1}.search_form_handler .sf_list:not(:first-of-type) .sfl_title{border-top:1px solid #616e88;padding-top:8px;margin-top:5px}.search_form_handler .sf_list .sfl_title{font-weight:bold}.search_form_handler .sf_list .sfl_items{margin:5px -8px 0 -8px;padding:0;text-align:left}.search_form_handler .sf_list .sfl_items>li{padding:4px 8px;list-style:none;white-space:nowrap}.search_form_handler .sf_list .sfl_items>li:hover{background-color:#4C566A}.search_form_handler .sf_list .sfl_items>li.sfl_i_placeholder{font-style:italic;opacity:0.8}.search_form_handler .sf_list .sfl_items>li>label{display:inline-block;width:100%}.search_form_handler .sf_list .sfl_items>li>label>*{vertical-align:middle}.search_form_handler .sf_list .sfl_items>li>label>input[type="checkbox"]{margin-left:0;margin-right:8px}.search_form_handler .sf_filter{position:relative;margin-top:8px;margin-bottom:8px}.search_form_handler .sf_filter input,.search_form_handler .sf_filter button,.search_form_handler .sf_filter .sff_picto{vertical-align:middle;height:22px}.search_form_handler .sf_filter input,.search_form_handler .sf_filter button{border:1px solid #ABABAB}.search_form_handler .sf_filter input{width:100% !important}.search_form_handler .sf_filter button{width:23px;background-color:white;color:#698fb5;font-size:10px}.search_form_handler .sf_filter button:first-of-type{margin-left:5px}.search_form_handler .sf_filter button:not(:first-of-type){border-left:transparent}.search_form_handler .sf_filter .sff_input_wrapper{position:relative}.search_form_handler .sf_filter .sff_input_wrapper input[type="text"]{display:unset}.search_form_handler .sf_filter .sff_input_wrapper .sff_picto{position:absolute;right:7px;top:3px;user-select:none;color:#2E3440}.search_form_handler .sf_filter .sff_input_wrapper .sff_reset{display:none}.search_form_handler .sf_filter .sff_input_wrapper input::-ms-clear{display:none}.search_form_handler .sf_filter.sf_with_buttons input{width:calc(100% - 28px) !important;min-width:120px}.sft_hint,.sfobs_hint,.sft_toggler{margin-left:8px;color:#2E3440}.sf_results_placeholder{margin-top:24px;text-align:center}.sf_results_placeholder button{margin-top:8px}.sf_results_placeholder button>span{margin-right:0.5em}.ibo-search-form-panel{z-index:3;margin-bottom:8px}.ibo-search-form-panel .ibo-panel--body{padding:18px 14px 10px;overflow:initial}.ibo-search-form-panel .ibo-panel--body::before{border-radius:5px 5px 0 0}#ibo-main-content .search_form_handler .sf_criterion_area{padding:0}.sfm_tg_title{display:none}.ibo-criterion-group:empty~.sf_more_criterion .sfm_tg_title{display:unset}.sf_results_area{z-index:1;margin-bottom:300px}.ibo-search-form-panel .ibo-panel--body.ibo-is-sticking{position:fixed;border-radius:0;border-bottom-color:transparent}.ibo-datatable-panel.ibo-is-sticking .ibo-panel--header{z-index:0}.ibo-datatable-panel.ibo-is-sticking .ibo-datatable--toolbar{position:fixed;z-index:2;padding-bottom:4px;background-color:#3B4252;border-left:1px solid #232831;border-right:1px solid #232831}.ibo-datatable-panel.ibo-is-sticking .dataTables_scrollHead{position:fixed !important;z-index:2;background-color:#3B4252;border-left:1px solid #232831 !important;border-right:1px solid #232831 !important}.ibo-field-badge{display:inline-flex;align-items:baseline;margin:0;padding:4px 10px;border-radius:3px;background-color:var(--ibo-main-color);color:var(--ibo-complementary-color)}.ibo-field-badge--decoration+.ibo-field-badge--label{margin-left:0.5rem}.ibo-input-file-select--container .ibo-input-file-select .ibo-input-file-select--file-input{display:none}.ibo-input-file-select--container .ibo-input-file-select .ibo-input-file-select--file-name{margin-left:10px}.ibo-medallion-icon{display:flex;padding:13px 0}.ibo-medallion-icon--image{height:48px;width:48px;padding:2px;border-radius:100%;background-color:#bee3f8}.ibo-medallion-icon--description{display:inline-block;padding-left:8px}:root{}.ibo-navigation-menu{position:relative;height:100vh}.ibo-navigation-menu.ibo-is-expanded .ibo-navigation-menu--square-company-logo{display:none}.ibo-navigation-menu.ibo-is-expanded .ibo-navigation-menu--full-company-logo{display:flex}.ibo-navigation-menu.ibo-is-expanded .ibo-navigation-menu--silo-selection{display:inline-block}.ibo-navigation-menu.ibo-is-expanded .ibo-navigation-menu--silo-visual-hint{display:none}.ibo-navigation-menu.ibo-is-expanded .ibo-navigation-menu--body{width:310px}.ibo-navigation-menu.ibo-is-expanded .ibo-navigation-menu--body .ibo-navigation-menu--toggler-bar:nth-child(1){top:4px;left:7px;width:14px;transform:rotateZ(-45deg)}.ibo-navigation-menu.ibo-is-expanded .ibo-navigation-menu--body .ibo-navigation-menu--toggler-bar:nth-child(2){top:8px;left:7px;width:0;opacity:0}.ibo-navigation-menu.ibo-is-expanded .ibo-navigation-menu--body .ibo-navigation-menu--toggler-bar:nth-child(3){top:12px;left:7px;width:14px;transform:rotateZ(45deg)}.ibo-navigation-menu.ibo-is-expanded .ibo-navigation-menu--body .ibo-navigation-menu--menu-group:not(.ibo-is-active):active{border-radius:16px}.ibo-navigation-menu.ibo-is-expanded .ibo-navigation-menu--body .ibo-navigation-menu--bottom-part{padding:24px 0 12px}.ibo-navigation-menu.ibo-is-expanded .ibo-navigation-menu--body .ibo-navigation-menu--bottom-part .ibo-navigation-menu--notifications .ibo-navigation-menu--notifications-toggler{display:none}.ibo-navigation-menu.ibo-is-expanded .ibo-navigation-menu--body .ibo-navigation-menu--bottom-part .ibo-navigation-menu--user-info{height:100%}.ibo-navigation-menu.ibo-is-expanded .ibo-navigation-menu--body .ibo-navigation-menu--bottom-part .ibo-navigation-menu--user-info .ibo-navigation-menu--user-welcome-message,.ibo-navigation-menu.ibo-is-expanded .ibo-navigation-menu--body .ibo-navigation-menu--bottom-part .ibo-navigation-menu--user-info .ibo-navigation-menu--user-notifications,.ibo-navigation-menu.ibo-is-expanded .ibo-navigation-menu--body .ibo-navigation-menu--bottom-part .ibo-navigation-menu--user-info .ibo-navigation-menu--user-organization{display:block}.ibo-navigation-menu.ibo-is-expanded .ibo-navigation-menu--body .ibo-navigation-menu--bottom-part .ibo-navigation-menu--user-info .ibo-navigation-menu--user-picture{margin-top:-60px;width:72px;height:72px;border:solid 3px #263238}.ibo-navigation-menu.ibo-is-expanded .ibo-navigation-menu--body .ibo-navigation-menu--bottom-part .ibo-navigation-menu--user-info .ibo-navigation-menu--user-picture .ibo-navigation-menu--user-picture--image{max-width:72px;max-height:72px}.ibo-navigation-menu.ibo-is-active .ibo-navigation-menu--drawer{right:calc(-1 * 312px)}.ibo-navigation-menu.ibo-is-filtered .ibo-navigation-menu--menu-filter-clear{display:block}.ibo-navigation-menu.ibo-is-filtered .ibo-navigation-menu--menu-nodes{margin-bottom:48px}.ibo-navigation-menu.ibo-is-filtered .ibo-navigation-menu--menu-nodes .ibo-navigation-menu--menu-nodes-title{margin-bottom:8px}.ibo-navigation-menu--body,.ibo-navigation-menu--drawer{height:100vh}.ibo-navigation-menu--body{z-index:1;display:flex;flex-direction:column;justify-content:space-between;align-items:stretch;height:100vh;width:60px;background-color:#191c22;transition:width 0.1s ease-in-out}.ibo-navigation-menu--top-part{z-index:2;min-height:120px;padding:16px 16px;overflow:hidden}.ibo-navigation-menu--middle-part{z-index:1;flex-grow:1;overflow-y:auto;padding:24px 16px 16px;scrollbar-width:thin;scrollbar-color:#7b88a1 rgba(255, 255, 255, 0)}.ibo-navigation-menu--middle-part::-webkit-scrollbar{width:5px}.ibo-navigation-menu--middle-part::-webkit-scrollbar-track{background-color:rgba(255, 255, 255, 0)}.ibo-navigation-menu--middle-part::-webkit-scrollbar-thumb{background-color:#7b88a1}.ibo-navigation-menu--bottom-part{z-index:2;padding-top:20px;padding-bottom:16px;height:126px;background-color:#232831;justify-content:space-between;flex-direction:column}.ibo-navigation-menu--toggler,.ibo-navigation-menu--menu-group{margin:calc(-1 * 10px) calc(-1 * 8px);padding:10px 8px;border-radius:5px}.ibo-navigation-menu--square-company-logo{display:flex;width:38px;height:38px;margin:0 -5px 32px}.ibo-navigation-menu--square-company-logo>img{object-fit:contain}.ibo-navigation-menu--full-company-logo{display:none;width:310px;height:70px;margin:0 0 0 -16px}.ibo-navigation-menu--full-company-logo>img{object-fit:contain;margin:0 auto}.ibo-navigation-menu--toggler{position:relative;display:inline-flex;width:44px}.ibo-navigation-menu--toggler:hover,.ibo-navigation-menu--toggler:active{background-color:#455a64}.ibo-navigation-menu--toggler:hover .ibo-navigation-menu--toggler-bar,.ibo-navigation-menu--toggler:active .ibo-navigation-menu--toggler-bar{background-color:white}.ibo-navigation-menu--toggler-icon{position:relative;display:flex;height:20px;width:28px}.ibo-navigation-menu--toggler-bar{position:absolute;display:block;height:3px;width:100%;opacity:1;transition:all 0.2s linear;background-color:#D8DEE9}.ibo-navigation-menu--toggler-bar:nth-child(1){top:0}.ibo-navigation-menu--toggler-bar:nth-child(2){top:8px}.ibo-navigation-menu--toggler-bar:nth-child(3){top:16px}.ibo-navigation-menu--silo-selection{position:absolute;display:none;width:70%;margin-left:15px}.ibo-navigation-menu--silo-selection .ibo-input-wrapper .ibo-input,.ibo-navigation-menu--silo-selection .ui_tpicker_hour_slider .ibo-input,.ibo-navigation-menu--silo-selection .ui_tpicker_hour_slider .ui-autocomplete-input,.ibo-navigation-menu--silo-selection .ui_tpicker_hour_slider .ui-multiselect,.ibo-navigation-menu--silo-selection .ui_tpicker_hour_slider .dataTables_length select,.dataTables_length .ibo-navigation-menu--silo-selection .ui_tpicker_hour_slider select,.ibo-navigation-menu--silo-selection .ui_tpicker_hour_slider .ui_tpicker_hour_slider>select,.ibo-navigation-menu--silo-selection .ui_tpicker_hour_slider .ui_tpicker_minute_slider>select,.ibo-navigation-menu--silo-selection .ui_tpicker_hour_slider .ui_tpicker_second_slider>select,.ibo-navigation-menu--silo-selection .ui_tpicker_hour_slider select.ibo-input-select-placeholder,.ibo-navigation-menu--silo-selection .ui_tpicker_hour_slider .search_form_handler .sf_criterion_area .search_form_criteria .sfc_form_group .sfc_fg_operators .sfc_fg_operator .sfc_op_content input[type="text"],.search_form_handler .sf_criterion_area .search_form_criteria .sfc_form_group .sfc_fg_operators .sfc_fg_operator .sfc_op_content .ibo-navigation-menu--silo-selection .ui_tpicker_hour_slider input[type="text"],.ibo-navigation-menu--silo-selection .ui_tpicker_hour_slider .search_form_handler .sf_filter .sff_input_wrapper input[type="text"],.search_form_handler .sf_filter .sff_input_wrapper .ibo-navigation-menu--silo-selection .ui_tpicker_hour_slider input[type="text"],.ibo-navigation-menu--silo-selection .ui_tpicker_minute_slider .ibo-input,.ibo-navigation-menu--silo-selection .ui_tpicker_minute_slider .ui-autocomplete-input,.ibo-navigation-menu--silo-selection .ui_tpicker_minute_slider .ui-multiselect,.ibo-navigation-menu--silo-selection .ui_tpicker_minute_slider .dataTables_length select,.dataTables_length .ibo-navigation-menu--silo-selection .ui_tpicker_minute_slider select,.ibo-navigation-menu--silo-selection .ui_tpicker_minute_slider .ui_tpicker_hour_slider>select,.ibo-navigation-menu--silo-selection .ui_tpicker_minute_slider .ui_tpicker_minute_slider>select,.ibo-navigation-menu--silo-selection .ui_tpicker_minute_slider .ui_tpicker_second_slider>select,.ibo-navigation-menu--silo-selection .ui_tpicker_minute_slider select.ibo-input-select-placeholder,.ibo-navigation-menu--silo-selection .ui_tpicker_minute_slider .search_form_handler .sf_criterion_area .search_form_criteria .sfc_form_group .sfc_fg_operators .sfc_fg_operator .sfc_op_content input[type="text"],.search_form_handler .sf_criterion_area .search_form_criteria .sfc_form_group .sfc_fg_operators .sfc_fg_operator .sfc_op_content .ibo-navigation-menu--silo-selection .ui_tpicker_minute_slider input[type="text"],.ibo-navigation-menu--silo-selection .ui_tpicker_minute_slider .search_form_handler .sf_filter .sff_input_wrapper input[type="text"],.search_form_handler .sf_filter .sff_input_wrapper .ibo-navigation-menu--silo-selection .ui_tpicker_minute_slider input[type="text"],.ibo-navigation-menu--silo-selection .ui_tpicker_second_slider .ibo-input,.ibo-navigation-menu--silo-selection .ui_tpicker_second_slider .ui-autocomplete-input,.ibo-navigation-menu--silo-selection .ui_tpicker_second_slider .ui-multiselect,.ibo-navigation-menu--silo-selection .ui_tpicker_second_slider .dataTables_length select,.dataTables_length .ibo-navigation-menu--silo-selection .ui_tpicker_second_slider select,.ibo-navigation-menu--silo-selection .ui_tpicker_second_slider .ui_tpicker_hour_slider>select,.ibo-navigation-menu--silo-selection .ui_tpicker_second_slider .ui_tpicker_minute_slider>select,.ibo-navigation-menu--silo-selection .ui_tpicker_second_slider .ui_tpicker_second_slider>select,.ibo-navigation-menu--silo-selection .ui_tpicker_second_slider select.ibo-input-select-placeholder,.ibo-navigation-menu--silo-selection .ui_tpicker_second_slider .search_form_handler .sf_criterion_area .search_form_criteria .sfc_form_group .sfc_fg_operators .sfc_fg_operator .sfc_op_content input[type="text"],.search_form_handler .sf_criterion_area .search_form_criteria .sfc_form_group .sfc_fg_operators .sfc_fg_operator .sfc_op_content .ibo-navigation-menu--silo-selection .ui_tpicker_second_slider input[type="text"],.ibo-navigation-menu--silo-selection .ui_tpicker_second_slider .search_form_handler .sf_filter .sff_input_wrapper input[type="text"],.search_form_handler .sf_filter .sff_input_wrapper .ibo-navigation-menu--silo-selection .ui_tpicker_second_slider input[type="text"],.ibo-navigation-menu--silo-selection .ibo-input-wrapper .ui-autocomplete-input,.ibo-navigation-menu--silo-selection .ibo-input-wrapper .ui-multiselect,.ibo-navigation-menu--silo-selection .ibo-input-wrapper .dataTables_length select,.dataTables_length .ibo-navigation-menu--silo-selection .ibo-input-wrapper select,.ibo-navigation-menu--silo-selection .ibo-input-wrapper .ui_tpicker_hour_slider>select,.ibo-navigation-menu--silo-selection .ibo-input-wrapper .ui_tpicker_minute_slider>select,.ibo-navigation-menu--silo-selection .ibo-input-wrapper .ui_tpicker_second_slider>select,.ibo-navigation-menu--silo-selection .ibo-input-wrapper select.ibo-input-select-placeholder,.ibo-navigation-menu--silo-selection .ibo-input-wrapper .search_form_handler .sf_criterion_area .search_form_criteria .sfc_form_group .sfc_fg_operators .sfc_fg_operator .sfc_op_content input[type="text"],.search_form_handler .sf_criterion_area .search_form_criteria .sfc_form_group .sfc_fg_operators .sfc_fg_operator .sfc_op_content .ibo-navigation-menu--silo-selection .ibo-input-wrapper input[type="text"],.ibo-navigation-menu--silo-selection .ibo-input-wrapper .search_form_handler .sf_filter .sff_input_wrapper input[type="text"],.search_form_handler .sf_filter .sff_input_wrapper .ibo-navigation-menu--silo-selection .ibo-input-wrapper input[type="text"]{padding-right:38px;overflow:hidden}.ibo-navigation-menu--silo-selection .ibo-input-wrapper .ibo-input-select-autocomplete,.ibo-navigation-menu--silo-selection .ui_tpicker_hour_slider .ibo-input-select-autocomplete,.ibo-navigation-menu--silo-selection .ui_tpicker_minute_slider .ibo-input-select-autocomplete,.ibo-navigation-menu--silo-selection .ui_tpicker_second_slider .ibo-input-select-autocomplete{padding-right:60px}.ibo-navigation-menu--silo-selection .ibo-input-wrapper .ibo-input-select-autocomplete~.ibo-input-select--action-button--search,.ibo-navigation-menu--silo-selection .ui_tpicker_hour_slider .ibo-input-select-autocomplete~.ibo-input-select--action-button--search,.ibo-navigation-menu--silo-selection .ui_tpicker_minute_slider .ibo-input-select-autocomplete~.ibo-input-select--action-button--search,.ibo-navigation-menu--silo-selection .ui_tpicker_second_slider .ibo-input-select-autocomplete~.ibo-input-select--action-button--search{margin-left:-42px}.ibo-navigation-menu--silo-selection .ibo-input-wrapper .ibo-input-select-autocomplete~.ibo-input-select--action-button--clear,.ibo-navigation-menu--silo-selection .ui_tpicker_hour_slider .ibo-input-select-autocomplete~.ibo-input-select--action-button--clear,.ibo-navigation-menu--silo-selection .ui_tpicker_minute_slider .ibo-input-select-autocomplete~.ibo-input-select--action-button--clear,.ibo-navigation-menu--silo-selection .ui_tpicker_second_slider .ibo-input-select-autocomplete~.ibo-input-select--action-button--clear{margin-left:-72px}.ibo-navigation-menu--silo-selection .ibo-input-wrapper .ibo-input-select-autocomplete~.ibo-input-select--action-button--hierarchy,.ibo-navigation-menu--silo-selection .ui_tpicker_hour_slider .ibo-input-select-autocomplete~.ibo-input-select--action-button--hierarchy,.ibo-navigation-menu--silo-selection .ui_tpicker_minute_slider .ibo-input-select-autocomplete~.ibo-input-select--action-button--hierarchy,.ibo-navigation-menu--silo-selection .ui_tpicker_second_slider .ibo-input-select-autocomplete~.ibo-input-select--action-button--hierarchy{margin-left:-60px}.ibo-navigation-menu--silo-visual-hint{position:absolute;top:2px;right:0;width:16px;height:16px;background-color:#BF616A;border:2px solid #191c22;border-radius:100%}.ibo-navigation-menu--menu-group{display:flex;justify-content:left;align-items:center;white-space:nowrap;overflow-x:hidden;color:#D8DEE9;transition-property:background-color, color, padding, margin, border-radius;transition-duration:0.1s;transition-timing-function:linear}.ibo-navigation-menu--menu-group>.ibo-navigation-menu--menu-group-icon,.ibo-navigation-menu--menu-group>.ibo-navigation-menu--menu-group-title{display:flex}.ibo-navigation-menu--menu-group:not(:last-child){margin-bottom:20px}.ibo-navigation-menu--menu-group:not(.ibo-is-active):hover,.ibo-navigation-menu--menu-group:not(.ibo-is-active):active{color:white;background-color:#455a64}.ibo-navigation-menu--menu-group:not(.ibo-is-active):active{border-radius:100%}.ibo-navigation-menu--menu-group.ibo-is-active{margin-right:calc(-2 * 8px);padding-right:calc(2 - 8px);color:#a5cfdc;background-color:#26374b;border-radius:5px 0 0 5px}.ibo-navigation-menu--menu-group.ibo-is-active .ibo-navigation-menu--menu-group-icon{color:#81A1C1}.ibo-navigation-menu--menu-group-icon{width:28px;min-width:28px;justify-content:center;font-size:1.83rem}.ibo-navigation-menu--menu-group-icon::before{width:28px}.ibo-navigation-menu--menu-group-title{margin-left:16px;justify-content:left}.ibo-navigation-menu--drawer{position:absolute;z-index:-1;top:0;bottom:0;right:0;display:flex;flex-direction:column;justify-content:flex-start;width:312px;padding:32px 20px;background-color:#26374b;border-right:1px solid #7b88a1;transition:right 0.2s ease-in-out}.ibo-navigation-menu--menu-filter{position:relative}.ibo-navigation-menu--menu-filter-input{width:100%;padding:8px 10px;color:#D8DEE9;background-color:#434C5E;border:1px solid #88C0D0;border-radius:3px;padding-right:76px}.ibo-navigation-menu--menu-filter-input::placeholder{color:#D8DEE9}.ibo-navigation-menu--menu-filter-input:-ms-input-placeholder,.ibo-navigation-menu--menu-filter-input::-ms-input-placeholder{color:#D8DEE9}.ibo-navigation-menu--menu-filter-clear{display:none;position:absolute;top:8px;right:60px;padding:3px 3px}.ibo-navigation-menu--menu-filter-hotkey{position:absolute;top:6.5px;right:10px;border:1px solid #7b88a1;border-radius:3px;color:#D8DEE9;padding:2px 4px}.ibo-navigation-menu--menu-filter-hint{position:relative;margin-top:16px;padding-right:12px;color:#E5E9F0}.ibo-navigation-menu--menu-filter-hint-close{position:absolute;top:1px;right:2px}.ibo-navigation-menu--menu--placeholder{width:100%;margin-top:50px}.ibo-navigation-menu--menu--placeholder-image>svg{display:block;width:90%;height:auto;margin:auto}.ibo-navigation-menu--menu--placeholder-hint{margin-top:8px;text-align:center}.ibo-navigation-menu--menu-groups{overflow-y:auto;overflow-x:hidden;margin:50px calc(-1 * 20px) 0 calc(-1 * 20px);padding-left:20px;padding-right:20px;width:inherit}.ibo-navigation-menu--menu-nodes{display:none}.ibo-navigation-menu--menu-nodes ul li>a,.ibo-navigation-menu--menu-nodes ul li>span{margin:0 -10px;padding:6px 10px;border-radius:0;color:#E5E9F0}.ibo-navigation-menu--menu-nodes ul li>a{color:inherit}.ibo-navigation-menu--menu-nodes ul li>a:hover,.ibo-navigation-menu--menu-nodes ul .ibo-quick-create--compartment-results--elementli>.option:hover,.ibo-navigation-menu--menu-nodes ul .ibo-quick-create--compartment-results--element>li>.option:hover{background-color:#698fb5;border-radius:5px}.ibo-navigation-menu--menu-nodes ul ul{padding-left:20px}.ibo-navigation-menu--menu-nodes.ibo-is-active{display:block}.ibo-navigation-menu--menu-nodes-title{margin-top:0;margin-bottom:32px}.ibo-navigation-menu--menu-node-title{display:flex;justify-content:space-between;align-items:center}.ibo-navigation-menu--menu-node-counter{margin-left:8px;padding:2px 6px;width:34px;min-width:34px;text-align:center;background:#698fb5;border-radius:5px}.ibo-navigation-menu--notifications{position:relative;display:flex;flex-direction:column;align-content:center}.ibo-navigation-menu--notifications-toggler{position:relative;font-size:2rem;color:#434C5E}.ibo-navigation-menu--notifications-toggler:hover,.ibo-navigation-menu--notifications-toggler.ibo-is-loaded:hover{color:#f2f2f2}.ibo-navigation-menu--notifications-toggler.ibo-is-loaded{color:#7b88a1}.ibo-navigation-menu--notifications-toggler.ibo-is-loaded:not(.ibo-is-empty) .ibo-navigation-menu--notifications-toggler--new-messages{display:inline}.ibo-navigation-menu--notifications-toggler .ibo-navigation-menu--notifications-toggler--new-messages{top:-2px;right:-7px;width:16px;height:16px}.ibo-navigation-menu--user-notifications--toggler{position:relative}.ibo-navigation-menu--user-notifications--toggler.ibo-is-loaded{color:#7b88a1}.ibo-navigation-menu--user-notifications--toggler.ibo-is-loaded:not(.ibo-is-empty) .ibo-navigation-menu--notifications-toggler--new-messages{display:inline}.ibo-navigation-menu--user-notifications--toggler .ibo-navigation-menu--notifications-toggler--new-messages{top:-2px;right:-5px;width:10px;height:10px}.ibo-navigation-menu--notifications-toggler--new-messages{position:absolute;display:none;background-color:#BF616A;border:2px solid #232831;border-radius:100%}.ibo-navigation-menu--user-info{justify-content:space-between;flex-direction:column}.ibo-navigation-menu--user-info .ibo-navigation-menu--user-picture{width:36px;height:36px;overflow:hidden;background-color:#7b88a1;border-radius:100%}.ibo-navigation-menu--user-info .ibo-navigation-menu--user-picture .ibo-navigation-menu--user-picture--image{display:flex;max-width:36px;max-height:36px}.ibo-navigation-menu--user-info .ibo-navigation-menu--user-welcome-message,.ibo-navigation-menu--user-info .ibo-navigation-menu--user-organization,.ibo-navigation-menu--user-info .ibo-navigation-menu--user-notifications{display:none;text-align:center;color:white}.ibo-navigation-menu--user-info .ibo-navigation-menu--user-welcome-message .ibo-navigation-menu--user-welcome-message--text,.ibo-navigation-menu--user-info .ibo-navigation-menu--user-welcome-message .ibo-navigation-menu--user-welcome-message--toggler{color:white}.ibo-navigation-menu--user-info .ibo-navigation-menu--user-welcome-message--toggler{padding-left:6px}.ibo-navigation-menu--user-info .ibo-navigation-menu--user-notifications .ibo-navigation-menu--user-notifications--text{color:white}.ibo-navigation-menu--user-info .ibo-navigation-menu--user-notifications .ibo-navigation-menu--user-notifications--toggler--icon{padding-left:5px}.ibo-navigation-menu--user-info .ibo-navigation-menu--user-organization{color:#ebf8ff}.ibo-navigation-menu--user-info .ibo-navigation-menu--user-menu-container{position:absolute;bottom:10px}.ibo-navigation-menu--user-info .ibo-navigation-menu--user-menu-container .ibo-popover-menu>.ibo-popover-menu--section:nth-child(odd),.ibo-navigation-menu--user-info .ibo-navigation-menu--user-menu-container .ui-menu>.ibo-popover-menu--section:nth-child(odd),.ibo-navigation-menu--user-info .ibo-navigation-menu--user-menu-container .ui-menu>.ui-multiselect-checkboxes:nth-child(odd),.ibo-navigation-menu--user-info .ibo-navigation-menu--user-menu-container .ui-multiselect-menu>.ibo-popover-menu--section:nth-child(odd),.ibo-navigation-menu--user-info .ibo-navigation-menu--user-menu-container .ui-multiselect-menu>.ui-multiselect-checkboxes:nth-child(odd),.ibo-navigation-menu--user-info .ibo-navigation-menu--user-menu-container .ibo-input-select-icon--menu>.ibo-popover-menu--section:nth-child(odd),.ibo-navigation-menu--user-info .ibo-navigation-menu--user-menu-container .ibo-input-select-icon--menu>.ui-multiselect-checkboxes:nth-child(odd),.ibo-navigation-menu--user-info .ibo-navigation-menu--user-menu-container .graph_config .toolkit_menu.graph>ul>li ul>.ibo-popover-menu--section:nth-child(odd),.ibo-navigation-menu--user-info .ibo-navigation-menu--user-menu-container .graph_config .toolkit_menu.graph>ul>li ul>.ui-multiselect-checkboxes:nth-child(odd),.graph_config .toolkit_menu.graph>ul>li .ibo-navigation-menu--user-info .ibo-navigation-menu--user-menu-container ul>.ibo-popover-menu--section:nth-child(odd),.ibo-navigation-menu--user-info .ibo-navigation-menu--user-menu-container .ibo-popover-menu>.ui-multiselect-checkboxes:nth-child(odd){background-color:#E5E9F0}:root{--ibo-top-bar--height:54px;--ibo-top-bar--padding-left:16px;--ibo-top-bar--padding-right:16px;--ibo-top-bar--padding-y:0;--ibo-top-bar--background-color:#3B4252;--ibo-top-bar--elements-spacing:32px;--ibo-top-bar--quick-actions--margin-right:32px}.ibo-top-bar{height:var(--ibo-top-bar--height);padding:var(--ibo-top-bar--padding-y) var(--ibo-top-bar--padding-right) var(--ibo-top-bar--padding-y) var(--ibo-top-bar--padding-left);background-color:var(--ibo-top-bar--background-color)}.ibo-top-bar .ibo-breadcrumbs{flex-grow:1;overflow-x:hidden}.ibo-top-bar--quick-actions{margin-right:var(--ibo-top-bar--quick-actions--margin-right)}.ibo-top-bar--toolbar-dashboard-title{max-width:350px}.ibo-top-bar--toolbar-dashboard-menu-toggler{display:flex;align-items:center}.switch{position:relative;display:inline-block;width:36px;height:20px;vertical-align:baseline}.switch input{display:none}.slider{position:absolute;cursor:pointer;top:0;left:0;right:0;bottom:0;background-color:#434C5E;transition:0.4s}.slider:before{position:absolute;content:"";height:15px;width:15px;left:3px;bottom:3px;background-color:#7b88a1;transition:0.4s}input:checked+.slider{background-color:#698fb5}input:focus+.slider{box-shadow:0 0 1px #698fb5}input:checked+.slider:before{transform:translateX(14.5px)}.slider.round{border-radius:20px}.slider.round:before{border-radius:7px}#ibo-center-container.ibo-center-container--with-side-content{display:flex;align-items:stretch}#ibo-center-container.ibo-center-container--with-side-content #ibo-main-content{flex-grow:1}.ibo-v-spacer{padding-top:1em}#ibo-side-content{background-color:#2E3440;border-left:1px solid #191c22}.ibo-tab-container:not(.ibo-is-scrollable):not([data-status="loaded"]) .ibo-tab-container--tab-container:not(:first-child){display:none}.ibo-tab-container--tabs-list{position:relative;height:36px;background-color:#4C566A}.ibo-tab-container--tab-header,.ibo-tab-container--extra-tabs-container{color:#ECEFF4}.ibo-tab-container--tab-header:hover:not(.ui-state-disabled),.ibo-tab-container--extra-tabs-container:not(.ui-state-disabled):hover{color:#bee3f8;background-color:#616e88}.ibo-tab-container--tab-header.ui-tabs-active,.ui-tabs-active.ibo-tab-container--extra-tabs-container{color:#90cef4}.ibo-tab-container--tab-toggler,.ibo-tab-container--extra-tabs-list-toggler{padding-left:24px;padding-right:24px}.ibo-tab-container--extra-tabs-container{position:absolute;top:0;bottom:0;right:0;background-color:#4C566A}.ibo-tab-container--extra-tabs-list-toggler{padding-left:12px;padding-right:12px}.ibo-tab-container--extra-tabs-list{position:absolute;z-index:1;top:calc(100% + 6px);right:12px;max-height:300px;display:flex;flex-direction:column;background-color:#4C566A;border-radius:3px}.ibo-tab-container--extra-tab-toggler{padding:8px 16px;max-width:220px;color:#ebf8ff}.ibo-tab-container--extra-tab-toggler:hover,.ibo-tab-container--extra-tab-toggler:active{color:#bee3f8;background-color:#4C566A}.ibo-tab-container--tab-container{padding:32px 32px;overflow-x:auto}.ibo-tab-container--tab-container-list.ibo-is-scrollable .ibo-tab-container--tab-container--label{display:block}.ibo-tab-container--tab-container-list.ibo-is-scrollable .ibo-tab-container--tab-container{min-height:auto}.ibo-tab-container--tab-container-list.ibo-is-scrollable .ibo-tab-container--tab-container:last-child{min-height:60vh}.ibo-tab-container--tab-container--label{display:none;margin-bottom:20px;overflow-x:hidden}.ibo-tab-container--tab-container--label>span{position:relative;padding-left:20px;margin-left:40px;color:#D8DEE9}.ibo-tab-container--tab-container--label>span::before,.ibo-tab-container--tab-container--label>span::after{content:"";display:inline-block;position:absolute;top:calc(50% - (2px / 2));height:1px;width:10000px;border-top:2px solid #D8DEE9}.ibo-tab-container--tab-container--label>span::before{right:100%}.ibo-tab-container--tab-container--label>span::after{left:100%;margin-left:20px}.ibo-tab--temporary-remote-content{position:relative}.ibo-tab--temporary-remote-content--placeholder{position:relative;height:auto;max-height:300px;text-align:center}.ibo-tab--temporary-remote-content--placeholder>svg{max-width:calc(300px * 5.4);max-height:300px}.ibo-tab--temporary-remote-content--button{position:absolute;top:0;display:flex;justify-content:center;align-content:center;flex-direction:column;text-align:center;height:100%;width:100%;cursor:pointer;background-color:transparent;color:#2E3440}.ibo-tab--temporary-remote-content--button:hover{opacity:0.5;background-color:#191c22;color:#D8DEE9}.ibo-multi-column{display:flex;flex-wrap:wrap;margin:0 -16px}.ibo-column{min-width:300px;flex-grow:1;flex-shrink:1;padding:0 16px;flex-basis:10%}.ibo-column:not(:last-child) .ibo-column:not(.ibo-without-margin){margin-bottom:48px}.ibo-mini-column{min-width:30px;flex-grow:1;flex-shrink:1;padding:0 16px;flex-basis:10%;display:flex;flex-direction:column}.ibo-mini-column>.ibo-button,.ui-dialog .ibo-mini-column>.ui-button,.ibo-mini-column>.ui-datepicker-current,.ibo-mini-column>.ui-datepicker-close{margin-left:0;margin-right:0}.ibo-mini-column:not(:last-child){margin-bottom:48px}.ibo-dashboard--top-bar{display:flex;justify-content:space-between;align-items:center;padding-bottom:20px}.ibo-dashboard--top-bar .ibo-dashboard--top-bar-toolbar{display:flex;align-items:center}.ibo-dashboard--selector{display:flex;align-items:center;margin-left:12px;margin-right:1px}.ibo-dashboard--selector:hover{background-color:#E5E9F0;border-radius:4px}.ibo-dashboard--selector .selector-label{display:inline-block;margin-left:10px;margin-right:10px;vertical-align:super}.ibo-dashboard--grid{width:100%}.ibo-dashboard--grid-row{display:flex;flex-direction:row;justify-content:space-between;overflow:hidden}.ibo-dashboard--grid-row:not(:last-child){padding-bottom:calc(24px / 2)}.ibo-dashboard--grid-row:not(:first-child){padding-top:calc(24px / 2)}.ibo-dashboard--grid-column{display:flex;flex-flow:row wrap;align-items:flex-start;align-content:flex-start;width:calc(100% + (2 * 24px));margin:calc(-1 * 24px / 2) calc(-1 * 24px / 2);min-width:0}.ibo-dashboard--grid-column:not(:last-child){margin-right:0}.ibo-dashboard--grid-column:not(:first-child){margin-left:0}.ibo-dashboard--grid-column.edit_mode{margin:1px;border:2px #ccc dashed;width:100%;min-height:40px}.ibo-dashboard--switch{position:relative;display:inline-block;width:30px;height:24px;vertical-align:baseline}.ibo-dashboard--switch input{display:none}.ibo-dashboard--slider{position:absolute;cursor:pointer;top:0;left:0;right:0;bottom:0}.ibo-dashboard--slider:before{position:absolute;right:5px;bottom:3px;color:#2E3440;content:"\f007";font-family:"Font Awesome 5 Free", serif;font-size:0.83rem;font-weight:900}.ibo-dashboard--slider:after{position:absolute;left:6px;bottom:1px;color:#698fb5;content:"\f1ad";font-family:"Font Awesome 5 Free", serif;font-size:1.17rem;font-weight:900}input:checked+.ibo-dashboard--slider:before{content:"\f1ad"}input:checked+.ibo-dashboard--slider:after{content:"\f007"}.ibo-dashboard-editor--pane{flex-grow:1;padding:16px 30px 16px 15px;overflow:auto}.ibo-dashboard-editor--available-dashlet-icon{display:inline-block;height:34px;width:34px;margin:2px 5px;cursor:grab}.ibo-dashboard-editor--available-dashlet-icon:active{cursor:move}.ibo-dashboard-editor--properties,.ibo-dashboard--available-dashlets,.ibo-dashlet--properties{display:flex;flex-direction:column;padding-bottom:20px}.ibo-dashboard-editor--properties table,.ibo-dashboard--available-dashlets table,.ibo-dashlet--properties table{width:100%;text-align:left}.ibo-dashboard-editor--properties table td,.ibo-dashboard--available-dashlets table td,.ibo-dashlet--properties table td,.ibo-dashboard-editor--properties table th,.ibo-dashboard--available-dashlets table th,.ibo-dashlet--properties table th{margin-bottom:14px}.ibo-dashboard-editor--properties-title{padding-bottom:2rem}.ibo-dashboard-editor--layout-list{display:flex;justify-content:center;padding-bottom:12px}.ibo-dashboard-editor--layout-list>.ui-button{display:inline-block;height:auto;margin:0 15px 0 5px}.ibo-dashboard--available-dashlets--list{display:flex;justify-content:center;flex-wrap:wrap}#dashboard_editor{display:flex;flex-direction:row;padding:0}#dashboard_editor>.itop-dashboard{resize:horizontal;overflow:scroll;border-right:solid 1px #D8DEE9;padding:16px 15px 16px 30px}.ibo-dashboard-editor--delete-dashlet-icon{position:absolute;top:7px;right:9px;padding:2px 6px;z-index:21}.ibo-dashboard-editor .itop-dashboard a{cursor:not-allowed}.ibo-wizard-container{padding:10px 16px;background:#2a4265;border-radius:3px;border-left:3px solid #3182ce}.ibo-object-details.ibo-has-icon.ibo-has-medallion-icon>.ibo-panel--header .ibo-panel--header-left{margin-left:32px;padding-left:96px}.ibo-object-details.ibo-has-icon.ibo-has-medallion-icon>.ibo-panel--header .ibo-panel--header-left .ibo-panel--icon{bottom:calc(-1 * 96px / 2 + -12px);width:96px;height:96px;min-width:96px;min-height:96px}.ibo-object-details.ibo-has-icon.ibo-has-medallion-icon>.ibo-panel--header .ibo-panel--header-left .ibo-panel--titles{padding-left:32px}.ibo-object-details--status-dot{width:10px;height:10px;min-width:10px;min-height:10px;border-radius:100%}.ibo-object-details--status-dot+.ibo-object-details--status-label{margin-left:8px}.ibo-object-details--status+.ibo-object-details--object-class{margin-left:0.5rem}.ibo-object-details--status+.ibo-object-details--object-class::before{content:"("}.ibo-object-details--status+.ibo-object-details--object-class::after{content:")"}.ibo-object-details--tag{color:#a8b0c1}.ibo-object-details--tag:not(:first-child){margin-left:12px}.ibo-object-details--tag-icon{margin-right:6px;color:#3B4252}.ibo-object-details--object-class~.ibo-object-details--tag::before,.ibo-object-details--tag~.ibo-object-details--tag::before{content:" ";display:inline-block;vertical-align:middle;margin-right:12px;width:5px;height:5px;border-radius:100%;background-color:#7b88a1}.ibo-object-details.ibo-has-sticky-header>.ibo-panel--header{}.ibo-object-details.ibo-has-sticky-header>.ibo-panel--header .ibo-panel--header-left{}.ibo-object-details.ibo-has-sticky-header>.ibo-panel--header.ibo-is-sticking .ibo-object-details--object-class{display:none}.ibo-object-details.ibo-has-sticky-header.ibo-has-icon.ibo-has-medallion-icon>.ibo-panel--header{}.ibo-object-details.ibo-has-sticky-header.ibo-has-icon.ibo-has-medallion-icon>.ibo-panel--header.ibo-is-sticking .ibo-panel--header-left{padding-left:48px}.ibo-object-details.ibo-has-sticky-header.ibo-has-icon.ibo-has-medallion-icon>.ibo-panel--header.ibo-is-sticking .ibo-panel--header-right{padding-right:8px}.ibo-object-details.ibo-has-sticky-header.ibo-has-icon.ibo-has-medallion-icon>.ibo-panel--header.ibo-is-sticking .ibo-panel--titles{padding-left:32px}.ibo-activity-panel{position:relative;display:flex;flex-direction:column;width:480px;height:100%;transition:width 0.2s ease-in-out}.ibo-activity-panel.ibo-is-expanded{width:60vw}.ibo-activity-panel.ibo-is-expanded .ibo-activity-panel--expand-icon{display:none}.ibo-activity-panel:not(.ibo-is-expanded) .ibo-activity-panel--reduce-icon{display:none}.ibo-activity-panel.ibo-is-closed{width:32px}.ibo-activity-panel.ibo-is-closed .ibo-activity-panel--header,.ibo-activity-panel.ibo-is-closed .ibo-activity-panel--body,.ibo-activity-panel.ibo-is-closed .ibo-activity-panel--add-caselog-entry-button{display:none}.ibo-activity-panel.ibo-is-closed .ibo-activity-panel--closed-cover{display:inherit}.ibo-activity-panel--header{position:relative;background-color:#616e88}.ibo-activity-panel--header>.ibo-activity-panel--tabs-togglers a{color:#2E3440}.ibo-activity-panel--togglers{position:absolute;right:16px;top:0;bottom:0;color:#434C5E}.ibo-activity-panel--togglers:hover{color:#2E3440}.ibo-activity-panel--togglers>*:not(:first-child){margin-left:0.75rem}.ibo-activity-panel--tabs-togglers{position:relative;padding-left:48px;padding-right:48px}.ibo-activity-panel--tab-toggler.ibo-is-active .ibo-activity-panel--tab-title{background-color:#D8DEE9}.ibo-activity-panel--tab-toggler.ibo-is-active .ibo-activity-panel--tab-title-messages-count{display:none}.ibo-activity-panel--tab-toggler.ibo-is-draft .ibo-activity-panel--tab-title-draft-indicator{display:initial}.ibo-activity-panel--tab-toggler-for-caselog-1 .ibo-activity-panel--tab-title-decoration{background-color:#689f38}.ibo-activity-panel--tab-toggler-for-caselog-2 .ibo-activity-panel--tab-title-decoration{background-color:#b83280}.ibo-activity-panel--tab-toggler-for-caselog-3 .ibo-activity-panel--tab-title-decoration{background-color:#f6ae55}.ibo-activity-panel--tab-toggler-for-caselog-4 .ibo-activity-panel--tab-title-decoration{background-color:#3182ce}.ibo-activity-panel--tab-toggler-for-caselog-5 .ibo-activity-panel--tab-title-decoration{background-color:#80deea}.ibo-activity-panel--tab-toggler-for-caselog-6 .ibo-activity-panel--tab-title-decoration{background-color:#c5e1a5}.ibo-activity-panel--tab-toggler-for-caselog-7 .ibo-activity-panel--tab-title-decoration{background-color:#fbb6ce}.ibo-activity-panel--tab-title{padding:8px 16px}.ibo-activity-panel--tab-title:hover{background-color:#D8DEE9}.ibo-activity-panel--tab-title-decoration{display:inline-flex;margin-right:8px;width:12px;height:12px;border-radius:3px}.ibo-activity-panel--tab-title-messages-count{display:inline-block;margin-left:8px;background-color:#D8DEE9;padding:0 4px;border-radius:3px}.ibo-activity-panel--tab-title-messages-count[data-messages-count="0"]{display:none}.ibo-activity-panel--tab-title-draft-indicator{display:none;margin-left:8px}.ibo-activity-panel--tab-title-text{max-width:100px}.ibo-activity-panel--tab-toolbar{display:none;flex-direction:column;padding-left:10px;padding-right:10px;background-color:#D8DEE9}.ibo-activity-panel--tab-toolbar.ibo-is-active{display:flex}.ibo-activity-panel--tab-toolbar-actions{justify-content:space-between;flex-wrap:nowrap;margin:4px 0;height:32px}.ibo-activity-panel--tab-toolbar-left-actions .ibo-activity-panel--tab-toolbar-action:not(:first-child)::before{content:"-";margin:0 8px}.ibo-activity-panel--tab-toolbar-middle-actions .ibo-activity-panel--tab-toolbar-action>input{margin-right:8px}.ibo-activity-panel--tab-toolbar-middle-actions .ibo-activity-panel--tab-toolbar-action:not(:first-child){margin-left:18px}.ibo-activity-panel--tab-toolbar-right-actions .ibo-activity-panel--tab-toolbar-info{color:#2E3440}.ibo-activity-panel--tab-toolbar-right-actions .ibo-activity-panel--tab-toolbar-info>.ibo-activity-panel--tab-toolbar-info-icon{margin-left:8px}.ibo-activity-panel--tab-toolbar-right-actions .ibo-activity-panel--tab-toolbar-info:not(:first-child){margin-left:16px}.ibo-activity-panel--tab-toolbar-action{position:relative;color:#2E3440}.ibo-activity-panel--filter{cursor:pointer}.ibo-activity-panel--filter-options-toggler{padding-left:0.5rem;color:#2E3440}.ibo-activity-panel--filter-options-toggler.ibo-is-closed{transform:rotateX(180deg)}.ibo-activity-panel--filter-options-toggler.ibo-is-closed+.ibo-activity-panel--filter-options{display:none}.ibo-activity-panel--filter-options{position:absolute;z-index:1;display:flex;flex-direction:column;top:24px;left:-12px;max-width:200px;padding:8px 12px;background-color:#D8DEE9;border-radius:3px}.ibo-activity-panel--filter-option{cursor:pointer}.ibo-activity-panel--filter-option:not(:first-child){margin-top:8px}.ibo-activity-panel--filter-option-input{margin-right:0.5rem}.ibo-activity-panel--body{flex-grow:1;overflow:auto;padding:16px 16px}.ibo-activity-panel--body--placeholder{margin-top:16px}.ibo-activity-panel--body--placeholder-image>svg{width:250px;height:inherit}.ibo-activity-panel--body--placeholder-hint{margin-top:16px;color:#D8DEE9}.ibo-activity-panel--add-caselog-entry-button{position:absolute;z-index:1;right:12px;top:88px;width:36px;height:36px;background-color:#698fb5;color:white;border-radius:100%;box-shadow:0 1px 2px rgba(0, 0, 0, 0.25), 0 1px 3px rgba(0, 0, 0, 0.12)}.ibo-activity-panel--add-caselog-entry-button>i{text-align:center;height:100%;width:100%;font-size:1.33rem;line-height:33px}.ibo-activity-panel--add-caselog-entry-button:hover{color:white;background-color:#81A1C1;box-shadow:0 2px 4px rgba(0, 0, 0, 0.12), 0 3px 6px rgba(0, 0, 0, 0.15)}.ibo-activity-panel--add-caselog-entry-button:active{color:white;background-color:#7693b8}.ibo-activity-panel--add-caselog-entry-button.ibo-is-hidden{display:none}.ibo-activity-panel .ibo-activity-panel--entry-forms-confirmation-dialog{display:none}.ibo-activity-panel--entry-forms-confirmation-explanation{margin-bottom:16px}.ibo-activity-panel--entry-forms-confirmation-preference-input{margin-right:0.5rem}.ibo-activity-panel--closed-cover{display:none;position:absolute;z-index:2;top:0;bottom:0;left:0;right:0;background-color:#616e88;cursor:pointer}.ibo-activity-panel--closed-content-container{transform:rotateZ(-90deg);white-space:nowrap}.ibo-activity-panel--open-icon{margin-left:0.75rem}.ibo-caselog-entry-form{display:block;width:100%;background-color:#D8DEE9}.ibo-caselog-entry-form.ibo-is-closed{display:none}.ibo-caselog-entry-form--actions{display:flex;justify-content:space-between;margin-top:8px;margin-bottom:8px}.ibo-caselog-entry-form--lock-indicator{margin-top:12px}.ibo-caselog-entry-form--lock-icon{width:32px;min-width:32px;height:32px;min-height:32px;color:#ECEFF4;background-color:#2E3440;border-radius:100%}.ibo-caselog-entry-form--lock-message{margin-left:1rem}.ibo-caselog-entry-form--action-buttons--main-actions{}.ibo-caselog-entry-form--action-buttons--main-actions>.ibo-popover-menu,.ibo-caselog-entry-form--action-buttons--main-actions>.ui-menu,.ibo-caselog-entry-form--action-buttons--main-actions>.ui-multiselect-menu,.ibo-caselog-entry-form--action-buttons--main-actions>.ibo-input-select-icon--menu,.graph_config .toolkit_menu.graph>ul>li .ibo-caselog-entry-form--action-buttons--main-actions>ul{z-index:1}.ibo-activity-panel--entry-group:not(:last-child){margin-bottom:24px}.ibo-activity-entry{display:flex;flex-direction:row;align-items:flex-end}.ibo-activity-entry:not(:last-child) .ibo-activity-entry--medallion{visibility:hidden}.ibo-activity-entry:not(:last-child) .ibo-activity-entry--sub-information{margin-bottom:4px}.ibo-activity-entry.ibo-is-current-user{flex-direction:row-reverse;min-width:min-content}.ibo-activity-entry.ibo-is-current-user .ibo-activity-entry--medallion{margin-right:initial;margin-left:8px}.ibo-activity-entry.ibo-is-current-user .ibo-activity-entry--information{margin-right:0;margin-left:40px}.ibo-activity-entry.ibo-is-current-user .ibo-activity-entry--main-information{background-color:#a5cfdc}.ibo-activity-entry.ibo-is-current-user .ibo-activity-entry--sub-information{text-align:right}.ibo-activity-entry.ibo-is-current-user:last-child .ibo-activity-entry--main-information{border-bottom-right-radius:0;border-bottom-left-radius:5px}.ibo-activity-entry:not(.ibo-is-current-user) .ibo-activity-entry--information{margin-right:40px;margin-left:0}.ibo-activity-entry:not(.ibo-is-current-user):last-child .ibo-activity-entry--main-information{border-bottom-right-radius:5px;border-bottom-left-radius:0}.ibo-activity-entry.ibo-is-closed .ibo-activity-entry--main-information{max-height:48px;overflow:hidden;cursor:pointer}.ibo-activity-entry.ibo-is-closed .ibo-activity-entry--main-information::after{content:"...";position:absolute;top:30px;left:0;padding-left:16px;width:100%;height:100%;background-color:inherit}.ibo-activity-entry--medallion{margin-right:8px;margin-bottom:18px;min-width:32px;width:32px;min-height:32px;height:32px;overflow:hidden;border-radius:100%}.ibo-activity-entry--medallion.ibo-has-image{background-color:#ebf8ff;box-shadow:inset 0 1px 2px 0 rgba(0, 0, 0, 0.25)}.ibo-activity-entry--medallion:not(.ibo-has-image){background-color:#546e7a;color:white;border:1px solid #D8DEE9}.ibo-activity-entry--medallion .ibo-activity-entry--author-picture{max-height:100%}.ibo-activity-entry--main-information{position:relative;display:flex;flex-direction:row;align-items:baseline;padding:12px 16px;color:#2E3440;background-color:#D8DEE9;border-radius:5px}.ibo-activity-entry--main-information-icon{margin-right:16px;color:#3B4252;font-size:1.33rem}.ibo-activity-entry--main-information-content{flex-grow:1;word-break:break-word}.ibo-activity-entry--main-information-content a{color:#2b6bb0}.ibo-activity-entry--main-information-content a:hover,.ibo-activity-entry--main-information-content .ibo-quick-create--compartment-results--element>.option:hover{color:#2a4265}.ibo-activity-entry--main-information-content a:active,.ibo-activity-entry--main-information-content a:focus{color:#2a4265}.ibo-activity-entry--sub-information{margin-top:4px;text-align:left;color:#D8DEE9}.ibo-activity-entry--sub-information>*:not(:last-child):after{content:" ";display:inline-block;vertical-align:middle;margin-left:0.5rem;margin-right:0.5rem;width:4px;height:4px;border-radius:100%;background-color:#434C5E}.ibo-activity-panel--load-more-entries-container{position:relative}.ibo-activity-panel--load-more-entries-container:hover .ibo-activity-panel--load-all-entries{margin-left:84px}.ibo-activity-panel--load-more-entries-container:not(:hover) .ibo-activity-panel--load-all-entries{visibility:hidden}.ibo-activity-panel--load-entries-button{width:32px;height:32px;border-radius:100%;background-color:#D8DEE9;border:1px solid #191c22}.ibo-activity-panel--load-more-entries{z-index:1}.ibo-activity-panel--load-all-entries{position:absolute;z-index:0;top:0;margin-left:0;transition:all 0.1s ease-in-out}.ibo-caselog-entry .ibo-activity-entry--main-information{padding-top:12px;padding-bottom:12px}.ibo-caselog-entry .ibo-activity-entry--main-information-icon{display:none}.ibo-caselog-entry .ibo-activity-entry--main-information-content{}.ibo-caselog-entry .ibo-activity-entry--main-information::before{content:"";position:absolute;top:0;bottom:0;width:3px}.ibo-caselog-entry:not(.ibo-is-current-user) .ibo-activity-entry--main-information::before{left:0;border-top-left-radius:5px;border-bottom-left-radius:5px}.ibo-caselog-entry:not(.ibo-is-current-user):last-child .ibo-activity-entry--main-information::before{border-bottom-left-radius:0}.ibo-caselog-entry.ibo-is-current-user .ibo-activity-entry--main-information::before{right:0;border-top-right-radius:5px;border-bottom-right-radius:5px}.ibo-caselog-entry.ibo-is-current-user:last-child .ibo-activity-entry--main-information::before{border-bottom-right-radius:0}.ibo-caselog-entry.ibo-is-closed.ibo-is-current-user .ibo-activity-entry--main-information::after{width:calc(100% - 3px)}.ibo-caselog-entry.ibo-is-closed:not(.ibo-is-current-user) .ibo-activity-entry--main-information::after{margin-left:3px}.ibo-caselog-entry--entry-for-caselog-1 .ibo-activity-entry--main-information::before{background-color:#689f38}.ibo-caselog-entry--entry-for-caselog-2 .ibo-activity-entry--main-information::before{background-color:#b83280}.ibo-caselog-entry--entry-for-caselog-3 .ibo-activity-entry--main-information::before{background-color:#f6ae55}.ibo-caselog-entry--entry-for-caselog-4 .ibo-activity-entry--main-information::before{background-color:#3182ce}.ibo-caselog-entry--entry-for-caselog-5 .ibo-activity-entry--main-information::before{background-color:#80deea}.ibo-caselog-entry--entry-for-caselog-6 .ibo-activity-entry--main-information::before{background-color:#c5e1a5}.ibo-caselog-entry--entry-for-caselog-7 .ibo-activity-entry--main-information::before{background-color:#fbb6ce}.ibo-transition-entry--original-state-label{color:#2E3440;text-decoration:line-through}a.ibo-edits-entry--short-description{position:relative;display:block;color:inherit}.ibo-edits-entry--long-description-toggler-icon{position:absolute;top:3px;right:0;transition:all 0.2s ease-in-out}.ibo-edits-entry--long-description{display:none;margin-top:8px;list-style:inside}.ibo-edits-entry:not(.ibo-is-closed) .ibo-edits-entry--long-description-toggler-icon{transform:rotateX(180deg)}.ibo-edits-entry:not(.ibo-is-closed) .ibo-edits-entry--long-description{display:block}a.ibo-notification-entry--short-description{color:inherit}.ibo-notification-entry--long-description-toggler-icon{margin-left:12px;transition:all 0.2s ease-in-out}.ibo-notification-entry--long-description{display:none;margin-top:8px;list-style:inside}.ibo-notification-entry:not(.ibo-is-closed) .ibo-notification-entry--long-description-toggler-icon{transform:rotateX(180deg)}.ibo-notification-entry:not(.ibo-is-closed) .ibo-notification-entry--long-description{display:block}.ibo-block-csv textarea{width:100%;min-height:10em;margin-top:10px}.ibo-block-list--empty-text,.ibo-block-list--create-action{text-align:center}.ibo-block-list--create-icon{margin-right:0.5rem}.ibo-table-preview{margin-top:20px;overflow-x:auto}.ibo-table-preview th{position:relative;padding:5px;padding-right:24px;border-width:1px 1px 0;border-style:groove groove none;background:#f2f2f2}.ibo-table-preview td{padding-right:5px;padding-left:5px;border-width:0 1px;border-style:none groove}.ibo-table-preview tr:last-child td{border-bottom-width:1px;border-bottom-style:groove}.ibo-preview-header{margin-bottom:5px}.ibo-table-preview--remove-column{position:absolute;top:8px;right:8px;display:inline-block;cursor:pointer;font-size:8px}#form_part_interactive_fields_xlsx,#form_part_interactive_fields_csv,#form_part_interactive_fields_pdf{margin-top:24px}:root{--ibo-body-text-color:#E5E9F0;--ibo-body-background-color:#2E3440}html{height:100vh}body{display:flex;height:100vh;color:var(--ibo-body-text-color);background-color:var(--ibo-body-background-color)}#ibo-navigation-menu{z-index:20}#ibo-page-container{position:relative;z-index:10;height:100%;overflow:auto;flex-grow:1;display:flex;flex-direction:column}#ibo-top-bar,#ibo-main-content{padding-left:36px;padding-right:36px}#ibo-top-container{z-index:20;position:sticky;top:0;left:0;right:0}#ibo-center-container{position:relative;z-index:10;flex-grow:1;overflow:hidden}#ibo-center-container>*{height:100%}#ibo-main-content{padding-top:16px;padding-bottom:16px;overflow:auto}#ibo-main-content>.ibo-panel{margin-left:auto;margin-right:auto}.ibo-preferences--user-preferences--picture-placeholder{display:flex;flex-direction:row;flex-wrap:wrap}.ibo-preferences--user-preferences--picture-placeholder--image{height:54px;width:54px;border-radius:100%;margin:12px;border:solid 3px #7b88a1}.ibo-preferences--user-preferences--picture-placeholder--image>img{border-radius:100%;background-color:#7b88a1}.ibo-preferences--user-preferences--picture-placeholder--image.ibo-is-active{border-color:#2c5382}.ibo-preferences--user-preferences--picture-placeholder--image:hover{border-color:#3182ce}#ibo-form-for-user-interface-preferences>.ibo-keyboard-shortcut--shortcut{display:table;width:100%}#ibo-form-for-user-interface-preferences>.ibo-keyboard-shortcut--shortcut>*:not(.ibo-button){width:30%;display:table-cell}.ibo-keyboard-shortcut--input,.ibo-keyboard-shortcut--input:focus{display:inline-block;width:auto;text-transform:capitalize;text-align:center;color:#D8DEE9;background-color:#434C5E;border:1px solid #4C566A;border-bottom:2px solid #4C566A;border-radius:3px;padding:2px 4px;margin-bottom:5px}.ibo-keyboard-shortcut--input.ibo-is-focus,.ibo-keyboard-shortcut--input:focus.ibo-is-focus{text-transform:none;color:#5E81AC;border-color:#698fb5}#ibo-favorite-organizations .ibo-toolbar{float:right;vertical-align:top}#ibo-favorite-organizations .ibo-datatable--toolbar{padding-top:3px}#ibo-attachment--upload-file .ibo-input-file-select--container{display:inline-block}.ibo-attachment--datatable--icon-preview{max-height:44px;max-width:44px}.ibo-attachment--datatable tbody tr td{line-height:44px}.ibo-attachment--datatable tbody tr td:nth-child(1){line-height:0px}.ibo-attachment--upload-file--drop-zone-hint{display:none}.ibo-drag-in{border:2px #616e88 dashed}.ibo-drag-in .ibo-attachment--upload-file--drop-zone-hint{display:flex;flex-direction:column;justify-content:center;align-items:center;width:100%;max-height:200px;margin:22px 0;color:#3B4252}.ibo-drag-in .ibo-attachment--upload-file--drop-zone-hint>svg{margin-bottom:5px}.ibo-drag-in #ibo-attachment--upload-file--upload-button-container{display:none}.ibo-tab-container--tab-header.ibo-drag-in,.ibo-drag-in.ibo-tab-container--extra-tabs-container{border:none;background-color:#bee3f8;color:#2c5382}.ibo-tab-container--tab-header.ibo-drag-in>a::after,.ibo-drag-in.ibo-tab-container--extra-tabs-container>a::after{padding-left:8px;font-family:"Font Awesome 5 Free";content:"\f382";font-weight:900;color:#3182ce}.itop-simple-graph{margin-top:10px;border:1px dotted transparent;border-radius:5px}.itop-simple-graph.ibo-has-focus{border:1px dotted #2E3440}.graph_zoom{display:flex;float:right;align-items:center}.graph_zoom_slider{height:1.1em;display:inline-block;width:10em}.graph_zoom_plus,.graph_zoom_minus{cursor:pointer;display:inline-block;margin-left:0.5em;margin-right:0.5em}.graph_config{display:flex;align-items:center;flex-wrap:wrap}.graph_config .toolkit_menu.graph>ul>li{position:relative}.graph_config .toolkit_menu.graph>ul>li ul{z-index:1;position:absolute;display:none}.graph_separator{flex-grow:1}.ibo-simple-graph--grouping-threshold--container,.ibo-simple-graph--additional-context--container{margin-right:0.3em;display:flex;align-items:center}.ibo-simple-graph--grouping-threshold--container>*,.ibo-simple-graph--additional-context--container>*{margin-right:1em}#graph_grouping_threshold{width:auto;padding-right:0}.ibo-display-graph--search-box .sf_criterion_area{display:flex;flex-direction:column}.ibo-display-graph--search-box .sf_criterion_row{display:flex;flex-wrap:wrap;align-items:center}.ibo-display-graph--search-box .sf_criterion_row>div{align-items:center;display:flex;padding:0 15px}.ibo-display-graph--search-box .sf_criterion_row>div>input{margin-right:10px}.ibo-display-graph--search-box .sf_criterion_row>div .ibo-medallion-icon{display:flex;align-items:center}.ibo-display-graph--search-box #ReloadMovieBtn{align-self:flex-end}#impacted_objects_lists>div~div{margin-top:24px}#impacted_objects_lists_placeholder,#impacted_groups_placeholder{height:250px}.ibo-audit--audit-category--panel .ibo-panel--body tr.ibo-is-red td:last-of-type:before{background-color:#b44953}.ibo-audit--audit-category--panel .ibo-panel--body tr.ibo-is-orange td:last-of-type:before{background-color:#c05621}.ibo-audit--audit-category--panel .ibo-panel--body tr.ibo-is-green td:last-of-type:before{background-color:#558b2f}.ibo-audit--audit-category--panel .ibo-panel--body{padding:10px 16px}.ibo-audit--audit-category--panel .ibo-panel--body .ibo-datatable td:not(:nth-child(1)),.ibo-audit--audit-category--panel .ibo-panel--body .ibo-datatable th:not(:nth-child(1)){text-align:right;width:100px}.ibo-audit--audit-category--panel .ibo-panel--body .ibo-datatable--toolbar{display:none}.ibo-audit--audit-category--panel .ibo-panel--body tr td:last-of-type:before{content:'';height:12px;width:12px;border-radius:100%;display:inline-block;margin-right:5px;vertical-align:middle}.ibo-audit--dashboard{padding:18px 0}.ibo-dashboard--grid-row+.ibo-audit--error-alert{margin-top:24px}.ibo-audit--audit-line--csv-download{height:2.5em;vertical-align:middle}.ibo-data-synchro-source--replicas-status.ibo-is-grey{color:#191c22;background-color:#616e88}.ibo-data-synchro-source--replicas-status.ibo-is-orange{color:#7b341e;background-color:#fbd38d}.ibo-data-synchro-source--replicas-status.ibo-is-bluegrey{color:#263238;background-color:#b0bec5}.ibo-data-synchro-source--replicas-status.ibo-is-red{color:#7d333a;background-color:#dfb1b5}.ibo-data-synchro-source--replicas-status.ibo-is-blue{color:#2a4265;background-color:#bee3f8}.ibo-data-synchro-source--replicas-status.ibo-is-green{color:#33691e;background-color:#dcedc8}.ibo-data-synchro-source--replicas-status.ibo-is-cyan{color:#006164;background-color:#c9eef2}.ibo-data-synchro-source--replicas-status-separator{border-top:2px solid white}.ibo-data-synchro-source--replicas-status.ibo-is-light{opacity:0.5}.ibo-data-synchro-source--replicas-status.ibo-is-light:hover{opacity:1}.synoptics tr td{padding:10px;min-width:200px;vertical-align:middle;text-align:center}.synoptics tr td.arrow{min-width:100px;border-top:2px solid #ECEFF4}.ibo-data-synchro-source--replicas-status--warning{margin:0 5px 0 8px}.ibo-datamodel-viewer--parent--spacer{padding:0 8px}#ibo-datamodel-viewer--attributes-table>tbody tr td:first-child{width:3px}.ibo-datamodel-viewer--origin-cell{vertical-align:middle}.ibo-datamodel-viewer--origin-cell>div{height:8px;width:8px;border-radius:100%}.ibo-datamodel-viewer--classes-list{position:relative;height:100%;width:350px;padding-left:24px;overflow-y:scroll}.ibo-datamodel-viewer--lifecycle--code{color:#3B4252}.ibo-datamodel-viewer--lifecycle--stimuli{color:#2a4265}.ibo-datamodel-viewer--lifecycle--attribute-option{color:#702459}.dataModelSchema g{cursor:pointer}.dataModelSchema g:hover rect:not(.liseret){fill:#616e88}.dataModelSchema text{fill:#191c22;text-anchor:middle}#selfreferencing:hover~g>.selfattr{fill:#616e88}.tooltipD3{position:fixed;text-align:center;background:white;border:1px solid #3B4252;border-radius:3px;pointer-events:none;fill:#191c22;text-anchor:middle}.tooltipD3 i{font-size:1rem}.tooltipD3 span{margin:3px}#tooltipD3_top{border-bottom:1px solid #3B4252;padding:3px}.ibo-datamodel-viewer--lifecycle-image{margin-bottom:16px}#tabs1-import .ibo-field--label{max-width:50%}div.ibo-csv-import--cell-modified{font-weight:bold;color:#2b6bb0}div.ibo-csv-import--cell-error{font-weight:bold;color:#b44953}div.ibo-csv-import--cell-message{padding-top:3px}tr.ibo-csv-import--row-unchanged td{border-bottom:1px #616e88 solid}.wizContainer table tr.ibo-csv-import--row-error td{border-bottom:1px #616e88 solid;background-color:#f2e0e2}tr.ibo-csv-import--row-modified td{border-bottom:1px #616e88 solid}tr.ibo-csv-import--row-added td{border-bottom:1px #616e88 solid}.ibo-csv-import--download-file{font-size:4em;color:#6eb2c6;margin:20px}.ibo-global-search--result--title>img{max-height:48px;max-width:48px;margin-right:8px}.ibo-run-query--highlight{background-color:#7693b8}#welcome_popup{display:flex}.ibo-welcome-popup--image{display:flex;justify-content:center;align-self:center;width:30%}.ibo-welcome-popup--image>svg{height:100%;padding:20px}.ibo-welcome-popup--text{flex-grow:1;align-self:center;padding:15px}.ibo-welcome-popup--text>div>div{padding-bottom:20px}.ibo-welcome-popup--text>div>div:first-child{padding-bottom:25px}.ibo-welcome-popup--text--options{position:absolute;bottom:10px}.ibo-alert+.ibo-alert{margin-top:4px}.ibo-alert+.ibo-block:not(.ibo-alert){margin-top:16px}.ibo-button+.ibo-button,.ui-dialog .ui-button+.ibo-button,.ui-dialog .ui-button+.ui-button,.ui-dialog .ui-button+.ui-datepicker-current,.ui-dialog .ui-button+.ui-datepicker-close,.ui-datepicker-current+.ibo-button,.ui-dialog .ui-datepicker-current+.ui-button,.ui-datepicker-current+.ui-datepicker-current,.ui-datepicker-current+.ui-datepicker-close,.ui-datepicker-close+.ibo-button,.ui-dialog .ui-datepicker-close+.ui-button,.ui-datepicker-close+.ui-datepicker-current,.ui-datepicker-close+.ui-datepicker-close,.ui-dialog .ibo-button+.ui-button,.ibo-button+.ui-datepicker-current,.ibo-button+.ui-datepicker-close{margin-left:4px}.ibo-button-group+.ibo-button-group,.ibo-button+.ibo-button-group,.ui-dialog .ui-button+.ibo-button-group,.ui-datepicker-current+.ibo-button-group,.ui-datepicker-close+.ibo-button-group,.ibo-button-group+.ibo-button,.ui-dialog .ibo-button-group+.ui-button,.ibo-button-group+.ui-datepicker-current,.ibo-button-group+.ui-datepicker-close{margin-left:4px}.ibo-collapsible-section+.ibo-collapsible-section{margin-top:12px}.ibo-collapsible-section+.ibo-block:not(.ibo-collapsible-section){margin-top:16px}.ibo-caselog-list .ibo-collapsible-section{margin:0;min-width:22em}.ibo-caselog-list .ibo-collapsible-section .ibo-collapsible-section--body{color:#191c22;padding:8px;background-color:rgba(229, 233, 240, 0.5)}.ibo-alert--body .ibo-collapsible-section{margin:0;min-width:22em}.ibo-alert--body .ibo-collapsible-section .ibo-collapsible-section--body{color:#191c22;padding:8px}.ibo-datatable+.ibo-block{margin-top:4px}.ibo-panel .ibo-panel--body .ibo-datatable{width:100%}.display_block+.display_block{margin-top:24px}.display_block+.ibo-block:not(.display_block){margin-top:16px}.ibo-field+.ibo-field{margin-top:16px}.form_field+.form_field{margin-top:16px}.ibo-fieldset+.ibo-field,fieldset+.ibo-field{margin-top:32px}.ibo-field+.ibo-fieldset:not(.ibo-column),.ibo-field+fieldset:not(.ibo-column){margin-top:32px}.ibo-fieldset+.ibo-fieldset:not(.ibo-column),fieldset+.ibo-fieldset:not(.ibo-column),.ibo-fieldset+fieldset:not(.ibo-column){margin-top:48px}.ibo-multi-column+.ibo-fieldset,.ibo-multi-column+fieldset{margin-top:48px}.ibo-form+.ibo-form{margin-top:24px}select+label,label+select,label>select,input+label,label+input,label>input{margin-left:8px}.ibo-input-with-label--label.ibo-has-description::after{content:"?";padding-left:4px;vertical-align:top;cursor:pointer;color:#7b88a1}.ibo-datatable .attribute-set .attribute-set-item{display:inline;margin:0;padding:4px 6px;box-shadow:0 1px 2px rgba(0, 0, 0, 0.25), 0 1px 3px rgba(0, 0, 0, 0.12)}.ibo-datatable .attribute-set .attribute-set-item+.attribute-set-item{margin-left:0.5rem}.ibo-panel+.ibo-panel{margin-top:24px}.ibo-panel+.ibo-block:not(.ibo-panel){margin-top:16px}#ibo-main-content{}#ibo-main-content .ibo-panel.ibo-has-sticky-header{margin-bottom:200px}#ibo-main-content .ibo-panel.ibo-has-sticky-header>.ibo-sticky-sentinel-top{top:-16px;height:16px}#ibo-main-content .ibo-panel.ibo-has-sticky-header>.ibo-panel--header.ibo-is-sticking{top:-16px}.ui-dialog-content{}.ui-dialog-content .ibo-panel.ibo-has-sticky-header{}.ui-dialog-content .ibo-panel.ibo-has-sticky-header>.ibo-sticky-sentinel-top{top:-16px;height:16px}.ui-dialog-content .ibo-panel.ibo-has-sticky-header>.ibo-panel--header.ibo-is-sticking{top:-16px}.ibo-pill:not(:last-child){margin-right:16px}.ibo-dashboard--grid-row .ibo-dashlet-header-static{margin-top:12px}.ibo-dashboard--grid-row:first-child .ibo-dashlet:first-child .ibo-dashlet-header-static{margin-top:0}.ibo-details .ibo-prop--apply>span,.ibo-details .ibo-prop--cancel>span{display:unset}.ibo-details .ibo-prop--apply{display:table-column}.ibo-details{margin-top:5px}.ibo-activity-panel--tab-entry-form .ibo-caselog-entry-form{padding-bottom:14px;border-bottom:1px solid #4C566A}.ibo-panel>.ibo-panel--body>.ibo-tab-container{margin-top:-24px;margin-left:-16px;margin-right:-16px;margin-bottom:-24px}.ibo-panel>.ibo-panel--body>.ibo-tab-container>.ibo-tab-container--tab-container-list{height:100%;overflow-y:auto;flex-grow:1}.ibo-panel>.ibo-panel--body>.ibo-tab-container.ibo-is-vertical{display:flex;flex-direction:row}.ibo-panel>.ibo-panel--body>.ibo-tab-container.ibo-is-vertical>.ibo-tab-container--tabs-list{padding-top:50px;flex-direction:column;height:auto;padding-left:unset;margin-right:unset;min-width:calc(32px + 90px + 32px)}.ibo-panel>.ibo-panel--body>.ibo-tab-container.ibo-is-vertical>.ibo-tab-container--tabs-list>.ibo-tab-container--tab-header,.ibo-panel>.ibo-panel--body>.ibo-tab-container.ibo-is-vertical>.ibo-tab-container--tabs-list>.ibo-tab-container--extra-tabs-container{height:50px;width:100%;justify-content:left}.ibo-panel>.ibo-panel--body>.ibo-tab-container.ibo-is-vertical>.ibo-tab-container--tabs-list>.ibo-tab-container--tab-header>.ibo-tab-container--tab-toggler,.ibo-panel>.ibo-panel--body>.ibo-tab-container.ibo-is-vertical>.ibo-tab-container--tabs-list>.ibo-tab-container--extra-tabs-container>.ibo-tab-container--tab-toggler,.ibo-panel>.ibo-panel--body>.ibo-tab-container.ibo-is-vertical>.ibo-tab-container--tabs-list>.ibo-tab-container--tab-header>.ibo-tab-container--extra-tabs-list-toggler,.ibo-panel>.ibo-panel--body>.ibo-tab-container.ibo-is-vertical>.ibo-tab-container--tabs-list>.ibo-tab-container--extra-tabs-container>.ibo-tab-container--extra-tabs-list-toggler{width:100%;justify-content:left}.ibo-panel>.ibo-panel--body>.ibo-tab-container.ibo-is-vertical>.ibo-tab-container--tab-container{flex-grow:1;margin-left:unset}.ibo-panel.ibo-has-sticky-header>.ibo-panel--body>.ibo-tab-container>.ibo-tab-container--tabs-list.ibo-is-sticking{position:fixed;z-index:10}.ibo-panel.ibo-has-sticky-header>.ibo-panel--body>.ibo-tab-container:not(.ibo-is-vertical)>.ibo-tab-container--tabs-list.ibo-is-sticking{padding-left:0}.ibo-panel.ibo-has-sticky-header>.ibo-panel--body>.ibo-tab-container:not(.ibo-is-vertical)>.ibo-tab-container--tabs-list.ibo-is-sticking .ibo-tab-container--tab-toggler,.ibo-panel.ibo-has-sticky-header>.ibo-panel--body>.ibo-tab-container:not(.ibo-is-vertical)>.ibo-tab-container--tabs-list.ibo-is-sticking .ibo-tab-container--extra-tabs-list-toggler,.ibo-panel.ibo-has-sticky-header>.ibo-panel--body>.ibo-tab-container:not(.ibo-is-vertical)>.ibo-tab-container--tabs-list.ibo-is-sticking .ibo-tab-container--extra-tabs-list-toggler{font-size:1rem}.ibo-object-details.ibo-has-medallion-icon>.ibo-panel--body>.ibo-tab-container:not(.ibo-is-vertical)>.ibo-tab-container--tabs-list{padding-left:calc(32px + 96px + 32px - 24px)}.ibo-block-list--medallion{flex-direction:column;align-items:center}.ibo-block-list--medallion>.ibo-medallion-icon--image{margin:0 auto}.ibo-block-list--medallion>.ibo-medallion-icon--image~.ibo-medallion-icon--description{margin-top:12px}.ibo-block-list--medallion>.ibo-medallion-icon--description{flex-grow:1;text-align:center}.ibo-datatable .ibo-field-badge{margin:0;padding:0;color:unset;background-color:unset}.ibo-datatable .ibo-field-badge::before{content:"";display:inline-flex;margin-right:0.5rem;width:10px;height:10px;min-width:10px;min-height:10px;background-color:var(--ibo-main-color)}.ibo-datatable .ibo-field-badge .ibo-field-badge--decoration{display:none}.ibo-datatable .ibo-field-badge .ibo-field-badge--decoration+.ibo-field-badge--label{margin-left:unset}.ui-dialog .blockUI.blockOverlay{background-color:#2E3440}.ibo-datatable .blockUI.blockOverlay{background-color:#2E3440}.ibo-datatable .blockUI.blockMsg{font-size:2em}.ibo-svg-illustration--container>svg *[fill="#6c63ff"]{fill:#81A1C1}.ibo-is-html-content table:not(:last-child){margin-bottom:0}.ibo-is-html-content table tbody tr:last-child td,.ibo-is-html-content table tbody tr:last-child th{border-bottom-width:1px}.cke_reset_all,.cke_reset_all *,.cke_reset_all a,.cke_reset_all textarea{color:#0e1013 !important}.cke_reset_all fieldset{border:2px groove #e0dfe3 !important}.cke_chrome{border:1px solid #7b88a1 !important}.cke_editable{background:#E5E9F0}.cke_inner{background:#7b88a1 !important}.cke_top{border-bottom:1px solid #4C566A !important;background:#D8DEE9 !important;white-space:normal !important}.cke_float .cke_top{border:1px solid #4C566A !important}.cke_bottom{border-top:1px solid #4C566A !important;background:#D8DEE9 !important}.cke_browser_ios .cke_contents{overflow-y:auto;-webkit-overflow-scrolling:touch}.cke_resizer{border-color:transparent #bcbcbc transparent transparent}.cke_resizer_rtl{border-color:transparent transparent transparent #bcbcbc}.cke_panel{background-color:#D8DEE9;border:1px solid #d1d1d1}.cke_panel_listItem.cke_selected a,.cke_panel_listItem a:hover,.cke_panel_listItem .ibo-quick-create--compartment-results--element>.option:hover,.cke_panel_listItem a:focus,.cke_panel_listItem a:active{background-color:#e9e9e9}.cke_panel_listItem a:focus{outline:1px dotted #000}.cke_panel_grouptitle{color:#484848;border-bottom:1px solid #d1d1d1;background:#f8f8f8}.cke_colorblock,.cke_colorblock a{text-decoration:none;color:#000}a:hover.cke_colorbox,.ibo-quick-create--compartment-results--element>.cke_colorbox.option:hover,a:focus.cke_colorbox,a:active.cke_colorbox{outline:0;padding:0;border:2px solid #139ff7}a:hover.cke_colorbox,.ibo-quick-create--compartment-results--element>.cke_colorbox.option:hover{border-color:#bcbcbc}a.cke_colorauto,a.cke_colormore{border:#fff 1px solid;padding:3px;display:block;cursor:pointer}a:hover.cke_colorauto,.ibo-quick-create--compartment-results--element>.cke_colorauto.option:hover,a:hover.cke_colormore,.ibo-quick-create--compartment-results--element>.cke_colormore.option:hover,a:focus.cke_colorauto,a:focus.cke_colormore,a:active.cke_colorauto,a:active.cke_colormore{outline:0;border:#139ff7 1px solid;background-color:#f8f8f8}a:hover.cke_colorauto,.ibo-quick-create--compartment-results--element>.cke_colorauto.option:hover,a:hover.cke_colormore,.ibo-quick-create--compartment-results--element>.cke_colormore.option:hover{border-color:#bcbcbc}.cke_colorauto span.cke_colorbox{width:18px;height:18px;border:1px solid #808080;margin-left:1px;margin-top:3px}.cke_rtl .cke_colorauto span.cke_colorbox{margin-left:0;margin-right:1px}span.cke_colorbox[style*="#ffffff"],span.cke_colorbox[style*="#FFFFFF"],span.cke_colorbox[style="background-color:#fff"],span.cke_colorbox[style="background-color:#FFF"],span.cke_colorbox[style*="rgb(255,255,255)"],span.cke_colorbox[style*="rgb(255, 255, 255)"]{border:1px solid #808080;width:18px;height:18px}.cke_toolbar{float:left}.cke_rtl .cke_toolbar{float:right}.cke_toolgroup{border:0;float:left;margin:1px 2px 6px 0;padding-right:3px}.cke_rtl .cke_toolgroup{float:right;margin:1px 0 6px 2px;padding-left:3px;padding-right:0}.cke_hc .cke_toolgroup{margin-right:5px;margin-bottom:5px}.cke_hc.cke_rtl .cke_toolgroup{margin-right:0;margin-left:5px}a.cke_button{display:inline-block;height:18px;padding:4px 6px;outline:0;cursor:default;float:left;border:0;position:relative}a.cke_button_expandable{padding:4px 5px}.cke_rtl a.cke_button{float:right}.cke_hc a.cke_button{border:1px solid black;padding:3px 5px;margin:0 3px 5px 0}.cke_hc.cke_rtl a.cke_button{margin:0 0 5px 3px}a.cke_button_on{background:#fff;border:1px #bcbcbc solid;padding:3px 5px}a.cke_button_expandable.cke_button_on{padding:3px 4px}a.cke_button_off:hover,.ibo-quick-create--compartment-results--element>.cke_button_off.option:hover,a.cke_button_off:focus,a.cke_button_off:active{background:#e5e5e5;border:1px #bcbcbc solid;padding:3px 5px}a.cke_button_expandable.cke_button_off:hover,.ibo-quick-create--compartment-results--element>.cke_button_expandable.cke_button_off.option:hover,a.cke_button_expandable.cke_button_off:focus,a.cke_button_expandable.cke_button_off:active{padding:3px 4px}.cke_hc a.cke_button_on,.cke_hc a.cke_button_off:hover,.cke_hc .ibo-quick-create--compartment-results--element>.cke_button_off.option:hover,.cke_hc a.cke_button_off:focus,.cke_hc a.cke_button_off:active{background:#e5e5e5;border:3px solid #000;padding:1px 3px}a.cke_button_disabled:hover,.ibo-quick-create--compartment-results--element>.cke_button_disabled.option:hover,a.cke_button_disabled:focus,a.cke_button_disabled:active{border:0;padding:4px 6px;background-color:transparent}a.cke_button_expandable.cke_button_disabled:hover,.ibo-quick-create--compartment-results--element>.cke_button_expandable.cke_button_disabled.option:hover,a.cke_button_expandable.cke_button_disabled:active{padding:4px 5px}a.cke_button_disabled:focus{border:1px #bcbcbc solid;padding:3px 5px}a.cke_button_expandable.cke_button_disabled:focus{padding:3px 4px}.cke_hc a.cke_button_disabled:hover,.cke_hc .ibo-quick-create--compartment-results--element>.cke_button_disabled.option:hover,.cke_hc a.cke_button_disabled:focus,.cke_hc a.cke_button_disabled:active{border:1px solid #acacac;padding:3px 5px;margin:0 3px 5px 0}.cke_hc a.cke_button_disabled:focus{border:3px solid #000;padding:1px 3px}.cke_hc.cke_rtl a.cke_button_disabled:hover,.cke_hc.cke_rtl .ibo-quick-create--compartment-results--element>.cke_button_disabled.option:hover,.cke_hc.cke_rtl a.cke_button_disabled:focus,.cke_hc.cke_rtl a.cke_button_disabled:active{margin:0 0 5px 3px}a.cke_button_disabled .cke_button_icon,a.cke_button_disabled .cke_button_arrow{opacity:0.3}.cke_hc a.cke_button_disabled{border-color:#acacac}.cke_hc a.cke_button_disabled .cke_button_icon,.cke_hc a.cke_button_disabled .cke_button_label{opacity:0.5}.cke_toolgroup a.cke_button:last-child:after,.cke_toolgroup a.cke_button.cke_button_disabled:hover:last-child:after,.cke_toolgroup .ibo-quick-create--compartment-results--element>.cke_button.cke_button_disabled.option:hover:after:last-child{content:"";position:absolute;height:18px;width:0;border-right:1px solid #bcbcbc;margin-top:4px;top:0;right:-3px}.cke_rtl .cke_toolgroup a.cke_button:last-child:after,.cke_rtl .cke_toolgroup a.cke_button.cke_button_disabled:hover:last-child:after,.cke_rtl .cke_toolgroup .ibo-quick-create--compartment-results--element>.cke_button.cke_button_disabled.option:hover:after:last-child{border-right:0;right:auto;border-left:1px solid #bcbcbc;top:0;left:-3px}.cke_hc .cke_toolgroup a.cke_button:last-child:after,.cke_hc .cke_toolgroup a.cke_button.cke_button_disabled:last-child:after,.cke_hc .cke_toolgroup a.cke_button.cke_button_disabled:hover:last-child:after,.cke_hc .cke_toolgroup .ibo-quick-create--compartment-results--element>.cke_button.cke_button_disabled.option:hover:after:last-child{border-color:#000;top:0;right:-7px}.cke_hc.cke_rtl .cke_toolgroup a.cke_button:last-child:after,.cke_hc.cke_rtl .cke_toolgroup a.cke_button.cke_button_disabled:last-child:after,.cke_hc.cke_rtl .cke_toolgroup a.cke_button.cke_button_disabled:hover:last-child:after,.cke_hc.cke_rtl .cke_toolgroup .ibo-quick-create--compartment-results--element>.cke_button.cke_button_disabled.option:hover:after:last-child{top:0;right:auto;left:-7px}.cke_toolgroup a.cke_button:hover:last-child:after,.cke_toolgroup .ibo-quick-create--compartment-results--element>.cke_button.option:hover:after:last-child,.cke_toolgroup a.cke_button:focus:last-child:after,.cke_toolgroup a.cke_button.cke_button_on:last-child:after{top:-1px;right:-4px}.cke_rtl .cke_toolgroup a.cke_button:hover:last-child:after,.cke_rtl .cke_toolgroup .ibo-quick-create--compartment-results--element>.cke_button.option:hover:after:last-child,.cke_rtl .cke_toolgroup a.cke_button:focus:last-child:after,.cke_rtl .cke_toolgroup a.cke_button.cke_button_on:last-child:after{top:-1px;right:auto;left:-4px}.cke_hc .cke_toolgroup a.cke_button:hover:last-child:after,.cke_hc .cke_toolgroup .ibo-quick-create--compartment-results--element>.cke_button.option:hover:after:last-child,.cke_hc .cke_toolgroup a.cke_button.cke_button_on:last-child:after{top:-2px;right:-9px}.cke_hc.cke_rtl .cke_toolgroup a.cke_button:hover:last-child:after,.cke_hc.cke_rtl .cke_toolgroup .ibo-quick-create--compartment-results--element>.cke_button.option:hover:after:last-child,.cke_hc.cke_rtl .cke_toolgroup a.cke_button.cke_button_on:last-child:after{top:-2px;right:auto;left:-9px}.cke_toolbar.cke_toolbar_last .cke_toolgroup a.cke_button:last-child:after{content:none;border:0;width:0;height:0}.cke_button_icon{cursor:inherit;background-repeat:no-repeat;margin-top:1px;width:16px;height:16px;float:left;display:inline-block}.cke_rtl .cke_button_icon{float:right}.cke_hc .cke_button_icon{display:none}.cke_button_label{display:none;padding-left:3px;margin-top:1px;line-height:17px;vertical-align:middle;float:left;cursor:default;color:#484848}.cke_rtl .cke_button_label{padding-right:3px;padding-left:0;float:right}.cke_hc .cke_button_label{padding:0;display:inline-block;font-size:12px}.cke_button_arrow{display:inline-block;margin:8px 0 0 3px;width:0;height:0;cursor:default;vertical-align:top;border-left:3px solid transparent;border-right:3px solid transparent;border-top:3px solid #484848}.cke_rtl .cke_button_arrow{margin-right:5px;margin-left:0}.cke_hc .cke_button_arrow{font-size:10px;margin:3px 0 0 3px;width:auto;border:0}.cke_toolbar_separator{float:left;background-color:#bcbcbc;margin:4px 2px 0 2px;height:18px;width:1px}.cke_rtl .cke_toolbar_separator{float:right}.cke_hc .cke_toolbar_separator{background-color:#000;margin-left:2px;margin-right:5px;margin-bottom:9px}.cke_hc.cke_rtl .cke_toolbar_separator{margin-left:5px;margin-right:2px}.cke_toolbar_break{display:block;clear:left}.cke_rtl .cke_toolbar_break{clear:right}a.cke_toolbox_collapser{width:12px;height:11px;float:right;margin:11px 0 0;font-size:0;cursor:default;text-align:center;border:1px solid #bcbcbc}.cke_rtl .cke_toolbox_collapser{float:left}.cke_toolbox_collapser:hover{background:#e5e5e5}.cke_toolbox_collapser.cke_toolbox_collapser_min{margin:0 2px 4px}.cke_toolbox_collapser .cke_arrow{display:inline-block;height:0;width:0;font-size:0;margin-top:1px;border:3px solid transparent;border-bottom-color:#484848}.cke_toolbox_collapser.cke_toolbox_collapser_min .cke_arrow{margin-top:4px;border-bottom-color:transparent;border-top-color:#484848}.cke_hc .cke_toolbox_collapser .cke_arrow{font-size:8px;width:auto;border:0;margin-top:0}.cke_menuitem span{cursor:default}.cke_menubutton{display:block}.cke_hc .cke_menubutton{padding:2px}.cke_menubutton:hover,.cke_menubutton:focus,.cke_menubutton:active{background-color:#e9e9e9;display:block;outline:1px dotted}.cke_menubutton:hover{outline:0}.cke_hc .cke_menubutton:hover,.cke_hc .cke_menubutton:focus,.cke_hc .cke_menubutton:active{border:2px solid;padding:0}.cke_menubutton_disabled:hover,.cke_menubutton_disabled:focus,.cke_menubutton_disabled:active{background-color:transparent;outline:0}.cke_menubutton_inner{display:table-row}.cke_menubutton_icon,.cke_menubutton_label,.cke_menuarrow{display:table-cell}.cke_menubutton_icon{background-color:#f8f8f8;padding:6px 4px}.cke_hc .cke_menubutton_icon{height:16px;width:0;padding:4px 0}.cke_menubutton:hover .cke_menubutton_icon,.cke_menubutton:focus .cke_menubutton_icon,.cke_menubutton:active .cke_menubutton_icon{background-color:#e9e9e9}.cke_menubutton_disabled:hover .cke_menubutton_icon,.cke_menubutton_disabled:focus .cke_menubutton_icon,.cke_menubutton_disabled:active .cke_menubutton_icon{background-color:#f8f8f8;outline:0}.cke_menuitem .cke_menubutton_on{background-color:#e9e9e9;border:1px solid #dedede;outline:0}.cke_menubutton_on .cke_menubutton_icon{padding-right:3px;background-color:#e9e9e9}.cke_menubutton_label{padding:0 5px;background-color:transparent;width:100%;vertical-align:middle}.cke_menubutton_shortcut{color:#979797}.cke_menubutton_disabled .cke_menubutton_label{opacity:0.3;filter:alpha(opacity=30)}.cke_panel_frame .cke_menubutton_label{display:none}.cke_menuseparator{background-color:#d1d1d1;height:1px}.cke_menuarrow{background:transparent url(images/arrow.png) no-repeat 0 10px;padding:0 5px}.cke_rtl .cke_menuarrow{background-position:5px -13px;background-repeat:no-repeat}.cke_hc .cke_menuarrow{background-image:none}.cke_menuarrow span{display:none}.cke_hc .cke_menuarrow span{vertical-align:middle;display:inline}.cke_combo{display:inline-block;float:left;position:relative;margin-bottom:5px}.cke_rtl .cke_combo{float:right}.cke_hc .cke_combo{margin-top:1px;margin-bottom:10px}.cke_combo:after{content:"";position:absolute;height:18px;width:0;border-right:1px solid #bcbcbc;margin-top:5px;top:0;right:0}.cke_rtl .cke_combo:after{border-right:0;border-left:1px solid #bcbcbc;right:auto;left:0}.cke_hc .cke_combo:after{border-color:#000}a.cke_combo_button{cursor:default;display:inline-block;float:left;margin:0;padding:1px}.cke_rtl a.cke_combo_button{float:right}.cke_hc a.cke_combo_button{padding:4px}.cke_combo_on a.cke_combo_button,.cke_combo_off a.cke_combo_button:hover,.cke_combo_off .ibo-quick-create--compartment-results--element>.cke_combo_button.option:hover,.cke_combo_off a.cke_combo_button:focus,.cke_combo_off a.cke_combo_button:active{background:#e5e5e5;border:1px solid #bcbcbc;padding:0 0 0 1px;margin-left:-1px}.cke_combo_off a.cke_combo_button:focus{outline:0}.cke_combo_on a.cke_combo_button,.cke_combo_off a.cke_combo_button:active{background:#fff}.cke_rtl .cke_combo_on a.cke_combo_button,.cke_rtl .cke_combo_off a.cke_combo_button:hover,.cke_rtl .cke_combo_off .ibo-quick-create--compartment-results--element>.cke_combo_button.option:hover,.cke_rtl .cke_combo_off a.cke_combo_button:focus,.cke_rtl .cke_combo_off a.cke_combo_button:active{padding:0 1px 0 0;margin-left:0;margin-right:-1px}.cke_hc .cke_combo_on a.cke_combo_button,.cke_hc .cke_combo_off a.cke_combo_button:hover,.cke_hc .cke_combo_off .ibo-quick-create--compartment-results--element>.cke_combo_button.option:hover,.cke_hc .cke_combo_off a.cke_combo_button:focus,.cke_hc .cke_combo_off a.cke_combo_button:active{border:3px solid #000;padding:1px 1px 1px 2px}.cke_hc.cke_rtl .cke_combo_on a.cke_combo_button,.cke_hc.cke_rtl .cke_combo_off a.cke_combo_button:hover,.cke_hc.cke_rtl .cke_combo_off .ibo-quick-create--compartment-results--element>.cke_combo_button.option:hover,.cke_hc.cke_rtl .cke_combo_off a.cke_combo_button:focus,.cke_hc.cke_rtl .cke_combo_off a.cke_combo_button:active{padding:1px 2px 1px 1px}.cke_toolbar_start+.cke_combo_on a.cke_combo_button,.cke_toolbar_start+.cke_combo_off a.cke_combo_button:hover,.cke_toolbar_start+.cke_combo_off .ibo-quick-create--compartment-results--element>.cke_combo_button.option:hover,.cke_toolbar_start+.cke_combo_off a.cke_combo_button:focus,.cke_toolbar_start+.cke_combo_off a.cke_combo_button:active{padding:0 0 0 3px;margin-left:-3px}.cke_rtl .cke_toolbar_start+.cke_combo_on a.cke_combo_button,.cke_rtl .cke_toolbar_start+.cke_combo_off a.cke_combo_button:hover,.cke_rtl .cke_toolbar_start+.cke_combo_off .ibo-quick-create--compartment-results--element>.cke_combo_button.option:hover,.cke_rtl .cke_toolbar_start+.cke_combo_off a.cke_combo_button:focus,.cke_rtl .cke_toolbar_start+.cke_combo_off a.cke_combo_button:active{padding:0 3px 0 0;margin-left:0;margin-right:-3px}.cke_hc .cke_toolbar>.cke_toolbar_start+.cke_combo_on a.cke_combo_button,.cke_hc .cke_toolbar>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:hover,.cke_hc .cke_toolbar>.cke_toolbar_start+.cke_combo_off .ibo-quick-create--compartment-results--element>.cke_combo_button.option:hover,.cke_hc .cke_toolbar>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:focus,.cke_hc .cke_toolbar>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:active{padding:1px 1px 1px 7px;margin-left:-6px}.cke_hc.cke_rtl .cke_toolbar>.cke_toolbar_start+.cke_combo_on a.cke_combo_button,.cke_hc.cke_rtl .cke_toolbar>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:hover,.cke_hc.cke_rtl .cke_toolbar>.cke_toolbar_start+.cke_combo_off .ibo-quick-create--compartment-results--element>.cke_combo_button.option:hover,.cke_hc.cke_rtl .cke_toolbar>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:focus,.cke_hc.cke_rtl .cke_toolbar>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:active{padding:1px 7px 1px 1px;margin-left:0;margin-right:-6px}.cke_toolbox .cke_toolbar:first-child>.cke_toolbar_start+.cke_combo_on a.cke_combo_button,.cke_toolbox .cke_toolbar:first-child>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:hover,.cke_toolbox .cke_toolbar:first-child>.cke_toolbar_start+.cke_combo_off .ibo-quick-create--compartment-results--element>.cke_combo_button.option:hover,.cke_toolbox .cke_toolbar:first-child>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:focus,.cke_toolbox .cke_toolbar:first-child>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:active,.cke_toolbar_break+.cke_toolbar>.cke_toolbar_start+.cke_combo_on a.cke_combo_button,.cke_toolbar_break+.cke_toolbar>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:hover,.cke_toolbar_break+.cke_toolbar>.cke_toolbar_start+.cke_combo_off .ibo-quick-create--compartment-results--element>.cke_combo_button.option:hover,.cke_toolbar_break+.cke_toolbar>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:focus,.cke_toolbar_break+.cke_toolbar>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:active{padding:0;margin:0}.cke_hc .cke_toolbox .cke_toolbar:first-child>.cke_toolbar_start+.cke_combo_on a.cke_combo_button,.cke_hc .cke_toolbox .cke_toolbar:first-child>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:hover,.cke_hc .cke_toolbox .cke_toolbar:first-child>.cke_toolbar_start+.cke_combo_off .ibo-quick-create--compartment-results--element>.cke_combo_button.option:hover,.cke_hc .cke_toolbox .cke_toolbar:first-child>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:focus,.cke_hc .cke_toolbox .cke_toolbar:first-child>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:active,.cke_hc .cke_toolbar_break+.cke_toolbar>.cke_toolbar_start+.cke_combo_on a.cke_combo_button,.cke_hc .cke_toolbar_break+.cke_toolbar>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:hover,.cke_hc .cke_toolbar_break+.cke_toolbar>.cke_toolbar_start+.cke_combo_off .ibo-quick-create--compartment-results--element>.cke_combo_button.option:hover,.cke_hc .cke_toolbar_break+.cke_toolbar>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:focus,.cke_hc .cke_toolbar_break+.cke_toolbar>.cke_toolbar_start+.cke_combo_off a.cke_combo_button:active{padding:1px;margin:0}.cke_toolbar .cke_combo+.cke_toolbar_end,.cke_toolbar .cke_combo+.cke_toolgroup{margin-right:0;margin-left:2px}.cke_rtl .cke_toolbar .cke_combo+.cke_toolbar_end,.cke_rtl .cke_toolbar .cke_combo+.cke_toolgroup{margin-left:0;margin-right:2px}.cke_hc .cke_toolbar .cke_combo+.cke_toolbar_end,.cke_hc .cke_toolbar .cke_combo+.cke_toolgroup{margin-left:5px}.cke_hc.cke_rtl .cke_toolbar .cke_combo+.cke_toolbar_end,.cke_hc.cke_rtl .cke_toolbar .cke_combo+.cke_toolgroup{margin-left:0;margin-right:5px}.cke_toolbar.cke_toolbar_last .cke_combo:nth-last-child(-n+2):after{content:none;border:0;width:0;height:0}.cke_combo_text{line-height:26px;padding-left:10px;text-overflow:ellipsis;overflow:hidden;float:left;cursor:default;color:#484848;width:60px}.cke_rtl .cke_combo_text{float:right;text-align:right;padding-left:0;padding-right:10px}.cke_hc .cke_combo_text{line-height:18px;font-size:12px}.cke_combo_open{cursor:default;display:inline-block;font-size:0;height:19px;line-height:17px;margin:1px 10px 1px;width:5px}.cke_hc .cke_combo_open{height:12px}.cke_combo_arrow{cursor:default;margin:11px 0 0;float:left;height:0;width:0;font-size:0;border-left:3px solid transparent;border-right:3px solid transparent;border-top:3px solid #484848}.cke_hc .cke_combo_arrow{font-size:10px;width:auto;border:0;margin-top:3px}.cke_combo_label{display:none;float:left;line-height:26px;vertical-align:top;margin-right:5px}.cke_rtl .cke_combo_label{float:right;margin-left:5px;margin-right:0}.cke_combo_disabled .cke_combo_inlinelabel,.cke_combo_disabled .cke_combo_open{opacity:0.3}.cke_path{float:left;margin:-2px 0 2px}a.cke_path_item,span.cke_path_empty{display:inline-block;float:left;padding:3px 4px;margin-right:2px;cursor:default;text-decoration:none;outline:0;border:0;color:#484848;font-weight:bold;font-size:11px}.cke_rtl .cke_path,.cke_rtl .cke_path_item,.cke_rtl .cke_path_empty{float:right}a.cke_path_item:hover,.ibo-quick-create--compartment-results--element>.cke_path_item.option:hover,a.cke_path_item:focus,a.cke_path_item:active{background-color:#e5e5e5}.cke_hc a.cke_path_item:hover,.cke_hc .ibo-quick-create--compartment-results--element>.cke_path_item.option:hover,.cke_hc a.cke_path_item:focus,.cke_hc a.cke_path_item:active{border:2px solid;padding:1px 2px}.cke_button__source_label,.cke_button__sourcedialog_label{display:inline}.cke_combopanel__fontsize{width:135px}textarea.cke_source{font-family:"Courier New", Monospace;font-size:small;background-color:#fff;white-space:pre-wrap;border:0;padding:0;margin:0;display:block}.cke_wysiwyg_frame,.cke_wysiwyg_div{background-color:#fff}.cke_notifications_area{pointer-events:none}.cke_notification{pointer-events:auto;position:relative;margin:10px;width:300px;color:white;text-align:center;opacity:0.95;filter:alpha(opacity=95);-webkit-animation:fadeIn 0.7s;animation:fadeIn 0.7s}.cke_notification_message a{color:#12306f}:root{--ibo-dm-enum--Organization-status-active--main-color:#689f38;--ibo-dm-enum--Organization-status-active--complementary-color:white}.ibo-dm-enum--Organization-status-active{--ibo-main-color:#689f38;--ibo-main-color--100:#3b571f;--ibo-main-color--900:#edf6e5;--ibo-complementary-color:white}.ibo-dm-enum-alt--Organization-status-active{--ibo-main-color:white;--ibo-complementary-color:#689f38}:root{--ibo-dm-enum--Organization-status-inactive--main-color:#f6ae55;--ibo-dm-enum--Organization-status-inactive--complementary-color:white}.ibo-dm-enum--Organization-status-inactive{--ibo-main-color:#f6ae55;--ibo-main-color--100:#6f3c06;--ibo-main-color--900:#fdeedd;--ibo-complementary-color:white}.ibo-dm-enum-alt--Organization-status-inactive{--ibo-main-color:white;--ibo-complementary-color:#f6ae55}:root{--ibo-dm-enum--Location-status-active--main-color:#689f38;--ibo-dm-enum--Location-status-active--complementary-color:white}.ibo-dm-enum--Location-status-active{--ibo-main-color:#689f38;--ibo-main-color--100:#3b571f;--ibo-main-color--900:#edf6e5;--ibo-complementary-color:white}.ibo-dm-enum-alt--Location-status-active{--ibo-main-color:white;--ibo-complementary-color:#689f38}:root{--ibo-dm-enum--Location-status-inactive--main-color:#f6ae55;--ibo-dm-enum--Location-status-inactive--complementary-color:white}.ibo-dm-enum--Location-status-inactive{--ibo-main-color:#f6ae55;--ibo-main-color--100:#6f3c06;--ibo-main-color--900:#fdeedd;--ibo-complementary-color:white}.ibo-dm-enum-alt--Location-status-inactive{--ibo-main-color:white;--ibo-complementary-color:#f6ae55}:root{--ibo-dm-class--Contact--main-color:#546e7a;--ibo-dm-class--Contact--complementary-color:white}.ibo-dm-class--Contact{--ibo-main-color:#546e7a;--ibo-main-color--100:#303f45;--ibo-main-color--900:#eaeef0;--ibo-complementary-color:white}.ibo-dm-class-alt--Contact{--ibo-main-color:white;--ibo-complementary-color:#546e7a}:root{--ibo-dm-enum--Contact-status-active--main-color:#689f38;--ibo-dm-enum--Contact-status-active--complementary-color:white}.ibo-dm-enum--Contact-status-active{--ibo-main-color:#689f38;--ibo-main-color--100:#3b571f;--ibo-main-color--900:#edf6e5;--ibo-complementary-color:white}.ibo-dm-enum-alt--Contact-status-active{--ibo-main-color:white;--ibo-complementary-color:#689f38}:root{--ibo-dm-enum--Contact-status-inactive--main-color:#f6ae55;--ibo-dm-enum--Contact-status-inactive--complementary-color:white}.ibo-dm-enum--Contact-status-inactive{--ibo-main-color:#f6ae55;--ibo-main-color--100:#6f3c06;--ibo-main-color--900:#fdeedd;--ibo-complementary-color:white}.ibo-dm-enum-alt--Contact-status-inactive{--ibo-main-color:white;--ibo-complementary-color:#f6ae55}:root{--ibo-dm-enum--Ticket-operational_status-resolved--main-color:#689f38;--ibo-dm-enum--Ticket-operational_status-resolved--complementary-color:white}.ibo-dm-enum--Ticket-operational_status-resolved{--ibo-main-color:#689f38;--ibo-main-color--100:#3b571f;--ibo-main-color--900:#edf6e5;--ibo-complementary-color:white}.ibo-dm-enum-alt--Ticket-operational_status-resolved{--ibo-main-color:white;--ibo-complementary-color:#689f38}:root{--ibo-dm-enum--Ticket-operational_status-closed--main-color:#D8DEE9;--ibo-dm-enum--Ticket-operational_status-closed--complementary-color:#3B4252}.ibo-dm-enum--Ticket-operational_status-closed{--ibo-main-color:#D8DEE9;--ibo-main-color--100:#2a364b;--ibo-main-color--900:#e8ecf2;--ibo-complementary-color:#3B4252}.ibo-dm-enum-alt--Ticket-operational_status-closed{--ibo-main-color:#3B4252;--ibo-complementary-color:#D8DEE9}:root{--ibo-dm-enum--Ticket-operational_status--main-color:#2c5382;--ibo-dm-enum--Ticket-operational_status--complementary-color:white}.ibo-dm-enum--Ticket-operational_status{--ibo-main-color:#2c5382;--ibo-main-color--100:#1e3858;--ibo-main-color--900:#e4ecf6;--ibo-complementary-color:white}.ibo-dm-enum-alt--Ticket-operational_status{--ibo-main-color:white;--ibo-complementary-color:#2c5382}:root{--ibo-dm-enum--ApplicationSolution-status-active--main-color:#689f38;--ibo-dm-enum--ApplicationSolution-status-active--complementary-color:white}.ibo-dm-enum--ApplicationSolution-status-active{--ibo-main-color:#689f38;--ibo-main-color--100:#3b571f;--ibo-main-color--900:#edf6e5;--ibo-complementary-color:white}.ibo-dm-enum-alt--ApplicationSolution-status-active{--ibo-main-color:white;--ibo-complementary-color:#689f38}:root{--ibo-dm-enum--ApplicationSolution-status-inactive--main-color:#D8DEE9;--ibo-dm-enum--ApplicationSolution-status-inactive--complementary-color:#3B4252}.ibo-dm-enum--ApplicationSolution-status-inactive{--ibo-main-color:#D8DEE9;--ibo-main-color--100:#2a364b;--ibo-main-color--900:#e8ecf2;--ibo-complementary-color:#3B4252}.ibo-dm-enum-alt--ApplicationSolution-status-inactive{--ibo-main-color:#3B4252;--ibo-complementary-color:#D8DEE9}:root{--ibo-dm-enum--BusinessProcess-status-active--main-color:#689f38;--ibo-dm-enum--BusinessProcess-status-active--complementary-color:white}.ibo-dm-enum--BusinessProcess-status-active{--ibo-main-color:#689f38;--ibo-main-color--100:#3b571f;--ibo-main-color--900:#edf6e5;--ibo-complementary-color:white}.ibo-dm-enum-alt--BusinessProcess-status-active{--ibo-main-color:white;--ibo-complementary-color:#689f38}:root{--ibo-dm-enum--BusinessProcess-status-inactive--main-color:#D8DEE9;--ibo-dm-enum--BusinessProcess-status-inactive--complementary-color:#3B4252}.ibo-dm-enum--BusinessProcess-status-inactive{--ibo-main-color:#D8DEE9;--ibo-main-color--100:#2a364b;--ibo-main-color--900:#e8ecf2;--ibo-complementary-color:#3B4252}.ibo-dm-enum-alt--BusinessProcess-status-inactive{--ibo-main-color:#3B4252;--ibo-complementary-color:#D8DEE9}:root{--ibo-dm-enum--SoftwareInstance-status-active--main-color:#689f38;--ibo-dm-enum--SoftwareInstance-status-active--complementary-color:white}.ibo-dm-enum--SoftwareInstance-status-active{--ibo-main-color:#689f38;--ibo-main-color--100:#3b571f;--ibo-main-color--900:#edf6e5;--ibo-complementary-color:white}.ibo-dm-enum-alt--SoftwareInstance-status-active{--ibo-main-color:white;--ibo-complementary-color:#689f38}:root{--ibo-dm-enum--SoftwareInstance-status-inactive--main-color:#D8DEE9;--ibo-dm-enum--SoftwareInstance-status-inactive--complementary-color:#3B4252}.ibo-dm-enum--SoftwareInstance-status-inactive{--ibo-main-color:#D8DEE9;--ibo-main-color--100:#2a364b;--ibo-main-color--900:#e8ecf2;--ibo-complementary-color:#3B4252}.ibo-dm-enum-alt--SoftwareInstance-status-inactive{--ibo-main-color:#3B4252;--ibo-complementary-color:#D8DEE9}:root{--ibo-dm-class--Incident--main-color:#BF616A}.ibo-dm-class--Incident{--ibo-main-color:#BF616A;--ibo-main-color--100:#532225;--ibo-main-color--900:#f5e6e7}.ibo-dm-class-alt--Incident{--ibo-complementary-color:#BF616A}:root{--ibo-dm-enum--Incident-status-new--main-color:#2c5382;--ibo-dm-enum--Incident-status-new--complementary-color:white}.ibo-dm-enum--Incident-status-new{--ibo-main-color:#2c5382;--ibo-main-color--100:#1e3858;--ibo-main-color--900:#e4ecf6;--ibo-complementary-color:white}.ibo-dm-enum-alt--Incident-status-new{--ibo-main-color:white;--ibo-complementary-color:#2c5382}:root{--ibo-dm-enum--Incident-status-assigned--main-color:#2c5382;--ibo-dm-enum--Incident-status-assigned--complementary-color:white}.ibo-dm-enum--Incident-status-assigned{--ibo-main-color:#2c5382;--ibo-main-color--100:#1e3858;--ibo-main-color--900:#e4ecf6;--ibo-complementary-color:white}.ibo-dm-enum-alt--Incident-status-assigned{--ibo-main-color:white;--ibo-complementary-color:#2c5382}:root{--ibo-dm-enum--Incident-status-pending--main-color:#f6ae55;--ibo-dm-enum--Incident-status-pending--complementary-color:white}.ibo-dm-enum--Incident-status-pending{--ibo-main-color:#f6ae55;--ibo-main-color--100:#6f3c06;--ibo-main-color--900:#fdeedd;--ibo-complementary-color:white}.ibo-dm-enum-alt--Incident-status-pending{--ibo-main-color:white;--ibo-complementary-color:#f6ae55}:root{--ibo-dm-enum--Incident-status-escalated_tto--main-color:#b83280;--ibo-dm-enum--Incident-status-escalated_tto--complementary-color:white}.ibo-dm-enum--Incident-status-escalated_tto{--ibo-main-color:#b83280;--ibo-main-color--100:#5c193e;--ibo-main-color--900:#f7e3ef;--ibo-complementary-color:white}.ibo-dm-enum-alt--Incident-status-escalated_tto{--ibo-main-color:white;--ibo-complementary-color:#b83280}:root{--ibo-dm-enum--Incident-status-escalated_ttr--main-color:#b83280;--ibo-dm-enum--Incident-status-escalated_ttr--complementary-color:white}.ibo-dm-enum--Incident-status-escalated_ttr{--ibo-main-color:#b83280;--ibo-main-color--100:#5c193e;--ibo-main-color--900:#f7e3ef;--ibo-complementary-color:white}.ibo-dm-enum-alt--Incident-status-escalated_ttr{--ibo-main-color:white;--ibo-complementary-color:#b83280}:root{--ibo-dm-enum--Incident-status-resolved--main-color:#689f38;--ibo-dm-enum--Incident-status-resolved--complementary-color:white}.ibo-dm-enum--Incident-status-resolved{--ibo-main-color:#689f38;--ibo-main-color--100:#3b571f;--ibo-main-color--900:#edf6e5;--ibo-complementary-color:white}.ibo-dm-enum-alt--Incident-status-resolved{--ibo-main-color:white;--ibo-complementary-color:#689f38}:root{--ibo-dm-enum--Incident-status-closed--main-color:#D8DEE9;--ibo-dm-enum--Incident-status-closed--complementary-color:#3B4252}.ibo-dm-enum--Incident-status-closed{--ibo-main-color:#D8DEE9;--ibo-main-color--100:#2a364b;--ibo-main-color--900:#e8ecf2;--ibo-complementary-color:#3B4252}.ibo-dm-enum-alt--Incident-status-closed{--ibo-main-color:#3B4252;--ibo-complementary-color:#D8DEE9}:root{--ibo-dm-enum--Incident-status--main-color:#2c5382;--ibo-dm-enum--Incident-status--complementary-color:white}.ibo-dm-enum--Incident-status{--ibo-main-color:#2c5382;--ibo-main-color--100:#1e3858;--ibo-main-color--900:#e4ecf6;--ibo-complementary-color:white}.ibo-dm-enum-alt--Incident-status{--ibo-main-color:white;--ibo-complementary-color:#2c5382}:root{--ibo-dm-enum--Problem-status-new--main-color:#2c5382;--ibo-dm-enum--Problem-status-new--complementary-color:white}.ibo-dm-enum--Problem-status-new{--ibo-main-color:#2c5382;--ibo-main-color--100:#1e3858;--ibo-main-color--900:#e4ecf6;--ibo-complementary-color:white}.ibo-dm-enum-alt--Problem-status-new{--ibo-main-color:white;--ibo-complementary-color:#2c5382}:root{--ibo-dm-enum--Problem-status-assigned--main-color:#2c5382;--ibo-dm-enum--Problem-status-assigned--complementary-color:white}.ibo-dm-enum--Problem-status-assigned{--ibo-main-color:#2c5382;--ibo-main-color--100:#1e3858;--ibo-main-color--900:#e4ecf6;--ibo-complementary-color:white}.ibo-dm-enum-alt--Problem-status-assigned{--ibo-main-color:white;--ibo-complementary-color:#2c5382}:root{--ibo-dm-enum--Problem-status-resolved--main-color:#689f38;--ibo-dm-enum--Problem-status-resolved--complementary-color:white}.ibo-dm-enum--Problem-status-resolved{--ibo-main-color:#689f38;--ibo-main-color--100:#3b571f;--ibo-main-color--900:#edf6e5;--ibo-complementary-color:white}.ibo-dm-enum-alt--Problem-status-resolved{--ibo-main-color:white;--ibo-complementary-color:#689f38}:root{--ibo-dm-enum--Problem-status-closed--main-color:#D8DEE9;--ibo-dm-enum--Problem-status-closed--complementary-color:#3B4252}.ibo-dm-enum--Problem-status-closed{--ibo-main-color:#D8DEE9;--ibo-main-color--100:#2a364b;--ibo-main-color--900:#e8ecf2;--ibo-complementary-color:#3B4252}.ibo-dm-enum-alt--Problem-status-closed{--ibo-main-color:#3B4252;--ibo-complementary-color:#D8DEE9}:root{--ibo-dm-enum--Problem-status--main-color:#2c5382;--ibo-dm-enum--Problem-status--complementary-color:white}.ibo-dm-enum--Problem-status{--ibo-main-color:#2c5382;--ibo-main-color--100:#1e3858;--ibo-main-color--900:#e4ecf6;--ibo-complementary-color:white}.ibo-dm-enum-alt--Problem-status{--ibo-main-color:white;--ibo-complementary-color:#2c5382}:root{--ibo-dm-class--UserRequest--main-color:#2c5382}.ibo-dm-class--UserRequest{--ibo-main-color:#2c5382;--ibo-main-color--100:#1e3858;--ibo-main-color--900:#e4ecf6}.ibo-dm-class-alt--UserRequest{--ibo-complementary-color:#2c5382}:root{--ibo-dm-enum--UserRequest-status-new--main-color:#2c5382;--ibo-dm-enum--UserRequest-status-new--complementary-color:white}.ibo-dm-enum--UserRequest-status-new{--ibo-main-color:#2c5382;--ibo-main-color--100:#1e3858;--ibo-main-color--900:#e4ecf6;--ibo-complementary-color:white}.ibo-dm-enum-alt--UserRequest-status-new{--ibo-main-color:white;--ibo-complementary-color:#2c5382}:root{--ibo-dm-enum--UserRequest-status-waiting_for_approval--main-color:#f6ae55;--ibo-dm-enum--UserRequest-status-waiting_for_approval--complementary-color:white}.ibo-dm-enum--UserRequest-status-waiting_for_approval{--ibo-main-color:#f6ae55;--ibo-main-color--100:#6f3c06;--ibo-main-color--900:#fdeedd;--ibo-complementary-color:white}.ibo-dm-enum-alt--UserRequest-status-waiting_for_approval{--ibo-main-color:white;--ibo-complementary-color:#f6ae55}:root{--ibo-dm-enum--UserRequest-status-approved--main-color:#689f38;--ibo-dm-enum--UserRequest-status-approved--complementary-color:white}.ibo-dm-enum--UserRequest-status-approved{--ibo-main-color:#689f38;--ibo-main-color--100:#3b571f;--ibo-main-color--900:#edf6e5;--ibo-complementary-color:white}.ibo-dm-enum-alt--UserRequest-status-approved{--ibo-main-color:white;--ibo-complementary-color:#689f38}:root{--ibo-dm-enum--UserRequest-status-rejected--main-color:#b83280;--ibo-dm-enum--UserRequest-status-rejected--complementary-color:white}.ibo-dm-enum--UserRequest-status-rejected{--ibo-main-color:#b83280;--ibo-main-color--100:#5c193e;--ibo-main-color--900:#f7e3ef;--ibo-complementary-color:white}.ibo-dm-enum-alt--UserRequest-status-rejected{--ibo-main-color:white;--ibo-complementary-color:#b83280}:root{--ibo-dm-enum--UserRequest-status-assigned--main-color:#2c5382;--ibo-dm-enum--UserRequest-status-assigned--complementary-color:white}.ibo-dm-enum--UserRequest-status-assigned{--ibo-main-color:#2c5382;--ibo-main-color--100:#1e3858;--ibo-main-color--900:#e4ecf6;--ibo-complementary-color:white}.ibo-dm-enum-alt--UserRequest-status-assigned{--ibo-main-color:white;--ibo-complementary-color:#2c5382}:root{--ibo-dm-enum--UserRequest-status-pending--main-color:#f6ae55;--ibo-dm-enum--UserRequest-status-pending--complementary-color:white}.ibo-dm-enum--UserRequest-status-pending{--ibo-main-color:#f6ae55;--ibo-main-color--100:#6f3c06;--ibo-main-color--900:#fdeedd;--ibo-complementary-color:white}.ibo-dm-enum-alt--UserRequest-status-pending{--ibo-main-color:white;--ibo-complementary-color:#f6ae55}:root{--ibo-dm-enum--UserRequest-status-escalated_tto--main-color:#b83280;--ibo-dm-enum--UserRequest-status-escalated_tto--complementary-color:white}.ibo-dm-enum--UserRequest-status-escalated_tto{--ibo-main-color:#b83280;--ibo-main-color--100:#5c193e;--ibo-main-color--900:#f7e3ef;--ibo-complementary-color:white}.ibo-dm-enum-alt--UserRequest-status-escalated_tto{--ibo-main-color:white;--ibo-complementary-color:#b83280}:root{--ibo-dm-enum--UserRequest-status-escalated_ttr--main-color:#b83280;--ibo-dm-enum--UserRequest-status-escalated_ttr--complementary-color:white}.ibo-dm-enum--UserRequest-status-escalated_ttr{--ibo-main-color:#b83280;--ibo-main-color--100:#5c193e;--ibo-main-color--900:#f7e3ef;--ibo-complementary-color:white}.ibo-dm-enum-alt--UserRequest-status-escalated_ttr{--ibo-main-color:white;--ibo-complementary-color:#b83280}:root{--ibo-dm-enum--UserRequest-status-resolved--main-color:#689f38;--ibo-dm-enum--UserRequest-status-resolved--complementary-color:white}.ibo-dm-enum--UserRequest-status-resolved{--ibo-main-color:#689f38;--ibo-main-color--100:#3b571f;--ibo-main-color--900:#edf6e5;--ibo-complementary-color:white}.ibo-dm-enum-alt--UserRequest-status-resolved{--ibo-main-color:white;--ibo-complementary-color:#689f38}:root{--ibo-dm-enum--UserRequest-status-closed--main-color:#D8DEE9;--ibo-dm-enum--UserRequest-status-closed--complementary-color:#3B4252}.ibo-dm-enum--UserRequest-status-closed{--ibo-main-color:#D8DEE9;--ibo-main-color--100:#2a364b;--ibo-main-color--900:#e8ecf2;--ibo-complementary-color:#3B4252}.ibo-dm-enum-alt--UserRequest-status-closed{--ibo-main-color:#3B4252;--ibo-complementary-color:#D8DEE9}:root{--ibo-dm-enum--UserRequest-status--main-color:#2c5382;--ibo-dm-enum--UserRequest-status--complementary-color:white}.ibo-dm-enum--UserRequest-status{--ibo-main-color:#2c5382;--ibo-main-color--100:#1e3858;--ibo-main-color--900:#e4ecf6;--ibo-complementary-color:white}.ibo-dm-enum-alt--UserRequest-status{--ibo-main-color:white;--ibo-complementary-color:#2c5382}:root{--ibo-dm-enum--Change-status-approved--main-color:#689f38;--ibo-dm-enum--Change-status-approved--complementary-color:white}.ibo-dm-enum--Change-status-approved{--ibo-main-color:#689f38;--ibo-main-color--100:#3b571f;--ibo-main-color--900:#edf6e5;--ibo-complementary-color:white}.ibo-dm-enum-alt--Change-status-approved{--ibo-main-color:white;--ibo-complementary-color:#689f38}:root{--ibo-dm-enum--Change-status-assigned--main-color:#2c5382;--ibo-dm-enum--Change-status-assigned--complementary-color:white}.ibo-dm-enum--Change-status-assigned{--ibo-main-color:#2c5382;--ibo-main-color--100:#1e3858;--ibo-main-color--900:#e4ecf6;--ibo-complementary-color:white}.ibo-dm-enum-alt--Change-status-assigned{--ibo-main-color:white;--ibo-complementary-color:#2c5382}:root{--ibo-dm-enum--Change-status-closed--main-color:#D8DEE9;--ibo-dm-enum--Change-status-closed--complementary-color:#3B4252}.ibo-dm-enum--Change-status-closed{--ibo-main-color:#D8DEE9;--ibo-main-color--100:#2a364b;--ibo-main-color--900:#e8ecf2;--ibo-complementary-color:#3B4252}.ibo-dm-enum-alt--Change-status-closed{--ibo-main-color:#3B4252;--ibo-complementary-color:#D8DEE9}:root{--ibo-dm-enum--Change-status-new--main-color:#2c5382;--ibo-dm-enum--Change-status-new--complementary-color:white}.ibo-dm-enum--Change-status-new{--ibo-main-color:#2c5382;--ibo-main-color--100:#1e3858;--ibo-main-color--900:#e4ecf6;--ibo-complementary-color:white}.ibo-dm-enum-alt--Change-status-new{--ibo-main-color:white;--ibo-complementary-color:#2c5382}:root{--ibo-dm-enum--Change-status-notapproved--main-color:#b83280;--ibo-dm-enum--Change-status-notapproved--complementary-color:white}.ibo-dm-enum--Change-status-notapproved{--ibo-main-color:#b83280;--ibo-main-color--100:#5c193e;--ibo-main-color--900:#f7e3ef;--ibo-complementary-color:white}.ibo-dm-enum-alt--Change-status-notapproved{--ibo-main-color:white;--ibo-complementary-color:#b83280}:root{--ibo-dm-enum--Change-status-plannedscheduled--main-color:#f6ae55;--ibo-dm-enum--Change-status-plannedscheduled--complementary-color:white}.ibo-dm-enum--Change-status-plannedscheduled{--ibo-main-color:#f6ae55;--ibo-main-color--100:#6f3c06;--ibo-main-color--900:#fdeedd;--ibo-complementary-color:white}.ibo-dm-enum-alt--Change-status-plannedscheduled{--ibo-main-color:white;--ibo-complementary-color:#f6ae55}:root{--ibo-dm-enum--Change-status-rejected--main-color:#b83280;--ibo-dm-enum--Change-status-rejected--complementary-color:white}.ibo-dm-enum--Change-status-rejected{--ibo-main-color:#b83280;--ibo-main-color--100:#5c193e;--ibo-main-color--900:#f7e3ef;--ibo-complementary-color:white}.ibo-dm-enum-alt--Change-status-rejected{--ibo-main-color:white;--ibo-complementary-color:#b83280}:root{--ibo-dm-enum--Change-status-validated--main-color:#689f38;--ibo-dm-enum--Change-status-validated--complementary-color:white}.ibo-dm-enum--Change-status-validated{--ibo-main-color:#689f38;--ibo-main-color--100:#3b571f;--ibo-main-color--900:#edf6e5;--ibo-complementary-color:white}.ibo-dm-enum-alt--Change-status-validated{--ibo-main-color:white;--ibo-complementary-color:#689f38}:root{--ibo-dm-enum--Change-status--main-color:#2c5382;--ibo-dm-enum--Change-status--complementary-color:white}.ibo-dm-enum--Change-status{--ibo-main-color:#2c5382;--ibo-main-color--100:#1e3858;--ibo-main-color--900:#e4ecf6;--ibo-complementary-color:white}.ibo-dm-enum-alt--Change-status{--ibo-main-color:white;--ibo-complementary-color:#2c5382} \ No newline at end of file diff --git a/dictionaries/de.dictionary.itop.ui.php b/dictionaries/de.dictionary.itop.ui.php index ff71879d46..52d4eff4a9 100644 --- a/dictionaries/de.dictionary.itop.ui.php +++ b/dictionaries/de.dictionary.itop.ui.php @@ -365,6 +365,7 @@ Dict::Add('DE DE', 'German', 'Deutsch', array( We hope you’ll enjoy this version as much as we enjoyed imagining and creating it.
Customize your '.ITOP_APPLICATION.' preferences for a personalized experience.
~~', + 'UI:WelcomePopup:Button:Acknowledge' => 'Ok, verwerfen Sie diese Nachricht', 'UI:WelcomeMenu:AllOpenRequests' => 'Offene Requests: %1$d', 'UI:WelcomeMenu:MyCalls' => 'An mich gestellte Benutzeranfragen', 'UI:WelcomeMenu:OpenIncidents' => 'Offene Incidents: %1$d', diff --git a/dictionaries/en.dictionary.itop.ui.php b/dictionaries/en.dictionary.itop.ui.php index 64098bed6e..a8a80a39d4 100644 --- a/dictionaries/en.dictionary.itop.ui.php +++ b/dictionaries/en.dictionary.itop.ui.php @@ -381,6 +381,7 @@ Dict::Add('EN US', 'English', 'English', array( We hope you’ll enjoy this version as much as we enjoyed imagining and creating it.
Customize your '.ITOP_APPLICATION.' preferences for a personalized experience.
', + 'UI:WelcomePopup:Button:Acknowledge' => 'Ok, discard this message', 'UI:WelcomeMenu:AllOpenRequests' => 'Open requests: %1$d', 'UI:WelcomeMenu:MyCalls' => 'My requests', 'UI:WelcomeMenu:OpenIncidents' => 'Open incidents: %1$d', diff --git a/dictionaries/es_cr.dictionary.itop.ui.php b/dictionaries/es_cr.dictionary.itop.ui.php index 4696258c51..3e674e4899 100644 --- a/dictionaries/es_cr.dictionary.itop.ui.php +++ b/dictionaries/es_cr.dictionary.itop.ui.php @@ -377,6 +377,7 @@ Dict::Add('ES CR', 'Spanish', 'Español, Castellano', array( Esperamos distrute de esta versión tanto como nosotros la imaginamos y creamos.
Configure las preferencias de '.ITOP_APPLICATION.' para una experiencia personalizada.
', + 'UI:WelcomePopup:Button:Acknowledge' => 'Ok, descartar este mensaje', 'UI:WelcomeMenu:AllOpenRequests' => 'Requerimientos Abiertos: %1$d', 'UI:WelcomeMenu:MyCalls' => 'Mis Requerimientos', 'UI:WelcomeMenu:OpenIncidents' => 'Incidentes Abiertos: %1$d', diff --git a/dictionaries/fr.dictionary.itop.ui.php b/dictionaries/fr.dictionary.itop.ui.php index bc0e5159bc..5a03e79d8c 100644 --- a/dictionaries/fr.dictionary.itop.ui.php +++ b/dictionaries/fr.dictionary.itop.ui.php @@ -365,6 +365,7 @@ Dict::Add('FR FR', 'French', 'Français', array( Nous espérons que vous aimerez cette version autant que nous avons eu du plaisir à l\'imaginer et à la créer.
Configurez vos préférences '.ITOP_APPLICATION.' pour une expérience personnalisée.
', + 'UI:WelcomePopup:Button:Acknowledge' => 'Ok, supprimer ce message', 'UI:WelcomeMenu:AllOpenRequests' => 'Requêtes en cours: %1$d', 'UI:WelcomeMenu:MyCalls' => 'Mes Appels Support', 'UI:WelcomeMenu:OpenIncidents' => 'Incidents en cours: %1$d', diff --git a/images/welcome.jpg b/images/welcome.jpg deleted file mode 100644 index c15aa1b92ac7fa94f0907febe2561fba04d8c8f6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 23197 zcmeIacUV(d_b-mUjUZAK6&OWDP;@e(moO@bC;^!eQR=*)^dcQ8VH_JxGb1W35DA(< zknkc+KtM;zNQ)Q(LI{XRHy|An0(YO2pfK-zzrXu??mze5=Q__bhrQ3DHEY+dU9%4SZ{50e>oQ#$;!&h%S-Iow|}49{ylQ?a*&W!pzDV98$>s5 z6qS<{mz4Ye{crK5i1@};dh35$vudBnYVlQT#8)j=itK@*u7U6_{ad?c6#%($HMncC zO=R_|HEUL{S-XDS#`T-lfhOBmtzIL(cHO_$@0CCt->}d8n&gi@f28G}_}TZ~tBq0$ zNQd7@P135EXMcX#vHzrnM`(F^1NQ+RKt+mU1FIy zzqDn5SmG9?e};`>$TkGQWr3$Sc^v*CU0ZA`4!zE1{WPOgc% zy{v%tV)c%XrBLDW*|R0t`-~UQP-CV{ zc1LEhL6rsvBks$#Ej7f&C2}O%eL6;3OMP7n)q3AKch4i{PYyiuQNXEs*`As;XAf*_UM!MMZ0sWQ**|3vK8}0i<-?p znl@mg_1r2#VuE@7in1lCvZ%t@nua=j+R#-LMb2-$uKIe#(8xV@iJfX*iD4wy0;@i+ z-IsI3Sug#g{|2Yz;Wya@_1(<6stVCLM%bwi4RGMlBzZBI_F!kh42e z@oCg7bWlJ?Cefd?g1;|pbkgzLcpn{1oEAki?#@^hWnVp{KdnR>>1@nk=8;^y#3f%zN!Je zk+4Vq6A5yEE|ejI-}<!lOO4sk|#GCOi;wxloK38}Bdy30-)erO` zvOgXl4nQ@Als6!;I+xs(@YWg`Ipc8|E&i?NTs}Huo(*#huGYWLlE;a1w9B_H&}Qc^ z*rZfYd$=8;j=k|ei;eV_KJ4G2(rPfT94r6okJuhmtVxe%{iSbD@c$8i5$!YYsNf|I zBN5`d59;tHqlIcUWd$iFvkbRRhX}I@Z&cHwh;Eozn*YJE3XfKgA=UV!Sg)j9!{j)m zS7ufbbDXXiIlz&N$7bg3IELvTMmcvCZWU$PJ*?V>cYmRBp~g|Hc)SOHTiembS!|3{mDV*@2c(#^Zox3@0N0&8MJ6m>-I zv{&McX@?JcC6eygB}Eowk$Yxa2CH3bo?bOEyPryYLQR@h(F?$!)l8TPlv=&PajkJ* z@02iS#2o$0=fSB~om1^SGBvN?=|7wfOnKH2?LX=AG}xl4yGrfnCP`dQgz4rZuBwF! z(yA?g~Z`zEtsIPBwuNY09EqhU)qB?fO&eWt`{`-ZW zAE@z@E1q;U#`V;+EQ;L6dWJfKiWJ2+Vzw+FS@jBi=0xgT;&2h2&HY7heJg@I5Z-UD zM{TyxC6j|2u*|vR{f#qz4YcSsf1mb%5*9bAPbre5ucT8#uu2LGtm*Ba4xHYq!elKF zob|zou3T&)V;OM|jjqkMrLk?viIw+SGd^{=*BrA>X$60cgoxQnm)weWOQ@=K5>v2C zkFzD(s%vlx#0Wo*=>geMaZ7fq+zu|uU zmm=zBht>?}AwLfrz3}AO@=}a<*_!rvl|Ia06giR9FKJdbYG^Kx)1@1l{d+E}j;gdM z@|M2Pox>`bOyZ>YRS?1x7j}p1h}oAvXW8k?@OqP%$QVOH{OoT$mz zxC8RG$fULXsZpyc>J-&qy??SmLY2w;BdKBy(=%Km-_^&C>NQL=;u)XO4@|6|ADY`4 z#;>D%7)zn(e|Oa*#Pm%|fL*{l#26hv6*g>`&K&kOyd#%1P5QKOr{rMfycj0mU%DqV zAia2>!44c~H>QsBT;KVn_v&^%{dWMXbIpI*N}?U>xiKV{3>wT$4CoKE5^Hd{?XJbV(Sx0ux$>!Y$&a~*UsF=Uvx&EK9q0JlJosDlTs2i21W1QXN8r^vyr-^2DCc%&{gHQJyb~Fq^EO`k^rT*XH7b z8KyCTEiQcrb+=5hD*NAM;xUTPruGn6-W+wpEdRZ}aS7@u(e&758Ul|Z?tiofH~!QA zrh~uel^@*FjE|nHTeF@jY5ZODFHI++_NIy*Yi*By%6fN^>=aL>QhMUp&yQ$2o5*M1AO~|Kt&RZV7 z?38kBCGk;-JlffpMU5%SjLsst-d(tO{q_}>&ESvhP?fUBj$+=q-W*C|(&6L)lLjPW zFs}UFNXu}MePp?$fob?JL(^Mya733P2N$vv8zmJ!5p}l?z36xpcg2s7nPxqZX9*%==;w!X!&p6KTQ}pvyj=c>EE;ec| zGsRuGdS-My6jzbZ!om3JbQGv;s2^_j^$t1Wj5}gR+fDOKzdY6TsXE}W1y-W-;Qry^ ziZ?eKj1J;76XrgJUqAc2szHj%YD_?sKUu)19MsS9%o~4*9~5OY4^#NsJ@OSJ zbsIEQ&yhXy&+%nGC(92=Gun~eO!<#-e})<@n5P{0w`btc;Nf(w!0ho^6k*|;rbY-0SUpE~`&7~(C)qZg`XE}>#}92QWl~e7hSfld%W&{S zuSJpc5~G|FjqGD?PbbTHjsZDm(P~}f7)zxyZi$hJA&y!JM1?P9>?GIpL*aFEGJ{}b z3_#;#eUf*%*-zpM{P4&0?e!I&+#BJ)s1E5%Toif3njg}QFm3%XwVoZMiMFNYOjD19DUKm8f!3RJILV{xZ0wP%A9eihUYfG@+j+BYAJ5hrFzSt6r2NSVaZuA;OKTUu5?D~YD!8b)J2 zY4`CnM~&AtB8E*v!#`Pu7Ih?&8g^xwKVjOCsiZ1wB{Pz!UpK0+%e&0dPcBRIl92q^ zNp)>*s;hQe6p@e*d7r^(%FfZjB^!pmKI2-7OD-uPrM_cGXp(hKA@%56=O0ZgF*(}k z=?0k`W6PVN@}GxN8RJ>}9@n$($ms-2_c#y9SL zxPGg}p?fkP1Y_>{t&(30NrYdR&^WxjPFVN_zVlG@ic6Zo?{J)xPG7!G*mcN!|BtU4 zVHv;lua5>}`M>?H8*biz>jF?mI_>-`8LIp8!?JEp>2SLhbRA0V!9Sd*-?^K0w2;>KA!XkCQgK#5Xz9M~- zpA-w%z4|i=s9w7D9fV`4umT5t4Qzy9;u10{;3)NjtgGMA$oyEn+w6kk)EY+k4>E8Fn zZd8X1+QEI%14QjiYG$;1!s}veE#5WBOpeb_ zwW(4=Qx89gR&J!ebqAX5A^LmJa#Ji7mFfpLP^uf^IT0<}Gfcr#T)qfqIZ1P@Qa)POegyj^rfdya>A^ zX5Ypqnsc6y#Ww082leGAFZr_r+dfX~^lQd~iR{awh~@K&vPEnr+kC-9~bs zp&;88=NC3KarM2MIeKa&*3<)5mbqKf3*#a!3euu+AI`b9zaB5ew%+lY@Ts-VbcY4o)&g&R`NIUq>V|+ylm(Iv56h9COxPQwG(Ydgo!U z4^l#kfj|uQ1-q7|&dnv$u3L{ahBs)~Ciw=>yy(w&OZ5+*xV^C9cMNl?%uL&E_pF?& znbE6+p4YE~_C!>2#`&_hPrZ*}V~PyTlUyoxDDw`@P`+I6PsVX}-OXSJFtJHFU9{)K z!c4t|hMWbD*6@QK!A)RxBg;4?(4xpriV~g3FS?%LG6m*AHLRI3Cn72-Mv_gAC^M*B z6uEI_imhSR?7g6X(C*n;@1*BP;D#l4HZVqu&g$a)Jm|zcab884Q_l_+ORvm&>`qi@ zR!BfV8!3_MKx-0@8_*vpr!+Q}9?!{om!u{qNuP1QsGZW|%Fb5{jxP*HM_);A#e z1E0OQa-~nY5LM+!eQ(ZCL+{{RMAo)(slkGT`u9&$dv|1VTWCfzmqrgaSBJiu51uCH zgitf@e&6ZS?{T$}hQExD(M!gvx*qK4LmX@kcyZr#YS&IO)mq;p&aL0r#)L7yzc=TY zocf}Odg5#1v-;p#>yl1W^}lj_J5{a2Wrv!FJli7qRMI9jNmk+mN>N8h*DpL9FWmbO zKQq;OhBvl{Ic+Xs`Q^Go)^KnLE-o&9XZ=lpiUelqb{1Y51E)NC#_ z6c-;)WqI_N^w+iZPzSkssy&~&cE&m~-wu`CwJD{<_>Wp`c2bZ)l4yP``J4%zoJ$Lh zBa;VvOWlupO$RKBG)kJAn0uS4&#O^0r>K5Yx#OyfB99y576xhj_K5l#Yt9Zwrpu`7 z3zbHCi~-}L)dd=XTiKrrRib_V!2M}G=~7q5Anko@k67xA-c;|l9bPQV%)m=EgnMmetDia!P3S()f79xyf}ZivC1j>{@sDJuk_& z&aC!PtoSJ^(i;`8!04BmtCT)3|Cej5NpPH2 zY#$;zeW)_z)57Pf5O*YrGB7>TWP!HEHMpy(GPK6rC! z8YAd{R;jCfIdiYXChp!gPA_$LVYE||5s67YUR7ENl}z98wmRqh#!&9PQ-jnB-*z`w zrsa;%i*L^r_PKJKutWSde28u?@zD5DB*E!QVl^_du3Off5kgDq9C0~T+3Mzpjd{=U z#T)a&526%LQwF`Bv;{6?wke>qqYtEU>_=2%EGFrf_WV7vUAz}r3rqSEP?nl zxsXm{fkuJ&2M)_xos`=0>MIsu1KVq5A6D#B&#q!9#EDOHnFV!#72$yf~1sU?N#Eqjx8e;;a@#$lb6j zKK)_5M84wLR7$elk zEM37*2T+xCW)jTzCOpd@`w#dy4jIYNp(o5d9C=Er7hvtTyOcp zt0n(D-($da?5Ih^%;CsrCrxsOuB9*6{x!o?OAC?HhS!?c?H>={P{{wTX1}v7vVuk2 z$u zbI4I$XOGZ{KGf$BvyRzTd;f=7SMqSxcR4!csRuGE+^9afyosH}a_iCkIU;QE{f^NMikP<}?!RhuD?0quZ1mwV;?;6V%gnq5aBRPu6rb1AnyQ{lQT` zbIxtb5tM5&?s;`su2-@CFO}2!h)L&X9M)rQjpvXa>4@7g7q15Y_GY_CvY!b9!HSBT zRA-iSR-}yuu)?iu&(;U4(}HsmgNXAA_3r|72H(6%DVX8%ImGqJu1^93i}jQ9__7yf zjazLy)bjYJ*cL{^Hd*>NWW9>)X&1Ss&#F`L7n1Xv*6S4SxL}DcPi@B9nwui@`Z*}G z%ptvJ^??-{%J`;e%dxC&Aq&|pp3R)3NJ?OnE!7c$-jSN4G%IU=)??DXXp(Q6-2Q1M zd*Cz6JLL_*09W7W{J~3G&QmiOS-2=7ot53qN>1K2{N<_&1554juwr71*tz7uGvttM{azovHQc z8$!>>1b;qdbRw|Oap6xzIde7ayl57NQh}|_jLskPRX}P{75fqL-mbdmyJ@93_f~8+ zjWd|`vH1CfCjN}mzNdlXWV4Z$sWMk;45HZ57AdDZbU8D!KJ+RqIr^#ykyOz{?}PWyRnlvZDgPTamQ(H;W=!0it={)Ub@!0Viq%u9?mw|M8C7 zU>Q#FZ7Z_B;aV_h=*O>Z$$1%Po$s>CDMk`gX;Ra>Um}n5pt?keSoKDeh@I79=@AFqePmr< zcn5rRX)lav_4`7lHO(3KsNa!4$C<3M7CZ0efw|kvs<4%$*J%=;Px9n=90jAv6nTbv zR#JGlxU*%%K;a9k?EV+J7%8(xlabOvMNEr-@+9xdslYK!I^HHUea2zT@kvkDZk|c- zY?)J1;+I27rA*aII!lo{h)ONWDB4XMHfc&DMWmBL(R27&9CG}wZov*ubEkbtd6L!p z%!~_dXsxF^Qassq_e%P*N{q`onYFGQTgjfGMnB!8&fez!>$mOnkp24UMr|P~A+&Ta zFB?-tf8U7zbP(P}@3`ITf46F**C#oo;L4N28`R`KbGYa?_(PKuajgOOC+$zRz1Md4 ze#b7&F0#Qo8@rLMoWePVqjwdNiK9q@&-loFc1R3G<8X4tna(_H2-VX3Nf}c8Sf7ri z<~Wt8TSNS#{X&7eQ(i__5eLi0^=ChCJ<8;JQTv}r);vLc87GTrkpqk7^z2&025ET} zWYn=Bj&e&wMEc>D(e_$uu}$G`oEK1YWt=noi!WvIxC`n%H0>E`ssl z)rsVcla4AX7Y<=AYndOo_@34q(`=V#)8xxG$4X)JK04N#y$u(ua4ku8pqOLT`^~*2 z-JaGPRH<=I72o+JEQ)*pFVIv!iqQQ&ZORnejDzh$g#JfwBCp_(;U~&?UiRbn{6UVJ~H=7L|ifc zhJoz)5~u0-YUYp^8RcUN$!I%>CjM}4Y?Ds)nX=bY7}Mu zrjwDKhilmJ)Rx4d4n}9t66>)N!y9%u_C(ZfX~$pie>iGd)5OBYAjpiSjOO8^?c^zx z>|Y6FR}$)pYJ-|VeNC!vI=x$sXEU8n%{?D~WhhjeCDk%z)%-p$P%+lQEs}>a8n!DK zTp$kV$!V}vioawg6i{R0+&Hmw*?%P@`3=id5*0eNceFiBwsh+Y@?^atyO67_O31CF zW)Y=|rrM_I$@hW_>2)0)V?i|bJO9Zc%>X(cDMPHG4_$A&siF61vN}EJ?fU{!i|c4Z zX^9E5o4KqRa77+S5US(8}aQ{=ABF}jw`Xm#jAMyEGw>ZlwY3-WB|aCAgdTbhbk zvF7e(a?@JW(3Hz>z*||{S}HA*P|ws#)T12Fu_PzdpnQnTaj(%gthuX!tj7%PMx4FU z1XmF(%zep!T3P)Y`h#@-spPTs1KZAEf4iyi6X}eg61w~a-%~2Nx&6T}*U$YQmTc>djZZ{-pe16MIINmQDvfJ7WHZYP(B?NdMvvdJFoZrCGThzk%{AS5EQ~1IL z3vuXq0lOQ)(*iD+z(aH4*eY~$H@w;Sz1QHuFJSo$i+o0SbnoeoU&$-DeA|6R3rN-PAbu8!$)d*^TYcEQc6Kb&l)lzg@uJPR?d|**L0Ie#9a1 zO^>-o^tzgNJ$w9Q=!Bkb`Eo}w9|JeF5~}}wLm#Yq>K_5$ZAGQH?(B`$CQ4OU;Ijr!;;I{heJ6S z_3a8sHRjGpo|#d(x0N21jRu&_GBuvR<+_}Dcaw)N2+R*Ry0ZiuQ0wY ztJzg!7Om1COZ9FLr^DZYhxf46CR-VEx;fC6 z8pEW4ZRje2HJ8bfv#9n%-fc=mMWlCd@39eR{`q?g3I*=!L-T$55?fn?JKPvH1=Iqp zKT`sIA(nyABkyO7bC^D!d-Cu#V#cqkngX<0x3&Af)D3E*@3y4&*yO4!jVGU1rpEa3 zFof0#g4s~&btAN@xuGNmEs5DlPI45NzZ4>$;?ECdvQCkb{6nGx&MOq%&Zu+HlOvcc zid@CJ=ksif9o_HLgtxmfTn9<+#X-XiG@>7g6_<+m4P7CoPDr@p+cc%8aZJ=X3{^&D z1#+s}y>@L?r-B!d(rV~4WPeg$gITG7r3c?IsEy(@cf zg;n&V&K;@g`UdL9Nz8N=YD&M8EM|R**2y8$?ofP4R43xp9Too$TGT8WbtMQv{BCGb z#9@beRT*jM&N}J5R7Ctgx~a4CNCf>KHGE3z95mB%r)sC6Xrg8 zf)lYd!3p?3xDq~thi6EoO*9HNkoo`|-m%2mi-pohb$9&isnhbtH$eVW%K%w7$Jzzo zNh$j1dq2!{WBC1v_~;yBWad~SbN%}(Y;nf3_74%&&Q$) zBRfCe^C`TDQt@si8*B;gNXLaRnly_;eHj>A>7L~09%B-5Eu#z7B|&~~t&9B3sqfsB zs<7d5pIV&`uD=!r zDl!?v(w$^Zl2T!liL+GAG`ZE4hnpBqp2^+Xb2cM}XWILunMG2R=CxC`BC|8;az^wS zyQrb?WK2emb-rDmL8D7~0YjYiqUyY#Nf=M|kGS3L#8CR8h;~=j*}w&I%#QRQb4S#4 zu~FowejO|`-zr>hi2UFPLqh#1#)271sLjXBRM{Er3NJ5F!D>^VR+gs9waEVKq1uN_%Jgbg-@oNN9I9f?xKSOE>~NV!+pS$re1lO!A`+u z_Yd&Uewn3#FTlD1jWxvRr-^Gd>gIKEru0rRGF!2M9&EBwsUgPDpJ9U)w=h+dkcpa; z@N9Q0*!t-GKVHg%S%_^(3G5ZemFUDnbcUHDp5 zq#FI{8+OszI_9|3f?7?wJU-_GXa2&peP5Ti{pe(X?7Cuib#}FP_y+R`&t|JJ_onG6 z276KDH7yitXfI|uQ8|;8T#}7@mW?Z?x>fv;Z*JC{XEcPVsSfK4x31@H%$nb&Ugy0-R#nfk}DdanUa2e)A+ zesBFblm0EVVxlN1g~ZfwEp?k>1%S77STzR+upPk4+O|9_tj)K=rDc;JkoYV~n=%6* zTl2(J=N|)djcXIaUTFLBJ=FE|F>e@i438I1=@gA&ZcIGQ+mhB%Y{9gx9imdR5+@Q9 zQ^!M6Bb%ob(QUMbvT+VeYUayPbF@E3f2T`g6mRoj0|FtJ8>OFkJ>8W3I(F{$;kXw8 zGA)RF)sCXAUge`v*-YCC%XBjro^=u6^(e;ad@`SO6~{6jz`5_fNM5B(A|l0ZoLp zAB-V6f{v6`pyRczZ@-6SUXl0>zNfkIA|zFKlkqD-phPHD&{m-TC&8_iV%AE-m;}w2 z;I7oF38Vk%x8?YjS_%!j0=&BERf!PplG#_b2@%3R|7r}>c%v6#i4>^#VTmIlMwp{( zTfbTZQ3fnu#*yNxB_jUD(Q>qdFaNV66pSmq@(*|*ctR2ccdxCBhP)#*Xi0#eiRRas zhB2;Pa?hK8avgQs!m;<{sU!|omKrPd$n-lLI^YvS+cT;iO(tfB(xXZG{bSlm-o7}W5q^%>^{1Z(rxysbJf9Kz z2fjpm=)=E2+z&xS$b5sl3XI);6Y_OTsuI-pb(Ykt?seng#UP|%nX=qRDx-#fS{a!Wsg zB{MM3k@M;4nRcGyeVJ~O>_cvFEgCv%F3C!Wxosg{)Y=JRw3U_`d z+GXe#gCO+fT#OqO6aB32DV=PVk!3E~QJh(fRI{tF?uaBdMNLL7if}{9Bn^)D~!z4BA32}LnJ=(qv^hV?xU$pQ@6YOnKLL>#g%G8ScJ9AoKb~7 z<>PyQTU?o#-24lWVo;2AM$Jv^tm%rH|6$ttXnAAzlOk+!gR6u^n4)ast4)Qnq!v~> ziH%6=Lt^b^bRv@Pm zg`?S?WM`Xd+sk~)@d$2%iiG}7&YbLqe0S;m^7fc2Ss z+-Zv6v%AM;a;_1Hx6ld7rxmsDQ}L1>ZfT>u;~+9A^BA-bZ#;Bs3=374RqEE#pUxZ@ zt~cO|P8iytvvSdX^3Q5cf=o#)*2L_u;R4?JuBRl|QVPkh|9$V9_DOmQQdC!OCQeRE zExx1Bi!vDAp1}CbON~A}!97xQ%@>@lyKP~xuul7VLSj@@)TjBjh$qJ`KJnjGSD1m% za(im&g{oDKBBRdP7X~O=PtF@kvWqhq46bBHQfAF(8y9}t<3Cwxy*)E$oom?IIPWlL zPIv`o==fFgc|v{t$9;Ncii`zDA=;lo=~7Oi&QB+eu#)}5`kbf=Gam*)N~wKa48zZ5 zaD8j5g-QcfLbaVgJ8I!`N`Yt4s+CZUJj%&?;+c}WH9UPv?5rm^XlEPPR^+{_#LwhH zv0Gx1TjnI~`7QeNp_y_zvbRV*hHqHX8puq_PsU1_xOynh2KG-nBydc^!ulf4TpCq3 zy-(}q29##g!vT}jLm2M5%KOMiSh^b=vX$*JeDs=H0w2$a+G-%s55u(#I6Ek$$VIWXE$e!97F z+XbrshrK7(9snhRDjd( z(pGOj19g`8?G04FdV3Y-k?H1b-`~r8yZ6MNN4XY%fyygKu-ae(yRp$)$`p*Wpf{*k z3m`$Q0g&%=Ex_2lS>o5nglHZ#O(G@DEtd>+U^(FHZ>cT{#Ph zJoM8|NCaflet{7x(G=6wR|KX3V@x+4zyMPY{q&naqvE<;0o*f!W?&l8z59;0}xFRd)EL-5Nkq^-#|f}3s{7?hZus1 zBS`M8-K3ldp#&ay51Dgj4@43mSaXRaP2h5v>a`DGG9i*6cdQ^)aUC2Xkhvd#gPi`+)8##7}Gb}qc5nEF~*Pw9~^%{#nBayuu>NIQ%6@r>(4k&(mBMcBX)5^sG97N_J%BsQ;f8N7v&to zH=$uT{ycIgzKKi-nr#jnHF`uYjwB_=_xWfRm^w-f6P0+449iDsf1asJLX){yF)ccS z8g`oM)2Yni=CUGZcZsE^Sd&z+mKLwBl%@>N`fDm(>_K+P$=siL^Nxp28z0_Vvv@?I_sAW8E#B&cYgi zw;pN@r~^oG2`K{yMZ`91Qk#Z#p~pqiF~ck=^m*4LigaICU&18u-(0z}9R~w=cE@nN z4EJ(9zo%h{SUOv4Y`PKEKUk+z%^<&Hx43E8t}D}vNtGJT%S`iZ{ZwEYY8vWrmNq4Z zZhFpQd3&|HsTCcWZON{}P5C>jm<^xOnby~E<(gTCl*X%BB_&PveXj3wC!)Y1-NJYN z6v=WoNWoWRgoH{y;2d{1Af^ zq9e|ijmBNUN`F)k7vJVISth5c+m9rU@}}HF@qRT}?ZNDT8B=F{-D(8!^`^Ib&#Xm$ zW-xzTs{}>o_aLf{U{@CQVBHk+D~*2!kM7XaZo7xzi^&2L`g_$LH%-=!qNGm7)FBBBlL6LG} zqs28%ZI8dGXE=ub4ai=_i_41zx5(uK@5mUWw7nIHd5Y`w%pk6 z&2hhi=VkAoQhWcra-;wZ+n8SoTMh^wpaK)92&VbJwmpHyaOJhiKM}S_ow+9H1RgT+ zpP=df2^jFt+&%<9CMR#eZQ!0zTTo3{`&pn@027c6W)lmDE0}aJMS!d5woI_Ae8zzyOb_=84B}{kAmG zbAlo?1ndFqfVn)w_ofmwJ(2-FFh8k427dVd88k!)=z-e7EDB-)zyW)52n0l$uvG!D z{CCCGZ!9vv-7QkU#&ZzS5V8A#K|d3q)epD_y1=*ru8YcvI)o+BkYj*_fJFhPOa8b5 zjWPf}wAcV<8ADz?*9%b(dj@hc~H_t1uQ}S8tI5ZUmrZ)h{ujSY5qE(gg4ag_eM4131nk zzmX2z0bPFjtx5tO?#%_my@cW_$So_Izj?WALipMok}eczu%ZP->&7EOfh!7M`wH}$ z!Vw_oYrX_q5Ef9S+|HFa1fXDp36M4D`YhyRXeeE}LL!%y!9pM6W$BStTnhwjhZ-#1fGU8KK-N(3(1W$Mz(ElD zueHMAXVWVXtk3}e^>MZq>IEAIxINhX2ps@FWmopY%bKqP@BwH}0R!X~crt`Cj{^%eefe}!+&LXVr z2IgomL#O~b&<(I}S%DN9IiU$)sT$~kJN%rUwNImQ6*lLQr0NPB^nH z%`gBU4CE#NF4PN6JkV_jA4DM7tAc@1zymN0o|wLM2Ll@5MH7+(>AUhD@ zjr$ddKCz^6sR57xOM*=Q9g?){23X1n)(OiY!SndH5P@BI4%&i3q5E}~TUiYv3ywP| zE`g(k@dW}Mu3n0Na9s*GFpfiy>1}kP+OnYvzZxfUIS5zs_F&Bya!yN6>`3_skyfbPd3ZnTK#frQVtV1NW8%l;>DKOh#e9MB=?|3Of_f}MXT{C!#cH-BgXdftAeM+k5w z-va6c3$cGtuwr8+)CPk5A1D+otc61Z2(#sW6$m!|@8tiNw1JEcYz36C!fpg zL(AL!*O~;K)@H--S0KJ9kZ>7>2NGV8GX=o6NdC_ipnTTXKL1d7CZMxUz@Q*^2k)jp zCj%%+3O~|c3qq}eJO5NL1R)6qS>{nLlxYp`gUx7SfPJPKuusoQh@BikWzlr&q z(J;Kz%TzA~g%IF3vwvR}6w7b^P5$>w(EwAlX^m<5ob z&VCDC0c-bmo!8m~OB4hw1McF#33_2K(7$xhQE&)RaQYC|pSJZaBy8{3GnWAJE$DD2fD8*u z7MyYv9->@2>k z(Im7PoIns50KK*bCo8`y6CMryBBVwD?IffCPy-#n1aIIWOaeBSj(6G;z4xK_~fY<1-8NvgZ@C9`GY+wA>$tS z-fczWf2w;1j`~7E!S{)0mjA#&8rq^4`hF4miG?4}-KxDpI(-RzZP;z_`x{{$d8zKu zaz%o676PFV(x1pwKqLu?n66k<`bpig|a_1w#*PMU1NE0Fo z`e+gU+7Kp6_%-5+y8o1yfw{b*uaNkadIiL9!@VUmlhErRA_`!H@(oNNuFYn1@U`)Q-v={tv$1lQmYkzMzk+f9UBIvaJq#6)-4K4te zyGb(EtQPz%$-R?mJO3s}=@MwrbV?`(Gyq+HdjnxueebkW8v2JHF2c%R2?VVJ7+(GD zmJru=LG!QeKK$JbNr7}2STqoux*8x~0ZCdQ0yY=?JO`})t2|))y6q=**Qve)SkCwg z*!gDsH^#ozeY5JT+3NtMP=k8{Nx=FafWZRNzmfS1L>c(imV})`jhCQbRe==47tl+< znWee&4p3%)u+pZAAx>?<%g9D_y4}|>ssIcO@C4C|H1k{ Knt_PLw*LV{c{{2A diff --git a/lib/composer/autoload_classmap.php b/lib/composer/autoload_classmap.php index 0dc29f1235..cb3aab65c4 100644 --- a/lib/composer/autoload_classmap.php +++ b/lib/composer/autoload_classmap.php @@ -14,6 +14,7 @@ return array( 'AbstractPortalUIExtension' => $baseDir . '/application/applicationextension.inc.php', 'AbstractPreferencesExtension' => $baseDir . '/application/applicationextension.inc.php', 'AbstractWeeklyScheduledProcess' => $baseDir . '/core/backgroundprocess.inc.php', + 'AbstractWelcomePopup' => $baseDir . '/application/applicationextension.inc.php', 'Action' => $baseDir . '/core/action.class.inc.php', 'ActionChecker' => $baseDir . '/core/userrights.class.inc.php', 'ActionEmail' => $baseDir . '/core/action.class.inc.php', @@ -142,6 +143,7 @@ return array( 'CheckStopWatchThresholds' => $baseDir . '/core/ormstopwatch.class.inc.php', 'CheckableExpression' => $baseDir . '/core/oql/oqlquery.class.inc.php', 'Combodo\\iTop\\Application\\Branding' => $baseDir . '/sources/application/Branding.php', + 'Combodo\\iTop\\Application\\DatamodelDisplayService' => $baseDir . '/sources/application/DatamodelDisplayService.php', 'Combodo\\iTop\\Application\\Helper\\Session' => $baseDir . '/sources/application/Helper/Session.php', 'Combodo\\iTop\\Application\\Helper\\WebResourcesHelper' => $baseDir . '/sources/application/Helper/WebResourcesHelper.php', 'Combodo\\iTop\\Application\\Search\\AjaxSearchException' => $baseDir . '/sources/application/search/ajaxsearchexception.class.inc.php', @@ -296,11 +298,14 @@ return array( 'Combodo\\iTop\\Application\\UI\\Links\\Indirect\\BlockObjectPickerDialog\\BlockObjectPickerDialog' => $baseDir . '/sources/application/UI/Links/Indirect/BlockObjectPickerDialog/BlockObjectPickerDialog.php', 'Combodo\\iTop\\Application\\UI\\Preferences\\BlockShortcuts\\BlockShortcuts' => $baseDir . '/sources/application/UI/Preferences/BlockShortcuts/BlockShortcuts.php', 'Combodo\\iTop\\Application\\UI\\Printable\\BlockPrintHeader\\BlockPrintHeader' => $baseDir . '/sources/application/UI/Printable/BlockPrintHeader/BlockPrintHeader.php', + 'Combodo\\iTop\\Application\\WelcomePopup\\DefaultWelcomePopup' => $baseDir . '/sources/Application/WelcomePopup/DefaultWelcomePopup.php', + 'Combodo\\iTop\\Application\\WelcomePopup\\WelcomePopupService' => $baseDir . '/sources/Application/WelcomePopup/WelcomePopupService.php', 'Combodo\\iTop\\Composer\\iTopComposer' => $baseDir . '/sources/Composer/iTopComposer.php', 'Combodo\\iTop\\Controller\\AjaxRenderController' => $baseDir . '/sources/Controller/AjaxRenderController.php', 'Combodo\\iTop\\Controller\\Base\\Layout\\ActivityPanelController' => $baseDir . '/sources/Controller/Base/Layout/ActivityPanelController.php', 'Combodo\\iTop\\Controller\\OAuth\\OAuthLandingController' => $baseDir . '/sources/Controller/OAuth/OAuthLandingController.php', 'Combodo\\iTop\\Controller\\PreferencesController' => $baseDir . '/sources/Controller/PreferencesController.php', + 'Combodo\\iTop\\Controller\\WelcomePopupController' => $baseDir . '/sources/Controller/WelcomePopupController.php', 'Combodo\\iTop\\Core\\Authentication\\Client\\OAuth\\IOAuthClientProvider' => $baseDir . '/sources/Core/Authentication/Client/OAuth/IOAuthClientProvider.php', 'Combodo\\iTop\\Core\\Authentication\\Client\\OAuth\\OAuthClientProviderAbstract' => $baseDir . '/sources/Core/Authentication/Client/OAuth/OAuthClientProviderAbstract.php', 'Combodo\\iTop\\Core\\Authentication\\Client\\OAuth\\OAuthClientProviderAzure' => $baseDir . '/sources/Core/Authentication/Client/OAuth/OAuthClientProviderAzure.php', @@ -1398,6 +1403,7 @@ return array( 'RotatingLogFileNameBuilder' => $baseDir . '/core/log.class.inc.php', 'RowStatus' => $baseDir . '/core/bulkchange.class.inc.php', 'RowStatus_Disappeared' => $baseDir . '/core/bulkchange.class.inc.php', + 'RowStatus_Error' => $baseDir . '/core/bulkchange.class.inc.php', 'RowStatus_Issue' => $baseDir . '/core/bulkchange.class.inc.php', 'RowStatus_Modify' => $baseDir . '/core/bulkchange.class.inc.php', 'RowStatus_NewObj' => $baseDir . '/core/bulkchange.class.inc.php', @@ -2973,6 +2979,7 @@ return array( 'iTopStandardURLMaker' => $baseDir . '/application/applicationcontext.class.inc.php', 'iTopWebPage' => $baseDir . '/sources/application/WebPage/iTopWebPage.php', 'iTopWizardWebPage' => $baseDir . '/sources/application/WebPage/iTopWizardWebPage.php', + 'iWelcomePopup' => $baseDir . '/application/applicationextension.inc.php', 'iWorkingTimeComputer' => $baseDir . '/core/computing.inc.php', 'lnkTriggerAction' => $baseDir . '/core/trigger.class.inc.php', 'ormCaseLog' => $baseDir . '/core/ormcaselog.class.inc.php', diff --git a/lib/composer/autoload_static.php b/lib/composer/autoload_static.php index 026b5cc7c3..8e2147e567 100644 --- a/lib/composer/autoload_static.php +++ b/lib/composer/autoload_static.php @@ -382,6 +382,7 @@ class ComposerStaticInit5e7efdfe4e8f9526eb41991410b96239 'AbstractPortalUIExtension' => __DIR__ . '/../..' . '/application/applicationextension.inc.php', 'AbstractPreferencesExtension' => __DIR__ . '/../..' . '/application/applicationextension.inc.php', 'AbstractWeeklyScheduledProcess' => __DIR__ . '/../..' . '/core/backgroundprocess.inc.php', + 'AbstractWelcomePopup' => __DIR__ . '/../..' . '/application/applicationextension.inc.php', 'Action' => __DIR__ . '/../..' . '/core/action.class.inc.php', 'ActionChecker' => __DIR__ . '/../..' . '/core/userrights.class.inc.php', 'ActionEmail' => __DIR__ . '/../..' . '/core/action.class.inc.php', @@ -510,6 +511,7 @@ class ComposerStaticInit5e7efdfe4e8f9526eb41991410b96239 'CheckStopWatchThresholds' => __DIR__ . '/../..' . '/core/ormstopwatch.class.inc.php', 'CheckableExpression' => __DIR__ . '/../..' . '/core/oql/oqlquery.class.inc.php', 'Combodo\\iTop\\Application\\Branding' => __DIR__ . '/../..' . '/sources/application/Branding.php', + 'Combodo\\iTop\\Application\\DatamodelDisplayService' => __DIR__ . '/../..' . '/sources/application/DatamodelDisplayService.php', 'Combodo\\iTop\\Application\\Helper\\Session' => __DIR__ . '/../..' . '/sources/application/Helper/Session.php', 'Combodo\\iTop\\Application\\Helper\\WebResourcesHelper' => __DIR__ . '/../..' . '/sources/application/Helper/WebResourcesHelper.php', 'Combodo\\iTop\\Application\\Search\\AjaxSearchException' => __DIR__ . '/../..' . '/sources/application/search/ajaxsearchexception.class.inc.php', @@ -664,11 +666,14 @@ class ComposerStaticInit5e7efdfe4e8f9526eb41991410b96239 'Combodo\\iTop\\Application\\UI\\Links\\Indirect\\BlockObjectPickerDialog\\BlockObjectPickerDialog' => __DIR__ . '/../..' . '/sources/application/UI/Links/Indirect/BlockObjectPickerDialog/BlockObjectPickerDialog.php', 'Combodo\\iTop\\Application\\UI\\Preferences\\BlockShortcuts\\BlockShortcuts' => __DIR__ . '/../..' . '/sources/application/UI/Preferences/BlockShortcuts/BlockShortcuts.php', 'Combodo\\iTop\\Application\\UI\\Printable\\BlockPrintHeader\\BlockPrintHeader' => __DIR__ . '/../..' . '/sources/application/UI/Printable/BlockPrintHeader/BlockPrintHeader.php', + 'Combodo\\iTop\\Application\\WelcomePopup\\DefaultWelcomePopup' => __DIR__ . '/../..' . '/sources/Application/WelcomePopup/DefaultWelcomePopup.php', + 'Combodo\\iTop\\Application\\WelcomePopup\\WelcomePopupService' => __DIR__ . '/../..' . '/sources/Application/WelcomePopup/WelcomePopupService.php', 'Combodo\\iTop\\Composer\\iTopComposer' => __DIR__ . '/../..' . '/sources/Composer/iTopComposer.php', 'Combodo\\iTop\\Controller\\AjaxRenderController' => __DIR__ . '/../..' . '/sources/Controller/AjaxRenderController.php', 'Combodo\\iTop\\Controller\\Base\\Layout\\ActivityPanelController' => __DIR__ . '/../..' . '/sources/Controller/Base/Layout/ActivityPanelController.php', 'Combodo\\iTop\\Controller\\OAuth\\OAuthLandingController' => __DIR__ . '/../..' . '/sources/Controller/OAuth/OAuthLandingController.php', 'Combodo\\iTop\\Controller\\PreferencesController' => __DIR__ . '/../..' . '/sources/Controller/PreferencesController.php', + 'Combodo\\iTop\\Controller\\WelcomePopupController' => __DIR__ . '/../..' . '/sources/Controller/WelcomePopupController.php', 'Combodo\\iTop\\Core\\Authentication\\Client\\OAuth\\IOAuthClientProvider' => __DIR__ . '/../..' . '/sources/Core/Authentication/Client/OAuth/IOAuthClientProvider.php', 'Combodo\\iTop\\Core\\Authentication\\Client\\OAuth\\OAuthClientProviderAbstract' => __DIR__ . '/../..' . '/sources/Core/Authentication/Client/OAuth/OAuthClientProviderAbstract.php', 'Combodo\\iTop\\Core\\Authentication\\Client\\OAuth\\OAuthClientProviderAzure' => __DIR__ . '/../..' . '/sources/Core/Authentication/Client/OAuth/OAuthClientProviderAzure.php', @@ -1766,6 +1771,7 @@ class ComposerStaticInit5e7efdfe4e8f9526eb41991410b96239 'RotatingLogFileNameBuilder' => __DIR__ . '/../..' . '/core/log.class.inc.php', 'RowStatus' => __DIR__ . '/../..' . '/core/bulkchange.class.inc.php', 'RowStatus_Disappeared' => __DIR__ . '/../..' . '/core/bulkchange.class.inc.php', + 'RowStatus_Error' => __DIR__ . '/../..' . '/core/bulkchange.class.inc.php', 'RowStatus_Issue' => __DIR__ . '/../..' . '/core/bulkchange.class.inc.php', 'RowStatus_Modify' => __DIR__ . '/../..' . '/core/bulkchange.class.inc.php', 'RowStatus_NewObj' => __DIR__ . '/../..' . '/core/bulkchange.class.inc.php', @@ -3341,6 +3347,7 @@ class ComposerStaticInit5e7efdfe4e8f9526eb41991410b96239 'iTopStandardURLMaker' => __DIR__ . '/../..' . '/application/applicationcontext.class.inc.php', 'iTopWebPage' => __DIR__ . '/../..' . '/sources/application/WebPage/iTopWebPage.php', 'iTopWizardWebPage' => __DIR__ . '/../..' . '/sources/application/WebPage/iTopWizardWebPage.php', + 'iWelcomePopup' => __DIR__ . '/../..' . '/application/applicationextension.inc.php', 'iWorkingTimeComputer' => __DIR__ . '/../..' . '/core/computing.inc.php', 'lnkTriggerAction' => __DIR__ . '/../..' . '/core/trigger.class.inc.php', 'ormCaseLog' => __DIR__ . '/../..' . '/core/ormcaselog.class.inc.php', diff --git a/pages/UI.php b/pages/UI.php index e838778644..66812ebcf8 100644 --- a/pages/UI.php +++ b/pages/UI.php @@ -19,6 +19,7 @@ use Combodo\iTop\Application\UI\Base\Component\Toolbar\ToolbarUIBlockFactory; use Combodo\iTop\Application\UI\Base\Layout\PageContent\PageContentFactory; use Combodo\iTop\Application\UI\Base\Layout\UIContentBlock; use Combodo\iTop\Application\UI\Base\Layout\UIContentBlockUIBlockFactory; +use Combodo\iTop\Application\WelcomePopup\WelcomePopupService; /** * Displays a popup welcome message, once per session at maximum @@ -28,18 +29,17 @@ use Combodo\iTop\Application\UI\Base\Layout\UIContentBlockUIBlockFactory; * * @return void */ -function DisplayWelcomePopup(WebPage $oP) +function DisplayWelcomePopup(WebPage $oP): void { if (!Session::IsSet('welcome')) { - // Check, only once per session, if the popup should be displayed... - // If the user did not already ask for hiding it forever - $bPopup = appUserPreferences::GetPref('welcome_popup', true); - if ($bPopup) + $oWelcomePopupService = new WelcomePopupService(); + $aMessages = $oWelcomePopupService->GetMessages(); + if (count($aMessages) > 0) { - TwigHelper::RenderIntoPage($oP, APPROOT.'/', 'templates/pages/backoffice/welcome_popup/welcome_popup'); - Session::Set('welcome', 'ok'); + TwigHelper::RenderIntoPage($oP, APPROOT.'/', 'templates/pages/backoffice/welcome_popup/welcome_popup', ['messages' => $aMessages]); } + Session::Set('welcome', 'ok'); // Try just once per session } } diff --git a/pages/ajax.render.php b/pages/ajax.render.php index 1bc92412ad..0ca194927a 100644 --- a/pages/ajax.render.php +++ b/pages/ajax.render.php @@ -14,6 +14,7 @@ use Combodo\iTop\Controller\Base\Layout\ActivityPanelController; use Combodo\iTop\Controller\PreferencesController; use Combodo\iTop\Renderer\Console\ConsoleBlockRenderer; use Combodo\iTop\Renderer\Console\ConsoleFormRenderer; +use Combodo\iTop\Controller\WelcomePopupController; require_once('../approot.inc.php'); @@ -2690,8 +2691,28 @@ EOF $oAjaxRenderController->GetMenusCount($oPage); break; - default: - $oPage->p("Invalid query."); + //-------------------------------- + // WelcomePopupMenu + //-------------------------------- + case 'welcome_popup.acknowledge_message': + $oPage = new JsonPage(); + try { + $oController = new WelcomePopupController(); + $oController->AcknowledgeMessage(); + $aResult = ['success' => true]; + } + catch (Exception $oException) { + $aResult = [ + 'success' => false, + 'error_message' => $oException->getMessage(), + ]; + } + $oPage->SetData($aResult); + break; + + default: + $oPage->p("Invalid query."); + } } $oKPI->ComputeAndReport('Data fetch and format'); $oPage->output(); diff --git a/sources/Application/WelcomePopup/DefaultWelcomePopup.php b/sources/Application/WelcomePopup/DefaultWelcomePopup.php new file mode 100644 index 0000000000..06a8d38a03 --- /dev/null +++ b/sources/Application/WelcomePopup/DefaultWelcomePopup.php @@ -0,0 +1,27 @@ + '0001', + 'title' => Dict::S('UI:WelcomeMenu:Title'), + 'twig' => '/templates/pages/backoffice/welcome_popup/default_welcome_popup', + 'importance' => \iWelcomePopup::IMPORTANCE_HIGH, + 'parameters' => [], + ], + ]; + } +} diff --git a/sources/Application/WelcomePopup/WelcomePopupService.php b/sources/Application/WelcomePopup/WelcomePopupService.php new file mode 100644 index 0000000000..97009fd0ab --- /dev/null +++ b/sources/Application/WelcomePopup/WelcomePopupService.php @@ -0,0 +1,234 @@ +LoadProviders(); + return $this->ProcessMessages(); + } + + /** + * Get the messages to display from a list of iWelcomePopup instances + * The messages are ordered by importance (CRITICAL first) then by ID + * Invalid messages or acknowledged messages are removed from the list + * @return array + */ + protected function ProcessMessages(): array + { + $this->LoadProviders(); + $aMessages = []; + foreach($this->aMessagesProviders as $oProvider) { + $aProviderMessages = $oProvider->GetMessages(); + if (count($aProviderMessages) === 0) { + IssueLog::Debug('Empty list of messages for '.get_class($oProvider), LogChannels::CONSOLE); + } + foreach($aProviderMessages as $aMessage) { + $aReasons = []; + if (!$this->IsMessageValid($aMessage, $aReasons)) { + IssueLog::Error('Invalid structure returned by '.get_class($oProvider).'::GetMessages()', LogChannels::CONSOLE, $aReasons); + continue; // Fail silently + } + $sUUID = $this->MakeStringFitIn(get_class($oProvider), static::PROVIDER_KEY_LENGTH).'::'.$aMessage['id']; + $aMessage['uuid'] = $sUUID; + $aMessages[] = $aMessage; + } + } + // Filter the acknowledged messages AFTER getting all messages + // This allows for "replacing" a message (from another provider for example) + // by automatically acknowledging it when called in GetMessages() + foreach($aMessages as $key => $aMessage) { + if ($this->IsMessageAcknowledged($aMessage['uuid'])) { + IssueLog::Debug('Ignoring already acknowledged message '.$aMessage['uuid'], LogChannels::CONSOLE); + unset($aMessages[$key]); + } + } + usort($aMessages, array(get_class($this), 'SortOnImportance')); + return $aMessages; + } + + /** + * Helper function for usort to compare two items based on their 'importance' field + * @param string[] $aItem1 + * @param string[] $aItem2 + * @return int + */ + public static function SortOnImportance($aItem1, $aItem2): int + { + if ($aItem1['importance'] === $aItem2['importance']) { + return strcmp($aItem1['id'], $aItem2['id']); + } + return ($aItem1['importance'] < $aItem2['importance']) ? -1 : 1; + } + + public function AcknowledgeMessage(string $sMessageUUID): void + { + $this->LoadProviders(); + $oAcknowledge = MetaModel::NewObject(WelcomePopupAcknowledge::class, [ + 'message_uuid' => $sMessageUUID, + 'acknowledge_date' => date(AttributeDateTime::GetSQLFormat()), + 'user_id' => UserRights::GetConnectedUserId(), + ]); + try { + $oAcknowledge->DBInsert(); + $oProvider = $this->GetProviderByUUID($sMessageUUID); + if (static::$aAcknowledgedMessage !== null) { + static::$aAcknowledgedMessage[] = $sMessageUUID; // Update the cache + } + // Notify the provider of the message + $sMessageId = substr($sMessageUUID, strpos($sMessageUUID, '::')+2); + if ($oProvider !== null) { + $oProvider->AcknowledgeMessage($sMessageId); + } + } catch(Exception $e) { + IssueLog::Error("Failed to acknowledge the message $sMessageUUID for user ".UserRights::GetConnectedUserId().". Reason: ".$e->getMessage(), LogChannels::CONSOLE); + } + } + + /** + * Load the provider of messages, decoupled from the constructor for testability + */ + protected function LoadProviders(): void + { + if ($this->aMessagesProviders !== null) return; + + $aProviders = []; + $aProviderClasses = utils::GetClassesForInterface(iWelcomePopup::class, '', array('[\\\\/]lib[\\\\/]', '[\\\\/]node_modules[\\\\/]', '[\\\\/]test[\\\\/]', '[\\\\/]tests[\\\\/]')); + foreach($aProviderClasses as $sProviderClass) { + $aProviders[] = new $sProviderClass(); + } + $this->SetMessagesProviders($aProviders); + } + + /** + * Check if a given message was acknowledged by the current user + * @param string $sMessageId + * @return bool + */ + protected function IsMessageAcknowledged(string $sMessageUUID): bool + { + $iUserId = UserRights::GetConnectedUserId(); + if (static::$aAcknowledgedMessage === null) { + + $oSearch = new DBObjectSearch(WelcomePopupAcknowledge::class); + $oSearch->AddCondition('user_id', $iUserId); + $oSet = new DBObjectSet($oSearch); + $aAcknowledgedMessages = $oSet->GetColumnAsArray('message_uuid'); + $this->SetAcknowledgedMessagesCache($aAcknowledgedMessages); + } + return in_array($sMessageUUID, static::$aAcknowledgedMessage); + } + + /** + * Set the cache of acknowledged messages (useful for testing) + * @param array $aAcknowledgedMessages + */ + protected function SetAcknowledgedMessagesCache(array $aAcknowledgedMessages): void + { + static::$aAcknowledgedMessage = $aAcknowledgedMessages; + } + + /** + * Set the cache of welcome popup message providers (useful for testing) + * @param iWelcomePopup[] $aMessagesProviders + */ + protected function SetMessagesProviders(array $aMessagesProviders): void + { + $this->aMessagesProviders = $aMessagesProviders; + } + + /** + * Retrieve the provider associated with a message + * @param string $sMessageUUID + * @return iWelcomePopup|NULL + */ + protected function GetProviderByUUID(string $sMessageUUID): ?iWelcomePopup + { + $this->LoadProviders(); + $sProviderKey = substr($sMessageUUID, 0, strpos($sMessageUUID, '::')); + foreach($this->aMessagesProviders as $oProvider) { + if ($this->MakeStringFitIn(get_class($oProvider), static::PROVIDER_KEY_LENGTH) === $sProviderKey) { + return $oProvider; + } + } + return null; + } + + /** + * Check if the structure of a given message is valid by checking + * all its mandatory elements + * @param string[] $aMessage + * @param string[] $aReasons + * @return bool + */ + protected function IsMessageValid($aMessage, array &$aReasons): bool + { + if (!is_array($aMessage)) { + $aReasons[] = 'GetMessage() must return an array of arrays.'; + return false; // Stop checking immediately + } + $bRet = true; + foreach(['id', 'importance', 'title'] as $sKey) { + if (!array_key_exists($sKey, $aMessage)) { + $aReasons[] = "Field '$sKey' missing from the message structure."; + $bRet = false; + } + } + if (!array_key_exists('html', $aMessage) && !array_key_exists('twig', $aMessage)) { + $aReasons[] = "Message structure must contain either a field 'html' or a field 'twig'."; + $bRet = false; + } + return $bRet; + } + + /** + * Shorten the given string (if needed) but preserving its uniqueness + * @param string $sProviderClass + * @param int $iLengthLimit + * @return string + */ + protected function MakeStringFitIn(string $sProviderClass, int $iLengthLimit): string + { + if(mb_strlen($sProviderClass) <= $iLengthLimit) { + return $sProviderClass; + } + // Truncate the string to $iLimitLength and replace the first carahcters with the MD5 of the complete string + $sMD5 = md5($sProviderClass, false); + return $sMD5.'-'.mb_substr($sProviderClass, -($iLengthLimit - strlen($sMD5) - 1)); // strlen is OK on the MD5 string, and '-' is not allowed in a class name + } +} + diff --git a/sources/Controller/WelcomePopupController.php b/sources/Controller/WelcomePopupController.php new file mode 100644 index 0000000000..cb7989203b --- /dev/null +++ b/sources/Controller/WelcomePopupController.php @@ -0,0 +1,24 @@ +AcknowledgeMessage($sMessageUUID); + } +} + diff --git a/templates/pages/backoffice/welcome_popup/default_welcome_popup.html.twig b/templates/pages/backoffice/welcome_popup/default_welcome_popup.html.twig new file mode 100644 index 0000000000..95611adab8 --- /dev/null +++ b/templates/pages/backoffice/welcome_popup/default_welcome_popup.html.twig @@ -0,0 +1,10 @@ +
+
+ {{ source("images/illustrations/undraw_relaunch_day.svg") }} +
+
+
+ {{ 'UI:WelcomeMenu:Text'| dict_s|raw }} +
+
+
\ No newline at end of file diff --git a/templates/pages/backoffice/welcome_popup/welcome_popup.html.twig b/templates/pages/backoffice/welcome_popup/welcome_popup.html.twig index 382d4558b6..7ac3a2c4bc 100644 --- a/templates/pages/backoffice/welcome_popup/welcome_popup.html.twig +++ b/templates/pages/backoffice/welcome_popup/welcome_popup.html.twig @@ -1,14 +1,25 @@ -
-
- {{ source("images/illustrations/undraw_relaunch_day.svg") }} -
-
-
- {{ 'UI:WelcomeMenu:Text'| dict_s|raw }} -
-
- -
-
- +
+
+{% for message in messages %} +
+ {% if message.twig is defined %} + {{ include([message.twig ~ '.html.twig', message.twig ~ '.twig', message.twig], message.parameters ?? {}, sandboxed = true) }} + {% else %} + {{ message.html|raw }} + {% endif %} +
+ {% UIButton ForPrimaryAction{'sLabel':'UI:WelcomePopup:Button:Acknowledge'|dict_s, 'bIsSubmit': false } %} +
+
+{% endfor %}
+
+{% if messages|length > 1 %} + {% for message in messages %} + + {% endfor %} +{% endif %} +
+
+ + diff --git a/templates/pages/backoffice/welcome_popup/welcome_popup.ready.js.twig b/templates/pages/backoffice/welcome_popup/welcome_popup.ready.js.twig index 48097df021..6be19799db 100644 --- a/templates/pages/backoffice/welcome_popup/welcome_popup.ready.js.twig +++ b/templates/pages/backoffice/welcome_popup/welcome_popup.ready.js.twig @@ -1,14 +1,38 @@ -$('#welcome_popup').dialog( { width:'60%', height: 'auto', title: '{{ 'UI:WelcomeMenu:Title'|dict_s }}', autoOpen: true, modal:true, - close: function() { - var bDisplay = $('#display_welcome_popup:checked').length; - SetUserPreference('welcome_popup', bDisplay, true); - }, - buttons: [{ - text: "{{ 'UI:Button:Ok'|dict_s }}", click: function() { - $(this).dialog( "close" ); $(this).remove(); - }}], +$('#welcome_popup_dialog').removeClass('ibo-is-hidden'); +$('#welcome_popup_dialog').dialog({ + modal: true, + width: '60%', + autoOpen: true, + title: $('div[data_role=welcome-popup-title]').first().attr('data-title'), + close: function() { $('#welcome_popup_dialog').remove(); } + }); +$('.ui-widget-overlay').click(function() { $('#welcome_popup_dialog').dialog('close'); } ); +$('.ibo-welcome-popup--indicator').click(function() { + const id = $(this).attr('data-message-uuid'); + const escaped_id = id.replace(/\\/g, '\\\\'); // All backslashes must be doubled in a jQuery selector + const new_title = $('.ibo-welcome-popup--message[data-message-uuid="'+escaped_id+'"]').attr('data-title'); + $('.ibo-welcome-popup--message').addClass('ibo-is-hidden'); + $('.ibo-welcome-popup--indicator').removeClass('ibo-welcome-popup--active'); + $('.ibo-welcome-popup--message[data-message-uuid="'+escaped_id+'"]').removeClass('ibo-is-hidden'); + $('.ibo-welcome-popup--indicator[data-message-uuid="'+escaped_id+'"]').addClass('ibo-welcome-popup--active'); + $('#welcome_popup_dialog').dialog('option', 'title', new_title); + $('.ibo-welcome-popup--message[data-message-uuid="'+escaped_id+'"] button').focus(); +}); +$('.ibo-welcome-popup--button').click('button', function() { + const id = $(this).attr('data-message-uuid'); + $.post(GetAbsoluteUrlAppRoot()+'pages/ajax.render.php', {operation: 'welcome_popup.acknowledge_message', message_uuid: id}); + const escaped_id = id.replace(/\\/g, '\\\\');; // All backslashes must be doubled in a jQuery selector + $('.ibo-welcome-popup--message[data-message-uuid="'+escaped_id+'"]').remove(); + if($('.ibo-welcome-popup--message').length == 0) { + // Last message, close the dialog + $('#welcome_popup_dialog').dialog('close'); + } else { + // Move the active state to the next message + $('.ibo-welcome-popup--indicator[data-message-uuid="'+escaped_id+'"]').siblings().first().trigger('click'); + $('.ibo-welcome-popup--indicator[data-message-uuid="'+escaped_id+'"]').remove(); + if ($('.ibo-welcome-popup--indicator').length == 1) { + // Last indicator, remove it + $('.ibo-welcome-popup--indicator').remove(); + } + } }); -if ($('#welcome_popup').height() > ($(window).height()-70)) -{ - $('#welcome_popup').height($(window).height()-70); -} diff --git a/tests/php-unit-tests/unitary-tests/application/WelcomePopup/WelcomePopupTest.php b/tests/php-unit-tests/unitary-tests/application/WelcomePopup/WelcomePopupTest.php new file mode 100644 index 0000000000..25bc328712 --- /dev/null +++ b/tests/php-unit-tests/unitary-tests/application/WelcomePopup/WelcomePopupTest.php @@ -0,0 +1,221 @@ +assertTrue($bResult); + $this->assertEquals($aExpected, $aToSort); + } + + /** + * Data provider for testSortOnImportance + * @return array[][]|string[][][][]|number[][][][] + */ + public function sortOnImportanceDataProvider() + { + return [ + 'empty array' => [ + 'to-sort' => [], + 'expected' => [], + ], + '3-item array' => [ + 'to-sort' => [ + ['id' => 'aa1', 'title' => 'AA1', 'importance' => 0 /*iWelcomePopup::IMPORTANCE_CRITICAL*/], + ['id' => 'aa2', 'title' => 'AA2', 'importance' => 1 /*iWelcomePopup::IMPORTANCE_HIGH*/], + ['id' => 'aa3', 'title' => 'AA3', 'importance' => 0 /*iWelcomePopup::IMPORTANCE_CRITICAL*/], + ], + 'expected' => [ + ['id' => 'aa1', 'title' => 'AA1', 'importance' => 0 /*iWelcomePopup::IMPORTANCE_CRITICAL*/], + ['id' => 'aa3', 'title' => 'AA3', 'importance' => 0 /*iWelcomePopup::IMPORTANCE_CRITICAL*/], + ['id' => 'aa2', 'title' => 'AA2', 'importance' => 1 /*iWelcomePopup::IMPORTANCE_HIGH*/], + ], + ], + '5-item array' => [ + 'to-sort' => [ + ['id' => 'aa1', 'title' => 'AA1', 'importance' => 0 /*iWelcomePopup::IMPORTANCE_CRITICAL*/], + ['id' => 'aa2', 'title' => 'AA2', 'importance' => 1 /*iWelcomePopup::IMPORTANCE_HIGH*/], + ['id' => 'aa3', 'title' => 'AA3', 'importance' => 0 /*iWelcomePopup::IMPORTANCE_CRITICAL*/], + ['id' => 'zz1', 'title' => 'ZZ1', 'importance' => 0 /*iWelcomePopup::IMPORTANCE_CRITICAL*/], + ['id' => 'zz2', 'title' => 'ZZ2', 'importance' => 1 /*iWelcomePopup::IMPORTANCE_HIGH*/], + ], + 'expected' => [ + ['id' => 'aa1', 'title' => 'AA1', 'importance' => 0 /*iWelcomePopup::IMPORTANCE_CRITICAL*/], + ['id' => 'aa3', 'title' => 'AA3', 'importance' => 0 /*iWelcomePopup::IMPORTANCE_CRITICAL*/], + ['id' => 'zz1', 'title' => 'ZZ1', 'importance' => 0 /*iWelcomePopup::IMPORTANCE_CRITICAL*/], + ['id' => 'aa2', 'title' => 'AA2', 'importance' => 1 /*iWelcomePopup::IMPORTANCE_HIGH*/], + ['id' => 'zz2', 'title' => 'ZZ2', 'importance' => 1 /*iWelcomePopup::IMPORTANCE_HIGH*/], + ], + ], + ]; + } + + /** + * @dataProvider isMessageAcknowledgedDataProvider + */ + public function testIsMessageAcknowledged($sMessageId, $aCache, $bExpected) + { + $oService = new WelcomePopupService(); + $this->InvokeNonPublicMethod(WelcomePopupService::class, 'SetAcknowledgedMessagesCache', $oService, [$aCache]); + + $this->assertEquals($bExpected, $this->InvokeNonPublicMethod(WelcomePopupService::class, 'IsMessageAcknowledged', $oService, [$sMessageId])); + } + + public function isMessageAcknowledgedDataProvider() + { + return [ + 'empty-cache' => [ + '123', [], false, + ], + 'acknowledged' => [ + '123', ['123'], true, + ], + 'non-acknowledged' => [ + '456', ['123'], false, + ], + ]; + } + + /** + * @dataProvider isMessageValidDataProvider + */ + public function testIsMessageValid($aMessage, $bExpected) + { + $oService = new WelcomePopupService(); + $aReasons = []; + $bResult = $this->InvokeNonPublicMethod(WelcomePopupService::class, 'IsMessageValid', $oService, [$aMessage, &$aReasons]); + if ($bResult !== $bExpected) { + print_r($aReasons); + } + $this->assertEquals($bExpected, $bResult); + if ($bResult) { + $this->assertEquals(0, count($aReasons)); + } else { + $this->assertNotEquals(0, count($aReasons)); + } + } + + public function isMessageValidDataProvider() + { + return [ + 'not an array' => [ + '123', false, + ], + 'empty array' => [ + [], false, + ], + 'missing id' => [ + ['title' => 'foo', 'importance' => 0, 'html' => '

Hello

'], false, + ], + 'message Ok (html)' => [ + ['id' => '123', 'title' => 'foo', 'importance' => 0, 'html' => '

Hello

'], true, + ], + 'message Ok (twig)' => [ + ['id' => '123', 'title' => 'foo', 'importance' => 0, 'twig' => '/some/path'], true, + ], + 'missing html and twig' => [ + ['id' => '123', 'title' => 'foo', 'importance' => 0], false, + ], + ]; + } + + public function testProcessMessages() + { + // Mock a WelcomePopup message provider, with a fixed class name + $oProvider1 = $this->getMockBuilder(iWelcomePopup::class)->setMockClassName('Provider1')->getMock(); + $oProvider1->expects($this->once())->method('GetMessages')->willReturn([ + ['id' => '123', 'title' => 'foo', 'importance' => 0, 'html' => '

Hello Foo

'], + ['id' => '456', 'title' => 'bar', 'importance' => 1, 'html' => '

Hello Bar

'], // Already acknowledged will be skipped + ]); + + // Mock another WelcomePopup message provider, with a different class name + $oProvider2 = $this->getMockBuilder(iWelcomePopup::class)->setMockClassName('Provider2')->getMock(); + $oProvider2->expects($this->once())->method('GetMessages')->willReturn([ + ['id' => '789', 'title' => 'Ga', 'importance' => 1, 'html' => '

Hello Ga

'], + ['id' => '012', 'title' => 'Bu', 'importance' => 0, 'twig' => 'ga/bu/zo'], + ['id' => '000', 'title' => 'Bu', 'importance' => 0], // Invalid, will be ignored + ]); + $oService = new WelcomePopupService(); + $this->InvokeNonPublicMethod(WelcomePopupService::class, 'SetAcknowledgedMessagesCache', $oService, [[get_class($oProvider1).'::456']]); + $this->InvokeNonPublicMethod(WelcomePopupService::class, 'SetMessagesProviders', $oService, [[$oProvider1, $oProvider2]]); + + $aMessages = $this->InvokeNonPublicMethod(WelcomePopupService::class, 'ProcessMessages', $oService, []); + $this->assertEquals( + [ + ['id' => '012', 'title' => 'Bu', 'importance' => 0, 'twig' => 'ga/bu/zo', 'uuid' => 'Provider2::012'], + ['id' => '123', 'title' => 'foo', 'importance' => 0, 'html' => '

Hello Foo

', 'uuid' => 'Provider1::123'], + ['id' => '789', 'title' => 'Ga', 'importance' => 1, 'html' => '

Hello Ga

', 'uuid' => 'Provider2::789'], + ], + $aMessages + ); + } + + + public function testAcknowledgeMessage() + { + self::CreateUser('admin-testAcknowledgeMessage', 1, '-Passw0rd!Complex-'); + UserRights::Login('admin-testAcknowledgeMessage'); + + // Mock a WelcomePopup message provider, with a fixed class name + $oProvider1 = $this->getMockBuilder(iWelcomePopup::class)->setMockClassName('Provider1')->getMock(); + $oProvider1->expects($this->exactly(2))->method('AcknowledgeMessage'); + + // Mock another WelcomePopup message provider, with a different class name + $oProvider2 = $this->getMockBuilder(iWelcomePopup::class)->setMockClassName('Provider2')->getMock(); + $oProvider2->expects($this->exactly(1))->method('AcknowledgeMessage'); + + $sMessageUUID1 = get_class($oProvider1).'::0123456'; + $sMessageUUID2 = get_class($oProvider1).'::456789'; + $sMessageUUID3 = get_class($oProvider2).'::456789'; // Same message id but different provider / UUID + $oService = new WelcomePopupService(); + + $this->InvokeNonPublicMethod(WelcomePopupService::class, 'SetMessagesProviders', $oService, [[$oProvider1, $oProvider2]]); + + $oService->AcknowledgeMessage($sMessageUUID1); + $this->assertTrue($this->InvokeNonPublicMethod(WelcomePopupService::class, 'IsMessageAcknowledged', $oService, [$sMessageUUID1])); + $this->assertFalse($this->InvokeNonPublicMethod(WelcomePopupService::class, 'IsMessageAcknowledged', $oService, ['-This-Message-Id-Is-Not-Ack0ledg3dged!'])); + $this->assertFalse($this->InvokeNonPublicMethod(WelcomePopupService::class, 'IsMessageAcknowledged', $oService, [$sMessageUUID3])); + + $oService->AcknowledgeMessage($sMessageUUID2); + $this->assertTrue($this->InvokeNonPublicMethod(WelcomePopupService::class, 'IsMessageAcknowledged', $oService, [$sMessageUUID1])); + $this->assertTrue($this->InvokeNonPublicMethod(WelcomePopupService::class, 'IsMessageAcknowledged', $oService, [$sMessageUUID2])); + $this->assertFalse($this->InvokeNonPublicMethod(WelcomePopupService::class, 'IsMessageAcknowledged', $oService, ['-This-Message-Id-Is-Not-Ack0ledg3dged!'])); + $this->assertFalse($this->InvokeNonPublicMethod(WelcomePopupService::class, 'IsMessageAcknowledged', $oService, [$sMessageUUID3])); + + $oService->AcknowledgeMessage($sMessageUUID3); + $this->assertTrue($this->InvokeNonPublicMethod(WelcomePopupService::class, 'IsMessageAcknowledged', $oService, [$sMessageUUID3])); + } + + /** + * @dataProvider makeStringFitInProvider + */ + public function testMakeStringFitIn($sInput, $iLimit, $sExpected) + { + $oService = new WelcomePopupService(); + $sFitted = $this->InvokeNonPublicMethod(WelcomePopupService::class, 'MakeStringFitIn', $oService, [$sInput, $iLimit]); + $this->assertTrue(mb_strlen($sFitted) <= $iLimit); + $this->assertEquals($sExpected, $sFitted); + } + + public function makeStringFitInProvider() + { + return [ + 'Simple (no truncation)' => ['/Some/Short/EnoughName', 50, '/Some/Short/EnoughName'], + 'Very long (truncated)' => ['/Some/Very/Loooooooooooooooooooooooooooong/Naaaaaaaaaaaaaaaaaaaaaaaaaame', 50, '4769a98d57a0f2e9b99483f780833faf-aaaaaaaaaaaaaaame'], + 'Long More aggressive truncation' => ['/Some/Very/Loooooooooooooooooooooooooooong/Naaaaaaaaaaaaaaaaaaaaaaaaaame', 45, '4769a98d57a0f2e9b99483f780833faf-aaaaaaaaaame'], + ]; + } + +} + From 9d6f4569efb3cc592fff68a00056037ab2e2895d Mon Sep 17 00:00:00 2001 From: "denis.flaven@combodo.com" Date: Tue, 30 May 2023 08:00:32 +0200 Subject: [PATCH 44/44] Adapt Welcome Popup API for the 3.0.x branch --- pages/ajax.render.php | 44 +++++++++---------- sources/Controller/WelcomePopupController.php | 2 +- .../welcome_popup/welcome_popup.ready.js.twig | 2 +- 3 files changed, 23 insertions(+), 25 deletions(-) diff --git a/pages/ajax.render.php b/pages/ajax.render.php index 0ca194927a..773bff0622 100644 --- a/pages/ajax.render.php +++ b/pages/ajax.render.php @@ -2691,33 +2691,31 @@ EOF $oAjaxRenderController->GetMenusCount($oPage); break; - //-------------------------------- - // WelcomePopupMenu - //-------------------------------- - case 'welcome_popup.acknowledge_message': - $oPage = new JsonPage(); - try { - $oController = new WelcomePopupController(); - $oController->AcknowledgeMessage(); - $aResult = ['success' => true]; - } - catch (Exception $oException) { - $aResult = [ - 'success' => false, - 'error_message' => $oException->getMessage(), - ]; - } - $oPage->SetData($aResult); - break; + //-------------------------------- + // WelcomePopupMenu + //-------------------------------- + case 'welcome_popup_acknowledge_message': + $oPage = new JsonPage(); + try { + $oController = new WelcomePopupController(); + $oController->AcknowledgeMessage(); + $aResult = ['success' => true]; + } + catch (Exception $oException) { + $aResult = [ + 'success' => false, + 'error_message' => $oException->getMessage(), + ]; + } + $oPage->SetData($aResult); + break; - default: - $oPage->p("Invalid query."); - } + default: + $oPage->p("Invalid query."); } $oKPI->ComputeAndReport('Data fetch and format'); $oPage->output(); -} catch (Exception $e) -{ +} catch (Exception $e) { // note: transform to cope with XSS attacks echo htmlentities($e->GetMessage(), ENT_QUOTES, 'utf-8'); IssueLog::Error($e->getMessage()."\nDebug trace:\n".$e->getTraceAsString()); diff --git a/sources/Controller/WelcomePopupController.php b/sources/Controller/WelcomePopupController.php index cb7989203b..1919b30924 100644 --- a/sources/Controller/WelcomePopupController.php +++ b/sources/Controller/WelcomePopupController.php @@ -9,7 +9,7 @@ use utils; * @since 3.1.0 * */ -class WelcomePopupController extends AbstractController +class WelcomePopupController { /** * Operation: welcome_popup.acknowledge_message diff --git a/templates/pages/backoffice/welcome_popup/welcome_popup.ready.js.twig b/templates/pages/backoffice/welcome_popup/welcome_popup.ready.js.twig index 6be19799db..35959ec5f3 100644 --- a/templates/pages/backoffice/welcome_popup/welcome_popup.ready.js.twig +++ b/templates/pages/backoffice/welcome_popup/welcome_popup.ready.js.twig @@ -20,7 +20,7 @@ $('.ibo-welcome-popup--indicator').click(function() { }); $('.ibo-welcome-popup--button').click('button', function() { const id = $(this).attr('data-message-uuid'); - $.post(GetAbsoluteUrlAppRoot()+'pages/ajax.render.php', {operation: 'welcome_popup.acknowledge_message', message_uuid: id}); + $.post(GetAbsoluteUrlAppRoot()+'pages/ajax.render.php', {operation: 'welcome_popup_acknowledge_message', message_uuid: id}); const escaped_id = id.replace(/\\/g, '\\\\');; // All backslashes must be doubled in a jQuery selector $('.ibo-welcome-popup--message[data-message-uuid="'+escaped_id+'"]').remove(); if($('.ibo-welcome-popup--message').length == 0) {