mirror of
https://github.com/Combodo/iTop.git
synced 2026-05-09 10:28:44 +02:00
N°8699 - attributedef.class.inc.php to PSR4 - fixs (#890)
This commit is contained in:
@@ -1035,7 +1035,7 @@ HTML
|
||||
// Add extra data for markup generation
|
||||
// - Attribute code and AttributeDef. class
|
||||
$val['attcode'] = $sAttCode;
|
||||
$val['atttype'] = $sAttDefClass;
|
||||
$val['atttype'] = $oAttDef->GetType();
|
||||
$val['attlabel'] = $sAttLabel;
|
||||
$val['attflags'] = ($bEditMode) ? $this->GetFormAttributeFlags($sAttCode) : OPT_ATT_READONLY;
|
||||
|
||||
@@ -4495,7 +4495,7 @@ HTML;
|
||||
|
||||
$oDivField = FieldUIBlockFactory::MakeLarge("");
|
||||
// UIContentBlockUIBlockFactory::MakeStandard(null,["field_container field_large"]);
|
||||
$oDivField->AddDataAttribute("attribute-type", $sAttDefClass);
|
||||
$oDivField->AddDataAttribute("attribute-type", $oAttDef->GetType());
|
||||
$oDivField->AddDataAttribute("attribute-label", $sAttMetaDataLabel);
|
||||
$oDivField->AddDataAttribute("attribute-flag-hidden", false);
|
||||
$oDivField->AddDataAttribute("attribute-flag-read-only", false);
|
||||
|
||||
@@ -3,9 +3,29 @@
|
||||
* @license http://opensource.org/licenses/AGPL-3.0
|
||||
*/
|
||||
|
||||
$ibo-datamodel-viewer--viewer-empty--width: max(20%, #{$ibo-size-700}) !default;
|
||||
|
||||
$ibo-datamodel-viewer--parent--spacer--padding-y: $ibo-spacing-0 !default;
|
||||
$ibo-datamodel-viewer--parent--spacer--padding-x: $ibo-spacing-300 !default;
|
||||
|
||||
$ibo-datamodel-viewer--breadcrumb--margin: $ibo-spacing-200 0 !default;
|
||||
|
||||
$ibo-datamodel-viewer--classname--font-family: monospace !default;
|
||||
$ibo-datamodel-viewer--classname--color: $ibo-color-blue-grey-600 !default;
|
||||
|
||||
$ibo-datamodel-viewer--tag--category--color: $ibo-color-blue-grey-800 !default;
|
||||
$ibo-datamodel-viewer--tag--category--icon--color: $ibo-color-blue-grey-600 !default;
|
||||
|
||||
$ibo-datamodel-viewer--abstract-class-icon--margin-right: $ibo-spacing-300 !default;
|
||||
$ibo-datamodel-viewer--abstract-class-icon--after--content: 'A' !default;
|
||||
$ibo-datamodel-viewer--abstract-class-icon--after--width: 15px !default;
|
||||
$ibo-datamodel-viewer--abstract-class-icon--after--height: 15px !default;
|
||||
$ibo-datamodel-viewer--abstract-class-icon--after--line-height: 14px !default;
|
||||
$ibo-datamodel-viewer--abstract-class-icon--after--border-radius: 50% !default;
|
||||
$ibo-datamodel-viewer--abstract-class-icon--after--border: 1px solid $ibo-color-cyan-500 !default;
|
||||
$ibo-datamodel-viewer--abstract-class-icon--after--color: $ibo-color-white-100 !default;
|
||||
$ibo-datamodel-viewer--abstract-class-icon--after--background-color: $ibo-color-cyan-500 !default;
|
||||
|
||||
$ibo-datamodel-viewer--classes-list--selectize-input--background-color: $ibo-color-white-100 !default;
|
||||
$ibo-datamodel-viewer--classes-list--selectize-input--color: $ibo-color-grey-800 !default;
|
||||
$ibo-datamodel-viewer--classes-list--selectize-input--border-color: $ibo-color-grey-500 !default;
|
||||
@@ -16,8 +36,9 @@ $ibo-datamodel-viewer--origin-cell--diameter: 8px !default;
|
||||
$ibo-datamodel-viewer--origin-cell--border-radius: $ibo-border-radius-full !default;
|
||||
|
||||
$ibo-datamodel-viewer--classes-list--height: 100% !default;
|
||||
$ibo-datamodel-viewer--classes-list--width: 350px !default;
|
||||
$ibo-datamodel-viewer--classes-list--width: $ibo-size-700 !default;
|
||||
$ibo-datamodel-viewer--classes-list--padding-left: $ibo-spacing-600 !default;
|
||||
$ibo-datamodel-viewer--classes-list--padding-top: $ibo-spacing-300 !default;
|
||||
|
||||
$ibo-datamodel-viewer--lifecycle--code--color: $ibo-color-grey-700 !default;
|
||||
$ibo-datamodel-viewer--lifecycle--stimuli--color: $ibo-color-blue-900 !default;
|
||||
@@ -45,6 +66,56 @@ $ibo-datamodel-viewer--lifecycle-image--margin-bottom: $ibo-spacing-500 !default
|
||||
.ibo-panel--subtitle{
|
||||
@extend %ibo-font-ral-nor-150;
|
||||
}
|
||||
.ibo-datamodel-viewer--empty{
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
align-items: center;
|
||||
svg{
|
||||
width: $ibo-datamodel-viewer--viewer-empty--width;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.ibo-datamodel-viewer--empty--text {
|
||||
@extend %ibo-font-ral-med-400
|
||||
}
|
||||
|
||||
.ibo-datamodel-viewer--breadcrumb{
|
||||
@extend %ibo-font-ral-med-150;
|
||||
margin: $ibo-datamodel-viewer--breadcrumb--margin;
|
||||
.ibo-button{
|
||||
text-transform: none; // unset uppercase
|
||||
}
|
||||
}
|
||||
|
||||
.ibo-datamodel-viewer--classname{
|
||||
color: $ibo-datamodel-viewer--classname--color;
|
||||
@extend %ibo-font-code-100;
|
||||
}
|
||||
|
||||
.ibo-datamodel-viewer--tag--category{
|
||||
color: $ibo-datamodel-viewer--tag--category--color;
|
||||
.ibo-object-details--tag-icon{
|
||||
color:$ibo-datamodel-viewer--tag--category--icon--color;
|
||||
}
|
||||
}
|
||||
|
||||
.ibo-datamodel-viewer--icon--abstract{
|
||||
&:after{
|
||||
content: $ibo-datamodel-viewer--abstract-class-icon--after--content;
|
||||
display: inline-flex;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
width: $ibo-datamodel-viewer--abstract-class-icon--after--width;
|
||||
height: $ibo-datamodel-viewer--abstract-class-icon--after--height;
|
||||
line-height: $ibo-datamodel-viewer--abstract-class-icon--after--line-height;
|
||||
border-radius: $ibo-datamodel-viewer--abstract-class-icon--after--border-radius;
|
||||
border: $ibo-datamodel-viewer--abstract-class-icon--after--border;
|
||||
color: $ibo-datamodel-viewer--abstract-class-icon--after--color;
|
||||
background-color: $ibo-datamodel-viewer--abstract-class-icon--after--background-color;
|
||||
|
||||
@extend %ibo-font-ral-bol-50;
|
||||
}
|
||||
}
|
||||
|
||||
.ibo-datamodel-viewer--parent--spacer{
|
||||
@@ -80,6 +151,7 @@ $ibo-datamodel-viewer--lifecycle-image--margin-bottom: $ibo-spacing-500 !default
|
||||
height: $ibo-datamodel-viewer--classes-list--height;
|
||||
width: $ibo-datamodel-viewer--classes-list--width;
|
||||
padding-left: $ibo-datamodel-viewer--classes-list--padding-left;
|
||||
padding-top: $ibo-datamodel-viewer--classes-list--padding-top;
|
||||
overflow-y: scroll;
|
||||
}
|
||||
|
||||
|
||||
@@ -689,6 +689,7 @@ class ManageBrickController extends BrickController
|
||||
$sValue = $oAttDef->GetAsHTML($oCurrentRow->Get($sItemAttr));
|
||||
$sSortValue = $oCurrentRow->Get($sItemAttr);
|
||||
}
|
||||
$sAttType = $oAttDef->GetType();
|
||||
unset($oAttDef);
|
||||
|
||||
// For simple fields, we get the raw (stored) value as well
|
||||
@@ -705,7 +706,7 @@ class ManageBrickController extends BrickController
|
||||
'object_class' => $sCurrentObjectClass,
|
||||
'object_id' => $sCurrentObjectId,
|
||||
'attribute_code' => $sItemAttr,
|
||||
'attribute_type' => $sAttDefClass,
|
||||
'attribute_type' => $sAttType,
|
||||
'value_raw' => $attValueRaw,
|
||||
'value_html' => $sValue,
|
||||
'sort_value' => $sSortValue,
|
||||
|
||||
@@ -1385,7 +1385,7 @@ class ObjectController extends BrickController
|
||||
'object_id' => $oNewLink->GetKey(),
|
||||
'prefix' => 'lnk__',
|
||||
'attribute_code' => $sAttCode,
|
||||
'attribute_type' => get_class($oAttDef),
|
||||
'attribute_type' => $oAttDef->GetType(),
|
||||
'value_html' => $sValue,
|
||||
];
|
||||
|
||||
@@ -1442,7 +1442,7 @@ class ObjectController extends BrickController
|
||||
'object_class' => $sObjectClass,
|
||||
'object_id' => $oObject->GetKey(),
|
||||
'attribute_code' => $oAttDef->GetCode(),
|
||||
'attribute_type' => get_class($oAttDef),
|
||||
'attribute_type' => $oAttDef->GetType(),
|
||||
];
|
||||
|
||||
// - Value raw
|
||||
|
||||
@@ -324,7 +324,7 @@ class BrowseBrickHelper
|
||||
'object_class' => $sCurrentObjectClass,
|
||||
'object_id' => $sCurrentObjectId,
|
||||
'attribute_code' => $sNameAttCode,
|
||||
'attribute_type' => $sNameAttDefClass,
|
||||
'attribute_type' => $sNameAttDef->GetType(),
|
||||
'value_raw' => $value->Get($sNameAttCode),
|
||||
],
|
||||
];
|
||||
@@ -415,7 +415,7 @@ class BrowseBrickHelper
|
||||
'object_class' => $sCurrentObjectClass,
|
||||
'object_id' => $sCurrentObjectId,
|
||||
'attribute_code' => $aField['code'],
|
||||
'attribute_type' => $sAttDefClass,
|
||||
'attribute_type' => $oAttDef->GetType(),
|
||||
'value_raw' => $attValueRaw,
|
||||
'value_html' => $sHtmlForFieldValue,
|
||||
];
|
||||
|
||||
@@ -729,6 +729,7 @@ Dict::Add('CS CZ', 'Czech', 'Čeština', [
|
||||
'UI:Query:UrlV1' => 'Nebyl specifikován seznam sloupců k exportu. Bez této informace nemůže stránka <em>export-V2.php</em> provést export. Pro export všech polí použijte stránku <em>export.php</em>. Pokud však chcete udržet konzistenci v delším časovém horzontu, použijte stávající stránku a specifikujte paramter "fields".',
|
||||
'UI:Schema:Title' => ITOP_APPLICATION_SHORT.' schéma objektů',
|
||||
'UI:Schema:TitleForClass' => '%1$s schéma',
|
||||
'UI:Schema:NoClassSelected' => 'No class selected, please choose one~~',
|
||||
'UI:Schema:CategoryMenuItem' => 'Kategorie <b>%1$s</b>',
|
||||
'UI:Schema:Relationships' => 'Vztahy',
|
||||
'UI:Schema:AbstractClass' => 'Abstraktní třída: instance objektu této třídy nemůže být vytvořena.',
|
||||
|
||||
@@ -728,6 +728,7 @@ Dict::Add('DE DE', 'German', 'Deutsch', [
|
||||
'UI:Query:UrlV1' => 'Die Liste der Felder wurde nicht spezifiziert. Die Seite <em>export-V2.php</em> kann ohne diese Angabe nicht verarbeitet werden. Deswegen, zeigt die nachstehende URL zu der Legacy-Page: <em>export.php</em>. Diese Legacy-Version des Exports hat folgende Limitierungen: Die Liste exportierter Felder kann, abhängig vom Output-Format und vom Datenmodell von '.ITOP_APPLICATION_SHORT.', variieren. Möchten Sie garantieren, dass die Liste aller exportierten Spalten stabil bleibt, müssen Sie einen Wert für das Attribut Feld angeben und die Seite <em>export-V2.php</em> nutzen.',
|
||||
'UI:Schema:Title' => ITOP_APPLICATION_SHORT.' Objekte-Schema',
|
||||
'UI:Schema:TitleForClass' => '%1$s Schema',
|
||||
'UI:Schema:NoClassSelected' => 'No class selected, please choose one~~',
|
||||
'UI:Schema:CategoryMenuItem' => 'Kategorie <b>%1$s</b>',
|
||||
'UI:Schema:Relationships' => 'Wechselseite Beziehungen',
|
||||
'UI:Schema:AbstractClass' => 'Abstrakte Klasse: ein Objekt dieser Klasse kann nicht instanziiert werden.',
|
||||
|
||||
@@ -760,6 +760,7 @@ Dict::Add('EN US', 'English', 'English', [
|
||||
'UI:Query:UrlV1' => 'The list of fields has been left unspecified. The page <em>export-V2.php</em> cannot be invoked without this information. Therefore, the URL suggested here below points to the legacy page: <em>export.php</em>. This legacy version of the export has the following limitation: the list of exported fields may vary depending on the output format and the data model of '.ITOP_APPLICATION_SHORT.'. <br/>Should you want to guarantee that the list of exported columns will remain stable on the long run, then you must specify a value for the attribute "Fields" and use the page <em>export-V2.php</em>.',
|
||||
'UI:Schema:Title' => ITOP_APPLICATION_SHORT.' objects schema',
|
||||
'UI:Schema:TitleForClass' => '%1$s schema',
|
||||
'UI:Schema:NoClassSelected' => 'No class selected, please choose one',
|
||||
'UI:Schema:CategoryMenuItem' => 'Category <b>%1$s</b>',
|
||||
'UI:Schema:Relationships' => 'Relationships',
|
||||
'UI:Schema:AbstractClass' => 'Abstract class: no object from this class can be instantiated.',
|
||||
|
||||
@@ -757,6 +757,7 @@ Dict::Add('EN GB', 'British English', 'British English', [
|
||||
'UI:Query:UrlV1' => 'The list of fields has been left unspecified. The page <em>export-V2.php</em> cannot be invoked without this information. Therefore, the URL suggested here below points to the legacy page: <em>export.php</em>. This legacy version of the export has the following limitation: the list of exported fields may vary depending on the output format and the data model of '.ITOP_APPLICATION_SHORT.'. <br/>Should you want to guarantee that the list of exported columns will remain stable on the long run, then you must specify a value for the attribute "Fields" and use the page <em>export-V2.php</em>.',
|
||||
'UI:Schema:Title' => ITOP_APPLICATION_SHORT.' objects schema',
|
||||
'UI:Schema:TitleForClass' => '%1$s schema',
|
||||
'UI:Schema:NoClassSelected' => 'No class selected, please choose one',
|
||||
'UI:Schema:CategoryMenuItem' => 'Category <b>%1$s</b>',
|
||||
'UI:Schema:Relationships' => 'Relationships',
|
||||
'UI:Schema:AbstractClass' => 'Abstract class: no object from this class can be instantiated.',
|
||||
|
||||
@@ -726,6 +726,7 @@ Dict::Add('ES CR', 'Spanish', 'Español, Castellano', [
|
||||
'UI:Query:UrlForExcel' => 'URL para usarse en consultas web de MS-Excel',
|
||||
'UI:Query:UrlV1' => 'La lista de campos se ha dejado sin especificación. La página <em>export-V2.php</em> no puede ser invocada sin está información. Por lo tanto, el URL sugerido abajo apunta a la página legada: <em>export.php</em>. Esta versión legada de exportación tiene la siguiente limitación: la lista de campos exportados puede variar, dependiendo del formato de salida y el modelo de datos de '.ITOP_APPLICATION_SHORT.'.Desea garantizar que la lista de columnas exportadas permanenzcan estables durante la ejecución, entonces debe especificar un valor para el atributo "Campos" y utilice la página <em>export-V2.php</em>.',
|
||||
'UI:Schema:Title' => 'Esquema de Objetos en '.ITOP_APPLICATION_SHORT, 'UI:Schema:TitleForClass' => 'Esquema de %1$s',
|
||||
'UI:Schema:NoClassSelected' => 'No class selected, please choose one~~',
|
||||
'UI:Schema:CategoryMenuItem' => 'Categoria <b>%1$s</b>',
|
||||
'UI:Schema:Relationships' => 'Relaciones',
|
||||
'UI:Schema:AbstractClass' => 'Clase Abstracta: Ningún objeto de esta clase puede ser representado.',
|
||||
|
||||
@@ -786,6 +786,7 @@ Nous espérons que vous aimerez cette version autant que nous avons eu du plaisi
|
||||
'UI:Query:UrlForExcel' => 'Lien à copier-coller dans Excel, pour déclarer une source de données à partir du web',
|
||||
'UI:Query:UrlV1' => 'La liste des champs à exporter n\'a pas été spécifiée. La page <em>export-V2.php</em> ne peut pas fonctionner sans cette information. Par conséquent, le lien fourni ci-dessous pointe sur l\'ancienne page: <em>export.php</em>. Cette ancienne version de l\'export présente la limitation suivante : la liste des champs exportés varie en fonction du format de l\'export et du modèle de données. <br/>Si vous devez garantir la stabilité du format de l\'export (liste des colonnes) sur le long terme, alors vous devrez renseigner l\'attribut "Champs" et utiliser la page <em>export-V2.php</em>.',
|
||||
'UI:Schema:Title' => 'Modèle de données '.ITOP_APPLICATION_SHORT, 'UI:Schema:TitleForClass' => 'Modèle de données de %1$s',
|
||||
'UI:Schema:NoClassSelected' => 'Aucune classe sélectionnée, veuillez en choisir une',
|
||||
'UI:Schema:CategoryMenuItem' => 'Catégorie <b>%1$s</b>',
|
||||
'UI:Schema:Relationships' => 'Relations',
|
||||
'UI:Schema:AbstractClass' => 'Classe abstraite : les objets de cette classe ne peuvent pas être instanciés.',
|
||||
|
||||
@@ -731,6 +731,7 @@ Dict::Add('HU HU', 'Hungarian', 'Magyar', [
|
||||
'UI:Query:UrlV1' => 'A mezők listája nem került meghatározásra. Az <em>export-V2.php</em> oldal nem hívható meg ezen információ nélkül. Ezért az alábbiakban javasolt URL az örökölt oldalra mutat: <em>export.php</em>. Az exportálásnak ez a régi változata a következő korlátozással rendelkezik: az exportált mezők listája a kimeneti formátumtól és a '.ITOP_APPLICATION_SHORT.' adatmodelltől függően változhat. Ha garantálni szeretné, hogy az exportált oszlopok listája hosszú távon stabil maradjon, akkor meg kell adnia a "Fields" attribútum értékét, és használnia kell a <em>export-V2.php</em> oldalt.',
|
||||
'UI:Schema:Title' => ITOP_APPLICATION_SHORT.' objektum séma',
|
||||
'UI:Schema:TitleForClass' => '%1$s séma',
|
||||
'UI:Schema:NoClassSelected' => 'No class selected, please choose one~~',
|
||||
'UI:Schema:CategoryMenuItem' => '<b>%1$s</b> kategória',
|
||||
'UI:Schema:Relationships' => 'Kapcsolatok',
|
||||
'UI:Schema:AbstractClass' => 'Absztrakt osztály: nem példányosítható belőle objektum.',
|
||||
|
||||
@@ -775,6 +775,7 @@ Dict::Add('IT IT', 'Italian', 'Italiano', [
|
||||
'UI:Query:UrlV1' => 'L\'elenco dei campi è stato lasciato non specificato. La pagina <em>export-V2.php</em> non può essere invocata senza queste informazioni. Pertanto, l\'URL suggerito di seguito punta alla pagina legacy: <em>export.php</em>. Questa versione legacy dell\'esportazione ha il seguente limite: l\'elenco dei campi esportati può variare a seconda del formato di output e del modello di dati di '.ITOP_APPLICATION_SHORT.'. Se vuoi garantire che l\'elenco delle colonne esportate rimanga stabile nel lungo periodo, devi specificare un valore per l\'attributo "Campi" e utilizzare la pagina <em>export-V2.php</em>.',
|
||||
'UI:Schema:Title' => ITOP_APPLICATION_SHORT.' schema degli oggetti',
|
||||
'UI:Schema:TitleForClass' => '%1$s schema',
|
||||
'UI:Schema:NoClassSelected' => 'No class selected, please choose one~~',
|
||||
'UI:Schema:CategoryMenuItem' => 'Categoria <b>%1$s</b>',
|
||||
'UI:Schema:Relationships' => 'Relazioni',
|
||||
'UI:Schema:AbstractClass' => 'Classe astratta: nessun oggetto di questa classe può essere istanziato.',
|
||||
|
||||
@@ -732,6 +732,7 @@ Dict::Add('JA JP', 'Japanese', '日本語', [
|
||||
'UI:Query:UrlV1' => 'The list of fields has been left unspecified. The page <em>export-V2.php</em> cannot be invoked without this information. Therefore, the URL suggested here below points to the legacy page: <em>export.php</em>. This legacy version of the export has the following limitation: the list of exported fields may vary depending on the output format and the data model of '.ITOP_APPLICATION_SHORT.'. <br/>Should you want to guarantee that the list of exported columns will remain stable on the long run, then you must specify a value for the attribute "Fields" and use the page <em>export-V2.php</em>.~~',
|
||||
'UI:Schema:Title' => ITOP_APPLICATION_SHORT.' オブジェクトスキーマ',
|
||||
'UI:Schema:TitleForClass' => '%1$s schema~~',
|
||||
'UI:Schema:NoClassSelected' => 'No class selected, please choose one~~',
|
||||
'UI:Schema:CategoryMenuItem' => 'カテゴリ <b>%1$s</b>',
|
||||
'UI:Schema:Relationships' => '関係',
|
||||
'UI:Schema:AbstractClass' => '抽象クラス:このクラスのインスタンスを作成することはできません。',
|
||||
|
||||
@@ -730,6 +730,7 @@ Dict::Add('NL NL', 'Dutch', 'Nederlands', [
|
||||
'UI:Query:UrlV1' => 'De lijst van velden is leeg gelaten. De pagina <em>export-V2.php</em> kan niet aangeroepen worden zonder deze informatie.Daarom verwijst de onderstaande link naar de oude export-pagina: <em>export.php</em>. Deze verouderde versie heeft enkele beperkingen: de lijst van geëxporteerde velden kan verschillen afhankelijk van het gekozen export-formaat en het datamodel van '.ITOP_APPLICATION_SHORT.'.Als je wil dat de lijst van geëxporteerde kolommen hetzelfde blijft over lange tijd, dan moet je een waarde opgeven voor het attribuut "Velden" en de pagina <em>export-V2.php</em> gebruiken.',
|
||||
'UI:Schema:Title' => ITOP_APPLICATION_SHORT.' objecten-schema',
|
||||
'UI:Schema:TitleForClass' => '%1$s schema',
|
||||
'UI:Schema:NoClassSelected' => 'No class selected, please choose one~~',
|
||||
'UI:Schema:CategoryMenuItem' => 'Categorie <b>%1$s</b>',
|
||||
'UI:Schema:Relationships' => 'Relaties',
|
||||
'UI:Schema:AbstractClass' => 'Abstracte klasse: objecten van deze klasse kunnen niet worden geïnstantieerd.',
|
||||
|
||||
@@ -743,6 +743,7 @@ Dict::Add('PL PL', 'Polish', 'Polski', [
|
||||
'UI:Query:UrlV1' => 'Lista pól pozostała nieokreślona. Strona <em>export-V2.php</em> nie może zostać wywołana bez tych informacji. Dlatego sugerowany poniżej adres URL wskazuje na starszą stronę: <em>export.php</em>. Ta starsza wersja eksportu ma następujące ograniczenie: lista eksportowanych pól może się różnić w zależności od formatu wyjściowego i modelu danych '.ITOP_APPLICATION_SHORT.'. <br/> Jeśli chcesz zagwarantować, że lista eksportowanych kolumn pozostanie stabilna w dłuższej perspektywie, musisz określić wartość dla atrybutu "Pola" i użyć strony <em>export-V2.php</em >.',
|
||||
'UI:Schema:Title' => ITOP_APPLICATION_SHORT.' schemat obiektów',
|
||||
'UI:Schema:TitleForClass' => 'Schemat %1$s',
|
||||
'UI:Schema:NoClassSelected' => 'No class selected, please choose one~~',
|
||||
'UI:Schema:CategoryMenuItem' => 'Kategoria <b>%1$s</b>',
|
||||
'UI:Schema:Relationships' => 'Relacje',
|
||||
'UI:Schema:AbstractClass' => 'Klasa abstrakcyjna: nie można utworzyć instancji obiektu z tej klasy.',
|
||||
|
||||
@@ -774,6 +774,7 @@ Dict::Add('PT BR', 'Brazilian', 'Brazilian', [
|
||||
'UI:Query:UrlV1' => 'A lista de campos não foi especificada. A página <em>export-V2.php</em> não pode ser chamada sem essa informação. Portanto, o URL sugerido abaixo aponta para a página herdada: <em>export.php</em>. Essa versão herdada da exportação tem a seguinte limitação: a lista de campos exportados pode variar dependendo do formato de saída e do modelo de dados do '.ITOP_APPLICATION_SHORT.'.Se você quiser garantir que a lista de colunas exportadas permaneça estável a longo prazo, então você deve especificar um valor para o atributo "Fields" e usar a página <em>export-V2.php</em>',
|
||||
'UI:Schema:Title' => 'Esquema de objetos',
|
||||
'UI:Schema:TitleForClass' => 'Esquema de %1$s',
|
||||
'UI:Schema:NoClassSelected' => 'No class selected, please choose one~~',
|
||||
'UI:Schema:CategoryMenuItem' => 'Categoria <b>%1$s</b>',
|
||||
'UI:Schema:Relationships' => 'Relações',
|
||||
'UI:Schema:AbstractClass' => 'Classe abstrata: nenhum objeto desta classe pode ser instanciado',
|
||||
|
||||
@@ -732,6 +732,7 @@ Dict::Add('RU RU', 'Russian', 'Русский', [
|
||||
'UI:Query:UrlV1' => 'Список полей был оставлен неопределенным. Страница <em>export-V2.php</em> не может быть вызван без этой информации. Поэтому URL-адрес, предложенный здесь ниже, указывает на устаревшую страницу: <em>export.php</ем>. Эта устаревшая версия экспорта имеет следующее ограничение: список экспортируемых полей может варьироваться в зависимости от формата вывода и модели данных '.ITOP_APPLICATION_SHORT.'. Если вы хотите гарантировать, что список экспортируемых столбцов будет оставаться стабильным в долгосрочной перспективе, то вы должны указать значение атрибута "Экспорт. поля" и использовать страницу <em>export-V2.php</ем>.',
|
||||
'UI:Schema:Title' => ITOP_APPLICATION_SHORT.' схема объектов',
|
||||
'UI:Schema:TitleForClass' => '%1$s schema~~',
|
||||
'UI:Schema:NoClassSelected' => 'No class selected, please choose one~~',
|
||||
'UI:Schema:CategoryMenuItem' => 'Категория <b>%1$s</b>',
|
||||
'UI:Schema:Relationships' => 'Отношения',
|
||||
'UI:Schema:AbstractClass' => 'Абстрактный класс: используется для наследования свойств, объекты этого класса не создаются.',
|
||||
|
||||
@@ -734,6 +734,7 @@ Dict::Add('SK SK', 'Slovak', 'Slovenčina', [
|
||||
'UI:Query:UrlV1' => 'The list of fields has been left unspecified. The page <em>export-V2.php</em> cannot be invoked without this information. Therefore, the URL suggested here below points to the legacy page: <em>export.php</em>. This legacy version of the export has the following limitation: the list of exported fields may vary depending on the output format and the data model of '.ITOP_APPLICATION_SHORT.'. <br/>Should you want to guarantee that the list of exported columns will remain stable on the long run, then you must specify a value for the attribute "Fields" and use the page <em>export-V2.php</em>.~~',
|
||||
'UI:Schema:Title' => ITOP_APPLICATION_SHORT.' objektová schéma',
|
||||
'UI:Schema:TitleForClass' => '%1$s schema~~',
|
||||
'UI:Schema:NoClassSelected' => 'No class selected, please choose one~~',
|
||||
'UI:Schema:CategoryMenuItem' => 'Kategória <b>%1$s</b>',
|
||||
'UI:Schema:Relationships' => 'Vzťahy',
|
||||
'UI:Schema:AbstractClass' => 'Abstraktná trieda: žiadny objekt z tejto triedy nemôže byť inštancovaný.',
|
||||
|
||||
@@ -732,6 +732,7 @@ Dict::Add('TR TR', 'Turkish', 'Türkçe', [
|
||||
'UI:Query:UrlV1' => 'Alanların listesi belirtilmeden bırakılmıştır. <em>export-V2.php</em> sayfası bu bilgi olmadan çağrılamaz. Bu nedenle, aşağıda önerilen URL eski sayfaya işaret etmektedir: <em>export.php</em>. Dışa aktarmanın bu eski sürümü aşağıdaki sınırlamaya sahiptir: dışa aktarılan alanların listesi, '.ITOP_APPLICATION_SHORT.'\'un çıktı biçimine ve veri modeline bağlı olarak değişebilir. Dışa aktarılan sütunların listesinin uzun vadede sabit kalacağını garanti etmek istiyorsanız, "Alanlar" özelliği için bir değer belirtmeli ve <em>export-V2.php</em> sayfasını kullanmalısınız.',
|
||||
'UI:Schema:Title' => 'iTop objects schema',
|
||||
'UI:Schema:TitleForClass' => '%1$s schema~~',
|
||||
'UI:Schema:NoClassSelected' => 'No class selected, please choose one~~',
|
||||
'UI:Schema:CategoryMenuItem' => 'Kategori <b>%1$s</b>',
|
||||
'UI:Schema:Relationships' => 'İlişkiler',
|
||||
'UI:Schema:AbstractClass' => 'Soyut sınıf: bu sınıftan nesne türetilemez.',
|
||||
|
||||
@@ -731,6 +731,7 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', [
|
||||
'UI:Query:UrlV1' => '没有定义字段列表. 没有这个信息页面<em>export-V2.php</em>无法调用. 因此, 建议的以下 URL 指向传统页面: <em>export.php</em>. 该传统版本导出具有以下限制: 导出的字段列表很大程度依赖于导出格式和'.ITOP_APPLICATION_SHORT.'数据模型. <br/>如果您需要确保导出的列保持长期稳定, 则必须为属性 "Fields" 指定值并使用页面<em>export-V2.php</em>.',
|
||||
'UI:Schema:Title' => ITOP_APPLICATION_SHORT.'对象模型',
|
||||
'UI:Schema:TitleForClass' => '%1$s 模式',
|
||||
'UI:Schema:NoClassSelected' => 'No class selected, please choose one~~',
|
||||
'UI:Schema:CategoryMenuItem' => '类别 <b>%1$s</b>',
|
||||
'UI:Schema:Relationships' => '关联',
|
||||
'UI:Schema:AbstractClass' => '抽象类型: 此类型不能实例化对象.',
|
||||
|
||||
406
pages/schema.php
406
pages/schema.php
@@ -6,8 +6,10 @@
|
||||
*/
|
||||
|
||||
use Combodo\iTop\Application\Helper\WebResourcesHelper;
|
||||
use Combodo\iTop\Application\UI\Base\Component\Alert\AlertUIBlockFactory;
|
||||
use Combodo\iTop\Application\UI\Base\Component\Button\ButtonUIBlockFactory;
|
||||
use Combodo\iTop\Application\UI\Base\Component\DataTable\DataTableUIBlockFactory;
|
||||
use Combodo\iTop\Application\UI\Base\Component\Html\HtmlFactory;
|
||||
use Combodo\iTop\Application\UI\Base\Component\Input\Select\Select;
|
||||
use Combodo\iTop\Application\UI\Base\Component\Input\Select\SelectOptionUIBlockFactory;
|
||||
use Combodo\iTop\Application\UI\Base\Component\Panel\PanelUIBlockFactory;
|
||||
@@ -27,15 +29,235 @@ LoginWebPage::DoLogin(); // Check user rights and prompt if needed
|
||||
ApplicationMenu::CheckMenuIdEnabled('DataModelMenu');
|
||||
|
||||
/**
|
||||
* Helper for this page -> link to a class
|
||||
* Get a short or full class label.
|
||||
*
|
||||
* Short: Class Label
|
||||
* Full: Class Label (ClassName)
|
||||
*
|
||||
* Short: UserRequest
|
||||
* Full: User Request (UserRequest)
|
||||
*
|
||||
* @param string $sClass
|
||||
*
|
||||
* @return string
|
||||
* @throws CoreException
|
||||
* @throws DictExceptionMissingString
|
||||
* @throws ReflectionException
|
||||
*/
|
||||
function MakeClassHLink($sClass, $sContext)
|
||||
function GetClassLabel(string $sClass): string
|
||||
{
|
||||
$sName = MetaModel::GetName($sClass);
|
||||
|
||||
$oClass = new ReflectionClass($sClass);
|
||||
|
||||
$sAbstract = '';
|
||||
if ($oClass->isAbstract()) {
|
||||
$sAbstract = '<span class="ibo-datamodel-viewer--icon--abstract" data-tooltip-content="'.Dict::S('UI:Schema:AbstractClass').'"></span>';
|
||||
}
|
||||
|
||||
return "$sAbstract $sName <span class=\"ibo-datamodel-viewer--classname\">$sClass</span>";
|
||||
}
|
||||
|
||||
/**
|
||||
* Get class hierarchy as breadcrumb.
|
||||
*
|
||||
* @param string $sClass
|
||||
* @param string $sContext
|
||||
*
|
||||
* @return string
|
||||
* @throws CoreException
|
||||
* @throws ReflectionException
|
||||
*/
|
||||
function GetClassHierarchy(string $sClass, string $sContext): string
|
||||
{
|
||||
$sClassSpacer = '<i class="fas fa-arrow-right ibo-datamodel-viewer--parent--spacer"></i>';
|
||||
$aParentClasses = [];
|
||||
foreach (MetaModel::EnumParentClasses($sClass) as $sParentClass) {
|
||||
$aParentClasses[] = MakeClassHLink($sParentClass, $sContext, "ibo-button ibo-button ibo-block ibo-is-alternative ibo-is-neutral", true);
|
||||
}
|
||||
|
||||
if (count($aParentClasses) > 0) {
|
||||
$sParents = $sClassSpacer.implode($sClassSpacer, $aParentClasses);
|
||||
} else {
|
||||
$sParents = '';
|
||||
}
|
||||
|
||||
return "<div class='ibo-datamodel-viewer--breadcrumb'><a href=\"schema.php?operation=list{$sContext}\" class=\"ibo-button ibo-button ibo-block ibo-is-alternative ibo-is-neutral \">".Dict::S('UI:Schema:AllClasses')."</a> $sParents".$sClassSpacer.MakeClassHLink($sClass, $sContext, "ibo-button ibo-button ibo-block ibo-is-alternative ibo-is-neutral", true)."</div>";
|
||||
}
|
||||
|
||||
/**
|
||||
* Make a class link.
|
||||
*
|
||||
* @param string $sClass
|
||||
* @param string $sContext
|
||||
* @param string $sCssClasses
|
||||
*
|
||||
* @return string
|
||||
* @throws CoreException
|
||||
* @throws DictExceptionMissingString
|
||||
* @throws ReflectionException
|
||||
*/
|
||||
function MakeClassHLink(string $sClass, string $sContext, string $sCssClasses = ''): string
|
||||
{
|
||||
$sLabel = GetClassLabel($sClass);
|
||||
|
||||
return "<a href=\"schema.php?operation=details_class&class=$sClass{$sContext}\" title=\"".html_entity_decode(
|
||||
MetaModel::GetClassDescription($sClass),
|
||||
ENT_QUOTES,
|
||||
'UTF-8'
|
||||
)."\">".MetaModel::GetName($sClass)." (".$sClass.")</a>";
|
||||
)."\" class=\"$sCssClasses\">$sLabel</a>";
|
||||
}
|
||||
|
||||
/**
|
||||
* Display class information.
|
||||
*
|
||||
* @param string $sClass
|
||||
* @param string $sContext
|
||||
*
|
||||
* @return array
|
||||
* @throws CoreException
|
||||
* @throws DictExceptionMissingString
|
||||
* @throws ReflectionException
|
||||
*/
|
||||
function GetClassInformation(string $sClass, string $sContext): array
|
||||
{
|
||||
// List the attributes of the object
|
||||
$aForwardChangeTracking = MetaModel::GetTrackForwardExternalKeys($sClass);
|
||||
$aDetails = [];
|
||||
|
||||
$aOrigins = [];
|
||||
foreach (MetaModel::ListAttributeDefs($sClass) as $sAttCode => $oAttDef) {
|
||||
if ($oAttDef->IsExternalKey()) {
|
||||
$sValue = Dict::Format('UI:Schema:ExternalKey_To', MakeClassHLink($oAttDef->GetTargetClass(), $sContext));
|
||||
if (array_key_exists($sAttCode, $aForwardChangeTracking)) {
|
||||
$oLinkSet = $aForwardChangeTracking[$sAttCode];
|
||||
$sRemoteClass = $oLinkSet->GetHostClass();
|
||||
$sValue = $sValue."<span title=\"Forward changes to $sRemoteClass\">*</span>";
|
||||
}
|
||||
} elseif ($oAttDef->IsLinkSet()) {
|
||||
$sValue = MakeClassHLink($oAttDef->GetLinkedClass(), $sContext);
|
||||
} else {
|
||||
$sValue = $oAttDef->GetDescription();
|
||||
}
|
||||
|
||||
[$classShortName, $label, $description] = array_values($oAttDef->GetTypeInformation());
|
||||
|
||||
$sOrigin = MetaModel::GetAttributeOrigin($sClass, $sAttCode);
|
||||
$aOrigins[$sOrigin] = true;
|
||||
$sMoreInfo = "";
|
||||
$sDefaultNullValue = '';
|
||||
if (call_user_func([get_class($oAttDef), 'IsBasedOnDBColumns'])) {
|
||||
|
||||
$aMoreInfo = [];
|
||||
if ($oAttDef->IsNullAllowed()) {
|
||||
$aMoreInfo[] = Dict::S('UI:Schema:NullAllowed');
|
||||
$sDefaultNullValue = (!is_null($oAttDef->GetNullValue()) ? $oAttDef->GetNullValue() : null);
|
||||
if (!is_null($sDefaultNullValue) && !is_string($sDefaultNullValue)) {
|
||||
$sDefaultNullValue = json_encode($sDefaultNullValue);
|
||||
}
|
||||
$sDefaultNullValue = (!is_null($sDefaultNullValue) ? Dict::Format(
|
||||
'UI:Schema:DefaultNullValue',
|
||||
$sDefaultNullValue
|
||||
) : '');
|
||||
} else {
|
||||
$aMoreInfo[] = Dict::S('UI:Schema:NullNotAllowed');
|
||||
}
|
||||
if ($oAttDef->GetDefaultValue()) {
|
||||
$sDefaultValue = $oAttDef->GetDefaultValue();
|
||||
if (!is_string($sDefaultValue)) {
|
||||
$sDefaultValue = json_encode($sDefaultValue);
|
||||
}
|
||||
$aMoreInfo[] = Dict::Format("UI:Schema:Default_Description", $sDefaultValue);
|
||||
}
|
||||
$sMoreInfo .= implode(', ', $aMoreInfo);
|
||||
}
|
||||
$sAttrCode = $oAttDef->GetCode();
|
||||
|
||||
if ($oAttDef instanceof AttributeEnum) {
|
||||
// Display localized values for the enum (which depend on the localization provided by the class)
|
||||
$aLocalizedValues = MetaModel::GetAllowedValues_att($sClass, $sAttCode, []);
|
||||
$aDescription = [];
|
||||
foreach ($aLocalizedValues as $val => $sDisplay) {
|
||||
$aDescription[] = $sDisplay." (".$val.")";
|
||||
}
|
||||
$sAllowedValues = implode(', ', $aDescription);
|
||||
} elseif (is_object($oAllowedValuesDef = $oAttDef->GetValuesDef())) {
|
||||
$sAllowedValues = str_replace("Filter: ", "", $oAllowedValuesDef->GetValuesDescription());
|
||||
$sAllowedValuesEscpd = utils::HtmlEntities($sAllowedValues);
|
||||
|
||||
$sFilterURL = urlencode($sAllowedValues);
|
||||
$sAllowedValues = '<span id="values'.$sAttrCode.'" data-tooltip-content="'.$sAllowedValuesEscpd.'"><a href="run_query.php?expression='.$sFilterURL.'" class="fas fa-search"></a> '.Dict::S('UI:Schema:Attribute/Filter')."</span>";
|
||||
} else {
|
||||
$sAllowedValues = '';
|
||||
}
|
||||
$sAttrValueEscpd = utils::HtmlEntities($sValue);
|
||||
$sAttrTypeDescEscpd = utils::HtmlEntities($description);
|
||||
$sAttrOriginEscpd = utils::HtmlEntities($sOrigin);
|
||||
$sDefaultNullValueEscpd = utils::HtmlEntities($sDefaultNullValue);
|
||||
|
||||
$aDetails[] = [
|
||||
'code' => '<span id="attr'.$sAttrCode.'" data-tooltip-content="'.$sAttrValueEscpd.'" data-tooltip-html-enabled="true">'.$oAttDef->GetLabel().' ('.$oAttDef->GetCode().')</span>',
|
||||
'type' => '<span id="type'.$sAttrCode.'" data-tooltip-content="'.$sAttrTypeDescEscpd.'">'.$label.' ('.$classShortName.')</span>',
|
||||
'origincolor' => '<div class="originColor'.$sOrigin.'" data-tooltip-content="'.$sAttrOriginEscpd.'"></div>',
|
||||
'origin' => "<span id=\"origin".$sAttrCode."\">$sOrigin</span>",
|
||||
'values' => $sAllowedValues,
|
||||
'moreinfo' => '<span id="moreinfo'.$sAttrCode.'" data-tooltip-content="'.$sDefaultNullValueEscpd.'">'.$sMoreInfo.'</span>',
|
||||
];
|
||||
|
||||
}
|
||||
|
||||
return [
|
||||
'details' => $aDetails,
|
||||
'origins' => $aOrigins,
|
||||
];
|
||||
}
|
||||
|
||||
/**
|
||||
* Display class attributes.
|
||||
*
|
||||
* @param iTopWebPage $oPage
|
||||
* @param string $sClass
|
||||
* @param string $sContext
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
function DisplayClassAttributes(iTopWebPage $oPage, string $sClass, string $sContext): void
|
||||
{
|
||||
$aClassInformation = GetClassInformation($sClass, $sContext);
|
||||
|
||||
$aConfig = [
|
||||
'origincolor' => ['label' => "", 'description' => ""],
|
||||
'code' => ['label' => Dict::S('UI:Schema:AttributeCode'), 'description' => Dict::S('UI:Schema:AttributeCode+')],
|
||||
'type' => ['label' => Dict::S('UI:Schema:Type'), 'description' => Dict::S('UI:Schema:Type+')],
|
||||
'values' => ['label' => Dict::S('UI:Schema:AllowedValues'), 'description' => Dict::S('UI:Schema:AllowedValues+')],
|
||||
'moreinfo' => ['label' => Dict::S('UI:Schema:MoreInfo'), 'description' => Dict::S('UI:Schema:MoreInfo+')],
|
||||
'origin' => ['label' => Dict::S('UI:Schema:Origin'), 'description' => Dict::S('UI:Schema:Origin+')],
|
||||
];
|
||||
$oTablePanel = PanelUIBlockFactory::MakeForClass($sClass, '');
|
||||
$oTablePanel->AddCSSClass('ibo-datatable-panel');
|
||||
|
||||
$oAttributesTable = DataTableUIBlockFactory::MakeForStaticData('', $aConfig, $aClassInformation['details'], 'ibo-datamodel-viewer--attributes-table', [], "", ['pageLength' => -1]);
|
||||
$oTablePanel->AddSubBlock($oAttributesTable);
|
||||
$oPage->AddUiBlock($oTablePanel);
|
||||
$sOrigins = json_encode(array_keys($aClassInformation['origins']));
|
||||
|
||||
//color calculation in order to keep 1 color for 1 extended class. Colors are interpolated and will be used for
|
||||
// graph scheme color too
|
||||
$oPage->add_ready_script(
|
||||
<<< EOF
|
||||
var aOrigins = $sOrigins;
|
||||
var aColors = d3.scale.linear().domain([1,aOrigins.length])
|
||||
.interpolate(d3.interpolateHcl)
|
||||
.range([d3.rgb("#007AFF"), d3.rgb('#FFF500')]);
|
||||
$.each(aOrigins,function(idx, origin){
|
||||
$('.originColor'+origin).css('background-color',aColors(aOrigins.indexOf(origin)));
|
||||
});
|
||||
Array.prototype.forEach.call($(".listResults").find('td:nth-child(1),th:nth-child(1)'), function(e){
|
||||
$(e).removeClass("header").addClass("ibo-datamodel-viewer--origin-cell");
|
||||
});
|
||||
|
||||
EOF
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -222,11 +444,18 @@ JS
|
||||
/**
|
||||
* Helper for the trigger
|
||||
*/
|
||||
function DisplayTriggers($oPage, $sClass)
|
||||
function DisplayTriggers(iTopWebPage $oPage, string $sClass)
|
||||
{
|
||||
$sClassList = implode("', '", MetaModel::EnumParentClasses($sClass, ENUM_PARENT_CLASSES_ALL));
|
||||
$oSet = new CMDBObjectSet(DBObjectSearch::FromOQL("SELECT TriggerOnObject WHERE target_class IN ('$sClassList')"));
|
||||
try {
|
||||
cmdbAbstractObject::DisplaySet($oPage, $oSet, ['block_id' => 'triggers']);
|
||||
} catch (Exception $e) {
|
||||
$oPage->AddUiBlock(AlertUIBlockFactory::MakeForFailure('Unable to load current class triggers.'));
|
||||
IssueLog::Error('Unable to load current class triggers.', null, [
|
||||
'root_cause' => $e->getMessage(),
|
||||
]);
|
||||
}
|
||||
}
|
||||
|
||||
function DisplayEvents(WebPage $oPage, $sClass)
|
||||
@@ -333,7 +562,7 @@ function DisplayClassesList($oPage, $oLayout, $sContext)
|
||||
$oLayout->AddSideHtml("<label for='search-model'>".Dict::S('UI:Schema:ClassFilter')."</label><br>");
|
||||
|
||||
$oListSearch = new Select("ibo-datamodel-viewer--class-search");
|
||||
$oListSearch->SetName('aa');
|
||||
$oListSearch->SetName('datamodel_class_select');
|
||||
// Get all the "root" classes for display
|
||||
$aRootClasses = [];
|
||||
$aClassLabelAndCodeAsJSON = [];
|
||||
@@ -897,156 +1126,38 @@ JS
|
||||
* @param string $sClass
|
||||
* @param string $sContext
|
||||
*
|
||||
* @throws \CoreException
|
||||
* @throws CoreException|ReflectionException
|
||||
*/
|
||||
function DisplayClassDetails($oPage, $sClass, $sContext)
|
||||
{
|
||||
$aParentClasses = [];
|
||||
foreach (MetaModel::EnumParentClasses($sClass) as $sParentClass) {
|
||||
$aParentClasses[] = MakeClassHLink($sParentClass, $sContext);
|
||||
}
|
||||
if (count($aParentClasses) > 0) {
|
||||
$sParents = implode(' <i class="fas fa-arrow-right ibo-datamodel-viewer--parent--spacer"></i> ', $aParentClasses).' <i class="fas fa-arrow-right ibo-datamodel-viewer--parent--spacer"></i> '.MetaModel::GetName($sClass).'('.$sClass.')';
|
||||
} else {
|
||||
$sParents = '';
|
||||
}
|
||||
$sClassHierarchy = ("[<a href=\"schema.php?operation=list{$sContext}\">".Dict::S('UI:Schema:AllClasses')."</a>] $sParents");
|
||||
// Hierarchy
|
||||
$sClassHierarchy = GetClassHierarchy($sClass, $sContext);
|
||||
$oPage->AddUiBlock(HtmlFactory::MakeRaw($sClassHierarchy));
|
||||
|
||||
$oPanel = PanelUIBlockFactory::MakeForClass($sClass, MetaModel::GetName($sClass).' ('.$sClass.')')
|
||||
->SetIcon(MetaModel::GetClassIcon($sClass, false));
|
||||
$sClassDescritpion = MetaModel::GetClassDescription($sClass);
|
||||
// Class Title
|
||||
$oPanel = PanelUIBlockFactory::MakeForClass($sClass, MetaModel::GetName($sClass).' ('.$sClass.')')->SetIcon(MetaModel::GetClassIcon($sClass, false));
|
||||
$oEnhancedPanelSubtitle = $oPanel->GetSubTitleBlock();
|
||||
$sEnhancedPanelSubtitle = $sClassHierarchy.($sClassDescritpion == "" ? "" : ' - '.$sClassDescritpion);
|
||||
if (MetaModel::IsAbstract($sClass)) {
|
||||
$sEnhancedPanelSubtitle .= ' - <i class="fas fa-lock" data-tooltip-content="'.Dict::S('UI:Schema:AbstractClass').'"></i>';
|
||||
$sClassDescription = MetaModel::GetClassDescription($sClass);
|
||||
$sTags = '';
|
||||
if (utils::IsNotNullOrEmptyString($sClassDescription)) {
|
||||
$sTags .= '<span class="ibo-object-details--tag">'.$sClassDescription.'</span>';
|
||||
}
|
||||
$oEnhancedPanelSubtitle->AddHtml($sEnhancedPanelSubtitle);
|
||||
$sTags .= '<span class="ibo-object-details--tag ibo-datamodel-viewer--tag--category"><span class="ibo-object-details--tag-icon"><span class="fas fa-tags"></span></span>'.str_replace(',', ' - ', MetaModel::GetCategory($sClass)).'</span>';
|
||||
if (MetaModel::IsAbstract($sClass)) {
|
||||
$sTags .= '<span class="ibo-object-details--tag ibo-datamodel-viewer--tag--abstract"><span class="ibo-object-details--tag-icon"><span class="ibo-datamodel-viewer--icon--abstract"></span></span>'.Dict::S('UI:Schema:AbstractClass').'</span>';
|
||||
}
|
||||
$oEnhancedPanelSubtitle->AddSubBlock(HtmlFactory::MakeHtmlContent($sTags));
|
||||
$oPage->AddUiBlock($oPanel);
|
||||
|
||||
// Details container
|
||||
$oPage->AddTabContainer('details', '', $oPanel);
|
||||
$oPage->SetCurrentTabContainer('details');
|
||||
// List the attributes of the object
|
||||
$aForwardChangeTracking = MetaModel::GetTrackForwardExternalKeys($sClass);
|
||||
$aDetails = [];
|
||||
|
||||
$aOrigins = [];
|
||||
foreach (MetaModel::ListAttributeDefs($sClass) as $sAttCode => $oAttDef) {
|
||||
if ($oAttDef->IsExternalKey()) {
|
||||
$sValue = Dict::Format('UI:Schema:ExternalKey_To', MakeClassHLink($oAttDef->GetTargetClass(), $sContext));
|
||||
if (array_key_exists($sAttCode, $aForwardChangeTracking)) {
|
||||
$oLinkSet = $aForwardChangeTracking[$sAttCode];
|
||||
$sRemoteClass = $oLinkSet->GetHostClass();
|
||||
$sValue = $sValue."<span title=\"Forward changes to $sRemoteClass\">*</span>";
|
||||
}
|
||||
} elseif ($oAttDef->IsLinkSet()) {
|
||||
$sValue = MakeClassHLink($oAttDef->GetLinkedClass(), $sContext);
|
||||
} else {
|
||||
$sValue = $oAttDef->GetDescription();
|
||||
}
|
||||
$sType = get_class($oAttDef);
|
||||
$sTypeDict = $oAttDef->GetType();
|
||||
$sTypeDesc = $oAttDef->GetTypeDesc();
|
||||
|
||||
$sOrigin = MetaModel::GetAttributeOrigin($sClass, $sAttCode);
|
||||
$aOrigins[$sOrigin] = true;
|
||||
$sAllowedValues = "";
|
||||
$sMoreInfo = "";
|
||||
$sDefaultNullValue = '';
|
||||
if (call_user_func([get_class($oAttDef), 'IsBasedOnDBColumns'])) {
|
||||
|
||||
$aMoreInfo = [];
|
||||
if ($oAttDef->IsNullAllowed()) {
|
||||
$aMoreInfo[] = Dict::S('UI:Schema:NullAllowed');
|
||||
$sDefaultNullValue = (!is_null($oAttDef->GetNullValue()) ? $oAttDef->GetNullValue() : null);
|
||||
if (!is_null($sDefaultNullValue) && !is_string($sDefaultNullValue)) {
|
||||
$sDefaultNullValue = json_encode($sDefaultNullValue);
|
||||
}
|
||||
$sDefaultNullValue = (!is_null($sDefaultNullValue) ? Dict::Format(
|
||||
'UI:Schema:DefaultNullValue',
|
||||
$sDefaultNullValue
|
||||
) : '');
|
||||
} else {
|
||||
$aMoreInfo[] = Dict::S('UI:Schema:NullNotAllowed');
|
||||
}
|
||||
if ($oAttDef->GetDefaultValue()) {
|
||||
$sDefaultValue = $oAttDef->GetDefaultValue();
|
||||
if (!is_string($sDefaultValue)) {
|
||||
$sDefaultValue = json_encode($sDefaultValue);
|
||||
}
|
||||
$aMoreInfo[] = Dict::Format("UI:Schema:Default_Description", $sDefaultValue);
|
||||
}
|
||||
$sMoreInfo .= implode(', ', $aMoreInfo);
|
||||
}
|
||||
$sAttrCode = $oAttDef->GetCode();
|
||||
$sIsEnumValues = 'false';
|
||||
$sAllowedValuesEscpd = '""';
|
||||
if ($oAttDef instanceof AttributeEnum) {
|
||||
// Display localized values for the enum (which depend on the localization provided by the class)
|
||||
$aLocalizedValues = MetaModel::GetAllowedValues_att($sClass, $sAttCode, []);
|
||||
$aDescription = [];
|
||||
foreach ($aLocalizedValues as $val => $sDisplay) {
|
||||
$aDescription[] = $sDisplay." (".$val.")";
|
||||
}
|
||||
$sAllowedValues = implode(', ', $aDescription);
|
||||
$sIsEnumValues = 'true';
|
||||
} elseif (is_object($oAllowedValuesDef = $oAttDef->GetValuesDef())) {
|
||||
$sAllowedValues = str_replace("Filter: ", "", $oAllowedValuesDef->GetValuesDescription());
|
||||
$sAllowedValuesEscpd = utils::HtmlEntities($sAllowedValues);
|
||||
|
||||
$sFilterURL = urlencode($sAllowedValues);
|
||||
$sAllowedValues = '<span id="values'.$sAttrCode.'" data-tooltip-content="'.$sAllowedValuesEscpd.'"><a href="run_query.php?expression='.$sFilterURL.'" class="fas fa-search"></a> '.Dict::S('UI:Schema:Attribute/Filter')."</span>";
|
||||
} else {
|
||||
$sAllowedValues = '';
|
||||
}
|
||||
$sAttrValueEscpd = utils::HtmlEntities($sValue);
|
||||
$sAttrTypeDescEscpd = utils::HtmlEntities($sTypeDesc);
|
||||
$sAttrOriginEscpd = utils::HtmlEntities($sOrigin);
|
||||
$sDefaultNullValueEscpd = utils::HtmlEntities($sDefaultNullValue);
|
||||
|
||||
$aDetails[] = [
|
||||
'code' => '<span id="attr'.$sAttrCode.'" data-tooltip-content="'.$sAttrValueEscpd.'" data-tooltip-html-enabled="true">'.$oAttDef->GetLabel().' ('.$oAttDef->GetCode().')</span>',
|
||||
'type' => '<span id="type'.$sAttrCode.'" data-tooltip-content="'.$sAttrTypeDescEscpd.'">'.$sTypeDict.' ('.$sType.')</span>',
|
||||
'origincolor' => '<div class="originColor'.$sOrigin.'" data-tooltip-content="'.$sAttrOriginEscpd.'"></div>',
|
||||
'origin' => "<span id=\"origin".$sAttrCode."\">$sOrigin</span>",
|
||||
'values' => $sAllowedValues,
|
||||
'moreinfo' => '<span id="moreinfo'.$sAttrCode.'" data-tooltip-content="'.$sDefaultNullValueEscpd.'">'.$sMoreInfo.'</span>',
|
||||
];
|
||||
|
||||
}
|
||||
// Attributes
|
||||
$oPage->SetCurrentTab('UI:Schema:Attributes');
|
||||
$aConfig = [
|
||||
'origincolor' => ['label' => "", 'description' => ""],
|
||||
'code' => ['label' => Dict::S('UI:Schema:AttributeCode'), 'description' => Dict::S('UI:Schema:AttributeCode+')],
|
||||
'type' => ['label' => Dict::S('UI:Schema:Type'), 'description' => Dict::S('UI:Schema:Type+')],
|
||||
'values' => ['label' => Dict::S('UI:Schema:AllowedValues'), 'description' => Dict::S('UI:Schema:AllowedValues+')],
|
||||
'moreinfo' => ['label' => Dict::S('UI:Schema:MoreInfo'), 'description' => Dict::S('UI:Schema:MoreInfo+')],
|
||||
'origin' => ['label' => Dict::S('UI:Schema:Origin'), 'description' => Dict::S('UI:Schema:Origin+')],
|
||||
];
|
||||
$oTablePanel = PanelUIBlockFactory::MakeForClass($sClass, '');
|
||||
$oTablePanel->AddCSSClass('ibo-datatable-panel');
|
||||
|
||||
$oAttributesTable = DataTableUIBlockFactory::MakeForStaticData('', $aConfig, $aDetails, 'ibo-datamodel-viewer--attributes-table', [], "", ['pageLength' => -1]);
|
||||
$oTablePanel->AddSubBlock($oAttributesTable);
|
||||
$oPage->AddUiBlock($oTablePanel);
|
||||
$sOrigins = json_encode(array_keys($aOrigins));
|
||||
|
||||
//color calculation in order to keep 1 color for 1 extended class. Colors are interpolated and will be used for
|
||||
// graph scheme color too
|
||||
$oPage->add_ready_script(
|
||||
<<< EOF
|
||||
var aOrigins = $sOrigins;
|
||||
var aColors = d3.scale.linear().domain([1,aOrigins.length])
|
||||
.interpolate(d3.interpolateHcl)
|
||||
.range([d3.rgb("#007AFF"), d3.rgb('#FFF500')]);
|
||||
$.each(aOrigins,function(idx, origin){
|
||||
$('.originColor'+origin).css('background-color',aColors(aOrigins.indexOf(origin)));
|
||||
});
|
||||
Array.prototype.forEach.call($(".listResults").find('td:nth-child(1),th:nth-child(1)'), function(e){
|
||||
$(e).removeClass("header").addClass("ibo-datamodel-viewer--origin-cell");
|
||||
});
|
||||
|
||||
EOF
|
||||
);
|
||||
DisplayClassAttributes($oPage, $sClass, $sContext);
|
||||
|
||||
// Related classes
|
||||
$oPage->SetCurrentTab('UI:Schema:RelatedClasses');
|
||||
DisplayRelatedClassesGraph($oPage, $sClass);
|
||||
|
||||
@@ -1060,12 +1171,15 @@ EOF
|
||||
$oPage->add_ready_script('$("#ClassHierarchy").treeview({collapsed: false,});');
|
||||
}
|
||||
|
||||
// Lifecycle
|
||||
$oPage->SetCurrentTab('UI:Schema:LifeCycle');
|
||||
DisplayLifecycle($oPage, $sClass);
|
||||
|
||||
// Triggers
|
||||
$oPage->SetCurrentTab('UI:Schema:Triggers');
|
||||
DisplayTriggers($oPage, $sClass);
|
||||
|
||||
// Events
|
||||
$oPage->SetCurrentTab('UI:Schema:Events');
|
||||
DisplayEvents($oPage, $sClass);
|
||||
|
||||
@@ -1100,7 +1214,6 @@ $oPage->SetBreadCrumbEntry(
|
||||
);
|
||||
|
||||
$oTitle = TitleUIBlockFactory::MakeForPage(Dict::S('UI:Schema:Title'));
|
||||
$oPage->AddUiBlock($oTitle);
|
||||
$oLayout->AddSideHtml("<div class='ibo-datamodel-viewer--classes-list'> ");
|
||||
DisplayClassesList($oPage, $oLayout, $sContext);
|
||||
$oLayout->AddSideHtml("</div>");
|
||||
@@ -1118,6 +1231,11 @@ switch ($operation) {
|
||||
}
|
||||
// no break
|
||||
default:
|
||||
$sSource = APPROOT."images/illustrations/undraw_reading_time.svg";
|
||||
$oEmpty = HtmlFactory::MakeRaw("<div class='ibo-datamodel-viewer--empty ibo-svg-illustration--container'>".
|
||||
file_get_contents($sSource)."<div class='ibo-datamodel-viewer--empty--text'>".Dict::S('UI:Schema:NoClassSelected')."</div></div>");
|
||||
$oLayout->AddSubBlock($oEmpty);
|
||||
break;
|
||||
}
|
||||
$oPage->add("</div>");
|
||||
$oPage->add("</div>");
|
||||
|
||||
@@ -27,9 +27,9 @@ use Combodo\iTop\Application\UI\Base\Component\Title\TitleUIBlockFactory;
|
||||
use Combodo\iTop\Application\UI\Base\Component\Toolbar\ToolbarUIBlockFactory;
|
||||
use Combodo\iTop\Application\UI\Base\iUIBlock;
|
||||
use Combodo\iTop\Application\UI\Base\Layout\UIContentBlock;
|
||||
use Combodo\iTop\Application\WebPage\WebPage;
|
||||
use Combodo\iTop\Controller\AjaxRenderController;
|
||||
use DBObjectSet;
|
||||
use DeprecatedCallsLog;
|
||||
use Dict;
|
||||
use DisplayBlock;
|
||||
use IssueLog;
|
||||
@@ -38,7 +38,6 @@ use MenuBlock;
|
||||
use MetaModel;
|
||||
use UserRights;
|
||||
use utils;
|
||||
use Combodo\iTop\Application\WebPage\WebPage;
|
||||
|
||||
/**
|
||||
* Class DataTableUIBlockFactory
|
||||
@@ -556,7 +555,7 @@ class DataTableUIBlockFactory extends AbstractUIBlockFactory
|
||||
'object_class' => $sClassName,
|
||||
'class_alias' => $sClassAlias,
|
||||
'attribute_code' => $sAttCode,
|
||||
'attribute_type' => $sAttDefClass,
|
||||
'attribute_type' => $oAttDef->GetType(),
|
||||
'attribute_label' => $sAttLabel,
|
||||
'render' => $oAttDef->GetRenderForDataTable($sClassAlias),
|
||||
];
|
||||
@@ -738,7 +737,7 @@ JS;
|
||||
'object_class' => $sClassName,
|
||||
'class_alias' => $sClassAlias,
|
||||
'attribute_code' => $sAttCode,
|
||||
'attribute_type' => $sAttDefClass,
|
||||
'attribute_type' => $oAttDef->GetType(),
|
||||
'attribute_label' => $sAttLabel,
|
||||
];
|
||||
$aColumnDefinition["data"] = $sClassAlias."/".$sAttCode;
|
||||
|
||||
@@ -11,6 +11,7 @@ use CMDBChangeOpSetAttributeScalar;
|
||||
use Combodo\iTop\Form\Field\SelectField;
|
||||
use DBObject;
|
||||
use Dict;
|
||||
use ReflectionClass;
|
||||
|
||||
/**
|
||||
* Map a boolean column to an attribute
|
||||
@@ -80,11 +81,13 @@ class AttributeBoolean extends AttributeInteger
|
||||
|
||||
public function GetValueLabel($bValue)
|
||||
{
|
||||
$oClass = new ReflectionClass(get_class($this));
|
||||
|
||||
if (is_null($bValue)) {
|
||||
$sLabel = Dict::S('Core:'.get_class($this).'/Value:null');
|
||||
$sLabel = Dict::S('Core:'.$oClass->getShortName().'/Value:null');
|
||||
} else {
|
||||
$sValue = $bValue ? 'yes' : 'no';
|
||||
$sDefault = Dict::S('Core:'.get_class($this).'/Value:'.$sValue);
|
||||
$sDefault = Dict::S('Core:'.$oClass->getShortName().'/Value:'.$sValue);
|
||||
$sLabel = $this->SearchLabel('/Attribute:'.$this->m_sCode.'/Value:'.$sValue, $sDefault, true /*user lang*/);
|
||||
}
|
||||
|
||||
@@ -93,11 +96,13 @@ class AttributeBoolean extends AttributeInteger
|
||||
|
||||
public function GetValueDescription($bValue)
|
||||
{
|
||||
$oClass = new ReflectionClass(get_class($this));
|
||||
|
||||
if (is_null($bValue)) {
|
||||
$sDescription = Dict::S('Core:'.get_class($this).'/Value:null+');
|
||||
$sDescription = Dict::S('Core:'.$oClass->getShortName().'/Value:null+');
|
||||
} else {
|
||||
$sValue = $bValue ? 'yes' : 'no';
|
||||
$sDefault = Dict::S('Core:'.get_class($this).'/Value:'.$sValue.'+');
|
||||
$sDefault = Dict::S('Core:'.$oClass->getShortName().'/Value:'.$sValue.'+');
|
||||
$sDescription = $this->SearchLabel(
|
||||
'/Attribute:'.$this->m_sCode.'/Value:'.$sValue.'+',
|
||||
$sDefault,
|
||||
|
||||
@@ -19,6 +19,7 @@ use Exception;
|
||||
use Expression;
|
||||
use FieldExpression;
|
||||
use MetaModel;
|
||||
use ReflectionClass;
|
||||
use Str;
|
||||
use utils;
|
||||
use VariableExpression;
|
||||
@@ -131,12 +132,30 @@ abstract class AttributeDefinition
|
||||
|
||||
public function GetType()
|
||||
{
|
||||
return Dict::S('Core:'.get_class($this));
|
||||
$oClass = new ReflectionClass(get_class($this));
|
||||
return Dict::S('Core:'.$oClass->getShortName());
|
||||
}
|
||||
|
||||
public function GetTypeDesc()
|
||||
{
|
||||
return Dict::S('Core:'.get_class($this).'+');
|
||||
$oClass = new ReflectionClass(get_class($this));
|
||||
return Dict::S('Core:'.$oClass->getShortName().'+');
|
||||
}
|
||||
|
||||
/**
|
||||
* Return type information.
|
||||
*
|
||||
* @since 3.3
|
||||
* @return array
|
||||
*/
|
||||
public function GetTypeInformation(): array
|
||||
{
|
||||
$oClass = new ReflectionClass(get_class($this));
|
||||
return [
|
||||
'classShortName' => $oClass->getShortName(),
|
||||
'label' => Dict::S('Core:'.$oClass->getShortName()),
|
||||
'description' => Dict::S('Core:'.$oClass->getShortName().'+'),
|
||||
];
|
||||
}
|
||||
|
||||
abstract public function GetEditClass();
|
||||
@@ -1076,7 +1095,7 @@ abstract class AttributeDefinition
|
||||
|
||||
// Metadata
|
||||
$oFormField->AddMetadata('attribute-code', $this->GetCode());
|
||||
$oFormField->AddMetadata('attribute-type', get_class($this));
|
||||
$oFormField->AddMetadata('attribute-type', $this->GetType());
|
||||
$oFormField->AddMetadata('attribute-label', $this->GetLabel());
|
||||
// - Attribute flags
|
||||
$aPossibleAttFlags = MetaModel::EnumPossibleAttributeFlags();
|
||||
|
||||
@@ -852,7 +852,7 @@ JS
|
||||
'object_class' => $sClass,
|
||||
'object_id' => $oItem->GetKey(),
|
||||
'attribute_code' => $sAttCode,
|
||||
'attribute_type' => get_class($oAttDef),
|
||||
'attribute_type' => $oAttDef->GetType(),
|
||||
];
|
||||
// - Value raw
|
||||
// For simple fields, we get the raw (stored) value as well
|
||||
|
||||
Reference in New Issue
Block a user