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