diff --git a/datamodels/2.x/itop-attachments/dictionaries/cs.dict.itop-attachments.php b/datamodels/2.x/itop-attachments/dictionaries/cs.dict.itop-attachments.php index bf417ccc8..dc0bc884c 100644 --- a/datamodels/2.x/itop-attachments/dictionaries/cs.dict.itop-attachments.php +++ b/datamodels/2.x/itop-attachments/dictionaries/cs.dict.itop-attachments.php @@ -85,11 +85,13 @@ Dict::Add('CS CZ', 'Czech', 'Čeština', [ Dict::Add('CS CZ', 'Czech', 'Čeština', [ 'Class:TriggerOnAttachmentDownload' => 'Trigger (on object\'s attachment download)~~', 'Class:TriggerOnAttachmentDownload+' => 'Trigger on object\'s attachment download of [a child class of] the given class~~', - 'Class:TriggerOnAttachmentCreate' => 'Trigger (on object\'s attachment create)~~', - 'Class:TriggerOnAttachmentCreate+' => 'Trigger on object\'s attachment create~~', + 'Class:TriggerOnAttachmentCreate' => 'Trigger (on object\'s attachment creation)~~', + 'Class:TriggerOnAttachmentCreate+' => 'Trigger on object\'s attachment creation~~', 'Class:TriggerOnAttachmentCreate/Attribute:file_in_email' => 'Add file in email~~', 'Class:TriggerOnAttachmentCreate/Attribute:file_in_email+' => 'If checked, the file will be automatically attached to the email when an email action is triggered~~', - 'Class:TriggerOnAttachmentDelete' => 'Trigger (on object\'s attachment delete)~~', - 'Class:TriggerOnAttachmentDelete+' => 'Trigger on object\'s attachment delete~~', + 'Class:TriggerOnAttachmentDelete' => 'Trigger (on object\'s attachment deletion)~~', + 'Class:TriggerOnAttachmentDelete+' => 'Trigger on object\'s attachment deletion~~', + 'Class:TriggerOnAttachmentDelete/Attribute:file_in_email' => 'Add deleted file in email~~', + 'Class:TriggerOnAttachmentDelete/Attribute:file_in_email+' => 'If checked, the deleted file will be automatically attached to the email when an email action is triggered~~', 'Class:TriggerOnObject:TriggerClassAttachment/ReadOnlyMessage' => 'Trigger on object is not allowed on class Attachment. Please use specific trigger~~', ]); diff --git a/datamodels/2.x/itop-attachments/dictionaries/da.dict.itop-attachments.php b/datamodels/2.x/itop-attachments/dictionaries/da.dict.itop-attachments.php index 6fbbe5f2a..df1378e2e 100644 --- a/datamodels/2.x/itop-attachments/dictionaries/da.dict.itop-attachments.php +++ b/datamodels/2.x/itop-attachments/dictionaries/da.dict.itop-attachments.php @@ -84,11 +84,13 @@ Dict::Add('DA DA', 'Danish', 'Dansk', [ Dict::Add('DA DA', 'Danish', 'Dansk', [ 'Class:TriggerOnAttachmentDownload' => 'Trigger (on object\'s attachment download)~~', 'Class:TriggerOnAttachmentDownload+' => 'Trigger on object\'s attachment download of [a child class of] the given class~~', - 'Class:TriggerOnAttachmentCreate' => 'Trigger (on object\'s attachment create)~~', - 'Class:TriggerOnAttachmentCreate+' => 'Trigger on object\'s attachment create~~', + 'Class:TriggerOnAttachmentCreate' => 'Trigger (on object\'s attachment creation)~~', + 'Class:TriggerOnAttachmentCreate+' => 'Trigger on object\'s attachment creation~~', 'Class:TriggerOnAttachmentCreate/Attribute:file_in_email' => 'Add file in email~~', 'Class:TriggerOnAttachmentCreate/Attribute:file_in_email+' => 'If checked, the file will be automatically attached to the email when an email action is triggered~~', - 'Class:TriggerOnAttachmentDelete' => 'Trigger (on object\'s attachment delete)~~', - 'Class:TriggerOnAttachmentDelete+' => 'Trigger on object\'s attachment delete~~', + 'Class:TriggerOnAttachmentDelete' => 'Trigger (on object\'s attachment deletion)~~', + 'Class:TriggerOnAttachmentDelete+' => 'Trigger on object\'s attachment deletion~~', + 'Class:TriggerOnAttachmentDelete/Attribute:file_in_email' => 'Add deleted file in email~~', + 'Class:TriggerOnAttachmentDelete/Attribute:file_in_email+' => 'If checked, the deleted file will be automatically attached to the email when an email action is triggered~~', 'Class:TriggerOnObject:TriggerClassAttachment/ReadOnlyMessage' => 'Trigger on object is not allowed on class Attachment. Please use specific trigger~~', ]); diff --git a/datamodels/2.x/itop-attachments/dictionaries/de.dict.itop-attachments.php b/datamodels/2.x/itop-attachments/dictionaries/de.dict.itop-attachments.php index 5749f92b9..bd86b5a60 100644 --- a/datamodels/2.x/itop-attachments/dictionaries/de.dict.itop-attachments.php +++ b/datamodels/2.x/itop-attachments/dictionaries/de.dict.itop-attachments.php @@ -84,11 +84,13 @@ Dict::Add('DE DE', 'German', 'Deutsch', [ Dict::Add('DE DE', 'German', 'Deutsch', [ 'Class:TriggerOnAttachmentDownload' => 'Trigger (beim Herunterladen eines Attachment eines Objekts)', 'Class:TriggerOnAttachmentDownload+' => 'Trigger für das Herunterladen des Attachments der angegebenen Klasse oder einer Unterklasse', - 'Class:TriggerOnAttachmentCreate' => 'Trigger (on object\'s attachment create)~~', - 'Class:TriggerOnAttachmentCreate+' => 'Trigger on object\'s attachment create~~', + 'Class:TriggerOnAttachmentCreate' => 'Trigger (on object\'s attachment creation)~~', + 'Class:TriggerOnAttachmentCreate+' => 'Trigger on object\'s attachment creation~~', 'Class:TriggerOnAttachmentCreate/Attribute:file_in_email' => 'Add file in email~~', 'Class:TriggerOnAttachmentCreate/Attribute:file_in_email+' => 'If checked, the file will be automatically attached to the email when an email action is triggered~~', - 'Class:TriggerOnAttachmentDelete' => 'Trigger (on object\'s attachment delete)~~', - 'Class:TriggerOnAttachmentDelete+' => 'Trigger on object\'s attachment delete~~', + 'Class:TriggerOnAttachmentDelete' => 'Trigger (on object\'s attachment deletion)~~', + 'Class:TriggerOnAttachmentDelete+' => 'Trigger on object\'s attachment deletion~~', + 'Class:TriggerOnAttachmentDelete/Attribute:file_in_email' => 'Add deleted file in email~~', + 'Class:TriggerOnAttachmentDelete/Attribute:file_in_email+' => 'If checked, the deleted file will be automatically attached to the email when an email action is triggered~~', 'Class:TriggerOnObject:TriggerClassAttachment/ReadOnlyMessage' => 'Trigger on object is not allowed on class Attachment. Please use specific trigger~~', ]); diff --git a/datamodels/2.x/itop-attachments/dictionaries/en.dict.itop-attachments.php b/datamodels/2.x/itop-attachments/dictionaries/en.dict.itop-attachments.php index 22ed209b8..c6f1253e4 100644 --- a/datamodels/2.x/itop-attachments/dictionaries/en.dict.itop-attachments.php +++ b/datamodels/2.x/itop-attachments/dictionaries/en.dict.itop-attachments.php @@ -91,11 +91,13 @@ Dict::Add('EN US', 'English', 'English', [ Dict::Add('EN US', 'English', 'English', [ 'Class:TriggerOnAttachmentDownload' => 'Trigger (on object\'s attachment download)', 'Class:TriggerOnAttachmentDownload+' => 'Trigger on object\'s attachment download of [a child class of] the given class', - 'Class:TriggerOnAttachmentCreate' => 'Trigger (on object\'s attachment create)', - 'Class:TriggerOnAttachmentCreate+' => 'Trigger on object\'s attachment create', - 'Class:TriggerOnAttachmentDelete' => 'Trigger (on object\'s attachment delete)', - 'Class:TriggerOnAttachmentDelete+' => 'Trigger on object\'s attachment delete', + 'Class:TriggerOnAttachmentCreate' => 'Trigger (on object\'s attachment creation)', + 'Class:TriggerOnAttachmentCreate+' => 'Trigger on object\'s attachment creation', + 'Class:TriggerOnAttachmentDelete' => 'Trigger (on object\'s attachment deletion)', + 'Class:TriggerOnAttachmentDelete+' => 'Trigger on object\'s attachment deletion', 'Class:TriggerOnAttachmentCreate/Attribute:file_in_email' => 'Add file in email', 'Class:TriggerOnAttachmentCreate/Attribute:file_in_email+' => 'If checked, the file will be automatically attached to the email when an email action is triggered', + 'Class:TriggerOnAttachmentDelete/Attribute:file_in_email' => 'Add deleted file in email', + 'Class:TriggerOnAttachmentDelete/Attribute:file_in_email+' => 'If checked, the deleted file will be automatically attached to the email when an email action is triggered', 'Class:TriggerOnObject:TriggerClassAttachment/ReadOnlyMessage' => 'Trigger on object is not allowed on class Attachment. Please use specific trigger', ]); diff --git a/datamodels/2.x/itop-attachments/dictionaries/es_cr.dict.itop-attachments.php b/datamodels/2.x/itop-attachments/dictionaries/es_cr.dict.itop-attachments.php index 522fec5b2..8a36f9a47 100644 --- a/datamodels/2.x/itop-attachments/dictionaries/es_cr.dict.itop-attachments.php +++ b/datamodels/2.x/itop-attachments/dictionaries/es_cr.dict.itop-attachments.php @@ -81,11 +81,13 @@ Dict::Add('ES CR', 'Spanish', 'Español, Castellano', [ Dict::Add('ES CR', 'Spanish', 'Español, Castellano', [ 'Class:TriggerOnAttachmentDownload' => 'Disparador (al descargar el archivo adjunto del objeto)', 'Class:TriggerOnAttachmentDownload+' => 'Disparador al descargar el archivo adjunto del objeto de [una clase secundaria de] la clase dada', - 'Class:TriggerOnAttachmentCreate' => 'Trigger (on object\'s attachment create)~~', - 'Class:TriggerOnAttachmentCreate+' => 'Trigger on object\'s attachment create~~', + 'Class:TriggerOnAttachmentCreate' => 'Trigger (on object\'s attachment creation)~~', + 'Class:TriggerOnAttachmentCreate+' => 'Trigger on object\'s attachment creation~~', 'Class:TriggerOnAttachmentCreate/Attribute:file_in_email' => 'Add file in email~~', 'Class:TriggerOnAttachmentCreate/Attribute:file_in_email+' => 'If checked, the file will be automatically attached to the email when an email action is triggered~~', - 'Class:TriggerOnAttachmentDelete' => 'Trigger (on object\'s attachment delete)~~', - 'Class:TriggerOnAttachmentDelete+' => 'Trigger on object\'s attachment delete~~', + 'Class:TriggerOnAttachmentDelete' => 'Trigger (on object\'s attachment deletion)~~', + 'Class:TriggerOnAttachmentDelete+' => 'Trigger on object\'s attachment deletion~~', + 'Class:TriggerOnAttachmentDelete/Attribute:file_in_email' => 'Add deleted file in email~~', + 'Class:TriggerOnAttachmentDelete/Attribute:file_in_email+' => 'If checked, the deleted file will be automatically attached to the email when an email action is triggered~~', 'Class:TriggerOnObject:TriggerClassAttachment/ReadOnlyMessage' => 'Trigger on object is not allowed on class Attachment. Please use specific trigger~~', ]); diff --git a/datamodels/2.x/itop-attachments/dictionaries/fr.dict.itop-attachments.php b/datamodels/2.x/itop-attachments/dictionaries/fr.dict.itop-attachments.php index 20895560a..e6f57da70 100644 --- a/datamodels/2.x/itop-attachments/dictionaries/fr.dict.itop-attachments.php +++ b/datamodels/2.x/itop-attachments/dictionaries/fr.dict.itop-attachments.php @@ -89,5 +89,7 @@ Dict::Add('FR FR', 'French', 'Français', [ 'Class:TriggerOnAttachmentCreate/Attribute:file_in_email+' => 'Si coché, le fichier sera automatiquement attaché à l\'email quand l\'action email est lancée', 'Class:TriggerOnAttachmentDelete' => 'Déclencheur sur la suppression d\'une pièce jointe', 'Class:TriggerOnAttachmentDelete+' => 'Déclencheur sur la suppression d\'une pièce jointe d\'un objet', + 'Class:TriggerOnAttachmentDelete/Attribute:file_in_email' => 'Ajoute le fichier supprimé dans l\'email', + 'Class:TriggerOnAttachmentDelete/Attribute:file_in_email+' => 'If checked, the deleted file will be automatically attached to the email when an email action is triggered~~', 'Class:TriggerOnObject:TriggerClassAttachment/ReadOnlyMessage' => 'Les Triggers sur les objets ne sont pas autorisés sur la classe Attachement. Veuillez utiliser les triggers spécifiques pour cette classe', ]); diff --git a/datamodels/2.x/itop-attachments/dictionaries/hu.dict.itop-attachments.php b/datamodels/2.x/itop-attachments/dictionaries/hu.dict.itop-attachments.php index 14f6ba869..49f77bb75 100644 --- a/datamodels/2.x/itop-attachments/dictionaries/hu.dict.itop-attachments.php +++ b/datamodels/2.x/itop-attachments/dictionaries/hu.dict.itop-attachments.php @@ -81,11 +81,13 @@ Dict::Add('HU HU', 'Hungarian', 'Magyar', [ Dict::Add('HU HU', 'Hungarian', 'Magyar', [ 'Class:TriggerOnAttachmentDownload' => 'Trigger (on object\'s attachment download)~~', 'Class:TriggerOnAttachmentDownload+' => 'Trigger on object\'s attachment download of [a child class of] the given class~~', - 'Class:TriggerOnAttachmentCreate' => 'Trigger (on object\'s attachment create)~~', - 'Class:TriggerOnAttachmentCreate+' => 'Trigger on object\'s attachment create~~', + 'Class:TriggerOnAttachmentCreate' => 'Trigger (on object\'s attachment creation)~~', + 'Class:TriggerOnAttachmentCreate+' => 'Trigger on object\'s attachment creation~~', 'Class:TriggerOnAttachmentCreate/Attribute:file_in_email' => 'Add file in email~~', 'Class:TriggerOnAttachmentCreate/Attribute:file_in_email+' => 'If checked, the file will be automatically attached to the email when an email action is triggered~~', - 'Class:TriggerOnAttachmentDelete' => 'Trigger (on object\'s attachment delete)~~', - 'Class:TriggerOnAttachmentDelete+' => 'Trigger on object\'s attachment delete~~', + 'Class:TriggerOnAttachmentDelete' => 'Trigger (on object\'s attachment deletion)~~', + 'Class:TriggerOnAttachmentDelete+' => 'Trigger on object\'s attachment deletion~~', + 'Class:TriggerOnAttachmentDelete/Attribute:file_in_email' => 'Add deleted file in email~~', + 'Class:TriggerOnAttachmentDelete/Attribute:file_in_email+' => 'If checked, the deleted file will be automatically attached to the email when an email action is triggered~~', 'Class:TriggerOnObject:TriggerClassAttachment/ReadOnlyMessage' => 'Trigger on object is not allowed on class Attachment. Please use specific trigger~~', ]); diff --git a/datamodels/2.x/itop-attachments/dictionaries/it.dict.itop-attachments.php b/datamodels/2.x/itop-attachments/dictionaries/it.dict.itop-attachments.php index d766a1864..a5a4aaa93 100644 --- a/datamodels/2.x/itop-attachments/dictionaries/it.dict.itop-attachments.php +++ b/datamodels/2.x/itop-attachments/dictionaries/it.dict.itop-attachments.php @@ -83,11 +83,13 @@ Dict::Add('IT IT', 'Italian', 'Italiano', [ Dict::Add('IT IT', 'Italian', 'Italiano', [ 'Class:TriggerOnAttachmentDownload' => 'Trigger (al download di un allegato dell\'oggetto)', 'Class:TriggerOnAttachmentDownload+' => 'Trigger al download di un allegato di un oggetto di [una sottoclasse di] la classe data', - 'Class:TriggerOnAttachmentCreate' => 'Trigger (on object\'s attachment create)~~', - 'Class:TriggerOnAttachmentCreate+' => 'Trigger on object\'s attachment create~~', + 'Class:TriggerOnAttachmentCreate' => 'Trigger (on object\'s attachment creation)~~', + 'Class:TriggerOnAttachmentCreate+' => 'Trigger on object\'s attachment creation~~', 'Class:TriggerOnAttachmentCreate/Attribute:file_in_email' => 'Add file in email~~', 'Class:TriggerOnAttachmentCreate/Attribute:file_in_email+' => 'If checked, the file will be automatically attached to the email when an email action is triggered~~', - 'Class:TriggerOnAttachmentDelete' => 'Trigger (on object\'s attachment delete)~~', - 'Class:TriggerOnAttachmentDelete+' => 'Trigger on object\'s attachment delete~~', + 'Class:TriggerOnAttachmentDelete' => 'Trigger (on object\'s attachment deletion)~~', + 'Class:TriggerOnAttachmentDelete+' => 'Trigger on object\'s attachment deletion~~', + 'Class:TriggerOnAttachmentDelete/Attribute:file_in_email' => 'Add deleted file in email~~', + 'Class:TriggerOnAttachmentDelete/Attribute:file_in_email+' => 'If checked, the deleted file will be automatically attached to the email when an email action is triggered~~', 'Class:TriggerOnObject:TriggerClassAttachment/ReadOnlyMessage' => 'Trigger on object is not allowed on class Attachment. Please use specific trigger~~', ]); diff --git a/datamodels/2.x/itop-attachments/dictionaries/ja.dict.itop-attachments.php b/datamodels/2.x/itop-attachments/dictionaries/ja.dict.itop-attachments.php index 45f88c3d2..f754b1efd 100644 --- a/datamodels/2.x/itop-attachments/dictionaries/ja.dict.itop-attachments.php +++ b/datamodels/2.x/itop-attachments/dictionaries/ja.dict.itop-attachments.php @@ -83,11 +83,13 @@ Dict::Add('JA JP', 'Japanese', '日本語', [ Dict::Add('JA JP', 'Japanese', '日本語', [ 'Class:TriggerOnAttachmentDownload' => 'Trigger (on object\'s attachment download)~~', 'Class:TriggerOnAttachmentDownload+' => 'Trigger on object\'s attachment download of [a child class of] the given class~~', - 'Class:TriggerOnAttachmentCreate' => 'Trigger (on object\'s attachment create)~~', - 'Class:TriggerOnAttachmentCreate+' => 'Trigger on object\'s attachment create~~', + 'Class:TriggerOnAttachmentCreate' => 'Trigger (on object\'s attachment creation)~~', + 'Class:TriggerOnAttachmentCreate+' => 'Trigger on object\'s attachment creation~~', 'Class:TriggerOnAttachmentCreate/Attribute:file_in_email' => 'Add file in email~~', 'Class:TriggerOnAttachmentCreate/Attribute:file_in_email+' => 'If checked, the file will be automatically attached to the email when an email action is triggered~~', - 'Class:TriggerOnAttachmentDelete' => 'Trigger (on object\'s attachment delete)~~', - 'Class:TriggerOnAttachmentDelete+' => 'Trigger on object\'s attachment delete~~', + 'Class:TriggerOnAttachmentDelete' => 'Trigger (on object\'s attachment deletion)~~', + 'Class:TriggerOnAttachmentDelete+' => 'Trigger on object\'s attachment deletion~~', + 'Class:TriggerOnAttachmentDelete/Attribute:file_in_email' => 'Add deleted file in email~~', + 'Class:TriggerOnAttachmentDelete/Attribute:file_in_email+' => 'If checked, the deleted file will be automatically attached to the email when an email action is triggered~~', 'Class:TriggerOnObject:TriggerClassAttachment/ReadOnlyMessage' => 'Trigger on object is not allowed on class Attachment. Please use specific trigger~~', ]); diff --git a/datamodels/2.x/itop-attachments/dictionaries/nl.dict.itop-attachments.php b/datamodels/2.x/itop-attachments/dictionaries/nl.dict.itop-attachments.php index 0d00101d3..ceee1cf4c 100644 --- a/datamodels/2.x/itop-attachments/dictionaries/nl.dict.itop-attachments.php +++ b/datamodels/2.x/itop-attachments/dictionaries/nl.dict.itop-attachments.php @@ -91,5 +91,7 @@ Dict::Add('NL NL', 'Dutch', 'Nederlands', [ 'Class:TriggerOnAttachmentCreate/Attribute:file_in_email+' => 'If checked, the file will be automatically attached to the email when an email action is triggered~~', 'Class:TriggerOnAttachmentDelete' => 'Trigger (Bij het verwijderen van een bijlage)', 'Class:TriggerOnAttachmentDelete+' => 'Trigger bij het verwijderen van een bijlage van een object van de opgegeven klasse (of subklasse ervan)', + 'Class:TriggerOnAttachmentDelete/Attribute:file_in_email' => 'Bestand toevoegen in e-mail', + 'Class:TriggerOnAttachmentDelete/Attribute:file_in_email+' => 'If checked, the deleted file will be automatically attached to the email when an email action is triggered~~', 'Class:TriggerOnObject:TriggerClassAttachment/ReadOnlyMessage' => 'Trigger on object is not allowed on class Attachment. Please use specific trigger~~', ]); diff --git a/datamodels/2.x/itop-attachments/dictionaries/pl.dict.itop-attachments.php b/datamodels/2.x/itop-attachments/dictionaries/pl.dict.itop-attachments.php index 67a1dc9f8..c948a709f 100644 --- a/datamodels/2.x/itop-attachments/dictionaries/pl.dict.itop-attachments.php +++ b/datamodels/2.x/itop-attachments/dictionaries/pl.dict.itop-attachments.php @@ -83,11 +83,13 @@ Dict::Add('PL PL', 'Polish', 'Polski', [ Dict::Add('PL PL', 'Polish', 'Polski', [ 'Class:TriggerOnAttachmentDownload' => 'Wyzwalacz (po pobraniu załącznika obiektu)', 'Class:TriggerOnAttachmentDownload+' => 'Wyzwalacz po pobraniu załącznika obiektu [klasy podrzędnej] danej klasy', - 'Class:TriggerOnAttachmentCreate' => 'Trigger (on object\'s attachment create)~~', - 'Class:TriggerOnAttachmentCreate+' => 'Trigger on object\'s attachment create~~', + 'Class:TriggerOnAttachmentCreate' => 'Trigger (on object\'s attachment creation)~~', + 'Class:TriggerOnAttachmentCreate+' => 'Trigger on object\'s attachment creation~~', 'Class:TriggerOnAttachmentCreate/Attribute:file_in_email' => 'Add file in email~~', 'Class:TriggerOnAttachmentCreate/Attribute:file_in_email+' => 'If checked, the file will be automatically attached to the email when an email action is triggered~~', - 'Class:TriggerOnAttachmentDelete' => 'Trigger (on object\'s attachment delete)~~', - 'Class:TriggerOnAttachmentDelete+' => 'Trigger on object\'s attachment delete~~', + 'Class:TriggerOnAttachmentDelete' => 'Trigger (on object\'s attachment deletion)~~', + 'Class:TriggerOnAttachmentDelete+' => 'Trigger on object\'s attachment deletion~~', + 'Class:TriggerOnAttachmentDelete/Attribute:file_in_email' => 'Add deleted file in email~~', + 'Class:TriggerOnAttachmentDelete/Attribute:file_in_email+' => 'If checked, the deleted file will be automatically attached to the email when an email action is triggered~~', 'Class:TriggerOnObject:TriggerClassAttachment/ReadOnlyMessage' => 'Trigger on object is not allowed on class Attachment. Please use specific trigger~~', ]); diff --git a/datamodels/2.x/itop-attachments/dictionaries/pt_br.dict.itop-attachments.php b/datamodels/2.x/itop-attachments/dictionaries/pt_br.dict.itop-attachments.php index 5afa8f22d..ffcd5278d 100644 --- a/datamodels/2.x/itop-attachments/dictionaries/pt_br.dict.itop-attachments.php +++ b/datamodels/2.x/itop-attachments/dictionaries/pt_br.dict.itop-attachments.php @@ -83,11 +83,13 @@ Dict::Add('PT BR', 'Brazilian', 'Brazilian', [ Dict::Add('PT BR', 'Brazilian', 'Brazilian', [ 'Class:TriggerOnAttachmentDownload' => 'Trigger (on object\'s attachment download)~~', 'Class:TriggerOnAttachmentDownload+' => 'Trigger on object\'s attachment download of [a child class of] the given class~~', - 'Class:TriggerOnAttachmentCreate' => 'Trigger (on object\'s attachment create)~~', - 'Class:TriggerOnAttachmentCreate+' => 'Trigger on object\'s attachment create~~', + 'Class:TriggerOnAttachmentCreate' => 'Trigger (on object\'s attachment creation)~~', + 'Class:TriggerOnAttachmentCreate+' => 'Trigger on object\'s attachment creation~~', 'Class:TriggerOnAttachmentCreate/Attribute:file_in_email' => 'Add file in email~~', 'Class:TriggerOnAttachmentCreate/Attribute:file_in_email+' => 'If checked, the file will be automatically attached to the email when an email action is triggered~~', - 'Class:TriggerOnAttachmentDelete' => 'Trigger (on object\'s attachment delete)~~', - 'Class:TriggerOnAttachmentDelete+' => 'Trigger on object\'s attachment delete~~', + 'Class:TriggerOnAttachmentDelete' => 'Trigger (on object\'s attachment deletion)~~', + 'Class:TriggerOnAttachmentDelete+' => 'Trigger on object\'s attachment deletion~~', + 'Class:TriggerOnAttachmentDelete/Attribute:file_in_email' => 'Add deleted file in email~~', + 'Class:TriggerOnAttachmentDelete/Attribute:file_in_email+' => 'If checked, the deleted file will be automatically attached to the email when an email action is triggered~~', 'Class:TriggerOnObject:TriggerClassAttachment/ReadOnlyMessage' => 'Trigger on object is not allowed on class Attachment. Please use specific trigger~~', ]); diff --git a/datamodels/2.x/itop-attachments/dictionaries/ru.dict.itop-attachments.php b/datamodels/2.x/itop-attachments/dictionaries/ru.dict.itop-attachments.php index 666492848..833434634 100644 --- a/datamodels/2.x/itop-attachments/dictionaries/ru.dict.itop-attachments.php +++ b/datamodels/2.x/itop-attachments/dictionaries/ru.dict.itop-attachments.php @@ -84,11 +84,13 @@ Dict::Add('RU RU', 'Russian', 'Русский', [ Dict::Add('RU RU', 'Russian', 'Русский', [ 'Class:TriggerOnAttachmentDownload' => 'Trigger (on object\'s attachment download)~~', 'Class:TriggerOnAttachmentDownload+' => 'Trigger on object\'s attachment download of [a child class of] the given class~~', - 'Class:TriggerOnAttachmentCreate' => 'Trigger (on object\'s attachment create)~~', - 'Class:TriggerOnAttachmentCreate+' => 'Trigger on object\'s attachment create~~', + 'Class:TriggerOnAttachmentCreate' => 'Trigger (on object\'s attachment creation)~~', + 'Class:TriggerOnAttachmentCreate+' => 'Trigger on object\'s attachment creation~~', 'Class:TriggerOnAttachmentCreate/Attribute:file_in_email' => 'Add file in email~~', 'Class:TriggerOnAttachmentCreate/Attribute:file_in_email+' => 'If checked, the file will be automatically attached to the email when an email action is triggered~~', - 'Class:TriggerOnAttachmentDelete' => 'Trigger (on object\'s attachment delete)~~', - 'Class:TriggerOnAttachmentDelete+' => 'Trigger on object\'s attachment delete~~', + 'Class:TriggerOnAttachmentDelete' => 'Trigger (on object\'s attachment deletion)~~', + 'Class:TriggerOnAttachmentDelete+' => 'Trigger on object\'s attachment deletion~~', + 'Class:TriggerOnAttachmentDelete/Attribute:file_in_email' => 'Add deleted file in email~~', + 'Class:TriggerOnAttachmentDelete/Attribute:file_in_email+' => 'If checked, the deleted file will be automatically attached to the email when an email action is triggered~~', 'Class:TriggerOnObject:TriggerClassAttachment/ReadOnlyMessage' => 'Trigger on object is not allowed on class Attachment. Please use specific trigger~~', ]); diff --git a/datamodels/2.x/itop-attachments/dictionaries/sk.dict.itop-attachments.php b/datamodels/2.x/itop-attachments/dictionaries/sk.dict.itop-attachments.php index fafea2013..b6d9c9c75 100644 --- a/datamodels/2.x/itop-attachments/dictionaries/sk.dict.itop-attachments.php +++ b/datamodels/2.x/itop-attachments/dictionaries/sk.dict.itop-attachments.php @@ -83,11 +83,13 @@ Dict::Add('SK SK', 'Slovak', 'Slovenčina', [ Dict::Add('SK SK', 'Slovak', 'Slovenčina', [ 'Class:TriggerOnAttachmentDownload' => 'Trigger (on object\'s attachment download)~~', 'Class:TriggerOnAttachmentDownload+' => 'Trigger on object\'s attachment download of [a child class of] the given class~~', - 'Class:TriggerOnAttachmentCreate' => 'Trigger (on object\'s attachment create)~~', - 'Class:TriggerOnAttachmentCreate+' => 'Trigger on object\'s attachment create~~', + 'Class:TriggerOnAttachmentCreate' => 'Trigger (on object\'s attachment creation)~~', + 'Class:TriggerOnAttachmentCreate+' => 'Trigger on object\'s attachment creation~~', 'Class:TriggerOnAttachmentCreate/Attribute:file_in_email' => 'Add file in email~~', 'Class:TriggerOnAttachmentCreate/Attribute:file_in_email+' => 'If checked, the file will be automatically attached to the email when an email action is triggered~~', - 'Class:TriggerOnAttachmentDelete' => 'Trigger (on object\'s attachment delete)~~', - 'Class:TriggerOnAttachmentDelete+' => 'Trigger on object\'s attachment delete~~', + 'Class:TriggerOnAttachmentDelete' => 'Trigger (on object\'s attachment deletion)~~', + 'Class:TriggerOnAttachmentDelete+' => 'Trigger on object\'s attachment deletion~~', + 'Class:TriggerOnAttachmentDelete/Attribute:file_in_email' => 'Add deleted file in email~~', + 'Class:TriggerOnAttachmentDelete/Attribute:file_in_email+' => 'If checked, the deleted file will be automatically attached to the email when an email action is triggered~~', 'Class:TriggerOnObject:TriggerClassAttachment/ReadOnlyMessage' => 'Trigger on object is not allowed on class Attachment. Please use specific trigger~~', ]); diff --git a/datamodels/2.x/itop-attachments/dictionaries/tr.dict.itop-attachments.php b/datamodels/2.x/itop-attachments/dictionaries/tr.dict.itop-attachments.php index 9c361fe06..e907661ee 100644 --- a/datamodels/2.x/itop-attachments/dictionaries/tr.dict.itop-attachments.php +++ b/datamodels/2.x/itop-attachments/dictionaries/tr.dict.itop-attachments.php @@ -83,11 +83,13 @@ Dict::Add('TR TR', 'Turkish', 'Türkçe', [ Dict::Add('TR TR', 'Turkish', 'Türkçe', [ 'Class:TriggerOnAttachmentDownload' => 'Trigger (on object\'s attachment download)~~', 'Class:TriggerOnAttachmentDownload+' => 'Trigger on object\'s attachment download of [a child class of] the given class~~', - 'Class:TriggerOnAttachmentCreate' => 'Trigger (on object\'s attachment create)~~', - 'Class:TriggerOnAttachmentCreate+' => 'Trigger on object\'s attachment create~~', + 'Class:TriggerOnAttachmentCreate' => 'Trigger (on object\'s attachment creation)~~', + 'Class:TriggerOnAttachmentCreate+' => 'Trigger on object\'s attachment creation~~', 'Class:TriggerOnAttachmentCreate/Attribute:file_in_email' => 'Add file in email~~', 'Class:TriggerOnAttachmentCreate/Attribute:file_in_email+' => 'If checked, the file will be automatically attached to the email when an email action is triggered~~', - 'Class:TriggerOnAttachmentDelete' => 'Trigger (on object\'s attachment delete)~~', - 'Class:TriggerOnAttachmentDelete+' => 'Trigger on object\'s attachment delete~~', + 'Class:TriggerOnAttachmentDelete' => 'Trigger (on object\'s attachment deletion)~~', + 'Class:TriggerOnAttachmentDelete+' => 'Trigger on object\'s attachment deletion~~', + 'Class:TriggerOnAttachmentDelete/Attribute:file_in_email' => 'Add deleted file in email~~', + 'Class:TriggerOnAttachmentDelete/Attribute:file_in_email+' => 'If checked, the deleted file will be automatically attached to the email when an email action is triggered~~', 'Class:TriggerOnObject:TriggerClassAttachment/ReadOnlyMessage' => 'Trigger on object is not allowed on class Attachment. Please use specific trigger~~', ]); diff --git a/datamodels/2.x/itop-attachments/dictionaries/zh_cn.dict.itop-attachments.php b/datamodels/2.x/itop-attachments/dictionaries/zh_cn.dict.itop-attachments.php index ebf9b4a82..20bb89467 100644 --- a/datamodels/2.x/itop-attachments/dictionaries/zh_cn.dict.itop-attachments.php +++ b/datamodels/2.x/itop-attachments/dictionaries/zh_cn.dict.itop-attachments.php @@ -83,11 +83,13 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', [ Dict::Add('ZH CN', 'Chinese', '简体中文', [ 'Class:TriggerOnAttachmentDownload' => '触发器 (于对象附件下载时)', 'Class:TriggerOnAttachmentDownload+' => '触发器于指定类型 [子类型] 对象附件下载时', - 'Class:TriggerOnAttachmentCreate' => 'Trigger (on object\'s attachment create)~~', - 'Class:TriggerOnAttachmentCreate+' => 'Trigger on object\'s attachment create~~', + 'Class:TriggerOnAttachmentCreate' => 'Trigger (on object\'s attachment creation)~~', + 'Class:TriggerOnAttachmentCreate+' => 'Trigger on object\'s attachment creation~~', 'Class:TriggerOnAttachmentCreate/Attribute:file_in_email' => 'Add file in email~~', 'Class:TriggerOnAttachmentCreate/Attribute:file_in_email+' => 'If checked, the file will be automatically attached to the email when an email action is triggered~~', - 'Class:TriggerOnAttachmentDelete' => 'Trigger (on object\'s attachment delete)~~', - 'Class:TriggerOnAttachmentDelete+' => 'Trigger on object\'s attachment delete~~', + 'Class:TriggerOnAttachmentDelete' => 'Trigger (on object\'s attachment deletion)~~', + 'Class:TriggerOnAttachmentDelete+' => 'Trigger on object\'s attachment deletion~~', + 'Class:TriggerOnAttachmentDelete/Attribute:file_in_email' => 'Add deleted file in email~~', + 'Class:TriggerOnAttachmentDelete/Attribute:file_in_email+' => 'If checked, the deleted file will be automatically attached to the email when an email action is triggered~~', 'Class:TriggerOnObject:TriggerClassAttachment/ReadOnlyMessage' => 'Trigger on object is not allowed on class Attachment. Please use specific trigger~~', ]); diff --git a/datamodels/2.x/itop-attachments/src/Trigger/TriggerOnAttachmentDelete.php b/datamodels/2.x/itop-attachments/src/Trigger/TriggerOnAttachmentDelete.php index a9c8ac7c6..34d66a692 100644 --- a/datamodels/2.x/itop-attachments/src/Trigger/TriggerOnAttachmentDelete.php +++ b/datamodels/2.x/itop-attachments/src/Trigger/TriggerOnAttachmentDelete.php @@ -34,9 +34,11 @@ class TriggerOnAttachmentDelete extends TriggerOnObject ]; MetaModel::Init_Params($aParams); MetaModel::Init_InheritAttributes(); + MetaModel::Init_AddAttribute(new AttributeBoolean("file_in_email", ["sql" => 'file_in_email', "is_null_allowed" => false, "default_value" => 'true', "allowed_values" => null, "depends_on" => [], "always_load_in_tables" => false])); + // Display lists - MetaModel::Init_SetZListItems('details', ['description', 'context', 'filter', 'action_list', 'target_class']); // Attributes to be displayed for the complete details + MetaModel::Init_SetZListItems('details', ['description', 'context', 'filter', 'action_list', 'target_class','file_in_email']); // Attributes to be displayed for the complete details MetaModel::Init_SetZListItems('list', ['finalclass', 'target_class']); // Attributes to be displayed for a list // Search criteria MetaModel::Init_SetZListItems('standard_search', ['description', 'target_class']); // Criteria of the std search form diff --git a/datamodels/2.x/itop-config-mgmt/data/en_us.data.itop-brand.xml b/datamodels/2.x/itop-config-mgmt/data/en_us.data.itop-brand.xml index 58c5690b6..0c3ef6b10 100755 --- a/datamodels/2.x/itop-config-mgmt/data/en_us.data.itop-brand.xml +++ b/datamodels/2.x/itop-config-mgmt/data/en_us.data.itop-brand.xml @@ -14,16 +14,12 @@ A2IDAuMDMsLTAuMDkgMC4wNSwtMC4xOSAwLjA2LC0wLjI4IGwgMC41OSwtMS45MSBjIDAuMSwtMC4zMyAtMC4wNSwtMC40OSAtMC40NSwtMC40OCBsIC0zLjEzLDAuMTUgYyAtMi4wOSwwLjEyIC0zLjcyLDAuMTggLTQuOSwwLjE3IC0xLjU0LDAuMDggLTMuMDgsLTAuMDcgLTQuNTgsLTAuNDYgLTEuMiwtMC40MSAtMS45NCwtMS42MSAtMS43NywtMi44NiBsIDkuOTEsLTEuMjcgYyA0LjQ0LC0wLjU3IDcuNDIsLTEuOTQgOC45MiwtNC4xMiBsIC0zLjM3LDExLjczIGMg LTAuMDcsMC4xOCAtMC4wNCwwLjM4IDAuMDcsMC41MyAwLjE4LDAuMTcgMC40MSwwLjI1IDAuNjUsMC4yMiBoIDQuMSBjIDAuNDcsMC4wNyAwLjkzLC0wLjIyIDEuMDYsLTAuNjggbCAzLjYyLC0xMi42NyBjIDAuNDgsLTEuNjcgMiwtMi40OCA0LjY3LC0yLjQ4IDIuNDEsMCA0LjIyLDAuMDIgNS4zOCwwLjA3IDAuMDMsMCAwLjA2LDAgMC4wOSwwIDAuMzksMCAwLjc0LC0wLjI2IDAuODQsLTAuNjMgbCAwLjYzLC0xLjc0IGMgMC4xNSwtMC4zIDAuMTIsLTAuNjMgLTAuMD UsLTAuODkgbSAtNjYuMTIsMTUuMjQgYyAtMS44MywwLjIzIC0zLjY4LDAuMzMgLTUuNTIsMC4zIC00LjE3LDAgLTUuOTksLTAuODQgLTUuNDYsLTIuNTMgMC4zOCwtMS4yMSAxLjQ3LC0xLjk0IDMuMjgsLTIuMTkgbCA5LjQ4LC0xLjI4IHogbSA0My44MywtMTAuMjcgYyAtMC40LDEuMyAtMi4yNSwyLjE5IC01LjU2LDIuNjcgbCAtNy45LDEuMTMgMC4yLC0wLjY1IGMgMC4zOSwtMS43NCAxLjM3LC0zLjI4IDIuNzksLTQuMzcgMS4yLC0wLjc3IDMuMTUsLTEuMTYgNS44NiwtMS4xNiAzLjU2LDAgNS4xLDAuOCA0LjYxLDIuMzgiLz4KPC9zdmc6c3ZnPgo=0 - Brand - Acer Apple image/svg+xmlicons8-mac-os.svgPD94bWwgdmVyc2lvbj0iMS4wIj8+CjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB2aWV3Qm94PSIwIDAgNDggNDgiIHdpZHRoPSI0OHB4IiBoZWlnaHQ9IjQ4cHgiPjxwYXRoIGZpbGw9IiMwODgzZDkiIGQ9Ik0zNi4yMzIsMjMuOTg1YzAtNS44NjUsNC43NjYtOC41MSw0Ljk2Ni04LjYzNmMtMi41OTYtMy45OTMtNi43OS00LjQ2Ny 04LjM2Mi00LjQ2OCBjLTMuNjQzLDAtNi44NjMsMi4wMjItOC41ODUsMi4wMjJjLTEuNzk3LDAtNC40MTgtMi4xMjEtNy4zNjMtMi4wMjJjLTMuODQzLDAuMDc1LTcuMzYzLDIuMzQ2LTkuMzM0LDUuNjkxIGMtMS4zOTcsMi4zOTYtMS45NDcsNS4yMTctMS44OTYsOC4wODdjMC4wMDIsMC4xMTMsMC4wMTcsMC4yMjgsMC4wMiwwLjM0MUgzNi4zMkMzNi4yNzksMjQuNjcxLDM2LjI0MywyNC4zMzcsMzYuMjMyLDIzLjk4NXoiLz48cGF0aCBmaWxsPSIjMDg4M2Q5IiBkPSJN MzAuNTY1LDcuMDYzQzMyLjI2MSw1LjE5MSwzMy4yMSwyLjYyMSwzMy4wNiwwYy0yLjM0NiwwLTUuMDY2LDEuMzcyLTYuNzg4LDMuMzk0IGMtMS4zNDgsMS42NzItMi43OTUsNC4yOTMtMi4yNzEsNi45MTNDMjYuNDIyLDEwLjYwNywyOS4wNDMsOS4wODUsMzAuNTY1LDcuMDYzeiIvPjxwYXRoIGZpbGw9IiMwMzcwYzgiIGQ9Ik0xNy41MTEsNDVjMi43NzEsMCwzLjc5NC0xLjg0OCw3LjQxMy0xLjg0OGMzLjM3LDAsNC40MTgsMS44NDgsNy4zMzgsMS44NDggYzMuMDcsMCw1LjA5Mi0yLjc5NSw2LjkxMy01LjU2N2MyLjI5NS0zLjIxOCwzLjA3LTYuMjg4LDMuMTY5LTYuNDE0Yy0wLjA5NCwwLTUuMjg3LTIuMTEyLTYuMDI2LTguMDE5SDUuNjc4IGMwLjE1Nyw1LjMxMSwyLjIyOCwxMC43OSw0LjY3MSwxNC4zMDlDMTIuMjcsNDIuMDU1LDE0LjQ0MSw0NSwxNy41MTEsNDV6Ii8+PC9zdmc+Cg==0 - Brand - Apple Asus @@ -42,8 +38,6 @@ 40ODQgMC4wMDEsLTUuNDg0ek0xMy4xMTEsMzkuOTE0aDE1LjczYzIuOTE0LC0wLjY0NyAzLjIxOCwtMy41NzcgMy4yMTgsLTMuNTc3YzAuMTM2LC0wLjg3MSAwLjA1NywtMS41NzQgMC4wNTcsLTEuNTc0Yy0wLjA4OCwtMC41ODggLTEuMDk0LC0zLjE3OCAtMy4yODEsLTMuNDA1Yy0xLjMwNCwtMC4xMzQgLTEyLjkxLC0xLjE1NSAtMTIuOTEsLTEuMTU1YzAuMjI1LDEuMjg4IDAuNzQ4LDEuOTM4IDEuMDk0LDIuMzExYzAuODA1LDAuODU3IDIuMDg3LDEuMDk5IDIuMDg3 LDEuMDk5YzAuMzA5LDAuMDMzIDguOTQ1LDAuODI0IDguOTQ1LDAuODI0YzAuMjc0LDAuMDE3IDAuNzk3LDAuMDkzIDAuNzksMC44NDljMCwwLjA5MSAtMC4wNzUsMC43NTcgLTAuNzM4LDAuNzU3aC0xMi4wMTRjLTAuMjc2LDAgLTAuNSwtMC4yMjQgLTAuNSwtMC41di01LjM3M2wtMy40NzgsLTAuMjgxdjkuMDI3YzAsMC41NSAwLjQ0OCwwLjk5OCAxLDAuOTk4ek00Ny40NDQsMzcuMDE3YzAuMDAxLC0wLjU1MiAwLjQ0OCwtMC45OTggMSwtMC45OThoMTEuNDI5YzAuMj g2LDAgMC41OTUsLTAuMTg3IDAuNTk1LC0wLjE4N2MwLjEzLC0wLjEyOSAwLjIzNSwtMC4zNjQgMC4yMzUsLTAuNTkxYzAsLTAuNzUzIC0wLjU2MSwtMC43ODYgLTAuODQzLC0wLjgwM2MwLDAgLTguNzMyLC0wLjgwOCAtOS4wMzYsLTAuODM0YzAsMCAtMS4yMTEsLTAuMjA3IC0yLjAxNywtMS4wNjhjLTAuMzUxLC0wLjM2OSAtMC44MTUsLTAuNzcxIC0xLjE2MSwtMi4wOTljMCwwIDExLjY3MSwwLjc2MyAxMi45NjgsMC44OTdjMi4xODksMC4yMzIgMy4yMTUsMi42MzIgMy4zMDgsMy40M2MwLDAgMC4wOTMsMC43MjIgLTAuMDIsMS42MDdjMCwwIC0wLjQ1NCwzLjM3NCAtMy42NjQsMy41NzloLTExLjc5N2MtMC41NTMsMCAtMS4wMDEsLTAuNDQ5IC0xLC0xLjAwMnoiIGZpbGw9InVybCgjY29sb3ItMikiIGlkPSJwYXRoMTEiLz48L2c+PC9nPjwvc3ZnPgo=0 - Brand - Asus Cisco @@ -63,24 +57,18 @@ jEsMC40ODUgMC4wMDMsMC43MjMgYSAxLjUzNiwxLjUzNiAwIDAgMSAtMC43NDQsMC44OTIgMy42OTEsMy42OTEgMCAwIDEgLTEuMjM5LDAuMzg3IDksOSAwIDAgMSAtMS45MiwwLjA5NyAyMS45NzMsMjEuOTczIDAgMCAxIC0yLjUwNywtMC4zMzQgYyAtMC40MzMsLTAuMDkgLTAuODY0LC0wLjE5IC0xLjI5MSwtMC4zMDMgeiBtIC0xMS4xNDQsNC40ODIgaCA0LjczIFYgMzcuODQ2IGggLTQuNzMgeiBNIDg1LjMwNSw0My4zODYgYSA0LjkzNCw0LjkzNCAwIDEgMSA2LjE 1Nyw3LjcxMSA0LjkzNCw0LjkzNCAwIDAgMSAtNi4xNTcsLTcuNzEgbSAtNi44NjcsMy44NDggYSA5Ljg3LDkuODcgMCAwIDAgMTIuMDAyLDkuNDg1IDkuNjI5LDkuNjI5IDAgMCAwIDMuMTU3LC0xNy43MjkgOS45MzQsOS45MzQgMCAwIDAgLTE1LjE2LDguMjQ0IiBpZD0icGF0aDIiLz48dXNlIGhyZWY9IiNiYXJfc2hvcnQiIHg9IjAiIGlkPSJ1c2UzIi8+PHVzZSBocmVmPSIjYmFyX3RhbGwiIHg9IjAiIGlkPSJ1c2U0Ii8+PHVzZSBocmVmPSIjYmFyX2dyYW5kZSIge D0iMCIgaWQ9InVzZTUiLz48dXNlIGhyZWY9IiNiYXJfdGFsbCIgeD0iMjUuODc1IiBpZD0idXNlNiIvPjx1c2UgaHJlZj0iI2Jhcl9zaG9ydCIgeD0iNTEuNzUiIGlkPSJ1c2U3Ii8+PHVzZSBocmVmPSIjYmFyX3RhbGwiIHg9IjUxLjc1IiBpZD0idXNlOCIvPjx1c2UgaHJlZj0iI2Jhcl9ncmFuZGUiIHg9IjUxLjc1IiBpZD0idXNlOSIvPjx1c2UgaHJlZj0iI2Jhcl90YWxsIiB4PSI3Ny42MjUiIGlkPSJ1c2UxMCIvPjx1c2UgaHJlZj0iI2Jhcl9zaG9ydCIgeD0iMTAzLjM3NSIgaWQ9InVzZTExIi8+PC9nPjxtZXRhZGF0YSBpZD0ibWV0YWRhdGExMSI+PHJkZjpSREY+PGNjOldvcmsgcmRmOmFib3V0PSIiPjxkYzp0aXRsZT5DaXNjby5jb20gRnJhbmNlPC9kYzp0aXRsZT48L2NjOldvcms+PC9yZGY6UkRGPjwvbWV0YWRhdGE+PC9zdmc+Cg==0 - Brand - Cisco Dell image/svg+xmlicons8-dell.svgPD94bWwgdmVyc2lvbj0iMS4wIj8+CjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB2aWV3Qm94PSIwIDAgNDggNDgiIHdpZHRoPSI0OHB4IiBoZWlnaHQ9IjQ4cHgiPjxwYXRoIGZpbGw9IiMwMjg4ZDEiIGQ9Ik0yNCw0QzEyLjk1Niw0LDQsMTIuOTU2LDQsMjRzOC45NTYsMjAsMjAsMjBzMjAtOC45NTYsMjAtMjBTMzUuMDQ0LDQsMjQs NHogTTI0LDQxYy05LjM5MSwwLTE3LTcuNjA5LTE3LTE3UzE0LjYwOSw3LDI0LDdzMTcsNy42MDksMTcsMTdTMzMuMzkxLDQxLDI0LDQxeiIvPjxwYXRoIGZpbGw9IiMwMjg4ZDEiIGQ9Ik0zNS42NDEsMjUuNTYzbDIuODQsMC4wMDRsLTAuMDA0LDIuMzk1bC01LjY5MS0wLjAxMmwwLjAxMi04LjE3MmwyLjg1NSwwLjAwNEwzNS42NDEsMjUuNTYzeiBNMjYuMzQsMjUuMTAybC00LjY5OSwzLjY4NGwtNC4yODUtMy4zNzljLTAuNjIxLDEuNDg0LTIuMTA5LDIuNTItMy44Mz YsMi41MTZsLTMuNjY0LTAuMDA0bDAuMDA4LTguMTcybDMuNjY4LDAuMDA0YzEuOTI2LDAuMDA0LDMuMzA5LDEuMjIzLDMuODI4LDIuNTMxbDQuMjk3LTMuMzY3bDEuNTg2LDEuMjVsLTMuOTM0LDMuMDg2bDAuNzU0LDAuNTk0bDMuOTM0LTMuMDg2bDEuNTksMS4yNTRsLTMuOTM0LDMuMDgybDAuNzUsMC41OTRsMy45NDEtMy4wODJsMC4wMDQtMi44MzZsMi44NTIsMC4wMDRsLTAuMDA4LDUuNzgxbDIuODQsMC4wMDRsLTAuMDA0LDIuMzkxbC01LjY5MS0wLjAwOEwyNi4zNCwyNS4xMDJ6IE0xNS4wMTIsMjMuODRjMC0xLjExMy0wLjczLTEuNzQyLTEuNzctMS43NDJoLTAuNjM3bC0wLjAwNCwzLjQ3N2gwLjYyMUMxNC4xODQsMjUuNTc0LDE1LjAxMiwyNS4wNTEsMTUuMDEyLDIzLjg0Ii8+PC9zdmc+Cg==0 - Brand - Dell HP Inc image/svg+xmlicons8-hp.svgPD94bWwgdmVyc2lvbj0iMS4wIj8+CjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB2aWV3Qm94PSIwIDAgNDggNDgiIHdpZHRoPSI0OHB4IiBoZWlnaHQ9IjQ4cHgiPjxwYXRoIGZpbGw9IiNmZmYiIGQ9Ik0yNCA0QTIwIDIwIDAgMSAwIDI0IDQ0QTIwIDIwIDAgMSAwIDI0IDRaIi8+PHBhdGggZmlsbD0iIzE5NzZkMiIgZD0iTTI0LDQzLj k5N2MtMC4xOTksMC0wLjY1MiwwLjAwNi0wLjg1LDBsNC0xMC45OTloNS42MjVjMC45ODcsMCwyLjA3MS0wLjc1OSwyLjQwOS0xLjY4Nmw0Ljc0OC0xMi42ODdjMC43MjUtMS45OTUtMC40MTctMy42MjYtMi41MzktMy42MjZoLTcuODA0bC02LjUxOCwxOC4yNTdoLTAuMDAybC0zLjcxMiwxMC4xOThDMTAuNTUsNDEuMzYxLDQsMzMuNDQ1LDQsMjMuOTk5YzAtOS4xNzQsNi4xNzgtMTYuOTA1LDE0LjYtMTkuMjYxbC0zLjgzLDEwLjUyNmgtMC4wMDFMOC4xNSwzMi45OTho NC4yMzlsNS41NzYtMTQuOTk5aDMuMTg1bC01LjU3NiwxNC45OTlsMy45MTksMC4wMDFsNS40MzgtMTQuMzc0YzAuNzI2LTEuOTk1LTAuNDE2LTMuNjI2LTIuNTM2LTMuNjI2SDE5LjE1bDMuOTUxLTEwLjk3OEMyMy4zOTksNC4wMDgsMjMuNjk5LDQsMjQsNGMxMS4wNDYsMCwyMCw4Ljk1MywyMCwxOS45OTlTMzUuMDQ2LDQzLjk5NywyNCw0My45OTd6IE0zNi4xNSwxNy45OTloLTMuMTg1bC00LjUwOSwxMS45OTloMy4xODVMMzYuMTUsMTcuOTk5eiIvPjwvc3ZnPgo=0 - Brand - HP Inc HPE @@ -90,8 +78,6 @@ hcGU6Y3g9Ii0yMTcuOTQxNzUiIGlua3NjYXBlOmN5PSIyNzUuMTQyNCIgaW5rc2NhcGU6d2luZG93LXdpZHRoPSIyNTYwIiBpbmtzY2FwZTp3aW5kb3ctaGVpZ2h0PSIxMzYwIiBpbmtzY2FwZTp3aW5kb3cteD0iMCIgaW5rc2NhcGU6d2luZG93LXk9IjAiIGlua3NjYXBlOndpbmRvdy1tYXhpbWl6ZWQ9IjEiIGlua3NjYXBlOmN1cnJlbnQtbGF5ZXI9ImthdG1hbl8xIj48c29kaXBvZGk6Z3VpZGUgcG9zaXRpb249IjE5Ny42NjI0NCwzMTQuNDg4NDgiIG9yaWVudGF0a W9uPSIwLC0xIiBpZD0iZ3VpZGUyIiBpbmtzY2FwZTpsb2NrZWQ9ImZhbHNlIi8+PC9zb2RpcG9kaTpuYW1lZHZpZXc+CjxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyIgaWQ9InN0eWxlMSI+Cgkuc3Qwe2ZpbGw6bm9uZTtzdHJva2U6IzAwMDAwMDtzdHJva2Utd2lkdGg6MzY7fQoJLnN0MXtmaWxsOm5vbmU7c3Ryb2tlOiMwM0E4ODM7c3Ryb2tlLXdpZHRoOjM2O30KPC9zdHlsZT4KPHBhdGggY2xhc3M9InN0MCIgZD0ibSAxOC41MTE5ODcsNDA1LjkzMDEyIHYgLTE4MCBtIDE 1NC4wMDAwMDMsMTgwIHYgLTE4MCBtIC0xNTQuMDAwMDAzLDg5IEggMTU1LjUxMTk5IG0gOTUsOTEgdiAtMTgwIG0gMCwxOCBoIDEwMiBjIDI3LjYsMCA1MCwyMi40IDUwLDUwIDAsMjcuNiAtMjIuNCw1MCAtNTAsNTAgaCAtMTAyIG0gMjIyLC02NyB2IC0zMyBoIDE1OCIgaWQ9InBhdGgxIi8+CjxwYXRoIGNsYXNzPSJzdDEiIGQ9Im0gNjMwLjUxMTk5LDM4Ny45MzAxMiBoIC0xNTggdiAtNzYgaCAxNTgiIGlkPSJwYXRoMiIvPgo8L3N2Zz4K0 - Brand - HPE IBM @@ -100,8 +86,6 @@ 3IDE2ek0zNi43NzYgMzJMMzcuNTMxIDM0IDM4LjI3NiAzMnpNNDIgMzJINDhWMzRINDJ6TTM5LjQ3OSAxN0wzOC44MTkgMTkgNDYgMTkgNDggMTkgNDggMTd6TTM5LjM5MyAyOUwzNS42NDMgMjkgMzYuMzk4IDMxIDM4LjY0OCAzMXpNNDIgMjZINDZWMjhINDJ6TTM4LjQ5IDIwTDM3LjgzIDIyIDQ2IDIyIDQ2IDIwek0wIDE0SDhWMTZIMHpNMCAxN0g4VjE5SDB6TTIgMjBINlYyMkgyek0yIDIzSDZWMjVIMnpNMiAyNkg2VjI4SDJ6TTAgMjlIOFYzMUgwek0wIDMySDhWM zRIMHpNMTAgMTdIMThWMTlIMTB6TTI0Ljk3NyAxNmMtLjkxMy0xLjIwOC0yLjM0Ny0yLTMuOTc3LTJIMTB2Mmg3LjAyM0gyNC45Nzd6Ii8+PHBhdGggZmlsbD0iIzNmNTFiNSIgZD0iTTI1LjU3OCAxN2gtOS4xMzFDMTYuMTcxIDE3LjYxMyAxNiAxOC4yODMgMTYgMTloMTBDMjYgMTguMjg4IDI1Ljg0NiAxNy42MTMgMjUuNTc4IDE3ek0yMy45NzUgMjNIMTJ2MmgxMS45NzNjLS44MzMtLjYyLTEuODU0LTEtMi45NzMtMUMyMi4xMTkgMjQgMjMuMTQyIDIzLjYyMSAyMy4 5NzUgMjN6TTE3LjAyMyAzMkgxMHYyaDExYzEuNjMgMCAzLjA2NS0uNzkyIDMuOTc3LTJIMTcuMDIzek0xOCAyOWgtMi02djJoNi40NDdIMThoNy41NzhDMjUuODQ2IDMwLjM4NyAyNiAyOS43MTIgMjYgMjlIMTh6TTIxIDIwYzAgMCAwIC4wODMgMCAxcy0xIDEtMSAxaDQuOTc5Yy40NDEtLjU4NC43Ny0xLjI1Ny45MjEtMkgyMXpNMTIgMjBIMTdWMjJIMTJ6Ii8+PGc+PHBhdGggZmlsbD0iIzNmNTFiNSIgZD0iTTIxIDI4aDQuODg1Yy0uMTU2LS43MzgtLjQ2Ny0xLjQxOC0uOTA3LTJIMjBjMCAwIDEgLjE2NyAxIDFTMjEgMjggMjEgMjh6TTEyIDI2SDE3VjI4SDEyeiIvPjwvZz48L3N2Zz4K0 - Brand - IBM Lenovo @@ -114,8 +98,6 @@ ZmlsbD0iI2ZmZiIgZD0iTTIxLjM3NywyNy45ODdjMC0wLjA5NSwwLjAwMS0yLjU4NywwLTMuNjYzYy0wLjAwMS0wLjc1OS0wLjYwNS0xLjMyNy0xLjQxNC0xLjMzMSBjLTAuNzk0LTAuMDA1LTEuMzgzLDAuNTYtMS4zODQsMS4zMzJjLTAuMDAxLDEuMDc2LDAsMy42NzksMCwzLjY3OWwtMS43NDEsMC4wMDJsMC4wMDctNi4zNzhjMCwwLDEuMTY4LTAuMDE4LDEuNzIyLTAuMDE4IGMwLDAuMjY0LTAuMDA2LDAuODMyLTAuMDA2LDAuODMyczAuMTM4LTAuMTI4LDAuMTgxLT AuMTcxYzEuMTU3LTEuMTc0LDMuMjI2LTAuOTczLDQuMDMxLDAuMzkxIGMwLjIyMywwLjM3OCwwLjMzOCwwLjc4OSwwLjM0LDEuMjIzYzAuMDA4LDEuMjY0LDAuMDAzLDQuMTA0LDAuMDAzLDQuMTA0UzIxLjk2NCwyNy45ODcsMjEuMzc3LDI3Ljk4N3oiLz48cGF0aCBmaWxsPSIjZmZmIiBkPSJNMzAuMTY0LDIxLjYwOGMwLjY0MiwwLDEuOTY0LDAuMDE1LDEuOTY0LDAuMDE1czEuNDc4LDQuMDI0LDEuNTI2LDQuMTQ5IGMwLjExNS0wLjMxMSwxLjIwOC0zLjI5LDEuNTIx LTQuMTc0YzAuNjQ2LDAuMDE4LDEuMjg4LDAuMDEsMS45NywwLjAxYy0wLjAyOSwwLjA4NC0yLjU2Miw2LjM5OC0yLjU2Miw2LjM5OGwtMS44NzYtMC4wMDMgQzMxLjkwNSwyNi4wNDIsMzAuMTkxLDIxLjY5MiwzMC4xNjQsMjEuNjA4eiIvPjxwYXRoIGZpbGw9IiNmZmYiIGQ9Ik01Ljc2NywyNi4zOTNjMC4xMDQsMCwzLjg2OCwwLjAxMSwzLjg2OCwwLjAxMWwtMC4wMDIsMS41ODFMNCwyNy45ODl2LTguMDczaDEuNzcgQzUuNzcsMTkuOTE2LDUuNzY3LDI2LjI4NCw1Ljc2NywyNi4zOTN6Ii8+PC9zdmc+Cg==0 - Brand - Lenovo Razer @@ -146,8 +128,6 @@ zIuNyA4Yy0uMSAwLS4zIDAtLjYuNEMzMiA4LjYgMzIgOC45IDMyIDkuMWMwIDEuMyAxLjggMi45IDMuNSA0LjQgMi43IDIuNCA1LjcgNS4yIDQgOC40LS41IDEtMS4zIDEuNi0yLjMgMS45LTEuMS4zLTIuMy4xLTMuNC0uNEMzMi42IDI0LjYgMzAuOCAyNSAyOS40IDI1ek0yOSAyMWMtLjIgMC0uNC4xLS42LjItLjIuMS0uNC40LS40LjYtLjEuNS4zIDEuMS44IDEuMi41LjEgMS45LjEgMi45LS41LS41LS4zLTEtLjYtMS41LS45LS40LS4zLS45LS42LTEuMS0uNkMyOS4 xIDIxIDI5LjEgMjEgMjkgMjF6Ii8+PHBhdGggZD0iTTMyLjYgMjEuN2MuMi0uMi40LS42LjYtLjkuMi0uMy4zLS43LjMtMS4xIDAtLjQgMC0uNy0uMi0xLjEtLjEtLjQtLjQtLjctLjgtMSAuNC4yLjguMyAxLjIuNy4zLjMuNi44LjggMS4zLjEuNS4yIDEgLjIgMS41IDAgLjUtLjEgMS0uMyAxLjVsMCAuMWMtLjIuNS0uOC44LTEuMy42cy0uOC0uOC0uNi0xLjNDMzIuNCAyMS45IDMyLjUgMjEuOCAzMi42IDIxLjd6TTQwLjggNC4xYy0uMiAwLS40LS4yLS41LS40IDAtL jMuMS0uNS40LS42LjEgMCAuMi0uMi4yLS42QzQxIDIuMiA0MS4yIDIgNDEuNSAyUzQyIDIuMiA0MiAyLjVDNDIgMy4zIDQxLjUgNCA0MC44IDQuMSA0MC45IDQuMSA0MC45IDQuMSA0MC44IDQuMXoiLz48cGF0aCBkPSJNMzksNC41Yy0wLjIsMC0wLjQtMC4yLTAuNS0wLjRjLTAuMS0wLjMsMC4xLTAuNSwwLjQtMC42QzM5LDMuNSw0MSwzLDQyLjUsM0M0Mi44LDMsNDMsMy4yLDQzLDMuNVM0Mi44LDQsNDIuNSw0IGMtMS40LDAtMy40LDAuNS0zLjQsMC41QzM5LjEsNC41LDM5LDQuNSwzOSw0LjV6Ii8+PC9zdmc+Cg==0 - Brand - Razer Samsung @@ -163,8 +143,6 @@ y0wLjAxMy0wLjIzNS0wLjAxMS0wLjMyNXYtMy41NmgxLjI1NHYzLjY3MmMwLDAuMDY0LDAuMDAyLDAuMTM3LDAuMDEyLDAuMTkgQzI4LjkyMSwyNS40NzMsMjkuMDI1LDI1LjcxMywyOS4zNzIsMjUuNzEzeiIvPjxwYXRoIGZpbGw9IiNmYWZhZmEiIGQ9Ik0zOS43MjUsMjUuNjZjMC4zNTksMCwwLjQ4NS0wLjIyNywwLjUwOC0wLjM1OWMwLjAwOS0wLjA1NywwLjAxMi0wLjEyNiwwLjAxMS0wLjE4OXYtMC43MiBoLTAuNTA5di0wLjcyNGgxLjc2VjI1Yy0wLjAwMSwwLjA 5My0wLjAwMywwLjE2Mi0wLjAxOCwwLjMyN2MtMC4wODIsMC45MDMtMC44NjYsMS4yMjUtMS43NDUsMS4yMjUgYy0wLjg4MSwwLTEuNjYzLTAuMzIyLTEuNzQ3LTEuMjI1Yy0wLjAxNC0wLjE2Ni0wLjAxNi0wLjIzNC0wLjAxOC0wLjMyN2wwLjAwMS0yLjA4OWMwLTAuMDg4LDAuMDExLTAuMjQ0LDAuMDIxLTAuMzI3IGMwLjExLTAuOTI4LDAuODYyLTEuMjI2LDEuNzQzLTEuMjI2YzAuODgsMCwxLjY1MSwwLjI5NywxLjc0MiwxLjIyNmMwLjAxNiwwLjE1OCwwLjAxMSwwL jMyNywwLjAxMSwwLjMyN3YwLjE2NmgtMS4yNTF2LTAuMjc4IGMwLjAwMSwwLjAwMS0wLjAwMi0wLjExOC0wLjAxNi0wLjE4OWMtMC4wMjEtMC4xMS0wLjExNi0wLjM2Mi0wLjQ5NS0wLjM2MmMtMC4zNjIsMC0wLjQ2NywwLjIzOC0wLjQ5NCwwLjM2MiBjLTAuMDE1LDAuMDY1LTAuMDIxLDAuMTU0LTAuMDIxLDAuMjM0djIuMjdjLTAuMDAxLDAuMDYzLDAuMDAzLDAuMTMyLDAuMDEzLDAuMTg5QzM5LjI0MSwyNS40MzMsMzkuMzY2LDI1LjY2LDM5LjcyNSwyNS42NnoiLz48L3N2Zz4K0 - Brand - Samsung Sony @@ -187,8 +165,6 @@ OTkyIC03Mi4wODk2LC04MS45MTk5OSAtNzUuMjg5NiwtODUuNTAzOTkgLTMuOTkzNiwtNC4zNTIgLTExLjAwOCwtMTEuMDg0NzkgLTIxLjY4MzIsLTExLjA4NDc5IGggLTI0LjQ0Nzk2IHYgLTI1LjAzNjggaCAxMzcuOTgzOTYgdiAyNC45ODU2IGggLTE2LjY0IGMgLTMuODQsMCAtNi40LDMuNjYwNzkgLTMuMTIzMiw3LjY3OTk5IDAsMCA0Ni40Mzg0LDU1LjU1MiA0Ni44NzM2LDU2LjE0MDggMC40MzUyLDAuNTg4OCAwLjgxOTIsMC43MTY4IDEuNDA4LDAuMTc5MiAwLj U4ODgsLTAuNTM3NiA0Ny41OTA0LC01NS44MDggNDcuOTQ4OCwtNTYuMzIgYSA0Ljc4NzE5OTQsNC43ODcxOTk0IDAgMCAwIC00LjA5NiwtNy42Nzk5OSBoIC0xNy4wNzUyIFYgNTM5LjA2MjEgSCAxMjgwIHYgMjUuMDM2OCBoIC0yNS4yNjcyIGMgLTkuMTY0OCwwIC0xMi44LDEuNjg5NTkgLTE5Ljc4ODgsOS40NzE5OSBsIC03Ni4xNiw4Ni44ODYzOSBhIDUuMzc1OTk5NCw1LjM3NTk5OTQgMCAwIDAgLTAuOTIxNiwzLjY4NjQgdiAzOS41MjY0IGEgMjguMTU5OTk3LDI4 LjE1OTk5NyAwIDAgMCAwLjU2MzIsNS40MDE2IDguNTI0Nzk5LDguNTI0Nzk5IDAgMCAwIDUuNDAxNiw0LjgxMjggNTAuNjExMTk0LDUwLjYxMTE5NCAwIDAgMCA2LjkxMiwwLjQzNTIgaCAyNS44MzA0IHYgMjUuMDM2OCBoIC0xMzcuMjY3MiB2IC0yNS4wMzY4IHoiIGlkPSJwYXRoMSIgZmlsbD0iIzAwMDAwMCIgc3R5bGU9InN0cm9rZS13aWR0aDoyLjU2Ii8+PC9zdmc6Zz48L3N2ZzpnPjwvc3ZnOnN2Zz4K0 - Brand - Sony Toshiba @@ -198,8 +174,6 @@ uMDEzIiBpbmtzY2FwZTp3aW5kb3ctd2lkdGg9IjI1NjAiIGlua3NjYXBlOndpbmRvdy1oZWlnaHQ9IjEzNjAiIGlua3NjYXBlOndpbmRvdy14PSIwIiBpbmtzY2FwZTp3aW5kb3cteT0iMCIgaW5rc2NhcGU6d2luZG93LW1heGltaXplZD0iMSIgaW5rc2NhcGU6Y3VycmVudC1sYXllcj0ic3ZnMSI+PHNvZGlwb2RpOmd1aWRlIHBvc2l0aW9uPSIyMjcuMzE3MTYsMzk5LjM4NTQyIiBvcmllbnRhdGlvbj0iMCwtMSIgaWQ9Imd1aWRlMSIgaW5rc2NhcGU6bG9ja2VkPSJmY WxzZSIvPjwvc29kaXBvZGk6bmFtZWR2aWV3PgogIDxzdmc6cGF0aCBmaWxsPSIjZTYxZTFlIiBkPSJtIDc2Ni4xMDAxNiw0NTkuNzEzNiBoIDM0LjU1IGwgLTM1LjY1LC0xMTcuNjYgLTQ5LjEsLTAuMDAyIC0zNS42NSwxMTcuNjYgaCAzNC41NiBsIDYuMywtMjEuNzggaCAzOC42NiBsIDYuMzMsMjEuNzggbSAtMzcuNTEsLTQ3Ljk0MyAxMS43NiwtNDAuNjUxIGggMC4yIGwgMTEuNzYsNDAuNjUxIHogbSAtNTU1LjQ2LDUwLjA1NSBjIDM1LjQ4LDAgNTIuNjMsLTYuMjU gNTUuMDYsLTM4LjI2NSAwLjU4LC03LjYxOCAwLjY5LC0xNS40MzkgMC42OSwtMjIuNjg5IDAuMDEsLTcuMjI1IC0wLjExLC0xNS4wNTQgLTAuNjksLTIyLjY3MSAtMi40MywtMzIuMDI1IC0xOS41OCwtMzguMjY1IC01NS4wNiwtMzguMjY1IC0zNS40OCwwIC01Mi42Miw2LjI0IC01NS4wNCwzOC4yNjUgLTAuNTksNy42MTcgLTAuNzEsMTUuNDQ2IC0wLjcxLDIyLjY3MSAwLjAxLDcuMjUgMC4xMiwxNS4wNzEgMC43MSwyMi42ODkgMi40MiwzMi4wMTUgMTkuNTYsMzguMjY1IDU1LjA0LDM4LjI2NSBtIC0yMi4zMSwtNjAuOTU0IGMgMCwtNi40NjEgMC4xNiwtMTAuMjggMC4zLC0xMy4xMTQgMC45LC0xOC4xNjEgOC4wNywtMjAuMjc4IDIyLjAxLC0yMC4yNzggMTMuOTUsMCAyMS4xMiwyLjExNyAyMi4wMSwyMC4yNzggMC4xNCwyLjgzMyAwLjMxLDYuNjUyIDAuMzEsMTMuMTE0IDAsNi40ODIgLTAuMTcsMTAuMzA4IC0wLjMxLDEzLjEzNSAtMC44OSwxOC4xNjQgLTguMDYsMjAuMjg1IC0yMi4wMSwyMC4yODUgLTEzLjk0LDAgLTIxLjExLC0yLjEyMSAtMjIuMDEsLTIwLjI4NSAtMC4xNCwtMi44MjcgLTAuMywtNi42NTMgLTAuMywtMTMuMTM1IHogTSAwLjY1MDE1ODIyLDM0Mi4xMDU2IHYgMjkuMzMxIEggMzUuODIyMTU4IHYgODguMzI3IGggMzUuMTg1IHYgLTg4LjMyNyBoIDM1LjE3MzAwMiB2IC0yOS4zMzEgSCAwLjY1MDE1ODIyIE0gNTQwLjUwMDE2LDQ1OS43MTM2IHYgLTExNy42NjIgaCAtMzMuMzkgdiAxMTcuNjYyIGggMzMuMzkgbSAtMTM0LjM1LC03NC43MDMgdiAtNDIuOTU5IGggLTMzLjIgdiAxMTcuNjYyIGggMzMuMiB2IC00NS4zNzIgaCAzOC41OCB2IDQ1LjM3MiBoIDMzLjE5IHYgLTExNy42NjIgaCAtMzMuMTkgdiA0Mi45NTkgaCAtMzguNTggbSAyNDQuMTcsMTMuMjA2IGMgMTQuNzksLTMuNzgxIDE5LjEzLC0xMi42MTYgMTkuMTMsLTI1LjM4NiAwLC0yNS44NTkgLTE2LjI3LC0zMC43OCAtMzkuNCwtMzAuNzggaCAtNTkuOTUgdiAxMTcuNjYgaCA2Mi45MiBjIDI4Ljk3LDAgMzguNzEsLTEyLjQ4IDM4LjcxLC0zMS42NzUgMCwtMTMuMzgzIC0zLjA2LC0yNS4xOTEgLTIxLjQxLC0yOS44MjIgbSAtNDcuMDMsMTMuMTY5IGggMjMuMDIgYyA5LjMsMCAxMS4yNCw0LjA3NCAxMS4yNCwxMC43IDAsNi42MzIgLTMuNjQsMTAuNzE3IC0xMS4yNCwxMC43MTcgaCAtMjMuMDIgeiBtIDAsLTQyLjQyNSBoIDIzLjAyIGMgNi4wMSwwIDkuNzMsMi44NTEgOS43Myw5LjcwOCAwLDUuODc4IC0zLjY4LDkuNDk2IC05LjczLDkuNDk2IGggLTIzLjAyIHogbSAtMzU1LjA2LDUyLjE0MyBoIDMxLjY1IGMgMC4wMyw1LjcwOCAwLjc2LDkuNTIzIDMuNTMsMTEuNjMgMy4xNSwyLjM3NCA1Ljk3LDMuMTU4IDE1LjMyLDMuMTU4IDksMCAxOC44NiwwIDE4Ljg2LC0xMS4wODUgMCwtOC43NDIgLTUuNTEsLTEwLjczNyAtMTUuNjgsLTExLjI3OSAtMjUuMjIsLTEuMzM2IC0zNC4zNCwtMi4wNDkgLTQzLjczLC05LjAyNSAtNi40LC00Ljc1NyAtOS43MiwtMTQuMDE4IC05LjcyLC0yNi41NDIgMCwtMjEuMjk3IDcuNDMsLTI4Ljc2OCAxOC4xNSwtMzMuOTgxIDExLjA2LC01LjM4MSA1NC40NywtNS4zODEgNjYuMTUsMCAxNC42OSw2Ljc2OCAxNS4xMiwyMS40MiAxNS4xMiwzNS4wMTEgaCAtMzEuNTcgYyAtMC4wNiwtNi45MjkgLTEuNjIsLTguODg2IC0yLjg5LC0xMC4xNzUgLTMuMjgsLTIuOTA4IC03Ljk1LC0zLjUyMiAtMTQuNjksLTMuNTIyIC04LjE2LDAgLTE3LjYsMC4zNjggLTE3LjYsMTAuMjc3IDAsNy41NiAzLjI3LDEwLjcyIDExLjg1LDExLjI3NiAxMS43OSwwLjc1NCAzNS4wMiwxLjQ5NyA0My4zLDYuMzgzIDExLjYxLDYuODY3IDE0LjYyLDE2LjE1OSAxNC42MiwzMS4zMTkgMCwyMS45MDggLTcuODQsMjguMzM4IC0xOC43NSwzMy4xNTggLTEyLjU5LDUuNTYgLTU0LjY0LDUuNTYgLTY4LjMxLC0wLjQzIC0xNS4zLC02LjY3IC0xNS42MSwtMTkuOTY0IC0xNS42MSwtMzYuMTczIiBpZD0icGF0aDEiLz4KPC9zdmc6c3ZnPgo=0 - Brand - Toshiba diff --git a/datamodels/2.x/itop-config-mgmt/data/en_us.data.itop-osfamily.xml b/datamodels/2.x/itop-config-mgmt/data/en_us.data.itop-osfamily.xml index 371582bad..d9b0bcd89 100755 --- a/datamodels/2.x/itop-config-mgmt/data/en_us.data.itop-osfamily.xml +++ b/datamodels/2.x/itop-config-mgmt/data/en_us.data.itop-osfamily.xml @@ -3,8 +3,6 @@ Arch image/svg+xmlicons8-arch-linux.svgPD94bWwgdmVyc2lvbj0iMS4wIj8+CjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgdmlld0JveD0iMCwwLDI1NiwyNTYiIHdpZHRoPSI0OHB4IiBoZWlnaHQ9IjQ4cHgiIGZpbGwtcnVsZT0ibm9uemVybyI+PGcgZmlsbD0iIzAwODhjYyIgZmlsbC1ydWxlPSJub256ZXJvIiBzdHJva2U9Im5vbmUiIHN0cm9rZS13aWR0aD0iMSIgc3Ryb2tlLWxpbmVjYXA9ImJ1dHQiIHN0cm9rZS1saW5lam9pbj0ibWl0ZXIiIHN0cm9rZS1taXRlcmxpbWl0PSIxMCIgc3Ryb2tlLWRhc2hhcnJheT0iIiBzdHJva2UtZGFzaG9mZnNldD0iMCIgZm9udC1mYW1pbHk9Im5vbmUiIGZvbnQtd2VpZ2h0PSJub25lIiBmb250LXNpemU9Im5vbmUiIHRleHQtYW5jaG9yPSJub25lIiBzdHlsZT0ibWl4LWJsZW5kLW1vZGU6IG5vcm1hbCI+PGcgdHJhbnNmb3JtPSJzY2FsZSg1LjMzMzMzLDUuMzMzMzMpIj48cGF0aCBkPSJNMjguNDY1LDM4LjYxMWMwLjQxOSwtMS4xMDUgMC42NjQsLTIuMzY1IDAuNjY0LC0zLjcxNGMwLC00LjEzMyAtMi4yMTEsLTcuNDk0IC00LjkyOSwtNy40OTRjLTIuNzQxLDAgLTQuOTUxLDMuMzYxIC00Ljk1MSw3LjQ5NGMwLDEuMzI2IDAuMjIxLDIuNTg2IDAuNjQxLDMuNjY5Yy05LjA0MSwwLjk1MSAtMTUuNDA3LDQuNzMxIC0xNy45OTMsNi40MzJjNC4zNTUsLTYuMjc4IDguOTA5LC0xMy42MzggMTMuMjYyLC0yMi4xMDVjMS4wODMsLTIuMTAxIDIuMTAxLC00LjE3OCAzLjA1LC02LjIxMWMwLjM3NSwwLjI0MyAwLjc1MSwwLjUwOSAxLjE3MSwwLjc3NWMxLjk0NSwxLjIxNSAzLjc1OSwxLjg3OSA1LjA4NCwyLjIzM2MtMC45NzMsLTAuNzMgLTIuMDMzLC0xLjYxMyAtMy4xMTYsLTIuNjk3Yy0wLjgxNywtMC44MTcgLTEuNTQ3LC0xLjYzNyAtMi4xNjcsLTIuNDMzYzEuODM1LC00LjAyMiAzLjQyNywtNy44OTEgNC44MTksLTExLjU2YzIuMzIsNi4xNDQgNS4yMTcsMTIuODQyIDguODQxLDE5Ljg5M2MyLjM0Myw0LjUzMSA0LjczMSw4Ljc1NCA3LjExNywxMi42NDRjLTAuNjg1LC0wLjM3NSAtMS40MzcsLTAuNzMgLTIuMjMzLC0xLjAzOWMtMS4zNzEsLTAuNTMgLTIuNjUyLC0wLjg2MiAtMy43NTksLTEuMDZjMS41MDMsMC43NTEgMy4yNSwxLjc0NyA1LjA4NCwzLjA3M2MxLjE5NCwwLjg4NSAyLjI1NCwxLjc2OSAzLjE2MSwyLjYzMWMwLjAyMSwwLjAyMSAwLjAyMSwwLjAyMSAwLjA0NSwwLjA0NWMxLjI2LDIuMDU2IDIuNTY1LDMuOTU3IDMuODQ2LDUuODEzYy0yLjU0MSwtMS42ODEgLTguNzk2LC01LjM5NSAtMTcuNjM3LC02LjM4OXoiLz48L2c+PC9nPjwvc3ZnPgo=0 - OS Family - Arch Debian @@ -24,8 +22,6 @@ k5LTQuMjZjMC42NjktMC44NDEtMC4xMzItMC4wMDItMC4yNjMtMC4yMTVjMS40NjktMS41MiwxLjkzLTEuMDczLDIuOTItMS4zNDljMS4wNjgtMC42MzMtMC45MTcsMC4yNTEtMC40MS0wLjIzOWMxLjg0OC0wLjQ3MywxLjMxLTEuMDczLDMuNzE4LTEuMzExYzAuMjU0LDAuMTQ1LTAuNTksMC4yMjMtMC44LDAuNDFjMS41MzgtMC43NTMsNC44Ny0wLjU4NCw3LjAzNCwwLjQxN2MyLjUxMSwxLjE3Myw1LjMzLDQuNjQyLDUuNDQzLDcuOTA0bDAuMTI2LDAuMDM1Yy0wLjA2 MywxLjI5OCwwLjE5OCwyLjc5OC0wLjI1Nyw0LjE3NUwzNS4yOTQsMjAuOTg2IE0yMC4wNzIsMjUuMzg5bC0wLjA4NiwwLjQzMWMwLjQwMywwLjU0NywwLjcyNCwxLjE0MiwxLjIzNywxLjU2N0MyMC44NTMsMjYuNjY0LDIwLjU3NywyNi4zNjQsMjAuMDcyLDI1LjM4OSBNMjEuMDIzLDI1LjM1M2MtMC4yMTMtMC4yMzctMC4zNC0wLjUxOC0wLjQ4LTAuODAyYzAuMTM1LDAuNDk1LDAuNDExLDAuOTIyLDAuNjY5LDEuMzU3TDIxLjAyMywyNS4zNTMgTTM3Ljg3NywyMS42OD hsLTAuMDg4LDAuMjI2Yy0wLjE2NiwxLjE3NC0wLjUyMywyLjMzMi0xLjA2OCwzLjQxMkMzNy4zMjQsMjQuMTg5LDM3LjcxNCwyMi45NDcsMzcuODc3LDIxLjY4OCBNMjQuNTYsNS4xODVDMjQuOTc0LDUuMDMxLDI1LjU3OSw1LjEwMSwyNi4wMTksNWMtMC41NzMsMC4wNDgtMS4xNDQsMC4wNzktMS43MDYsMC4xNTFMMjQuNTYsNS4xODUgTTEwLjAwNywxMi45MjNjMC4wOTUsMC44ODItMC42NjcsMS4yMjksMC4xNjcsMC42NDRDMTAuNjIzLDEyLjU2MiwxMCwxMy4yODYsMTAuMDA3LDEyLjkyMyBNOS4wMjgsMTcuMDE2YzAuMTkxLTAuNTkyLDAuMjI2LTAuOTQzLDAuMy0xLjI4NUM4Ljc5NywxNi40MSw5LjA4NCwxNi41NTMsOS4wMjgsMTcuMDE2Ii8+PC9zdmc+Cg==0 - OS Family - Debian Oracle Linux @@ -41,8 +37,6 @@ Jva2UtbGluZWNhcDpzcXVhcmU7cGFpbnQtb3JkZXI6c3Ryb2tlIGZpbGwgbWFya2VycyIgZD0ibSAyNS4zOTE1MTcsNDcuOTMwODcxIGggNC45ODA4NjMgdiAzLjgzMDAyNSBoIC00Ljk4MDg2MyB6IG0gNjEuNTAwOCwxOC41NTcwNjEgLTcuMjQsLTEwLjI0MDAwMiBoIDQuOTYgbCA0LjY0LDcuMDgwMDAyIGggMC4yNCBsIDQuNzYsLTcuMDgwMDAyIGggNC43MiBsIC03LjI4LDEwLjE2MDAwMiA3LjY0LDEwLjg4IGggLTQuOTYgbCAtNS4wOCwtNy43MiBoIC0wLjI0IGwg LTUuMTIsNy43MiBoIC00LjcyIHogbSAtMjEuNTk5OTk4LDExLjI4IHEgLTYuNjgsMCAtNi42OCwtNy4yNCBWIDU2LjI0NzkzIGggNC4xMiB2IDEzLjc2MDAwMiBxIDAsMi4zNiAxLjA0LDMuMzIgMS4wOCwwLjkyIDMuMTIsMC45MiAxLjQsMCAyLjYsLTAuNjggMS4yLC0wLjcyIDEuODgsLTIgMC43MiwtMS4yOCAwLjcyLC0yLjk2IFYgNTYuMjQ3OTMgaCA0LjEyIHYgMjEuMDQwMDAyIGggLTMuMzIgbCAtMC40LC0yLjggaCAtMC4yOCBxIC0xLjE2LDEuNiAtMi45MiwyLj Q0IC0xLjc2LDAuODQgLTQsMC44NCB6IE0gMzUuODEyMzIsNTYuMjQ3OTMgaCAzLjMyMDAwMSBsIDAuNCwyLjgwMDAwMiBoIDAuMjggcSAxLjEyLC0xLjYwMDAwMiAyLjg4LC0yLjQ0MDAwMiAxLjgsLTAuODQgNC4wNCwtMC44NCA2LjY4LDAgNi42OCw3LjI0MDAwMiB2IDE0LjI4IGggLTQuMTIgdiAtMTMuNzYgcSAwLC0yLjM2IC0xLjA4LC0zLjI4IC0xLjA0LC0wLjk2IC0zLjA4LC0wLjk2IC0xLjQsMCAtMi42LDAuNzIgLTEuMiwwLjY4IC0xLjkyLDEuOTYgLTAuNjgsMS4yOCAtMC42OCwyLjk2IHYgMTIuMzYgSCAzNS44MTIzMiBaIE0gMy42MTIzOSw0Ny45MzA4NzEgaCA0LjQ0IHYgMjUuNTE3MDYxIGggMTQuMjggdiAzLjg0IGggLTE4LjcyIHogTSAyNi4yNTY3NjgsNTkuNDYzOTUgViA3Ny4yODc5MzIgSCAzMC4zNzIzOCBWIDU2LjI3NTQ2NCBoIC02LjM4NzYxMiB2IDEuODI1NjgxIHoiLz48L2c+PC9zdmc+Cg==0 - OS Family - Oracle Linux Red Hat @@ -68,8 +62,6 @@ TggYy0wLjM0NC0wLjAyNy0wLjUyNi0wLjA4Ny0wLjU0My0wLjE2NGMtMC4wMTItMC4wNTIsMC4wNTUtMC4xMTEsMC4xOTctMC4xNzFjMC4wNy0wLjAzLDAuMTUzLTAuMDYxLDAuMjU2LTAuMDg5IGMwLjU4NC0wLjE2OSwwLjkxLTAuNjA4LDAuNTk0LTAuODA1Yy0wLjMzNy0wLjIxMi0xLjQ5Mi0wLjM0NS0yLjAwNC0wLjIzMWMtMC4yMTcsMC4wNDktMC4zNDIsMC4wNTEtMC4zNzQsMC4wMTMgYy0wLjAwMS0wLjAwMS0wLjAwNC0wLjAwMy0wLjAwNS0wLjAwNmMtMC4wMDk tMC4wMTUtMC4wMDQtMC4wMzUsMC4wMTEtMC4wNjJjMC4wMTItMC4wMTYsMC4wMjYtMC4wMzEsMC4wNDctMC4wNDggYzAsMCwwLjAwMSwwLDAuMDAyLDBjMC4wMTktMC4wMTgsMC4wNDUtMC4wMzIsMC4wNzItMC4wNDZjMC4wMDItMC4wMDMsMC4wMDYtMC4wMDMsMC4wMS0wLjAwNmMwLjAyNy0wLjAxNCwwLjA1Ny0wLjAyNywwLjA5Mi0wLjA0MSBjMC4wMDUtMC4wMDIsMC4wMDgtMC4wMDMsMC4wMTEtMC4wMDVjMC4wMzctMC4wMTQsMC4wNzctMC4wMjgsMC4xMjEtMC4wN DJjMC4wMDEsMCwwLjAwMy0wLjAwMiwwLjAwNS0wLjAwMiBjMC4yNzYtMC4wOSwwLjY4Mi0wLjE2NCwxLjEtMC4yMTNjMC4wMDgtMC4wMDMsMC4wMTQtMC4wMDMsMC4wMjEtMC4wMDNjMC4wNjEtMC4wMDksMC4xMjMtMC4wMTQsMC4xODYtMC4wMiBjMC4wMDktMC4wMDIsMC4wMTktMC4wMDIsMC4wMjctMC4wMDNjMC4wNjEtMC4wMDQsMC4xMTktMC4wMDksMC4xOC0wLjAxM2MwLjAwOSwwLDAuMDE5LTAuMDAyLDAuMDI3LTAuMDAyIGMwLjA2NS0wLjAwMywwLjEzMS0wLjAwNywwLjE5My0wLjAwOWMwLjAwNCwwLDAuMDA2LDAsMC4wMDYsMGMwLjIwNi0wLjAwOCwwLjQtMC4wMDIsMC41NzEsMC4wMTIgYzAuOTQ4LDAuMDg2LDEuNzE2LDAuNDIxLDEuODY4LDAuODEzYzAuMDE1LDAuMDQsMC4wMjQsMC4wOCwwLjAyNywwLjEyM0MyOS41MSwxMi45NzksMjkuMzIsMTMuMjAxLDI5LjAwMSwxMy4zOHoiLz48L3N2Zz4K0 - OS Family - Red Hat Ubuntu @@ -79,8 +71,6 @@ 41LTEuMS0yLjUtMi41YzAtMC4yLDAtMC41LDAuMS0wLjdDMjYuNSwzMy44LDI1LjMsMzQsMjQsMzRjLTUuMSwwLTkuMi0zLjgtOS45LTguN2MtMC40LDAuNy0xLjIsMS4yLTIuMSwxLjIgYy0xLjQsMC0yLjUtMS4xLTIuNS0yLjVzMS4xLTIuNSwyLjUtMi41YzAuOSwwLDEuNywwLjUsMi4xLDEuMmMwLjctNC45LDQuOC04LjcsOS45LTguN2MxLjMsMCwyLjUsMC4yLDMuNiwwLjcgYy0wLjEtMC4yLTAuMS0wLjQtMC4xLTAuN2MwLTEuNCwxLjEtMi41LDIuNS0yLjVzMi41 LDEuMSwyLjUsMi41YzAsMS4yLTAuOCwyLjItMiwyLjRDMzIuNywxOC4zLDM0LDIxLDM0LDI0cy0xLjMsNS43LTMuNSw3LjYgQzMxLjcsMzEuOCwzMi41LDMyLjgsMzIuNSwzNHoiLz48cGF0aCBmaWxsPSIjZTY0YTE5IiBkPSJNMzAgMTEuNWMxLjQgMCAyLjUgMS4xIDIuNSAyLjUgMCAxLjQtMS4xIDIuNS0yLjUgMi41cy0yLjUtMS4xLTIuNS0yLjVDMjcuNSAxMi42IDI4LjYgMTEuNSAzMCAxMS41TTMwIDEwLjVjLTEuOSAwLTMuNSAxLjYtMy41IDMuNXMxLjYgMy41ID MuNSAzLjUgMy41LTEuNiAzLjUtMy41UzMxLjkgMTAuNSAzMCAxMC41ek0yNCAyNGMtMi42LTQuMS01LjItOC4xLTcuOC0xMi4yIi8+PHBhdGggZmlsbD0iI2U2NGExOSIgZD0iTTE5LjEgMTAuN0gyMS4xVjI1LjFIMTkuMXoiIHRyYW5zZm9ybT0icm90YXRlKC0zMi40NjcgMjAuMTI3IDE3LjkxMSkiLz48cGF0aCBmaWxsPSIjZTY0YTE5IiBkPSJNMjQgMjNIMzguNFYyNUgyNHoiLz48Zz48cGF0aCBmaWxsPSIjZTY0YTE5IiBkPSJNMjQsMjRjLTIuNyw0LTUuMyw4LTgsMTIiLz48cGF0aCBmaWxsPSIjZTY0YTE5IiBkPSJNMTIuOCAyOUgyNy4yMDAwMDAwMDAwMDAwMDNWMzFIMTIuOHoiIHRyYW5zZm9ybT0icm90YXRlKC01Ni4zMTIgMTkuOTk4IDMwLjAwNikiLz48L2c+PC9zdmc+Cg==0 - OS Family - Ubuntu Ubuntu server @@ -90,26 +80,18 @@ 41LTEuMS0yLjUtMi41YzAtMC4yLDAtMC41LDAuMS0wLjdDMjYuNSwzMy44LDI1LjMsMzQsMjQsMzRjLTUuMSwwLTkuMi0zLjgtOS45LTguN2MtMC40LDAuNy0xLjIsMS4yLTIuMSwxLjIgYy0xLjQsMC0yLjUtMS4xLTIuNS0yLjVzMS4xLTIuNSwyLjUtMi41YzAuOSwwLDEuNywwLjUsMi4xLDEuMmMwLjctNC45LDQuOC04LjcsOS45LTguN2MxLjMsMCwyLjUsMC4yLDMuNiwwLjcgYy0wLjEtMC4yLTAuMS0wLjQtMC4xLTAuN2MwLTEuNCwxLjEtMi41LDIuNS0yLjVzMi41 LDEuMSwyLjUsMi41YzAsMS4yLTAuOCwyLjItMiwyLjRDMzIuNywxOC4zLDM0LDIxLDM0LDI0cy0xLjMsNS43LTMuNSw3LjYgQzMxLjcsMzEuOCwzMi41LDMyLjgsMzIuNSwzNHoiLz48cGF0aCBmaWxsPSIjZTY0YTE5IiBkPSJNMzAgMTEuNWMxLjQgMCAyLjUgMS4xIDIuNSAyLjUgMCAxLjQtMS4xIDIuNS0yLjUgMi41cy0yLjUtMS4xLTIuNS0yLjVDMjcuNSAxMi42IDI4LjYgMTEuNSAzMCAxMS41TTMwIDEwLjVjLTEuOSAwLTMuNSAxLjYtMy41IDMuNXMxLjYgMy41ID MuNSAzLjUgMy41LTEuNiAzLjUtMy41UzMxLjkgMTAuNSAzMCAxMC41ek0yNCAyNGMtMi42LTQuMS01LjItOC4xLTcuOC0xMi4yIi8+PHBhdGggZmlsbD0iI2U2NGExOSIgZD0iTTE5LjEgMTAuN0gyMS4xVjI1LjFIMTkuMXoiIHRyYW5zZm9ybT0icm90YXRlKC0zMi40NjcgMjAuMTI3IDE3LjkxMSkiLz48cGF0aCBmaWxsPSIjZTY0YTE5IiBkPSJNMjQgMjNIMzguNFYyNUgyNHoiLz48Zz48cGF0aCBmaWxsPSIjZTY0YTE5IiBkPSJNMjQsMjRjLTIuNyw0LTUuMyw4LTgsMTIiLz48cGF0aCBmaWxsPSIjZTY0YTE5IiBkPSJNMTIuOCAyOUgyNy4yMDAwMDAwMDAwMDAwMDNWMzFIMTIuOHoiIHRyYW5zZm9ybT0icm90YXRlKC01Ni4zMTIgMTkuOTk4IDMwLjAwNikiLz48L2c+PC9zdmc+Cg==0 - OS Family - Ubuntu server vCenter Server image/svg+xmlicons8-vmware.svgPD94bWwgdmVyc2lvbj0iMS4wIj8+CjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB2aWV3Qm94PSIwIDAgNTAgNTAiIHdpZHRoPSI1MHB4IiBoZWlnaHQ9IjUwcHgiPjxwYXRoIGQ9Ik0gNDIuNDE0MDYzIDE1IEMgMzguODI0MjE5IDE1IDM2LjU3NDIxOSAxNy41IDM2LjU3NDIxOSAxNy41IEMgMzUuMzc4OTA2IDE1Ljk0MTQwNiAzMy43MzA0NjkgMTUuMDAzOTA2IDMwLjk0MTQwNiAxNS4wMDM5MDYgQyAyNy45OTYwOTQgMTUuMDAzOTA2IDI2LjA0Mjk2OSAxNy41IDI2LjA0Mjk2OSAxNy41IEMgMjQuODQ3NjU2IDE1Ljk0MTQwNiAyMi42ODc1IDE1IDIxIDE1IEMgMTguMzkwNjI1IDE1IDE2LjMyMDMxMyAxNi4xNTIzNDQgMTUuMDU0Njg4IDE5LjA1ODU5NCBMIDEwLjgyMDMxMyAyOC4zMjAzMTMgTCA2LjAzMTI1IDE2LjU1ODU5NCBDIDUuNDI1NzgxIDE1LjIyNjU2MyAzLjkzMzU5NCAxNC42MjUgMi41NDI5NjkgMTUuMjQ2MDk0IEMgMS4xNDg0MzggMTUuODcxMDk0IDAuNjM2NzE5IDE3LjQyNTc4MSAxLjI2NTYyNSAxOC43NTc4MTMgTCA3LjExMzI4MSAzMS45NDUzMTMgQyA4LjAzMTI1IDMzLjk0OTIxOSA5LjAwMzkwNiAzNSAxMC44MjAzMTMgMzUgQyAxMi43NjU2MjUgMzUgMTMuNjA5Mzc1IDMzLjg1NTQ2OSAxNC41MzEyNSAzMS45NDUzMTMgQyAxNC41MzEyNSAzMS45NDUzMTMgMTguNTExNzE5IDIzLjA2MjUgMTkgMjIgQyAxOS40ODgyODEgMjAuOTM3NSAyMC4zMDA3ODEgMjAgMjEuNSAyMCBDIDIyLjg3NSAyMCAyNCAyMS4xMjUgMjQgMjIuNSBMIDI0IDMyLjM3NSBDIDI0IDMzLjgyMDMxMyAyNS4wODU5MzggMzUgMjYuNTIzNDM4IDM1IEMgMjcuOTU3MDMxIDM1IDI5IDMzLjgyMDMxMyAyOSAzMi4zNzUgTCAyOSAyMi41IEMgMjkgMjEuMTI1IDMwLjEyNSAyMCAzMS41IDIwIEMgMzIuODc1IDIwIDM0IDIxLjEyNSAzNCAyMi41IEwgMzQgMzIuNSBDIDM0IDMzLjg3NSAzNS4xMjUgMzUgMzYuNSAzNSBDIDM3Ljg3NSAzNSAzOSAzMy44NzUgMzkgMzIuNSBMIDM5IDIyLjUgQyAzOSAyMS4xMjUgNDAuMTI1IDIwIDQxLjUgMjAgQyA0Mi44NzUgMjAgNDQgMjEuMTI1IDQ0IDIyLjUgTCA0NCAzMi41IEMgNDQgMzMuODc1IDQ1LjEyNSAzNSA0Ni41IDM1IEMgNDcuODc1IDM1IDQ5IDMzLjg3NSA0OSAzMi41IEwgNDkgMjEuMzU1NDY5IEMgNDkgMTcuNjE3MTg4IDQ2LjAxMTcxOSAxNSA0Mi40MTQwNjMgMTUgWiIvPjwvc3ZnPgo=0 - OS Family - vCenter Server Windows image/svg+xmlicons8-windows.svgPD94bWwgdmVyc2lvbj0iMS4wIj8+CjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB2aWV3Qm94PSIwIDAgNDggNDgiIHdpZHRoPSI0OHB4IiBoZWlnaHQ9IjQ4cHgiPjxwYXRoIGZpbGw9IiMxOTc2ZDIiIGQ9Ik02LDZoMTd2MTdINlY2eiIvPjxwYXRoIGZpbGw9IiMxOTc2ZDIiIGQ9Ik0yNS4wNDIsMjIuOTU4VjZINDJ2MTYuOTU4SDI1LjA0MnoiLz48cGF0aCBmaWxsPSIjMTk3NmQyIiBkPSJNNiwyNWgxN3YxN0g2VjI1eiIvPjxwYXRoIGZpbGw9IiMxOTc2ZDIiIGQ9Ik0yNSw0MlYyNWgxN3YxN0gyNXoiLz48L3N2Zz4K0 - OS Family - Windows Windows server image/svg+xmlicons8-windows-server.svgPD94bWwgdmVyc2lvbj0iMS4wIj8+CjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB2aWV3Qm94PSIwIDAgNDggNDgiIHdpZHRoPSI0OHB4IiBoZWlnaHQ9IjQ4cHgiPjxwYXRoIGZpbGw9IiMwMGIwZmYiIGQ9Ik0yMCAyNS4wMjZMNS4wMTEgMjUgNS4wMTIgMzcuNzQ0IDIwIDM5LjgxOHpNMjIgMjUuMDNMMjIgNDAuMDk1IDQyLjk5NSA0MyA0MyAyNS4wNjZ6TTIwIDguMjU2TDUgMTAuMzggNS4wMTQgMjMgMjAgMjN6TTIyIDcuOTczTDIyIDIzIDQyLjk5NSAyMyA0Mi45OTUgNXoiLz48L3N2Zz4K0 - OS Family - Windows server diff --git a/datamodels/2.x/itop-config-mgmt/data/en_us.data.itop-osversion.xml b/datamodels/2.x/itop-config-mgmt/data/en_us.data.itop-osversion.xml index 985986b9e..ec4351fd9 100755 --- a/datamodels/2.x/itop-config-mgmt/data/en_us.data.itop-osversion.xml +++ b/datamodels/2.x/itop-config-mgmt/data/en_us.data.itop-osversion.xml @@ -3,112 +3,70 @@ 10 8 Windows - Windows - OS Version - 10 11 8 Windows - Windows - OS Version - 11 11.5 2 Debian - Debian - OS Version - 11.5 18.04 LTS 6 Ubuntu server - Ubuntu server - OS Version - 18.04 LTS 20.04 LTS 5 Ubuntu - Ubuntu - OS Version - 20.04 LTS 20.04 LTS 6 Ubuntu server - Ubuntu server - OS Version - 20.04 LTS 2019 9 Windows server - Windows server - OS Version - 2019 2022 9 Windows server - Windows server - OS Version - 2022 22.04 LTS 5 Ubuntu - Ubuntu - OS Version - 22.04 LTS 22.04 LTS 6 Ubuntu server - Ubuntu server - OS Version - 22.04 LTS 6.7 7 vCenter Server - vCenter Server - OS Version - 6.7 9 4 Red Hat - Red Hat - OS Version - 9 9.1 3 Oracle Linux - Oracle Linux - OS Version - 9.1 Roling release 1 Arch - Arch - OS Version - Roling release \ No newline at end of file diff --git a/datamodels/2.x/itop-container-mgmt/datamodel.itop-container-mgmt.xml b/datamodels/2.x/itop-container-mgmt/datamodel.itop-container-mgmt.xml index 3347fc496..612064726 100644 --- a/datamodels/2.x/itop-container-mgmt/datamodel.itop-container-mgmt.xml +++ b/datamodels/2.x/itop-container-mgmt/datamodel.itop-container-mgmt.xml @@ -1480,19 +1480,19 @@ 1 - + 5 ContainerApplication - + 6 ContainerHost - + 7 ContainerCluster - + 8 ContainerImage @@ -1507,11 +1507,11 @@ 0 - + 21 ContainerType - + 22 ContainerImageType diff --git a/datamodels/2.x/itop-flow-map/data/en_us.data.itop-flow-map.xml b/datamodels/2.x/itop-flow-map/data/en_us.data.itop-flow-map.xml index 32f326d09..5e4e2c076 100644 --- a/datamodels/2.x/itop-flow-map/data/en_us.data.itop-flow-map.xml +++ b/datamodels/2.x/itop-flow-map/data/en_us.data.itop-flow-map.xml @@ -1,16 +1,16 @@ - http + HTTP - https + HTTPS - ftp + FTP - sftp + SFTP AS2 @@ -18,4 +18,7 @@ X.400 + + FTPS + \ No newline at end of file diff --git a/datamodels/2.x/itop-flow-map/datamodel.itop-flow-map.xml b/datamodels/2.x/itop-flow-map/datamodel.itop-flow-map.xml index 01a2be920..d64732aec 100644 --- a/datamodels/2.x/itop-flow-map/datamodel.itop-flow-map.xml +++ b/datamodels/2.x/itop-flow-map/datamodel.itop-flow-map.xml @@ -2,7 +2,7 @@ - cmdbAbstractObject + FunctionalCI bizmodel,searchable false @@ -14,6 +14,10 @@ + + + + @@ -32,23 +36,9 @@ - - name - - false - - - org_id - - - false - Organization - DEL_MANUAL - all - source_id - + false FunctionalCI @@ -74,7 +64,7 @@ destination_id - + false FunctionalCI @@ -107,12 +97,6 @@ DEL_MANUAL all - - description - - true - all - status @@ -141,27 +125,6 @@ list all - - rank - - - high - 10 - - - medium - 20 - - - low - 30 - - - business_criticity - low - false - list - rank @@ -199,24 +162,36 @@ false list - - lnkContactToDataFlow - dataflow_id - 0 - 0 - contact_id - - - - lnkDocumentToDataFlow - dataflow_id - 0 - 0 - document_id - - - + + + EVENT_DB_CHECK_TO_WRITE + 10 + evtCheckSourceAndDestination + + + + + /** + * Ensure that the source and destination of a data flow are not DataFlow themselves + * + */ + false + public + EventListener + Get('source_id'), false, true); + $oDestination = MetaModel::GetObject(FunctionalCI::class, $this->Get('destination_id'), false, true); + if ($oSource instanceof DataFlow) { + $this->AddCheckIssue(Dict::Format('Class:DataFlow/Error:CheckSource', $oSource->GetName())); + } + if ($oDestination instanceof DataFlow) { + $this->AddCheckIssue(Dict::Format('Class:DataFlow/Error:CheckDestination', $oDestination->GetName())); + } + } ]]> + + @@ -257,7 +232,7 @@ - + 10 @@ -302,14 +277,25 @@ - + - + 10 10 + + + + 10 + + + 20 + + + 20 + 20 @@ -342,201 +328,46 @@ - + 10 - + 20 + + 30 + + + 40 + - + destination_impact = 'yes' AND id = :this->destination_id]]> id]]> both - + contacts_list down + + + + destination_id]]> + id]]> + both + + + - - cmdbAbstractObject - - 1 - bizmodel - false - autoincrement - lnkdocumenttodataflow - id - - - - - - - - - - - - - - - - - - - - - - false - true - - - - - - dataflow_id - DataFlow - false - DEL_AUTO - - - document_id - Document - false - DEL_AUTO - - - - -
- - - 10 - - - 20 - - -
- - - - 10 - - - 20 - - - - - - - 10 - - - 20 - - - -
-
- - cmdbAbstractObject - - 1 - bizmodel - false - autoincrement - lnkcontacttodataflow - id - - - - - - - - - - - - - - - - - - - - - - false - true - - - - - - dataflow_id - DataFlow - false - DEL_AUTO - - - contact_id - Contact - false - DEL_AUTO - - - - -
- - - 10 - - - 20 - - -
- - - - 10 - - - 20 - - - - - - - 10 - - - 20 - - - -
-
Typology @@ -554,6 +385,16 @@ + + + + + + + false + true + + @@ -629,6 +470,15 @@ + + + + id]]> + id]]> + both + + + @@ -636,7 +486,7 @@
- 25 + 125
@@ -647,7 +497,7 @@
- 25 + 115
@@ -658,7 +508,7 @@
- 25 + 165
@@ -669,7 +519,7 @@
- 25 + 165
@@ -680,7 +530,40 @@
- 25 + 115 + + +
+ +
+ + +
+ + + 105 + + +
+
+
+ + +
+ + + 165 + + +
+
+
+ + +
+ + + 75
@@ -691,7 +574,7 @@
- 25 + 125
@@ -702,7 +585,7 @@
- 25 + 165
@@ -713,7 +596,7 @@
- 25 + 155
@@ -726,7 +609,7 @@ - + 20 DataFlow @@ -735,6 +618,21 @@ + + + + + 0 + + + 23 + DataFlowType + + + + + + diff --git a/datamodels/2.x/itop-flow-map/dictionaries/en.dict.itop-flow-map.php b/datamodels/2.x/itop-flow-map/dictionaries/en.dict.itop-flow-map.php index 415129609..e1d46dbb8 100644 --- a/datamodels/2.x/itop-flow-map/dictionaries/en.dict.itop-flow-map.php +++ b/datamodels/2.x/itop-flow-map/dictionaries/en.dict.itop-flow-map.php @@ -9,21 +9,25 @@ Dict::Add('EN US', 'English', 'English', [ + 'Relation:dataflows/Description' => 'DataFlows between CIs', + 'Relation:dataflows/DownStream' => 'Outbound flows...', + 'Relation:dataflows/DownStream+' => 'Outbound flows map from', + 'Relation:dataflows/UpStream' => 'Inbound flows...', + 'Relation:dataflows/UpStream+' => 'Inbound flows map to', + 'Class:FunctionalCI/Attribute:dataflows' => 'Data flows', 'Class:FunctionalCI/Attribute:dataflows+' => 'Data flows for which this object is the source or the destination', 'FunctionalCI:DataFlow:Title' => 'Data flows', 'FunctionalCI:DataFlow:Inbound' => 'Inbound flows', 'FunctionalCI:DataFlow:Outbound' => 'Outbound flows', - 'DataFlow:baseinfo' => 'General information', - 'DataFlow:otherinfo' => 'Other information', 'DataFlow:moreinfo' => 'Flow specifics', 'Class:DataFlow' => 'Flow', 'Class:DataFlow+' => 'For application flow for example', - 'Class:DataFlow/Name' => '%1$s', + 'Class:DataFlow/ComplementaryName' => '%1$s - %2$s', 'Class:DataFlow/Attribute:name' => 'Name', - 'Class:DataFlow/Attribute:name_id+' => 'Data that are transferred', + 'Class:DataFlow/Attribute:name+' => 'Identify the transferred data flow', 'Class:DataFlow/Attribute:source_id' => 'Source', 'Class:DataFlow/Attribute:source_id+' => 'Source Ci of the flow', 'Class:DataFlow/Attribute:source_impact' => 'Source impacts?', @@ -42,22 +46,10 @@ Dict::Add('EN US', 'English', 'English', [ 'Class:DataFlow/Attribute:destination_impact/Value:no+' => 'If the flow stops, the destination is not impacted', 'Class:DataFlow/Attribute:dataflowtype_id' => 'Flow type', 'Class:DataFlow/Attribute:dataflowtype_id+' => 'Typology of Flow.', - 'Class:DataFlow/Attribute:description' => 'Description', - 'Class:DataFlow/Attribute:description+' => '', 'Class:DataFlow/Attribute:status' => 'Status', 'Class:DataFlow/Attribute:status+' => '', 'Class:DataFlow/Attribute:status/Value:active' => 'active', 'Class:DataFlow/Attribute:status/Value:inactive' => 'inactive', - 'Class:DataFlow/Attribute:org_id' => 'Organization', - 'Class:DataFlow/Attribute:org_id+' => '', - 'Class:DataFlow/Attribute:business_criticity' => 'Business criticality', - 'Class:DataFlow/Attribute:business_criticity+' => '', - 'Class:DataFlow/Attribute:business_criticity/Value:high' => 'high', - 'Class:DataFlow/Attribute:business_criticity/Value:high+' => '', - 'Class:DataFlow/Attribute:business_criticity/Value:low' => 'low', - 'Class:DataFlow/Attribute:business_criticity/Value:low+' => '', - 'Class:DataFlow/Attribute:business_criticity/Value:medium' => 'medium', - 'Class:DataFlow/Attribute:business_criticity/Value:medium+' => '', 'Class:DataFlow/Attribute:execution_frequency' => 'Execution frequency', 'Class:DataFlow/Attribute:execution_frequency+' => 'How often the data flow is executed', 'Class:DataFlow/Attribute:execution_frequency/Value:realtime' => 'real-time', @@ -74,10 +66,13 @@ Dict::Add('EN US', 'English', 'English', [ 'Class:DataFlow/Attribute:execution_frequency/Value:monthly+' => '', 'Class:DataFlow/Attribute:execution_frequency/Value:yearly' => 'yearly', 'Class:DataFlow/Attribute:execution_frequency/Value:yearly+' => '', - 'Class:DataFlow/Attribute:documents_list' => 'Documents', 'Class:DataFlow/Attribute:documents_list+' => 'Eg: technical specifications, runbooks, etc.', - 'Class:DataFlow/Attribute:contacts_list' => 'Contacts', 'Class:DataFlow/Attribute:contacts_list+' => 'Eg: flow owner, technical support, etc.', + 'Class:DataFlow/Error:CheckSource' => 'The source of a data flow cannot be a data flow itself. Choose another source CI than %1$s', + 'Class:DataFlow/Error:CheckDestination' => 'The destination of a data flow cannot be a data flow itself. Choose another destination CI than %1$s', + + 'Class:DataFlowType' => 'Data Flow Type', + 'Class:DataFlowType+' => 'Typology of Data Flow', /* 'Class:DataFlow/Attribute:source_id_friendlyname' => 'source_id_friendlyname', diff --git a/datamodels/2.x/itop-flow-map/dictionaries/fr.dict.itop-flow-map.php b/datamodels/2.x/itop-flow-map/dictionaries/fr.dict.itop-flow-map.php index ea4e4afca..c7fc8c19b 100644 --- a/datamodels/2.x/itop-flow-map/dictionaries/fr.dict.itop-flow-map.php +++ b/datamodels/2.x/itop-flow-map/dictionaries/fr.dict.itop-flow-map.php @@ -9,21 +9,25 @@ Dict::Add('FR FR', 'French', 'Français', [ + 'Relation:dataflows/Description' => 'Flux de données entre CIs', + 'Relation:dataflows/DownStream' => 'Flux sortants...', + 'Relation:dataflows/DownStream+' => 'Carte des flux sortants depuis', + 'Relation:dataflows/UpStream' => 'Flux entrants...', + 'Relation:dataflows/UpStream+' => 'Carte des flux entrants vers', + 'Class:FunctionalCI/Attribute:dataflows' => 'Flux de données', 'Class:FunctionalCI/Attribute:dataflows+' => 'Flux de données dont cet objet est la source ou la destination', 'FunctionalCI:DataFlow:Title' => 'Flux de données', 'FunctionalCI:DataFlow:Inbound' => 'Flux entrants', 'FunctionalCI:DataFlow:Outbound' => 'Flux sortants', - 'DataFlow:baseinfo' => 'Informations générales', - 'DataFlow:otherinfo' => 'Autres informations', 'DataFlow:moreinfo' => 'Spécificités du flux', 'Class:DataFlow' => 'Flux de Données', - 'Class:DataFlow+' => 'Modélise les données transférées entre instances d\'application', - 'Class:DataFlow/Name' => '%1$s', + 'Class:DataFlow+' => 'Modélise les données transférées entre instances d\'application ou plus généralement entre CIs.', + 'Class:DataFlow/ComplementaryName' => '%1$s - %2$s', 'Class:DataFlow/Attribute:name' => 'Nom', - 'Class:DataFlow/Attribute:name_id+' => 'Type de données transferées', + 'Class:DataFlow/Attribute:name+' => 'Identifie le flux de données', 'Class:DataFlow/Attribute:source_id' => 'Source', 'Class:DataFlow/Attribute:source_id+' => 'Instance d\application à la source du flux de données', 'Class:DataFlow/Attribute:source_impact' => 'Source impactante ?', @@ -42,22 +46,10 @@ Dict::Add('FR FR', 'French', 'Français', [ 'Class:DataFlow/Attribute:destination_impact/Value:no+' => 'Si le flux s\'arrête, le destinataire n\'est pas impacté', 'Class:DataFlow/Attribute:dataflowtype_id' => 'Type de flux', 'Class:DataFlow/Attribute:dataflowtype_id+' => 'Typologie du flux', - 'Class:DataFlow/Attribute:description' => 'Description', - 'Class:DataFlow/Attribute:description+' => '', 'Class:DataFlow/Attribute:status' => 'Etat', 'Class:DataFlow/Attribute:status+' => '', 'Class:DataFlow/Attribute:status/Value:active' => 'actif', 'Class:DataFlow/Attribute:status/Value:inactive' => 'inactif', - 'Class:DataFlow/Attribute:org_id' => 'Organisation', - 'Class:DataFlow/Attribute:org_id+' => '', - 'Class:DataFlow/Attribute:business_criticity' => 'Criticité', - 'Class:DataFlow/Attribute:business_criticity+' => '', - 'Class:DataFlow/Attribute:business_criticity/Value:high' => 'haute', - 'Class:DataFlow/Attribute:business_criticity/Value:high+' => '', - 'Class:DataFlow/Attribute:business_criticity/Value:low' => 'basse', - 'Class:DataFlow/Attribute:business_criticity/Value:low+' => '', - 'Class:DataFlow/Attribute:business_criticity/Value:medium' => 'moyenne', - 'Class:DataFlow/Attribute:business_criticity/Value:medium+' => '', 'Class:DataFlow/Attribute:execution_frequency' => 'Fréquence d\'exécution', 'Class:DataFlow/Attribute:execution_frequency+' => 'À quelle fréquence le transfert de données est-il exécuté', 'Class:DataFlow/Attribute:execution_frequency/Value:realtime' => 'temps réel', @@ -74,10 +66,13 @@ Dict::Add('FR FR', 'French', 'Français', [ 'Class:DataFlow/Attribute:execution_frequency/Value:monthly+' => '', 'Class:DataFlow/Attribute:execution_frequency/Value:yearly' => 'annuelle', 'Class:DataFlow/Attribute:execution_frequency/Value:yearly+' => '', - 'Class:DataFlow/Attribute:documents_list' => 'Documents', 'Class:DataFlow/Attribute:documents_list+' => 'Eg: technical specifications, runbooks, etc.', - 'Class:DataFlow/Attribute:contacts_list' => 'Contacts', 'Class:DataFlow/Attribute:contacts_list+' => 'Eg: flow owner, technical support, etc.', + 'Class:DataFlow/Error:CheckSource' => 'La source d\'un flux de données ne peut pas être un flux de données elle-même. Choisissez un autre CI source que %1$s', + 'Class:DataFlow/Error:CheckDestination' => 'La destination d\'un flux de données ne peut pas être un flux de données elle-même. Choisissez un autre CI destination que %1$s', + + 'Class:DataFlowType' => 'Type de flux', + 'Class:DataFlowType+' => 'Typologie des flux de données', /* 'Class:DataFlow/Attribute:source_id_friendlyname' => 'source_id_friendlyname', diff --git a/datamodels/2.x/itop-flow-map/module.itop-flow-map.php b/datamodels/2.x/itop-flow-map/module.itop-flow-map.php index 2ff936a41..1b6915b54 100644 --- a/datamodels/2.x/itop-flow-map/module.itop-flow-map.php +++ b/datamodels/2.x/itop-flow-map/module.itop-flow-map.php @@ -17,6 +17,7 @@ SetupWebPage::AddModule( // 'dependencies' => [ 'itop-config-mgmt/3.2.0', + 'itop-structure/3.2.0||itop-virtualization/3.2.0||itop-container-mgmt/3.2.0', ], 'mandatory' => false, 'visible' => true, diff --git a/datamodels/2.x/itop-service-mgmt-provider/data/en_us.data.itop-contracttype.xml b/datamodels/2.x/itop-service-mgmt-provider/data/en_us.data.itop-contracttype.xml new file mode 100644 index 000000000..43b68701f --- /dev/null +++ b/datamodels/2.x/itop-service-mgmt-provider/data/en_us.data.itop-contracttype.xml @@ -0,0 +1,15 @@ + + + + Hosting + + + IT outsourcing + + + Maintenance + + + Support + + diff --git a/datamodels/2.x/itop-service-mgmt-provider/data/fr_fr.data.itop-contracttype.xml b/datamodels/2.x/itop-service-mgmt-provider/data/fr_fr.data.itop-contracttype.xml new file mode 100644 index 000000000..8c1b6438a --- /dev/null +++ b/datamodels/2.x/itop-service-mgmt-provider/data/fr_fr.data.itop-contracttype.xml @@ -0,0 +1,15 @@ + + + + Hébergement + + + Infogérance + + + Maintenance + + + Support + + diff --git a/datamodels/2.x/itop-service-mgmt-provider/module.itop-service-mgmt-provider.php b/datamodels/2.x/itop-service-mgmt-provider/module.itop-service-mgmt-provider.php index 7e92b5da2..6ffa45a73 100755 --- a/datamodels/2.x/itop-service-mgmt-provider/module.itop-service-mgmt-provider.php +++ b/datamodels/2.x/itop-service-mgmt-provider/module.itop-service-mgmt-provider.php @@ -87,6 +87,14 @@ if (!class_exists('ServiceMgmtProviderInstaller')) { */ public static function AfterDatabaseCreation(Config $oConfiguration, $sPreviousVersion, $sCurrentVersion) { + // Load localized structural data: contract types + static::LoadLocalizedData( + $oConfiguration, + $sPreviousVersion, + $sCurrentVersion, + '3.3.0', + __DIR__."/data/{{language_code}}.data.itop-contracttype.xml" + ); } } } diff --git a/datamodels/2.x/itop-service-mgmt/data/en_us.data.itop-contracttype.xml b/datamodels/2.x/itop-service-mgmt/data/en_us.data.itop-contracttype.xml new file mode 100644 index 000000000..43b68701f --- /dev/null +++ b/datamodels/2.x/itop-service-mgmt/data/en_us.data.itop-contracttype.xml @@ -0,0 +1,15 @@ + + + + Hosting + + + IT outsourcing + + + Maintenance + + + Support + + diff --git a/datamodels/2.x/itop-service-mgmt/data/fr_fr.data.itop-contracttype.xml b/datamodels/2.x/itop-service-mgmt/data/fr_fr.data.itop-contracttype.xml new file mode 100644 index 000000000..8c1b6438a --- /dev/null +++ b/datamodels/2.x/itop-service-mgmt/data/fr_fr.data.itop-contracttype.xml @@ -0,0 +1,15 @@ + + + + Hébergement + + + Infogérance + + + Maintenance + + + Support + + diff --git a/datamodels/2.x/itop-service-mgmt/module.itop-service-mgmt.php b/datamodels/2.x/itop-service-mgmt/module.itop-service-mgmt.php index 98103251e..ecb3b7d8c 100755 --- a/datamodels/2.x/itop-service-mgmt/module.itop-service-mgmt.php +++ b/datamodels/2.x/itop-service-mgmt/module.itop-service-mgmt.php @@ -84,6 +84,14 @@ if (!class_exists('ServiceMgmtInstaller')) { */ public static function AfterDatabaseCreation(Config $oConfiguration, $sPreviousVersion, $sCurrentVersion) { + // Load localized structural data: contact types and document types + static::LoadLocalizedData( + $oConfiguration, + $sPreviousVersion, + $sCurrentVersion, + '3.3.0', + __DIR__."/data/{{language_code}}.data.itop-contracttype.xml" + ); } } } diff --git a/datamodels/2.x/itop-structure/data/en_us.data.itop-contacttype.xml b/datamodels/2.x/itop-structure/data/en_us.data.itop-contacttype.xml new file mode 100644 index 000000000..ed74421f4 --- /dev/null +++ b/datamodels/2.x/itop-structure/data/en_us.data.itop-contacttype.xml @@ -0,0 +1,30 @@ + + + + Administrator + + + Buyer + + + Customer manager + + + Helpdesk + + + Manager + + + Sales + + + Support Agent + + + Support level1 + + + Team leader + + diff --git a/datamodels/2.x/itop-structure/data/en_us.data.itop-documenttype.xml b/datamodels/2.x/itop-structure/data/en_us.data.itop-documenttype.xml new file mode 100644 index 000000000..1abb0fb23 --- /dev/null +++ b/datamodels/2.x/itop-structure/data/en_us.data.itop-documenttype.xml @@ -0,0 +1,15 @@ + + + + Architecture + + + Contract + + + Procedure + + + Process + + diff --git a/datamodels/2.x/itop-structure/data/fr_fr.data.itop-contacttype.xml b/datamodels/2.x/itop-structure/data/fr_fr.data.itop-contacttype.xml new file mode 100644 index 000000000..3d2e02b2c --- /dev/null +++ b/datamodels/2.x/itop-structure/data/fr_fr.data.itop-contacttype.xml @@ -0,0 +1,30 @@ + + + + Administrateur + + + Acheteur + + + Responsable de la relation client + + + Helpdesk + + + Manager + + + Commercial + + + Agent de support + + + Support niveau 1 + + + Chef d'équipe + + diff --git a/datamodels/2.x/itop-structure/data/fr_fr.data.itop-documenttype.xml b/datamodels/2.x/itop-structure/data/fr_fr.data.itop-documenttype.xml new file mode 100644 index 000000000..6caa62fb9 --- /dev/null +++ b/datamodels/2.x/itop-structure/data/fr_fr.data.itop-documenttype.xml @@ -0,0 +1,15 @@ + + + + Architecture + + + Contrat + + + Procédure + + + Processus + + diff --git a/datamodels/2.x/itop-structure/module.itop-structure.php b/datamodels/2.x/itop-structure/module.itop-structure.php index f1da9aeaf..775d383db 100644 --- a/datamodels/2.x/itop-structure/module.itop-structure.php +++ b/datamodels/2.x/itop-structure/module.itop-structure.php @@ -99,6 +99,22 @@ if (!class_exists('StructureInstaller')) { */ public static function AfterDatabaseCreation(Config $oConfiguration, $sPreviousVersion, $sCurrentVersion) { + // Load localized structural data: contact types and document types + static::LoadLocalizedData( + $oConfiguration, + $sPreviousVersion, + $sCurrentVersion, + '3.3.0', + __DIR__."/data/{{language_code}}.data.itop-contacttype.xml" + ); + static::LoadLocalizedData( + $oConfiguration, + $sPreviousVersion, + $sCurrentVersion, + '3.3.0', + __DIR__."/data/{{language_code}}.data.itop-documenttype.xml" + ); + // Default language will be used for actions // Note: There is a issue when upgrading, default language cannot be retrieved from the passed configuration, we have to read it from the disk if (utils::IsNullOrEmptyString($sPreviousVersion)) { diff --git a/datamodels/2.x/itop-tickets/module.itop-tickets.php b/datamodels/2.x/itop-tickets/module.itop-tickets.php index 92fc73019..17e8e8f24 100755 --- a/datamodels/2.x/itop-tickets/module.itop-tickets.php +++ b/datamodels/2.x/itop-tickets/module.itop-tickets.php @@ -60,42 +60,7 @@ class TicketsInstaller extends ModuleInstallerAPI utils::EnrichRaisedException($oTrigger, $e); } } - // It's not very clear if it make sense to test a particular version, - // as the loading mechanism checks object existence using reconc_keys - // and do not recreate them, nor update existing. - // Without test, new entries added to the data files, would be automatically loaded - if (($sPreviousVersion === '') || - (version_compare($sPreviousVersion, $sCurrentVersion, '<') - && version_compare($sPreviousVersion, '3.0.0', '<'))) { - $oDataLoader = new XMLDataLoader(); - - CMDBObject::SetTrackInfo("Initialization TicketsInstaller"); - $oMyChange = CMDBObject::GetCurrentChange(); - - $sLang = null; - // - Try to get app. language from configuration fil (app. upgrade) - $sConfigFileName = APPCONF.'production/'.ITOP_CONFIG_FILE; - if (file_exists($sConfigFileName)) { - $oFileConfig = new Config($sConfigFileName); - if (is_object($oFileConfig)) { - $sLang = str_replace(' ', '_', strtolower($oFileConfig->GetDefaultLanguage())); - } - } - - // - I still no language, get the default one - if (null === $sLang) { - $sLang = str_replace(' ', '_', strtolower($oConfiguration->GetDefaultLanguage())); - } - - $sFileName = dirname(__FILE__)."/data/{$sLang}.data.itop-tickets.xml"; - SetupLog::Info("Searching file: $sFileName"); - if (!file_exists($sFileName)) { - $sFileName = dirname(__FILE__)."/data/en_us.data.itop-tickets.xml"; - } - SetupLog::Info("Loading file: $sFileName"); - $oDataLoader->StartSession($oMyChange); - $oDataLoader->LoadFile($sFileName, false, true); - $oDataLoader->EndSession(); - } + // Load localized structural data: predefined query phrases for notifications + static::LoadLocalizedData($oConfiguration, $sPreviousVersion, $sCurrentVersion, '3.0.0', __DIR__."/data/{{language_code}}.data.itop-tickets.xml"); } } diff --git a/setup/moduleinstaller.class.inc.php b/setup/moduleinstaller.class.inc.php index cdfb8a8cb..aff6a1c1f 100644 --- a/setup/moduleinstaller.class.inc.php +++ b/setup/moduleinstaller.class.inc.php @@ -308,4 +308,120 @@ abstract class ModuleInstallerAPI CMDBSource::CacheReset($sOrigTable); } + + /** + * @param \Config $oConfiguration + * @param string $sPreviousVersion The previous version of the module (empty string will force the loading) + * @param string $sCurrentVersion The current version of the module + * @param string $sFirstLoadingVersion The first module version for which the data loading should be performed (e.g. '3.0.0') + * @param string $sFilePattern The pattern of the file to load, with {{language_code}} as placeholder for the language code (e.g. 'data.sample.{{language_code}}.xml') + * + * @return void + * @throws \ConfigException + * @throws \CoreException + * @throws \CoreUnexpectedValue + */ + public static function LoadLocalizedData(Config $oConfiguration, string $sPreviousVersion, string $sCurrentVersion, string $sFirstLoadingVersion, string $sFilePattern): void + { + self::AssertLoadLocalizedDataParametersAreValid($sPreviousVersion, $sCurrentVersion, $sFirstLoadingVersion, $sFilePattern); + + // It's not very clear if it makes sense to test a particular version, + // as the loading mechanism checks object existence using reconc_keys + // and do not recreate them, nor update existing. + // Without test, new entries added to the data files, would be automatically loaded + if (($sPreviousVersion === '') || + (version_compare($sPreviousVersion, $sCurrentVersion, '<') + && version_compare($sPreviousVersion, $sFirstLoadingVersion, '<'))) { + + // Note: There is an issue when upgrading, default language cannot be retrieved from the passed configuration, we have to read it from the disk + if (utils::IsNullOrEmptyString($sPreviousVersion)) { + // Fresh install + $sDefaultLanguage = $oConfiguration->GetDefaultLanguage(); + } else { + // Upgrade + $sDefaultLanguage = utils::GetConfig(true)->GetDefaultLanguage(); + } + + $sFileName = self::GetLocalizedFileName($sDefaultLanguage, $sFilePattern); + if ($sFileName !== '') { + self::XMLFileLoad($sFileName); + } + } + } + + /** + * @throws \CoreUnexpectedValue + */ + private static function AssertLoadLocalizedDataParametersAreValid(string $sPreviousVersion, string $sCurrentVersion, string $sFirstLoadingVersion, string $sFilePattern): void + { + if (($sPreviousVersion !== '') && !self::IsValidLocalizedDataVersion($sPreviousVersion)) { + throw new CoreUnexpectedValue("LoadLocalizedData expects sPreviousVersion to be empty or match x.y[.z][-name], got '{$sPreviousVersion}'"); + } + + if (!self::IsValidLocalizedDataVersion($sCurrentVersion)) { + throw new CoreUnexpectedValue("LoadLocalizedData expects sCurrentVersion to match x.y[.z][-name], got '{$sCurrentVersion}'"); + } + + if (!self::IsValidLocalizedDataVersion($sFirstLoadingVersion)) { + throw new CoreUnexpectedValue("LoadLocalizedData expects sFirstLoadingVersion to match x.y[.z][-name], got '{$sFirstLoadingVersion}'"); + } + + if (utils::IsNullOrEmptyString($sFilePattern)) { + throw new CoreUnexpectedValue('LoadLocalizedData expects sFilePattern to be a non-empty string'); + } + + if (substr_count($sFilePattern, '{{language_code}}') !== 1) { + throw new CoreUnexpectedValue("LoadLocalizedData expects sFilePattern to contain the exact placeholder '{{language_code}}' exactly once"); + } + } + + private static function IsValidLocalizedDataVersion(string $sVersion): bool + { + return (preg_match('/^\d+\.\d+(?:\.\d+)?(?:-[A-Za-z0-9]+)?$/', $sVersion) === 1); + } + + /** + * @param array|string $sFileName + * @param \XMLDataLoader $oDataLoader + * + * @return void + * @throws \Exception + */ + public static function XMLFileLoad(string $sFileName): void + { + if (!file_exists($sFileName)) { + throw new Exception("File $sFileName not found"); + } + $oDataLoader = new XMLDataLoader(); + CMDBObject::SetTrackInfo("Loading XML data from $sFileName"); + $oMyChange = CMDBObject::GetCurrentChange(); + SetupLog::Info("Loading objects in DB from file: $sFileName"); + $oDataLoader->StartSession($oMyChange); + $oDataLoader->LoadFile($sFileName, false, true); + $oDataLoader->EndSession(); + } + + /** + * @param string $sLanguage The language code to use for localization (e.g. 'EN US') + * @param string $sFilePattern The full path+name of the file to localize, with {{language_code}} as placeholder for the language code (e.g. 'data.sample.{{language_code}}.xml') + * + * @return string The localized file name if found, or an empty string if not found + * @throws \ConfigException + * @throws \CoreException + */ + public static function GetLocalizedFileName($sLanguage, string $sFilePattern): string + { + $sLang = str_replace(' ', '_', strtolower($sLanguage)); + $sFileName = str_replace('{{language_code}}', $sLang, $sFilePattern); + if (!file_exists($sFileName)) { + $sLang = 'en_us'; + $sFileName = str_replace('{{language_code}}', $sLang, $sFilePattern); + } + if (file_exists($sFileName)) { + return $sFileName; + } else { + SetupLog::Warning("No data file matching the pattern $sFilePattern and language_code $sLang was found."); + return ''; + } + } } diff --git a/tests/php-unit-tests/unitary-tests/setup/ModuleInstallerAPITest.php b/tests/php-unit-tests/unitary-tests/setup/ModuleInstallerAPITest.php index 7001c19fd..a201d0e08 100644 --- a/tests/php-unit-tests/unitary-tests/setup/ModuleInstallerAPITest.php +++ b/tests/php-unit-tests/unitary-tests/setup/ModuleInstallerAPITest.php @@ -4,11 +4,12 @@ namespace Combodo\iTop\Test\UnitTest\Setup; use CMDBSource; use Combodo\iTop\Test\UnitTest\ItopDataTestCase; +use Config; use MetaModel; use ModuleInstallerAPI; /** - * Class ModuleInstallerAPITest + * Class ModuleInstallerAPI * * @covers ModuleInstallerAPI * @@ -282,4 +283,189 @@ SQL $this->assertEquals($sOrigValue, $sDstValue, "Data was not moved as expected"); } + + /** + * @covers \ModuleInstallerAPI::LoadLocalizedData + */ + public function testLoadLocalizedData_LoadsOnFirstInstall(): void + { + // Given + [$oConfig, $sOrgName, $sTmpDir, $sPattern] = $this->GivenLocalizedDataTestContext('XML_Load_FirstInstall_', 'fr_fr'); + $this->GivenLocalizedDataFile($sTmpDir, "en_us", $sOrgName); + $this->GivenLocalizedDataFile($sTmpDir, "fr_fr", $sOrgName); + // When no previous version, and current version higher than the first loading version + ModuleInstallerAPI::LoadLocalizedData($oConfig, '', '3.3.0', '3.0.0', $sPattern); + // Then data loaded + $this->AssertOrganizationCountByName($sOrgName, 'en_us', 0); + $this->AssertOrganizationCountByName($sOrgName, 'fr_fr', 1); + } + + /** + * @covers \ModuleInstallerAPI::LoadLocalizedData + */ + public function testLoadLocalizedData_DoesNotLoadWhenVersionConditionIsNotMet(): void + { + // Given + [$oConfig, $sOrgName, $sTmpDir, $sPattern] = $this->GivenLocalizedDataTestContext('XML_Load_NoLoad_', 'en_us'); + $this->GivenLocalizedDataFile($sTmpDir, "en_us", $sOrgName); + + // When a previous version that is lower than the first loading version, but higher or equal to the current version + ModuleInstallerAPI::LoadLocalizedData($oConfig, '3.0.0', '3.1.0', '3.0.0', $sPattern); + // Then no data loaded + $this->AssertOrganizationCountByName($sOrgName, 'en_us', 0); + } + + /** + * @covers \ModuleInstallerAPI::LoadLocalizedData + */ + public function testLoadLocalizedData_FallbacksToEnUsWhenLanguageFileIsMissing(): void + { + [$oConfig, $sOrgName, $sTmpDir, $sPattern] = $this->GivenLocalizedDataTestContext('XML_Load_Fallback_', 'fr_fr'); + // Intentionally create ONLY en_us file + $this->GivenLocalizedDataFile($sTmpDir, 'en_us', $sOrgName); + // When loading localized data in fr_fr, but only en_us file exists + ModuleInstallerAPI::LoadLocalizedData($oConfig, '', '3.3.0', '3.0.0', $sPattern); + + $this->AssertOrganizationCountByName($sOrgName, 'fr_fr', 0); + $this->AssertOrganizationCountByName($sOrgName, 'en_us', 1); + } + + /** + * @covers \ModuleInstallerAPI::LoadLocalizedData + * @dataProvider LoadLocalizedData_ValidVersionFormatsProvider + */ + public function testLoadLocalizedData_AcceptsSupportedVersionFormats(string $sCurrentVersion, string $sFirstLoadingVersion): void + { + [$oConfig, $sOrgName, $sTmpDir, $sPattern] = $this->GivenLocalizedDataTestContext('XML_Load_ValidVersion_', 'en_us'); + $this->GivenLocalizedDataFile($sTmpDir, 'en_us', $sOrgName); + + ModuleInstallerAPI::LoadLocalizedData($oConfig, '', $sCurrentVersion, $sFirstLoadingVersion, $sPattern); + + $this->AssertOrganizationCountByName($sOrgName, 'en_us', 1); + } + + public function LoadLocalizedData_ValidVersionFormatsProvider(): array + { + return [ + 'Current version with suffix' => ['3.2-dev', '3.0.0'], + 'Current version x.y.z' => ['1.2.4', '1.0'], + 'Current version x.y.z-suffix' => ['2.3.3-beta', '2.0.0'], + 'Current version x.y.z-1' => ['1.2.4-1', '1.0.3-2'], + ]; + } + + /** + * @covers \ModuleInstallerAPI::LoadLocalizedData + * @dataProvider LoadLocalizedData_InvalidParametersProvider + */ + public function testLoadLocalizedData_ThrowsOnInvalidParameters(string $sPreviousVersion, string $sCurrentVersion, string $sFirstLoadingVersion, string $sPattern, string $sExpectedMessage): void + { + $oConfig = MetaModel::GetConfig(); + $this->assertNotNull($oConfig); + + $this->expectException(\CoreUnexpectedValue::class); + $this->expectExceptionMessage($sExpectedMessage); + + ModuleInstallerAPI::LoadLocalizedData($oConfig, $sPreviousVersion, $sCurrentVersion, $sFirstLoadingVersion, $sPattern); + } + + public function LoadLocalizedData_InvalidParametersProvider(): array + { + $sTmpDir = static::CreateTmpdir(); + $this->aFileToClean[] = $sTmpDir; + + return [ + 'Invalid previous version format' => [ + 'previous' => 'v3.2', + 'current' => '3.2.0', + 'first' => '3.0.0', + 'pattern' => $sTmpDir.DIRECTORY_SEPARATOR.'data.{{language_code}}.xml', + 'message' => 'sPreviousVersion', + ], + 'Invalid current version format' => [ + 'previous' => '', + 'current' => '3', + 'first' => '3.0.0', + 'pattern' => $sTmpDir.DIRECTORY_SEPARATOR.'data.{{language_code}}.xml', + 'message' => 'sCurrentVersion', + ], + 'Invalid first loading version format' => [ + 'previous' => '', + 'current' => '3.2.0', + 'first' => '3.0.0-beta.1', + 'pattern' => $sTmpDir.DIRECTORY_SEPARATOR.'data.{{language_code}}.xml', + 'message' => 'sFirstLoadingVersion', + ], + 'Missing strict placeholder' => [ + 'previous' => '', + 'current' => '3.2.0', + 'first' => '3.0.0', + 'pattern' => $sTmpDir.DIRECTORY_SEPARATOR.'data.{{LANGUAGE_CODE}}.xml', + 'message' => "{{language_code}}", + ], + 'Parent directory does not exist' => [ + 'previous' => '', + 'current' => '3.2.0', + 'first' => '3.0.0', + 'pattern' => $sTmpDir.DIRECTORY_SEPARATOR.'missing'.DIRECTORY_SEPARATOR.'data.{{language_code}}.xml', + 'message' => 'parent directory', + ], + ]; + } + + /** + * Prepare common context for LoadLocalizedData tests. + * + * @return array{0: Config, 1: string, 2: string, 3: string, 4: string} + */ + private function GivenLocalizedDataTestContext(string $sOrgNamePrefix, string $sLanguage): array + { + $oConfig = MetaModel::GetConfig(); + $oConfig->SetDefaultLanguage($sLanguage); + $this->assertNotNull($oConfig); + + $sOrgName = $sOrgNamePrefix.uniqid(); + + $sTmpDir = static::CreateTmpdir(); + $this->aFileToClean[] = $sTmpDir; + $sPattern = $sTmpDir.DIRECTORY_SEPARATOR.'data.{{language_code}}.xml'; + + return [$oConfig, $sOrgName, $sTmpDir, $sPattern]; + } + + private function GivenLocalizedDataFile(string $sDir, string $sLang, string $sOrgName): string + { + $sFilePath = $sDir.DIRECTORY_SEPARATOR.'data.'.$sLang.'.xml'; + file_put_contents($sFilePath, $this->BuildOrganizationXml($sOrgName, $sLang)); + + return $sFilePath; + } + + private function BuildOrganizationXml(string $sOrgName, string $sLang): string + { + $iId = random_int(100000, 999999); + $sOrgNameXml = htmlspecialchars($sOrgName, ENT_XML1); + + return << + + + {$sOrgNameXml} + {$sLang} + active + + +XML; + } + + private function AssertOrganizationCountByName(string $sOrgName, string $sLanguage, int $iExpectedCount): void + { + $oSet = new \DBObjectSet( + \DBSearch::FromOQL("SELECT Organization WHERE name = :org_name AND code = :language"), + [], + ['org_name' => $sOrgName, 'language' => $sLanguage] + ); + $iCount = $oSet->Count(); + $this->assertEquals($iExpectedCount, $iCount, "Found $iCount changes for objects with name '{$sOrgName}' and language '{$sLanguage}', expected {$iExpectedCount}"); + } }