diff --git a/application/cmdbabstract.class.inc.php b/application/cmdbabstract.class.inc.php index 8c0441e84c..9fdfc7714f 100644 --- a/application/cmdbabstract.class.inc.php +++ b/application/cmdbabstract.class.inc.php @@ -524,6 +524,12 @@ 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::class, 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' });"); + } } } diff --git a/application/displayblock.class.inc.php b/application/displayblock.class.inc.php index ca2fe6857a..26a8fe7a8d 100644 --- a/application/displayblock.class.inc.php +++ b/application/displayblock.class.inc.php @@ -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')); + $bIsBulkModifyAllowed = (!MetaModel::IsAbstract($sSelectedClass)) && UserRights::IsActionAllowed($sSelectedClass, UR_ACTION_BULK_MODIFY) && (($oReflectionClass->IsSubclassOf(cmdbAbstractObject::class) || $sSelectedClass === SynchroReplica::class)); $bIsBulkDeleteAllowed = (bool) UserRights::IsActionAllowed($sSelectedClass, UR_ACTION_BULK_DELETE); // Refine filter on selected class so bullk actions occur on the right class @@ -1958,7 +1958,15 @@ 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) { - $this->AddBulkModifyObjectsMenuAction($aRegularActions, $sSelectedClass, $oSelectedClassFilter->serialize(), 'UI:Menu:ModifyAll:'.$sSelectedAlias, Dict::Format('UI:Menu:ModifyAll_'.$sActionLabelCodeSuffix, $sSelectedClassName)); + if($sSelectedClass === SynchroReplica::class){ + $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)); + } } if ($bIsBulkDeleteAllowed) { $this->AddBulkDeleteObjectsMenuAction($aRegularActions, $sSelectedClass, $oSelectedClassFilter->serialize(), 'UI:Menu:BulkDelete:'.$sSelectedAlias, Dict::Format('UI:Menu:BulkDelete_'.$sActionLabelCodeSuffix, $sSelectedClassName)); @@ -2478,11 +2486,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'): void + protected function AddBulkModifyObjectsMenuAction(array &$aActions, string $sClass, string $sFilter, string $sActionIdentifier = 'UI:Menu:ModifyAll', $sActionLabel = 'UI:Menu:ModifyAll', $sOperationName = 'modify'): void { $aActions[$sActionIdentifier] = [ 'label' => Dict::S($sActionLabel), - 'url' => $this->PrepareUrlForStandardMenuAction($sClass, "operation=select_for_modify_all&class=$sClass&filter=".urlencode($sFilter)), + 'url' => $this->PrepareUrlForStandardMenuAction($sClass, 'operation=select_for_'.$sOperationName.'_all&class='.$sClass.'&filter='.urlencode($sFilter)), ] + $this->GetDefaultParamsForMenuAction(); } diff --git a/css/backoffice/pages/_data-synchro.scss b/css/backoffice/pages/_data-synchro.scss index 956329ce76..fb16024513 100644 --- a/css/backoffice/pages/_data-synchro.scss +++ b/css/backoffice/pages/_data-synchro.scss @@ -80,4 +80,14 @@ $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; + } } \ No newline at end of file diff --git a/dictionaries/cs.dictionary.itop.core.php b/dictionaries/cs.dictionary.itop.core.php index 32f49e460c..45898cc0d0 100755 --- a/dictionaries/cs.dictionary.itop.core.php +++ b/dictionaries/cs.dictionary.itop.core.php @@ -976,6 +976,39 @@ 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', diff --git a/dictionaries/da.dictionary.itop.core.php b/dictionaries/da.dictionary.itop.core.php index fef6af27c1..4f50299508 100644 --- a/dictionaries/da.dictionary.itop.core.php +++ b/dictionaries/da.dictionary.itop.core.php @@ -975,6 +975,39 @@ 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.', diff --git a/dictionaries/de.dictionary.itop.core.php b/dictionaries/de.dictionary.itop.core.php index dacc17ab66..8aa2fe4a51 100644 --- a/dictionaries/de.dictionary.itop.core.php +++ b/dictionaries/de.dictionary.itop.core.php @@ -972,6 +972,39 @@ 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', diff --git a/dictionaries/en.dictionary.itop.core.php b/dictionaries/en.dictionary.itop.core.php index 8b26efc141..2ab22beee6 100644 --- a/dictionaries/en.dictionary.itop.core.php +++ b/dictionaries/en.dictionary.itop.core.php @@ -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' => 'List of Replica', + 'Core:SynchroReplica:ListOfReplicas' => 'Replicas of the data source: %1$s', 'Core:SynchroAttExtKey:ReconciliationById' => 'id (Primary Key)', 'Core:SynchroAtt:attcode' => 'Attribute', 'Core:SynchroAtt:attcode+' => 'Field of the object', @@ -1036,65 +1036,99 @@ 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: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: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', - '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', diff --git a/dictionaries/en_gb.dictionary.itop.core.php b/dictionaries/en_gb.dictionary.itop.core.php index dc47b2aed8..dd3a6c6067 100644 --- a/dictionaries/en_gb.dictionary.itop.core.php +++ b/dictionaries/en_gb.dictionary.itop.core.php @@ -1058,6 +1058,39 @@ 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', diff --git a/dictionaries/es_cr.dictionary.itop.core.php b/dictionaries/es_cr.dictionary.itop.core.php index ca397d5f1f..ee3aff6af1 100644 --- a/dictionaries/es_cr.dictionary.itop.core.php +++ b/dictionaries/es_cr.dictionary.itop.core.php @@ -963,6 +963,39 @@ 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', diff --git a/dictionaries/fr.dictionary.itop.core.php b/dictionaries/fr.dictionary.itop.core.php index 25e31bdb7a..e155817e60 100644 --- a/dictionaries/fr.dictionary.itop.core.php +++ b/dictionaries/fr.dictionary.itop.core.php @@ -1021,6 +1021,40 @@ 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', diff --git a/dictionaries/hu.dictionary.itop.core.php b/dictionaries/hu.dictionary.itop.core.php index e6b8421c69..359a414d29 100755 --- a/dictionaries/hu.dictionary.itop.core.php +++ b/dictionaries/hu.dictionary.itop.core.php @@ -970,6 +970,39 @@ 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', diff --git a/dictionaries/it.dictionary.itop.core.php b/dictionaries/it.dictionary.itop.core.php index efdd1698a0..bfe3bcfb5e 100644 --- a/dictionaries/it.dictionary.itop.core.php +++ b/dictionaries/it.dictionary.itop.core.php @@ -970,6 +970,39 @@ 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', diff --git a/dictionaries/ja.dictionary.itop.core.php b/dictionaries/ja.dictionary.itop.core.php index 838640226a..cf82b2359f 100644 --- a/dictionaries/ja.dictionary.itop.core.php +++ b/dictionaries/ja.dictionary.itop.core.php @@ -974,6 +974,39 @@ 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' => 'プリファレンス', diff --git a/dictionaries/nl.dictionary.itop.core.php b/dictionaries/nl.dictionary.itop.core.php index 32f76aec57..b9f74d8a97 100644 --- a/dictionaries/nl.dictionary.itop.core.php +++ b/dictionaries/nl.dictionary.itop.core.php @@ -972,6 +972,39 @@ 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', diff --git a/dictionaries/pl.dictionary.itop.core.php b/dictionaries/pl.dictionary.itop.core.php index be7450a3d3..925628470e 100644 --- a/dictionaries/pl.dictionary.itop.core.php +++ b/dictionaries/pl.dictionary.itop.core.php @@ -969,6 +969,39 @@ 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', diff --git a/dictionaries/pt_br.dictionary.itop.core.php b/dictionaries/pt_br.dictionary.itop.core.php index e919b141fd..d13bb6a2aa 100644 --- a/dictionaries/pt_br.dictionary.itop.core.php +++ b/dictionaries/pt_br.dictionary.itop.core.php @@ -970,6 +970,39 @@ 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', diff --git a/dictionaries/ru.dictionary.itop.core.php b/dictionaries/ru.dictionary.itop.core.php index 3de6a260d3..59a1dda46e 100644 --- a/dictionaries/ru.dictionary.itop.core.php +++ b/dictionaries/ru.dictionary.itop.core.php @@ -975,6 +975,40 @@ 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' => 'Предпочтения', diff --git a/dictionaries/sk.dictionary.itop.core.php b/dictionaries/sk.dictionary.itop.core.php index 5c5b033fbb..2111bf3b34 100644 --- a/dictionaries/sk.dictionary.itop.core.php +++ b/dictionaries/sk.dictionary.itop.core.php @@ -993,6 +993,39 @@ 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', diff --git a/dictionaries/tr.dictionary.itop.core.php b/dictionaries/tr.dictionary.itop.core.php index e8ad498944..72992b5d2e 100644 --- a/dictionaries/tr.dictionary.itop.core.php +++ b/dictionaries/tr.dictionary.itop.core.php @@ -975,6 +975,39 @@ 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', diff --git a/dictionaries/zh_cn.dictionary.itop.core.php b/dictionaries/zh_cn.dictionary.itop.core.php index a42ce9a9f8..44a90a902c 100644 --- a/dictionaries/zh_cn.dictionary.itop.core.php +++ b/dictionaries/zh_cn.dictionary.itop.core.php @@ -1075,6 +1075,40 @@ 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' => '偏好设置', diff --git a/lib/autoload.php b/lib/autoload.php index 9861c4c24c..1b6f5ac129 100644 --- a/lib/autoload.php +++ b/lib/autoload.php @@ -14,7 +14,10 @@ if (PHP_VERSION_ID < 50600) { echo $err; } } - throw new RuntimeException($err); + trigger_error( + $err, + E_USER_ERROR + ); } require_once __DIR__ . '/composer/autoload_real.php'; diff --git a/lib/composer/autoload_classmap.php b/lib/composer/autoload_classmap.php index 626b2db633..a51c3ba362 100644 --- a/lib/composer/autoload_classmap.php +++ b/lib/composer/autoload_classmap.php @@ -131,12 +131,14 @@ return array( 'Collator' => $vendorDir . '/symfony/polyfill-intl-icu/Resources/stubs/Collator.php', 'Combodo\\iTop\\Application\\Branding' => $baseDir . '/sources/Application/Branding.php', 'Combodo\\iTop\\Application\\EventRegister\\ApplicationEvents' => $baseDir . '/sources/Application/EventRegister/ApplicationEvents.php', + 'Combodo\\iTop\\Application\\Helper\\BulkHelper' => $baseDir . '/sources/Application/Helper/BulkHelper.php', 'Combodo\\iTop\\Application\\Helper\\CKEditorHelper' => $baseDir . '/sources/Application/Helper/CKEditorHelper.php', 'Combodo\\iTop\\Application\\Helper\\ExportHelper' => $baseDir . '/sources/Application/Helper/ExportHelper.php', 'Combodo\\iTop\\Application\\Helper\\FormHelper' => $baseDir . '/sources/Application/Helper/FormHelper.php', 'Combodo\\iTop\\Application\\Helper\\ImportHelper' => $baseDir . '/sources/Application/Helper/ImportHelper.php', 'Combodo\\iTop\\Application\\Helper\\SearchHelper' => $baseDir . '/sources/Application/Helper/SearchHelper.php', 'Combodo\\iTop\\Application\\Helper\\Session' => $baseDir . '/sources/Application/Helper/Session.php', + 'Combodo\\iTop\\Application\\Helper\\SynchroReplicaHelper' => $baseDir . '/sources/Application/Helper/SynchroReplicaHelper.php', 'Combodo\\iTop\\Application\\Helper\\WebResourcesHelper' => $baseDir . '/sources/Application/Helper/WebResourcesHelper.php', 'Combodo\\iTop\\Application\\Newsroom\\iTopNewsroomProvider' => $baseDir . '/sources/Application/Newsroom/iTopNewsroomProvider.php', 'Combodo\\iTop\\Application\\Search\\AjaxSearchException' => $baseDir . '/sources/Application/Search/ajaxsearchexception.class.inc.php', diff --git a/lib/composer/autoload_static.php b/lib/composer/autoload_static.php index fe840689d7..db32c807e5 100644 --- a/lib/composer/autoload_static.php +++ b/lib/composer/autoload_static.php @@ -28,12 +28,12 @@ class ComposerStaticInitfc0e9e9dea11dcbb6272414776c30685 ); public static $prefixLengthsPsr4 = array ( - 'T' => + 'T' => array ( 'Twig\\' => 5, 'TheNetworg\\OAuth2\\Client\\' => 25, ), - 'S' => + 'S' => array ( 'Symfony\\Runtime\\Symfony\\Component\\' => 34, 'Symfony\\Polyfill\\Php83\\' => 23, @@ -85,7 +85,7 @@ class ComposerStaticInitfc0e9e9dea11dcbb6272414776c30685 'ScssPhp\\ScssPhp\\' => 16, 'Sabberworm\\CSS\\' => 15, ), - 'P' => + 'P' => array ( 'Psr\\Log\\' => 8, 'Psr\\Http\\Message\\' => 17, @@ -96,310 +96,310 @@ class ComposerStaticInitfc0e9e9dea11dcbb6272414776c30685 'PhpParser\\' => 10, 'Pelago\\Emogrifier\\' => 18, ), - 'L' => + 'L' => array ( 'League\\OAuth2\\Client\\' => 21, ), - 'G' => + 'G' => array ( 'GuzzleHttp\\Psr7\\' => 16, 'GuzzleHttp\\Promise\\' => 19, 'GuzzleHttp\\' => 11, ), - 'F' => + 'F' => array ( 'Firebase\\JWT\\' => 13, ), - 'E' => + 'E' => array ( 'Egulias\\EmailValidator\\' => 23, ), - 'D' => + 'D' => array ( 'Doctrine\\Common\\Lexer\\' => 22, ), ); public static $prefixDirsPsr4 = array ( - 'Twig\\' => + 'Twig\\' => array ( 0 => __DIR__ . '/..' . '/twig/twig/src', ), - 'TheNetworg\\OAuth2\\Client\\' => + 'TheNetworg\\OAuth2\\Client\\' => array ( 0 => __DIR__ . '/..' . '/thenetworg/oauth2-azure/src', ), - 'Symfony\\Runtime\\Symfony\\Component\\' => + 'Symfony\\Runtime\\Symfony\\Component\\' => array ( 0 => __DIR__ . '/..' . '/symfony/runtime/Internal', ), - 'Symfony\\Polyfill\\Php83\\' => + 'Symfony\\Polyfill\\Php83\\' => array ( 0 => __DIR__ . '/..' . '/symfony/polyfill-php83', ), - 'Symfony\\Polyfill\\Mbstring\\' => + 'Symfony\\Polyfill\\Mbstring\\' => array ( 0 => __DIR__ . '/..' . '/symfony/polyfill-mbstring', ), - 'Symfony\\Polyfill\\Intl\\Normalizer\\' => + 'Symfony\\Polyfill\\Intl\\Normalizer\\' => array ( 0 => __DIR__ . '/..' . '/symfony/polyfill-intl-normalizer', ), - 'Symfony\\Polyfill\\Intl\\Idn\\' => + 'Symfony\\Polyfill\\Intl\\Idn\\' => array ( 0 => __DIR__ . '/..' . '/symfony/polyfill-intl-idn', ), - 'Symfony\\Polyfill\\Intl\\Icu\\' => + 'Symfony\\Polyfill\\Intl\\Icu\\' => array ( 0 => __DIR__ . '/..' . '/symfony/polyfill-intl-icu', ), - 'Symfony\\Polyfill\\Intl\\Grapheme\\' => + 'Symfony\\Polyfill\\Intl\\Grapheme\\' => array ( 0 => __DIR__ . '/..' . '/symfony/polyfill-intl-grapheme', ), - 'Symfony\\Polyfill\\Ctype\\' => + 'Symfony\\Polyfill\\Ctype\\' => array ( 0 => __DIR__ . '/..' . '/symfony/polyfill-ctype', ), - 'Symfony\\Contracts\\Translation\\' => + 'Symfony\\Contracts\\Translation\\' => array ( 0 => __DIR__ . '/..' . '/symfony/translation-contracts', ), - 'Symfony\\Contracts\\Service\\' => + 'Symfony\\Contracts\\Service\\' => array ( 0 => __DIR__ . '/..' . '/symfony/service-contracts', ), - 'Symfony\\Contracts\\EventDispatcher\\' => + 'Symfony\\Contracts\\EventDispatcher\\' => array ( 0 => __DIR__ . '/..' . '/symfony/event-dispatcher-contracts', ), - 'Symfony\\Contracts\\Cache\\' => + 'Symfony\\Contracts\\Cache\\' => array ( 0 => __DIR__ . '/..' . '/symfony/cache-contracts', ), - 'Symfony\\Component\\Yaml\\' => + 'Symfony\\Component\\Yaml\\' => array ( 0 => __DIR__ . '/..' . '/symfony/yaml', ), - 'Symfony\\Component\\VarExporter\\' => + 'Symfony\\Component\\VarExporter\\' => array ( 0 => __DIR__ . '/..' . '/symfony/var-exporter', ), - 'Symfony\\Component\\VarDumper\\' => + 'Symfony\\Component\\VarDumper\\' => array ( 0 => __DIR__ . '/..' . '/symfony/var-dumper', ), - 'Symfony\\Component\\Validator\\' => + 'Symfony\\Component\\Validator\\' => array ( 0 => __DIR__ . '/..' . '/symfony/validator', ), - 'Symfony\\Component\\String\\' => + 'Symfony\\Component\\String\\' => array ( 0 => __DIR__ . '/..' . '/symfony/string', ), - 'Symfony\\Component\\Stopwatch\\' => + 'Symfony\\Component\\Stopwatch\\' => array ( 0 => __DIR__ . '/..' . '/symfony/stopwatch', ), - 'Symfony\\Component\\Security\\Csrf\\' => + 'Symfony\\Component\\Security\\Csrf\\' => array ( 0 => __DIR__ . '/..' . '/symfony/security-csrf', ), - 'Symfony\\Component\\Security\\Core\\' => + 'Symfony\\Component\\Security\\Core\\' => array ( 0 => __DIR__ . '/..' . '/symfony/security-core', ), - 'Symfony\\Component\\Runtime\\' => + 'Symfony\\Component\\Runtime\\' => array ( 0 => __DIR__ . '/..' . '/symfony/runtime', ), - 'Symfony\\Component\\Routing\\' => + 'Symfony\\Component\\Routing\\' => array ( 0 => __DIR__ . '/..' . '/symfony/routing', ), - 'Symfony\\Component\\PropertyInfo\\' => + 'Symfony\\Component\\PropertyInfo\\' => array ( 0 => __DIR__ . '/..' . '/symfony/property-info', ), - 'Symfony\\Component\\PropertyAccess\\' => + 'Symfony\\Component\\PropertyAccess\\' => array ( 0 => __DIR__ . '/..' . '/symfony/property-access', ), - 'Symfony\\Component\\PasswordHasher\\' => + 'Symfony\\Component\\PasswordHasher\\' => array ( 0 => __DIR__ . '/..' . '/symfony/password-hasher', ), - 'Symfony\\Component\\OptionsResolver\\' => + 'Symfony\\Component\\OptionsResolver\\' => array ( 0 => __DIR__ . '/..' . '/symfony/options-resolver', ), - 'Symfony\\Component\\Mime\\' => + 'Symfony\\Component\\Mime\\' => array ( 0 => __DIR__ . '/..' . '/symfony/mime', ), - 'Symfony\\Component\\Mailer\\' => + 'Symfony\\Component\\Mailer\\' => array ( 0 => __DIR__ . '/..' . '/symfony/mailer', ), - 'Symfony\\Component\\HttpKernel\\' => + 'Symfony\\Component\\HttpKernel\\' => array ( 0 => __DIR__ . '/..' . '/symfony/http-kernel', ), - 'Symfony\\Component\\HttpFoundation\\' => + 'Symfony\\Component\\HttpFoundation\\' => array ( 0 => __DIR__ . '/..' . '/symfony/http-foundation', ), - 'Symfony\\Component\\Form\\' => + 'Symfony\\Component\\Form\\' => array ( 0 => __DIR__ . '/..' . '/symfony/form', ), - 'Symfony\\Component\\Finder\\' => + 'Symfony\\Component\\Finder\\' => array ( 0 => __DIR__ . '/..' . '/symfony/finder', ), - 'Symfony\\Component\\Filesystem\\' => + 'Symfony\\Component\\Filesystem\\' => array ( 0 => __DIR__ . '/..' . '/symfony/filesystem', ), - 'Symfony\\Component\\EventDispatcher\\' => + 'Symfony\\Component\\EventDispatcher\\' => array ( 0 => __DIR__ . '/..' . '/symfony/event-dispatcher', ), - 'Symfony\\Component\\ErrorHandler\\' => + 'Symfony\\Component\\ErrorHandler\\' => array ( 0 => __DIR__ . '/..' . '/symfony/error-handler', ), - 'Symfony\\Component\\Dotenv\\' => + 'Symfony\\Component\\Dotenv\\' => array ( 0 => __DIR__ . '/..' . '/symfony/dotenv', ), - 'Symfony\\Component\\DependencyInjection\\' => + 'Symfony\\Component\\DependencyInjection\\' => array ( 0 => __DIR__ . '/..' . '/symfony/dependency-injection', ), - 'Symfony\\Component\\CssSelector\\' => + 'Symfony\\Component\\CssSelector\\' => array ( 0 => __DIR__ . '/..' . '/symfony/css-selector', ), - 'Symfony\\Component\\Console\\' => + 'Symfony\\Component\\Console\\' => array ( 0 => __DIR__ . '/..' . '/symfony/console', ), - 'Symfony\\Component\\Config\\' => + 'Symfony\\Component\\Config\\' => array ( 0 => __DIR__ . '/..' . '/symfony/config', ), - 'Symfony\\Component\\Cache\\' => + 'Symfony\\Component\\Cache\\' => array ( 0 => __DIR__ . '/..' . '/symfony/cache', ), - 'Symfony\\Bundle\\WebProfilerBundle\\' => + 'Symfony\\Bundle\\WebProfilerBundle\\' => array ( 0 => __DIR__ . '/..' . '/symfony/web-profiler-bundle', ), - 'Symfony\\Bundle\\TwigBundle\\' => + 'Symfony\\Bundle\\TwigBundle\\' => array ( 0 => __DIR__ . '/..' . '/symfony/twig-bundle', ), - 'Symfony\\Bundle\\FrameworkBundle\\' => + 'Symfony\\Bundle\\FrameworkBundle\\' => array ( 0 => __DIR__ . '/..' . '/symfony/framework-bundle', ), - 'Symfony\\Bundle\\DebugBundle\\' => + 'Symfony\\Bundle\\DebugBundle\\' => array ( 0 => __DIR__ . '/..' . '/symfony/debug-bundle', ), - 'Symfony\\Bridge\\Twig\\' => + 'Symfony\\Bridge\\Twig\\' => array ( 0 => __DIR__ . '/..' . '/symfony/twig-bridge', ), - 'Soundasleep\\' => + 'Soundasleep\\' => array ( 0 => __DIR__ . '/..' . '/soundasleep/html2text/src', ), - 'ScssPhp\\ScssPhp\\' => + 'ScssPhp\\ScssPhp\\' => array ( 0 => __DIR__ . '/..' . '/scssphp/scssphp/src', ), - 'Sabberworm\\CSS\\' => + 'Sabberworm\\CSS\\' => array ( 0 => __DIR__ . '/..' . '/sabberworm/php-css-parser/src', ), - 'Psr\\Log\\' => + 'Psr\\Log\\' => array ( 0 => __DIR__ . '/..' . '/psr/log/src', ), - 'Psr\\Http\\Message\\' => + 'Psr\\Http\\Message\\' => array ( 0 => __DIR__ . '/..' . '/psr/http-factory/src', 1 => __DIR__ . '/..' . '/psr/http-message/src', ), - 'Psr\\Http\\Client\\' => + 'Psr\\Http\\Client\\' => array ( 0 => __DIR__ . '/..' . '/psr/http-client/src', ), - 'Psr\\EventDispatcher\\' => + 'Psr\\EventDispatcher\\' => array ( 0 => __DIR__ . '/..' . '/psr/event-dispatcher/src', ), - 'Psr\\Container\\' => + 'Psr\\Container\\' => array ( 0 => __DIR__ . '/..' . '/psr/container/src', ), - 'Psr\\Cache\\' => + 'Psr\\Cache\\' => array ( 0 => __DIR__ . '/..' . '/psr/cache/src', ), - 'PhpParser\\' => + 'PhpParser\\' => array ( 0 => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser', ), - 'Pelago\\Emogrifier\\' => + 'Pelago\\Emogrifier\\' => array ( 0 => __DIR__ . '/..' . '/pelago/emogrifier/src', ), - 'League\\OAuth2\\Client\\' => + 'League\\OAuth2\\Client\\' => array ( 0 => __DIR__ . '/..' . '/league/oauth2-google/src', 1 => __DIR__ . '/..' . '/league/oauth2-client/src', ), - 'GuzzleHttp\\Psr7\\' => + 'GuzzleHttp\\Psr7\\' => array ( 0 => __DIR__ . '/..' . '/guzzlehttp/psr7/src', ), - 'GuzzleHttp\\Promise\\' => + 'GuzzleHttp\\Promise\\' => array ( 0 => __DIR__ . '/..' . '/guzzlehttp/promises/src', ), - 'GuzzleHttp\\' => + 'GuzzleHttp\\' => array ( 0 => __DIR__ . '/..' . '/guzzlehttp/guzzle/src', ), - 'Firebase\\JWT\\' => + 'Firebase\\JWT\\' => array ( 0 => __DIR__ . '/..' . '/firebase/php-jwt/src', ), - 'Egulias\\EmailValidator\\' => + 'Egulias\\EmailValidator\\' => array ( 0 => __DIR__ . '/..' . '/egulias/email-validator/src', ), - 'Doctrine\\Common\\Lexer\\' => + 'Doctrine\\Common\\Lexer\\' => array ( 0 => __DIR__ . '/..' . '/doctrine/lexer/src', ), ); public static $prefixesPsr0 = array ( - 'C' => + 'C' => array ( - 'Console' => + 'Console' => array ( 0 => __DIR__ . '/..' . '/pear/console_getopt', ), ), - 'A' => + 'A' => array ( - 'Archive_Tar' => + 'Archive_Tar' => array ( 0 => __DIR__ . '/..' . '/pear/archive_tar', ), @@ -532,12 +532,14 @@ class ComposerStaticInitfc0e9e9dea11dcbb6272414776c30685 'Collator' => __DIR__ . '/..' . '/symfony/polyfill-intl-icu/Resources/stubs/Collator.php', 'Combodo\\iTop\\Application\\Branding' => __DIR__ . '/../..' . '/sources/Application/Branding.php', 'Combodo\\iTop\\Application\\EventRegister\\ApplicationEvents' => __DIR__ . '/../..' . '/sources/Application/EventRegister/ApplicationEvents.php', + 'Combodo\\iTop\\Application\\Helper\\BulkHelper' => __DIR__ . '/../..' . '/sources/Application/Helper/BulkHelper.php', 'Combodo\\iTop\\Application\\Helper\\CKEditorHelper' => __DIR__ . '/../..' . '/sources/Application/Helper/CKEditorHelper.php', 'Combodo\\iTop\\Application\\Helper\\ExportHelper' => __DIR__ . '/../..' . '/sources/Application/Helper/ExportHelper.php', 'Combodo\\iTop\\Application\\Helper\\FormHelper' => __DIR__ . '/../..' . '/sources/Application/Helper/FormHelper.php', 'Combodo\\iTop\\Application\\Helper\\ImportHelper' => __DIR__ . '/../..' . '/sources/Application/Helper/ImportHelper.php', 'Combodo\\iTop\\Application\\Helper\\SearchHelper' => __DIR__ . '/../..' . '/sources/Application/Helper/SearchHelper.php', 'Combodo\\iTop\\Application\\Helper\\Session' => __DIR__ . '/../..' . '/sources/Application/Helper/Session.php', + 'Combodo\\iTop\\Application\\Helper\\SynchroReplicaHelper' => __DIR__ . '/../..' . '/sources/Application/Helper/SynchroReplicaHelper.php', 'Combodo\\iTop\\Application\\Helper\\WebResourcesHelper' => __DIR__ . '/../..' . '/sources/Application/Helper/WebResourcesHelper.php', 'Combodo\\iTop\\Application\\Newsroom\\iTopNewsroomProvider' => __DIR__ . '/../..' . '/sources/Application/Newsroom/iTopNewsroomProvider.php', 'Combodo\\iTop\\Application\\Search\\AjaxSearchException' => __DIR__ . '/../..' . '/sources/Application/Search/ajaxsearchexception.class.inc.php', diff --git a/lib/composer/platform_check.php b/lib/composer/platform_check.php index f6cf0ea27c..bb733000d3 100644 --- a/lib/composer/platform_check.php +++ b/lib/composer/platform_check.php @@ -36,7 +36,8 @@ 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; } } - throw new \RuntimeException( - 'Composer detected issues in your platform: ' . implode(' ', $issues) + trigger_error( + 'Composer detected issues in your platform: ' . implode(' ', $issues), + E_USER_ERROR ); } diff --git a/pages/UI.php b/pages/UI.php index 2761915084..b3dda33ba5 100644 --- a/pages/UI.php +++ b/pages/UI.php @@ -5,12 +5,13 @@ * @license http://opensource.org/licenses/AGPL-3.0 */ +use Combodo\iTop\Application\Helper\BulkHelper; use Combodo\iTop\Application\Helper\SearchHelper; use Combodo\iTop\Application\Helper\Session; +use Combodo\iTop\Application\Helper\SynchroReplicaHelper; 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; @@ -577,18 +578,35 @@ try { /////////////////////////////////////////////////////////////////////////////////////////// case 'select_for_modify_all': // Select the list of objects to be modified (bulk modify) - UI::OperationSelectForModifyAll($oP); + BulkHelper::OperationSelectForModifyAll($oP); break; /////////////////////////////////////////////////////////////////////////////////////////// case 'form_for_modify_all': // Form to modify multiple objects (bulk modify) - UI::OperationFormForModifyAll($oP, $oAppContext); + BulkHelper::OperationFormForModifyAll($oP, $oAppContext); + break; + + case 'form_for_unlink_all': // Form to modify multiple objects (bulk modify) + SynchroReplicaHelper::OperationUnlinkAll($oP, $oAppContext,'unlink'); + break; + case 'form_for_unlinksynchro_all': // Form to modify multiple objects (bulk modify) + SynchroReplicaHelper::OperationUnlinkAll($oP, $oAppContext,'unlinksynchro'); + break; + case 'form_for_synchro_all': // Form to modify multiple objects (bulk modify) + SynchroReplicaHelper::OperationUnlinkAll($oP, $oAppContext,'synchro'); + break; + + case 'form_for_allowdelete_all': // Form to modify multiple objects (bulk modify) + SynchroReplicaHelper::OperationUnlinkAll($oP, $oAppContext,'allowdelete'); + break; + case 'form_for_denydelete_all': // Form to modify multiple objects (bulk modify) + SynchroReplicaHelper::OperationUnlinkAll($oP, $oAppContext,'denydelete'); break; /////////////////////////////////////////////////////////////////////////////////////////// case 'preview_or_modify_all': // Preview or apply bulk modify - UI::OperationPreviewOrModifyAll($oP, $oAppContext); + BulkHelper::OperationPreviewOrModifyAll($oP, $oAppContext); break; /////////////////////////////////////////////////////////////////////////////////////////// @@ -627,7 +645,7 @@ try { 'title' => Dict::S('UI:BulkDeleteTitle'), ]; $oChecker = new ActionChecker($oFilter, UR_ACTION_BULK_DELETE); - DisplayMultipleSelectionForm($oP, $oFilter, 'bulk_delete', $oChecker, [], $aDisplayParams); + BulkHelper::DisplayMultipleSelectionForm($oP, $oFilter, 'bulk_delete', $oChecker, [], $aDisplayParams); break; /////////////////////////////////////////////////////////////////////////////////////////// @@ -1338,99 +1356,3 @@ 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); - } -} diff --git a/sources/Application/Helper/BulkHelper.php b/sources/Application/Helper/BulkHelper.php new file mode 100644 index 0000000000..dac8c3a79e --- /dev/null +++ b/sources/Application/Helper/BulkHelper.php @@ -0,0 +1,178 @@ +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); + } +} \ No newline at end of file diff --git a/sources/Application/Helper/SynchroReplicaHelper.php b/sources/Application/Helper/SynchroReplicaHelper.php new file mode 100644 index 0000000000..b37defbc32 --- /dev/null +++ b/sources/Application/Helper/SynchroReplicaHelper.php @@ -0,0 +1,115 @@ +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(); + + $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::class, $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(); + } + + $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' => '
'.($bResult ? '' : implode('
', $aErrorsToDisplay)).'
', + ); + } + + 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'); + } +} \ No newline at end of file diff --git a/sources/Core/AttributeDefinition/AttributeObjectKey.php b/sources/Core/AttributeDefinition/AttributeObjectKey.php index 122c489093..1d62a61718 100644 --- a/sources/Core/AttributeDefinition/AttributeObjectKey.php +++ b/sources/Core/AttributeDefinition/AttributeObjectKey.php @@ -114,4 +114,8 @@ class AttributeObjectKey extends AttributeDBFieldVoid return (int)$proposedValue; } + public function GetTargetClass($iType = EXTKEY_RELATIVE) + { + return ''; + } } diff --git a/synchro/replica.php b/synchro/replica.php index 0c9c16726d..21dd073e73 100644 --- a/synchro/replica.php +++ b/synchro/replica.php @@ -18,7 +18,10 @@ * 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 Combodo\iTop\Application\Helper\BulkHelper; require_once('../approot.inc.php'); require_once(APPROOT.'/application/application.inc.php'); @@ -34,6 +37,7 @@ $oP = new iTopWebPage("iTop - Synchro Replicas"); // Main program $sOperation = utils::ReadParam('operation', 'details'); + try { switch ($sOperation) { case 'details': @@ -41,26 +45,26 @@ try { if ($iId == null) { throw new ApplicationException(Dict::Format('UI:Error:1ParametersMissing', 'id')); } - $oReplica = MetaModel::GetObject('SynchroReplica', $iId); + $oReplica = MetaModel::GetObject(SynchroReplica::class, $iId); $oReplica->DisplayDetails($oP); break; case 'oql': + $iSourceId = utils::ReadParam('datasource', null); + if ($iSourceId != null) { + $oSource = MetaModel::GetObject(SynchroDataSource::class, $iSourceId); + $oBackButton = ButtonUIBlockFactory::MakeLinkNeutral( ApplicationContext::MakeObjectUrl(SynchroDataSource::class, $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' => false, 'table_id' => '1']); + $oBlock1 = new DisplayBlock($oFilter, 'search', false, ['menu' => true, 'table_id' => '1']); $oBlock1->Display($oP, 0); - $oP->add(''.MetaModel::GetClassIcon('SynchroReplica').Dict::S('Core:SynchroReplica:ListOfReplicas').'
'); - $iSourceId = utils::ReadParam('datasource', null); - if ($iSourceId != null) { - $oSource = MetaModel::GetObject('SynchroDataSource', $iSourceId); - $oP->p(Dict::Format('Core:SynchroReplica:BackToDataSource', $oSource->GetHyperlink()).''); - } - $oBlock = new DisplayBlock($oFilter, 'list', false, ['menu' => false]); - $oBlock->Display($oP, 1); break; case 'delete': @@ -69,6 +73,81 @@ 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::class, $iId); + $oReplica->UnLink(); + + $oStatLog = $oReplica->ReSynchro(); + $oP->add(implode('