N°7194 - Add link to datamodel class schema on object details (#613)

This commit is contained in:
Anne-Catherine
2024-03-26 11:35:44 +01:00
committed by GitHub
parent 12b30c1531
commit 279b29a98c
20 changed files with 46 additions and 5 deletions

View File

@@ -125,9 +125,7 @@ class ApplicationMenu
*/ */
public static function CheckMenuIdEnabled($sMenuId) public static function CheckMenuIdEnabled($sMenuId)
{ {
self::LoadAdditionalMenus(); if (self::IsMenuIdEnabled($sMenuId) === false)
$oMenuNode = self::GetMenuNode(self::GetMenuIndexById($sMenuId));
if (is_null($oMenuNode) || !$oMenuNode->IsEnabled())
{ {
require_once(APPROOT.'/setup/setuppage.class.inc.php'); require_once(APPROOT.'/setup/setuppage.class.inc.php');
$oP = new ErrorPage(Dict::S('UI:PageTitle:FatalError')); $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 * Main function to add a menu entry into the application, can be called during the definition
* of the data model objects * of the data model objects

View File

@@ -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 { .ibo-object-details--status + .ibo-object-details--object-class {
margin-left: 0.5rem; margin-left: 0.5rem;
display: inline-flex; /* To avoid having spaces around the class name due to the indentation */
&::before { &::before {
content: "("; content: "(";

View File

@@ -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:NewObject' => 'Create a new object (with same class as displayed object)~~',
'UI:Layout:ObjectDetails:KeyboardShortcut:SaveObject' => 'Save displayed object~~', 'UI:Layout:ObjectDetails:KeyboardShortcut:SaveObject' => 'Save displayed object~~',
'UI:Layout:ObjectDetails:New:Modal:Title' => 'Creation of an object~~', 'UI:Layout:ObjectDetails:New:Modal:Title' => 'Creation of an object~~',
'UI:Layout:ObjectDetails:DatamodelSchemaLink:Tooltip' => 'Class data model schema~~',
]); ]);

View File

@@ -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:NewObject' => 'Create a new object (with same class as displayed object)~~',
'UI:Layout:ObjectDetails:KeyboardShortcut:SaveObject' => 'Save displayed object~~', 'UI:Layout:ObjectDetails:KeyboardShortcut:SaveObject' => 'Save displayed object~~',
'UI:Layout:ObjectDetails:New:Modal:Title' => 'Creation of an object~~', 'UI:Layout:ObjectDetails:New:Modal:Title' => 'Creation of an object~~',
'UI:Layout:ObjectDetails:DatamodelSchemaLink:Tooltip' => 'Class data model schema~~',
]); ]);

View File

@@ -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:NewObject' => 'Erzeuge eine neues Objekt (der gleichen Klasse, wie das angezeigte Objekt)',
'UI:Layout:ObjectDetails:KeyboardShortcut:SaveObject' => 'Speichere das angezeigte Objekt', 'UI:Layout:ObjectDetails:KeyboardShortcut:SaveObject' => 'Speichere das angezeigte Objekt',
'UI:Layout:ObjectDetails:New:Modal:Title' => 'Erstellung eines Objekts', 'UI:Layout:ObjectDetails:New:Modal:Title' => 'Erstellung eines Objekts',
'UI:Layout:ObjectDetails:DatamodelSchemaLink:Tooltip' => 'Class data model schema~~',
]); ]);

View File

@@ -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:NewObject' => 'Create a new object (with same class as displayed object)',
'UI:Layout:ObjectDetails:KeyboardShortcut:SaveObject' => 'Save displayed object', 'UI:Layout:ObjectDetails:KeyboardShortcut:SaveObject' => 'Save displayed object',
'UI:Layout:ObjectDetails:New:Modal:Title' => 'Creation of an object', 'UI:Layout:ObjectDetails:New:Modal:Title' => 'Creation of an object',
'UI:Layout:ObjectDetails:DatamodelSchemaLink:Tooltip' => 'Class data model schema',
]); ]);

View File

@@ -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:NewObject' => 'Crear un nuevo objeto (con la misma clase que el objeto mostrado)',
'UI:Layout:ObjectDetails:KeyboardShortcut:SaveObject' => 'Guardar objeto mostrado', 'UI:Layout:ObjectDetails:KeyboardShortcut:SaveObject' => 'Guardar objeto mostrado',
'UI:Layout:ObjectDetails:New:Modal:Title' => 'Creation of an object~~', 'UI:Layout:ObjectDetails:New:Modal:Title' => 'Creation of an object~~',
'UI:Layout:ObjectDetails:DatamodelSchemaLink:Tooltip' => 'Class data model schema~~',
]); ]);

View File

@@ -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: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:KeyboardShortcut:SaveObject' => 'Enregistrer l\'objet affiché',
'UI:Layout:ObjectDetails:New:Modal:Title' => 'Creation d\'un objet', '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',
]); ]);

View File

@@ -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: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:KeyboardShortcut:SaveObject' => 'Megjelenített objektum mentése',
'UI:Layout:ObjectDetails:New:Modal:Title' => 'Creation of an object~~', 'UI:Layout:ObjectDetails:New:Modal:Title' => 'Creation of an object~~',
'UI:Layout:ObjectDetails:DatamodelSchemaLink:Tooltip' => 'Class data model schema~~',
]); ]);

View File

@@ -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:NewObject' => 'Crea un nuovo oggetto (con la stessa classe dell\'oggetto visualizzato)',
'UI:Layout:ObjectDetails:KeyboardShortcut:SaveObject' => 'Salva oggetto visualizzato', 'UI:Layout:ObjectDetails:KeyboardShortcut:SaveObject' => 'Salva oggetto visualizzato',
'UI:Layout:ObjectDetails:New:Modal:Title' => 'Creazione di un oggetto', 'UI:Layout:ObjectDetails:New:Modal:Title' => 'Creazione di un oggetto',
'UI:Layout:ObjectDetails:DatamodelSchemaLink:Tooltip' => 'Class data model schema~~',
]); ]);

View File

@@ -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:NewObject' => 'Create a new object (with same class as displayed object)~~',
'UI:Layout:ObjectDetails:KeyboardShortcut:SaveObject' => 'Save displayed object~~', 'UI:Layout:ObjectDetails:KeyboardShortcut:SaveObject' => 'Save displayed object~~',
'UI:Layout:ObjectDetails:New:Modal:Title' => 'Creation of an object~~', 'UI:Layout:ObjectDetails:New:Modal:Title' => 'Creation of an object~~',
'UI:Layout:ObjectDetails:DatamodelSchemaLink:Tooltip' => 'Class data model schema~~',
]); ]);

View File

@@ -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:NewObject' => 'Maak een nieuw object (van dezelfde klasse als het getoonde object)',
'UI:Layout:ObjectDetails:KeyboardShortcut:SaveObject' => 'Bewaar huidig object', 'UI:Layout:ObjectDetails:KeyboardShortcut:SaveObject' => 'Bewaar huidig object',
'UI:Layout:ObjectDetails:New:Modal:Title' => 'Creation of an object~~', 'UI:Layout:ObjectDetails:New:Modal:Title' => 'Creation of an object~~',
'UI:Layout:ObjectDetails:DatamodelSchemaLink:Tooltip' => 'Objecten schema van deze klasse',
]); ]);

View File

@@ -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: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:KeyboardShortcut:SaveObject' => 'Zapisz wyświetlany obiekt',
'UI:Layout:ObjectDetails:New:Modal:Title' => 'Creation of an object~~', 'UI:Layout:ObjectDetails:New:Modal:Title' => 'Creation of an object~~',
'UI:Layout:ObjectDetails:DatamodelSchemaLink:Tooltip' => 'Class data model schema~~',
]); ]);

View File

@@ -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:NewObject' => 'Criar um novo objeto (com a mesma classe do objeto atual)',
'UI:Layout:ObjectDetails:KeyboardShortcut:SaveObject' => 'Salvar objeto atual', 'UI:Layout:ObjectDetails:KeyboardShortcut:SaveObject' => 'Salvar objeto atual',
'UI:Layout:ObjectDetails:New:Modal:Title' => 'Creation of an object~~', 'UI:Layout:ObjectDetails:New:Modal:Title' => 'Creation of an object~~',
'UI:Layout:ObjectDetails:DatamodelSchemaLink:Tooltip' => 'Class data model schema~~',
]); ]);

View File

@@ -9,4 +9,5 @@ Dict::Add('RU RU', 'Russian', 'Русский', [
'UI:Layout:ObjectDetails:KeyboardShortcut:NewObject' => 'Создать новый объект (того же класса, что и просматриваемый объект)', 'UI:Layout:ObjectDetails:KeyboardShortcut:NewObject' => 'Создать новый объект (того же класса, что и просматриваемый объект)',
'UI:Layout:ObjectDetails:KeyboardShortcut:SaveObject' => 'Сохранить просматриваемый объект', 'UI:Layout:ObjectDetails:KeyboardShortcut:SaveObject' => 'Сохранить просматриваемый объект',
'UI:Layout:ObjectDetails:New:Modal:Title' => 'Creation of an object~~', 'UI:Layout:ObjectDetails:New:Modal:Title' => 'Creation of an object~~',
'UI:Layout:ObjectDetails:DatamodelSchemaLink:Tooltip' => 'Class data model schema~~',
]); ]);

View File

@@ -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:NewObject' => 'Create a new object (with same class as displayed object)~~',
'UI:Layout:ObjectDetails:KeyboardShortcut:SaveObject' => 'Save displayed object~~', 'UI:Layout:ObjectDetails:KeyboardShortcut:SaveObject' => 'Save displayed object~~',
'UI:Layout:ObjectDetails:New:Modal:Title' => 'Creation of an object~~', 'UI:Layout:ObjectDetails:New:Modal:Title' => 'Creation of an object~~',
'UI:Layout:ObjectDetails:DatamodelSchemaLink:Tooltip' => 'Class data model schema~~',
]); ]);

View File

@@ -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:NewObject' => 'Create a new object (with same class as displayed object)~~',
'UI:Layout:ObjectDetails:KeyboardShortcut:SaveObject' => 'Save displayed object~~', 'UI:Layout:ObjectDetails:KeyboardShortcut:SaveObject' => 'Save displayed object~~',
'UI:Layout:ObjectDetails:New:Modal:Title' => 'Creation of an object~~', 'UI:Layout:ObjectDetails:New:Modal:Title' => 'Creation of an object~~',
'UI:Layout:ObjectDetails:DatamodelSchemaLink:Tooltip' => 'Class data model schema~~',
]); ]);

View File

@@ -9,4 +9,5 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', [
'UI:Layout:ObjectDetails:KeyboardShortcut:NewObject' => '创建新对象 (与当前对象相同)', 'UI:Layout:ObjectDetails:KeyboardShortcut:NewObject' => '创建新对象 (与当前对象相同)',
'UI:Layout:ObjectDetails:KeyboardShortcut:SaveObject' => '保存当前对象', 'UI:Layout:ObjectDetails:KeyboardShortcut:SaveObject' => '保存当前对象',
'UI:Layout:ObjectDetails:New:Modal:Title' => '创建对象', 'UI:Layout:ObjectDetails:New:Modal:Title' => '创建对象',
'UI:Layout:ObjectDetails:DatamodelSchemaLink:Tooltip' => 'Class data model schema~~',
]); ]);

View File

@@ -7,6 +7,7 @@
namespace Combodo\iTop\Application\TwigBase\Twig; namespace Combodo\iTop\Application\TwigBase\Twig;
use ApplicationMenu;
use AttributeDate; use AttributeDate;
use AttributeDateTime; use AttributeDateTime;
use AttributeText; use AttributeText;
@@ -182,6 +183,13 @@ class Extension
return utils::GetAbsoluteUrlModulesRoot(); 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 // 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) }} // Usage in twig: {{ render_block(oBlock) }}
/** @since 3.0.0 */ /** @since 3.0.0 */

View File

@@ -17,6 +17,12 @@
<span class="ibo-object-details--status-label" data-role="ibo-object-details--status-label">{{ oUIBlock.GetStatusLabel() }}</span> <span class="ibo-object-details--status-label" data-role="ibo-object-details--status-label">{{ oUIBlock.GetStatusLabel() }}</span>
</span> </span>
{% endif %} {% endif %}
<span class="ibo-object-details--object-class" data-role="ibo-object-details--object-class">{{ oUIBlock.GetClassLabel() }}</span> <span class="ibo-object-details--object-class" data-role="ibo-object-details--object-class">
{% if is_backoffice_menu_enabled('DataModelMenu') %}
<a href="{{ get_absolute_url_app_root() }}pages/schema.php?operation=details_class&class={{ oUIBlock.GetClassName() }}" target="_blank" data-tooltip-content="{{ 'UI:Layout:ObjectDetails:DatamodelSchemaLink:Tooltip' | dict_s }} <i class='fas fa-external-link-alt'></i>" data-tooltip-html-enabled="true">{{ oUIBlock.GetClassLabel() }}</a>
{% else %}
{{ oUIBlock.GetClassLabel() }}
{% endif %}
</span>
{{ parent() }} {{ parent() }}
{% endblock %} {% endblock %}