Compare commits

..

3 Commits

Author SHA1 Message Date
Anne-Cath
f236dd6c4d N°1681 - Add new trigger for attachment creation - Add deleted attachment to notification email and fix dictionaries 2026-05-26 16:55:30 +02:00
Vincent Dumas
ba2af7ed63 N°9604 - add "flowmaps" as a new neighbour (#914)
* Set DataFlow as FunctionalCI
* Use class name for Badge ID on DataFlow and Container classes including Typology
* Improve DataFlow summary
---------
Co-authored-by: greptile-apps[bot] <165735046+greptile-apps[bot]@users.noreply.github.com>
2026-05-21 11:22:10 +02:00
Benjamin DALSASS
48e6203869 N°9044 - Application token and Impersonate (Log in as this user) 2026-05-13 11:14:58 +02:00
52 changed files with 408 additions and 1619 deletions

View File

@@ -524,12 +524,6 @@ JS
$sLabel = Dict::S('Tag:Synchronized');
$sSynchroTagId = 'synchro_icon-'.$this->GetKey();
$aTags[$sSynchroTagId] = ['title' => $sTip, 'css_classes' => 'ibo-object-details--tag--synchronized', 'decoration_classes' => 'fas fa-lock', 'label' => $sLabel];
if (UserRights::IsActionAllowed('SynchroReplica', UR_ACTION_READ)) {
$oDBSearch = DBObjectSearch::FromOQL('SELECT SynchroReplica WHERE dest_class=:sClass AND dest_id=:id');;
$sFilter = rawurlencode($oDBSearch->serialize(false,['sClass'=>get_class($this),'id'=>$this->GetKey()]));
$sUrlSearchReplica = 'UI.php?operation=search&filter='.$sFilter;
$oPage->add_ready_script("$('#$sSynchroTagId').on('click',function() {window.location = '$sUrlSearchReplica' });");
}
}
}

View File

@@ -1947,7 +1947,7 @@ class MenuBlock extends DisplayBlock
$sSelectedClassName = MetaModel::GetName($sSelectedClass);
// Check rights on class
$bIsBulkModifyAllowed = (!MetaModel::IsAbstract($sSelectedClass)) && UserRights::IsActionAllowed($sSelectedClass, UR_ACTION_BULK_MODIFY) && (($oReflectionClass->IsSubclassOf('cmdbAbstractObject') || $sSelectedClass === 'SynchroReplica'));
$bIsBulkModifyAllowed = (!MetaModel::IsAbstract($sSelectedClass)) && UserRights::IsActionAllowed($sSelectedClass, UR_ACTION_BULK_MODIFY) && ($oReflectionClass->IsSubclassOf('cmdbAbstractObject'));
$bIsBulkDeleteAllowed = (bool) UserRights::IsActionAllowed($sSelectedClass, UR_ACTION_BULK_DELETE);
// Refine filter on selected class so bullk actions occur on the right class
@@ -1958,15 +1958,7 @@ class MenuBlock extends DisplayBlock
// Action label dict code has a specific suffix for "Link" / "Remote" aliases to allow dedicated labels in linksets.
$sActionLabelCodeSuffix = in_array($sSelectedAlias, ['Link', 'Remote']) ? $sSelectedAlias : 'Class';
if ($bIsBulkModifyAllowed) {
if($sSelectedClass === 'SynchroReplica'){
$this->AddBulkModifyObjectsMenuAction($aRegularActions, $sSelectedClass, $oSelectedClassFilter->serialize(), 'UI:Menu:UnlinkAll:', Dict::S('Class:SynchroReplica/Action:unlink_all'),'unlink');
$this->AddBulkModifyObjectsMenuAction($aRegularActions, $sSelectedClass, $oSelectedClassFilter->serialize(), 'UI:Menu:UnLinkSynchroAll:', Dict::S('Class:SynchroReplica/Action:unlinksynchro_all'),'unlinksynchro');
$this->AddBulkModifyObjectsMenuAction($aRegularActions, $sSelectedClass, $oSelectedClassFilter->serialize(), 'UI:Menu:SynchroAll:', Dict::S('Class:SynchroReplica/Action:synchro_all'),'synchro');
$this->AddBulkModifyObjectsMenuAction($aRegularActions, $sSelectedClass, $oSelectedClassFilter->serialize(), 'UI:Menu:AllowDeleteAll:', Dict::S('Class:SynchroReplica/Action:allowdelete_all'),'allowdelete');
$this->AddBulkModifyObjectsMenuAction($aRegularActions, $sSelectedClass, $oSelectedClassFilter->serialize(), 'UI:Menu:DenyDeleteAll:', Dict::S('Class:SynchroReplica/Action:denydelete_all'),'denydelete');
} else {
$this->AddBulkModifyObjectsMenuAction($aRegularActions, $sSelectedClass, $oSelectedClassFilter->serialize(), 'UI:Menu:ModifyAll:'.$sSelectedAlias, Dict::Format('UI:Menu:ModifyAll_'.$sActionLabelCodeSuffix, $sSelectedClassName));
}
$this->AddBulkModifyObjectsMenuAction($aRegularActions, $sSelectedClass, $oSelectedClassFilter->serialize(), 'UI:Menu:ModifyAll:'.$sSelectedAlias, Dict::Format('UI:Menu:ModifyAll_'.$sActionLabelCodeSuffix, $sSelectedClassName));
}
if ($bIsBulkDeleteAllowed) {
$this->AddBulkDeleteObjectsMenuAction($aRegularActions, $sSelectedClass, $oSelectedClassFilter->serialize(), 'UI:Menu:BulkDelete:'.$sSelectedAlias, Dict::Format('UI:Menu:BulkDelete_'.$sActionLabelCodeSuffix, $sSelectedClassName));
@@ -2486,11 +2478,11 @@ class MenuBlock extends DisplayBlock
* @since 3.1.0
* @internal
*/
protected function AddBulkModifyObjectsMenuAction(array &$aActions, string $sClass, string $sFilter, string $sActionIdentifier = 'UI:Menu:ModifyAll', $sActionLabel = 'UI:Menu:ModifyAll', $sOperationName = 'modify'): void
protected function AddBulkModifyObjectsMenuAction(array &$aActions, string $sClass, string $sFilter, string $sActionIdentifier = 'UI:Menu:ModifyAll', $sActionLabel = 'UI:Menu:ModifyAll'): void
{
$aActions[$sActionIdentifier] = [
'label' => Dict::S($sActionLabel),
'url' => $this->PrepareUrlForStandardMenuAction($sClass, 'operation=select_for_'.$sOperationName.'_all&class='.$sClass.'&filter='.urlencode($sFilter)),
'url' => $this->PrepareUrlForStandardMenuAction($sClass, "operation=select_for_modify_all&class=$sClass&filter=".urlencode($sFilter)),
] + $this->GetDefaultParamsForMenuAction();
}

View File

@@ -658,6 +658,16 @@ abstract class User extends cmdbAbstractObject
}
return false;
}
/**
* Allow a user to be impersonated by another one (generally an administrator) in order to troubleshoot rights issues.
*
* @return bool
*/
public function CanBeImpersonated(): bool
{
return true;
}
}
/**
@@ -1063,6 +1073,9 @@ class UserRights
$oUser = self::FindUser($sLogin);
if ($oUser) {
$bRet = true;
if (!$oUser->CanBeImpersonated()) {
throw new Exception($oUser->GetName().' cannot be impersonated');
}
if (is_null(self::$m_oRealUser)) {
// First impersonation
self::$m_oRealUser = self::$m_oUser;

View File

@@ -80,14 +80,4 @@ $ibo-data-synchro-source--synoptics--cell--arrow--border: 2px solid $ibo-data-sy
}
.ibo-data-synchro-source--replicas-status--warning{
margin: $ibo-data-synchro-source--replicas-status--warning--margin;
}
.ibo-page-header--replica-title{
display: table;
width: 100%;
>.ibo-toolbar--button{
display: table-cell;
vertical-align:middle;
}
}

View File

@@ -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~~',
]);

View File

@@ -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~~',
]);

View File

@@ -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~~',
]);

View File

@@ -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',
]);

View File

@@ -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~~',
]);

View File

@@ -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',
]);

View File

@@ -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~~',
]);

View File

@@ -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~~',
]);

View File

@@ -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~~',
]);

View File

@@ -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~~',
]);

View File

@@ -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~~',
]);

View File

@@ -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~~',
]);

View File

@@ -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~~',
]);

View File

@@ -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~~',
]);

View File

@@ -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~~',
]);

View File

@@ -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~~',
]);

View File

@@ -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

View File

@@ -1480,19 +1480,19 @@
<cell id="1" _delta="must_exist">
<rank>1</rank>
<dashlets>
<dashlet id="container_43" xsi:type="DashletBadge" _delta="define">
<dashlet id="ContainerApplication" xsi:type="DashletBadge" _delta="define">
<rank>5</rank>
<class>ContainerApplication</class>
</dashlet>
<dashlet id="container_44" xsi:type="DashletBadge" _delta="define">
<dashlet id="ContainerHost" xsi:type="DashletBadge" _delta="define">
<rank>6</rank>
<class>ContainerHost</class>
</dashlet>
<dashlet id="container_45" xsi:type="DashletBadge" _delta="define">
<dashlet id="ContainerCluster" xsi:type="DashletBadge" _delta="define">
<rank>7</rank>
<class>ContainerCluster</class>
</dashlet>
<dashlet id="container_46" xsi:type="DashletBadge" _delta="define">
<dashlet id="ContainerImage" xsi:type="DashletBadge" _delta="define">
<rank>8</rank>
<class>ContainerImage</class>
</dashlet>
@@ -1507,11 +1507,11 @@
<cell id="0">
<rank>0</rank>
<dashlets>
<dashlet id="container_21" xsi:type="DashletBadge" _delta="define">
<dashlet id="ContainerType" xsi:type="DashletBadge" _delta="define">
<rank>21</rank>
<class>ContainerType</class>
</dashlet>
<dashlet id="container_22" xsi:type="DashletBadge" _delta="define">
<dashlet id="ContainerImageType" xsi:type="DashletBadge" _delta="define">
<rank>22</rank>
<class>ContainerImageType</class>
</dashlet>

View File

@@ -2,7 +2,7 @@
<itop_design xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="3.3">
<classes>
<class id="DataFlow" _delta="define">
<parent>cmdbAbstractObject</parent>
<parent>FunctionalCI</parent>
<properties>
<category>bizmodel,searchable</category>
<abstract>false</abstract>
@@ -14,6 +14,10 @@
<attributes>
<attribute id="name"/>
</attributes>
<complementary_attributes>
<attribute id="source_id"/>
<attribute id="destination_id"/>
</complementary_attributes>
</naming>
<reconciliation>
<attributes>
@@ -32,23 +36,9 @@
</fields_semantic>
</properties>
<fields>
<field id="name" xsi:type="AttributeString">
<sql>name</sql>
<default_value/>
<is_null_allowed>false</is_null_allowed>
</field>
<field id="org_id" xsi:type="AttributeExternalKey">
<sql>org_id</sql>
<filter/>
<dependencies/>
<is_null_allowed>false</is_null_allowed>
<target_class>Organization</target_class>
<on_target_delete>DEL_MANUAL</on_target_delete>
<tracking_level>all</tracking_level>
</field>
<field id="source_id" xsi:type="AttributeExternalKey">
<sql>source_id</sql>
<filter/>
<filter><![CDATA[SELECT FunctionalCI WHERE finalclass != 'DataFlow']]></filter>
<dependencies/>
<is_null_allowed>false</is_null_allowed>
<target_class>FunctionalCI</target_class>
@@ -74,7 +64,7 @@
</field>
<field id="destination_id" xsi:type="AttributeExternalKey">
<sql>destination_id</sql>
<filter/>
<filter><![CDATA[SELECT FunctionalCI WHERE finalclass != 'DataFlow']]></filter>
<dependencies/>
<is_null_allowed>false</is_null_allowed>
<target_class>FunctionalCI</target_class>
@@ -107,12 +97,6 @@
<on_target_delete>DEL_MANUAL</on_target_delete>
<tracking_level>all</tracking_level>
</field>
<field id="description" xsi:type="AttributeHTML">
<sql>description</sql>
<default_value/>
<is_null_allowed>true</is_null_allowed>
<tracking_level>all</tracking_level>
</field>
<field id="status" xsi:type="AttributeEnum">
<sql>status</sql>
<values>
@@ -141,27 +125,6 @@
<display_style>list</display_style>
<tracking_level>all</tracking_level>
</field>
<field id="business_criticity" xsi:type="AttributeEnum">
<sort_type>rank</sort_type>
<values>
<value id="high">
<code>high</code>
<rank>10</rank>
</value>
<value id="medium">
<code>medium</code>
<rank>20</rank>
</value>
<value id="low">
<code>low</code>
<rank>30</rank>
</value>
</values>
<sql>business_criticity</sql>
<default_value>low</default_value>
<is_null_allowed>false</is_null_allowed>
<display_style>list</display_style>
</field>
<field id="execution_frequency" xsi:type="AttributeEnum">
<sort_type>rank</sort_type>
<values>
@@ -199,24 +162,36 @@
<is_null_allowed>false</is_null_allowed>
<display_style>list</display_style>
</field>
<field id="contacts_list" xsi:type="AttributeLinkedSetIndirect">
<linked_class>lnkContactToDataFlow</linked_class>
<ext_key_to_me>dataflow_id</ext_key_to_me>
<count_min>0</count_min>
<count_max>0</count_max>
<ext_key_to_remote>contact_id</ext_key_to_remote>
<duplicates/>
</field>
<field id="documents_list" xsi:type="AttributeLinkedSetIndirect">
<linked_class>lnkDocumentToDataFlow</linked_class>
<ext_key_to_me>dataflow_id</ext_key_to_me>
<count_min>0</count_min>
<count_max>0</count_max>
<ext_key_to_remote>document_id</ext_key_to_remote>
<duplicates/>
</field>
</fields>
<methods/>
<event_listeners>
<event_listener id="evtCheckSourceAndDestination">
<event>EVENT_DB_CHECK_TO_WRITE</event>
<rank>10</rank>
<callback>evtCheckSourceAndDestination</callback>
</event_listener>
</event_listeners>
<methods>
<method id="evtCheckSourceAndDestination" _delta="define">
<comment> /**
* Ensure that the source and destination of a data flow are not DataFlow themselves
*
*/</comment>
<static>false</static>
<access>public</access>
<type>EventListener</type>
<code><![CDATA[ public function evtCheckSourceAndDestination(Combodo\iTop\Service\Events\EventData $oEventData)
{
$oSource = MetaModel::GetObject(FunctionalCI::class, $this->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()));
}
} ]]></code>
</method>
</methods>
<presentation>
<list>
<items>
@@ -257,7 +232,7 @@
<items>
<item id="col:col1">
<items>
<item id="fieldset:DataFlow:baseinfo">
<item id="fieldset:ConfigMgmt:baseinfo">
<items>
<item id="name">
<rank>10</rank>
@@ -302,14 +277,25 @@
</item>
<item id="col:col2">
<items>
<item id="fieldset:DataFlow:otherinfo">
<item id="fieldset:ConfigMgmt:dates">
<items>
<item id="description">
<item id="move2production">
<rank>10</rank>
</item>
</items>
<rank>10</rank>
</item>
<item id="fieldset:ConfigMgmt:otherinfo">
<items>
<item id="description">
<rank>10</rank>
</item>
<item id="groups_list">
<rank>20</rank>
</item>
</items>
<rank>20</rank>
</item>
</items>
<rank>20</rank>
</item>
@@ -342,201 +328,46 @@
</default_search>
<summary>
<items>
<item id="org_id">
<item id="business_criticity">
<rank>10</rank>
</item>
<item id="description">
<item id="source_id">
<rank>20</rank>
</item>
<item id="destination_id">
<rank>30</rank>
</item>
<item id="execution_frequency">
<rank>40</rank>
</item>
</items>
</summary>
</presentation>
<relations>
<relation id="impacts">
<neighbours>
<neighbour id="functionalci ">
<neighbour id="functionalci">
<query_down><![CDATA[SELECT FunctionalCI WHERE :this->destination_impact = 'yes' AND id = :this->destination_id]]></query_down>
<query_up><![CDATA[SELECT DataFlow AS f JOIN FunctionalCI AS ci ON f.destination_id = ci.id WHERE f.destination_impact = 'yes' AND ci.id=:this->id]]></query_up>
<direction>both</direction>
</neighbour>
<neighbour id="contact ">
<neighbour id="contact">
<attribute>contacts_list</attribute>
<direction>down</direction>
</neighbour>
</neighbours>
</relation>
<relation id="dataflows">
<neighbours>
<neighbour id="functionalci">
<query_down><![CDATA[SELECT FunctionalCI WHERE id = :this->destination_id]]></query_down>
<query_up><![CDATA[SELECT DataFlow AS f WHERE f.destination_id = :this->id]]></query_up>
<direction>both</direction>
</neighbour>
</neighbours>
</relation>
</relations>
</class>
<class id="lnkDocumentToDataFlow" _delta="define">
<parent>cmdbAbstractObject</parent>
<properties>
<is_link>1</is_link>
<category>bizmodel</category>
<abstract>false</abstract>
<key_type>autoincrement</key_type>
<db_table>lnkdocumenttodataflow</db_table>
<db_key_field>id</db_key_field>
<db_final_class_field/>
<naming>
<attributes>
<attribute id="document_id_friendlyname"/>
<attribute id="dataflow_id_friendlyname"/>
</attributes>
</naming>
<style>
<icon/>
</style>
<reconciliation>
<attributes>
<attribute id="dataflow_id"/>
<attribute id="document_id"/>
</attributes>
</reconciliation>
<uniqueness_rules>
<rule id="no_duplicate">
<attributes>
<attribute id="document_id"/>
<attribute id="dataflow_id"/>
</attributes>
<filter><![CDATA[]]></filter>
<disabled>false</disabled>
<is_blocking>true</is_blocking>
</rule>
</uniqueness_rules>
</properties>
<fields>
<field id="dataflow_id" xsi:type="AttributeExternalKey">
<sql>dataflow_id</sql>
<target_class>DataFlow</target_class>
<is_null_allowed>false</is_null_allowed>
<on_target_delete>DEL_AUTO</on_target_delete>
</field>
<field id="document_id" xsi:type="AttributeExternalKey">
<sql>document_id</sql>
<target_class>Document</target_class>
<is_null_allowed>false</is_null_allowed>
<on_target_delete>DEL_AUTO</on_target_delete>
</field>
</fields>
<methods/>
<presentation>
<details>
<items>
<item id="document_id">
<rank>10</rank>
</item>
<item id="dataflow_id">
<rank>20</rank>
</item>
</items>
</details>
<search>
<items>
<item id="dataflow_id">
<rank>10</rank>
</item>
<item id="document_id">
<rank>20</rank>
</item>
</items>
</search>
<list>
<items>
<item id="dataflow_id">
<rank>10</rank>
</item>
<item id="document_id">
<rank>20</rank>
</item>
</items>
</list>
</presentation>
</class>
<class id="lnkContactToDataFlow" _delta="define">
<parent>cmdbAbstractObject</parent>
<properties>
<is_link>1</is_link>
<category>bizmodel</category>
<abstract>false</abstract>
<key_type>autoincrement</key_type>
<db_table>lnkcontacttodataflow</db_table>
<db_key_field>id</db_key_field>
<db_final_class_field/>
<naming>
<attributes>
<attribute id="contact_id_friendlyname"/>
<attribute id="dataflow_id_friendlyname"/>
</attributes>
</naming>
<style>
<icon/>
</style>
<reconciliation>
<attributes>
<attribute id="dataflow_id"/>
<attribute id="contact_id"/>
</attributes>
</reconciliation>
<uniqueness_rules>
<rule id="no_duplicate">
<attributes>
<attribute id="contact_id"/>
<attribute id="dataflow_id"/>
</attributes>
<filter><![CDATA[]]></filter>
<disabled>false</disabled>
<is_blocking>true</is_blocking>
</rule>
</uniqueness_rules>
</properties>
<fields>
<field id="dataflow_id" xsi:type="AttributeExternalKey">
<sql>dataflow_id</sql>
<target_class>DataFlow</target_class>
<is_null_allowed>false</is_null_allowed>
<on_target_delete>DEL_AUTO</on_target_delete>
</field>
<field id="contact_id" xsi:type="AttributeExternalKey">
<sql>contact_id</sql>
<target_class>Contact</target_class>
<is_null_allowed>false</is_null_allowed>
<on_target_delete>DEL_AUTO</on_target_delete>
</field>
</fields>
<methods/>
<presentation>
<details>
<items>
<item id="contact_id">
<rank>10</rank>
</item>
<item id="dataflow_id">
<rank>20</rank>
</item>
</items>
</details>
<search>
<items>
<item id="dataflow_id">
<rank>10</rank>
</item>
<item id="contact_id">
<rank>20</rank>
</item>
</items>
</search>
<list>
<items>
<item id="dataflow_id">
<rank>10</rank>
</item>
<item id="contact_id">
<rank>20</rank>
</item>
</items>
</list>
</presentation>
</class>
<class id="DataFlowType" _delta="define">
<parent>Typology</parent>
<properties>
@@ -554,6 +385,16 @@
<attribute id="finalclass"/>
</attributes>
</reconciliation>
<uniqueness_rules>
<rule id="name">
<attributes>
<attribute id="name"/>
</attributes>
<filter><![CDATA[]]></filter>
<disabled>false</disabled>
<is_blocking>true</is_blocking>
</rule>
</uniqueness_rules>
</properties>
<fields/>
<methods/>
@@ -629,6 +470,15 @@
</neighbour>
</neighbours>
</relation>
<relation id="dataflows" _delta="define">
<neighbours>
<neighbour id="flow">
<query_down><![CDATA[SELECT DataFlow WHERE source_id = :this->id]]></query_down>
<query_up><![CDATA[SELECT FunctionalCI AS ci JOIN DataFlow AS f ON f.source_id = ci.id WHERE f.id = :this->id]]></query_up>
<direction>both</direction>
</neighbour>
</neighbours>
</relation>
</relations>
</class>
<class id="ApplicationSolution" _delta="must_exist">
@@ -726,7 +576,7 @@
<cells>
<cell id="3" delta="if_exists">
<dashlets>
<dashlet id="DataFlow_20" xsi:type="DashletBadge" _delta="define">
<dashlet id="DataFlow" xsi:type="DashletBadge" _delta="define">
<rank>20</rank>
<class>DataFlow</class>
</dashlet>
@@ -735,6 +585,21 @@
</cells>
</definition>
</menu>
<menu id="Typology" xsi:type="DashboardMenuNode" _delta="must_exist">
<definition>
<cells>
<cell id="0">
<rank>0</rank>
<dashlets>
<dashlet id="DataFlowType" xsi:type="DashletBadge" _delta="define">
<rank>23</rank>
<class>DataFlowType</class>
</dashlet>
</dashlets>
</cell>
</cells>
</definition>
</menu>
</menus>
<user_rights>
<groups>

View File

@@ -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',

View File

@@ -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',

View File

@@ -976,39 +976,6 @@ Dict::Add('CS CZ', 'Czech', 'Čeština', [
'Class:SynchroReplica/Attribute:status_last_warning' => 'Poslední varování',
'Class:SynchroReplica/Attribute:info_creation_date' => 'Datum vytvoření',
'Class:SynchroReplica/Attribute:info_last_modified' => 'Datum poslední úpravy',
'Class:SynchroReplica/Action:delete+' => 'delete replica~~',
'Class:SynchroReplica/Action:unlink' => 'Unlink~~',
'Class:SynchroReplica/Action:unlink+' => 'Unlink replica with destination object~~',
'Class:SynchroReplica/Action:unlinksynchro' => 'Unlink & Synchro~~',
'Class:SynchroReplica/Action:unlinksynchro+' => 'Unlink replica with destination object and execute synchronization with this replica~~',
'Class:SynchroReplica/Action:synchro' => 'Synchro~~',
'Class:SynchroReplica/Action:synchro+' => 'Execute synchronization with this replica~~',
'Class:SynchroReplica/Action:allowdelete' => 'Allow delete of object linked to this synchro replica~~',
'Class:SynchroReplica/Action:allowdelete+' => 'Object linked to a deleted replica is deleted~~',
'Class:SynchroReplica/Action:denydelete' => 'Deny delete of object linked to this synchro replica~~',
'Class:SynchroReplica/Action:denydelete+' => 'Object linked to a deleted replica is not deleted~~',
'Class:SynchroReplica/Action:unlink_all' => 'Unlink Synchro Replica objects~~',
'Class:SynchroReplica/Action:unlink_all+' => 'Unlink replica with destination object~~',
'Class:SynchroReplica/Action:unlinksynchro_all' => 'Unlink & Synchronize Synchro Replica objects~~',
'Class:SynchroReplica/Action:unlinksynchro_all+' => 'Unlink replica with destination object and execute synchronization with this replica~~',
'Class:SynchroReplica/Action:synchro_all' => 'Synchronize Synchro Replica objects~~',
'Class:SynchroReplica/Action:synchro_all+' => 'Execute synchronization with this replica~~',
'Class:SynchroReplica/Action:allowdelete_all' => 'Allow delete of objects linked to Synchro Replica~~',
'Class:SynchroReplica/Action:allowdelete_all+' => 'Object linked to a deleted replica is deleted~~',
'Class:SynchroReplica/Action:denydelete_all' => 'Deny delete of objects linked to Synchro Replica~~',
'Class:SynchroReplica/Action:denydelete_all+' => 'Object linked to a deleted replica is not deleted~~',
'UI:UnlinkAllTabTitle' => 'Unlink Synchro Replica objects~~',
'UI:UnlinkAllPageTitle' => 'Unlink Synchro Replica objects~~',
'UI:UnlinkSynchroAllTabTitle' => 'Unlink & Synchronize Synchro Replica objects~~',
'UI:UnlinkSynchroAllPageTitle' => ' Unlink & Synchronize Synchro Replica objects~~',
'UI:SynchroAllTabTitle' => 'Synchronize Synchro Replica objects~~',
'UI:SynchroAllPageTitle' => 'Synchronize Synchro Replica objects~~',
'UI:AllowDeleteAllTabTitle' => 'Allow delete of objects linked to Synchro Replica~~',
'UI:AllowDeleteAllPageTitle' => 'Allow delete of objects linked to Synchro Replica~~',
'UI:DenyDeleteAllTabTitle' => 'Deny delete of objects linked to Synchro Replica~~',
'UI:DenyDeleteAllPageTitle' => 'Deny delete of objects linked to Synchro Replica~~',
'Class:appUserPreferences' => 'Uživatelské předvolby',
'Class:appUserPreferences/Attribute:userid' => 'Uživatel',
'Class:appUserPreferences/Attribute:preferences' => 'Předvolby',

View File

@@ -975,39 +975,6 @@ Dict::Add('DA DA', 'Danish', 'Dansk', [
'Class:SynchroReplica/Attribute:status_last_warning' => 'Advarsler',
'Class:SynchroReplica/Attribute:info_creation_date' => 'Oprettelses Dato',
'Class:SynchroReplica/Attribute:info_last_modified' => 'Sidste Ændrings Dato',
'Class:SynchroReplica/Action:delete+' => 'delete replica~~',
'Class:SynchroReplica/Action:unlink' => 'Unlink~~',
'Class:SynchroReplica/Action:unlink+' => 'Unlink replica with destination object~~',
'Class:SynchroReplica/Action:unlinksynchro' => 'Unlink & Synchro~~',
'Class:SynchroReplica/Action:unlinksynchro+' => 'Unlink replica with destination object and execute synchronization with this replica~~',
'Class:SynchroReplica/Action:synchro' => 'Synchro~~',
'Class:SynchroReplica/Action:synchro+' => 'Execute synchronization with this replica~~',
'Class:SynchroReplica/Action:allowdelete' => 'Allow delete of object linked to this synchro replica~~',
'Class:SynchroReplica/Action:allowdelete+' => 'Object linked to a deleted replica is deleted~~',
'Class:SynchroReplica/Action:denydelete' => 'Deny delete of object linked to this synchro replica~~',
'Class:SynchroReplica/Action:denydelete+' => 'Object linked to a deleted replica is not deleted~~',
'Class:SynchroReplica/Action:unlink_all' => 'Unlink Synchro Replica objects~~',
'Class:SynchroReplica/Action:unlink_all+' => 'Unlink replica with destination object~~',
'Class:SynchroReplica/Action:unlinksynchro_all' => 'Unlink & Synchronize Synchro Replica objects~~',
'Class:SynchroReplica/Action:unlinksynchro_all+' => 'Unlink replica with destination object and execute synchronization with this replica~~',
'Class:SynchroReplica/Action:synchro_all' => 'Synchronize Synchro Replica objects~~',
'Class:SynchroReplica/Action:synchro_all+' => 'Execute synchronization with this replica~~',
'Class:SynchroReplica/Action:allowdelete_all' => 'Allow delete of objects linked to Synchro Replica~~',
'Class:SynchroReplica/Action:allowdelete_all+' => 'Object linked to a deleted replica is deleted~~',
'Class:SynchroReplica/Action:denydelete_all' => 'Deny delete of objects linked to Synchro Replica~~',
'Class:SynchroReplica/Action:denydelete_all+' => 'Object linked to a deleted replica is not deleted~~',
'UI:UnlinkAllTabTitle' => 'Unlink Synchro Replica objects~~',
'UI:UnlinkAllPageTitle' => 'Unlink Synchro Replica objects~~',
'UI:UnlinkSynchroAllTabTitle' => 'Unlink & Synchronize Synchro Replica objects~~',
'UI:UnlinkSynchroAllPageTitle' => ' Unlink & Synchronize Synchro Replica objects~~',
'UI:SynchroAllTabTitle' => 'Synchronize Synchro Replica objects~~',
'UI:SynchroAllPageTitle' => 'Synchronize Synchro Replica objects~~',
'UI:AllowDeleteAllTabTitle' => 'Allow delete of objects linked to Synchro Replica~~',
'UI:AllowDeleteAllPageTitle' => 'Allow delete of objects linked to Synchro Replica~~',
'UI:DenyDeleteAllTabTitle' => 'Deny delete of objects linked to Synchro Replica~~',
'UI:DenyDeleteAllPageTitle' => 'Deny delete of objects linked to Synchro Replica~~',
'Class:appUserPreferences' => 'Bruger Indstillinger',
'Class:appUserPreferences/Attribute:userid' => 'Bruger',
'Class:appUserPreferences/Attribute:preferences' => 'Inst.',

View File

@@ -972,39 +972,6 @@ Dict::Add('DE DE', 'German', 'Deutsch', [
'Class:SynchroReplica/Attribute:status_last_warning' => 'Letzte Warnung',
'Class:SynchroReplica/Attribute:info_creation_date' => 'Erzeugungs-Datum',
'Class:SynchroReplica/Attribute:info_last_modified' => 'Datum der letzten Modifikation',
'Class:SynchroReplica/Action:delete+' => 'delete replica~~',
'Class:SynchroReplica/Action:unlink' => 'Unlink~~',
'Class:SynchroReplica/Action:unlink+' => 'Unlink replica with destination object~~',
'Class:SynchroReplica/Action:unlinksynchro' => 'Unlink & Synchro~~',
'Class:SynchroReplica/Action:unlinksynchro+' => 'Unlink replica with destination object and execute synchronization with this replica~~',
'Class:SynchroReplica/Action:synchro' => 'Synchro~~',
'Class:SynchroReplica/Action:synchro+' => 'Execute synchronization with this replica~~',
'Class:SynchroReplica/Action:allowdelete' => 'Allow delete of object linked to this synchro replica~~',
'Class:SynchroReplica/Action:allowdelete+' => 'Object linked to a deleted replica is deleted~~',
'Class:SynchroReplica/Action:denydelete' => 'Deny delete of object linked to this synchro replica~~',
'Class:SynchroReplica/Action:denydelete+' => 'Object linked to a deleted replica is not deleted~~',
'Class:SynchroReplica/Action:unlink_all' => 'Unlink Synchro Replica objects~~',
'Class:SynchroReplica/Action:unlink_all+' => 'Unlink replica with destination object~~',
'Class:SynchroReplica/Action:unlinksynchro_all' => 'Unlink & Synchronize Synchro Replica objects~~',
'Class:SynchroReplica/Action:unlinksynchro_all+' => 'Unlink replica with destination object and execute synchronization with this replica~~',
'Class:SynchroReplica/Action:synchro_all' => 'Synchronize Synchro Replica objects~~',
'Class:SynchroReplica/Action:synchro_all+' => 'Execute synchronization with this replica~~',
'Class:SynchroReplica/Action:allowdelete_all' => 'Allow delete of objects linked to Synchro Replica~~',
'Class:SynchroReplica/Action:allowdelete_all+' => 'Object linked to a deleted replica is deleted~~',
'Class:SynchroReplica/Action:denydelete_all' => 'Deny delete of objects linked to Synchro Replica~~',
'Class:SynchroReplica/Action:denydelete_all+' => 'Object linked to a deleted replica is not deleted~~',
'UI:UnlinkAllTabTitle' => 'Unlink Synchro Replica objects~~',
'UI:UnlinkAllPageTitle' => 'Unlink Synchro Replica objects~~',
'UI:UnlinkSynchroAllTabTitle' => 'Unlink & Synchronize Synchro Replica objects~~',
'UI:UnlinkSynchroAllPageTitle' => ' Unlink & Synchronize Synchro Replica objects~~',
'UI:SynchroAllTabTitle' => 'Synchronize Synchro Replica objects~~',
'UI:SynchroAllPageTitle' => 'Synchronize Synchro Replica objects~~',
'UI:AllowDeleteAllTabTitle' => 'Allow delete of objects linked to Synchro Replica~~',
'UI:AllowDeleteAllPageTitle' => 'Allow delete of objects linked to Synchro Replica~~',
'UI:DenyDeleteAllTabTitle' => 'Deny delete of objects linked to Synchro Replica~~',
'UI:DenyDeleteAllPageTitle' => 'Deny delete of objects linked to Synchro Replica~~',
'Class:appUserPreferences' => 'Benutzer-Voreinstellungen',
'Class:appUserPreferences/Attribute:userid' => 'Benutzer',
'Class:appUserPreferences/Attribute:preferences' => 'Voreinstellungen',

View File

@@ -982,7 +982,7 @@ The hyperlink is displayed in the tooltip appearing on the “Lock” symbol of
'Core:SynchroReplica:PublicData' => 'Public Data',
'Core:SynchroReplica:PrivateDetails' => 'Private Details',
'Core:SynchroReplica:BackToDataSource' => 'Go Back to the Synchro Data Source: %1$s',
'Core:SynchroReplica:ListOfReplicas' => 'Replicas of the data source: %1$s',
'Core:SynchroReplica:ListOfReplicas' => 'List of Replica',
'Core:SynchroAttExtKey:ReconciliationById' => 'id (Primary Key)',
'Core:SynchroAtt:attcode' => 'Attribute',
'Core:SynchroAtt:attcode+' => 'Field of the object',
@@ -1036,99 +1036,65 @@ The hyperlink is displayed in the tooltip appearing on the “Lock” symbol of
'Class:SynchroAttLinkSet/Attribute:row_separator' => 'Rows separator',
'Class:SynchroAttLinkSet/Attribute:attribute_separator' => 'Attributes separator',
'Class:SynchroLog' => 'Synchro Log',
'Class:SynchroLog/Attribute:sync_source_id' => 'Synchro Data Source',
'Class:SynchroLog/Attribute:start_date' => 'Start Date',
'Class:SynchroLog/Attribute:end_date' => 'End Date',
'Class:SynchroLog/Attribute:status' => 'Status',
'Class:SynchroLog/Attribute:status/Value:completed' => 'Completed',
'Class:SynchroLog/Attribute:status/Value:error' => 'Error',
'Class:SynchroLog/Attribute:status/Value:running' => 'Still Running',
'Class:SynchroLog/Attribute:stats_nb_replica_seen' => 'Nb replica seen',
'Class:SynchroLog/Attribute:stats_nb_replica_total' => 'Nb replica total',
'Class:SynchroLog/Attribute:stats_nb_obj_deleted' => 'Nb objects deleted',
'Class:SynchroLog/Attribute:stats_nb_obj_deleted_errors' => 'Nb of errors while deleting',
'Class:SynchroLog/Attribute:stats_nb_obj_obsoleted' => 'Nb objects obsoleted',
'Class:SynchroLog/Attribute:stats_nb_obj_obsoleted_errors' => 'Nb of errors while obsoleting',
'Class:SynchroLog/Attribute:stats_nb_obj_created' => 'Nb objects created',
'Class:SynchroLog/Attribute:stats_nb_obj_created_errors' => 'Nb or errors while creating',
'Class:SynchroLog/Attribute:stats_nb_obj_updated' => 'Nb objects updated',
'Class:SynchroLog/Attribute:stats_nb_obj_updated_errors' => 'Nb errors while updating',
'Class:SynchroLog/Attribute:stats_nb_replica_reconciled_errors' => 'Nb of errors during reconciliation',
'Class:SynchroLog/Attribute:sync_source_id' => 'Synchro Data Source',
'Class:SynchroLog/Attribute:start_date' => 'Start Date',
'Class:SynchroLog/Attribute:end_date' => 'End Date',
'Class:SynchroLog/Attribute:status' => 'Status',
'Class:SynchroLog/Attribute:status/Value:completed' => 'Completed',
'Class:SynchroLog/Attribute:status/Value:error' => 'Error',
'Class:SynchroLog/Attribute:status/Value:running' => 'Still Running',
'Class:SynchroLog/Attribute:stats_nb_replica_seen' => 'Nb replica seen',
'Class:SynchroLog/Attribute:stats_nb_replica_total' => 'Nb replica total',
'Class:SynchroLog/Attribute:stats_nb_obj_deleted' => 'Nb objects deleted',
'Class:SynchroLog/Attribute:stats_nb_obj_deleted_errors' => 'Nb of errors while deleting',
'Class:SynchroLog/Attribute:stats_nb_obj_obsoleted' => 'Nb objects obsoleted',
'Class:SynchroLog/Attribute:stats_nb_obj_obsoleted_errors' => 'Nb of errors while obsoleting',
'Class:SynchroLog/Attribute:stats_nb_obj_created' => 'Nb objects created',
'Class:SynchroLog/Attribute:stats_nb_obj_created_errors' => 'Nb or errors while creating',
'Class:SynchroLog/Attribute:stats_nb_obj_updated' => 'Nb objects updated',
'Class:SynchroLog/Attribute:stats_nb_obj_updated_errors' => 'Nb errors while updating',
'Class:SynchroLog/Attribute:stats_nb_replica_reconciled_errors' => 'Nb of errors during reconciliation',
'Class:SynchroLog/Attribute:stats_nb_replica_disappeared_no_action' => 'Nb replica disappeared',
'Class:SynchroLog/Attribute:stats_nb_obj_new_updated' => 'Nb objects updated',
'Class:SynchroLog/Attribute:stats_nb_obj_new_unchanged' => 'Nb objects unchanged',
'Class:SynchroLog/Attribute:last_error' => 'Last error',
'Class:SynchroLog/Attribute:traces' => 'Traces',
'Class:SynchroReplica' => 'Synchro Replica',
'Class:SynchroReplica/Attribute:sync_source_id' => 'Synchro Data Source',
'Class:SynchroReplica/Attribute:dest_id' => 'Destination object (ID)',
'Class:SynchroReplica/Attribute:dest_class' => 'Destination type',
'Class:SynchroReplica/Attribute:status_last_seen' => 'Last seen',
'Class:SynchroReplica/Attribute:status' => 'Status',
'Class:SynchroReplica/Attribute:status/Value:modified' => 'Modified',
'Class:SynchroReplica/Attribute:status/Value:new' => 'New',
'Class:SynchroReplica/Attribute:status/Value:obsolete' => 'Obsolete',
'Class:SynchroReplica/Attribute:status/Value:orphan' => 'Orphan',
'Class:SynchroReplica/Attribute:status/Value:synchronized' => 'Synchronized',
'Class:SynchroReplica/Attribute:status_dest_creator' => 'Object Created ?',
'Class:SynchroReplica/Attribute:status_last_error' => 'Last Error',
'Class:SynchroReplica/Attribute:status_last_warning' => 'Warnings',
'Class:SynchroReplica/Attribute:info_creation_date' => 'Creation Date',
'Class:SynchroReplica/Attribute:info_last_modified' => 'Last Modified Date',
'Class:SynchroReplica/Action:delete+' => 'delete replica',
'Class:SynchroReplica/Action:unlink' => 'Unlink',
'Class:SynchroReplica/Action:unlink+' => 'Unlink replica with destination object',
'Class:SynchroReplica/Action:unlinksynchro' => 'Unlink & Synchro',
'Class:SynchroReplica/Action:unlinksynchro+' => 'Unlink replica with destination object and execute synchronization with this replica',
'Class:SynchroReplica/Action:synchro' => 'Synchro',
'Class:SynchroReplica/Action:synchro+' => 'Execute synchronization with this replica',
'Class:SynchroReplica/Action:allowdelete' => 'Allow delete of object linked to this synchro replica',
'Class:SynchroReplica/Action:allowdelete+' => 'Object linked to a deleted replica is deleted',
'Class:SynchroReplica/Action:denydelete' => 'Deny delete of object linked to this synchro replica',
'Class:SynchroReplica/Action:denydelete+' => 'Object linked to a deleted replica is not deleted',
'Class:SynchroReplica/Action:unlink_all' => 'Unlink Synchro Replica objects',
'Class:SynchroReplica/Action:unlink_all+' => 'Unlink replica with destination object',
'Class:SynchroReplica/Action:unlinksynchro_all' => 'Unlink & Synchronize Synchro Replica objects',
'Class:SynchroReplica/Action:unlinksynchro_all+' => 'Unlink replica with destination object and execute synchronization with this replica',
'Class:SynchroReplica/Action:synchro_all' => 'Synchronize Synchro Replica objects',
'Class:SynchroReplica/Action:synchro_all+' => 'Execute synchronization with this replica',
'Class:SynchroReplica/Action:allowdelete_all' => 'Allow delete of objects linked to Synchro Replica',
'Class:SynchroReplica/Action:allowdelete_all+' => 'Object linked to a deleted replica is deleted',
'Class:SynchroReplica/Action:denydelete_all' => 'Deny delete of objects linked to Synchro Replica',
'Class:SynchroReplica/Action:denydelete_all+' => 'Object linked to a deleted replica is not deleted',
'UI:UnlinkAllTabTitle' => 'Unlink Synchro Replica objects',
'UI:UnlinkAllPageTitle' => 'Unlink Synchro Replica objects',
'UI:UnlinkSynchroAllTabTitle' => 'Unlink & Synchronize Synchro Replica objects',
'UI:UnlinkSynchroAllPageTitle' => ' Unlink & Synchronize Synchro Replica objects',
'UI:SynchroAllTabTitle' => 'Synchronize Synchro Replica objects',
'UI:SynchroAllPageTitle' => 'Synchronize Synchro Replica objects',
'UI:AllowDeleteAllTabTitle' => 'Allow delete of objects linked to Synchro Replica',
'UI:AllowDeleteAllPageTitle' => 'Allow delete of objects linked to Synchro Replica',
'UI:DenyDeleteAllTabTitle' => 'Deny delete of objects linked to Synchro Replica',
'UI:DenyDeleteAllPageTitle' => 'Deny delete of objects linked to Synchro Replica',
'Class:appUserPreferences' => 'User Preferences',
'Class:appUserPreferences/Attribute:userid' => 'User',
'Class:SynchroLog/Attribute:stats_nb_obj_new_updated' => 'Nb objects updated',
'Class:SynchroLog/Attribute:stats_nb_obj_new_unchanged' => 'Nb objects unchanged',
'Class:SynchroLog/Attribute:last_error' => 'Last error',
'Class:SynchroLog/Attribute:traces' => 'Traces',
'Class:SynchroReplica' => 'Synchro Replica',
'Class:SynchroReplica/Attribute:sync_source_id' => 'Synchro Data Source',
'Class:SynchroReplica/Attribute:dest_id' => 'Destination object (ID)',
'Class:SynchroReplica/Attribute:dest_class' => 'Destination type',
'Class:SynchroReplica/Attribute:status_last_seen' => 'Last seen',
'Class:SynchroReplica/Attribute:status' => 'Status',
'Class:SynchroReplica/Attribute:status/Value:modified' => 'Modified',
'Class:SynchroReplica/Attribute:status/Value:new' => 'New',
'Class:SynchroReplica/Attribute:status/Value:obsolete' => 'Obsolete',
'Class:SynchroReplica/Attribute:status/Value:orphan' => 'Orphan',
'Class:SynchroReplica/Attribute:status/Value:synchronized' => 'Synchronized',
'Class:SynchroReplica/Attribute:status_dest_creator' => 'Object Created ?',
'Class:SynchroReplica/Attribute:status_last_error' => 'Last Error',
'Class:SynchroReplica/Attribute:status_last_warning' => 'Warnings',
'Class:SynchroReplica/Attribute:info_creation_date' => 'Creation Date',
'Class:SynchroReplica/Attribute:info_last_modified' => 'Last Modified Date',
'Class:appUserPreferences' => 'User Preferences',
'Class:appUserPreferences/Attribute:userid' => 'User',
'Class:appUserPreferences/Attribute:preferences' => 'Prefs',
'Core:ExecProcess:Code1' => 'Wrong command or command finished with errors (e.g. wrong script name)',
'Core:ExecProcess:Code255' => 'PHP Error (parsing, or runtime)',
'Core:ExecProcess:Code1' => 'Wrong command or command finished with errors (e.g. wrong script name)',
'Core:ExecProcess:Code255' => 'PHP Error (parsing, or runtime)',
// Attribute Duration
'Core:Duration_Seconds' => '%1$ds',
'Core:Duration_Minutes_Seconds' => '%1$dmin %2$ds',
'Core:Duration_Hours_Minutes_Seconds' => '%1$dh %2$dmin %3$ds',
'Core:Duration_Days_Hours_Minutes_Seconds' => '%1$sd %2$dh %3$dmin %4$ds',
'Core:Duration_Seconds' => '%1$ds',
'Core:Duration_Minutes_Seconds' => '%1$dmin %2$ds',
'Core:Duration_Hours_Minutes_Seconds' => '%1$dh %2$dmin %3$ds',
'Core:Duration_Days_Hours_Minutes_Seconds' => '%1$sd %2$dh %3$dmin %4$ds',
// Explain working time computing
'Core:ExplainWTC:ElapsedTime' => 'Time elapsed (stored as "%1$s")',
'Core:ExplainWTC:StopWatch-TimeSpent' => 'Time spent for "%1$s"',
'Core:ExplainWTC:StopWatch-Deadline' => 'Deadline for "%1$s" at %2$d%%',
'Core:ExplainWTC:ElapsedTime' => 'Time elapsed (stored as "%1$s")',
'Core:ExplainWTC:StopWatch-TimeSpent' => 'Time spent for "%1$s"',
'Core:ExplainWTC:StopWatch-Deadline' => 'Deadline for "%1$s" at %2$d%%',
// Bulk export
'Core:BulkExport:MissingParameter_Param' => 'Missing parameter "%1$s"',
'Core:BulkExport:InvalidParameter_Query' => 'Invalid value for the parameter "query". There is no Query Phrasebook corresponding to the id: "%1$s".',
'Core:BulkExport:MissingParameter_Param' => 'Missing parameter "%1$s"',
'Core:BulkExport:InvalidParameter_Query' => 'Invalid value for the parameter "query". There is no Query Phrasebook corresponding to the id: "%1$s".',
'Core:BulkExport:ExportFormatPrompt' => 'Export format:',
'Core:BulkExportOf_Class' => '%1$s Export',
'Core:BulkExport:ClickHereToDownload_FileName' => 'Click here to download %1$s',

View File

@@ -1058,39 +1058,6 @@ The hyperlink is displayed in the tooltip appearing on the “Lock” symbol of
'Class:SynchroReplica/Attribute:status_last_warning' => 'Warnings',
'Class:SynchroReplica/Attribute:info_creation_date' => 'Creation Date',
'Class:SynchroReplica/Attribute:info_last_modified' => 'Last Modified Date',
'Class:SynchroReplica/Action:delete+' => 'delete replica~~',
'Class:SynchroReplica/Action:unlink' => 'Unlink~~',
'Class:SynchroReplica/Action:unlink+' => 'Unlink replica with destination object~~',
'Class:SynchroReplica/Action:unlinksynchro' => 'Unlink & Synchro~~',
'Class:SynchroReplica/Action:unlinksynchro+' => 'Unlink replica with destination object and execute synchronization with this replica~~',
'Class:SynchroReplica/Action:synchro' => 'Synchro~~',
'Class:SynchroReplica/Action:synchro+' => 'Execute synchronization with this replica~~',
'Class:SynchroReplica/Action:allowdelete' => 'Allow delete of object linked to this synchro replica~~',
'Class:SynchroReplica/Action:allowdelete+' => 'Object linked to a deleted replica is deleted~~',
'Class:SynchroReplica/Action:denydelete' => 'Deny delete of object linked to this synchro replica~~',
'Class:SynchroReplica/Action:denydelete+' => 'Object linked to a deleted replica is not deleted~~',
'Class:SynchroReplica/Action:unlink_all' => 'Unlink Synchro Replica objects~~',
'Class:SynchroReplica/Action:unlink_all+' => 'Unlink replica with destination object~~',
'Class:SynchroReplica/Action:unlinksynchro_all' => 'Unlink & Synchronize Synchro Replica objects~~',
'Class:SynchroReplica/Action:unlinksynchro_all+' => 'Unlink replica with destination object and execute synchronization with this replica~~',
'Class:SynchroReplica/Action:synchro_all' => 'Synchronize Synchro Replica objects~~',
'Class:SynchroReplica/Action:synchro_all+' => 'Execute synchronization with this replica~~',
'Class:SynchroReplica/Action:allowdelete_all' => 'Allow delete of objects linked to Synchro Replica~~',
'Class:SynchroReplica/Action:allowdelete_all+' => 'Object linked to a deleted replica is deleted~~',
'Class:SynchroReplica/Action:denydelete_all' => 'Deny delete of objects linked to Synchro Replica~~',
'Class:SynchroReplica/Action:denydelete_all+' => 'Object linked to a deleted replica is not deleted~~',
'UI:UnlinkAllTabTitle' => 'Unlink Synchro Replica objects~~',
'UI:UnlinkAllPageTitle' => 'Unlink Synchro Replica objects~~',
'UI:UnlinkSynchroAllTabTitle' => 'Unlink & Synchronize Synchro Replica objects~~',
'UI:UnlinkSynchroAllPageTitle' => ' Unlink & Synchronize Synchro Replica objects~~',
'UI:SynchroAllTabTitle' => 'Synchronize Synchro Replica objects~~',
'UI:SynchroAllPageTitle' => 'Synchronize Synchro Replica objects~~',
'UI:AllowDeleteAllTabTitle' => 'Allow delete of objects linked to Synchro Replica~~',
'UI:AllowDeleteAllPageTitle' => 'Allow delete of objects linked to Synchro Replica~~',
'UI:DenyDeleteAllTabTitle' => 'Deny delete of objects linked to Synchro Replica~~',
'UI:DenyDeleteAllPageTitle' => 'Deny delete of objects linked to Synchro Replica~~',
'Class:appUserPreferences' => 'User Preferences',
'Class:appUserPreferences/Attribute:userid' => 'User',
'Class:appUserPreferences/Attribute:preferences' => 'Prefs',

View File

@@ -963,39 +963,6 @@ Dict::Add('ES CR', 'Spanish', 'Español, Castellano', [
'Class:SynchroReplica/Attribute:status_last_warning' => 'Advertencias',
'Class:SynchroReplica/Attribute:info_creation_date' => 'Fecha de Creación',
'Class:SynchroReplica/Attribute:info_last_modified' => 'Fecha Última Modificación',
'Class:SynchroReplica/Action:delete+' => 'delete replica~~',
'Class:SynchroReplica/Action:unlink' => 'Unlink~~',
'Class:SynchroReplica/Action:unlink+' => 'Unlink replica with destination object~~',
'Class:SynchroReplica/Action:unlinksynchro' => 'Unlink & Synchro~~',
'Class:SynchroReplica/Action:unlinksynchro+' => 'Unlink replica with destination object and execute synchronization with this replica~~',
'Class:SynchroReplica/Action:synchro' => 'Synchro~~',
'Class:SynchroReplica/Action:synchro+' => 'Execute synchronization with this replica~~',
'Class:SynchroReplica/Action:allowdelete' => 'Allow delete of object linked to this synchro replica~~',
'Class:SynchroReplica/Action:allowdelete+' => 'Object linked to a deleted replica is deleted~~',
'Class:SynchroReplica/Action:denydelete' => 'Deny delete of object linked to this synchro replica~~',
'Class:SynchroReplica/Action:denydelete+' => 'Object linked to a deleted replica is not deleted~~',
'Class:SynchroReplica/Action:unlink_all' => 'Unlink Synchro Replica objects~~',
'Class:SynchroReplica/Action:unlink_all+' => 'Unlink replica with destination object~~',
'Class:SynchroReplica/Action:unlinksynchro_all' => 'Unlink & Synchronize Synchro Replica objects~~',
'Class:SynchroReplica/Action:unlinksynchro_all+' => 'Unlink replica with destination object and execute synchronization with this replica~~',
'Class:SynchroReplica/Action:synchro_all' => 'Synchronize Synchro Replica objects~~',
'Class:SynchroReplica/Action:synchro_all+' => 'Execute synchronization with this replica~~',
'Class:SynchroReplica/Action:allowdelete_all' => 'Allow delete of objects linked to Synchro Replica~~',
'Class:SynchroReplica/Action:allowdelete_all+' => 'Object linked to a deleted replica is deleted~~',
'Class:SynchroReplica/Action:denydelete_all' => 'Deny delete of objects linked to Synchro Replica~~',
'Class:SynchroReplica/Action:denydelete_all+' => 'Object linked to a deleted replica is not deleted~~',
'UI:UnlinkAllTabTitle' => 'Unlink Synchro Replica objects~~',
'UI:UnlinkAllPageTitle' => 'Unlink Synchro Replica objects~~',
'UI:UnlinkSynchroAllTabTitle' => 'Unlink & Synchronize Synchro Replica objects~~',
'UI:UnlinkSynchroAllPageTitle' => ' Unlink & Synchronize Synchro Replica objects~~',
'UI:SynchroAllTabTitle' => 'Synchronize Synchro Replica objects~~',
'UI:SynchroAllPageTitle' => 'Synchronize Synchro Replica objects~~',
'UI:AllowDeleteAllTabTitle' => 'Allow delete of objects linked to Synchro Replica~~',
'UI:AllowDeleteAllPageTitle' => 'Allow delete of objects linked to Synchro Replica~~',
'UI:DenyDeleteAllTabTitle' => 'Deny delete of objects linked to Synchro Replica~~',
'UI:DenyDeleteAllPageTitle' => 'Deny delete of objects linked to Synchro Replica~~',
'Class:appUserPreferences' => 'Preferencias de Usuario',
'Class:appUserPreferences/Attribute:userid' => 'Usuario',
'Class:appUserPreferences/Attribute:preferences' => 'Preferencias',

View File

@@ -1021,40 +1021,6 @@ Plusieurs champs peuvent ainsi être modifiés lors d\'une "mise à jour" en app
'Class:SynchroReplica/Attribute:status_last_warning' => 'Avertissements',
'Class:SynchroReplica/Attribute:info_creation_date' => 'Date de création',
'Class:SynchroReplica/Attribute:info_last_modified' => 'Date de dernière modification',
'Class:SynchroReplica/Action:delete+' => 'Supprimer le réplica',
'Class:SynchroReplica/Action:unlink' => 'Délier',
'Class:SynchroReplica/Action:unlink+' => 'Séparer le réplica de son objet lié',
'Class:SynchroReplica/Action:unlinksynchro' => 'Délier & Synchroniser',
'Class:SynchroReplica/Action:unlinksynchro+' => 'Délier le réplica avec son objet cible et executer la synchronisation sur ce réplica',
'Class:SynchroReplica/Action:synchro' => 'Synchroniser',
'Class:SynchroReplica/Action:synchro+' => 'Exécuter la synchronisation sur ce réplica',
'Class:SynchroReplica/Action:allowdelete' => 'Permettre la suppression de l\'objet lié à ce réplica',
'Class:SynchroReplica/Action:allowdelete+' => 'L\'objet lié à un réplica supprimé est supprimé',
'Class:SynchroReplica/Action:denydelete' => 'Interdire la suppression de l\objet lié à ce réplica',
'Class:SynchroReplica/Action:denydelete+' => 'L\'objet lié à un réplica supprimé n\'est pas supprimé',
'Class:SynchroReplica/Action:unlink_all' => 'Délier les réplicas et les objets',
'Class:SynchroReplica/Action:unlink_all+' => 'Séparer les réplicas de leurs objets liés',
'Class:SynchroReplica/Action:unlinksynchro_all' => 'Délier & Synchroniser les réplicas et les objets',
'Class:SynchroReplica/Action:unlinksynchro_all+' => 'Séparer les réplicas le leurs objets cilbles et exécuter la synchronisation sur les réplicas',
'Class:SynchroReplica/Action:synchro_all' => 'Synchroniser les objets Réplica',
'Class:SynchroReplica/Action:synchro_all+' => 'Exécuter la synchronisation avec ces réplicas',
'Class:SynchroReplica/Action:allowdelete_all' => 'Autoriser la suppression des objets liés aux Réplicas',
'Class:SynchroReplica/Action:allowdelete_all+' => 'L\'objet lié à un réplica supprimé est supprimé',
'Class:SynchroReplica/Action:denydelete_all' => 'Interdire la suppression des objets liés aux Réplicas',
'Class:SynchroReplica/Action:denydelete_all+' => 'L\'objet lié à un réplica supprimé n\'est pas supprimé',
'UI:UnlinkAllTabTitle' => 'Délier les réplicas des objets',
'UI:UnlinkAllPageTitle' => 'Séparer les réplicas de leurs objets liés',
'UI:UnlinkSynchroAllTabTitle' => 'Délier & synchroniser les réplicas',
'UI:UnlinkSynchroAllPageTitle' => 'Délier & synchroniser les réplicas ',
'UI:SynchroAllTabTitle' => 'Synchroniser les réplica',
'UI:SynchroAllPageTitle' => 'Synchroniser les réplica',
'UI:AllowDeleteAllTabTitle' => 'Autoriser la suppression des objets liés aux réplicas',
'UI:AllowDeleteAllPageTitle' => 'Autoriser la suppression des objets liés aux réplicas',
'UI:DenyDeleteAllTabTitle' => 'Interdire la suppression des objets liés aux réplicas',
'UI:DenyDeleteAllPageTitle' => 'Interdire la suppression des objets liés aux réplicas',
'Class:appUserPreferences' => 'Préférences utilisateur',
'Class:appUserPreferences/Attribute:userid' => 'Utilisateur',
'Class:appUserPreferences/Attribute:preferences' => 'Préférences',

View File

@@ -970,39 +970,6 @@ Dict::Add('HU HU', 'Hungarian', 'Magyar', [
'Class:SynchroReplica/Attribute:status_last_warning' => 'Figyelmeztetések',
'Class:SynchroReplica/Attribute:info_creation_date' => 'Létrehozás dátuma',
'Class:SynchroReplica/Attribute:info_last_modified' => 'Utolsó módosítás dátuma',
'Class:SynchroReplica/Action:delete+' => 'delete replica~~',
'Class:SynchroReplica/Action:unlink' => 'Unlink~~',
'Class:SynchroReplica/Action:unlink+' => 'Unlink replica with destination object~~',
'Class:SynchroReplica/Action:unlinksynchro' => 'Unlink & Synchro~~',
'Class:SynchroReplica/Action:unlinksynchro+' => 'Unlink replica with destination object and execute synchronization with this replica~~',
'Class:SynchroReplica/Action:synchro' => 'Synchro~~',
'Class:SynchroReplica/Action:synchro+' => 'Execute synchronization with this replica~~',
'Class:SynchroReplica/Action:allowdelete' => 'Allow delete of object linked to this synchro replica~~',
'Class:SynchroReplica/Action:allowdelete+' => 'Object linked to a deleted replica is deleted~~',
'Class:SynchroReplica/Action:denydelete' => 'Deny delete of object linked to this synchro replica~~',
'Class:SynchroReplica/Action:denydelete+' => 'Object linked to a deleted replica is not deleted~~',
'Class:SynchroReplica/Action:unlink_all' => 'Unlink Synchro Replica objects~~',
'Class:SynchroReplica/Action:unlink_all+' => 'Unlink replica with destination object~~',
'Class:SynchroReplica/Action:unlinksynchro_all' => 'Unlink & Synchronize Synchro Replica objects~~',
'Class:SynchroReplica/Action:unlinksynchro_all+' => 'Unlink replica with destination object and execute synchronization with this replica~~',
'Class:SynchroReplica/Action:synchro_all' => 'Synchronize Synchro Replica objects~~',
'Class:SynchroReplica/Action:synchro_all+' => 'Execute synchronization with this replica~~',
'Class:SynchroReplica/Action:allowdelete_all' => 'Allow delete of objects linked to Synchro Replica~~',
'Class:SynchroReplica/Action:allowdelete_all+' => 'Object linked to a deleted replica is deleted~~',
'Class:SynchroReplica/Action:denydelete_all' => 'Deny delete of objects linked to Synchro Replica~~',
'Class:SynchroReplica/Action:denydelete_all+' => 'Object linked to a deleted replica is not deleted~~',
'UI:UnlinkAllTabTitle' => 'Unlink Synchro Replica objects~~',
'UI:UnlinkAllPageTitle' => 'Unlink Synchro Replica objects~~',
'UI:UnlinkSynchroAllTabTitle' => 'Unlink & Synchronize Synchro Replica objects~~',
'UI:UnlinkSynchroAllPageTitle' => ' Unlink & Synchronize Synchro Replica objects~~',
'UI:SynchroAllTabTitle' => 'Synchronize Synchro Replica objects~~',
'UI:SynchroAllPageTitle' => 'Synchronize Synchro Replica objects~~',
'UI:AllowDeleteAllTabTitle' => 'Allow delete of objects linked to Synchro Replica~~',
'UI:AllowDeleteAllPageTitle' => 'Allow delete of objects linked to Synchro Replica~~',
'UI:DenyDeleteAllTabTitle' => 'Deny delete of objects linked to Synchro Replica~~',
'UI:DenyDeleteAllPageTitle' => 'Deny delete of objects linked to Synchro Replica~~',
'Class:appUserPreferences' => 'Felhasználói beállítások',
'Class:appUserPreferences/Attribute:userid' => 'Felhasználónév',
'Class:appUserPreferences/Attribute:preferences' => 'Beállítások',

View File

@@ -970,39 +970,6 @@ Dict::Add('IT IT', 'Italian', 'Italiano', [
'Class:SynchroReplica/Attribute:status_last_warning' => 'Avvisi',
'Class:SynchroReplica/Attribute:info_creation_date' => 'Data di creazione',
'Class:SynchroReplica/Attribute:info_last_modified' => 'Data di ultima modifica',
'Class:SynchroReplica/Action:delete+' => 'delete replica~~',
'Class:SynchroReplica/Action:unlink' => 'Unlink~~',
'Class:SynchroReplica/Action:unlink+' => 'Unlink replica with destination object~~',
'Class:SynchroReplica/Action:unlinksynchro' => 'Unlink & Synchro~~',
'Class:SynchroReplica/Action:unlinksynchro+' => 'Unlink replica with destination object and execute synchronization with this replica~~',
'Class:SynchroReplica/Action:synchro' => 'Synchro~~',
'Class:SynchroReplica/Action:synchro+' => 'Execute synchronization with this replica~~',
'Class:SynchroReplica/Action:allowdelete' => 'Allow delete of object linked to this synchro replica~~',
'Class:SynchroReplica/Action:allowdelete+' => 'Object linked to a deleted replica is deleted~~',
'Class:SynchroReplica/Action:denydelete' => 'Deny delete of object linked to this synchro replica~~',
'Class:SynchroReplica/Action:denydelete+' => 'Object linked to a deleted replica is not deleted~~',
'Class:SynchroReplica/Action:unlink_all' => 'Unlink Synchro Replica objects~~',
'Class:SynchroReplica/Action:unlink_all+' => 'Unlink replica with destination object~~',
'Class:SynchroReplica/Action:unlinksynchro_all' => 'Unlink & Synchronize Synchro Replica objects~~',
'Class:SynchroReplica/Action:unlinksynchro_all+' => 'Unlink replica with destination object and execute synchronization with this replica~~',
'Class:SynchroReplica/Action:synchro_all' => 'Synchronize Synchro Replica objects~~',
'Class:SynchroReplica/Action:synchro_all+' => 'Execute synchronization with this replica~~',
'Class:SynchroReplica/Action:allowdelete_all' => 'Allow delete of objects linked to Synchro Replica~~',
'Class:SynchroReplica/Action:allowdelete_all+' => 'Object linked to a deleted replica is deleted~~',
'Class:SynchroReplica/Action:denydelete_all' => 'Deny delete of objects linked to Synchro Replica~~',
'Class:SynchroReplica/Action:denydelete_all+' => 'Object linked to a deleted replica is not deleted~~',
'UI:UnlinkAllTabTitle' => 'Unlink Synchro Replica objects~~',
'UI:UnlinkAllPageTitle' => 'Unlink Synchro Replica objects~~',
'UI:UnlinkSynchroAllTabTitle' => 'Unlink & Synchronize Synchro Replica objects~~',
'UI:UnlinkSynchroAllPageTitle' => ' Unlink & Synchronize Synchro Replica objects~~',
'UI:SynchroAllTabTitle' => 'Synchronize Synchro Replica objects~~',
'UI:SynchroAllPageTitle' => 'Synchronize Synchro Replica objects~~',
'UI:AllowDeleteAllTabTitle' => 'Allow delete of objects linked to Synchro Replica~~',
'UI:AllowDeleteAllPageTitle' => 'Allow delete of objects linked to Synchro Replica~~',
'UI:DenyDeleteAllTabTitle' => 'Deny delete of objects linked to Synchro Replica~~',
'UI:DenyDeleteAllPageTitle' => 'Deny delete of objects linked to Synchro Replica~~',
'Class:appUserPreferences' => 'Preferenze utente',
'Class:appUserPreferences/Attribute:userid' => 'Utente',
'Class:appUserPreferences/Attribute:preferences' => 'Prefs',

View File

@@ -974,39 +974,6 @@ Dict::Add('JA JP', 'Japanese', '日本語', [
'Class:SynchroReplica/Attribute:status_last_warning' => '警告',
'Class:SynchroReplica/Attribute:info_creation_date' => '作成日',
'Class:SynchroReplica/Attribute:info_last_modified' => '最終修正日',
'Class:SynchroReplica/Action:delete+' => 'delete replica~~',
'Class:SynchroReplica/Action:unlink' => 'Unlink~~',
'Class:SynchroReplica/Action:unlink+' => 'Unlink replica with destination object~~',
'Class:SynchroReplica/Action:unlinksynchro' => 'Unlink & Synchro~~',
'Class:SynchroReplica/Action:unlinksynchro+' => 'Unlink replica with destination object and execute synchronization with this replica~~',
'Class:SynchroReplica/Action:synchro' => 'Synchro~~',
'Class:SynchroReplica/Action:synchro+' => 'Execute synchronization with this replica~~',
'Class:SynchroReplica/Action:allowdelete' => 'Allow delete of object linked to this synchro replica~~',
'Class:SynchroReplica/Action:allowdelete+' => 'Object linked to a deleted replica is deleted~~',
'Class:SynchroReplica/Action:denydelete' => 'Deny delete of object linked to this synchro replica~~',
'Class:SynchroReplica/Action:denydelete+' => 'Object linked to a deleted replica is not deleted~~',
'Class:SynchroReplica/Action:unlink_all' => 'Unlink Synchro Replica objects~~',
'Class:SynchroReplica/Action:unlink_all+' => 'Unlink replica with destination object~~',
'Class:SynchroReplica/Action:unlinksynchro_all' => 'Unlink & Synchronize Synchro Replica objects~~',
'Class:SynchroReplica/Action:unlinksynchro_all+' => 'Unlink replica with destination object and execute synchronization with this replica~~',
'Class:SynchroReplica/Action:synchro_all' => 'Synchronize Synchro Replica objects~~',
'Class:SynchroReplica/Action:synchro_all+' => 'Execute synchronization with this replica~~',
'Class:SynchroReplica/Action:allowdelete_all' => 'Allow delete of objects linked to Synchro Replica~~',
'Class:SynchroReplica/Action:allowdelete_all+' => 'Object linked to a deleted replica is deleted~~',
'Class:SynchroReplica/Action:denydelete_all' => 'Deny delete of objects linked to Synchro Replica~~',
'Class:SynchroReplica/Action:denydelete_all+' => 'Object linked to a deleted replica is not deleted~~',
'UI:UnlinkAllTabTitle' => 'Unlink Synchro Replica objects~~',
'UI:UnlinkAllPageTitle' => 'Unlink Synchro Replica objects~~',
'UI:UnlinkSynchroAllTabTitle' => 'Unlink & Synchronize Synchro Replica objects~~',
'UI:UnlinkSynchroAllPageTitle' => ' Unlink & Synchronize Synchro Replica objects~~',
'UI:SynchroAllTabTitle' => 'Synchronize Synchro Replica objects~~',
'UI:SynchroAllPageTitle' => 'Synchronize Synchro Replica objects~~',
'UI:AllowDeleteAllTabTitle' => 'Allow delete of objects linked to Synchro Replica~~',
'UI:AllowDeleteAllPageTitle' => 'Allow delete of objects linked to Synchro Replica~~',
'UI:DenyDeleteAllTabTitle' => 'Deny delete of objects linked to Synchro Replica~~',
'UI:DenyDeleteAllPageTitle' => 'Deny delete of objects linked to Synchro Replica~~',
'Class:appUserPreferences' => 'ユーザプリファレンス',
'Class:appUserPreferences/Attribute:userid' => 'ユーザ',
'Class:appUserPreferences/Attribute:preferences' => 'プリファレンス',

View File

@@ -972,39 +972,6 @@ Dict::Add('NL NL', 'Dutch', 'Nederlands', [
'Class:SynchroReplica/Attribute:status_last_warning' => 'Waarschuwingen',
'Class:SynchroReplica/Attribute:info_creation_date' => 'Datum van aanmaken',
'Class:SynchroReplica/Attribute:info_last_modified' => 'Datum van de laatste aanpassing',
'Class:SynchroReplica/Action:delete+' => 'delete replica~~',
'Class:SynchroReplica/Action:unlink' => 'Unlink~~',
'Class:SynchroReplica/Action:unlink+' => 'Unlink replica with destination object~~',
'Class:SynchroReplica/Action:unlinksynchro' => 'Unlink & Synchro~~',
'Class:SynchroReplica/Action:unlinksynchro+' => 'Unlink replica with destination object and execute synchronization with this replica~~',
'Class:SynchroReplica/Action:synchro' => 'Synchro~~',
'Class:SynchroReplica/Action:synchro+' => 'Execute synchronization with this replica~~',
'Class:SynchroReplica/Action:allowdelete' => 'Allow delete of object linked to this synchro replica~~',
'Class:SynchroReplica/Action:allowdelete+' => 'Object linked to a deleted replica is deleted~~',
'Class:SynchroReplica/Action:denydelete' => 'Deny delete of object linked to this synchro replica~~',
'Class:SynchroReplica/Action:denydelete+' => 'Object linked to a deleted replica is not deleted~~',
'Class:SynchroReplica/Action:unlink_all' => 'Unlink Synchro Replica objects~~',
'Class:SynchroReplica/Action:unlink_all+' => 'Unlink replica with destination object~~',
'Class:SynchroReplica/Action:unlinksynchro_all' => 'Unlink & Synchronize Synchro Replica objects~~',
'Class:SynchroReplica/Action:unlinksynchro_all+' => 'Unlink replica with destination object and execute synchronization with this replica~~',
'Class:SynchroReplica/Action:synchro_all' => 'Synchronize Synchro Replica objects~~',
'Class:SynchroReplica/Action:synchro_all+' => 'Execute synchronization with this replica~~',
'Class:SynchroReplica/Action:allowdelete_all' => 'Allow delete of objects linked to Synchro Replica~~',
'Class:SynchroReplica/Action:allowdelete_all+' => 'Object linked to a deleted replica is deleted~~',
'Class:SynchroReplica/Action:denydelete_all' => 'Deny delete of objects linked to Synchro Replica~~',
'Class:SynchroReplica/Action:denydelete_all+' => 'Object linked to a deleted replica is not deleted~~',
'UI:UnlinkAllTabTitle' => 'Unlink Synchro Replica objects~~',
'UI:UnlinkAllPageTitle' => 'Unlink Synchro Replica objects~~',
'UI:UnlinkSynchroAllTabTitle' => 'Unlink & Synchronize Synchro Replica objects~~',
'UI:UnlinkSynchroAllPageTitle' => ' Unlink & Synchronize Synchro Replica objects~~',
'UI:SynchroAllTabTitle' => 'Synchronize Synchro Replica objects~~',
'UI:SynchroAllPageTitle' => 'Synchronize Synchro Replica objects~~',
'UI:AllowDeleteAllTabTitle' => 'Allow delete of objects linked to Synchro Replica~~',
'UI:AllowDeleteAllPageTitle' => 'Allow delete of objects linked to Synchro Replica~~',
'UI:DenyDeleteAllTabTitle' => 'Deny delete of objects linked to Synchro Replica~~',
'UI:DenyDeleteAllPageTitle' => 'Deny delete of objects linked to Synchro Replica~~',
'Class:appUserPreferences' => 'Gebruikersvoorkeuren',
'Class:appUserPreferences/Attribute:userid' => 'Gebruiker',
'Class:appUserPreferences/Attribute:preferences' => 'Voorkeuren',

View File

@@ -969,39 +969,6 @@ Dict::Add('PL PL', 'Polish', 'Polski', [
'Class:SynchroReplica/Attribute:status_last_warning' => 'Ostrzeżenia',
'Class:SynchroReplica/Attribute:info_creation_date' => 'Data utworzenia',
'Class:SynchroReplica/Attribute:info_last_modified' => 'Data ostatniej zmiany',
'Class:SynchroReplica/Action:delete+' => 'delete replica~~',
'Class:SynchroReplica/Action:unlink' => 'Unlink~~',
'Class:SynchroReplica/Action:unlink+' => 'Unlink replica with destination object~~',
'Class:SynchroReplica/Action:unlinksynchro' => 'Unlink & Synchro~~',
'Class:SynchroReplica/Action:unlinksynchro+' => 'Unlink replica with destination object and execute synchronization with this replica~~',
'Class:SynchroReplica/Action:synchro' => 'Synchro~~',
'Class:SynchroReplica/Action:synchro+' => 'Execute synchronization with this replica~~',
'Class:SynchroReplica/Action:allowdelete' => 'Allow delete of object linked to this synchro replica~~',
'Class:SynchroReplica/Action:allowdelete+' => 'Object linked to a deleted replica is deleted~~',
'Class:SynchroReplica/Action:denydelete' => 'Deny delete of object linked to this synchro replica~~',
'Class:SynchroReplica/Action:denydelete+' => 'Object linked to a deleted replica is not deleted~~',
'Class:SynchroReplica/Action:unlink_all' => 'Unlink Synchro Replica objects~~',
'Class:SynchroReplica/Action:unlink_all+' => 'Unlink replica with destination object~~',
'Class:SynchroReplica/Action:unlinksynchro_all' => 'Unlink & Synchronize Synchro Replica objects~~',
'Class:SynchroReplica/Action:unlinksynchro_all+' => 'Unlink replica with destination object and execute synchronization with this replica~~',
'Class:SynchroReplica/Action:synchro_all' => 'Synchronize Synchro Replica objects~~',
'Class:SynchroReplica/Action:synchro_all+' => 'Execute synchronization with this replica~~',
'Class:SynchroReplica/Action:allowdelete_all' => 'Allow delete of objects linked to Synchro Replica~~',
'Class:SynchroReplica/Action:allowdelete_all+' => 'Object linked to a deleted replica is deleted~~',
'Class:SynchroReplica/Action:denydelete_all' => 'Deny delete of objects linked to Synchro Replica~~',
'Class:SynchroReplica/Action:denydelete_all+' => 'Object linked to a deleted replica is not deleted~~',
'UI:UnlinkAllTabTitle' => 'Unlink Synchro Replica objects~~',
'UI:UnlinkAllPageTitle' => 'Unlink Synchro Replica objects~~',
'UI:UnlinkSynchroAllTabTitle' => 'Unlink & Synchronize Synchro Replica objects~~',
'UI:UnlinkSynchroAllPageTitle' => ' Unlink & Synchronize Synchro Replica objects~~',
'UI:SynchroAllTabTitle' => 'Synchronize Synchro Replica objects~~',
'UI:SynchroAllPageTitle' => 'Synchronize Synchro Replica objects~~',
'UI:AllowDeleteAllTabTitle' => 'Allow delete of objects linked to Synchro Replica~~',
'UI:AllowDeleteAllPageTitle' => 'Allow delete of objects linked to Synchro Replica~~',
'UI:DenyDeleteAllTabTitle' => 'Deny delete of objects linked to Synchro Replica~~',
'UI:DenyDeleteAllPageTitle' => 'Deny delete of objects linked to Synchro Replica~~',
'Class:appUserPreferences' => 'Preferencje użytkownika',
'Class:appUserPreferences/Attribute:userid' => 'Użytkownik',
'Class:appUserPreferences/Attribute:preferences' => 'Preferencje',

View File

@@ -970,39 +970,6 @@ Dict::Add('PT BR', 'Brazilian', 'Brazilian', [
'Class:SynchroReplica/Attribute:status_last_warning' => 'Alertas',
'Class:SynchroReplica/Attribute:info_creation_date' => 'Data de criação',
'Class:SynchroReplica/Attribute:info_last_modified' => 'Última data modificação',
'Class:SynchroReplica/Action:delete+' => 'delete replica~~',
'Class:SynchroReplica/Action:unlink' => 'Unlink~~',
'Class:SynchroReplica/Action:unlink+' => 'Unlink replica with destination object~~',
'Class:SynchroReplica/Action:unlinksynchro' => 'Unlink & Synchro~~',
'Class:SynchroReplica/Action:unlinksynchro+' => 'Unlink replica with destination object and execute synchronization with this replica~~',
'Class:SynchroReplica/Action:synchro' => 'Synchro~~',
'Class:SynchroReplica/Action:synchro+' => 'Execute synchronization with this replica~~',
'Class:SynchroReplica/Action:allowdelete' => 'Allow delete of object linked to this synchro replica~~',
'Class:SynchroReplica/Action:allowdelete+' => 'Object linked to a deleted replica is deleted~~',
'Class:SynchroReplica/Action:denydelete' => 'Deny delete of object linked to this synchro replica~~',
'Class:SynchroReplica/Action:denydelete+' => 'Object linked to a deleted replica is not deleted~~',
'Class:SynchroReplica/Action:unlink_all' => 'Unlink Synchro Replica objects~~',
'Class:SynchroReplica/Action:unlink_all+' => 'Unlink replica with destination object~~',
'Class:SynchroReplica/Action:unlinksynchro_all' => 'Unlink & Synchronize Synchro Replica objects~~',
'Class:SynchroReplica/Action:unlinksynchro_all+' => 'Unlink replica with destination object and execute synchronization with this replica~~',
'Class:SynchroReplica/Action:synchro_all' => 'Synchronize Synchro Replica objects~~',
'Class:SynchroReplica/Action:synchro_all+' => 'Execute synchronization with this replica~~',
'Class:SynchroReplica/Action:allowdelete_all' => 'Allow delete of objects linked to Synchro Replica~~',
'Class:SynchroReplica/Action:allowdelete_all+' => 'Object linked to a deleted replica is deleted~~',
'Class:SynchroReplica/Action:denydelete_all' => 'Deny delete of objects linked to Synchro Replica~~',
'Class:SynchroReplica/Action:denydelete_all+' => 'Object linked to a deleted replica is not deleted~~',
'UI:UnlinkAllTabTitle' => 'Unlink Synchro Replica objects~~',
'UI:UnlinkAllPageTitle' => 'Unlink Synchro Replica objects~~',
'UI:UnlinkSynchroAllTabTitle' => 'Unlink & Synchronize Synchro Replica objects~~',
'UI:UnlinkSynchroAllPageTitle' => ' Unlink & Synchronize Synchro Replica objects~~',
'UI:SynchroAllTabTitle' => 'Synchronize Synchro Replica objects~~',
'UI:SynchroAllPageTitle' => 'Synchronize Synchro Replica objects~~',
'UI:AllowDeleteAllTabTitle' => 'Allow delete of objects linked to Synchro Replica~~',
'UI:AllowDeleteAllPageTitle' => 'Allow delete of objects linked to Synchro Replica~~',
'UI:DenyDeleteAllTabTitle' => 'Deny delete of objects linked to Synchro Replica~~',
'UI:DenyDeleteAllPageTitle' => 'Deny delete of objects linked to Synchro Replica~~',
'Class:appUserPreferences' => 'Preferências de usuário',
'Class:appUserPreferences/Attribute:userid' => 'Usuário',
'Class:appUserPreferences/Attribute:preferences' => 'Preferências',

View File

@@ -975,40 +975,6 @@ Dict::Add('RU RU', 'Russian', 'Русский', [
'Class:SynchroReplica/Attribute:status_last_warning' => 'Предупреждения',
'Class:SynchroReplica/Attribute:info_creation_date' => 'Дата создания',
'Class:SynchroReplica/Attribute:info_last_modified' => 'Дата последнего изменения',
'Class:SynchroReplica/Action:delete+' => 'delete replica~~',
'Class:SynchroReplica/Action:unlink' => 'Unlink~~',
'Class:SynchroReplica/Action:unlink+' => 'Unlink replica with destination object~~',
'Class:SynchroReplica/Action:unlinksynchro' => 'Unlink & Synchro~~',
'Class:SynchroReplica/Action:unlinksynchro+' => 'Unlink replica with destination object and execute synchronization with this replica~~',
'Class:SynchroReplica/Action:synchro' => 'Synchro~~',
'Class:SynchroReplica/Action:synchro+' => 'Execute synchronization with this replica~~',
'Class:SynchroReplica/Action:allowdelete' => 'Allow delete of object linked to this synchro replica~~',
'Class:SynchroReplica/Action:allowdelete+' => 'Object linked to a deleted replica is deleted~~',
'Class:SynchroReplica/Action:denydelete' => 'Deny delete of object linked to this synchro replica~~',
'Class:SynchroReplica/Action:denydelete+' => 'Object linked to a deleted replica is not deleted~~',
'Class:SynchroReplica/Action:unlink_all' => 'Unlink Synchro Replica objects~~',
'Class:SynchroReplica/Action:unlink_all+' => 'Unlink replica with destination object~~',
'Class:SynchroReplica/Action:unlinksynchro_all' => 'Unlink & Synchronize Synchro Replica objects~~',
'Class:SynchroReplica/Action:unlinksynchro_all+' => 'Unlink replica with destination object and execute synchronization with this replica~~',
'Class:SynchroReplica/Action:synchro_all' => 'Synchronize Synchro Replica objects~~',
'Class:SynchroReplica/Action:synchro_all+' => 'Execute synchronization with this replica~~',
'Class:SynchroReplica/Action:allowdelete_all' => 'Allow delete of objects linked to Synchro Replica~~',
'Class:SynchroReplica/Action:allowdelete_all+' => 'Object linked to a deleted replica is deleted~~',
'Class:SynchroReplica/Action:denydelete_all' => 'Deny delete of objects linked to Synchro Replica~~',
'Class:SynchroReplica/Action:denydelete_all+' => 'Object linked to a deleted replica is not deleted~~',
'UI:UnlinkAllTabTitle' => 'Unlink Synchro Replica objects~~',
'UI:UnlinkAllPageTitle' => 'Unlink Synchro Replica objects~~',
'UI:UnlinkSynchroAllTabTitle' => 'Unlink & Synchronize Synchro Replica objects~~',
'UI:UnlinkSynchroAllPageTitle' => ' Unlink & Synchronize Synchro Replica objects~~',
'UI:SynchroAllTabTitle' => 'Synchronize Synchro Replica objects~~',
'UI:SynchroAllPageTitle' => 'Synchronize Synchro Replica objects~~',
'UI:AllowDeleteAllTabTitle' => 'Allow delete of objects linked to Synchro Replica~~',
'UI:AllowDeleteAllPageTitle' => 'Allow delete of objects linked to Synchro Replica~~',
'UI:DenyDeleteAllTabTitle' => 'Deny delete of objects linked to Synchro Replica~~',
'UI:DenyDeleteAllPageTitle' => 'Deny delete of objects linked to Synchro Replica~~',
'Class:appUserPreferences' => 'Предпочтения пользователя',
'Class:appUserPreferences/Attribute:userid' => 'Пользователь',
'Class:appUserPreferences/Attribute:preferences' => 'Предпочтения',

View File

@@ -993,39 +993,6 @@ The hyperlink is displayed in the tooltip appearing on the “Lock” symbol of
'Class:SynchroReplica/Attribute:status_last_warning' => 'Upozornenia',
'Class:SynchroReplica/Attribute:info_creation_date' => 'Dátum vytvorenia',
'Class:SynchroReplica/Attribute:info_last_modified' => 'Dátum poslednej úpravy',
'Class:SynchroReplica/Action:delete+' => 'delete replica~~',
'Class:SynchroReplica/Action:unlink' => 'Unlink~~',
'Class:SynchroReplica/Action:unlink+' => 'Unlink replica with destination object~~',
'Class:SynchroReplica/Action:unlinksynchro' => 'Unlink & Synchro~~',
'Class:SynchroReplica/Action:unlinksynchro+' => 'Unlink replica with destination object and execute synchronization with this replica~~',
'Class:SynchroReplica/Action:synchro' => 'Synchro~~',
'Class:SynchroReplica/Action:synchro+' => 'Execute synchronization with this replica~~',
'Class:SynchroReplica/Action:allowdelete' => 'Allow delete of object linked to this synchro replica~~',
'Class:SynchroReplica/Action:allowdelete+' => 'Object linked to a deleted replica is deleted~~',
'Class:SynchroReplica/Action:denydelete' => 'Deny delete of object linked to this synchro replica~~',
'Class:SynchroReplica/Action:denydelete+' => 'Object linked to a deleted replica is not deleted~~',
'Class:SynchroReplica/Action:unlink_all' => 'Unlink Synchro Replica objects~~',
'Class:SynchroReplica/Action:unlink_all+' => 'Unlink replica with destination object~~',
'Class:SynchroReplica/Action:unlinksynchro_all' => 'Unlink & Synchronize Synchro Replica objects~~',
'Class:SynchroReplica/Action:unlinksynchro_all+' => 'Unlink replica with destination object and execute synchronization with this replica~~',
'Class:SynchroReplica/Action:synchro_all' => 'Synchronize Synchro Replica objects~~',
'Class:SynchroReplica/Action:synchro_all+' => 'Execute synchronization with this replica~~',
'Class:SynchroReplica/Action:allowdelete_all' => 'Allow delete of objects linked to Synchro Replica~~',
'Class:SynchroReplica/Action:allowdelete_all+' => 'Object linked to a deleted replica is deleted~~',
'Class:SynchroReplica/Action:denydelete_all' => 'Deny delete of objects linked to Synchro Replica~~',
'Class:SynchroReplica/Action:denydelete_all+' => 'Object linked to a deleted replica is not deleted~~',
'UI:UnlinkAllTabTitle' => 'Unlink Synchro Replica objects~~',
'UI:UnlinkAllPageTitle' => 'Unlink Synchro Replica objects~~',
'UI:UnlinkSynchroAllTabTitle' => 'Unlink & Synchronize Synchro Replica objects~~',
'UI:UnlinkSynchroAllPageTitle' => ' Unlink & Synchronize Synchro Replica objects~~',
'UI:SynchroAllTabTitle' => 'Synchronize Synchro Replica objects~~',
'UI:SynchroAllPageTitle' => 'Synchronize Synchro Replica objects~~',
'UI:AllowDeleteAllTabTitle' => 'Allow delete of objects linked to Synchro Replica~~',
'UI:AllowDeleteAllPageTitle' => 'Allow delete of objects linked to Synchro Replica~~',
'UI:DenyDeleteAllTabTitle' => 'Deny delete of objects linked to Synchro Replica~~',
'UI:DenyDeleteAllPageTitle' => 'Deny delete of objects linked to Synchro Replica~~',
'Class:appUserPreferences' => 'Užívateľské preferencie',
'Class:appUserPreferences/Attribute:userid' => 'Užívateľ',
'Class:appUserPreferences/Attribute:preferences' => 'Preferencie',

View File

@@ -975,39 +975,6 @@ Dict::Add('TR TR', 'Turkish', 'Türkçe', [
'Class:SynchroReplica/Attribute:status_last_warning' => 'Uyarılar',
'Class:SynchroReplica/Attribute:info_creation_date' => 'Yaratılış Tarihi',
'Class:SynchroReplica/Attribute:info_last_modified' => 'Son değiştirilme tarih',
'Class:SynchroReplica/Action:delete+' => 'delete replica~~',
'Class:SynchroReplica/Action:unlink' => 'Unlink~~',
'Class:SynchroReplica/Action:unlink+' => 'Unlink replica with destination object~~',
'Class:SynchroReplica/Action:unlinksynchro' => 'Unlink & Synchro~~',
'Class:SynchroReplica/Action:unlinksynchro+' => 'Unlink replica with destination object and execute synchronization with this replica~~',
'Class:SynchroReplica/Action:synchro' => 'Synchro~~',
'Class:SynchroReplica/Action:synchro+' => 'Execute synchronization with this replica~~',
'Class:SynchroReplica/Action:allowdelete' => 'Allow delete of object linked to this synchro replica~~',
'Class:SynchroReplica/Action:allowdelete+' => 'Object linked to a deleted replica is deleted~~',
'Class:SynchroReplica/Action:denydelete' => 'Deny delete of object linked to this synchro replica~~',
'Class:SynchroReplica/Action:denydelete+' => 'Object linked to a deleted replica is not deleted~~',
'Class:SynchroReplica/Action:unlink_all' => 'Unlink Synchro Replica objects~~',
'Class:SynchroReplica/Action:unlink_all+' => 'Unlink replica with destination object~~',
'Class:SynchroReplica/Action:unlinksynchro_all' => 'Unlink & Synchronize Synchro Replica objects~~',
'Class:SynchroReplica/Action:unlinksynchro_all+' => 'Unlink replica with destination object and execute synchronization with this replica~~',
'Class:SynchroReplica/Action:synchro_all' => 'Synchronize Synchro Replica objects~~',
'Class:SynchroReplica/Action:synchro_all+' => 'Execute synchronization with this replica~~',
'Class:SynchroReplica/Action:allowdelete_all' => 'Allow delete of objects linked to Synchro Replica~~',
'Class:SynchroReplica/Action:allowdelete_all+' => 'Object linked to a deleted replica is deleted~~',
'Class:SynchroReplica/Action:denydelete_all' => 'Deny delete of objects linked to Synchro Replica~~',
'Class:SynchroReplica/Action:denydelete_all+' => 'Object linked to a deleted replica is not deleted~~',
'UI:UnlinkAllTabTitle' => 'Unlink Synchro Replica objects~~',
'UI:UnlinkAllPageTitle' => 'Unlink Synchro Replica objects~~',
'UI:UnlinkSynchroAllTabTitle' => 'Unlink & Synchronize Synchro Replica objects~~',
'UI:UnlinkSynchroAllPageTitle' => ' Unlink & Synchronize Synchro Replica objects~~',
'UI:SynchroAllTabTitle' => 'Synchronize Synchro Replica objects~~',
'UI:SynchroAllPageTitle' => 'Synchronize Synchro Replica objects~~',
'UI:AllowDeleteAllTabTitle' => 'Allow delete of objects linked to Synchro Replica~~',
'UI:AllowDeleteAllPageTitle' => 'Allow delete of objects linked to Synchro Replica~~',
'UI:DenyDeleteAllTabTitle' => 'Deny delete of objects linked to Synchro Replica~~',
'UI:DenyDeleteAllPageTitle' => 'Deny delete of objects linked to Synchro Replica~~',
'Class:appUserPreferences' => 'Kullanıcı Tercihleri',
'Class:appUserPreferences/Attribute:userid' => 'Kullanıcı',
'Class:appUserPreferences/Attribute:preferences' => 'Tercihler',

View File

@@ -1012,40 +1012,6 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', [
'Class:SynchroReplica/Attribute:status_last_warning' => '告警',
'Class:SynchroReplica/Attribute:info_creation_date' => '创建日期',
'Class:SynchroReplica/Attribute:info_last_modified' => '最后修改日期',
'Class:SynchroReplica/Action:delete+' => 'delete replica~~',
'Class:SynchroReplica/Action:unlink' => 'Unlink~~',
'Class:SynchroReplica/Action:unlink+' => 'Unlink replica with destination object~~',
'Class:SynchroReplica/Action:unlinksynchro' => 'Unlink & Synchro~~',
'Class:SynchroReplica/Action:unlinksynchro+' => 'Unlink replica with destination object and execute synchronization with this replica~~',
'Class:SynchroReplica/Action:synchro' => 'Synchro~~',
'Class:SynchroReplica/Action:synchro+' => 'Execute synchronization with this replica~~',
'Class:SynchroReplica/Action:allowdelete' => 'Allow delete of object linked to this synchro replica~~',
'Class:SynchroReplica/Action:allowdelete+' => 'Object linked to a deleted replica is deleted~~',
'Class:SynchroReplica/Action:denydelete' => 'Deny delete of object linked to this synchro replica~~',
'Class:SynchroReplica/Action:denydelete+' => 'Object linked to a deleted replica is not deleted~~',
'Class:SynchroReplica/Action:unlink_all' => 'Unlink Synchro Replica objects~~',
'Class:SynchroReplica/Action:unlink_all+' => 'Unlink replica with destination object~~',
'Class:SynchroReplica/Action:unlinksynchro_all' => 'Unlink & Synchronize Synchro Replica objects~~',
'Class:SynchroReplica/Action:unlinksynchro_all+' => 'Unlink replica with destination object and execute synchronization with this replica~~',
'Class:SynchroReplica/Action:synchro_all' => 'Synchronize Synchro Replica objects~~',
'Class:SynchroReplica/Action:synchro_all+' => 'Execute synchronization with this replica~~',
'Class:SynchroReplica/Action:allowdelete_all' => 'Allow delete of objects linked to Synchro Replica~~',
'Class:SynchroReplica/Action:allowdelete_all+' => 'Object linked to a deleted replica is deleted~~',
'Class:SynchroReplica/Action:denydelete_all' => 'Deny delete of objects linked to Synchro Replica~~',
'Class:SynchroReplica/Action:denydelete_all+' => 'Object linked to a deleted replica is not deleted~~',
'UI:UnlinkAllTabTitle' => 'Unlink Synchro Replica objects~~',
'UI:UnlinkAllPageTitle' => 'Unlink Synchro Replica objects~~',
'UI:UnlinkSynchroAllTabTitle' => 'Unlink & Synchronize Synchro Replica objects~~',
'UI:UnlinkSynchroAllPageTitle' => ' Unlink & Synchronize Synchro Replica objects~~',
'UI:SynchroAllTabTitle' => 'Synchronize Synchro Replica objects~~',
'UI:SynchroAllPageTitle' => 'Synchronize Synchro Replica objects~~',
'UI:AllowDeleteAllTabTitle' => 'Allow delete of objects linked to Synchro Replica~~',
'UI:AllowDeleteAllPageTitle' => 'Allow delete of objects linked to Synchro Replica~~',
'UI:DenyDeleteAllTabTitle' => 'Deny delete of objects linked to Synchro Replica~~',
'UI:DenyDeleteAllPageTitle' => 'Deny delete of objects linked to Synchro Replica~~',
'Class:appUserPreferences' => '用户偏好',
'Class:appUserPreferences/Attribute:userid' => '用户',
'Class:appUserPreferences/Attribute:preferences' => '首选项',

View File

@@ -14,10 +14,7 @@ if (PHP_VERSION_ID < 50600) {
echo $err;
}
}
trigger_error(
$err,
E_USER_ERROR
);
throw new RuntimeException($err);
}
require_once __DIR__ . '/composer/autoload_real.php';

View File

@@ -349,7 +349,6 @@ return array(
'Combodo\\iTop\\Controller\\Base\\Layout\\ObjectController' => $baseDir . '/sources/Controller/Base/Layout/ObjectController.php',
'Combodo\\iTop\\Controller\\Base\\Layout\\OqlController' => $baseDir . '/sources/Controller/Base/Layout/OqlController.php',
'Combodo\\iTop\\Controller\\Links\\LinkSetController' => $baseDir . '/sources/Controller/Links/LinkSetController.php',
'Combodo\\iTop\\Controller\\Links\\SynchroReplicaController' => $baseDir . '/sources/Controller/Links/SynchroReplicaController.php',
'Combodo\\iTop\\Controller\\Newsroom\\iTopNewsroomController' => $baseDir . '/sources/Controller/Newsroom/iTopNewsroomController.php',
'Combodo\\iTop\\Controller\\Notifications\\ActionController' => $baseDir . '/sources/Controller/Notifications/ActionController.php',
'Combodo\\iTop\\Controller\\Notifications\\NotificationsCenterController' => $baseDir . '/sources/Controller/Notifications/NotificationsCenterController.php',
@@ -3901,7 +3900,6 @@ return array(
'Twig\\Util\\DeprecationCollector' => $vendorDir . '/twig/twig/src/Util/DeprecationCollector.php',
'Twig\\Util\\ReflectionCallable' => $vendorDir . '/twig/twig/src/Util/ReflectionCallable.php',
'Twig\\Util\\TemplateDirIterator' => $vendorDir . '/twig/twig/src/Util/TemplateDirIterator.php',
'UI' => $baseDir . '/sources/Controller/UI.php',
'UIExtKeyWidget' => $baseDir . '/application/ui.extkeywidget.class.inc.php',
'UIHTMLEditorWidget' => $baseDir . '/application/ui.htmleditorwidget.class.inc.php',
'UILinksWidget' => $baseDir . '/application/ui.linkswidget.class.inc.php',

View File

@@ -750,7 +750,6 @@ class ComposerStaticInitfc0e9e9dea11dcbb6272414776c30685
'Combodo\\iTop\\Controller\\Base\\Layout\\ObjectController' => __DIR__ . '/../..' . '/sources/Controller/Base/Layout/ObjectController.php',
'Combodo\\iTop\\Controller\\Base\\Layout\\OqlController' => __DIR__ . '/../..' . '/sources/Controller/Base/Layout/OqlController.php',
'Combodo\\iTop\\Controller\\Links\\LinkSetController' => __DIR__ . '/../..' . '/sources/Controller/Links/LinkSetController.php',
'Combodo\\iTop\\Controller\\Links\\SynchroReplicaController' => __DIR__ . '/../..' . '/sources/Controller/Links/SynchroReplicaController.php',
'Combodo\\iTop\\Controller\\Newsroom\\iTopNewsroomController' => __DIR__ . '/../..' . '/sources/Controller/Newsroom/iTopNewsroomController.php',
'Combodo\\iTop\\Controller\\Notifications\\ActionController' => __DIR__ . '/../..' . '/sources/Controller/Notifications/ActionController.php',
'Combodo\\iTop\\Controller\\Notifications\\NotificationsCenterController' => __DIR__ . '/../..' . '/sources/Controller/Notifications/NotificationsCenterController.php',
@@ -4302,7 +4301,6 @@ class ComposerStaticInitfc0e9e9dea11dcbb6272414776c30685
'Twig\\Util\\DeprecationCollector' => __DIR__ . '/..' . '/twig/twig/src/Util/DeprecationCollector.php',
'Twig\\Util\\ReflectionCallable' => __DIR__ . '/..' . '/twig/twig/src/Util/ReflectionCallable.php',
'Twig\\Util\\TemplateDirIterator' => __DIR__ . '/..' . '/twig/twig/src/Util/TemplateDirIterator.php',
'UI' => __DIR__ . '/../..' . '/sources/Controller/UI.php',
'UIExtKeyWidget' => __DIR__ . '/../..' . '/application/ui.extkeywidget.class.inc.php',
'UIHTMLEditorWidget' => __DIR__ . '/../..' . '/application/ui.htmleditorwidget.class.inc.php',
'UILinksWidget' => __DIR__ . '/../..' . '/application/ui.linkswidget.class.inc.php',

View File

@@ -36,8 +36,7 @@ if ($issues) {
echo 'Composer detected issues in your platform:' . PHP_EOL.PHP_EOL . str_replace('You are running '.PHP_VERSION.'.', '', implode(PHP_EOL, $issues)) . PHP_EOL.PHP_EOL;
}
}
trigger_error(
'Composer detected issues in your platform: ' . implode(' ', $issues),
E_USER_ERROR
throw new \RuntimeException(
'Composer detected issues in your platform: ' . implode(' ', $issues)
);
}

View File

@@ -10,6 +10,7 @@ use Combodo\iTop\Application\Helper\Session;
use Combodo\iTop\Application\TwigBase\Twig\TwigHelper;
use Combodo\iTop\Application\UI\Base\Component\Button\ButtonUIBlockFactory;
use Combodo\iTop\Application\UI\Base\Component\DataTable\DataTableUIBlockFactory;
use Combodo\iTop\Application\UI\Base\Component\Form\Form;
use Combodo\iTop\Application\UI\Base\Component\GlobalSearch\GlobalSearchHelper;
use Combodo\iTop\Application\UI\Base\Component\Input\InputUIBlockFactory;
use Combodo\iTop\Application\UI\Base\Component\Panel\PanelUIBlockFactory;
@@ -23,7 +24,6 @@ use Combodo\iTop\Application\WebPage\iTopWebPage;
use Combodo\iTop\Application\WebPage\WebPage;
use Combodo\iTop\Application\WelcomePopup\WelcomePopupService;
use Combodo\iTop\Controller\Base\Layout\ObjectController;
use Combodo\iTop\Controller\Links\SynchroReplicaController;
use Combodo\iTop\Controller\WelcomePopupController;
use Combodo\iTop\Service\Router\Router;
@@ -585,23 +585,6 @@ try {
UI::OperationFormForModifyAll($oP, $oAppContext);
break;
case 'form_for_unlink_all': // Form to modify multiple objects (bulk modify)
SynchroReplicaController::OperationUnlinkAll($oP, $oAppContext,'unlink');
break;
case 'form_for_unlinksynchro_all': // Form to modify multiple objects (bulk modify)
SynchroReplicaController::OperationUnlinkAll($oP, $oAppContext,'unlinksynchro');
break;
case 'form_for_synchro_all': // Form to modify multiple objects (bulk modify)
SynchroReplicaController::OperationUnlinkAll($oP, $oAppContext,'synchro');
break;
case 'form_for_allowdelete_all': // Form to modify multiple objects (bulk modify)
SynchroReplicaController::OperationUnlinkAll($oP, $oAppContext,'allowdelete');
break;
case 'form_for_denydelete_all': // Form to modify multiple objects (bulk modify)
SynchroReplicaController::OperationUnlinkAll($oP, $oAppContext,'denydelete');
break;
///////////////////////////////////////////////////////////////////////////////////////////
case 'preview_or_modify_all': // Preview or apply bulk modify
@@ -644,7 +627,7 @@ try {
'title' => Dict::S('UI:BulkDeleteTitle'),
];
$oChecker = new ActionChecker($oFilter, UR_ACTION_BULK_DELETE);
UI::DisplayMultipleSelectionForm($oP, $oFilter, 'bulk_delete', $oChecker, [], $aDisplayParams);
DisplayMultipleSelectionForm($oP, $oFilter, 'bulk_delete', $oChecker, [], $aDisplayParams);
break;
///////////////////////////////////////////////////////////////////////////////////////////
@@ -1355,3 +1338,99 @@ try {
IssueLog::Debug('UI.php operation='.$sOperationToLog.', error='.$e->getMessage()."\n".$sErrorStackTrace, LogChannels::CONSOLE);
}
class UI
{
/**
* Operation select_for_modify_all
*
* @param iTopWebPage $oP
*
* @throws \ApplicationException
* @throws \ArchivedObjectException
* @throws \CoreException
* @throws \OQLException
*/
public static function OperationSelectForModifyAll(iTopWebPage $oP): void
{
$oP->DisableBreadCrumb();
$oP->set_title(Dict::S('UI:ModifyAllPageTitle'));
$sFilter = utils::ReadParam('filter', '', false, utils::ENUM_SANITIZATION_FILTER_RAW_DATA);
if (empty($sFilter)) {
throw new ApplicationException(Dict::Format('UI:Error:1ParametersMissing', 'filter'));
}
$oFilter = DBObjectSearch::unserialize($sFilter); //TODO : check that the filter is valid
// Add user filter
$oFilter->UpdateContextFromUser();
$oChecker = new ActionChecker($oFilter, UR_ACTION_BULK_MODIFY);
$sClass = $oFilter->GetClass();
$sClassName = MetaModel::GetName($sClass);
$aDisplayParams = [
'icon' => MetaModel::GetClassIcon($sClass, false),
'title' => Dict::Format('UI:Modify_ObjectsOf_Class', $sClassName),
];
DisplayMultipleSelectionForm($oP, $oFilter, 'form_for_modify_all', $oChecker, [], $aDisplayParams);
}
/**
* Operation form_for_modify_all
*
* @param iTopWebPage $oP
* @param \ApplicationContext $oAppContext
*
* @throws \ArchivedObjectException
* @throws \CoreException
* @throws \CoreUnexpectedValue
* @throws \MySQLException
* @throws \OQLException
*/
public static function OperationFormForModifyAll(iTopWebPage $oP, ApplicationContext $oAppContext): void
{
$oP->DisableBreadCrumb();
$sFilter = utils::ReadParam('filter', '', false, utils::ENUM_SANITIZATION_FILTER_RAW_DATA);
$sClass = utils::ReadParam('class', '', false, utils::ENUM_SANITIZATION_FILTER_CLASS);
$oFullSetFilter = DBObjectSearch::unserialize($sFilter);
// Add user filter
$oFullSetFilter->UpdateContextFromUser();
$aSelectedObj = utils::ReadMultipleSelection($oFullSetFilter);
$sCancelUrl = "./UI.php?operation=search&filter=".urlencode($sFilter).$oAppContext->GetForLink(true);
$aContext = ['filter' => utils::EscapeHtml($sFilter)];
cmdbAbstractObject::DisplayBulkModifyForm($oP, $sClass, $aSelectedObj, 'preview_or_modify_all', $sCancelUrl, [], $aContext);
}
/**
* Operation preview_or_modify_all
*
* @param iTopWebPage $oP
* @param \ApplicationContext $oAppContext
*
* @throws \ApplicationException
* @throws \ArchivedObjectException
* @throws \CoreCannotSaveObjectException
* @throws \CoreException
* @throws \DictExceptionMissingString
* @throws \OQLException
*/
public static function OperationPreviewOrModifyAll(iTopWebPage $oP, ApplicationContext $oAppContext): void
{
$oP->DisableBreadCrumb();
$sFilter = utils::ReadParam('filter', '', false, 'raw_data');
$oFilter = DBObjectSearch::unserialize($sFilter); // TO DO : check that the filter is valid
// Add user filter
$oFilter->UpdateContextFromUser();
$sClass = utils::ReadParam('class', '', false, 'class');
$bPreview = utils::ReadParam('preview_mode', '');
$sSelectedObj = utils::ReadParam('selectObj', '', false, 'raw_data');
if (empty($sClass) || empty($sSelectedObj)) { // TO DO: check that the class name is valid !
throw new ApplicationException(Dict::Format('UI:Error:2ParametersMissing', 'class', 'selectObj'));
}
$aSelectedObj = explode(',', $sSelectedObj);
$sCancelUrl = "./UI.php?operation=search&filter=".urlencode($sFilter).$oAppContext->GetForLink(true);
$aContext = [
'filter' => utils::EscapeHtml($sFilter),
'selectObj' => $sSelectedObj,
];
cmdbAbstractObject::DoBulkModify($oP, $sClass, $aSelectedObj, 'preview_or_modify_all', $bPreview, $sCancelUrl, $aContext);
}
}

View File

@@ -1,138 +0,0 @@
<?php
namespace Combodo\iTop\Controller\Links;
use ApplicationContext;
use ApplicationException;
use Combodo\iTop\Application\TwigBase\Controller\Controller;
use Combodo\iTop\Application\UI\Base\Component\Button\ButtonUIBlockFactory;
use Combodo\iTop\Application\UI\Base\Component\DataTable\DataTableUIBlockFactory;
use Combodo\iTop\Application\UI\Base\Component\Panel\PanelUIBlockFactory;
use DBObjectSearch;
use Dict;
use Exception;
use iTopWebPage;
use MetaModel;
use utils;
class SynchroReplicaController extends Controller
{
public const ROUTE_NAMESPACE = 'synchroreplica';
public function __construct($sViewPath = '', $sModuleName = 'core', $aAdditionalPaths = [])
{
$sViewPath = APPROOT.'synchro';
parent::__construct($sViewPath, $sModuleName, $aAdditionalPaths);
// Previously in index.php
$this->DisableInDemoMode();
$this->AllowOnlyAdmin();
$this->CheckAccess();
}
public static function OperationUnlinkAll(iTopWebPage $oP, ApplicationContext $oAppContext, $sOperation = 'unlink'): void
{
$oP->DisableBreadCrumb();
$sClass = utils::ReadParam('class', '', false, 'class');
$sFilter = utils::ReadPostedParam('filter', '', 'raw_data');
$oFullSetFilter = DBObjectSearch::unserialize($sFilter);
// Add user filter
$oFullSetFilter->UpdateContextFromUser();
$aSelectObject = utils::ReadMultipleSelection($oFullSetFilter);
if ( empty($sClass) || empty($aSelectObject)) // TO DO: check that the class name is valid !
{
throw new ApplicationException(Dict::Format('UI:Error:2ParametersMissing', 'class', 'selectObject[]'));
}
$sCancelUrl = "./UI.php?operation=search&filter=".urlencode($sFilter)."&".$oAppContext->GetForLink();
$aContext = array(
'filter' => utils::EscapeHtml($sFilter),
'selectObj' => $aSelectObject,
);
$aHeaders = array(
'object' => array('label' => MetaModel::GetName($sClass), 'description' => Dict::S('UI:ModifiedObject')),
'status' => array(
'label' => Dict::S('UI:BulkModifyStatus'),
'description' => Dict::S('UI:BulkModifyStatus+'),
),
'errors' => array(
'label' => Dict::S('UI:BulkModifyErrors'),
'description' => Dict::S('UI:BulkModifyErrors+'),
),
);
$aRows = array();
$sHeaderTitle = Dict::Format('UI:Modify_N_ObjectsOf_Class', count($aSelectObject), MetaModel::GetName($sClass));
$sClassIcon = MetaModel::GetClassIcon($sClass, false);
// Not in preview mode, do the update for real
$sTransactionId = utils::ReadPostedParam('transaction_id', '', 'transaction_id');
if (!utils::IsTransactionValid($sTransactionId, false)) {
throw new Exception(Dict::S('UI:Error:ObjectAlreadyUpdated'));
}
utils::RemoveTransaction($sTransactionId);
// Avoid too many events
$iPreviousTimeLimit = ini_get('max_execution_time');
$iLoopTimeLimit = MetaModel::GetConfig()->Get('max_execution_time_per_loop');
$aErrors = [];
foreach ($aSelectObject as $iId) {
set_time_limit(intval($iLoopTimeLimit));
/** @var \cmdbAbstractObject $oObj */
$oReplica = MetaModel::GetObject('SynchroReplica', $iId);
$bResult = true;
try {
if (in_array($sOperation, ['unlink', 'unlinksynchro'])) {
$oReplica->UnLink();
}
if (in_array($sOperation, ['synchro', 'unlinksynchro'])) {
$oStatLog = $oReplica->ReSynchro();
$aErrors = $oStatLog->GetTraces();
}
if ($sOperation == 'allowdelete') {
$oReplica->Set('status_dest_creator', 1);
$oReplica->DBUpdate();
}
if ($sOperation == 'denydelete') {
$oReplica->Set('status_dest_creator', 0);
$oReplica->DBUpdate();
}
}
catch (Exception $e) {
$bResult = false;
$aErrors[] = $e->getMessage();
}
catch (Error $e) {
$bResult = false;
$aErrors[] = $e->getMessage();
}
$sStatus = $bResult ? Dict::S('UI:BulkModifyStatusModified') : Dict::S('UI:BulkModifyStatusSkipped');
$aErrorsToDisplay = array_map(function ($sError) {
return utils::HtmlEntities($sError);
}, $aErrors);
$aRows[] = array(
'object' => $oReplica->GetHyperlink(),
'status' => $sStatus,
'errors' => '<p>'.($bResult ? '' : implode('</p><p>', $aErrorsToDisplay)).'</p>',
);
}
set_time_limit(intval($iPreviousTimeLimit));
$oTable = DataTableUIBlockFactory::MakeForForm('BulkModify', $aHeaders, $aRows);
$oTable->AddOption("bFullscreen", true);
$oPanel = PanelUIBlockFactory::MakeForClass($sClass, '');
$oPanel->SetIcon($sClassIcon);
$oPanel->SetTitle($sHeaderTitle);
$oPanel->AddCSSClass('ibo-datatable-panel');
$oPanel->AddSubBlock($oTable);
$oP->AddUiBlock($oPanel);
$oP->AddSubBlock(ButtonUIBlockFactory::MakeForSecondaryAction(Dict::S('UI:Button:Done')))->SetOnClickJsCode("window.location.href='$sCancelUrl'")->AddCSSClass('mt-5');
}
}

View File

@@ -1,166 +0,0 @@
<?php
use Combodo\iTop\Application\UI\Base\Component\Button\ButtonUIBlockFactory;
use Combodo\iTop\Application\UI\Base\Component\Form\Form;
use Combodo\iTop\Application\UI\Base\Component\Input\InputUIBlockFactory;
use Combodo\iTop\Application\UI\Base\Component\Toolbar\ToolbarUIBlockFactory;
use Combodo\iTop\Application\WebPage\iTopWebPage;
use Combodo\iTop\Application\WebPage\WebPage;
class UI
{
/**
* Operation select_for_modify_all
*
* @param iTopWebPage $oP
*
* @throws \ApplicationException
* @throws \ArchivedObjectException
* @throws \CoreException
* @throws \OQLException
*/
public static function OperationSelectForModifyAll(iTopWebPage $oP, $sTitleTab = 'UI:ModifyAllPageTitle', $sTitleCode = 'UI:Modify_ObjectsOf_Class', $sNextOperation = 'form_for_modify_all'): void
{
$oP->DisableBreadCrumb();
$oP->set_title(Dict::S($sTitleTab));
$sFilter = utils::ReadParam('filter', '', false, utils::ENUM_SANITIZATION_FILTER_RAW_DATA);
if (empty($sFilter)) {
throw new ApplicationException(Dict::Format('UI:Error:1ParametersMissing', 'filter'));
}
$oFilter = DBObjectSearch::unserialize($sFilter); //TODO : check that the filter is valid
// Add user filter
$oFilter->UpdateContextFromUser();
$oChecker = new ActionChecker($oFilter, UR_ACTION_BULK_MODIFY);
$sClass = $oFilter->GetClass();
$sClassName = MetaModel::GetName($sClass);
$aDisplayParams = [
'icon' => MetaModel::GetClassIcon($sClass, false),
'title' => Dict::Format($sTitleCode, $sClassName),
];
self::DisplayMultipleSelectionForm($oP, $oFilter, $sNextOperation, $oChecker, [], $aDisplayParams);
}
/**
* Operation form_for_modify_all
*
* @param iTopWebPage $oP
* @param \ApplicationContext $oAppContext
*
* @throws \ArchivedObjectException
* @throws \CoreException
* @throws \CoreUnexpectedValue
* @throws \MySQLException
* @throws \OQLException
*/
public static function OperationFormForModifyAll(iTopWebPage $oP, ApplicationContext $oAppContext): void
{
$oP->DisableBreadCrumb();
$sFilter = utils::ReadParam('filter', '', false, utils::ENUM_SANITIZATION_FILTER_RAW_DATA);
$sClass = utils::ReadParam('class', '', false, utils::ENUM_SANITIZATION_FILTER_CLASS);
$oFullSetFilter = DBObjectSearch::unserialize($sFilter);
// Add user filter
$oFullSetFilter->UpdateContextFromUser();
$aSelectedObj = utils::ReadMultipleSelection($oFullSetFilter);
$sCancelUrl = utils::GetAbsoluteUrlAppRoot().'pages/UI.php?operation=search&filter=' . urlencode($sFilter) . '&' . $oAppContext->GetForLink();
$aContext = array('filter' => utils::EscapeHtml($sFilter));
cmdbAbstractObject::DisplayBulkModifyForm($oP, $sClass, $aSelectedObj, 'preview_or_modify_all', $sCancelUrl, array(), $aContext);
}
/**
* Operation preview_or_modify_all
*
* @param iTopWebPage $oP
* @param \ApplicationContext $oAppContext
*
* @throws \ApplicationException
* @throws \ArchivedObjectException
* @throws \CoreCannotSaveObjectException
* @throws \CoreException
* @throws \DictExceptionMissingString
* @throws \OQLException
*/
public static function OperationPreviewOrModifyAll(iTopWebPage $oP, ApplicationContext $oAppContext): void
{
$oP->DisableBreadCrumb();
$sFilter = utils::ReadParam('filter', '', false, 'raw_data');
$oFilter = DBObjectSearch::unserialize($sFilter); // TO DO : check that the filter is valid
// Add user filter
$oFilter->UpdateContextFromUser();
$sClass = utils::ReadParam('class', '', false, 'class');
$bPreview = utils::ReadParam('preview_mode', '');
$sSelectedObj = utils::ReadParam('selectObj', '', false, 'raw_data');
if (empty($sClass) || empty($sSelectedObj)) // TO DO: check that the class name is valid !
{
throw new ApplicationException(Dict::Format('UI:Error:2ParametersMissing', 'class', 'selectObj'));
}
$aSelectedObj = explode(',', $sSelectedObj);
$sCancelUrl = utils::GetAbsoluteUrlAppRoot().'pages/UI.php?operation=search&filter=' . urlencode($sFilter) . '&' . $oAppContext->GetForLink();
$aContext = array(
'filter' => utils::EscapeHtml($sFilter),
'selectObj' => $sSelectedObj,
);
cmdbAbstractObject::DoBulkModify($oP, $sClass, $aSelectedObj, 'preview_or_modify_all', $bPreview, $sCancelUrl, $aContext);
}/**
* Displays a form (checkboxes) to select the objects for which to apply a given action
* Only the objects for which the action is valid can be checked. By default all valid objects are checked
*
* @param WebPage $oP WebPage The page for output
* @param \DBSearch $oFilter DBSearch The filter that defines the list of objects
* @param string $sNextOperation string The next operation (code) to be executed when the form is submitted
* @param ActionChecker $oChecker ActionChecker The helper class/instance used to check for which object the action is valid
* @param array $aExtraFormParams
* @param array $aDisplayParams
*
* @throws \ApplicationException
* @throws \ArchivedObjectException
* @throws \CoreException
*@since 3.0.0 $aDisplayParams parameter
*
*/
public static function DisplayMultipleSelectionForm(WebPage $oP, DBSearch $oFilter, string $sNextOperation, ActionChecker $oChecker, array $aExtraFormParams = [], array $aDisplayParams = [])
{
$oAppContext = new ApplicationContext();
$iBulkActionAllowed = $oChecker->IsAllowed();
$aExtraParams = ['selection_type' => 'multiple', 'selection_mode' => true, 'display_limit' => false, 'menu' => false];
if ($iBulkActionAllowed == UR_ALLOWED_DEPENDS) {
$aExtraParams['selection_enabled'] = $oChecker->GetAllowedIDs();
} else {
if (UR_ALLOWED_NO) {
throw new ApplicationException(Dict::Format('UI:ActionNotAllowed'));
}
}
$oForm = new Form();
$oForm->SetAction( utils::GetAbsoluteUrlAppRoot().'pages/UI.php');
$oForm->AddSubBlock(InputUIBlockFactory::MakeForHidden('operation', $sNextOperation));
$oForm->AddSubBlock(InputUIBlockFactory::MakeForHidden('class', $oFilter->GetClass()));
$oForm->AddSubBlock(InputUIBlockFactory::MakeForHidden('filter', utils::HtmlEntities($oFilter->Serialize())));
$oForm->AddSubBlock(InputUIBlockFactory::MakeForHidden('transaction_id', utils::GetNewTransactionId()));
foreach ($aExtraFormParams as $sName => $sValue) {
$oForm->AddSubBlock(InputUIBlockFactory::MakeForHidden($sName, $sValue));
}
$oForm->AddSubBlock($oAppContext->GetForFormBlock());
$oDisplayBlock = new DisplayBlock($oFilter, 'list', false);
//by default all the elements are selected
$aExtraParams['selectionMode'] = 'negative';
if (array_key_exists('icon', $aDisplayParams) || array_key_exists('title', $aDisplayParams)) {
$aExtraParams['surround_with_panel'] = true;
if (array_key_exists('icon', $aDisplayParams)) {
$aExtraParams['panel_icon'] = $aDisplayParams['icon'];
}
if (array_key_exists('title', $aDisplayParams)) {
$aExtraParams['panel_title'] = $aDisplayParams['title'];
}
}
$oForm->AddSubBlock($oDisplayBlock->GetDisplay($oP, 1, $aExtraParams));
$oToolbarButtons = ToolbarUIBlockFactory::MakeStandard(null);
$oToolbarButtons->AddCSSClass('ibo-toolbar--button');
$oForm->AddSubBlock($oToolbarButtons);
$oToolbarButtons->AddSubBlock(ButtonUIBlockFactory::MakeForCancel(Dict::S('UI:Button:Cancel'), 'cancel')->SetOnClickJsCode('window.history.back()'));
$oToolbarButtons->AddSubBlock(ButtonUIBlockFactory::MakeForPrimaryAction(Dict::S('UI:Button:Next'), 'next', Dict::S('UI:Button:Next'), true));
$oP->AddUiBlock($oForm);
}
}

View File

@@ -114,8 +114,4 @@ class AttributeObjectKey extends AttributeDBFieldVoid
return (int)$proposedValue;
}
public function GetTargetClass($iType = EXTKEY_RELATIVE)
{
return '';
}
}

View File

@@ -18,10 +18,7 @@
* You should have received a copy of the GNU Affero General Public License
*/
use Combodo\iTop\Application\UI\Base\Component\Button\ButtonUIBlockFactory;
use Combodo\iTop\Application\UI\Base\Component\Title\TitleUIBlockFactory;
use Combodo\iTop\Application\WebPage\iTopWebPage;
use UI;
require_once('../approot.inc.php');
require_once(APPROOT.'/application/application.inc.php');
@@ -37,7 +34,6 @@ $oP = new iTopWebPage("iTop - Synchro Replicas");
// Main program
$sOperation = utils::ReadParam('operation', 'details');
try {
switch ($sOperation) {
case 'details':
@@ -50,21 +46,21 @@ try {
break;
case 'oql':
$iSourceId = utils::ReadParam('datasource', null);
if ($iSourceId != null) {
$oSource = MetaModel::GetObject('SynchroDataSource', $iSourceId);
$oBackButton = ButtonUIBlockFactory::MakeLinkNeutral( ApplicationContext::MakeObjectUrl('SynchroDataSource', $iSourceId), Dict::Format('Core:SynchroReplica:BackToDataSource', $oSource->GetName()), 'fas fa-chevron-left');
$oP->AddUiBlock($oBackButton);
$oP->AddUiBlock(TitleUIBlockFactory::MakeForPage(Dict::Format('Core:SynchroReplica:ListOfReplicas', $oSource->GetName())));
}
$sOQL = utils::ReadParam('oql', null, false, 'raw_data');
if ($sOQL == null) {
throw new ApplicationException(Dict::Format('UI:Error:1ParametersMissing', 'oql'));
}
$oFilter = DBObjectSearch::FromOQL($sOQL);
$oBlock1 = new DisplayBlock($oFilter, 'search', false, ['menu' => true, 'table_id' => '1']);
$oBlock1 = new DisplayBlock($oFilter, 'search', false, ['menu' => false, 'table_id' => '1']);
$oBlock1->Display($oP, 0);
$oP->add('<p class="page-header">'.MetaModel::GetClassIcon('SynchroReplica').Dict::S('Core:SynchroReplica:ListOfReplicas').'</p>');
$iSourceId = utils::ReadParam('datasource', null);
if ($iSourceId != null) {
$oSource = MetaModel::GetObject('SynchroDataSource', $iSourceId);
$oP->p(Dict::Format('Core:SynchroReplica:BackToDataSource', $oSource->GetHyperlink()).'</a>');
}
$oBlock = new DisplayBlock($oFilter, 'list', false, ['menu' => false]);
$oBlock->Display($oP, 1);
break;
case 'delete':
@@ -73,81 +69,6 @@ try {
$sDelete = utils::GetAbsoluteUrlAppRoot().'pages/UI.php?'.$_SERVER['QUERY_STRING'];
header("Location: $sDelete");
break;
case 'unlinksynchro':
$iId = utils::ReadParam('id', null);
if ($iId == null) {
throw new ApplicationException(Dict::Format('UI:Error:1ParametersMissing', 'id'));
}
$oReplica = MetaModel::GetObject('SynchroReplica', $iId);
$oReplica->UnLink();
$oStatLog = $oReplica->ReSynchro();
$oP->add(implode('<br>', $oStatLog->GetTraces()));
$oReplica->DisplayDetails($oP);
break;
case 'unlink':
$iId = utils::ReadParam('id', null);
if ($iId == null) {
throw new ApplicationException(Dict::Format('UI:Error:1ParametersMissing', 'id'));
}
$oReplica = MetaModel::GetObject('SynchroReplica', $iId);
$oReplica->UnLink();
$oReplica->DisplayDetails($oP);
break;
case 'synchro':
$iId = utils::ReadParam('id', null);
if ($iId == null) {
throw new ApplicationException(Dict::Format('UI:Error:1ParametersMissing', 'id'));
}
$oReplica = MetaModel::GetObject('SynchroReplica', $iId);
$oStatLog = $oReplica->ReSynchro();
$oReplica->DisplayDetails($oP);
break;
case 'allowdelete':
$iId = utils::ReadParam('id', null);
if ($iId == null) {
throw new ApplicationException(Dict::Format('UI:Error:1ParametersMissing', 'id'));
}
$oReplica = MetaModel::GetObject('SynchroReplica', $iId);
$oStatLog = $oReplica->Set('status_dest_creator',1);
$oReplica->DisplayDetails($oP);
break;
case 'denydelete': // Select the list of objects to be modified (bulk modify)
$iId = utils::ReadParam('id', null);
if ($iId == null) {
throw new ApplicationException(Dict::Format('UI:Error:1ParametersMissing', 'id'));
}
$oReplica = MetaModel::GetObject('SynchroReplica', $iId);
$oStatLog = $oReplica->Set('status_dest_creator', 0);
$oReplica->DisplayDetails($oP);
break;
case 'select_for_unlink_all': // Select the list of objects to be modified (bulk modify)
UI::OperationSelectForModifyAll($oP,'UI:UnlinkAllTabTitle', 'UI:UnlinkAllPageTitle', 'form_for_unlink_all');
break;
case 'select_for_unlinksynchro_all': // Select the list of objects to be modified (bulk modify)
UI::OperationSelectForModifyAll($oP,'UI:UnlinkSynchroAllTabTitle', 'UI:UnlinkSynchroAllPageTitle', 'form_for_unlinksynchro_all');
break;
case 'select_for_synchro_all': // Select the list of objects to be modified (bulk modify)
UI::OperationSelectForModifyAll($oP,'UI:SynchroAllTabTitle', 'UI:SynchroAllPageTitle','form_for_synchro_all');
break;
case 'select_for_allowdelete_all': // Select the list of objects to be modified (bulk modify)
UI::OperationSelectForModifyAll($oP,'UI:AllowDeleteAllTabTitle', 'UI:AllowDeleteAllPageTitle','form_for_allowdelete_all');
break;
case 'select_for_denydelete_all': // Select the list of objects to be modified (bulk modify)
UI::OperationSelectForModifyAll($oP,'UI:DenyDeleteAllTabTitle', 'UI:DenyDeleteAllPageTitle','form_for_denydelete_all');
break;
}
} catch (CoreException $e) {
$oP->p('<b>An error occured while running the query:</b>');

View File

@@ -6,12 +6,6 @@
*/
use Combodo\iTop\Application\WebPage\WebPage;
use Combodo\iTop\Application\UI\Base\Component\Button\ButtonUIBlockFactory;
use Combodo\iTop\Application\UI\Base\Component\PopoverMenu\PopoverMenu;
use Combodo\iTop\Application\UI\Base\Component\Title\TitleUIBlockFactory;
use Combodo\iTop\Application\UI\Base\Component\Toolbar\ToolbarUIBlockFactory;
use Combodo\iTop\Application\UI\Base\Layout\UIContentBlockUIBlockFactory;
use Combodo\iTop\Core\CMDBChange\CMDBChangeOrigin;
class SynchroDataSource extends cmdbAbstractObject
{
@@ -2114,12 +2108,6 @@ class SynchroReplica extends DBObject implements iDisplay
// MetaModel::Init_SetZListItems('advanced_search', array('name')); // Criteria of the advanced search form
}
public function InitExtendedData($oSource)
{
$sSQLTable = $oSource->GetDataTable();
$this->m_aExtendedData = $this->LoadExtendedDataFromTable($sSQLTable);
}
public function __construct($aRow = null, $sClassAlias = '', $aAttToLoad = null, $aExtendedDataSpec = null)
{
parent::__construct($aRow, $sClassAlias, $aAttToLoad, $aExtendedDataSpec);
@@ -2201,16 +2189,6 @@ class SynchroReplica extends DBObject implements iDisplay
$this->Set('status_last_error', $sText);
}
/*
* Disassociate the replica from the destination object and set the status to "new" to be synchronized with the next operation
*/
public function UnLink(){
$this->Set('dest_id', '');
$this->Set('dest_class', '');
$this->Set('status', 'new');
$this->DBWrite();
}
public function Synchro($oDataSource, $aReconciliationKeys, $aAttributes, $oChange, &$oStatLog)
{
$oStatLog->AddTrace(">>> Beginning of SynchroReplica::Synchro, replica status is '".$this->Get('status')."'.", $this);
@@ -2387,89 +2365,6 @@ class SynchroReplica extends DBObject implements iDisplay
$oStatLog->AddTrace('<<< End of SynchroReplica::Synchro.', $this);
}
/**
*
* @return \SynchroLog
* @throws \ArchivedObjectException
* @throws \CoreCannotSaveObjectException
* @throws \CoreException
* @throws \CoreUnexpectedValue
* @throws \CoreWarning
* @throws \MySQLException
* @throws \OQLException
* @throws \SynchroExceptionNotStarted
*/
public function ReSynchro(): SynchroLog
{
$oDataSource = MetaModel::GetObject('SynchroDataSource', $this->Get('sync_source_id'));
$oStatLog = new SynchroLog();
$oStatLog->Set('sync_source_id', $oDataSource->GetKey());
$oStatLog->Set('start_date', time());
$oStatLog->Set('status', 'running');
$oStatLog->AddTrace('Manual synchro');
// Get the list of SQL columns
$aAttCodesExpected = array();
$aAttCodesToReconcile = array();
$aAttCodesToUpdate = array();
$sSelectAtt = 'SELECT SynchroAttribute WHERE sync_source_id = :source_id AND (update = 1 OR reconcile = 1)';
$oSetAtt = new DBObjectSet(DBObjectSearch::FromOQL($sSelectAtt), array() /* order by*/, array('source_id' => $oDataSource->GetKey()) /* aArgs */);
while ($oSyncAtt = $oSetAtt->Fetch()) {
if ($oSyncAtt->Get('update')) {
$aAttCodesToUpdate[$oSyncAtt->Get('attcode')] = $oSyncAtt;
}
if ($oSyncAtt->Get('reconcile')) {
$aAttCodesToReconcile[$oSyncAtt->Get('attcode')] = $oSyncAtt;
}
$aAttCodesExpected[$oSyncAtt->Get('attcode')] = $oSyncAtt;
}
// Get the list of attributes, determine reconciliation keys and update targets
//
if ($oDataSource->Get('reconciliation_policy') == 'use_attributes') {
$aReconciliationKeys = $aAttCodesToReconcile;
} elseif ($oDataSource->Get('reconciliation_policy') == 'use_primary_key') {
// Override the settings made at the attribute level !
$aReconciliationKeys = array('primary_key' => null);
}
if (count($aAttCodesToUpdate) == 0) {
$oStatLog->AddTrace('No attribute to update');
throw new SynchroExceptionNotStarted('There is no attribute to update');
}
if (count($aReconciliationKeys) == 0) {
$oStatLog->AddTrace('No attribute for reconciliation');
throw new SynchroExceptionNotStarted('No attribute for reconciliation');
}
$aAttributesToUpdate = array();
foreach ($aAttCodesToUpdate as $sAttCode => $oSyncAtt) {
$oAttDef = MetaModel::GetAttributeDef($oDataSource->GetTargetClass(), $sAttCode);
if ($oAttDef->IsWritable()) {
$aAttributesToUpdate[$sAttCode] = $oSyncAtt;
}
}
// Create a change used for logging all the modifications/creations happening during the synchro
$oChange = MetaModel::NewObject('CMDBChange');
$oChange->Set('date', time());
$sUserString = CMDBChange::GetCurrentUserName();
$oChange->Set('userinfo', $sUserString.' '.Dict::S('Core:SyncDataExchangeComment'));
$oChange->Set('origin', CMDBChangeOrigin::SYNCHRO_DATA_SOURCE);
$oChange->DBInsert();
CMDBObject::SetCurrentChange($oChange);
$this->InitExtendedData($oDataSource);
$this->Synchro($oDataSource, $aReconciliationKeys, $aAttributesToUpdate, $oChange, $oStatLog);
$this->DBUpdate();
return $oStatLog;
}
/**
* Updates the destination object with the Extended data found in the synchro_data_XXXX table
*
@@ -2786,115 +2681,12 @@ class SynchroReplica extends DBObject implements iDisplay
public function DisplayDetails(WebPage $oPage, $bEditMode = false)
{
// Object's details
$this->DisplayBareHeader($oPage, $bEditMode);
//$this->DisplayBareHeader($oPage, $bEditMode);
$oPage->AddTabContainer(OBJECT_PROPERTIES_TAB);
$oPage->SetCurrentTabContainer(OBJECT_PROPERTIES_TAB);
$oPage->SetCurrentTab('UI:PropertiesTab');
$this->DisplayBareProperties($oPage, $bEditMode);
}
public function DisplayBareHeader(WebPage $oPage, $bEditMode = false)
{
$oBlock = UIContentBlockUIBlockFactory::MakeStandard('title-for-replica', ['ibo-page-header--replica-title']);
$oPage->AddSubBlock($oBlock);
$sId = $this->GetKey();
$oTitle = TitleUIBlockFactory::MakeNeutral(Dict::S('Class:SynchroReplica'));
$oBlock->AddSubBlock($oTitle);
$oActionsToolbar = ToolbarUIBlockFactory::MakeForButton(MenuBlock::ACTIONS_TOOLBAR_ID_PREFIX.$sId);
$oActionsToolbar->AddCSSClass('ibo-panel--toolbar');
$oBlock->AddSubBlock($oActionsToolbar);
$sClass = get_class($this);
$sRootUrl = utils::GetAbsoluteUrlAppRoot();
$sUIPage = cmdbAbstractObject::ComputeStandardUIPage($sClass);
$oAppContext = new ApplicationContext();
$sContext = $oAppContext->GetForLink();
if (utils::IsNotNullOrEmptyString($sContext)) {
$sContext = '&'.$sContext;
}
$aActions = [];
//Delete
if (UserRights::IsActionAllowed($sClass, UR_ACTION_DELETE)) {
$aActions['UI:Menu:Delete'] = array(
'label' => Dict::S('UI:Menu:Delete'),
'url' => "{$sRootUrl}pages/$sUIPage?operation=delete&class=$sClass&id=$sId{$sContext}",
'tooltip' => Dict::S('Class:SynchroReplica/Action:delete+'),
);
}
if (UserRights::IsActionAllowed($sClass, UR_ACTION_MODIFY)) {
if (count($aActions) > 0) {
$sSeparator = '<hr class="menu-separator"/>';
$aActions['sep_0'] = array('label' => $sSeparator, 'url' => '');
}
$sUrl = "{$sRootUrl}synchro/replica.php?operation=unlink&class=$sClass&id=$sId{$sContext}";
$aActions['Class:SynchroReplica/Action:unlink'] = [
'label' => Dict::S('Class:SynchroReplica/Action:unlink'),
'url' => $sUrl,
'tooltip' => Dict::S('Class:SynchroReplica/Action:unlink+'),
];
$sUrl = "{$sRootUrl}synchro/replica.php?operation=unlinksynchro&class=$sClass&id=$sId{$sContext}";
$aActions['Class:SynchroReplica/Action:unlinksynchro'] = [
'label' => Dict::S('Class:SynchroReplica/Action:unlinksynchro'),
'url' => $sUrl,
'tooltip' => Dict::S('Class:SynchroReplica/Action:unlinksynchro+'),
];
$sUrl = "{$sRootUrl}synchro/replica.php?operation=synchro&class=$sClass&id=$sId{$sContext}";
$aActions['Class:SynchroReplica/Action:synchro'] = [
'label' => Dict::S('Class:SynchroReplica/Action:synchro'),
'url' => $sUrl,
'tooltip' => Dict::S('Class:SynchroReplica/Action:synchro+'),
];
if ($this->Get('status_dest_creator') == 1) {
$sUrl = "{$sRootUrl}synchro/replica.php?operation=denydelete&class=$sClass&id=$sId{$sContext}";
$aActions['Class:SynchroReplica/Action:denydelete'] = [
'label' => Dict::S('Class:SynchroReplica/Action:denydelete'),
'url' => $sUrl,
'tooltip' => Dict::S('Class:SynchroReplica/Action:denydelete+'),
];
} else {
$sUrl = "{$sRootUrl}synchro/replica.php?operation=allowdelete&class=$sClass&id=$sId{$sContext}";
$aActions['Class:SynchroReplica/Action:allowdelete'] = [
'label' => Dict::S('Class:SynchroReplica/Action:allowdelete'),
'url' => $sUrl,
'tooltip' => Dict::S('Class:SynchroReplica/Action:allowdelete+'),
];
}
}
if (count($aActions) > 0) {
$sRegularActionsMenuTogglerId = "ibo-regular-actions-menu-toggler-{$sId}";
$sRegularActionsPopoverMenuId = "ibo-regular-actions-popover-{$sId}";
$oActionButton = ButtonUIBlockFactory::MakeIconAction('fas fa-ellipsis-v', Dict::S('UI:Menu:Actions'), 'UI:Menu:Actions', '', false, $sRegularActionsMenuTogglerId)
->AddCSSClasses(['ibo-action-button', 'ibo-regular-action-button']);
$oRegularActionsMenu = $oPage->GetPopoverMenu($sRegularActionsPopoverMenuId, $aActions)
->SetTogglerJSSelector("#$sRegularActionsMenuTogglerId")
->SetContainer(PopoverMenu::ENUM_CONTAINER_BODY);
$oActionsToolbar->AddSubBlock($oActionButton)
->AddSubBlock($oRegularActionsMenu);
$oActionButton = ButtonUIBlockFactory::MakeIconLink('fas fa-search', Dict::Format('UI:SearchFor_Class', MetaModel::GetName($sClass)), "{$sRootUrl}pages/UI.php?operation=search_form&do_search=0&class=$sClass{$sContext}", '', 'UI:SearchFor_Class');
$oActionButton->AddCSSClasses(['ibo-action-button', 'ibo-regular-action-button']);
$oActionsToolbar->AddSubBlock($oActionButton);
}
$sUrl = "{$sRootUrl}pages/$sUIPage?operation=display&class=$sClass&id=$sId{$sContext}";
$oActionButton = ButtonUIBlockFactory::MakeAlternativeNeutral('', 'UI:Button:Refresh');
$oActionButton->SetIconClass('fas fa-sync-alt')
->SetOnClickJsCode('window.location.href=\''.$sUrl.'\'')
->SetTooltip(Dict::S('UI:Button:Refresh'))
->AddCSSClasses(['ibo-action-button', 'ibo-regular-action-button']);
$oActionsToolbar->AddSubBlock($oActionButton);
return $oBlock;
}
public function DisplayBareProperties(WebPage $oPage, $bEditMode = false, $sPrefix = '', $aExtraParams = [])
{