* @package Combodo\iTop\Application\UI\Base\Layout\NavigationMenu * @internal * @since 3.0.0 */ class NavigationMenu extends UIBlock { // Overloaded constants public const BLOCK_CODE = 'ibo-navigation-menu'; public const DEFAULT_HTML_TEMPLATE_REL_PATH = 'base/layouts/navigation-menu/layout'; public const DEFAULT_JS_TEMPLATE_REL_PATH = 'base/layouts/navigation-menu/layout'; public const DEFAULT_JS_FILES_REL_PATH = [ 'js/layouts/navigation-menu.js', 'js/extkeywidget.js', 'js/forms-json-utils.js', ]; // Specific constants /** @var bool DEFAULT_SHOW_MENU_FILTER_HINT */ public const DEFAULT_SHOW_MENU_FILTER_HINT = true; /** @var string $sAppRevisionNumber */ protected $sAppRevisionNumber; /** @var string $sAppSquareIconUrl */ protected $sAppSquareIconUrl; /** @var string $sAppFullIconUrl */ protected $sAppFullIconUrl; /** @var string $sAppIconLink */ protected $sAppIconLink; /** @var array $aSiloSelection */ protected $aSiloSelection; /** @var array $aMenuGroups */ protected $aMenuGroups; /** @var array $aUserData */ protected $aUserData; /** @var \Combodo\iTop\Application\UI\Base\Component\PopoverMenu\PopoverMenu $oUserMenu */ private $oUserMenu; /** @var \Combodo\iTop\Application\UI\Base\Component\PopoverMenu\NewsroomMenu\NewsroomMenu $oNewsroomMenu */ private $oNewsroomMenu; /** @var bool $bIsExpanded */ protected $bIsExpanded; /** @var bool Whether the hint on how the menu filter works shoudl be displayed or not */ protected $bShowMenuFilterHint; /** * NavigationMenu constructor. * * @param \ApplicationContext $oAppContext * @param \Combodo\iTop\Application\UI\Base\Component\PopoverMenu\PopoverMenu $oUserMenu * @param \Combodo\iTop\Application\UI\Base\Component\PopoverMenu\NewsroomMenu\NewsroomMenu|null $oNewsroomMenu * @param string|null $sId * * @throws \CoreException * @throws \CoreUnexpectedValue * @throws \DictExceptionMissingString * @throws \MySQLException * @throws \Exception */ public function __construct( ApplicationContext $oAppContext, PopoverMenu $oUserMenu, NewsroomMenu $oNewsroomMenu = null, ?string $sId = null ) { parent::__construct($sId); $this->sAppRevisionNumber = utils::GetAppRevisionNumber(); $this->sAppSquareIconUrl = Branding::GetCompactMainLogoAbsoluteUrl(); $this->sAppFullIconUrl = Branding::GetFullMainLogoAbsoluteUrl(); $this->sAppIconLink = MetaModel::GetConfig()->Get('app_icon_url'); $this->aSiloSelection = array(); $this->aMenuGroups = ApplicationMenu::GetMenuGroups($oAppContext->GetAsHash()); $this->oUserMenu = $oUserMenu; $this->oNewsroomMenu = $oNewsroomMenu; $this->ComputeExpandedState(); $this->ComputeMenuFilterHintState(); $this->ComputeUserData(); $this->ComputeSiloSelection(); } /** * @return string */ public function GetAppRevisionNumber() { return $this->sAppRevisionNumber; } /** * @return string */ public function GetAppSquareIconUrl() { return $this->sAppSquareIconUrl; } /** * @return string */ public function GetAppFullIconUrl() { return $this->sAppFullIconUrl; } /** * @return string */ public function GetAppIconLink() { return $this->sAppIconLink; } /** * @return array */ public function GetSiloSelection() { return $this->aSiloSelection; } /** * @return array */ public function GetMenuGroups() { return $this->aMenuGroups; } /** * @return array */ public function GetUserData() { return $this->aUserData; } /** * @return \Combodo\iTop\Application\UI\Base\Component\PopoverMenu\PopoverMenu */ public function GetUserMenu() { return $this->oUserMenu; } /** * @return \Combodo\iTop\Application\UI\Base\Component\PopoverMenu\NewsroomMenu\NewsroomMenu */ public function GetNewsroomMenu() { return $this->oNewsroomMenu; } /** * Return true if the menu is expanded * * @return bool */ public function IsExpanded() { return $this->bIsExpanded; } /** * @uses $bShowMenuFilterHint * @return bool */ public function HasMenuFilterHint(): bool { return $this->bShowMenuFilterHint; } /** * @inheritDoc */ public function GetSubBlocks() { return [$this->oUserMenu->GetId() => $this->oUserMenu, $this->GetNewsroomMenu()->GetId() => $this->GetNewsroomMenu()]; } /** * @return boolean */ public function IsNewsroomEnabled() { return MetaModel::GetConfig()->Get('newsroom_enabled'); } /** * @return void * @throws \CoreException * @throws \CoreUnexpectedValue * @throws \MySQLException */ public function ComputeSiloSelection() { //TODO 3.0 Use components if we have the time to build select/autocomplete components before release // List of visible Organizations $iCount = 0; $oSet = null; if (MetaModel::IsValidClass('Organization')) { // Display the list of *favorite* organizations... but keeping in mind what is the real number of organizations $aFavoriteOrgs = appUserPreferences::GetPref('favorite_orgs', null); $oSearchFilter = new DBObjectSearch('Organization'); $oSearchFilter->SetModifierProperty('UserRightsGetSelectFilter', 'bSearchMode', true); $oSet = new CMDBObjectSet($oSearchFilter); $iCount = $oSet->Count(); // total number of existing Orgs // Now get the list of Orgs to be displayed in the menu $oSearchFilter = DBObjectSearch::FromOQL(ApplicationMenu::GetFavoriteSiloQuery()); $oSearchFilter->SetModifierProperty('UserRightsGetSelectFilter', 'bSearchMode', true); if (!empty($aFavoriteOrgs)) { $oSearchFilter->AddCondition('id', $aFavoriteOrgs, 'IN'); } $oSet = new CMDBObjectSet($oSearchFilter); // List of favorite orgs } switch ($iCount) { case 0: case 1: // No such dimension/silo or only one possible choice => nothing to select break; default: $oAppContext = new ApplicationContext(); $iCurrentOrganization = $oAppContext->GetCurrentValue('org_id'); $this->aSiloSelection['html'] = '
'; //