diff --git a/application/menunode.class.inc.php b/application/menunode.class.inc.php index 0ae6a96b1..244209db6 100644 --- a/application/menunode.class.inc.php +++ b/application/menunode.class.inc.php @@ -125,9 +125,7 @@ class ApplicationMenu */ public static function CheckMenuIdEnabled($sMenuId) { - self::LoadAdditionalMenus(); - $oMenuNode = self::GetMenuNode(self::GetMenuIndexById($sMenuId)); - if (is_null($oMenuNode) || !$oMenuNode->IsEnabled()) + if (self::IsMenuIdEnabled($sMenuId) === false) { require_once(APPROOT.'/setup/setuppage.class.inc.php'); $oP = new ErrorPage(Dict::S('UI:PageTitle:FatalError')); @@ -138,6 +136,19 @@ class ApplicationMenu } } + /** + * @param $sMenuId + * + * @return bool true if the menu exists and current user is allowed to see the menu + * @since 3.2.0 + */ + public static function IsMenuIdEnabled($sMenuId):bool + { + self::LoadAdditionalMenus(); + $oMenuNode = self::GetMenuNode(self::GetMenuIndexById($sMenuId)); + return is_null($oMenuNode) === false && $oMenuNode->IsEnabled(); + } + /** * Main function to add a menu entry into the application, can be called during the definition * of the data model objects diff --git a/css/backoffice/layout/object/_object-details.scss b/css/backoffice/layout/object/_object-details.scss index e31cfc01b..3458a048d 100644 --- a/css/backoffice/layout/object/_object-details.scss +++ b/css/backoffice/layout/object/_object-details.scss @@ -83,6 +83,7 @@ $ibo-object-details--header-right--padding-right--is-sticking: $ibo-spacing-300 .ibo-object-details--status + .ibo-object-details--object-class { margin-left: 0.5rem; + display: inline-flex; /* To avoid having spaces around the class name due to the indentation */ &::before { content: "("; diff --git a/dictionaries/ui/layouts/object-details/cs.dictionary.itop.object-details.php b/dictionaries/ui/layouts/object-details/cs.dictionary.itop.object-details.php index 14ab9d9f0..bb6b1fb6d 100644 --- a/dictionaries/ui/layouts/object-details/cs.dictionary.itop.object-details.php +++ b/dictionaries/ui/layouts/object-details/cs.dictionary.itop.object-details.php @@ -9,4 +9,5 @@ Dict::Add('CS CZ', 'Czech', 'Čeština', [ 'UI:Layout:ObjectDetails:KeyboardShortcut:NewObject' => 'Create a new object (with same class as displayed object)~~', 'UI:Layout:ObjectDetails:KeyboardShortcut:SaveObject' => 'Save displayed object~~', 'UI:Layout:ObjectDetails:New:Modal:Title' => 'Creation of an object~~', + 'UI:Layout:ObjectDetails:DatamodelSchemaLink:Tooltip' => 'Class data model schema~~', ]); diff --git a/dictionaries/ui/layouts/object-details/da.dictionary.itop.object-details.php b/dictionaries/ui/layouts/object-details/da.dictionary.itop.object-details.php index 3e490f554..0f993485a 100644 --- a/dictionaries/ui/layouts/object-details/da.dictionary.itop.object-details.php +++ b/dictionaries/ui/layouts/object-details/da.dictionary.itop.object-details.php @@ -9,4 +9,5 @@ Dict::Add('DA DA', 'Danish', 'Dansk', [ 'UI:Layout:ObjectDetails:KeyboardShortcut:NewObject' => 'Create a new object (with same class as displayed object)~~', 'UI:Layout:ObjectDetails:KeyboardShortcut:SaveObject' => 'Save displayed object~~', 'UI:Layout:ObjectDetails:New:Modal:Title' => 'Creation of an object~~', + 'UI:Layout:ObjectDetails:DatamodelSchemaLink:Tooltip' => 'Class data model schema~~', ]); diff --git a/dictionaries/ui/layouts/object-details/de.dictionary.itop.object-details.php b/dictionaries/ui/layouts/object-details/de.dictionary.itop.object-details.php index 88984c806..c1526041c 100644 --- a/dictionaries/ui/layouts/object-details/de.dictionary.itop.object-details.php +++ b/dictionaries/ui/layouts/object-details/de.dictionary.itop.object-details.php @@ -9,4 +9,5 @@ Dict::Add('DE DE', 'German', 'Deutsch', [ 'UI:Layout:ObjectDetails:KeyboardShortcut:NewObject' => 'Erzeuge eine neues Objekt (der gleichen Klasse, wie das angezeigte Objekt)', 'UI:Layout:ObjectDetails:KeyboardShortcut:SaveObject' => 'Speichere das angezeigte Objekt', 'UI:Layout:ObjectDetails:New:Modal:Title' => 'Erstellung eines Objekts', + 'UI:Layout:ObjectDetails:DatamodelSchemaLink:Tooltip' => 'Class data model schema~~', ]); diff --git a/dictionaries/ui/layouts/object-details/en.dictionary.itop.object-details.php b/dictionaries/ui/layouts/object-details/en.dictionary.itop.object-details.php index 310b667c7..9ef8bfcb5 100644 --- a/dictionaries/ui/layouts/object-details/en.dictionary.itop.object-details.php +++ b/dictionaries/ui/layouts/object-details/en.dictionary.itop.object-details.php @@ -10,4 +10,5 @@ Dict::Add('EN US', 'English', 'English', [ 'UI:Layout:ObjectDetails:KeyboardShortcut:NewObject' => 'Create a new object (with same class as displayed object)', 'UI:Layout:ObjectDetails:KeyboardShortcut:SaveObject' => 'Save displayed object', 'UI:Layout:ObjectDetails:New:Modal:Title' => 'Creation of an object', + 'UI:Layout:ObjectDetails:DatamodelSchemaLink:Tooltip' => 'Class data model schema', ]); diff --git a/dictionaries/ui/layouts/object-details/es_cr.dictionary.itop.object-details.php b/dictionaries/ui/layouts/object-details/es_cr.dictionary.itop.object-details.php index 0d0ab9d2c..a0e4e18cd 100644 --- a/dictionaries/ui/layouts/object-details/es_cr.dictionary.itop.object-details.php +++ b/dictionaries/ui/layouts/object-details/es_cr.dictionary.itop.object-details.php @@ -9,4 +9,5 @@ Dict::Add('ES CR', 'Spanish', 'Español, Castellano', [ 'UI:Layout:ObjectDetails:KeyboardShortcut:NewObject' => 'Crear un nuevo objeto (con la misma clase que el objeto mostrado)', 'UI:Layout:ObjectDetails:KeyboardShortcut:SaveObject' => 'Guardar objeto mostrado', 'UI:Layout:ObjectDetails:New:Modal:Title' => 'Creation of an object~~', + 'UI:Layout:ObjectDetails:DatamodelSchemaLink:Tooltip' => 'Class data model schema~~', ]); diff --git a/dictionaries/ui/layouts/object-details/fr.dictionary.itop.object-details.php b/dictionaries/ui/layouts/object-details/fr.dictionary.itop.object-details.php index 3c4f63461..0a7051ac5 100644 --- a/dictionaries/ui/layouts/object-details/fr.dictionary.itop.object-details.php +++ b/dictionaries/ui/layouts/object-details/fr.dictionary.itop.object-details.php @@ -9,4 +9,5 @@ Dict::Add('FR FR', 'French', 'Français', [ 'UI:Layout:ObjectDetails:KeyboardShortcut:NewObject' => 'Créer un nouvel objet (avec la même classe que l\'objet affiché)', 'UI:Layout:ObjectDetails:KeyboardShortcut:SaveObject' => 'Enregistrer l\'objet affiché', 'UI:Layout:ObjectDetails:New:Modal:Title' => 'Creation d\'un objet', + 'UI:Layout:ObjectDetails:DatamodelSchemaLink:Tooltip' => 'Schéma du modèle de données de la classe', ]); diff --git a/dictionaries/ui/layouts/object-details/hu.dictionary.itop.object-details.php b/dictionaries/ui/layouts/object-details/hu.dictionary.itop.object-details.php index 21de306ae..582d17731 100644 --- a/dictionaries/ui/layouts/object-details/hu.dictionary.itop.object-details.php +++ b/dictionaries/ui/layouts/object-details/hu.dictionary.itop.object-details.php @@ -9,4 +9,5 @@ Dict::Add('HU HU', 'Hungarian', 'Magyar', [ 'UI:Layout:ObjectDetails:KeyboardShortcut:NewObject' => 'Új objektum létrehozása (a megjelenített objektummal azonos osztályú)', 'UI:Layout:ObjectDetails:KeyboardShortcut:SaveObject' => 'Megjelenített objektum mentése', 'UI:Layout:ObjectDetails:New:Modal:Title' => 'Creation of an object~~', + 'UI:Layout:ObjectDetails:DatamodelSchemaLink:Tooltip' => 'Class data model schema~~', ]); diff --git a/dictionaries/ui/layouts/object-details/it.dictionary.itop.object-details.php b/dictionaries/ui/layouts/object-details/it.dictionary.itop.object-details.php index b1ba2861e..7249fd5ba 100644 --- a/dictionaries/ui/layouts/object-details/it.dictionary.itop.object-details.php +++ b/dictionaries/ui/layouts/object-details/it.dictionary.itop.object-details.php @@ -9,5 +9,5 @@ Dict::Add('IT IT', 'Italian', 'Italiano', [ 'UI:Layout:ObjectDetails:KeyboardShortcut:NewObject' => 'Crea un nuovo oggetto (con la stessa classe dell\'oggetto visualizzato)', 'UI:Layout:ObjectDetails:KeyboardShortcut:SaveObject' => 'Salva oggetto visualizzato', 'UI:Layout:ObjectDetails:New:Modal:Title' => 'Creazione di un oggetto', - + 'UI:Layout:ObjectDetails:DatamodelSchemaLink:Tooltip' => 'Class data model schema~~', ]); diff --git a/dictionaries/ui/layouts/object-details/ja.dictionary.itop.object-details.php b/dictionaries/ui/layouts/object-details/ja.dictionary.itop.object-details.php index aa1d1a03c..57f8833dc 100644 --- a/dictionaries/ui/layouts/object-details/ja.dictionary.itop.object-details.php +++ b/dictionaries/ui/layouts/object-details/ja.dictionary.itop.object-details.php @@ -9,4 +9,5 @@ Dict::Add('JA JP', 'Japanese', '日本語', [ 'UI:Layout:ObjectDetails:KeyboardShortcut:NewObject' => 'Create a new object (with same class as displayed object)~~', 'UI:Layout:ObjectDetails:KeyboardShortcut:SaveObject' => 'Save displayed object~~', 'UI:Layout:ObjectDetails:New:Modal:Title' => 'Creation of an object~~', + 'UI:Layout:ObjectDetails:DatamodelSchemaLink:Tooltip' => 'Class data model schema~~', ]); diff --git a/dictionaries/ui/layouts/object-details/nl.dictionary.itop.object-details.php b/dictionaries/ui/layouts/object-details/nl.dictionary.itop.object-details.php index 77783b718..3b84bfeb1 100644 --- a/dictionaries/ui/layouts/object-details/nl.dictionary.itop.object-details.php +++ b/dictionaries/ui/layouts/object-details/nl.dictionary.itop.object-details.php @@ -9,4 +9,5 @@ Dict::Add('NL NL', 'Dutch', 'Nederlands', [ 'UI:Layout:ObjectDetails:KeyboardShortcut:NewObject' => 'Maak een nieuw object (van dezelfde klasse als het getoonde object)', 'UI:Layout:ObjectDetails:KeyboardShortcut:SaveObject' => 'Bewaar huidig object', 'UI:Layout:ObjectDetails:New:Modal:Title' => 'Creation of an object~~', + 'UI:Layout:ObjectDetails:DatamodelSchemaLink:Tooltip' => 'Objecten schema van deze klasse', ]); diff --git a/dictionaries/ui/layouts/object-details/pl.dictionary.itop.object-details.php b/dictionaries/ui/layouts/object-details/pl.dictionary.itop.object-details.php index ac1562b33..74c66ef63 100644 --- a/dictionaries/ui/layouts/object-details/pl.dictionary.itop.object-details.php +++ b/dictionaries/ui/layouts/object-details/pl.dictionary.itop.object-details.php @@ -9,4 +9,5 @@ Dict::Add('PL PL', 'Polish', 'Polski', [ 'UI:Layout:ObjectDetails:KeyboardShortcut:NewObject' => 'Utwórz nowy obiekt (z tą samą klasą co wyświetlany obiekt)', 'UI:Layout:ObjectDetails:KeyboardShortcut:SaveObject' => 'Zapisz wyświetlany obiekt', 'UI:Layout:ObjectDetails:New:Modal:Title' => 'Creation of an object~~', + 'UI:Layout:ObjectDetails:DatamodelSchemaLink:Tooltip' => 'Class data model schema~~', ]); diff --git a/dictionaries/ui/layouts/object-details/pt_br.dictionary.itop.object-details.php b/dictionaries/ui/layouts/object-details/pt_br.dictionary.itop.object-details.php index 638ac8778..ff1c258fa 100644 --- a/dictionaries/ui/layouts/object-details/pt_br.dictionary.itop.object-details.php +++ b/dictionaries/ui/layouts/object-details/pt_br.dictionary.itop.object-details.php @@ -9,4 +9,5 @@ Dict::Add('PT BR', 'Brazilian', 'Brazilian', [ 'UI:Layout:ObjectDetails:KeyboardShortcut:NewObject' => 'Criar um novo objeto (com a mesma classe do objeto atual)', 'UI:Layout:ObjectDetails:KeyboardShortcut:SaveObject' => 'Salvar objeto atual', 'UI:Layout:ObjectDetails:New:Modal:Title' => 'Creation of an object~~', + 'UI:Layout:ObjectDetails:DatamodelSchemaLink:Tooltip' => 'Class data model schema~~', ]); diff --git a/dictionaries/ui/layouts/object-details/ru.dictionary.itop.object-details.php b/dictionaries/ui/layouts/object-details/ru.dictionary.itop.object-details.php index 1ba45d1a4..8dadab1fb 100644 --- a/dictionaries/ui/layouts/object-details/ru.dictionary.itop.object-details.php +++ b/dictionaries/ui/layouts/object-details/ru.dictionary.itop.object-details.php @@ -9,4 +9,5 @@ Dict::Add('RU RU', 'Russian', 'Русский', [ 'UI:Layout:ObjectDetails:KeyboardShortcut:NewObject' => 'Создать новый объект (того же класса, что и просматриваемый объект)', 'UI:Layout:ObjectDetails:KeyboardShortcut:SaveObject' => 'Сохранить просматриваемый объект', 'UI:Layout:ObjectDetails:New:Modal:Title' => 'Creation of an object~~', + 'UI:Layout:ObjectDetails:DatamodelSchemaLink:Tooltip' => 'Class data model schema~~', ]); diff --git a/dictionaries/ui/layouts/object-details/sk.dictionary.itop.object-details.php b/dictionaries/ui/layouts/object-details/sk.dictionary.itop.object-details.php index 0b724dfdb..9bdf9068a 100644 --- a/dictionaries/ui/layouts/object-details/sk.dictionary.itop.object-details.php +++ b/dictionaries/ui/layouts/object-details/sk.dictionary.itop.object-details.php @@ -9,4 +9,5 @@ Dict::Add('SK SK', 'Slovak', 'Slovenčina', [ 'UI:Layout:ObjectDetails:KeyboardShortcut:NewObject' => 'Create a new object (with same class as displayed object)~~', 'UI:Layout:ObjectDetails:KeyboardShortcut:SaveObject' => 'Save displayed object~~', 'UI:Layout:ObjectDetails:New:Modal:Title' => 'Creation of an object~~', + 'UI:Layout:ObjectDetails:DatamodelSchemaLink:Tooltip' => 'Class data model schema~~', ]); diff --git a/dictionaries/ui/layouts/object-details/tr.dictionary.itop.object-details.php b/dictionaries/ui/layouts/object-details/tr.dictionary.itop.object-details.php index c5aff0bfb..19a124791 100644 --- a/dictionaries/ui/layouts/object-details/tr.dictionary.itop.object-details.php +++ b/dictionaries/ui/layouts/object-details/tr.dictionary.itop.object-details.php @@ -9,4 +9,5 @@ Dict::Add('TR TR', 'Turkish', 'Türkçe', [ 'UI:Layout:ObjectDetails:KeyboardShortcut:NewObject' => 'Create a new object (with same class as displayed object)~~', 'UI:Layout:ObjectDetails:KeyboardShortcut:SaveObject' => 'Save displayed object~~', 'UI:Layout:ObjectDetails:New:Modal:Title' => 'Creation of an object~~', + 'UI:Layout:ObjectDetails:DatamodelSchemaLink:Tooltip' => 'Class data model schema~~', ]); diff --git a/dictionaries/ui/layouts/object-details/zh_cn.dictionary.itop.object-details.php b/dictionaries/ui/layouts/object-details/zh_cn.dictionary.itop.object-details.php index c1386b376..5a2b96c00 100644 --- a/dictionaries/ui/layouts/object-details/zh_cn.dictionary.itop.object-details.php +++ b/dictionaries/ui/layouts/object-details/zh_cn.dictionary.itop.object-details.php @@ -9,4 +9,5 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', [ 'UI:Layout:ObjectDetails:KeyboardShortcut:NewObject' => '创建新对象 (与当前对象相同)', 'UI:Layout:ObjectDetails:KeyboardShortcut:SaveObject' => '保存当前对象', 'UI:Layout:ObjectDetails:New:Modal:Title' => '创建对象', + 'UI:Layout:ObjectDetails:DatamodelSchemaLink:Tooltip' => 'Class data model schema~~', ]); diff --git a/sources/Application/TwigBase/Twig/Extension.php b/sources/Application/TwigBase/Twig/Extension.php index 7c9dd59f2..af7bffb13 100644 --- a/sources/Application/TwigBase/Twig/Extension.php +++ b/sources/Application/TwigBase/Twig/Extension.php @@ -7,6 +7,7 @@ namespace Combodo\iTop\Application\TwigBase\Twig; +use ApplicationMenu; use AttributeDate; use AttributeDateTime; use AttributeText; @@ -182,6 +183,13 @@ class Extension return utils::GetAbsoluteUrlModulesRoot(); }); + // Function to check if current user can access to the given menu + // Usage in twig: {% if is_backoffice_menu_enabled('DataModelMenu') %} + /** @since 3.2.0 */ + $aFunctions[] = new TwigFunction('is_backoffice_menu_enabled', function ($sMenuId) { + return ApplicationMenu::IsMenuIdEnabled($sMenuId); + }); + // Function to render a UI block (HTML, inline CSS, inline JS) and its sub blocks directly in the TWIG // Usage in twig: {{ render_block(oBlock) }} /** @since 3.0.0 */ diff --git a/templates/base/layouts/object/object-details/layout.html.twig b/templates/base/layouts/object/object-details/layout.html.twig index 15a03f817..3d1a604f7 100644 --- a/templates/base/layouts/object/object-details/layout.html.twig +++ b/templates/base/layouts/object/object-details/layout.html.twig @@ -17,6 +17,12 @@ {{ oUIBlock.GetStatusLabel() }} {% endif %} - {{ oUIBlock.GetClassLabel() }} + + {% if is_backoffice_menu_enabled('DataModelMenu') %} + {{ oUIBlock.GetClassLabel() }} + {% else %} + {{ oUIBlock.GetClassLabel() }} + {% endif %} + {{ parent() }} {% endblock %} \ No newline at end of file