Compare commits

...

37 Commits

Author SHA1 Message Date
acognet
2896357078 N°1318 - multiple choice in a template - WIP 2023-06-23 08:51:51 +02:00
acognet
413a798510 N°1318 - multiple choice in a template - first step 2023-06-05 23:26:58 +02:00
acognet
6abf65bfb7 N°1318 - multiple choice in a template - first step 2023-06-02 09:45:31 +02:00
Benjamin Dalsass
4264123ef6 N°6219 - 1:n Read: tooltip, modal title and message on Add-Edit-Remove-Delete 2023-06-02 08:08:29 +02:00
vdumas
eb1ff95437 N°6347 - 1:n Add nice french dico entry on standard 1:n relationship 2023-06-01 17:12:47 +02:00
Eric Espie
cb7cbe9297 Merge remote-tracking branch 'origin/support/3.0' into develop
# Conflicts:
#	pages/UI.php
#	tests/php-unit-tests/unitary-tests/application/utilsTest.php
2023-06-01 16:59:59 +02:00
Eric Espie
b8f61362f5 N°6348 - Hardening code 2023-06-01 16:44:40 +02:00
Eric Espie
e3ba826e5d N°6349 - Hardening code 2023-06-01 16:36:56 +02:00
Eric Espie
17d22219d2 N°6350 - Fix unit tests 2023-06-01 16:30:09 +02:00
Eric Espie
a49025f371 Merge remote-tracking branch 'origin/support/2.7' into support/3.0
# Conflicts:
#	application/utils.inc.php
2023-06-01 16:04:52 +02:00
Eric Espie
9e96ea2873 N°6350 - code hardening 2023-06-01 15:35:56 +02:00
Eric Espie
1172159745 N°6351 - code hardening 2023-06-01 15:12:50 +02:00
vdumas
c2fb0150b0 N°6347 - 1:n Add nice french dico entry on standard 1:n relationship 2023-06-01 11:56:34 +02:00
Molkobain
41bce359a0 N°6307 - Fix mentions not working in edition due to CRUD changes 2023-05-31 17:45:20 +02:00
Eric Espie
3e7c48d5c6 N°6357 - Prevent entering same password on change user password 2023-05-31 17:12:26 +02:00
vdumas
5e3b813da7 N°6339 - n:n Add nice french dico entry 2023-05-31 16:50:54 +02:00
Eric Espie
d680369733 N°5726 - loose data localizer language in console after impersonating a user with a different langage 2023-05-31 16:45:20 +02:00
vdumas
0af8f65a11 N°6339 - n:n Add nice french dico entry 2023-05-31 16:33:48 +02:00
Molkobain
f41879f0b1 N°6307 - Fix unappropriate confirm message when updating log on object edition
Proper fix as 345a8371 was temporary
2023-05-31 16:26:26 +02:00
Molkobain
eec9b027ac Revert "N°6307 Fix alert when caselog filled and submitting form"
This reverts commit 4b9b0a91a9.
2023-05-31 16:26:26 +02:00
Eric Espie
5f359b2b61 N°6151 - Allow to select classes on union outside the already selected classes 2023-05-31 14:40:13 +02:00
Benjamin Dalsass
31a96d24dd N°6219 - 1:n Read: tooltip, modal title and message on Add-Edit-Remove-Delete 2023-05-31 10:10:02 +02:00
Molkobain
d07bce3063 N°6352 - Portal: Fix autoloaders 2023-05-30 16:29:07 +02:00
Molkobain
c9beba0cea N°6352 - Portal: Fix "Combodo\iTop\Portal\Controller\AggregatePageBrickController" has no container set due to Symfony 5.4 migration 2023-05-30 16:09:58 +02:00
vdumas
4d9b054430 N°2639 - Add Tooltips EN/FR dico entries for Data Synchro 2023-05-30 15:42:42 +02:00
Eric Espie
2c4c69fcfc Fixed regression due to forcing camel case names in operation methods, now allow both camel case and snake case 2023-05-30 15:25:00 +02:00
Eric Espie
173960e717 N°6324 - CRUD Event for one time treatment before creation and before update 2023-05-30 11:54:15 +02:00
vdumas
79585c7128 N°6339 - n:n Add nice french dico entry on standard lnk 2023-05-30 11:34:33 +02:00
Eric Espie
c3bb995407 N°6324 - CRUD Event for one time treatment before creation and before update 2023-05-30 11:29:24 +02:00
vdumas
e3dd805f24 N°6338 - Add silo (org_id) and location on all final Interfaces, LogicalVolume & NASFileSystem 2023-05-26 13:49:49 +02:00
acognet
649457bfc2 N°6308 - issue on displaying a userrequest list with Service_details fields with PHP 8 2023-05-26 00:25:42 +02:00
vdumas
e933807b1c N°6203 - Complementary name on Ticket sub-classes 2023-05-24 18:41:02 +02:00
vdumas
52fd333922 N°6339 - n:n Add nice french dico entry on standard lnk 2023-05-24 18:17:58 +02:00
vdumas
91a9997480 N°6203 - Overcard & complementary on Ticket classes 2023-05-24 15:39:22 +02:00
vdumas
906ad70156 N°6331 - Add Service tab in Provider Contract and add fieldsets 2023-05-24 13:07:52 +02:00
Pierre Goiffon
0508608e78 N°6322 Delegate \AttributeCustomFields::CheckValue to the handler
This allows to move template_id checks from BuildForm (which is called in the UI to construct the form also) to a dedicated method only called for validation
2023-05-24 09:28:26 +02:00
vdumas
63fcf4e6f9 N°6203 - Add summary to CMDB classes 2023-05-23 20:00:57 +02:00
96 changed files with 3825 additions and 1441 deletions

View File

@@ -2949,15 +2949,11 @@ JS
}
// Prepare blocker protection to avoid loosing data
$sBlockerId = uniqid($sClass.':'.$iKey.':', true);
$sConfirmationMessage = addslashes(Dict::S('UI:NavigateAwayConfirmationMessage'));
$sBlockerId = $sClass.':'.$iKey; // Important: This must have the synthax format as in js/layouts/activity-panel/activity-panel.js
$sJSToken = json_encode($sOwnershipToken);
$oPage->add_ready_script(<<<JS
// Try to release concurrent lock when leaving the page
$(window).on('unload',function() { return OnUnload('$iTransactionId', '$sClass', $iKey, $sJSToken) } );
window.onbeforeunload = function() {
// N°6307 just an empty function to disable activity-panel.js handler
};
// Leave handler for the current form (check if in a modal or not)
// Note: We use a self-invoking function to avoid making unique vars. names to avoid collision (this can be called multiple time if modal forms are displayed)
@@ -3010,7 +3006,7 @@ JS
$oToolbarButtons->AddCSSClass('ibo-toolbar-top');
$oObjectDetails->AddToolbarBlock($oToolbarButtons);
// Allow form title customization
if (array_key_exists('form_title', $aExtraParams)) {
if (array_key_exists('form_title', $aExtraParams) && $aExtraParams['form_title'] !== null) {
$oObjectDetails->SetTitle($aExtraParams['form_title']);
}
}
@@ -5874,54 +5870,28 @@ JS
*/
final protected function FireEventCheckToWrite(): void
{
$this->FireEvent(EVENT_DB_CHECK_TO_WRITE);
$this->FireEvent(EVENT_DB_CHECK_TO_WRITE, ['is_new' => $this->IsNew()]);
}
final protected function FireEventBeforeObjectCreate()
final protected function FireEventBeforeWrite()
{
$this->FireEvent(EVENT_DB_BEFORE_CREATE);
}
/**
* @return void
* @throws \CoreException
*
* @since 3.1.0
*/
final protected function FireEventCreateDone(): void
{
$this->NotifyAttachedObjectsOnLinkClassModification();
$this->FireEventDbLinksChangedForCurrentObject();
$this->FireEvent(EVENT_DB_CREATE_DONE);
}
/////////////
/// UPDATE
///
/**
* @return void
* @throws \CoreException
*/
final protected function FireEventBeforeObjectUpdate()
{
$this->FireEvent(EVENT_DB_BEFORE_UPDATE);
$this->FireEvent(EVENT_DB_BEFORE_WRITE, ['is_new' => $this->IsNew()]);
}
/**
* @param array $aChanges
* @param bool $bIsNew
*
* @return void
* @throws \ArchivedObjectException
* @throws \CoreException
* @since 3.1.0
*/
final protected function FireEventUpdateDone(array $aChanges): void
final protected function FireEventAfterWrite(array $aChanges, bool $bIsNew): void
{
$this->NotifyAttachedObjectsOnLinkClassModification();
$this->FireEventDbLinksChangedForCurrentObject();
$this->FireEvent(EVENT_DB_UPDATE_DONE, ['changes' => $aChanges]);
$this->FireEvent(EVENT_DB_AFTER_WRITE, ['is_new' => $bIsNew, 'changes' => $aChanges]);
}
//////////////
@@ -5946,11 +5916,11 @@ JS
*
* @since 3.1.0
*/
final protected function FireEventDeleteDone(): void
final protected function FireEventAfterDelete(): void
{
$this->NotifyAttachedObjectsOnLinkClassModification();
$this->FireEventDbLinksChangedForCurrentObject();
$this->FireEvent(EVENT_DB_DELETE_DONE);
$this->FireEvent(EVENT_DB_AFTER_DELETE);
}
/**

View File

@@ -186,6 +186,27 @@
</menu>
</menus>
<events>
<event id="EVENT_DB_BEFORE_WRITE" _delta="define">
<description>An object is about to be written into the database. The object can be modified.</description>
<sources>
<source id="cmdbAbstractObject">cmdbAbstractObject</source>
</sources>
<replaces>DBObject::OnInsert</replaces>
<event_data>
<event_datum id="object">
<description>The object inserted</description>
<type>DBObject</type>
</event_datum>
<event_datum id="is_new">
<description>Creation flag</description>
<type>boolean</type>
</event_datum>
<event_datum id="debug_info">
<description>Debug string</description>
<type>string</type>
</event_datum>
</event_data>
</event>
<event id="EVENT_DB_CHECK_TO_WRITE" _delta="define">
<description>Check an object before it is written into the database (no change possible). Call DBObject::AddCheckIssue() to signal an issue</description>
<sources>
@@ -197,22 +218,9 @@
<description>The object to check</description>
<type>DBObject</type>
</event_datum>
<event_datum id="debug_info">
<description>Debug string</description>
<type>string</type>
</event_datum>
</event_data>
</event>
<event id="EVENT_DB_BEFORE_CREATE" _delta="define">
<description>An object is about to be created into the database. The object can be modified.</description>
<sources>
<source id="cmdbAbstractObject">cmdbAbstractObject</source>
</sources>
<replaces>DBObject::OnInsert</replaces>
<event_data>
<event_datum id="object">
<description>The object inserted</description>
<type>DBObject</type>
<event_datum id="is_new">
<description>Creation flag</description>
<type>boolean</type>
</event_datum>
<event_datum id="debug_info">
<description>Debug string</description>
@@ -220,8 +228,8 @@
</event_datum>
</event_data>
</event>
<event id="EVENT_DB_CREATE_DONE" _delta="define">
<description>An object has been created into the database. The modifications can be propagated to other objects.</description>
<event id="EVENT_DB_AFTER_WRITE" _delta="define">
<description>An object has been written into the database. The modifications can be propagated to other objects.</description>
<sources>
<source id="cmdbAbstractObject">cmdbAbstractObject</source>
</sources>
@@ -231,39 +239,13 @@
<description>The object inserted</description>
<type>DBObject</type>
</event_datum>
<event_datum id="debug_info">
<description>Debug string</description>
<type>string</type>
<event_datum id="is_new">
<description>Creation flag</description>
<type>boolean</type>
</event_datum>
</event_data>
</event>
<event id="EVENT_DB_BEFORE_UPDATE" _delta="define">
<description>An object is about to be updated into the database. The object can be modified.</description>
<sources>
<source id="cmdbAbstractObject">cmdbAbstractObject</source>
</sources>
<replaces>DBObject::OnUpdate</replaces>
<event_data>
<event_datum id="object">
<description>The object updated</description>
<type>DBObject</type>
</event_datum>
<event_datum id="debug_info">
<description>Debug string</description>
<type>string</type>
</event_datum>
</event_data>
</event>
<event id="EVENT_DB_UPDATE_DONE" _delta="define">
<description>An object has been updated into the database and reloaded.</description>
<sources>
<source id="cmdbAbstractObject">cmdbAbstractObject</source>
</sources>
<replaces>DBObject::AfterUpdate</replaces>
<event_data>
<event_datum id="object">
<description>The object updated</description>
<type>DBObject</type>
<event_datum id="changes">
<description>For updates, the list of changes done during this operation</description>
<type>array</type>
</event_datum>
<event_datum id="debug_info">
<description>Debug string</description>
@@ -288,7 +270,7 @@
</event_datum>
</event_data>
</event>
<event id="EVENT_DB_DELETE_DONE" _delta="define">
<event id="EVENT_DB_AFTER_DELETE" _delta="define">
<description>An object has been deleted into the database</description>
<sources>
<source id="cmdbAbstractObject">cmdbAbstractObject</source>

View File

@@ -2321,10 +2321,15 @@ class MenuBlock extends DisplayBlock
false
);
// creation form title
if (array_key_exists('creation_in_modal_form_title', $aExtraParams) && $aExtraParams['creation_in_modal_form_title'] !== null) {
$oAddLinkActionButton->AddDataAttribute('modal-title', $aExtraParams['creation_in_modal_form_title']);
}
// - If we are used in a Datatable, 'datatable_' will be prefixed to our $sId, so we do the same here
$sRealId = $sId;
if(in_array($this->m_sStyle, [static::ENUM_STYLE_LIST, 'links', static::ENUM_STYLE_LIST_IN_OBJECT])){
$sRealId = 'datatable_' . $sId;
if (in_array($this->m_sStyle, [static::ENUM_STYLE_LIST, 'links', static::ENUM_STYLE_LIST_IN_OBJECT])) {
$sRealId = 'datatable_'.$sId;
}
$oAddLinkActionButton->AddCSSClasses(['ibo-action-button', 'ibo-regular-action-button'])
->SetOnClickJsCode("$('#$sRealId').trigger('open_creation_modal.object.itop');");

View File

@@ -391,6 +391,11 @@ class LoginWebPage extends NiceWebPage
Session::Unset('can_logoff');
Session::Unset('archive_mode');
Session::Unset('impersonate_user');
Session::Unset('PluginProperties');
Session::Unset('UrlMakerClass');
Session::Unset('itop_env');
Session::Unset('obj_messages');
Session::Unset('profile_list');
UserRights::_ResetSessionCache();
// If it's desired to kill the session, also delete the session cookie.
// Note: This will destroy the session, and not just the session data!

View File

@@ -480,7 +480,7 @@ class utils
// For URL
case static::ENUM_SANITIZATION_FILTER_URL:
$retValue = filter_var($value, FILTER_SANITIZE_URL);
$retValue = filter_var($value, FILTER_VALIDATE_URL);
break;
default:

View File

@@ -13245,27 +13245,11 @@ class AttributeCustomFields extends AttributeDefinition
*/
public function CheckValue(DBObject $oHostObject, $value)
{
try
{
try {
$oHandler = $this->GetHandler($value->GetValues());
$oHandler->BuildForm($oHostObject, '');
$oForm = $oHandler->GetForm();
$oForm->Validate();
if ($oForm->GetValid())
{
$ret = true;
}
else
{
$aMessages = array();
foreach($oForm->GetErrorMessages() as $sFieldId => $aFieldMessages)
{
$aMessages[] = $sFieldId.': '.implode(', ', $aFieldMessages);
}
$ret = 'Invalid value: '.implode(', ', $aMessages);
}
} catch (Exception $e)
{
$ret = $oHandler->Validate($oHostObject);
} catch (Exception $e) {
$ret = $e->getMessage();
}

View File

@@ -47,20 +47,47 @@ abstract class CustomFieldsHandler {
*
* @param $sAttCode
*/
final public function __construct($sAttCode)
{
final public function __construct($sAttCode) {
$this->sAttCode = $sAttCode;
$this->aValues = null;
}
abstract public function BuildForm(DBObject $oHostObject, $sFormId);
/**
* @returns true|string true if no error found, error message otherwise
* @throws \ApplicationException if {@link static::$oForm} attribute not initialized yet
* @since 3.1.0 N°6322 N°1150 Add template_id checks
*/
public function Validate(DBObject $oHostObject) {
if (false === isset($this->oForm)) {
throw new ApplicationException('oForm attribute not init yet. You must call BuildForm before this method !');
}
try {
$this->oForm->Validate();
if ($this->oForm->GetValid()) {
$ret = true;
}
else {
$aMessages = array();
foreach ($this->oForm->GetErrorMessages() as $sFieldId => $aFieldMessages) {
$aMessages[] = $sFieldId.': '.implode(', ', $aFieldMessages);
}
$ret = 'Invalid value: '.implode(', ', $aMessages);
}
} catch (Exception $e) {
$ret = $e->getMessage();
}
return $ret;
}
/**
*
* @return \Combodo\iTop\Form\Form
*/
public function GetForm()
{
public function GetForm() {
return $this->oForm;
}
@@ -69,16 +96,14 @@ abstract class CustomFieldsHandler {
$this->aValues = $aValues;
}
static public function GetPrerequisiteAttributes($sClass = null)
{
public static function GetPrerequisiteAttributes($sClass = null) {
return array();
}
/**
* List the available verbs for 'GetForTemplate'
*/
static public function EnumTemplateVerbs()
{
public static function EnumTemplateVerbs() {
return array();
}

View File

@@ -3066,7 +3066,7 @@ abstract class DBObject implements iDisplay
$this->DoComputeValues();
$this->OnInsert();
$this->FireEventBeforeObjectCreate();
$this->FireEventBeforeWrite();
// If not automatically computed, then check that the key is given by the caller
if (!MetaModel::IsAutoIncrementKey($sRootClass)) {
@@ -3167,7 +3167,7 @@ abstract class DBObject implements iDisplay
MetaModel::StartReentranceProtection($this);
try {
$this->FireEventCreateDone();
$this->FireEventAfterWrite([], true);
$this->AfterInsert();
// Activate any existing trigger
@@ -3278,7 +3278,7 @@ abstract class DBObject implements iDisplay
$this->ComputeStopWatchesDeadline(false);
$this->OnUpdate();
$this->FireEventBeforeObjectUpdate();
$this->FireEventBeforeWrite();
// Freeze the changes at this point
$this->InitPreviousValuesForUpdatedAttributes();
@@ -3457,7 +3457,7 @@ abstract class DBObject implements iDisplay
$this->m_aModifiedAtt = array();
$bModifiedByUpdateDone = false;
try {
$this->FireEventUpdateDone($aChanges);
$this->FireEventAfterWrite($aChanges, false);
$this->AfterUpdate();
// Save the status as it is reset just after...
$bModifiedByUpdateDone = $this->IsModified();
@@ -3495,7 +3495,7 @@ abstract class DBObject implements iDisplay
// Activate any existing trigger
// - TriggerOnObjectMention
// Forgotten by the fix of N°3245
$this->ActivateOnMentionTriggers(false);
$this->ActivateOnMentionTriggers(false, $aChanges);
}
catch (Exception $e)
{
@@ -3569,6 +3569,7 @@ abstract class DBObject implements iDisplay
* Activate TriggerOnObjectMention triggers for the current object
*
* @param bool $bNewlyCreatedObject
* @param array $aChanges Hash array of att. code => att. value of the changed attributes
*
* @throws \ArchivedObjectException
* @throws \CoreException
@@ -3576,11 +3577,12 @@ abstract class DBObject implements iDisplay
* @throws \MySQLException
* @throws \OQLException
* @since 3.0.1 N°4741
* @since 3.1.0 N°6307 Add $aChanges parameter
*/
private function ActivateOnMentionTriggers(bool $bNewlyCreatedObject): void
private function ActivateOnMentionTriggers(bool $bNewlyCreatedObject, array $aChanges = []): void
{
$sClass = get_class($this);
$aChanges = $bNewlyCreatedObject ? $this->m_aOrigValues : $this->ListChanges();
$aChanges = $bNewlyCreatedObject ? $this->m_aOrigValues : $aChanges;
// 1 - Check if any caselog updated
$aUpdatedLogAttCodes = [];
@@ -3824,7 +3826,7 @@ abstract class DBObject implements iDisplay
}
}
$this->FireEventDeleteDone();
$this->FireEventAfterDelete();
$this->AfterDelete();
@@ -6061,37 +6063,17 @@ abstract class DBObject implements iDisplay
* @return void
* @since 3.1.0
*/
protected function FireEventBeforeObjectCreate()
protected function FireEventBeforeWrite()
{
}
/**
* @return void
* @since 3.1.0
*/
protected function FireEventCreateDone(): void
{
}
/////////////
/// UPDATE
///
/**
* @return void
* @since 3.1.0
*/
protected function FireEventBeforeObjectUpdate()
{
}
/**
* @param array $aChanges
* @param bool $bIsNew
*
* @return void
* @since 3.1.0
*/
protected function FireEventUpdateDone(array $aChanges): void
protected function FireEventAfterWrite(array $aChanges, bool $bIsNew): void
{
}
@@ -6113,7 +6095,7 @@ abstract class DBObject implements iDisplay
* @return void
* @since 3.1.0
*/
protected function FireEventDeleteDone(): void
protected function FireEventAfterDelete(): void
{
}

View File

@@ -224,6 +224,10 @@ class DBUnionSearch extends DBSearch
}
/**
* Set the selected classes for this query.
* The selected classes can be either in the selected classes of all the queries,
* or they should exist in all the sub-queries of the union.
*
* @param array $aSelectedClasses array of aliases
*
* @throws \Exception
@@ -236,22 +240,31 @@ class DBUnionSearch extends DBSearch
$aAliasesToColumn = array_flip(array_keys($oFirstSearch->GetSelectedClasses()));
foreach ($aSelectedClasses as $sSelectedAlias) {
if (!isset($aAliasesToColumn[$sSelectedAlias])) {
throw new CoreException("SetSelectedClasses: Invalid class alias $sSelectedAlias");
// The selected class is not in the selected classes of the union,
// try to delegate the feature to the sub-queries
$aSelectedColumns = [];
break;
}
$aSelectedColumns[] = $aAliasesToColumn[$sSelectedAlias];
}
// 1 - change for each search
foreach ($this->aSearches as $iPos => $oSearch)
{
foreach ($this->aSearches as $iPos => $oSearch) {
$aCurrentSelectedAliases = [];
foreach ($aSelectedColumns as $iColumn) {
$aCurrentSelectedAliases[] = $this->aColumnToAliases[$iColumn][$iPos];
if (count($aSelectedColumns) === 0) {
// Default to the list of aliases given
$aCurrentSelectedAliases = $aSelectedClasses;
} else {
// Map the aliases for each query
foreach ($aSelectedColumns as $iColumn) {
$aCurrentSelectedAliases[] = $this->aColumnToAliases[$iColumn][$iPos];
}
}
// Throws an exception if not valid
$oSearch->SetSelectedClasses($aCurrentSelectedAliases);
}
// 2 - update the lowest common ancestors
$this->ComputeSelectedClasses();
}

View File

@@ -20,6 +20,9 @@
<attributes>
<attribute id="ref"/>
</attributes>
<complementary_attributes>
<attribute id="title"></attribute>
</complementary_attributes>
</naming>
<fields_semantic>
<state_attribute>status</state_attribute>
@@ -1281,6 +1284,9 @@
<attributes>
<attribute id="ref"/>
</attributes>
<complementary_attributes>
<attribute id="title"></attribute>
</complementary_attributes>
</naming>
<style>
<icon>../../images/icons/icons8-change-routine.svg</icon>
@@ -2079,6 +2085,9 @@
<attributes>
<attribute id="ref"/>
</attributes>
<complementary_attributes>
<attribute id="title"></attribute>
</complementary_attributes>
</naming>
<style>
<icon>../../images/icons/icons8-change-approved.svg</icon>
@@ -3082,6 +3091,9 @@
<attributes>
<attribute id="ref"/>
</attributes>
<complementary_attributes>
<attribute id="title"></attribute>
</complementary_attributes>
</naming>
<style>
<icon>../../images/icons/icons8-change-normal.svg</icon>
@@ -3777,6 +3789,9 @@
<attributes>
<attribute id="ref"/>
</attributes>
<complementary_attributes>
<attribute id="title"></attribute>
</complementary_attributes>
</naming>
<style>
<icon>../../images/icons/icons8-change-emergency.svg</icon>

View File

@@ -293,3 +293,32 @@ Dict::Add('FR FR', 'French', 'Français', array(
'Class:EmergencyChange/Stimulus:ev_finish' => 'Fermer',
'Class:EmergencyChange/Stimulus:ev_finish+' => '',
));
// 1:n relations custom labels for tooltip and pop-up title
Dict::Add('FR FR', 'French', 'Français', array(
'Class:Change/Attribute:child_changes_list/UI:Links:Create:Button+' => 'Créer un %4$s',
'Class:Change/Attribute:child_changes_list/UI:Links:Create:Modal:Title' => 'Ajouter un %4$s à %2$s',
'Class:Change/Attribute:child_changes_list/UI:Links:Remove:Button+' => 'Retirer ce %4$s',
'Class:Change/Attribute:child_changes_list/UI:Links:Remove:Modal:Title' => 'Retirer ce %4$s de son %1$s',
'Class:Change/Attribute:child_changes_list/UI:Links:Delete:Button+' => 'Supprimer ce %4$s',
'Class:Change/Attribute:child_changes_list/UI:Links:Delete:Modal:Title' => 'Supprimer un %4$s',
'Class:Change/Attribute:related_incident_list/UI:Links:Create:Button+' => 'Créer un %4$s',
'Class:Change/Attribute:related_incident_list/UI:Links:Create:Modal:Title' => 'Ajouter un %4$s à %2$s',
'Class:Change/Attribute:related_incident_list/UI:Links:Remove:Button+' => 'Retirer ce %4$s',
'Class:Change/Attribute:related_incident_list/UI:Links:Remove:Modal:Title' => 'Retirer ce %4$s de son %1$s',
'Class:Change/Attribute:related_incident_list/UI:Links:Delete:Button+' => 'Supprimer ce %4$s',
'Class:Change/Attribute:related_incident_list/UI:Links:Delete:Modal:Title' => 'Supprimer un %4$s',
'Class:Change/Attribute:related_problems_list/UI:Links:Create:Button+' => 'Créer un %4$s',
'Class:Change/Attribute:related_problems_list/UI:Links:Create:Modal:Title' => 'Ajouter un %4$s à %2$s',
'Class:Change/Attribute:related_problems_list/UI:Links:Remove:Button+' => 'Retirer ce %4$s',
'Class:Change/Attribute:related_problems_list/UI:Links:Remove:Modal:Title' => 'Retirer ce %4$s de son %1$s',
'Class:Change/Attribute:related_problems_list/UI:Links:Delete:Button+' => 'Supprimer ce %4$s',
'Class:Change/Attribute:related_problems_list/UI:Links:Delete:Modal:Title' => 'Supprimer un %4$s',
'Class:Change/Attribute:related_request_list/UI:Links:Create:Button+' => 'Créer une %4$s',
'Class:Change/Attribute:related_request_list/UI:Links:Create:Modal:Title' => 'Ajouter une %4$s à %2$s',
'Class:Change/Attribute:related_request_list/UI:Links:Remove:Button+' => 'Retirer cette %4$s',
'Class:Change/Attribute:related_request_list/UI:Links:Remove:Modal:Title' => 'Retirer cette %4$s de son %1$s',
'Class:Change/Attribute:related_request_list/UI:Links:Delete:Button+' => 'Supprimer cette %4$s',
'Class:Change/Attribute:related_request_list/UI:Links:Delete:Modal:Title' => 'Supprimer une %4$s',
));

View File

@@ -20,6 +20,9 @@
<attributes>
<attribute id="ref"/>
</attributes>
<complementary_attributes>
<attribute id="title"></attribute>
</complementary_attributes>
</naming>
<fields_semantic>
<state_attribute>status</state_attribute>

View File

@@ -139,3 +139,32 @@ Dict::Add('FR FR', 'French', 'Français', array(
'Class:Change/Attribute:outage/Value:yes' => 'Oui',
'Class:Change/Attribute:outage/Value:yes+' => '',
));
// 1:n relations custom labels for tooltip and pop-up title
Dict::Add('FR FR', 'French', 'Français', array(
'Class:Change/Attribute:child_changes_list/UI:Links:Create:Button+' => 'Créer un %4$s',
'Class:Change/Attribute:child_changes_list/UI:Links:Create:Modal:Title' => 'Ajouter un %4$s à %2$s',
'Class:Change/Attribute:child_changes_list/UI:Links:Remove:Button+' => 'Retirer ce %4$s',
'Class:Change/Attribute:child_changes_list/UI:Links:Remove:Modal:Title' => 'Retirer ce %4$s de son %1$s',
'Class:Change/Attribute:child_changes_list/UI:Links:Delete:Button+' => 'Supprimer ce %4$s',
'Class:Change/Attribute:child_changes_list/UI:Links:Delete:Modal:Title' => 'Supprimer un %4$s',
'Class:Change/Attribute:related_incident_list/UI:Links:Create:Button+' => 'Créer un %4$s',
'Class:Change/Attribute:related_incident_list/UI:Links:Create:Modal:Title' => 'Ajouter un %4$s à %2$s',
'Class:Change/Attribute:related_incident_list/UI:Links:Remove:Button+' => 'Retirer ce %4$s',
'Class:Change/Attribute:related_incident_list/UI:Links:Remove:Modal:Title' => 'Retirer ce %4$s de son %1$s',
'Class:Change/Attribute:related_incident_list/UI:Links:Delete:Button+' => 'Supprimer ce %4$s',
'Class:Change/Attribute:related_incident_list/UI:Links:Delete:Modal:Title' => 'Supprimer un %4$s',
'Class:Change/Attribute:related_problems_list/UI:Links:Create:Button+' => 'Créer un %4$s',
'Class:Change/Attribute:related_problems_list/UI:Links:Create:Modal:Title' => 'Ajouter un %4$s à %2$s',
'Class:Change/Attribute:related_problems_list/UI:Links:Remove:Button+' => 'Retirer ce %4$s',
'Class:Change/Attribute:related_problems_list/UI:Links:Remove:Modal:Title' => 'Retirer ce %4$s de son %1$s',
'Class:Change/Attribute:related_problems_list/UI:Links:Delete:Button+' => 'Supprimer ce %4$s',
'Class:Change/Attribute:related_problems_list/UI:Links:Delete:Modal:Title' => 'Supprimer un %4$s',
'Class:Change/Attribute:related_request_list/UI:Links:Create:Button+' => 'Créer une %4$s',
'Class:Change/Attribute:related_request_list/UI:Links:Create:Modal:Title' => 'Ajouter une %4$s à %2$s',
'Class:Change/Attribute:related_request_list/UI:Links:Remove:Button+' => 'Retirer cette %4$s',
'Class:Change/Attribute:related_request_list/UI:Links:Remove:Modal:Title' => 'Retirer cette %4$s de son %1$s',
'Class:Change/Attribute:related_request_list/UI:Links:Delete:Button+' => 'Supprimer cette %4$s',
'Class:Change/Attribute:related_request_list/UI:Links:Delete:Modal:Title' => 'Supprimer une %4$s',
));

View File

@@ -1243,6 +1243,28 @@
</item>
</items>
</list>
<summary>
<items>
<item id="org_id">
<rank>10</rank>
</item>
<item id="business_criticity">
<rank>20</rank>
</item>
<item id="location_id">
<rank>30</rank>
</item>
<item id="rack_id">
<rank>40</rank>
</item>
<item id="networkdevicetype_id">
<rank>60</rank>
</item>
<item id="model_id">
<rank>80</rank>
</item>
</items>
</summary>
</presentation>
<methods/>
<relations>
@@ -1564,6 +1586,28 @@
</item>
</items>
</list>
<summary>
<items>
<item id="org_id">
<rank>10</rank>
</item>
<item id="business_criticity">
<rank>20</rank>
</item>
<item id="location_id">
<rank>30</rank>
</item>
<item id="rack_id">
<rank>40</rank>
</item>
<item id="enclosure_id">
<rank>50</rank>
</item>
<item id="model_id">
<rank>60</rank>
</item>
</items>
</summary>
</presentation>
<methods/>
</class>
@@ -1720,6 +1764,19 @@
</item>
</items>
</list>
<summary>
<items>
<item id="org_id">
<rank>10</rank>
</item>
<item id="business_criticity">
<rank>20</rank>
</item>
<item id="description">
<rank>30</rank>
</item>
</items>
</summary>
</presentation>
<methods/>
<relations>
@@ -1862,6 +1919,19 @@
</item>
</items>
</list>
<summary>
<items>
<item id="org_id">
<rank>10</rank>
</item>
<item id="business_criticity">
<rank>20</rank>
</item>
<item id="description">
<rank>30</rank>
</item>
</items>
</summary>
</presentation>
<methods/>
</class>
@@ -2189,6 +2259,28 @@
</item>
</items>
</list>
<summary>
<items>
<item id="org_id">
<rank>10</rank>
</item>
<item id="business_criticity">
<rank>20</rank>
</item>
<item id="system_id">
<rank>30</rank>
</item>
<item id="software_id">
<rank>40</rank>
</item>
<item id="softwarelicence_id">
<rank>50</rank>
</item>
<item id="description">
<rank>60</rank>
</item>
</items>
</summary>
</presentation>
<methods/>
<relations>
@@ -2323,6 +2415,28 @@
</item>
</items>
</list>
<summary>
<items>
<item id="org_id">
<rank>10</rank>
</item>
<item id="business_criticity">
<rank>20</rank>
</item>
<item id="system_id">
<rank>30</rank>
</item>
<item id="software_id">
<rank>40</rank>
</item>
<item id="softwarelicence_id">
<rank>50</rank>
</item>
<item id="description">
<rank>60</rank>
</item>
</items>
</summary>
</presentation>
<methods/>
<relations>
@@ -2457,6 +2571,28 @@
</item>
</items>
</list>
<summary>
<items>
<item id="org_id">
<rank>10</rank>
</item>
<item id="business_criticity">
<rank>20</rank>
</item>
<item id="system_id">
<rank>30</rank>
</item>
<item id="software_id">
<rank>40</rank>
</item>
<item id="softwarelicence_id">
<rank>50</rank>
</item>
<item id="description">
<rank>60</rank>
</item>
</items>
</summary>
</presentation>
<methods/>
<relations>
@@ -2578,6 +2714,28 @@
</item>
</items>
</list>
<summary>
<items>
<item id="org_id">
<rank>10</rank>
</item>
<item id="business_criticity">
<rank>20</rank>
</item>
<item id="system_id">
<rank>30</rank>
</item>
<item id="software_id">
<rank>40</rank>
</item>
<item id="softwarelicence_id">
<rank>50</rank>
</item>
<item id="description">
<rank>60</rank>
</item>
</items>
</summary>
</presentation>
</class>
<class id="OtherSoftware" _delta="define">
@@ -2689,6 +2847,28 @@
</item>
</items>
</list>
<summary>
<items>
<item id="org_id">
<rank>10</rank>
</item>
<item id="business_criticity">
<rank>20</rank>
</item>
<item id="system_id">
<rank>30</rank>
</item>
<item id="software_id">
<rank>40</rank>
</item>
<item id="softwarelicence_id">
<rank>50</rank>
</item>
<item id="description">
<rank>60</rank>
</item>
</items>
</summary>
</presentation>
</class>
<class id="MiddlewareInstance" _delta="define">
@@ -2811,6 +2991,22 @@
</item>
</items>
</list>
<summary>
<items>
<item id="org_id">
<rank>10</rank>
</item>
<item id="middleware_id">
<rank>20</rank>
</item>
<item id="business_criticity">
<rank>30</rank>
</item>
<item id="description">
<rank>40</rank>
</item>
</items>
</summary>
</presentation>
<methods/>
</class>
@@ -2829,6 +3025,7 @@
</attributes>
<complementary_attributes>
<attribute id="organization_name"></attribute>
<attribute id="dbserver_name"></attribute>
</complementary_attributes>
</naming>
<style>
@@ -2931,6 +3128,22 @@
</item>
</items>
</list>
<summary>
<items>
<item id="org_id">
<rank>10</rank>
</item>
<item id="dbserver_id">
<rank>20</rank>
</item>
<item id="business_criticity">
<rank>30</rank>
</item>
<item id="description">
<rank>40</rank>
</item>
</items>
</summary>
</presentation>
<methods/>
</class>
@@ -3040,12 +3253,15 @@
<item id="org_id">
<rank>20</rank>
</item>
<item id="business_criticity">
<item id="webserver_id">
<rank>30</rank>
</item>
<item id="move2production">
<item id="business_criticity">
<rank>40</rank>
</item>
<item id="move2production">
<rank>50</rank>
</item>
</items>
</search>
<list>
@@ -3053,14 +3269,36 @@
<item id="org_id">
<rank>10</rank>
</item>
<item id="business_criticity">
<item id="webserver_id">
<rank>20</rank>
</item>
<item id="move2production">
<item id="business_criticity">
<rank>30</rank>
</item>
<item id="move2production">
<rank>40</rank>
</item>
</items>
</list>
<summary>
<items>
<item id="org_id">
<rank>10</rank>
</item>
<item id="webserver_id">
<rank>20</rank>
</item>
<item id="url">
<rank>30</rank>
</item>
<item id="business_criticity">
<rank>40</rank>
</item>
<item id="description">
<rank>50</rank>
</item>
</items>
</summary>
</presentation>
<methods/>
</class>
@@ -3177,16 +3415,16 @@
<item id="name">
<rank>10</rank>
</item>
<item id="vendor">
<item id="version">
<rank>20</rank>
</item>
<item id="version">
<item id="vendor">
<rank>30</rank>
</item>
<item id="documents_list">
<item id="type">
<rank>40</rank>
</item>
<item id="type">
<item id="documents_list">
<rank>50</rank>
</item>
<item id="softwareinstance_list">
@@ -3234,14 +3472,27 @@
<item id="vendor">
<rank>10</rank>
</item>
<item id="type">
<rank>20</rank>
</item>
</items>
</list>
<summary>
<items>
<item id="name">
<rank>10</rank>
</item>
<item id="version">
<rank>10</rank>
</item>
<item id="vendor">
<rank>20</rank>
</item>
<item id="type">
<rank>30</rank>
</item>
</items>
</list>
</summary>
</presentation>
</class>
<class id="Patch" _delta="define">
@@ -3393,10 +3644,10 @@
<item id="functionalcis_list">
<rank>30</rank>
</item>
<item id="description">
<item id="osversion_id">
<rank>40</rank>
</item>
<item id="osversion_id">
<item id="description">
<rank>50</rank>
</item>
</items>
@@ -3406,10 +3657,10 @@
<item id="name">
<rank>10</rank>
</item>
<item id="description">
<item id="osversion_id">
<rank>20</rank>
</item>
<item id="osversion_id">
<item id="description">
<rank>30</rank>
</item>
</items>
@@ -3424,6 +3675,16 @@
</item>
</items>
</list>
<summary>
<items>
<item id="osversion_id">
<rank>10</rank>
</item>
<item id="description">
<rank>20</rank>
</item>
</items>
</summary>
</presentation>
</class>
<class id="SoftwarePatch" _delta="define">
@@ -3517,6 +3778,16 @@
</item>
</items>
</list>
<summary>
<items>
<item id="software_id">
<rank>10</rank>
</item>
<item id="description">
<rank>20</rank>
</item>
</items>
</summary>
</presentation>
</class>
<class id="Licence" _delta="define">
@@ -3853,6 +4124,19 @@
</item>
</items>
</list>
<summary>
<items>
<item id="osversion_id">
<rank>10</rank>
</item>
<item id="org_id">
<rank>20</rank>
</item>
<item id="description">
<rank>30</rank>
</item>
</items>
</summary>
</presentation>
</class>
<class id="SoftwareLicence" _delta="define">
@@ -3990,6 +4274,23 @@
</item>
</items>
</list>
<summary>
<items>
<item id="software_id">
<rank>10</rank>
</item>
<item id="org_id">
<rank>20</rank>
</item>
<item id="description">
<rank>40</rank>
</item>
<item id="licence_key">
<rank>70</rank>
</item>
</items>
</summary>
</presentation>
</class>
<class id="lnkDocumentToLicence" _delta="define">
@@ -4441,6 +4742,16 @@
</item>
</items>
</list>
<summary>
<items>
<item id="brand_id">
<rank>10</rank>
</item>
<item id="type">
<rank>20</rank>
</item>
</items>
</summary>
</presentation>
</class>
<class id="NetworkDeviceType" _delta="define">
@@ -5338,6 +5649,25 @@
</item>
</items>
</list>
<summary>
<items>
<item id="ip">
<rank>10</rank>
</item>
<item id="ip_mask">
<rank>20</rank>
</item>
<item id="subnet_name">
<rank>25</rank>
</item>
<item id="org_id">
<rank>30</rank>
</item>
<item id="description">
<rank>40</rank>
</item>
</items>
</summary>
</presentation>
</class>
<class id="VLAN" _delta="define">
@@ -5353,6 +5683,9 @@
<attributes>
<attribute id="vlan_tag"/>
</attributes>
<complementary_attributes>
<attribute id="org_name"></attribute>
</complementary_attributes>
</naming>
<style>
<icon>../../images/icons/icons8-hierarchy.svg</icon>
@@ -5457,6 +5790,16 @@
</item>
</items>
</list>
<summary>
<items>
<item id="org_id">
<rank>10</rank>
</item>
<item id="description">
<rank>20</rank>
</item>
</items>
</summary>
</presentation>
</class>
<class id="lnkSubnetToVLAN" _delta="define">
@@ -5809,6 +6152,14 @@
<extkey_attcode>connectableci_id</extkey_attcode>
<target_attcode>name</target_attcode>
</field>
<field id="org_id" xsi:type="AttributeExternalField">
<extkey_attcode>connectableci_id</extkey_attcode>
<target_attcode>org_id</target_attcode>
</field>
<field id="location_id" xsi:type="AttributeExternalField">
<extkey_attcode>connectableci_id</extkey_attcode>
<target_attcode>location_id</target_attcode>
</field>
<field id="vlans_list" xsi:type="AttributeLinkedSetIndirect">
<linked_class>lnkPhysicalInterfaceToVLAN</linked_class>
<ext_key_to_me>physicalinterface_id</ext_key_to_me>
@@ -5829,27 +6180,33 @@
<item id="connectableci_id">
<rank>20</rank>
</item>
<item id="ipaddress">
<item id="location_id">
<rank>30</rank>
</item>
<item id="macaddress">
<item id="org_id">
<rank>40</rank>
</item>
<item id="comment">
<item id="ipaddress">
<rank>50</rank>
</item>
<item id="ipgateway">
<item id="macaddress">
<rank>60</rank>
</item>
<item id="ipmask">
<item id="comment">
<rank>70</rank>
</item>
<item id="speed">
<item id="ipgateway">
<rank>80</rank>
</item>
<item id="vlans_list">
<item id="ipmask">
<rank>90</rank>
</item>
<item id="speed">
<rank>100</rank>
</item>
<item id="vlans_list">
<rank>110</rank>
</item>
</items>
</details>
<search>
@@ -5890,6 +6247,22 @@
</item>
</items>
</list>
<summary>
<items>
<item id="ipaddress">
<rank>10</rank>
</item>
<item id="connectableci_id">
<rank>20</rank>
</item>
<item id="location_id">
<rank>30</rank>
</item>
<item id="org_id">
<rank>40</rank>
</item>
</items>
</summary>
</presentation>
</class>
<class id="lnkPhysicalInterfaceToVLAN" _delta="define">
@@ -6664,6 +7037,22 @@
</item>
</items>
</list>
<summary>
<items>
<item id="org_id">
<rank>10</rank>
</item>
<item id="type">
<rank>20</rank>
</item>
<item id="description">
<rank>30</rank>
</item>
<item id="parent_id">
<rank>40</rank>
</item>
</items>
</summary>
</presentation>
</class>
<class id="lnkGroupToCI" _delta="define">

View File

@@ -460,7 +460,7 @@ Dict::Add('EN US', 'English', 'English', array(
Dict::Add('EN US', 'English', 'English', array(
'Class:PDU' => 'PDU',
'Class:PDU+' => '',
'Class:PDU/ComplementaryName' => '%1$s - %2$s - %3$s',
'Class:PDU/ComplementaryName' => '%1$s - %2$s - %3$s - %4$s',
'Class:PDU/Attribute:rack_id' => 'Rack',
'Class:PDU/Attribute:rack_id+' => '',
'Class:PDU/Attribute:rack_name' => 'Rack name',
@@ -640,6 +640,7 @@ Dict::Add('EN US', 'English', 'English', array(
Dict::Add('EN US', 'English', 'English', array(
'Class:DatabaseSchema' => 'Database Schema',
'Class:DatabaseSchema+' => '',
'Class:DatabaseSchema/ComplementaryName' => '%1$s - %2$s',
'Class:DatabaseSchema/Attribute:dbserver_id' => 'DB server',
'Class:DatabaseSchema/Attribute:dbserver_id+' => '',
'Class:DatabaseSchema/Attribute:dbserver_name' => 'DB server name',

View File

@@ -1579,4 +1579,189 @@ Dict::Add('FR FR', 'French', 'Français', array(
'Menu:Software' => 'Catalogue des logiciels de références',
'Menu:Software+' => 'Catalogue des logiciels de références',
));
//
// n:n relations custom labels : nom de class féminin
//
Dict::Add('FR FR', 'French', 'Français', array(
'Class:BusinessProcess/Attribute:applicationsolutions_list/UI:Links:Add:Button+' => 'Ajouter une %4$s',
'Class:BusinessProcess/Attribute:applicationsolutions_list/UI:Links:Remove:Modal:Title' => 'Retirer une %4$s',
'Class:BusinessProcess/Attribute:applicationsolutions_list/UI:Links:Add:Modal:Title' => 'Ajouter une %4$s à %2$s',
'Class:BusinessProcess/Attribute:applicationsolutions_list/UI:Links:Remove:Button+' => 'Retirer cette %4$s',
'Class:FunctionalCI/Attribute:applicationsolution_list/UI:Links:Add:Button+' => 'Ajouter une %4$s',
'Class:FunctionalCI/Attribute:applicationsolution_list/UI:Links:Remove:Modal:Title' => 'Retirer une %4$s',
'Class:FunctionalCI/Attribute:applicationsolution_list/UI:Links:Add:Modal:Title' => 'Ajouter une %4$s à %2$s',
'Class:FunctionalCI/Attribute:applicationsolution_list/UI:Links:Remove:Button+' => 'Retirer cette %4$s',
'Class:SoftwarePatch/Attribute:softwareinstances_list/UI:Links:Add:Button+' => 'Ajouter une %4$s',
'Class:SoftwarePatch/Attribute:softwareinstances_list/UI:Links:Remove:Modal:Title' => 'Retirer une %4$s',
'Class:SoftwarePatch/Attribute:softwareinstances_list/UI:Links:Add:Modal:Title' => 'Ajouter une %4$s à %2$s',
'Class:SoftwarePatch/Attribute:softwareinstances_list/UI:Links:Remove:Button+' => 'Retirer cette %4$s',
'Class:VLAN/Attribute:physicalinterfaces_list/UI:Links:Add:Button+' => 'Ajouter une %4$s',
'Class:VLAN/Attribute:physicalinterfaces_list/UI:Links:Remove:Modal:Title' => 'Retirer une %4$s',
'Class:VLAN/Attribute:physicalinterfaces_list/UI:Links:Add:Modal:Title' => 'Ajouter une %4$s à %2$s',
'Class:VLAN/Attribute:physicalinterfaces_list/UI:Links:Remove:Button+' => 'Retirer cette %4$s',
));
// 1:n relations custom labels for tooltip and pop-up title
Dict::Add('FR FR', 'French', 'Français', array(
'Class:Brand/Attribute:physicaldevices_list/UI:Links:Create:Button+' => 'Créer un %4$s',
'Class:Brand/Attribute:physicaldevices_list/UI:Links:Create:Modal:Title' => 'Ajouter un %4$s à %2$s',
'Class:Brand/Attribute:physicaldevices_list/UI:Links:Remove:Button+' => 'Retirer ce %4$s',
'Class:Brand/Attribute:physicaldevices_list/UI:Links:Remove:Modal:Title' => 'Retirer ce %4$s de sa %1$s',
'Class:Brand/Attribute:physicaldevices_list/UI:Links:Delete:Button+' => 'Supprimer ce %4$s',
'Class:Brand/Attribute:physicaldevices_list/UI:Links:Delete:Modal:Title' => 'Supprimer un %4$s',
'Class:ConnectableCI/Attribute:physicalinterface_list/UI:Links:Create:Button+' => 'Créer une %4$s',
'Class:ConnectableCI/Attribute:physicalinterface_list/UI:Links:Create:Modal:Title' => 'Ajouter une %4$s à %2$s',
'Class:ConnectableCI/Attribute:physicalinterface_list/UI:Links:Remove:Button+' => 'Retirer cette %4$s',
'Class:ConnectableCI/Attribute:physicalinterface_list/UI:Links:Remove:Modal:Title' => 'Retirer cette %4$s de son %1$s',
'Class:ConnectableCI/Attribute:physicalinterface_list/UI:Links:Delete:Button+' => 'Supprimer cette %4$s',
'Class:ConnectableCI/Attribute:physicalinterface_list/UI:Links:Delete:Modal:Title' => 'Supprimer une %4$s',
'Class:DatacenterDevice/Attribute:fiberinterfacelist_list/UI:Links:Create:Button+' => 'Créer une %4$s',
'Class:DatacenterDevice/Attribute:fiberinterfacelist_list/UI:Links:Create:Modal:Title' => 'Ajouter une %4$s à %2$s',
'Class:DatacenterDevice/Attribute:fiberinterfacelist_list/UI:Links:Remove:Button+' => 'Retirer cette %4$s',
'Class:DatacenterDevice/Attribute:fiberinterfacelist_list/UI:Links:Remove:Modal:Title' => 'Retirer cette %4$s de son %1$s',
'Class:DatacenterDevice/Attribute:fiberinterfacelist_list/UI:Links:Delete:Button+' => 'Supprimer cette %4$s',
'Class:DatacenterDevice/Attribute:fiberinterfacelist_list/UI:Links:Delete:Modal:Title' => 'Supprimer une %4$s',
'Class:DBServer/Attribute:dbschema_list/UI:Links:Create:Button+' => 'Créer une %4$s',
'Class:DBServer/Attribute:dbschema_list/UI:Links:Create:Modal:Title' => 'Ajouter une %4$s à %2$s',
'Class:DBServer/Attribute:dbschema_list/UI:Links:Remove:Button+' => 'Retirer cette %4$s',
'Class:DBServer/Attribute:dbschema_list/UI:Links:Remove:Modal:Title' => 'Retirer cette %4$s de son %1$s',
'Class:DBServer/Attribute:dbschema_list/UI:Links:Delete:Button+' => 'Supprimer cette %4$s',
'Class:DBServer/Attribute:dbschema_list/UI:Links:Delete:Modal:Title' => 'Supprimer une %4$s',
'Class:Enclosure/Attribute:device_list/UI:Links:Create:Button+' => 'Créer un %4$s',
'Class:Enclosure/Attribute:device_list/UI:Links:Create:Modal:Title' => 'Ajouter un %4$s à %2$s',
'Class:Enclosure/Attribute:device_list/UI:Links:Remove:Button+' => 'Retirer ce %4$s',
'Class:Enclosure/Attribute:device_list/UI:Links:Remove:Modal:Title' => 'Retirer ce %4$s de son %1$s',
'Class:Enclosure/Attribute:device_list/UI:Links:Delete:Button+' => 'Supprimer ce %4$s',
'Class:Enclosure/Attribute:device_list/UI:Links:Delete:Modal:Title' => 'Supprimer un %4$s',
'Class:Farm/Attribute:hypervisor_list/UI:Links:Create:Button+' => 'Créer un %4$s',
'Class:Farm/Attribute:hypervisor_list/UI:Links:Create:Modal:Title' => 'Ajouter un %4$s à %2$s',
'Class:Farm/Attribute:hypervisor_list/UI:Links:Remove:Button+' => 'Retirer ce %4$s',
'Class:Farm/Attribute:hypervisor_list/UI:Links:Remove:Modal:Title' => 'Retirer ce %4$s de son %1$s',
'Class:Farm/Attribute:hypervisor_list/UI:Links:Delete:Button+' => 'Supprimer ce %4$s',
'Class:Farm/Attribute:hypervisor_list/UI:Links:Delete:Modal:Title' => 'Supprimer un %4$s',
'Class:FunctionalCI/Attribute:softwares_list/UI:Links:Create:Button+' => 'Créer une %4$s',
'Class:FunctionalCI/Attribute:softwares_list/UI:Links:Create:Modal:Title' => 'Ajouter une %4$s à %2$s',
'Class:FunctionalCI/Attribute:softwares_list/UI:Links:Remove:Button+' => 'Retirer cette %4$s',
'Class:FunctionalCI/Attribute:softwares_list/UI:Links:Remove:Modal:Title' => 'Retirer cette %4$s de son %1$s',
'Class:FunctionalCI/Attribute:softwares_list/UI:Links:Delete:Button+' => 'Supprimer cette %4$s',
'Class:FunctionalCI/Attribute:softwares_list/UI:Links:Delete:Modal:Title' => 'Supprimer une %4$s',
'Class:Location/Attribute:physicaldevice_list/UI:Links:Create:Button+' => 'Créer un %4$s',
'Class:Location/Attribute:physicaldevice_list/UI:Links:Create:Modal:Title' => 'Ajouter un %4$s à %2$s',
'Class:Location/Attribute:physicaldevice_list/UI:Links:Remove:Button+' => 'Retirer ce %4$s',
'Class:Location/Attribute:physicaldevice_list/UI:Links:Remove:Modal:Title' => 'Retirer ce %4$s de son %1$s',
'Class:Location/Attribute:physicaldevice_list/UI:Links:Delete:Button+' => 'Supprimer ce %4$s',
'Class:Location/Attribute:physicaldevice_list/UI:Links:Delete:Modal:Title' => 'Supprimer un %4$s',
'Class:Middleware/Attribute:middlewareinstance_list/UI:Links:Create:Button+' => 'Créer une %4$s',
'Class:Middleware/Attribute:middlewareinstance_list/UI:Links:Create:Modal:Title' => 'Ajouter une %4$s à %2$s',
'Class:Middleware/Attribute:middlewareinstance_list/UI:Links:Remove:Button+' => 'Retirer cette %4$s',
'Class:Middleware/Attribute:middlewareinstance_list/UI:Links:Remove:Modal:Title' => 'Retirer cette %4$s de son %1$s',
'Class:Middleware/Attribute:middlewareinstance_list/UI:Links:Delete:Button+' => 'Supprimer cette %4$s',
'Class:Middleware/Attribute:middlewareinstance_list/UI:Links:Delete:Modal:Title' => 'Supprimer une %4$s',
'Class:Model/Attribute:physicaldevices_list/UI:Links:Create:Button+' => 'Créer un %4$s',
'Class:Model/Attribute:physicaldevices_list/UI:Links:Create:Modal:Title' => 'Ajouter un %4$s à %2$s',
'Class:Model/Attribute:physicaldevices_list/UI:Links:Remove:Button+' => 'Retirer ce %4$s',
'Class:Model/Attribute:physicaldevices_list/UI:Links:Remove:Modal:Title' => 'Retirer ce %4$s de son %1$s',
'Class:Model/Attribute:physicaldevices_list/UI:Links:Delete:Button+' => 'Supprimer ce %4$s',
'Class:Model/Attribute:physicaldevices_list/UI:Links:Delete:Modal:Title' => 'Supprimer un %4$s',
'Class:NAS/Attribute:nasfilesystem_list/UI:Links:Create:Button+' => 'Créer un %4$s',
'Class:NAS/Attribute:nasfilesystem_list/UI:Links:Create:Modal:Title' => 'Ajouter un %4$s à %2$s',
'Class:NAS/Attribute:nasfilesystem_list/UI:Links:Remove:Button+' => 'Retirer ce %4$s',
'Class:NAS/Attribute:nasfilesystem_list/UI:Links:Remove:Modal:Title' => 'Retirer ce %4$s de son %1$s',
'Class:NAS/Attribute:nasfilesystem_list/UI:Links:Delete:Button+' => 'Supprimer ce %4$s',
'Class:NAS/Attribute:nasfilesystem_list/UI:Links:Delete:Modal:Title' => 'Supprimer un %4$s',
'Class:NetworkDeviceType/Attribute:networkdevicesdevices_list/UI:Links:Create:Button+' => 'Créer un %4$s',
'Class:NetworkDeviceType/Attribute:networkdevicesdevices_list/UI:Links:Create:Modal:Title' => 'Ajouter un %4$s à %2$s',
'Class:NetworkDeviceType/Attribute:networkdevicesdevices_list/UI:Links:Remove:Button+' => 'Retirer ce %4$s',
'Class:NetworkDeviceType/Attribute:networkdevicesdevices_list/UI:Links:Remove:Modal:Title' => 'Retirer ce %4$s de son %1$s',
'Class:NetworkDeviceType/Attribute:networkdevicesdevices_list/UI:Links:Delete:Button+' => 'Supprimer ce %4$s',
'Class:NetworkDeviceType/Attribute:networkdevicesdevices_list/UI:Links:Delete:Modal:Title' => 'Supprimer un %4$s',
'Class:OSLicence/Attribute:servers_list/UI:Links:Create:Button+' => 'Créer un %4$s',
'Class:OSLicence/Attribute:servers_list/UI:Links:Create:Modal:Title' => 'Ajouter un %4$s à %2$s',
'Class:OSLicence/Attribute:servers_list/UI:Links:Remove:Button+' => 'Retirer ce %4$s',
'Class:OSLicence/Attribute:servers_list/UI:Links:Remove:Modal:Title' => 'Retirer ce %4$s de sa %1$s',
'Class:OSLicence/Attribute:servers_list/UI:Links:Delete:Button+' => 'Supprimer ce %4$s',
'Class:OSLicence/Attribute:servers_list/UI:Links:Delete:Modal:Title' => 'Supprimer un %4$s',
'Class:OSLicence/Attribute:virtualmachines_list/UI:Links:Create:Button+' => 'Créer une %4$s',
'Class:OSLicence/Attribute:virtualmachines_list/UI:Links:Create:Modal:Title' => 'Ajouter une %4$s à %2$s',
'Class:OSLicence/Attribute:virtualmachines_list/UI:Links:Remove:Button+' => 'Retirer cette %4$s',
'Class:OSLicence/Attribute:virtualmachines_list/UI:Links:Remove:Modal:Title' => 'Retirer cette %4$s de sa %1$s',
'Class:OSLicence/Attribute:virtualmachines_list/UI:Links:Delete:Button+' => 'Supprimer cette %4$s',
'Class:OSLicence/Attribute:virtualmachines_list/UI:Links:Delete:Modal:Title' => 'Supprimer une %4$s',
'Class:PowerSource/Attribute:pdus_list/UI:Links:Create:Button+' => 'Créer un %4$s',
'Class:PowerSource/Attribute:pdus_list/UI:Links:Create:Modal:Title' => 'Ajouter un %4$s à %2$s',
'Class:PowerSource/Attribute:pdus_list/UI:Links:Remove:Button+' => 'Retirer ce %4$s',
'Class:PowerSource/Attribute:pdus_list/UI:Links:Remove:Modal:Title' => 'Retirer ce %4$s de son %1$s',
'Class:PowerSource/Attribute:pdus_list/UI:Links:Delete:Button+' => 'Supprimer ce %4$s',
'Class:PowerSource/Attribute:pdus_list/UI:Links:Delete:Modal:Title' => 'Supprimer un %4$s',
'Class:Rack/Attribute:device_list/UI:Links:Create:Button+' => 'Créer un %4$s',
'Class:Rack/Attribute:device_list/UI:Links:Create:Modal:Title' => 'Ajouter un %4$s à %2$s',
'Class:Rack/Attribute:device_list/UI:Links:Remove:Button+' => 'Retirer ce %4$s',
'Class:Rack/Attribute:device_list/UI:Links:Remove:Modal:Title' => 'Retirer ce %4$s de son %1$s',
'Class:Rack/Attribute:device_list/UI:Links:Delete:Button+' => 'Supprimer ce %4$s',
'Class:Rack/Attribute:device_list/UI:Links:Delete:Modal:Title' => 'Supprimer un %4$s',
'Class:Rack/Attribute:enclosure_list/UI:Links:Create:Button+' => 'Créer un %4$s',
'Class:Rack/Attribute:enclosure_list/UI:Links:Create:Modal:Title' => 'Ajouter un %4$s à %2$s',
'Class:Rack/Attribute:enclosure_list/UI:Links:Remove:Button+' => 'Retirer ce %4$s',
'Class:Rack/Attribute:enclosure_list/UI:Links:Remove:Modal:Title' => 'Retirer ce %4$s de son %1$s',
'Class:Rack/Attribute:enclosure_list/UI:Links:Delete:Button+' => 'Supprimer ce %4$s',
'Class:Rack/Attribute:enclosure_list/UI:Links:Delete:Modal:Title' => 'Supprimer un %4$s',
'Class:Software/Attribute:softwareinstance_list/UI:Links:Create:Button+' => 'Créer une %4$s',
'Class:Software/Attribute:softwareinstance_list/UI:Links:Create:Modal:Title' => 'Ajouter une %4$s à %2$s',
'Class:Software/Attribute:softwareinstance_list/UI:Links:Remove:Button+' => 'Retirer cette %4$s',
'Class:Software/Attribute:softwareinstance_list/UI:Links:Remove:Modal:Title' => 'Retirer cette %4$s de son %1$s',
'Class:Software/Attribute:softwareinstance_list/UI:Links:Delete:Button+' => 'Supprimer cette %4$s',
'Class:Software/Attribute:softwareinstance_list/UI:Links:Delete:Modal:Title' => 'Supprimer une %4$s',
'Class:Software/Attribute:softwarelicence_list/UI:Links:Create:Button+' => 'Créer une %4$s',
'Class:Software/Attribute:softwarelicence_list/UI:Links:Create:Modal:Title' => 'Ajouter une %4$s à %2$s',
'Class:Software/Attribute:softwarelicence_list/UI:Links:Remove:Button+' => 'Retirer cette %4$s',
'Class:Software/Attribute:softwarelicence_list/UI:Links:Remove:Modal:Title' => 'Retirer cette %4$s de son %1$s',
'Class:Software/Attribute:softwarelicence_list/UI:Links:Delete:Button+' => 'Supprimer cette %4$s',
'Class:Software/Attribute:softwarelicence_list/UI:Links:Delete:Modal:Title' => 'Supprimer une %4$s',
'Class:Software/Attribute:softwarepatch_list/UI:Links:Create:Button+' => 'Créer un %4$s',
'Class:Software/Attribute:softwarepatch_list/UI:Links:Create:Modal:Title' => 'Ajouter un %4$s à %2$s',
'Class:Software/Attribute:softwarepatch_list/UI:Links:Remove:Button+' => 'Retirer ce %4$s',
'Class:Software/Attribute:softwarepatch_list/UI:Links:Remove:Modal:Title' => 'Retirer ce %4$s de son %1$s',
'Class:Software/Attribute:softwarepatch_list/UI:Links:Delete:Button+' => 'Supprimer ce %4$s',
'Class:Software/Attribute:softwarepatch_list/UI:Links:Delete:Modal:Title' => 'Supprimer un %4$s',
'Class:SoftwareLicence/Attribute:softwareinstance_list/UI:Links:Create:Button+' => 'Créer une %4$s',
'Class:SoftwareLicence/Attribute:softwareinstance_list/UI:Links:Create:Modal:Title' => 'Ajouter une %4$s à %2$s',
'Class:SoftwareLicence/Attribute:softwareinstance_list/UI:Links:Remove:Button+' => 'Retirer cette %4$s',
'Class:SoftwareLicence/Attribute:softwareinstance_list/UI:Links:Remove:Modal:Title' => 'Retirer cette %4$s de sa %1$s',
'Class:SoftwareLicence/Attribute:softwareinstance_list/UI:Links:Delete:Button+' => 'Supprimer cette %4$s',
'Class:SoftwareLicence/Attribute:softwareinstance_list/UI:Links:Delete:Modal:Title' => 'Supprimer une %4$s',
'Class:StorageSystem/Attribute:logicalvolume_list/UI:Links:Create:Button+' => 'Créer un %4$s',
'Class:StorageSystem/Attribute:logicalvolume_list/UI:Links:Create:Modal:Title' => 'Ajouter un %4$s à %2$s',
'Class:StorageSystem/Attribute:logicalvolume_list/UI:Links:Remove:Button+' => 'Retirer ce %4$s',
'Class:StorageSystem/Attribute:logicalvolume_list/UI:Links:Remove:Modal:Title' => 'Retirer ce %4$s de son %1$s',
'Class:StorageSystem/Attribute:logicalvolume_list/UI:Links:Delete:Button+' => 'Supprimer ce %4$s',
'Class:StorageSystem/Attribute:logicalvolume_list/UI:Links:Delete:Modal:Title' => 'Supprimer un %4$s',
'Class:TapeLibrary/Attribute:tapes_list/UI:Links:Create:Button+' => 'Créer une %4$s',
'Class:TapeLibrary/Attribute:tapes_list/UI:Links:Create:Modal:Title' => 'Ajouter une %4$s à %2$s',
'Class:TapeLibrary/Attribute:tapes_list/UI:Links:Remove:Button+' => 'Retirer cette %4$s',
'Class:TapeLibrary/Attribute:tapes_list/UI:Links:Remove:Modal:Title' => 'Retirer cette %4$s de sa %1$s',
'Class:TapeLibrary/Attribute:tapes_list/UI:Links:Delete:Button+' => 'Supprimer cette %4$s',
'Class:TapeLibrary/Attribute:tapes_list/UI:Links:Delete:Modal:Title' => 'Supprimer une %4$s',
'Class:VirtualHost/Attribute:virtualmachine_list/UI:Links:Create:Button+' => 'Créer une %4$s',
'Class:VirtualHost/Attribute:virtualmachine_list/UI:Links:Create:Modal:Title' => 'Ajouter une %4$s à %2$s',
'Class:VirtualHost/Attribute:virtualmachine_list/UI:Links:Remove:Button+' => 'Retirer cette %4$s',
'Class:VirtualHost/Attribute:virtualmachine_list/UI:Links:Remove:Modal:Title' => 'Retirer cette %4$s de son %1$s',
'Class:VirtualHost/Attribute:virtualmachine_list/UI:Links:Delete:Button+' => 'Supprimer cette %4$s',
'Class:VirtualHost/Attribute:virtualmachine_list/UI:Links:Delete:Modal:Title' => 'Supprimer une %4$s',
'Class:VirtualMachine/Attribute:logicalinterface_list/UI:Links:Create:Button+' => 'Créer une %4$s',
'Class:VirtualMachine/Attribute:logicalinterface_list/UI:Links:Create:Modal:Title' => 'Ajouter une %4$s à %2$s',
'Class:VirtualMachine/Attribute:logicalinterface_list/UI:Links:Remove:Button+' => 'Retirer cette %4$s',
'Class:VirtualMachine/Attribute:logicalinterface_list/UI:Links:Remove:Modal:Title' => 'Retirer cette %4$s de son %1$s',
'Class:VirtualMachine/Attribute:logicalinterface_list/UI:Links:Delete:Button+' => 'Supprimer cette %4$s',
'Class:VirtualMachine/Attribute:logicalinterface_list/UI:Links:Delete:Modal:Title' => 'Supprimer une %4$s',
'Class:WebServer/Attribute:webapp_list/UI:Links:Create:Button+' => 'Créer une %4$s',
'Class:WebServer/Attribute:webapp_list/UI:Links:Create:Modal:Title' => 'Ajouter une %4$s à %2$s',
'Class:WebServer/Attribute:webapp_list/UI:Links:Remove:Button+' => 'Retirer cette %4$s',
'Class:WebServer/Attribute:webapp_list/UI:Links:Remove:Modal:Title' => 'Retirer cette %4$s de son %1$s',
'Class:WebServer/Attribute:webapp_list/UI:Links:Delete:Button+' => 'Supprimer cette %4$s',
'Class:WebServer/Attribute:webapp_list/UI:Links:Delete:Modal:Title' => 'Supprimer une %4$s',
));
?>

View File

@@ -185,6 +185,22 @@
</item>
</items>
</list>
<summary>
<items>
<item id="org_id">
<rank>10</rank>
</item>
<item id="location_id">
<rank>20</rank>
</item>
<item id="nb_u">
<rank>30</rank>
</item>
<item id="description">
<rank>40</rank>
</item>
</items>
</summary>
</presentation>
</class>
<class id="Enclosure" _delta="define">
@@ -368,6 +384,22 @@
</item>
</items>
</list>
<summary>
<items>
<item id="org_id">
<rank>10</rank>
</item>
<item id="location_id">
<rank>20</rank>
</item>
<item id="rack_id">
<rank>30</rank>
</item>
<item id="nb_u">
<rank>40</rank>
</item>
</items>
</summary>
</presentation>
<relations>
<relation id="impacts">
@@ -704,6 +736,16 @@
</item>
</items>
</list>
<summary>
<items>
<item id="org_id">
<rank>10</rank>
</item>
<item id="location_id">
<rank>20</rank>
</item>
</items>
</summary>
</presentation>
</class>
<class id="PDU" _delta="define">
@@ -723,6 +765,7 @@
<attribute id="organization_name"></attribute>
<attribute id="location_name"/>
<attribute id="rack_name"/>
<attribute id="powerstart_name"/>
</complementary_attributes>
</naming>
<style>
@@ -893,6 +936,22 @@
</item>
</items>
</list>
<summary>
<items>
<item id="org_id">
<rank>10</rank>
</item>
<item id="location_id">
<rank>20</rank>
</item>
<item id="rack_id">
<rank>30</rank>
</item>
<item id="powerstart_id">
<rank>40</rank>
</item>
</items>
</summary>
</presentation>
<methods/>
</class>

View File

@@ -308,6 +308,25 @@
</item>
</items>
</list>
<summary>
<items>
<item id="org_id">
<rank>20</rank>
</item>
<item id="location_id">
<rank>50</rank>
</item>
<item id="model_id">
<rank>70</rank>
</item>
<item id="phonenumber">
<rank>80</rank>
</item>
<item id="description">
<rank>140</rank>
</item>
</items>
</summary>
</presentation>
</class>
<class id="MobilePhone" _delta="define">
@@ -482,6 +501,22 @@
</item>
</items>
</list>
<summary>
<items>
<item id="org_id">
<rank>10</rank>
</item>
<item id="model_id">
<rank>70</rank>
</item>
<item id="phonenumber">
<rank>80</rank>
</item>
<item id="description">
<rank>140</rank>
</item>
</items>
</summary>
</presentation>
</class>
<class id="IPPhone" _delta="define">
@@ -633,6 +668,25 @@
</item>
</items>
</list>
<summary>
<items>
<item id="org_id">
<rank>20</rank>
</item>
<item id="location_id">
<rank>50</rank>
</item>
<item id="model_id">
<rank>70</rank>
</item>
<item id="phonenumber">
<rank>80</rank>
</item>
<item id="description">
<rank>140</rank>
</item>
</items>
</summary>
</presentation>
</class>
<class id="Tablet" _delta="define">
@@ -780,6 +834,25 @@
</item>
</items>
</list>
<summary>
<items>
<item id="org_id">
<rank>10</rank>
</item>
<item id="business_criticity">
<rank>20</rank>
</item>
<item id="location_id">
<rank>30</rank>
</item>
<item id="model_id">
<rank>40</rank>
</item>
<item id="description">
<rank>50</rank>
</item>
</items>
</summary>
</presentation>
</class>
<class id="PC" _delta="define">
@@ -1034,6 +1107,22 @@
</item>
</items>
</list>
<summary>
<items>
<item id="org_id">
<rank>10</rank>
</item>
<item id="business_criticity">
<rank>20</rank>
</item>
<item id="location_id">
<rank>30</rank>
</item>
<item id="model_id">
<rank>40</rank>
</item>
</items>
</summary>
</presentation>
</class>
<class id="Printer" _delta="define">
@@ -1218,6 +1307,22 @@
</item>
</items>
</list>
<summary>
<items>
<item id="org_id">
<rank>10</rank>
</item>
<item id="business_criticity">
<rank>20</rank>
</item>
<item id="location_id">
<rank>30</rank>
</item>
<item id="model_id">
<rank>40</rank>
</item>
</items>
</summary>
</presentation>
</class>
<class id="Peripheral" _delta="define">
@@ -1366,6 +1471,22 @@
</item>
</items>
</list>
<summary>
<items>
<item id="org_id">
<rank>10</rank>
</item>
<item id="business_criticity">
<rank>20</rank>
</item>
<item id="location_id">
<rank>30</rank>
</item>
<item id="model_id">
<rank>40</rank>
</item>
</items>
</summary>
</presentation>
</class>
</classes>

View File

@@ -66,3 +66,13 @@ Dict::Add('FR FR', 'French', 'Français', array(
'Brick:Portal:FAQ:Title' => 'Foire Aux Questions',
'Brick:Portal:FAQ:Title+' => '<p>Vous êtes pressé&nbsp;?</p><p>Consultez la liste des questions les plus fréquentes et vous trouverez (peut-être) immédiatement la réponse à votre besoin.</p>',
));
// 1:n relations custom labels for tooltip and pop-up title
Dict::Add('FR FR', 'French', 'Français', array(
'Class:FAQCategory/Attribute:faq_list/UI:Links:Create:Button+' => 'Créer une %4$s',
'Class:FAQCategory/Attribute:faq_list/UI:Links:Create:Modal:Title' => 'Ajouter une %4$s à %2$s',
'Class:FAQCategory/Attribute:faq_list/UI:Links:Remove:Button+' => 'Retirer cette %4$s',
'Class:FAQCategory/Attribute:faq_list/UI:Links:Remove:Modal:Title' => 'Retirer cette %4$s de sa %1$s',
'Class:FAQCategory/Attribute:faq_list/UI:Links:Delete:Button+' => 'Supprimer cette %4$s',
'Class:FAQCategory/Attribute:faq_list/UI:Links:Delete:Modal:Title' => 'Supprimer une %4$s',
));

View File

@@ -20,6 +20,9 @@
<attributes>
<attribute id="ref"/>
</attributes>
<complementary_attributes>
<attribute id="title"></attribute>
</complementary_attributes>
</naming>
<fields_semantic>
<state_attribute>status</state_attribute>

View File

@@ -242,3 +242,19 @@ Dict::Add('FR FR', 'French', 'Français', array(
'Class:Incident/Method:ResolveChildTickets+' => 'Cascader l\'action de résolution du ticket (ev_autoresolve) vers les requêtes et incidents fils, et aligner les caractéristiques suivantes : service, équipe, agent, information de résolution',
'Tickets:Related:OpenIncidents' => 'Incidents ouverts',
));
// 1:n relations custom labels for tooltip and pop-up title
Dict::Add('FR FR', 'French', 'Français', array(
'Class:Incident/Attribute:child_incidents_list/UI:Links:Create:Button+' => 'Créer un %4$s',
'Class:Incident/Attribute:child_incidents_list/UI:Links:Create:Modal:Title' => 'Ajouter un %4$s à %2$s',
'Class:Incident/Attribute:child_incidents_list/UI:Links:Remove:Button+' => 'Retirer ce %4$s',
'Class:Incident/Attribute:child_incidents_list/UI:Links:Remove:Modal:Title' => 'Retirer ce %4$s de son %1$s',
'Class:Incident/Attribute:child_incidents_list/UI:Links:Delete:Button+' => 'Supprimer ce %4$s',
'Class:Incident/Attribute:child_incidents_list/UI:Links:Delete:Modal:Title' => 'Supprimer un %4$s',
'Class:Incident/Attribute:related_request_list/UI:Links:Create:Button+' => 'Créer une %4$s',
'Class:Incident/Attribute:related_request_list/UI:Links:Create:Modal:Title' => 'Ajouter une %4$s à %2$s',
'Class:Incident/Attribute:related_request_list/UI:Links:Remove:Button+' => 'Retirer cette %4$s',
'Class:Incident/Attribute:related_request_list/UI:Links:Remove:Modal:Title' => 'Retirer cette %4$s de son %1$s',
'Class:Incident/Attribute:related_request_list/UI:Links:Delete:Button+' => 'Supprimer cette %4$s',
'Class:Incident/Attribute:related_request_list/UI:Links:Delete:Modal:Title' => 'Supprimer une %4$s',
));

View File

@@ -120,3 +120,13 @@ Dict::Add('FR FR', 'French', 'Français', array(
'Class:OAuthClientGoogle/Attribute:used_for_smtp/Value:yes' => 'Oui',
'Class:OAuthClientGoogle/Attribute:used_for_smtp/Value:no' => 'Non',
));
// 1:n relations custom labels for tooltip and pop-up title
Dict::Add('FR FR', 'French', 'Français', array(
'Class:OAuthClient/Attribute:mailbox_list/UI:Links:Create:Button+' => 'Créer une %4$s',
'Class:OAuthClient/Attribute:mailbox_list/UI:Links:Create:Modal:Title' => 'Ajouter une %4$s à %2$s',
'Class:OAuthClient/Attribute:mailbox_list/UI:Links:Remove:Button+' => 'Retirer cette %4$s',
'Class:OAuthClient/Attribute:mailbox_list/UI:Links:Remove:Modal:Title' => 'Retirer cette %4$s de son %1$s',
'Class:OAuthClient/Attribute:mailbox_list/UI:Links:Delete:Button+' => 'Supprimer cette %4$s',
'Class:OAuthClient/Attribute:mailbox_list/UI:Links:Delete:Modal:Title' => 'Supprimer une %4$s',
));

View File

@@ -0,0 +1,18 @@
{
"_readme": [
"This file locks the dependencies of your project to a known state",
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
"This file is @generated automatically"
],
"content-hash": "d751713988987e9331980363e24189ce",
"packages": [],
"packages-dev": [],
"aliases": [],
"minimum-stability": "stable",
"stability-flags": [],
"prefer-stable": false,
"prefer-lowest": false,
"platform": [],
"platform-dev": [],
"plugin-api-version": "2.3.0"
}

View File

@@ -142,6 +142,11 @@ class PasswordFormManager extends FormManager
$aData['valid'] = false;
$aData['messages']['error'] += array('confirm_password' => array(Dict::S('UI:Login:RetypePwdDoesNotMatch')));
}
elseif ($sNewPassword === $sOldPassword)
{
$aData['valid'] = false;
$aData['messages']['error'] += array('new_password' => array(Dict::S('UI:Login:PasswordNotChanged')));
}
else
{
try {

View File

@@ -1,24 +1,25 @@
<?php
/**
* Copyright (C) 2013-2023 Combodo SARL
*
* This file is part of iTop.
*
* iTop is free software; you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* iTop is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
*/
// autoload.php @generated by Composer
if (PHP_VERSION_ID < 50600) {
if (!headers_sent()) {
header('HTTP/1.1 500 Internal Server Error');
}
$err = 'Composer 2.3.0 dropped support for autoloading on PHP <5.6 and you are running '.PHP_VERSION.', please upgrade PHP or use Composer 2.2 LTS via "composer self-update --2.2". Aborting.'.PHP_EOL;
if (!ini_get('display_errors')) {
if (PHP_SAPI === 'cli' || PHP_SAPI === 'phpdbg') {
fwrite(STDERR, $err);
} elseif (!headers_sent()) {
echo $err;
}
}
trigger_error(
$err,
E_USER_ERROR
);
}
require_once __DIR__ . '/composer/autoload_real.php';
return ComposerAutoloaderInitdf408f3f8ea034d298269cdf7647358b::getLoader();

View File

@@ -1,21 +1,13 @@
<?php
/**
* Copyright (C) 2013-2023 Combodo SARL
/*
* This file is part of Composer.
*
* This file is part of iTop.
* (c) Nils Adermann <naderman@naderman.de>
* Jordi Boggiano <j.boggiano@seld.be>
*
* iTop is free software; you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* iTop is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace Composer\Autoload;
@@ -50,21 +42,79 @@ namespace Composer\Autoload;
*/
class ClassLoader
{
/** @var \Closure(string):void */
private static $includeFile;
/** @var ?string */
private $vendorDir;
// PSR-4
/**
* @var array[]
* @psalm-var array<string, array<string, int>>
*/
private $prefixLengthsPsr4 = array();
/**
* @var array[]
* @psalm-var array<string, array<int, string>>
*/
private $prefixDirsPsr4 = array();
/**
* @var array[]
* @psalm-var array<string, string>
*/
private $fallbackDirsPsr4 = array();
// PSR-0
/**
* @var array[]
* @psalm-var array<string, array<string, string[]>>
*/
private $prefixesPsr0 = array();
/**
* @var array[]
* @psalm-var array<string, string>
*/
private $fallbackDirsPsr0 = array();
/** @var bool */
private $useIncludePath = false;
/**
* @var string[]
* @psalm-var array<string, string>
*/
private $classMap = array();
/** @var bool */
private $classMapAuthoritative = false;
/**
* @var bool[]
* @psalm-var array<string, bool>
*/
private $missingClasses = array();
/** @var ?string */
private $apcuPrefix;
/**
* @var self[]
*/
private static $registeredLoaders = array();
/**
* @param ?string $vendorDir
*/
public function __construct($vendorDir = null)
{
$this->vendorDir = $vendorDir;
self::initializeIncludeClosure();
}
/**
* @return string[]
*/
public function getPrefixes()
{
if (!empty($this->prefixesPsr0)) {
@@ -74,28 +124,47 @@ class ClassLoader
return array();
}
/**
* @return array[]
* @psalm-return array<string, array<int, string>>
*/
public function getPrefixesPsr4()
{
return $this->prefixDirsPsr4;
}
/**
* @return array[]
* @psalm-return array<string, string>
*/
public function getFallbackDirs()
{
return $this->fallbackDirsPsr0;
}
/**
* @return array[]
* @psalm-return array<string, string>
*/
public function getFallbackDirsPsr4()
{
return $this->fallbackDirsPsr4;
}
/**
* @return string[] Array of classname => path
* @psalm-return array<string, string>
*/
public function getClassMap()
{
return $this->classMap;
}
/**
* @param array $classMap Class to filename map
* @param string[] $classMap Class to filename map
* @psalm-param array<string, string> $classMap
*
* @return void
*/
public function addClassMap(array $classMap)
{
@@ -110,9 +179,11 @@ class ClassLoader
* Registers a set of PSR-0 directories for a given prefix, either
* appending or prepending to the ones previously set for this prefix.
*
* @param string $prefix The prefix
* @param array|string $paths The PSR-0 root directories
* @param bool $prepend Whether to prepend the directories
* @param string $prefix The prefix
* @param string[]|string $paths The PSR-0 root directories
* @param bool $prepend Whether to prepend the directories
*
* @return void
*/
public function add($prefix, $paths, $prepend = false)
{
@@ -155,11 +226,13 @@ class ClassLoader
* Registers a set of PSR-4 directories for a given namespace, either
* appending or prepending to the ones previously set for this namespace.
*
* @param string $prefix The prefix/namespace, with trailing '\\'
* @param array|string $paths The PSR-4 base directories
* @param bool $prepend Whether to prepend the directories
* @param string $prefix The prefix/namespace, with trailing '\\'
* @param string[]|string $paths The PSR-4 base directories
* @param bool $prepend Whether to prepend the directories
*
* @throws \InvalidArgumentException
*
* @return void
*/
public function addPsr4($prefix, $paths, $prepend = false)
{
@@ -203,8 +276,10 @@ class ClassLoader
* Registers a set of PSR-0 directories for a given prefix,
* replacing any others previously set for this prefix.
*
* @param string $prefix The prefix
* @param array|string $paths The PSR-0 base directories
* @param string $prefix The prefix
* @param string[]|string $paths The PSR-0 base directories
*
* @return void
*/
public function set($prefix, $paths)
{
@@ -219,10 +294,12 @@ class ClassLoader
* Registers a set of PSR-4 directories for a given namespace,
* replacing any others previously set for this namespace.
*
* @param string $prefix The prefix/namespace, with trailing '\\'
* @param array|string $paths The PSR-4 base directories
* @param string $prefix The prefix/namespace, with trailing '\\'
* @param string[]|string $paths The PSR-4 base directories
*
* @throws \InvalidArgumentException
*
* @return void
*/
public function setPsr4($prefix, $paths)
{
@@ -242,6 +319,8 @@ class ClassLoader
* Turns on searching the include path for class files.
*
* @param bool $useIncludePath
*
* @return void
*/
public function setUseIncludePath($useIncludePath)
{
@@ -264,6 +343,8 @@ class ClassLoader
* that have not been registered with the class map.
*
* @param bool $classMapAuthoritative
*
* @return void
*/
public function setClassMapAuthoritative($classMapAuthoritative)
{
@@ -284,6 +365,8 @@ class ClassLoader
* APCu prefix to use to cache found/not-found classes, if the extension is enabled.
*
* @param string|null $apcuPrefix
*
* @return void
*/
public function setApcuPrefix($apcuPrefix)
{
@@ -304,33 +387,55 @@ class ClassLoader
* Registers this instance as an autoloader.
*
* @param bool $prepend Whether to prepend the autoloader or not
*
* @return void
*/
public function register($prepend = false)
{
spl_autoload_register(array($this, 'loadClass'), true, $prepend);
if (null === $this->vendorDir) {
return;
}
if ($prepend) {
self::$registeredLoaders = array($this->vendorDir => $this) + self::$registeredLoaders;
} else {
unset(self::$registeredLoaders[$this->vendorDir]);
self::$registeredLoaders[$this->vendorDir] = $this;
}
}
/**
* Unregisters this instance as an autoloader.
*
* @return void
*/
public function unregister()
{
spl_autoload_unregister(array($this, 'loadClass'));
if (null !== $this->vendorDir) {
unset(self::$registeredLoaders[$this->vendorDir]);
}
}
/**
* Loads the given class or interface.
*
* @param string $class The name of the class
* @return bool|null True if loaded, null otherwise
* @return true|null True if loaded, null otherwise
*/
public function loadClass($class)
{
if ($file = $this->findFile($class)) {
includeFile($file);
$includeFile = self::$includeFile;
$includeFile($file);
return true;
}
return null;
}
/**
@@ -375,6 +480,21 @@ class ClassLoader
return $file;
}
/**
* Returns the currently registered loaders indexed by their corresponding vendor directories.
*
* @return self[]
*/
public static function getRegisteredLoaders()
{
return self::$registeredLoaders;
}
/**
* @param string $class
* @param string $ext
* @return string|false
*/
private function findFileWithExtension($class, $ext)
{
// PSR-4 lookup
@@ -440,14 +560,26 @@ class ClassLoader
return false;
}
}
/**
* Scope isolated include.
*
* Prevents access to $this/self from included files.
*/
function includeFile($file)
{
include $file;
/**
* @return void
*/
private static function initializeIncludeClosure()
{
if (self::$includeFile !== null) {
return;
}
/**
* Scope isolated include.
*
* Prevents access to $this/self from included files.
*
* @param string $file
* @return void
*/
self::$includeFile = \Closure::bind(static function($file) {
include $file;
}, null, null);
}
}

View File

@@ -0,0 +1,359 @@
<?php
/*
* This file is part of Composer.
*
* (c) Nils Adermann <naderman@naderman.de>
* Jordi Boggiano <j.boggiano@seld.be>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace Composer;
use Composer\Autoload\ClassLoader;
use Composer\Semver\VersionParser;
/**
* This class is copied in every Composer installed project and available to all
*
* See also https://getcomposer.org/doc/07-runtime.md#installed-versions
*
* To require its presence, you can require `composer-runtime-api ^2.0`
*
* @final
*/
class InstalledVersions
{
/**
* @var mixed[]|null
* @psalm-var array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array<string, array{pretty_version?: string, version?: string, reference?: string|null, type?: string, install_path?: string, aliases?: string[], dev_requirement: bool, replaced?: string[], provided?: string[]}>}|array{}|null
*/
private static $installed;
/**
* @var bool|null
*/
private static $canGetVendors;
/**
* @var array[]
* @psalm-var array<string, array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array<string, array{pretty_version?: string, version?: string, reference?: string|null, type?: string, install_path?: string, aliases?: string[], dev_requirement: bool, replaced?: string[], provided?: string[]}>}>
*/
private static $installedByVendor = array();
/**
* Returns a list of all package names which are present, either by being installed, replaced or provided
*
* @return string[]
* @psalm-return list<string>
*/
public static function getInstalledPackages()
{
$packages = array();
foreach (self::getInstalled() as $installed) {
$packages[] = array_keys($installed['versions']);
}
if (1 === \count($packages)) {
return $packages[0];
}
return array_keys(array_flip(\call_user_func_array('array_merge', $packages)));
}
/**
* Returns a list of all package names with a specific type e.g. 'library'
*
* @param string $type
* @return string[]
* @psalm-return list<string>
*/
public static function getInstalledPackagesByType($type)
{
$packagesByType = array();
foreach (self::getInstalled() as $installed) {
foreach ($installed['versions'] as $name => $package) {
if (isset($package['type']) && $package['type'] === $type) {
$packagesByType[] = $name;
}
}
}
return $packagesByType;
}
/**
* Checks whether the given package is installed
*
* This also returns true if the package name is provided or replaced by another package
*
* @param string $packageName
* @param bool $includeDevRequirements
* @return bool
*/
public static function isInstalled($packageName, $includeDevRequirements = true)
{
foreach (self::getInstalled() as $installed) {
if (isset($installed['versions'][$packageName])) {
return $includeDevRequirements || !isset($installed['versions'][$packageName]['dev_requirement']) || $installed['versions'][$packageName]['dev_requirement'] === false;
}
}
return false;
}
/**
* Checks whether the given package satisfies a version constraint
*
* e.g. If you want to know whether version 2.3+ of package foo/bar is installed, you would call:
*
* Composer\InstalledVersions::satisfies(new VersionParser, 'foo/bar', '^2.3')
*
* @param VersionParser $parser Install composer/semver to have access to this class and functionality
* @param string $packageName
* @param string|null $constraint A version constraint to check for, if you pass one you have to make sure composer/semver is required by your package
* @return bool
*/
public static function satisfies(VersionParser $parser, $packageName, $constraint)
{
$constraint = $parser->parseConstraints((string) $constraint);
$provided = $parser->parseConstraints(self::getVersionRanges($packageName));
return $provided->matches($constraint);
}
/**
* Returns a version constraint representing all the range(s) which are installed for a given package
*
* It is easier to use this via isInstalled() with the $constraint argument if you need to check
* whether a given version of a package is installed, and not just whether it exists
*
* @param string $packageName
* @return string Version constraint usable with composer/semver
*/
public static function getVersionRanges($packageName)
{
foreach (self::getInstalled() as $installed) {
if (!isset($installed['versions'][$packageName])) {
continue;
}
$ranges = array();
if (isset($installed['versions'][$packageName]['pretty_version'])) {
$ranges[] = $installed['versions'][$packageName]['pretty_version'];
}
if (array_key_exists('aliases', $installed['versions'][$packageName])) {
$ranges = array_merge($ranges, $installed['versions'][$packageName]['aliases']);
}
if (array_key_exists('replaced', $installed['versions'][$packageName])) {
$ranges = array_merge($ranges, $installed['versions'][$packageName]['replaced']);
}
if (array_key_exists('provided', $installed['versions'][$packageName])) {
$ranges = array_merge($ranges, $installed['versions'][$packageName]['provided']);
}
return implode(' || ', $ranges);
}
throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed');
}
/**
* @param string $packageName
* @return string|null If the package is being replaced or provided but is not really installed, null will be returned as version, use satisfies or getVersionRanges if you need to know if a given version is present
*/
public static function getVersion($packageName)
{
foreach (self::getInstalled() as $installed) {
if (!isset($installed['versions'][$packageName])) {
continue;
}
if (!isset($installed['versions'][$packageName]['version'])) {
return null;
}
return $installed['versions'][$packageName]['version'];
}
throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed');
}
/**
* @param string $packageName
* @return string|null If the package is being replaced or provided but is not really installed, null will be returned as version, use satisfies or getVersionRanges if you need to know if a given version is present
*/
public static function getPrettyVersion($packageName)
{
foreach (self::getInstalled() as $installed) {
if (!isset($installed['versions'][$packageName])) {
continue;
}
if (!isset($installed['versions'][$packageName]['pretty_version'])) {
return null;
}
return $installed['versions'][$packageName]['pretty_version'];
}
throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed');
}
/**
* @param string $packageName
* @return string|null If the package is being replaced or provided but is not really installed, null will be returned as reference
*/
public static function getReference($packageName)
{
foreach (self::getInstalled() as $installed) {
if (!isset($installed['versions'][$packageName])) {
continue;
}
if (!isset($installed['versions'][$packageName]['reference'])) {
return null;
}
return $installed['versions'][$packageName]['reference'];
}
throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed');
}
/**
* @param string $packageName
* @return string|null If the package is being replaced or provided but is not really installed, null will be returned as install path. Packages of type metapackages also have a null install path.
*/
public static function getInstallPath($packageName)
{
foreach (self::getInstalled() as $installed) {
if (!isset($installed['versions'][$packageName])) {
continue;
}
return isset($installed['versions'][$packageName]['install_path']) ? $installed['versions'][$packageName]['install_path'] : null;
}
throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed');
}
/**
* @return array
* @psalm-return array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}
*/
public static function getRootPackage()
{
$installed = self::getInstalled();
return $installed[0]['root'];
}
/**
* Returns the raw installed.php data for custom implementations
*
* @deprecated Use getAllRawData() instead which returns all datasets for all autoloaders present in the process. getRawData only returns the first dataset loaded, which may not be what you expect.
* @return array[]
* @psalm-return array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array<string, array{pretty_version?: string, version?: string, reference?: string|null, type?: string, install_path?: string, aliases?: string[], dev_requirement: bool, replaced?: string[], provided?: string[]}>}
*/
public static function getRawData()
{
@trigger_error('getRawData only returns the first dataset loaded, which may not be what you expect. Use getAllRawData() instead which returns all datasets for all autoloaders present in the process.', E_USER_DEPRECATED);
if (null === self::$installed) {
// only require the installed.php file if this file is loaded from its dumped location,
// and not from its source location in the composer/composer package, see https://github.com/composer/composer/issues/9937
if (substr(__DIR__, -8, 1) !== 'C') {
self::$installed = include __DIR__ . '/installed.php';
} else {
self::$installed = array();
}
}
return self::$installed;
}
/**
* Returns the raw data of all installed.php which are currently loaded for custom implementations
*
* @return array[]
* @psalm-return list<array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array<string, array{pretty_version?: string, version?: string, reference?: string|null, type?: string, install_path?: string, aliases?: string[], dev_requirement: bool, replaced?: string[], provided?: string[]}>}>
*/
public static function getAllRawData()
{
return self::getInstalled();
}
/**
* Lets you reload the static array from another file
*
* This is only useful for complex integrations in which a project needs to use
* this class but then also needs to execute another project's autoloader in process,
* and wants to ensure both projects have access to their version of installed.php.
*
* A typical case would be PHPUnit, where it would need to make sure it reads all
* the data it needs from this class, then call reload() with
* `require $CWD/vendor/composer/installed.php` (or similar) as input to make sure
* the project in which it runs can then also use this class safely, without
* interference between PHPUnit's dependencies and the project's dependencies.
*
* @param array[] $data A vendor/composer/installed.php data set
* @return void
*
* @psalm-param array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array<string, array{pretty_version?: string, version?: string, reference?: string|null, type?: string, install_path?: string, aliases?: string[], dev_requirement: bool, replaced?: string[], provided?: string[]}>} $data
*/
public static function reload($data)
{
self::$installed = $data;
self::$installedByVendor = array();
}
/**
* @return array[]
* @psalm-return list<array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array<string, array{pretty_version?: string, version?: string, reference?: string|null, type?: string, install_path?: string, aliases?: string[], dev_requirement: bool, replaced?: string[], provided?: string[]}>}>
*/
private static function getInstalled()
{
if (null === self::$canGetVendors) {
self::$canGetVendors = method_exists('Composer\Autoload\ClassLoader', 'getRegisteredLoaders');
}
$installed = array();
if (self::$canGetVendors) {
foreach (ClassLoader::getRegisteredLoaders() as $vendorDir => $loader) {
if (isset(self::$installedByVendor[$vendorDir])) {
$installed[] = self::$installedByVendor[$vendorDir];
} elseif (is_file($vendorDir.'/composer/installed.php')) {
/** @var array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array<string, array{pretty_version?: string, version?: string, reference?: string|null, type?: string, install_path?: string, aliases?: string[], dev_requirement: bool, replaced?: string[], provided?: string[]}>} $required */
$required = require $vendorDir.'/composer/installed.php';
$installed[] = self::$installedByVendor[$vendorDir] = $required;
if (null === self::$installed && strtr($vendorDir.'/composer', '\\', '/') === strtr(__DIR__, '\\', '/')) {
self::$installed = $installed[count($installed) - 1];
}
}
}
}
if (null === self::$installed) {
// only require the installed.php file if this file is loaded from its dumped location,
// and not from its source location in the composer/composer package, see https://github.com/composer/composer/issues/9937
if (substr(__DIR__, -8, 1) !== 'C') {
/** @var array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array<string, array{pretty_version?: string, version?: string, reference?: string|null, type?: string, install_path?: string, aliases?: string[], dev_requirement: bool, replaced?: string[], provided?: string[]}>} $required */
$required = require __DIR__ . '/installed.php';
self::$installed = $required;
} else {
self::$installed = array();
}
}
if (self::$installed !== array()) {
$installed[] = self::$installed;
}
return $installed;
}
}

View File

@@ -1,83 +1,67 @@
<?php
/**
* Copyright (C) 2013-2023 Combodo SARL
*
* This file is part of iTop.
*
* iTop is free software; you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* iTop is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
*/
// autoload_classmap.php @generated by Composer
$vendorDir = dirname(dirname(__FILE__));
$vendorDir = dirname(__DIR__);
$baseDir = dirname($vendorDir);
return array(
'Combodo\\iTop\\Portal\\Brick\\AbstractBrick' => $baseDir . '/src/Brick/AbstractBrick.php',
'Combodo\\iTop\\Portal\\Brick\\AggregatePageBrick' => $baseDir . '/src/Brick/AggregatePageBrick.php',
'Combodo\\iTop\\Portal\\Brick\\BrickCollection' => $baseDir . '/src/Brick/BrickCollection.php',
'Combodo\\iTop\\Portal\\Brick\\BrickNotFoundException' => $baseDir . '/src/Brick/BrickNotFoundException.php',
'Combodo\\iTop\\Portal\\Brick\\BrowseBrick' => $baseDir . '/src/Brick/BrowseBrick.php',
'Combodo\\iTop\\Portal\\Brick\\CreateBrick' => $baseDir . '/src/Brick/CreateBrick.php',
'Combodo\\iTop\\Portal\\Brick\\FilterBrick' => $baseDir . '/src/Brick/FilterBrick.php',
'Combodo\\iTop\\Portal\\Brick\\ManageBrick' => $baseDir . '/src/Brick/ManageBrick.php',
'Combodo\\iTop\\Portal\\Brick\\PortalBrick' => $baseDir . '/src/Brick/PortalBrick.php',
'Combodo\\iTop\\Portal\\Brick\\PropertyNotFoundException' => $baseDir . '/src/Brick/PropertyNotFoundException.php',
'Combodo\\iTop\\Portal\\Brick\\UserProfileBrick' => $baseDir . '/src/Brick/UserProfileBrick.php',
'Combodo\\iTop\\Portal\\Controller\\AbstractController' => $baseDir . '/src/Controller/AbstractController.php',
'Combodo\\iTop\\Portal\\Controller\\AggregatePageBrickController' => $baseDir . '/src/Controller/AggregatePageBrickController.class.inc.php',
'Combodo\\iTop\\Portal\\Controller\\BrickController' => $baseDir . '/src/Controller/BrickController.php',
'Combodo\\iTop\\Portal\\Controller\\BrowseBrickController' => $baseDir . '/src/Controller/BrowseBrickController.php',
'Combodo\\iTop\\Portal\\Controller\\CreateBrickController' => $baseDir . '/src/Controller/CreateBrickController.php',
'Combodo\\iTop\\Portal\\Controller\\DefaultController' => $baseDir . '/src/Controller/DefaultController.php',
'Combodo\\iTop\\Portal\\Controller\\ManageBrickController' => $baseDir . '/src/Controller/ManageBrickController.php',
'Combodo\\iTop\\Portal\\Controller\\ObjectController' => $baseDir . '/src/Controller/ObjectController.php',
'Combodo\\iTop\\Portal\\Controller\\SessionMessageController' => $baseDir . '/src/Controller/SessionMessageController.php',
'Combodo\\iTop\\Portal\\Controller\\UserProfileBrickController' => $baseDir . '/src/Controller/UserProfileBrickController.php',
'Combodo\\iTop\\Portal\\DependencyInjection\\SilexCompatBootstrap\\PortalXmlConfiguration\\AbstractConfiguration' => $baseDir . '/src/DependencyInjection/SilexCompatBootstrap/PortalXmlConfiguration/AbstractConfiguration.php',
'Combodo\\iTop\\Portal\\DependencyInjection\\SilexCompatBootstrap\\PortalXmlConfiguration\\Basic' => $baseDir . '/src/DependencyInjection/SilexCompatBootstrap/PortalXmlConfiguration/Basic.php',
'Combodo\\iTop\\Portal\\DependencyInjection\\SilexCompatBootstrap\\PortalXmlConfiguration\\Forms' => $baseDir . '/src/DependencyInjection/SilexCompatBootstrap/PortalXmlConfiguration/Forms.php',
'Combodo\\iTop\\Portal\\DependencyInjection\\SilexCompatBootstrap\\PortalXmlConfiguration\\Lists' => $baseDir . '/src/DependencyInjection/SilexCompatBootstrap/PortalXmlConfiguration/Lists.php',
'Combodo\\iTop\\Portal\\EventListener\\ApplicationContextSetPluginPropertyClass' => $baseDir . '/src/EventListener/ApplicationContextSetPluginPropertyClass.php',
'Combodo\\iTop\\Portal\\EventListener\\ApplicationContextSetUrlMakerClass' => $baseDir . '/src/EventListener/ApplicationContextSetUrlMakerClass.php',
'Combodo\\iTop\\Portal\\EventListener\\CssFromSassCompiler' => $baseDir . '/src/EventListener/CssFromSassCompiler.php',
'Combodo\\iTop\\Portal\\EventListener\\ExceptionListener' => $baseDir . '/src/EventListener/ExceptionListener.php',
'Combodo\\iTop\\Portal\\EventListener\\UserProvider' => $baseDir . '/src/EventListener/UserProvider.php',
'Combodo\\iTop\\Portal\\Form\\ObjectFormManager' => $baseDir . '/src/Form/ObjectFormManager.php',
'Combodo\\iTop\\Portal\\Form\\PasswordFormManager' => $baseDir . '/src/Form/PasswordFormManager.php',
'Combodo\\iTop\\Portal\\Form\\PreferencesFormManager' => $baseDir . '/src/Form/PreferencesFormManager.php',
'Combodo\\iTop\\Portal\\Helper\\ApplicationHelper' => $baseDir . '/src/Helper/ApplicationHelper.php',
'Combodo\\iTop\\Portal\\Helper\\BrickControllerHelper' => $baseDir . '/src/Helper/BrickControllerHelper.php',
'Combodo\\iTop\\Portal\\Helper\\BrowseBrickHelper' => $baseDir . '/src/Helper/BrowseBrickHelper.php',
'Combodo\\iTop\\Portal\\Helper\\ContextManipulatorHelper' => $baseDir . '/src/Helper/ContextManipulatorHelper.php',
'Combodo\\iTop\\Portal\\Helper\\LifecycleValidatorHelper' => $baseDir . '/src/Helper/LifecycleValidatorHelper.php',
'Combodo\\iTop\\Portal\\Helper\\NavigationRuleHelper' => $baseDir . '/src/Helper/NavigationRuleHelper.php',
'Combodo\\iTop\\Portal\\Helper\\ObjectFormHandlerHelper' => $baseDir . '/src/Helper/ObjectFormHandlerHelper.php',
'Combodo\\iTop\\Portal\\Helper\\RequestManipulatorHelper' => $baseDir.'/src/Helper/RequestManipulatorHelper.php',
'Combodo\\iTop\\Portal\\Helper\\ScopeValidatorHelper' => $baseDir.'/src/Helper/ScopeValidatorHelper.php',
'Combodo\\iTop\\Portal\\Helper\\SecurityHelper' => $baseDir.'/src/Helper/SecurityHelper.php',
'Combodo\\iTop\\Portal\\Helper\\SessionMessageHelper' => $baseDir.'/src/Helper/SessionMessageHelper.php',
'Combodo\\iTop\\Portal\\Helper\\UIExtensionsHelper' => $baseDir.'/src/Helper/UIExtensionsHelper.php',
'Combodo\\iTop\\Portal\\Kernel' => $baseDir.'/src/Kernel.php',
'Combodo\\iTop\\Portal\\Routing\\ItopExtensionsExtraRoutes' => $baseDir.'/src/Routing/ItopExtensionsExtraRoutes.php',
'Combodo\\iTop\\Portal\\Routing\\UrlGenerator' => $baseDir.'/src/Routing/UrlGenerator.php',
'Combodo\\iTop\\Portal\\Twig\\AppExtension' => $baseDir.'/src/Twig/AppExtension.php',
'Combodo\\iTop\\Portal\\Twig\\AppVariable' => $baseDir.'/src/Twig/AppVariable.php',
'Combodo\\iTop\\Portal\\Twig\\CurrentUserAccessor' => $baseDir.'/src/Twig/CurrentUserAccessor.php',
'Combodo\\iTop\\Portal\\Twig\\AppGlobal' => $baseDir.'/src/Twig/AppGlobal.php',
'Combodo\\iTop\\Portal\\UrlMaker\\AbstractPortalUrlMaker' => $baseDir.'/src/UrlMaker/AbstractPortalUrlMaker.php',
'Combodo\\iTop\\Portal\\VariableAccessor\\AbstractStringVariableAccessor' => $baseDir.'/src/VariableAccessor/AbstractStringVariableAccessor.php',
'Combodo\\iTop\\Portal\\VariableAccessor\\AbstractVariableAccessor' => $baseDir.'/src/VariableAccessor/AbstractVariableAccessor.php',
'Combodo\\iTop\\Portal\\VariableAccessor\\CombodoCurrentContactPhotoUrl' => $baseDir.'/src/VariableAccessor/CombodoCurrentContactPhotoUrl.php',
'Combodo\\iTop\\Portal\\VariableAccessor\\CombodoPortalInstanceConf' => $baseDir.'/src/VariableAccessor/CombodoPortalInstanceConf.php',
'Combodo\\iTop\\Portal\\Brick\\AbstractBrick' => $baseDir . '/src/Brick/AbstractBrick.php',
'Combodo\\iTop\\Portal\\Brick\\AggregatePageBrick' => $baseDir . '/src/Brick/AggregatePageBrick.php',
'Combodo\\iTop\\Portal\\Brick\\BrickCollection' => $baseDir . '/src/Brick/BrickCollection.php',
'Combodo\\iTop\\Portal\\Brick\\BrickNotFoundException' => $baseDir . '/src/Brick/BrickNotFoundException.php',
'Combodo\\iTop\\Portal\\Brick\\BrowseBrick' => $baseDir . '/src/Brick/BrowseBrick.php',
'Combodo\\iTop\\Portal\\Brick\\CreateBrick' => $baseDir . '/src/Brick/CreateBrick.php',
'Combodo\\iTop\\Portal\\Brick\\FilterBrick' => $baseDir . '/src/Brick/FilterBrick.php',
'Combodo\\iTop\\Portal\\Brick\\ManageBrick' => $baseDir . '/src/Brick/ManageBrick.php',
'Combodo\\iTop\\Portal\\Brick\\PortalBrick' => $baseDir . '/src/Brick/PortalBrick.php',
'Combodo\\iTop\\Portal\\Brick\\PropertyNotFoundException' => $baseDir . '/src/Brick/PropertyNotFoundException.php',
'Combodo\\iTop\\Portal\\Brick\\UserProfileBrick' => $baseDir . '/src/Brick/UserProfileBrick.php',
'Combodo\\iTop\\Portal\\Controller\\AbstractController' => $baseDir . '/src/Controller/AbstractController.php',
'Combodo\\iTop\\Portal\\Controller\\AggregatePageBrickController' => $baseDir . '/src/Controller/AggregatePageBrickController.php',
'Combodo\\iTop\\Portal\\Controller\\BrickController' => $baseDir . '/src/Controller/BrickController.php',
'Combodo\\iTop\\Portal\\Controller\\BrowseBrickController' => $baseDir . '/src/Controller/BrowseBrickController.php',
'Combodo\\iTop\\Portal\\Controller\\CreateBrickController' => $baseDir . '/src/Controller/CreateBrickController.php',
'Combodo\\iTop\\Portal\\Controller\\DefaultController' => $baseDir . '/src/Controller/DefaultController.php',
'Combodo\\iTop\\Portal\\Controller\\ManageBrickController' => $baseDir . '/src/Controller/ManageBrickController.php',
'Combodo\\iTop\\Portal\\Controller\\ObjectController' => $baseDir . '/src/Controller/ObjectController.php',
'Combodo\\iTop\\Portal\\Controller\\SessionMessageController' => $baseDir . '/src/Controller/SessionMessageController.php',
'Combodo\\iTop\\Portal\\Controller\\UserProfileBrickController' => $baseDir . '/src/Controller/UserProfileBrickController.php',
'Combodo\\iTop\\Portal\\DependencyInjection\\SilexCompatBootstrap\\PortalXmlConfiguration\\AbstractConfiguration' => $baseDir . '/src/DependencyInjection/SilexCompatBootstrap/PortalXmlConfiguration/AbstractConfiguration.php',
'Combodo\\iTop\\Portal\\DependencyInjection\\SilexCompatBootstrap\\PortalXmlConfiguration\\Basic' => $baseDir . '/src/DependencyInjection/SilexCompatBootstrap/PortalXmlConfiguration/Basic.php',
'Combodo\\iTop\\Portal\\DependencyInjection\\SilexCompatBootstrap\\PortalXmlConfiguration\\Forms' => $baseDir . '/src/DependencyInjection/SilexCompatBootstrap/PortalXmlConfiguration/Forms.php',
'Combodo\\iTop\\Portal\\DependencyInjection\\SilexCompatBootstrap\\PortalXmlConfiguration\\Lists' => $baseDir . '/src/DependencyInjection/SilexCompatBootstrap/PortalXmlConfiguration/Lists.php',
'Combodo\\iTop\\Portal\\EventListener\\ApplicationContextSetPluginPropertyClass' => $baseDir . '/src/EventListener/ApplicationContextSetPluginPropertyClass.php',
'Combodo\\iTop\\Portal\\EventListener\\ApplicationContextSetUrlMakerClass' => $baseDir . '/src/EventListener/ApplicationContextSetUrlMakerClass.php',
'Combodo\\iTop\\Portal\\EventListener\\CssFromSassCompiler' => $baseDir . '/src/EventListener/CssFromSassCompiler.php',
'Combodo\\iTop\\Portal\\EventListener\\ExceptionListener' => $baseDir . '/src/EventListener/ExceptionListener.php',
'Combodo\\iTop\\Portal\\EventListener\\UserProvider' => $baseDir . '/src/EventListener/UserProvider.php',
'Combodo\\iTop\\Portal\\Form\\ObjectFormManager' => $baseDir . '/src/Form/ObjectFormManager.php',
'Combodo\\iTop\\Portal\\Form\\PasswordFormManager' => $baseDir . '/src/Form/PasswordFormManager.php',
'Combodo\\iTop\\Portal\\Form\\PreferencesFormManager' => $baseDir . '/src/Form/PreferencesFormManager.php',
'Combodo\\iTop\\Portal\\Helper\\ApplicationHelper' => $baseDir . '/src/Helper/ApplicationHelper.php',
'Combodo\\iTop\\Portal\\Helper\\BrickControllerHelper' => $baseDir . '/src/Helper/BrickControllerHelper.php',
'Combodo\\iTop\\Portal\\Helper\\BrowseBrickHelper' => $baseDir . '/src/Helper/BrowseBrickHelper.php',
'Combodo\\iTop\\Portal\\Helper\\ContextManipulatorHelper' => $baseDir . '/src/Helper/ContextManipulatorHelper.php',
'Combodo\\iTop\\Portal\\Helper\\LifecycleValidatorHelper' => $baseDir . '/src/Helper/LifecycleValidatorHelper.php',
'Combodo\\iTop\\Portal\\Helper\\NavigationRuleHelper' => $baseDir . '/src/Helper/NavigationRuleHelper.php',
'Combodo\\iTop\\Portal\\Helper\\ObjectFormHandlerHelper' => $baseDir . '/src/Helper/ObjectFormHandlerHelper.php',
'Combodo\\iTop\\Portal\\Helper\\RequestManipulatorHelper' => $baseDir . '/src/Helper/RequestManipulatorHelper.php',
'Combodo\\iTop\\Portal\\Helper\\ScopeValidatorHelper' => $baseDir . '/src/Helper/ScopeValidatorHelper.php',
'Combodo\\iTop\\Portal\\Helper\\SecurityHelper' => $baseDir . '/src/Helper/SecurityHelper.php',
'Combodo\\iTop\\Portal\\Helper\\SessionMessageHelper' => $baseDir . '/src/Helper/SessionMessageHelper.php',
'Combodo\\iTop\\Portal\\Helper\\UIExtensionsHelper' => $baseDir . '/src/Helper/UIExtensionsHelper.php',
'Combodo\\iTop\\Portal\\Kernel' => $baseDir . '/src/Kernel.php',
'Combodo\\iTop\\Portal\\Routing\\ItopExtensionsExtraRoutes' => $baseDir . '/src/Routing/ItopExtensionsExtraRoutes.php',
'Combodo\\iTop\\Portal\\Routing\\UrlGenerator' => $baseDir . '/src/Routing/UrlGenerator.php',
'Combodo\\iTop\\Portal\\Twig\\AppExtension' => $baseDir . '/src/Twig/AppExtension.php',
'Combodo\\iTop\\Portal\\Twig\\AppGlobal' => $baseDir . '/src/Twig/AppGlobal.php',
'Combodo\\iTop\\Portal\\Twig\\AppVariable' => $baseDir . '/src/Twig/AppVariable.php',
'Combodo\\iTop\\Portal\\Twig\\CurrentUserAccessor' => $baseDir . '/src/Twig/CurrentUserAccessor.php',
'Combodo\\iTop\\Portal\\UrlMaker\\AbstractPortalUrlMaker' => $baseDir . '/src/UrlMaker/AbstractPortalUrlMaker.php',
'Combodo\\iTop\\Portal\\VariableAccessor\\AbstractStringVariableAccessor' => $baseDir . '/src/VariableAccessor/AbstractStringVariableAccessor.php',
'Combodo\\iTop\\Portal\\VariableAccessor\\AbstractVariableAccessor' => $baseDir . '/src/VariableAccessor/AbstractVariableAccessor.php',
'Combodo\\iTop\\Portal\\VariableAccessor\\CombodoCurrentContactPhotoUrl' => $baseDir . '/src/VariableAccessor/CombodoCurrentContactPhotoUrl.php',
'Combodo\\iTop\\Portal\\VariableAccessor\\CombodoPortalInstanceConf' => $baseDir . '/src/VariableAccessor/CombodoPortalInstanceConf.php',
'Composer\\InstalledVersions' => $vendorDir . '/composer/InstalledVersions.php',
);

View File

@@ -1,25 +1,8 @@
<?php
/**
* Copyright (C) 2013-2023 Combodo SARL
*
* This file is part of iTop.
*
* iTop is free software; you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* iTop is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
*/
// autoload_namespaces.php @generated by Composer
$vendorDir = dirname(dirname(__FILE__));
$vendorDir = dirname(__DIR__);
$baseDir = dirname($vendorDir);
return array(

View File

@@ -1,25 +1,8 @@
<?php
/**
* Copyright (C) 2013-2023 Combodo SARL
*
* This file is part of iTop.
*
* iTop is free software; you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* iTop is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
*/
// autoload_psr4.php @generated by Composer
$vendorDir = dirname(dirname(__FILE__));
$vendorDir = dirname(__DIR__);
$baseDir = dirname($vendorDir);
return array(

View File

@@ -1,21 +1,4 @@
<?php
/**
* Copyright (C) 2013-2023 Combodo SARL
*
* This file is part of iTop.
*
* iTop is free software; you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* iTop is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
*/
// autoload_real.php @generated by Composer
@@ -30,6 +13,9 @@ class ComposerAutoloaderInitdf408f3f8ea034d298269cdf7647358b
}
}
/**
* @return \Composer\Autoload\ClassLoader
*/
public static function getLoader()
{
if (null !== self::$loader) {
@@ -37,20 +23,11 @@ class ComposerAutoloaderInitdf408f3f8ea034d298269cdf7647358b
}
spl_autoload_register(array('ComposerAutoloaderInitdf408f3f8ea034d298269cdf7647358b', 'loadClassLoader'), true, true);
self::$loader = $loader = new \Composer\Autoload\ClassLoader();
self::$loader = $loader = new \Composer\Autoload\ClassLoader(\dirname(__DIR__));
spl_autoload_unregister(array('ComposerAutoloaderInitdf408f3f8ea034d298269cdf7647358b', 'loadClassLoader'));
$useStaticLoader = PHP_VERSION_ID >= 50600 && !defined('HHVM_VERSION') && (!function_exists('zend_loader_file_encoded') || !zend_loader_file_encoded());
if ($useStaticLoader) {
require_once __DIR__ . '/autoload_static.php';
call_user_func(\Composer\Autoload\ComposerStaticInitdf408f3f8ea034d298269cdf7647358b::getInitializer($loader));
} else {
$classMap = require __DIR__ . '/autoload_classmap.php';
if ($classMap) {
$loader->addClassMap($classMap);
}
}
require __DIR__ . '/autoload_static.php';
call_user_func(\Composer\Autoload\ComposerStaticInitdf408f3f8ea034d298269cdf7647358b::getInitializer($loader));
$loader->setClassMapAuthoritative(true);
$loader->register(true);

View File

@@ -1,21 +1,4 @@
<?php
/**
* Copyright (C) 2013-2023 Combodo SARL
*
* This file is part of iTop.
*
* iTop is free software; you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* iTop is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
*/
// autoload_static.php @generated by Composer
@@ -43,63 +26,64 @@ class ComposerStaticInitdf408f3f8ea034d298269cdf7647358b
);
public static $classMap = array (
'Combodo\\iTop\\Portal\\Brick\\AbstractBrick' => __DIR__ . '/../..' . '/src/Brick/AbstractBrick.php',
'Combodo\\iTop\\Portal\\Brick\\AggregatePageBrick' => __DIR__ . '/../..' . '/src/Brick/AggregatePageBrick.php',
'Combodo\\iTop\\Portal\\Brick\\BrickCollection' => __DIR__ . '/../..' . '/src/Brick/BrickCollection.php',
'Combodo\\iTop\\Portal\\Brick\\BrickNotFoundException' => __DIR__ . '/../..' . '/src/Brick/BrickNotFoundException.php',
'Combodo\\iTop\\Portal\\Brick\\BrowseBrick' => __DIR__ . '/../..' . '/src/Brick/BrowseBrick.php',
'Combodo\\iTop\\Portal\\Brick\\CreateBrick' => __DIR__ . '/../..' . '/src/Brick/CreateBrick.php',
'Combodo\\iTop\\Portal\\Brick\\FilterBrick' => __DIR__ . '/../..' . '/src/Brick/FilterBrick.php',
'Combodo\\iTop\\Portal\\Brick\\ManageBrick' => __DIR__ . '/../..' . '/src/Brick/ManageBrick.php',
'Combodo\\iTop\\Portal\\Brick\\PortalBrick' => __DIR__ . '/../..' . '/src/Brick/PortalBrick.php',
'Combodo\\iTop\\Portal\\Brick\\PropertyNotFoundException' => __DIR__ . '/../..' . '/src/Brick/PropertyNotFoundException.php',
'Combodo\\iTop\\Portal\\Brick\\UserProfileBrick' => __DIR__ . '/../..' . '/src/Brick/UserProfileBrick.php',
'Combodo\\iTop\\Portal\\Controller\\AbstractController' => __DIR__ . '/../..' . '/src/Controller/AbstractController.php',
'Combodo\\iTop\\Portal\\Controller\\AggregatePageBrickController' => __DIR__ . '/../..' . '/src/Controller/AggregatePageBrickController.class.inc.php',
'Combodo\\iTop\\Portal\\Controller\\BrickController' => __DIR__ . '/../..' . '/src/Controller/BrickController.php',
'Combodo\\iTop\\Portal\\Controller\\BrowseBrickController' => __DIR__ . '/../..' . '/src/Controller/BrowseBrickController.php',
'Combodo\\iTop\\Portal\\Controller\\CreateBrickController' => __DIR__ . '/../..' . '/src/Controller/CreateBrickController.php',
'Combodo\\iTop\\Portal\\Controller\\DefaultController' => __DIR__ . '/../..' . '/src/Controller/DefaultController.php',
'Combodo\\iTop\\Portal\\Controller\\ManageBrickController' => __DIR__ . '/../..' . '/src/Controller/ManageBrickController.php',
'Combodo\\iTop\\Portal\\Controller\\ObjectController' => __DIR__ . '/../..' . '/src/Controller/ObjectController.php',
'Combodo\\iTop\\Portal\\Controller\\SessionMessageController' => __DIR__ . '/../..' . '/src/Controller/SessionMessageController.php',
'Combodo\\iTop\\Portal\\Controller\\UserProfileBrickController' => __DIR__ . '/../..' . '/src/Controller/UserProfileBrickController.php',
'Combodo\\iTop\\Portal\\DependencyInjection\\SilexCompatBootstrap\\PortalXmlConfiguration\\AbstractConfiguration' => __DIR__ . '/../..' . '/src/DependencyInjection/SilexCompatBootstrap/PortalXmlConfiguration/AbstractConfiguration.php',
'Combodo\\iTop\\Portal\\DependencyInjection\\SilexCompatBootstrap\\PortalXmlConfiguration\\Basic' => __DIR__ . '/../..' . '/src/DependencyInjection/SilexCompatBootstrap/PortalXmlConfiguration/Basic.php',
'Combodo\\iTop\\Portal\\DependencyInjection\\SilexCompatBootstrap\\PortalXmlConfiguration\\Forms' => __DIR__ . '/../..' . '/src/DependencyInjection/SilexCompatBootstrap/PortalXmlConfiguration/Forms.php',
'Combodo\\iTop\\Portal\\DependencyInjection\\SilexCompatBootstrap\\PortalXmlConfiguration\\Lists' => __DIR__ . '/../..' . '/src/DependencyInjection/SilexCompatBootstrap/PortalXmlConfiguration/Lists.php',
'Combodo\\iTop\\Portal\\EventListener\\ApplicationContextSetPluginPropertyClass' => __DIR__ . '/../..' . '/src/EventListener/ApplicationContextSetPluginPropertyClass.php',
'Combodo\\iTop\\Portal\\EventListener\\ApplicationContextSetUrlMakerClass' => __DIR__ . '/../..' . '/src/EventListener/ApplicationContextSetUrlMakerClass.php',
'Combodo\\iTop\\Portal\\EventListener\\CssFromSassCompiler' => __DIR__ . '/../..' . '/src/EventListener/CssFromSassCompiler.php',
'Combodo\\iTop\\Portal\\EventListener\\ExceptionListener' => __DIR__ . '/../..' . '/src/EventListener/ExceptionListener.php',
'Combodo\\iTop\\Portal\\EventListener\\UserProvider' => __DIR__ . '/../..' . '/src/EventListener/UserProvider.php',
'Combodo\\iTop\\Portal\\Form\\ObjectFormManager' => __DIR__ . '/../..' . '/src/Form/ObjectFormManager.php',
'Combodo\\iTop\\Portal\\Form\\PasswordFormManager' => __DIR__ . '/../..' . '/src/Form/PasswordFormManager.php',
'Combodo\\iTop\\Portal\\Form\\PreferencesFormManager' => __DIR__ . '/../..' . '/src/Form/PreferencesFormManager.php',
'Combodo\\iTop\\Portal\\Helper\\ApplicationHelper' => __DIR__ . '/../..' . '/src/Helper/ApplicationHelper.php',
'Combodo\\iTop\\Portal\\Helper\\BrickControllerHelper' => __DIR__ . '/../..' . '/src/Helper/BrickControllerHelper.php',
'Combodo\\iTop\\Portal\\Helper\\BrowseBrickHelper' => __DIR__ . '/../..' . '/src/Helper/BrowseBrickHelper.php',
'Combodo\\iTop\\Portal\\Helper\\ContextManipulatorHelper' => __DIR__ . '/../..' . '/src/Helper/ContextManipulatorHelper.php',
'Combodo\\iTop\\Portal\\Helper\\LifecycleValidatorHelper' => __DIR__ . '/../..' . '/src/Helper/LifecycleValidatorHelper.php',
'Combodo\\iTop\\Portal\\Helper\\NavigationRuleHelper' => __DIR__ . '/../..' . '/src/Helper/NavigationRuleHelper.php',
'Combodo\\iTop\\Portal\\Helper\\ObjectFormHandlerHelper' => __DIR__.'/../..'.'/src/Helper/ObjectFormHandlerHelper.php',
'Combodo\\iTop\\Portal\\Helper\\RequestManipulatorHelper' => __DIR__.'/../..'.'/src/Helper/RequestManipulatorHelper.php',
'Combodo\\iTop\\Portal\\Helper\\ScopeValidatorHelper' => __DIR__.'/../..'.'/src/Helper/ScopeValidatorHelper.php',
'Combodo\\iTop\\Portal\\Helper\\SecurityHelper' => __DIR__.'/../..'.'/src/Helper/SecurityHelper.php',
'Combodo\\iTop\\Portal\\Helper\\SessionMessageHelper' => __DIR__.'/../..'.'/src/Helper/SessionMessageHelper.php',
'Combodo\\iTop\\Portal\\Helper\\UIExtensionsHelper' => __DIR__.'/../..'.'/src/Helper/UIExtensionsHelper.php',
'Combodo\\iTop\\Portal\\Kernel' => __DIR__.'/../..'.'/src/Kernel.php',
'Combodo\\iTop\\Portal\\Routing\\ItopExtensionsExtraRoutes' => __DIR__.'/../..'.'/src/Routing/ItopExtensionsExtraRoutes.php',
'Combodo\\iTop\\Portal\\Routing\\UrlGenerator' => __DIR__.'/../..'.'/src/Routing/UrlGenerator.php',
'Combodo\\iTop\\Portal\\Twig\\AppExtension' => __DIR__.'/../..'.'/src/Twig/AppExtension.php',
'Combodo\\iTop\\Portal\\Twig\\CurrentUserAccessor' => __DIR__.'/../..'.'/src/Twig/CurrentUserAccessor.php',
'Combodo\\iTop\\Portal\\Twig\\AppGlobal' => __DIR__.'/../..'.'/src/Twig/AppGlobal.php',
'Combodo\\iTop\\Portal\\Twig\\AppVariable' => __DIR__.'/../..'.'/src/Twig/AppVariable.php',
'Combodo\\iTop\\Portal\\UrlMaker\\AbstractPortalUrlMaker' => __DIR__.'/../..'.'/src/UrlMaker/AbstractPortalUrlMaker.php',
'Combodo\\iTop\\Portal\\VariableAccessor\\AbstractStringVariableAccessor' => __DIR__.'/../..'.'/src/VariableAccessor/AbstractStringVariableAccessor.php',
'Combodo\\iTop\\Portal\\VariableAccessor\\AbstractVariableAccessor' => __DIR__.'/../..'.'/src/VariableAccessor/AbstractVariableAccessor.php',
'Combodo\\iTop\\Portal\\VariableAccessor\\CombodoCurrentContactPhotoUrl' => __DIR__.'/../..'.'/src/VariableAccessor/CombodoCurrentContactPhotoUrl.php',
'Combodo\\iTop\\Portal\\VariableAccessor\\CombodoPortalInstanceConf' => __DIR__.'/../..'.'/src/VariableAccessor/CombodoPortalInstanceConf.php',
'Combodo\\iTop\\Portal\\Brick\\AbstractBrick' => __DIR__ . '/../..' . '/src/Brick/AbstractBrick.php',
'Combodo\\iTop\\Portal\\Brick\\AggregatePageBrick' => __DIR__ . '/../..' . '/src/Brick/AggregatePageBrick.php',
'Combodo\\iTop\\Portal\\Brick\\BrickCollection' => __DIR__ . '/../..' . '/src/Brick/BrickCollection.php',
'Combodo\\iTop\\Portal\\Brick\\BrickNotFoundException' => __DIR__ . '/../..' . '/src/Brick/BrickNotFoundException.php',
'Combodo\\iTop\\Portal\\Brick\\BrowseBrick' => __DIR__ . '/../..' . '/src/Brick/BrowseBrick.php',
'Combodo\\iTop\\Portal\\Brick\\CreateBrick' => __DIR__ . '/../..' . '/src/Brick/CreateBrick.php',
'Combodo\\iTop\\Portal\\Brick\\FilterBrick' => __DIR__ . '/../..' . '/src/Brick/FilterBrick.php',
'Combodo\\iTop\\Portal\\Brick\\ManageBrick' => __DIR__ . '/../..' . '/src/Brick/ManageBrick.php',
'Combodo\\iTop\\Portal\\Brick\\PortalBrick' => __DIR__ . '/../..' . '/src/Brick/PortalBrick.php',
'Combodo\\iTop\\Portal\\Brick\\PropertyNotFoundException' => __DIR__ . '/../..' . '/src/Brick/PropertyNotFoundException.php',
'Combodo\\iTop\\Portal\\Brick\\UserProfileBrick' => __DIR__ . '/../..' . '/src/Brick/UserProfileBrick.php',
'Combodo\\iTop\\Portal\\Controller\\AbstractController' => __DIR__ . '/../..' . '/src/Controller/AbstractController.php',
'Combodo\\iTop\\Portal\\Controller\\AggregatePageBrickController' => __DIR__ . '/../..' . '/src/Controller/AggregatePageBrickController.php',
'Combodo\\iTop\\Portal\\Controller\\BrickController' => __DIR__ . '/../..' . '/src/Controller/BrickController.php',
'Combodo\\iTop\\Portal\\Controller\\BrowseBrickController' => __DIR__ . '/../..' . '/src/Controller/BrowseBrickController.php',
'Combodo\\iTop\\Portal\\Controller\\CreateBrickController' => __DIR__ . '/../..' . '/src/Controller/CreateBrickController.php',
'Combodo\\iTop\\Portal\\Controller\\DefaultController' => __DIR__ . '/../..' . '/src/Controller/DefaultController.php',
'Combodo\\iTop\\Portal\\Controller\\ManageBrickController' => __DIR__ . '/../..' . '/src/Controller/ManageBrickController.php',
'Combodo\\iTop\\Portal\\Controller\\ObjectController' => __DIR__ . '/../..' . '/src/Controller/ObjectController.php',
'Combodo\\iTop\\Portal\\Controller\\SessionMessageController' => __DIR__ . '/../..' . '/src/Controller/SessionMessageController.php',
'Combodo\\iTop\\Portal\\Controller\\UserProfileBrickController' => __DIR__ . '/../..' . '/src/Controller/UserProfileBrickController.php',
'Combodo\\iTop\\Portal\\DependencyInjection\\SilexCompatBootstrap\\PortalXmlConfiguration\\AbstractConfiguration' => __DIR__ . '/../..' . '/src/DependencyInjection/SilexCompatBootstrap/PortalXmlConfiguration/AbstractConfiguration.php',
'Combodo\\iTop\\Portal\\DependencyInjection\\SilexCompatBootstrap\\PortalXmlConfiguration\\Basic' => __DIR__ . '/../..' . '/src/DependencyInjection/SilexCompatBootstrap/PortalXmlConfiguration/Basic.php',
'Combodo\\iTop\\Portal\\DependencyInjection\\SilexCompatBootstrap\\PortalXmlConfiguration\\Forms' => __DIR__ . '/../..' . '/src/DependencyInjection/SilexCompatBootstrap/PortalXmlConfiguration/Forms.php',
'Combodo\\iTop\\Portal\\DependencyInjection\\SilexCompatBootstrap\\PortalXmlConfiguration\\Lists' => __DIR__ . '/../..' . '/src/DependencyInjection/SilexCompatBootstrap/PortalXmlConfiguration/Lists.php',
'Combodo\\iTop\\Portal\\EventListener\\ApplicationContextSetPluginPropertyClass' => __DIR__ . '/../..' . '/src/EventListener/ApplicationContextSetPluginPropertyClass.php',
'Combodo\\iTop\\Portal\\EventListener\\ApplicationContextSetUrlMakerClass' => __DIR__ . '/../..' . '/src/EventListener/ApplicationContextSetUrlMakerClass.php',
'Combodo\\iTop\\Portal\\EventListener\\CssFromSassCompiler' => __DIR__ . '/../..' . '/src/EventListener/CssFromSassCompiler.php',
'Combodo\\iTop\\Portal\\EventListener\\ExceptionListener' => __DIR__ . '/../..' . '/src/EventListener/ExceptionListener.php',
'Combodo\\iTop\\Portal\\EventListener\\UserProvider' => __DIR__ . '/../..' . '/src/EventListener/UserProvider.php',
'Combodo\\iTop\\Portal\\Form\\ObjectFormManager' => __DIR__ . '/../..' . '/src/Form/ObjectFormManager.php',
'Combodo\\iTop\\Portal\\Form\\PasswordFormManager' => __DIR__ . '/../..' . '/src/Form/PasswordFormManager.php',
'Combodo\\iTop\\Portal\\Form\\PreferencesFormManager' => __DIR__ . '/../..' . '/src/Form/PreferencesFormManager.php',
'Combodo\\iTop\\Portal\\Helper\\ApplicationHelper' => __DIR__ . '/../..' . '/src/Helper/ApplicationHelper.php',
'Combodo\\iTop\\Portal\\Helper\\BrickControllerHelper' => __DIR__ . '/../..' . '/src/Helper/BrickControllerHelper.php',
'Combodo\\iTop\\Portal\\Helper\\BrowseBrickHelper' => __DIR__ . '/../..' . '/src/Helper/BrowseBrickHelper.php',
'Combodo\\iTop\\Portal\\Helper\\ContextManipulatorHelper' => __DIR__ . '/../..' . '/src/Helper/ContextManipulatorHelper.php',
'Combodo\\iTop\\Portal\\Helper\\LifecycleValidatorHelper' => __DIR__ . '/../..' . '/src/Helper/LifecycleValidatorHelper.php',
'Combodo\\iTop\\Portal\\Helper\\NavigationRuleHelper' => __DIR__ . '/../..' . '/src/Helper/NavigationRuleHelper.php',
'Combodo\\iTop\\Portal\\Helper\\ObjectFormHandlerHelper' => __DIR__ . '/../..' . '/src/Helper/ObjectFormHandlerHelper.php',
'Combodo\\iTop\\Portal\\Helper\\RequestManipulatorHelper' => __DIR__ . '/../..' . '/src/Helper/RequestManipulatorHelper.php',
'Combodo\\iTop\\Portal\\Helper\\ScopeValidatorHelper' => __DIR__ . '/../..' . '/src/Helper/ScopeValidatorHelper.php',
'Combodo\\iTop\\Portal\\Helper\\SecurityHelper' => __DIR__ . '/../..' . '/src/Helper/SecurityHelper.php',
'Combodo\\iTop\\Portal\\Helper\\SessionMessageHelper' => __DIR__ . '/../..' . '/src/Helper/SessionMessageHelper.php',
'Combodo\\iTop\\Portal\\Helper\\UIExtensionsHelper' => __DIR__ . '/../..' . '/src/Helper/UIExtensionsHelper.php',
'Combodo\\iTop\\Portal\\Kernel' => __DIR__ . '/../..' . '/src/Kernel.php',
'Combodo\\iTop\\Portal\\Routing\\ItopExtensionsExtraRoutes' => __DIR__ . '/../..' . '/src/Routing/ItopExtensionsExtraRoutes.php',
'Combodo\\iTop\\Portal\\Routing\\UrlGenerator' => __DIR__ . '/../..' . '/src/Routing/UrlGenerator.php',
'Combodo\\iTop\\Portal\\Twig\\AppExtension' => __DIR__ . '/../..' . '/src/Twig/AppExtension.php',
'Combodo\\iTop\\Portal\\Twig\\AppGlobal' => __DIR__ . '/../..' . '/src/Twig/AppGlobal.php',
'Combodo\\iTop\\Portal\\Twig\\AppVariable' => __DIR__ . '/../..' . '/src/Twig/AppVariable.php',
'Combodo\\iTop\\Portal\\Twig\\CurrentUserAccessor' => __DIR__ . '/../..' . '/src/Twig/CurrentUserAccessor.php',
'Combodo\\iTop\\Portal\\UrlMaker\\AbstractPortalUrlMaker' => __DIR__ . '/../..' . '/src/UrlMaker/AbstractPortalUrlMaker.php',
'Combodo\\iTop\\Portal\\VariableAccessor\\AbstractStringVariableAccessor' => __DIR__ . '/../..' . '/src/VariableAccessor/AbstractStringVariableAccessor.php',
'Combodo\\iTop\\Portal\\VariableAccessor\\AbstractVariableAccessor' => __DIR__ . '/../..' . '/src/VariableAccessor/AbstractVariableAccessor.php',
'Combodo\\iTop\\Portal\\VariableAccessor\\CombodoCurrentContactPhotoUrl' => __DIR__ . '/../..' . '/src/VariableAccessor/CombodoCurrentContactPhotoUrl.php',
'Combodo\\iTop\\Portal\\VariableAccessor\\CombodoPortalInstanceConf' => __DIR__ . '/../..' . '/src/VariableAccessor/CombodoPortalInstanceConf.php',
'Composer\\InstalledVersions' => __DIR__ . '/..' . '/composer/InstalledVersions.php',
);
public static function getInitializer(ClassLoader $loader)

View File

@@ -1 +1,5 @@
[]
{
"packages": [],
"dev": true,
"dev-package-names": []
}

View File

@@ -0,0 +1,23 @@
<?php return array(
'root' => array(
'name' => '__root__',
'pretty_version' => 'dev-develop',
'version' => 'dev-develop',
'reference' => 'c9beba0ceadf11c644a8eb1b254efff9b17d804c',
'type' => 'library',
'install_path' => __DIR__ . '/../../',
'aliases' => array(),
'dev' => true,
),
'versions' => array(
'__root__' => array(
'pretty_version' => 'dev-develop',
'version' => 'dev-develop',
'reference' => 'c9beba0ceadf11c644a8eb1b254efff9b17d804c',
'type' => 'library',
'install_path' => __DIR__ . '/../../',
'aliases' => array(),
'dev_requirement' => false,
),
),
);

View File

@@ -20,6 +20,9 @@
<attributes>
<attribute id="ref"/>
</attributes>
<complementary_attributes>
<attribute id="title"></attribute>
</complementary_attributes>
</naming>
<fields_semantic>
<state_attribute>status</state_attribute>

View File

@@ -124,3 +124,26 @@ Dict::Add('FR FR', 'French', 'Français', array(
'Class:Problem/Stimulus:ev_close' => 'Fermer',
'Class:Problem/Stimulus:ev_close+' => '',
));
// 1:n relations custom labels for tooltip and pop-up title
Dict::Add('FR FR', 'French', 'Français', array(
'Class:Problem/Attribute:knownerrors_list/UI:Links:Create:Button+' => 'Créer une %4$s',
'Class:Problem/Attribute:knownerrors_list/UI:Links:Create:Modal:Title' => 'Ajouter une %4$s à %2$s',
'Class:Problem/Attribute:knownerrors_list/UI:Links:Remove:Button+' => 'Retirer cette %4$s',
'Class:Problem/Attribute:knownerrors_list/UI:Links:Remove:Modal:Title' => 'Retirer cette %4$s de son %1$s',
'Class:Problem/Attribute:knownerrors_list/UI:Links:Delete:Button+' => 'Supprimer cette %4$s',
'Class:Problem/Attribute:knownerrors_list/UI:Links:Delete:Modal:Title' => 'Supprimer une %4$s',
'Class:Problem/Attribute:related_incident_list/UI:Links:Create:Button+' => 'Créer un %4$s',
'Class:Problem/Attribute:related_incident_list/UI:Links:Create:Modal:Title' => 'Ajouter un %4$s à %2$s',
'Class:Problem/Attribute:related_incident_list/UI:Links:Remove:Button+' => 'Retirer ce %4$s',
'Class:Problem/Attribute:related_incident_list/UI:Links:Remove:Modal:Title' => 'Retirer ce %4$s de son %1$s',
'Class:Problem/Attribute:related_incident_list/UI:Links:Delete:Button+' => 'Supprimer ce %4$s',
'Class:Problem/Attribute:related_incident_list/UI:Links:Delete:Modal:Title' => 'Supprimer un %4$s',
'Class:Problem/Attribute:related_request_list/UI:Links:Create:Button+' => 'Créer une %4$s',
'Class:Problem/Attribute:related_request_list/UI:Links:Create:Modal:Title' => 'Ajouter une %4$s à %2$s',
'Class:Problem/Attribute:related_request_list/UI:Links:Remove:Button+' => 'Retirer cette %4$s',
'Class:Problem/Attribute:related_request_list/UI:Links:Remove:Modal:Title' => 'Retirer cette %4$s de son %1$s',
'Class:Problem/Attribute:related_request_list/UI:Links:Delete:Button+' => 'Supprimer cette %4$s',
'Class:Problem/Attribute:related_request_list/UI:Links:Delete:Modal:Title' => 'Supprimer une %4$s',
));

View File

@@ -20,6 +20,9 @@
<attributes>
<attribute id="ref"/>
</attributes>
<complementary_attributes>
<attribute id="title"></attribute>
</complementary_attributes>
</naming>
<fields_semantic>
<state_attribute>status</state_attribute>

View File

@@ -261,3 +261,14 @@ Dict::Add('FR FR', 'French', 'Français', array(
'Organization:Overview:MyUserRequests' => 'Mes Demandes Utilisateurs pour cette organisation',
'Organization:Overview:Tickets' => 'Les Tickets de cette organisation',
));
// 1:n relations custom labels for tooltip and pop-up title
Dict::Add('FR FR', 'French', 'Français', array(
'Class:UserRequest/Attribute:related_request_list/UI:Links:Create:Button+' => 'Créer une %4$s',
'Class:UserRequest/Attribute:related_request_list/UI:Links:Create:Modal:Title' => 'Ajouter une %4$s à %2$s',
'Class:UserRequest/Attribute:related_request_list/UI:Links:Remove:Button+' => 'Retirer cette %4$s',
'Class:UserRequest/Attribute:related_request_list/UI:Links:Remove:Modal:Title' => 'Retirer cette %4$s de sa %1$s',
'Class:UserRequest/Attribute:related_request_list/UI:Links:Delete:Button+' => 'Supprimer cette %4$s',
'Class:UserRequest/Attribute:related_request_list/UI:Links:Delete:Modal:Title' => 'Supprimer une %4$s',
));

View File

@@ -20,6 +20,9 @@
<attributes>
<attribute id="ref"/>
</attributes>
<complementary_attributes>
<attribute id="title"></attribute>
</complementary_attributes>
</naming>
<fields_semantic>
<state_attribute>status</state_attribute>

View File

@@ -289,3 +289,14 @@ Dict::Add('FR FR', 'French', 'Français', array(
'Organization:Overview:MyUserRequests' => 'Mes Demandes Utilisateurs pour cette organisation',
'Organization:Overview:Tickets' => 'Les Tickets de cette organisation',
));
// 1:n relations custom labels for tooltip and pop-up title
Dict::Add('FR FR', 'French', 'Français', array(
'Class:UserRequest/Attribute:related_request_list/UI:Links:Create:Button+' => 'Créer une %4$s',
'Class:UserRequest/Attribute:related_request_list/UI:Links:Create:Modal:Title' => 'Ajouter une %4$s à %2$s',
'Class:UserRequest/Attribute:related_request_list/UI:Links:Remove:Button+' => 'Retirer cette %4$s',
'Class:UserRequest/Attribute:related_request_list/UI:Links:Remove:Modal:Title' => 'Retirer cette %4$s de sa %1$s',
'Class:UserRequest/Attribute:related_request_list/UI:Links:Delete:Button+' => 'Supprimer cette %4$s',
'Class:UserRequest/Attribute:related_request_list/UI:Links:Delete:Modal:Title' => 'Supprimer une %4$s',
));

View File

@@ -279,6 +279,9 @@ public function PrefillSearchForm(&$aContextParam)
<item id="provider_id">
<rank>30</rank>
</item>
<item id="status">
<rank>40</rank>
</item>
</items>
</default_search>
<search>
@@ -457,50 +460,74 @@ public function PrefillSearchForm(&$aContextParam)
<presentation>
<details>
<items>
<item id="name">
<item id="col:col1">
<rank>10</rank>
<items>
<item id="fieldset:Contract:baseinfo">
<rank>10</rank>
<items>
<item id="name">
<rank>10</rank>
</item>
<item id="org_id">
<rank>20</rank>
</item>
<item id="provider_id">
<rank>30</rank>
</item>
<item id="contracttype_id">
<rank>40</rank>
</item>
<item id="description">
<rank>50</rank>
</item>
</items>
</item>
</items>
</item>
<item id="org_id">
<item id="col:col2">
<rank>20</rank>
<items>
<item id="fieldset:Contract:moreinfo">
<rank>10</rank>
<items>
<item id="status">
<rank>10</rank>
</item>
<item id="start_date">
<rank>20</rank>
</item>
<item id="end_date">
<rank>30</rank>
</item>
</items>
</item>
<item id="fieldset:Contract:cost">
<items>
<item id="cost">
<rank>40</rank>
</item>
<item id="cost_currency">
<rank>50</rank>
</item>
<item id="cost_unit">
<rank>60</rank>
</item>
<item id="billing_frequency">
<rank>70</rank>
</item>
</items>
</item>
</items>
</item>
<item id="contacts_list">
<rank>30</rank>
</item>
<item id="documents_list">
<rank>40</rank>
</item>
<item id="description">
<rank>50</rank>
</item>
<item id="start_date">
<rank>60</rank>
</item>
<item id="end_date">
<rank>70</rank>
</item>
<item id="cost">
<rank>80</rank>
</item>
<item id="cost_currency">
<rank>90</rank>
</item>
<item id="billing_frequency">
<rank>100</rank>
</item>
<item id="cost_unit">
<item id="documents_list">
<rank>110</rank>
</item>
<item id="provider_id">
<rank>120</rank>
</item>
<item id="status">
<rank>130</rank>
</item>
<item id="contracttype_id">
<rank>140</rank>
</item>
<item id="services_list">
<rank>150</rank>
<rank>140</rank>
</item>
<item id="functionalcis_list">
<rank>160</rank>
@@ -626,57 +653,81 @@ public function PrefillSearchForm(&$aContextParam)
<presentation>
<details>
<items>
<item id="name">
<item id="col:col1">
<rank>10</rank>
<items>
<item id="fieldset:Contract:baseinfo">
<rank>10</rank>
<items>
<item id="name">
<rank>10</rank>
</item>
<item id="org_id">
<rank>20</rank>
</item>
<item id="provider_id">
<rank>30</rank>
</item>
<item id="contracttype_id">
<rank>40</rank>
</item>
<item id="description">
<rank>50</rank>
</item>
</items>
</item>
</items>
</item>
<item id="org_id">
<item id="col:col2">
<rank>20</rank>
<items>
<item id="fieldset:Contract:moreinfo">
<rank>10</rank>
<items>
<item id="status">
<rank>10</rank>
</item>
<item id="start_date">
<rank>20</rank>
</item>
<item id="end_date">
<rank>30</rank>
</item>
<item id="sla">
<rank>40</rank>
</item>
<item id="coverage">
<rank>50</rank>
</item>
</items>
</item>
<item id="fieldset:Contract:cost">
<items>
<item id="cost">
<rank>40</rank>
</item>
<item id="cost_currency">
<rank>50</rank>
</item>
<item id="cost_unit">
<rank>60</rank>
</item>
<item id="billing_frequency">
<rank>70</rank>
</item>
</items>
</item>
</items>
</item>
<item id="contacts_list">
<rank>30</rank>
</item>
<item id="documents_list">
<rank>40</rank>
</item>
<item id="description">
<rank>50</rank>
</item>
<item id="start_date">
<rank>60</rank>
</item>
<item id="end_date">
<rank>70</rank>
</item>
<item id="cost">
<rank>80</rank>
</item>
<item id="cost_currency">
<rank>90</rank>
</item>
<item id="billing_frequency">
<rank>100</rank>
</item>
<item id="cost_unit">
<item id="documents_list">
<rank>110</rank>
</item>
<item id="provider_id">
<rank>120</rank>
</item>
<item id="functionalcis_list">
<rank>130</rank>
</item>
<item id="sla">
<rank>140</rank>
</item>
<item id="coverage">
<rank>150</rank>
</item>
<item id="status">
<rank>160</rank>
</item>
<item id="contracttype_id">
<rank>170</rank>
</item>
</items>
</details>
<search>
@@ -1475,7 +1526,7 @@ public function PrefillSearchForm(&$aContextParam)
</attributes>
<complementary_attributes>
<attribute id="service_provider"></attribute>
<attribute id="status"></attribute>
<attribute id="request_type"></attribute>
</complementary_attributes>
</naming>
<fields_semantic>

View File

@@ -31,7 +31,9 @@
// Class:<class_name>/Stimulus:<stimulus_code>
// Class:<class_name>/Stimulus:<stimulus_code>+
//
// Menu, fieldsets, UI, messages translations
//
Dict::Add('EN US', 'English', 'English', array(
'Menu:ServiceManagement' => 'Service Management',
'Menu:ServiceManagement+' => 'Service Management Overview',
@@ -59,8 +61,11 @@ Dict::Add('EN US', 'English', 'English', array(
'Menu:DeliveryModel+' => 'Delivery models',
'Menu:ServiceFamily' => 'Service families',
'Menu:ServiceFamily+' => 'Service families',
));
'Contract:baseinfo' => 'General information',
'Contract:moreinfo' => 'Contractual information',
'Contract:cost' => 'Cost information',
));
/*
'UI:ServiceManagementMenu' => 'Gestion des Services',

View File

@@ -20,7 +20,7 @@
* @license http://opensource.org/licenses/AGPL-3.0
*/
//
// Class: ContractType
// Menu, fieldsets, UI, messages translations
//
Dict::Add('FR FR', 'French', 'Français', array(
'Menu:ServiceManagement' => 'Gestion des services',
@@ -49,8 +49,11 @@ Dict::Add('FR FR', 'French', 'Français', array(
'Menu:DeliveryModel+' => 'Modèles de support',
'Menu:ServiceFamily' => 'Familles de service',
'Menu:ServiceFamily+' => 'Familles de service',
));
'Contract:baseinfo' => 'Information générale',
'Contract:moreinfo' => 'Aspects contractuels',
'Contract:cost' => 'Coûts',
));
/*
'UI:ServiceManagementMenu' => 'Gestion des Services',
@@ -527,3 +530,26 @@ Dict::Add('FR FR', 'French', 'Français', array(
'Class:lnkDeliveryModelToContact/Attribute:role_name' => 'Nom Rôle',
'Class:lnkDeliveryModelToContact/Attribute:role_name+' => '',
));
// 1:n relations custom labels for tooltip and pop-up title
Dict::Add('FR FR', 'French', 'Français', array(
'Class:DeliveryModel/Attribute:customers_list/UI:Links:Create:Button+' => 'Créer un %4$s',
'Class:DeliveryModel/Attribute:customers_list/UI:Links:Create:Modal:Title' => 'Ajouter un %4$s à %2$s',
'Class:DeliveryModel/Attribute:customers_list/UI:Links:Remove:Button+' => 'Retirer ce %4$s',
'Class:DeliveryModel/Attribute:customers_list/UI:Links:Remove:Modal:Title' => 'Retirer ce %4$s de son %1$s',
'Class:DeliveryModel/Attribute:customers_list/UI:Links:Delete:Button+' => 'Supprimer ce %4$s',
'Class:DeliveryModel/Attribute:customers_list/UI:Links:Delete:Modal:Title' => 'Supprimer un %4$s',
'Class:Service/Attribute:servicesubcategories_list/UI:Links:Create:Button+' => 'Créer un %4$s',
'Class:Service/Attribute:servicesubcategories_list/UI:Links:Create:Modal:Title' => 'Ajouter un %4$s à %2$s',
'Class:Service/Attribute:servicesubcategories_list/UI:Links:Remove:Button+' => 'Retirer ce %4$s',
'Class:Service/Attribute:servicesubcategories_list/UI:Links:Remove:Modal:Title' => 'Retirer ce %4$s de son %1$s',
'Class:Service/Attribute:servicesubcategories_list/UI:Links:Delete:Button+' => 'Supprimer ce %4$s',
'Class:Service/Attribute:servicesubcategories_list/UI:Links:Delete:Modal:Title' => 'Supprimer un %4$s',
'Class:ServiceFamily/Attribute:services_list/UI:Links:Create:Button+' => 'Créer un %4$s',
'Class:ServiceFamily/Attribute:services_list/UI:Links:Create:Modal:Title' => 'Ajouter un %4$s à %2$s',
'Class:ServiceFamily/Attribute:services_list/UI:Links:Remove:Button+' => 'Retirer ce %4$s',
'Class:ServiceFamily/Attribute:services_list/UI:Links:Remove:Modal:Title' => 'Retirer ce %4$s de sa %1$s',
'Class:ServiceFamily/Attribute:services_list/UI:Links:Delete:Button+' => 'Supprimer ce %4$s',
'Class:ServiceFamily/Attribute:services_list/UI:Links:Delete:Modal:Title' => 'Supprimer un %4$s',
));

View File

@@ -279,6 +279,9 @@ public function PrefillSearchForm(&$aContextParam)
<item id="provider_id">
<rank>30</rank>
</item>
<item id="status">
<rank>40</rank>
</item>
</items>
</default_search>
<search>
@@ -439,50 +442,74 @@ public function PrefillSearchForm(&$aContextParam)
<presentation>
<details>
<items>
<item id="name">
<item id="col:col1">
<rank>10</rank>
<items>
<item id="fieldset:Contract:baseinfo">
<rank>10</rank>
<items>
<item id="name">
<rank>10</rank>
</item>
<item id="org_id">
<rank>20</rank>
</item>
<item id="provider_id">
<rank>30</rank>
</item>
<item id="contracttype_id">
<rank>40</rank>
</item>
<item id="description">
<rank>50</rank>
</item>
</items>
</item>
</items>
</item>
<item id="org_id">
<item id="col:col2">
<rank>20</rank>
<items>
<item id="fieldset:Contract:moreinfo">
<rank>10</rank>
<items>
<item id="status">
<rank>10</rank>
</item>
<item id="start_date">
<rank>20</rank>
</item>
<item id="end_date">
<rank>30</rank>
</item>
</items>
</item>
<item id="fieldset:Contract:cost">
<items>
<item id="cost">
<rank>40</rank>
</item>
<item id="cost_currency">
<rank>50</rank>
</item>
<item id="cost_unit">
<rank>60</rank>
</item>
<item id="billing_frequency">
<rank>70</rank>
</item>
</items>
</item>
</items>
</item>
<item id="contacts_list">
<rank>30</rank>
</item>
<item id="documents_list">
<rank>40</rank>
</item>
<item id="description">
<rank>50</rank>
</item>
<item id="start_date">
<rank>60</rank>
</item>
<item id="end_date">
<rank>70</rank>
</item>
<item id="cost">
<rank>80</rank>
</item>
<item id="cost_currency">
<rank>90</rank>
</item>
<item id="billing_frequency">
<rank>100</rank>
</item>
<item id="cost_unit">
<item id="documents_list">
<rank>110</rank>
</item>
<item id="provider_id">
<rank>120</rank>
</item>
<item id="status">
<rank>130</rank>
</item>
<item id="contracttype_id">
<rank>140</rank>
</item>
<item id="services_list">
<rank>150</rank>
<rank>140</rank>
</item>
</items>
</details>
@@ -594,62 +621,98 @@ public function PrefillSearchForm(&$aContextParam)
<default_value/>
<is_null_allowed>true</is_null_allowed>
</field>
<field id="services_list" xsi:type="AttributeLinkedSetIndirect">
<linked_class>lnkProviderContractToService</linked_class>
<ext_key_to_me>providercontract_id</ext_key_to_me>
<count_min>0</count_min>
<count_max>0</count_max>
<ext_key_to_remote>service_id</ext_key_to_remote>
<duplicates/>
<read_only>false</read_only>
</field>
</fields>
<methods/>
<presentation>
<details>
<items>
<item id="name">
<item id="col:col1">
<rank>10</rank>
<items>
<item id="fieldset:Contract:baseinfo">
<rank>10</rank>
<items>
<item id="name">
<rank>10</rank>
</item>
<item id="org_id">
<rank>20</rank>
</item>
<item id="provider_id">
<rank>30</rank>
</item>
<item id="contracttype_id">
<rank>40</rank>
</item>
<item id="description">
<rank>50</rank>
</item>
</items>
</item>
</items>
</item>
<item id="org_id">
<item id="col:col2">
<rank>20</rank>
<items>
<item id="fieldset:Contract:moreinfo">
<rank>10</rank>
<items>
<item id="status">
<rank>10</rank>
</item>
<item id="start_date">
<rank>20</rank>
</item>
<item id="end_date">
<rank>30</rank>
</item>
<item id="sla">
<rank>40</rank>
</item>
<item id="coverage">
<rank>50</rank>
</item>
</items>
</item>
<item id="fieldset:Contract:cost">
<items>
<item id="cost">
<rank>40</rank>
</item>
<item id="cost_currency">
<rank>50</rank>
</item>
<item id="cost_unit">
<rank>60</rank>
</item>
<item id="billing_frequency">
<rank>70</rank>
</item>
</items>
</item>
</items>
</item>
<item id="contacts_list">
<rank>30</rank>
</item>
<item id="documents_list">
<rank>40</rank>
</item>
<item id="description">
<rank>50</rank>
</item>
<item id="start_date">
<rank>60</rank>
</item>
<item id="end_date">
<rank>70</rank>
</item>
<item id="contracttype_id">
<rank>80</rank>
</item>
<item id="cost">
<rank>90</rank>
</item>
<item id="cost_currency">
<rank>100</rank>
</item>
<item id="billing_frequency">
<item id="documents_list">
<rank>110</rank>
</item>
<item id="cost_unit">
<rank>120</rank>
</item>
<item id="provider_id">
<item id="functionalcis_list">
<rank>130</rank>
</item>
<item id="functionalcis_list">
<item id="services_list">
<rank>140</rank>
</item>
<item id="sla">
<rank>150</rank>
</item>
<item id="coverage">
<rank>160</rank>
</item>
<item id="status">
<rank>170</rank>
</item>
</items>
</details>
<search>
@@ -1475,7 +1538,7 @@ public function PrefillSearchForm(&$aContextParam)
</attributes>
<complementary_attributes>
<attribute id="service_provider"></attribute>
<attribute id="status"></attribute>
<attribute id="request_type"></attribute>
</complementary_attributes>
</naming>
<fields_semantic>

View File

@@ -31,6 +31,7 @@
// Class:<class_name>/Stimulus:<stimulus_code>
// Class:<class_name>/Stimulus:<stimulus_code>+
// Menu, fieldsets, UI, messages translations
Dict::Add('EN US', 'English', 'English', array(
'Menu:ServiceManagement' => 'Service management',
@@ -60,6 +61,10 @@ Dict::Add('EN US', 'English', 'English', array(
'Menu:ServiceFamily+' => 'Service families',
'Menu:Procedure' => 'Procedures catalog',
'Menu:Procedure+' => 'All procedures catalog',
'Contract:baseinfo' => 'General information',
'Contract:moreinfo' => 'Contractual information',
'Contract:cost' => 'Cost information',
));
//

View File

@@ -19,8 +19,9 @@
* @copyright Copyright (C) 2010-2023 Combodo SARL
* @license http://opensource.org/licenses/AGPL-3.0
*/
//
// Class: ContractType
// Menu, fieldsets, UI, messages translations
//
Dict::Add('FR FR', 'French', 'Français', array(
'Menu:ServiceManagement' => 'Gestion des services',
@@ -50,6 +51,10 @@ Dict::Add('FR FR', 'French', 'Français', array(
'Menu:ServiceFamily+' => 'Familles de service',
'Menu:Procedure' => 'Catalogue des procédures',
'Menu:Procedure+' => 'Catalogue des procédures',
'Contract:baseinfo' => 'Information générale',
'Contract:moreinfo' => 'Aspects contractuels',
'Contract:cost' => 'Coûts',
));
//
@@ -484,3 +489,31 @@ Dict::Add('FR FR', 'French', 'Français', array(
'Class:lnkDeliveryModelToContact/Attribute:role_name' => 'Nom Rôle',
'Class:lnkDeliveryModelToContact/Attribute:role_name+' => '',
));
// 1:n relations custom labels for tooltip and pop-up title
Dict::Add('FR FR', 'French', 'Français', array(
'Class:DeliveryModel/Attribute:customers_list/UI:Links:Create:Button+' => 'Créer un %4$s',
'Class:DeliveryModel/Attribute:customers_list/UI:Links:Create:Modal:Title' => 'Ajouter un %4$s à %2$s',
'Class:DeliveryModel/Attribute:customers_list/UI:Links:Remove:Button+' => 'Retirer ce %4$s',
'Class:DeliveryModel/Attribute:customers_list/UI:Links:Remove:Modal:Title' => 'Retirer ce %4$s de son %1$s',
'Class:DeliveryModel/Attribute:customers_list/UI:Links:Delete:Button+' => 'Supprimer ce %4$s',
'Class:DeliveryModel/Attribute:customers_list/UI:Links:Delete:Modal:Title' => 'Supprimer un %4$s',
'Class:Service/Attribute:services_list/UI:Links:Create:Button+' => 'Créer un %4$s',
'Class:Service/Attribute:services_list/UI:Links:Create:Modal:Title' => 'Ajouter un %4$s à %2$s',
'Class:Service/Attribute:services_list/UI:Links:Remove:Button+' => 'Retirer ce %4$s',
'Class:Service/Attribute:services_list/UI:Links:Remove:Modal:Title' => 'Retirer ce %4$s de son %1$s',
'Class:Service/Attribute:services_list/UI:Links:Delete:Button+' => 'Supprimer ce %4$s',
'Class:Service/Attribute:services_list/UI:Links:Delete:Modal:Title' => 'Supprimer un %4$s',
'Class:Service/Attribute:servicesubcategories_list/UI:Links:Create:Button+' => 'Créer une %4$s',
'Class:Service/Attribute:servicesubcategories_list/UI:Links:Create:Modal:Title' => 'Ajouter une %4$s à %2$s',
'Class:Service/Attribute:servicesubcategories_list/UI:Links:Remove:Button+' => 'Retirer cette %4$s',
'Class:Service/Attribute:servicesubcategories_list/UI:Links:Remove:Modal:Title' => 'Retirer cette %4$s de son %1$s',
'Class:Service/Attribute:servicesubcategories_list/UI:Links:Delete:Button+' => 'Supprimer cette %4$s',
'Class:Service/Attribute:servicesubcategories_list/UI:Links:Delete:Modal:Title' => 'Supprimer une %4$s',
'Class:SLA/Attribute:customercontracts_list/UI:Links:Create:Button+' => 'Créer un %4$s',
'Class:SLA/Attribute:customercontracts_list/UI:Links:Create:Modal:Title' => 'Ajouter un %4$s à %2$s',
'Class:SLA/Attribute:customercontracts_list/UI:Links:Remove:Button+' => 'Retirer ce %4$s',
'Class:SLA/Attribute:customercontracts_list/UI:Links:Remove:Modal:Title' => 'Retirer ce %4$s de son %1$s',
'Class:SLA/Attribute:customercontracts_list/UI:Links:Delete:Button+' => 'Supprimer ce %4$s',
'Class:SLA/Attribute:customercontracts_list/UI:Links:Delete:Modal:Title' => 'Supprimer un %4$s',
));

View File

@@ -240,6 +240,19 @@
</item>
</items>
</list>
<summary>
<items>
<item id="org_id">
<rank>10</rank>
</item>
<item id="location_id">
<rank>20</rank>
</item>
<item id="model_id">
<rank>40</rank>
</item>
</items>
</summary>
</presentation>
<methods/>
<relations>
@@ -487,6 +500,19 @@
</item>
</items>
</list>
<summary>
<items>
<item id="org_id">
<rank>10</rank>
</item>
<item id="location_id">
<rank>20</rank>
</item>
<item id="model_id">
<rank>30</rank>
</item>
</items>
</summary>
</presentation>
<methods/>
<relations>
@@ -735,6 +761,19 @@
</item>
</items>
</list>
<summary>
<items>
<item id="org_id">
<rank>10</rank>
</item>
<item id="location_id">
<rank>20</rank>
</item>
<item id="model_id">
<rank>40</rank>
</item>
</items>
</summary>
</presentation>
<methods/>
<relations>
@@ -983,6 +1022,19 @@
</item>
</items>
</list>
<summary>
<items>
<item id="org_id">
<rank>10</rank>
</item>
<item id="location_id">
<rank>20</rank>
</item>
<item id="model_id">
<rank>30</rank>
</item>
</items>
</summary>
</presentation>
<methods/>
<relations>
@@ -1102,6 +1154,10 @@
<attributes>
<attribute id="name"/>
</attributes>
<complementary_attributes>
<attribute id="nas_name"></attribute>
<attribute id="location_name"/>
</complementary_attributes>
</naming>
<style>
<icon>../../images/icons/icons8-map-as-drive.svg</icon>
@@ -1147,6 +1203,18 @@
<extkey_attcode>nas_id</extkey_attcode>
<target_attcode>name</target_attcode>
</field>
<field id="org_id" xsi:type="AttributeExternalField">
<extkey_attcode>nas_id</extkey_attcode>
<target_attcode>org_id</target_attcode>
</field>
<field id="location_id" xsi:type="AttributeExternalField">
<extkey_attcode>nas_id</extkey_attcode>
<target_attcode>location_id</target_attcode>
</field>
<field id="location_name" xsi:type="AttributeExternalField">
<extkey_attcode>nas_id</extkey_attcode>
<target_attcode>location_name</target_attcode>
</field>
</fields>
<presentation>
<details>
@@ -1154,18 +1222,24 @@
<item id="name">
<rank>10</rank>
</item>
<item id="description">
<item id="nas_id">
<rank>20</rank>
</item>
<item id="nas_id">
<item id="location_id">
<rank>30</rank>
</item>
<item id="raid_level">
<item id="org_id">
<rank>40</rank>
</item>
<item id="size">
<item id="description">
<rank>50</rank>
</item>
<item id="raid_level">
<rank>60</rank>
</item>
<item id="size">
<rank>70</rank>
</item>
</items>
</details>
<search>
@@ -1194,6 +1268,22 @@
</item>
</items>
</list>
<summary>
<items>
<item id="nas_id">
<rank>10</rank>
</item>
<item id="location_id">
<rank>20</rank>
</item>
<item id="org_id">
<rank>30</rank>
</item>
<item id="raid_level">
<rank>40</rank>
</item>
</items>
</summary>
</presentation>
<methods/>
</class>
@@ -1254,6 +1344,14 @@
<extkey_attcode>datacenterdevice_id</extkey_attcode>
<target_attcode>name</target_attcode>
</field>
<field id="org_id" xsi:type="AttributeExternalField">
<extkey_attcode>datacenterdevice_id</extkey_attcode>
<target_attcode>org_id</target_attcode>
</field>
<field id="location_id" xsi:type="AttributeExternalField">
<extkey_attcode>datacenterdevice_id</extkey_attcode>
<target_attcode>location_id</target_attcode>
</field>
</fields>
<methods/>
<presentation>
@@ -1265,15 +1363,21 @@
<item id="datacenterdevice_id">
<rank>20</rank>
</item>
<item id="speed">
<item id="location_id">
<rank>30</rank>
</item>
<item id="topology">
<item id="org_id">
<rank>40</rank>
</item>
<item id="wwn">
<item id="speed">
<rank>50</rank>
</item>
<item id="topology">
<rank>60</rank>
</item>
<item id="wwn">
<rank>70</rank>
</item>
</items>
</details>
<search>
@@ -1305,6 +1409,22 @@
</item>
</items>
</list>
<summary>
<items>
<item id="wwn">
<rank>10</rank>
</item>
<item id="datacenterdevice_id">
<rank>20</rank>
</item>
<item id="location_id">
<rank>30</rank>
</item>
<item id="org_id">
<rank>40</rank>
</item>
</items>
</summary>
</presentation>
</class>
<class id="LogicalVolume" _delta="define">
@@ -1321,6 +1441,9 @@
<attribute id="storagesystem_name"/>
<attribute id="name"/>
</attributes>
<complementary_attributes>
<attribute id="lun_id"></attribute>
</complementary_attributes>
</naming>
<style>
<icon>../../images/icons/icons8-hdd.svg</icon>
@@ -1373,6 +1496,18 @@
<extkey_attcode>storagesystem_id</extkey_attcode>
<target_attcode>name</target_attcode>
</field>
<field id="org_id" xsi:type="AttributeExternalField">
<extkey_attcode>storagesystem_id</extkey_attcode>
<target_attcode>org_id</target_attcode>
</field>
<field id="location_id" xsi:type="AttributeExternalField">
<extkey_attcode>storagesystem_id</extkey_attcode>
<target_attcode>location_id</target_attcode>
</field>
<field id="location_name" xsi:type="AttributeExternalField">
<extkey_attcode>storagesystem_id</extkey_attcode>
<target_attcode>location_name</target_attcode>
</field>
<field id="servers_list" xsi:type="AttributeLinkedSetIndirect">
<linked_class>lnkServerToVolume</linked_class>
<ext_key_to_me>volume_id</ext_key_to_me>
@@ -1401,24 +1536,30 @@
<item id="lun_id">
<rank>20</rank>
</item>
<item id="description">
<item id="storagesystem_id">
<rank>30</rank>
</item>
<item id="storagesystem_id">
<item id="location_id">
<rank>40</rank>
</item>
<item id="raid_level">
<item id="org_id">
<rank>50</rank>
</item>
<item id="size">
<item id="description">
<rank>60</rank>
</item>
<item id="servers_list">
<item id="raid_level">
<rank>70</rank>
</item>
<item id="virtualdevices_list">
<item id="size">
<rank>80</rank>
</item>
<item id="servers_list">
<rank>90</rank>
</item>
<item id="virtualdevices_list">
<rank>100</rank>
</item>
</items>
</details>
<search>
@@ -1429,12 +1570,18 @@
<item id="lun_id">
<rank>20</rank>
</item>
<item id="storagesystem_id">
<item id="raid_level">
<rank>30</rank>
</item>
<item id="raid_level">
<item id="storagesystem_id">
<rank>40</rank>
</item>
<item id="location_id">
<rank>70</rank>
</item>
<item id="org_id">
<rank>80</rank>
</item>
</items>
</search>
<list>
@@ -1451,8 +1598,36 @@
<item id="size">
<rank>40</rank>
</item>
<item id="location_id">
<rank>50</rank>
</item>
<item id="org_id">
<rank>60</rank>
</item>
</items>
</list>
<summary>
<items>
<item id="lun_id">
<rank>10</rank>
</item>
<item id="raid_level">
<rank>20</rank>
</item>
<item id="description">
<rank>30</rank>
</item>
<item id="storagesystem_id">
<rank>40</rank>
</item>
<item id="location_id">
<rank>50</rank>
</item>
<item id="org_id">
<rank>60</rank>
</item>
</items>
</summary>
</presentation>
<methods/>
<relations>

View File

@@ -391,3 +391,36 @@ Dict::Add('FR FR', 'French', 'Français', array(
'theme:fullmoon' => 'Full moon',
'theme:test-red' => 'Instance de test (Rouge)',
));
//
// n:n relations custom labels : nom de classe féminin
//
Dict::Add('FR FR', 'French', 'Français', array(
'Class:Person/Attribute:team_list/UI:Links:Add:Button+' => 'Ajouter une %4$s',
'Class:Person/Attribute:team_list/UI:Links:Add:Modal:Title' => 'Ajouter une %4$s à %2$s',
'Class:Person/Attribute:team_list/UI:Links:Remove:Button+' => 'Retirer cette %4$s',
'Class:Person/Attribute:team_list/UI:Links:Remove:Modal:Title' => 'Retirer une %4$s',
'Class:Team/Attribute:persons_list/UI:Links:Add:Button+' => 'Ajouter une %4$s',
'Class:Team/Attribute:persons_list/UI:Links:Add:Modal:Title' => 'Ajouter une %4$s à %2$s',
'Class:Team/Attribute:persons_list/UI:Links:Remove:Button+' => 'Retirer cette %4$s',
'Class:Team/Attribute:persons_list/UI:Links:Remove:Modal:Title' => 'Retirer une %4$s',
));
// 1:n relations custom labels for tooltip and pop-up title
Dict::Add('FR FR', 'French', 'Français', array(
'Class:Location/Attribute:person_list/UI:Links:Create:Button+' => 'Créer une %4$s',
'Class:Location/Attribute:person_list/UI:Links:Create:Modal:Title' => 'Ajouter une %4$s à %2$s',
'Class:Location/Attribute:person_list/UI:Links:Remove:Button+' => 'Retirer cette %4$s',
'Class:Location/Attribute:person_list/UI:Links:Remove:Modal:Title' => 'Retirer cette %4$s de son %1$s',
'Class:Location/Attribute:person_list/UI:Links:Delete:Button+' => 'Supprimer cette %4$s',
'Class:Location/Attribute:person_list/UI:Links:Delete:Modal:Title' => 'Supprimer une %4$s',
'Class:Person/Attribute:user_list/UI:Links:Create:Button+' => 'Créer un %4$s',
'Class:Person/Attribute:user_list/UI:Links:Create:Modal:Title' => 'Ajouter un %4$s à %2$s',
'Class:Person/Attribute:user_list/UI:Links:Remove:Button+' => 'Retirer ce %4$s',
'Class:Person/Attribute:user_list/UI:Links:Remove:Modal:Title' => 'Retirer ce %4$s de sa %1$s',
'Class:Person/Attribute:user_list/UI:Links:Delete:Button+' => 'Supprimer ce %4$s',
'Class:Person/Attribute:user_list/UI:Links:Delete:Modal:Title' => 'Supprimer un %4$s',
));

View File

@@ -26,6 +26,9 @@
<attributes>
<attribute id="ref"/>
</attributes>
<complementary_attributes>
<attribute id="title"></attribute>
</complementary_attributes>
</naming>
<style>
<icon>../../images/icons/icons8-comments.svg</icon>
@@ -444,6 +447,19 @@
</item>
</items>
</list>
<summary>
<items>
<item id="title">
<rank>10</rank>
</item>
<item id="org_id">
<rank>20</rank>
</item>
<item id="description">
<rank>30</rank>
</item>
</items>
</summary>
</presentation>
</class>
<class id="lnkContactToTicket" _delta="define">

View File

@@ -235,3 +235,26 @@ Dict::Add('FR FR', 'French', 'Français', array(
'Class:ResponseTicketTTR/Interface:iMetricComputer+' => 'Objectif calculé à partir d\'un SLT de type TTR',
));
// 1:n relations custom labels for tooltip and pop-up title
Dict::Add('FR FR', 'French', 'Français', array(
'Class:Person/Attribute:tickets_list/UI:Links:Create:Button+' => 'Créer un %4$s',
'Class:Person/Attribute:tickets_list/UI:Links:Create:Modal:Title' => 'Ajouter un %4$s à %2$s',
'Class:Person/Attribute:tickets_list/UI:Links:Remove:Button+' => 'Retirer ce %4$s',
'Class:Person/Attribute:tickets_list/UI:Links:Remove:Modal:Title' => 'Retirer ce %4$s de sa %1$s',
'Class:Person/Attribute:tickets_list/UI:Links:Delete:Button+' => 'Supprimer ce %4$s',
'Class:Person/Attribute:tickets_list/UI:Links:Delete:Modal:Title' => 'Supprimer un %4$s',
'Class:Team/Attribute:tickets_list/UI:Links:Create:Button+' => 'Créer un %4$s',
'Class:Team/Attribute:tickets_list/UI:Links:Create:Modal:Title' => 'Ajouter un %4$s à %2$s',
'Class:Team/Attribute:tickets_list/UI:Links:Remove:Button+' => 'Retirer ce %4$s',
'Class:Team/Attribute:tickets_list/UI:Links:Remove:Modal:Title' => 'Retirer ce %4$s de son %1$s',
'Class:Team/Attribute:tickets_list/UI:Links:Delete:Button+' => 'Supprimer ce %4$s',
'Class:Team/Attribute:tickets_list/UI:Links:Delete:Modal:Title' => 'Supprimer un %4$s',
'Class:Ticket/Attribute:workorders_list/UI:Links:Create:Button+' => 'Créer une %4$s',
'Class:Ticket/Attribute:workorders_list/UI:Links:Create:Modal:Title' => 'Ajouter une %4$s à %2$s',
'Class:Ticket/Attribute:workorders_list/UI:Links:Remove:Button+' => 'Retirer cette %4$s',
'Class:Ticket/Attribute:workorders_list/UI:Links:Remove:Modal:Title' => 'Retirer cette %4$s de son %1$s',
'Class:Ticket/Attribute:workorders_list/UI:Links:Delete:Button+' => 'Supprimer cette %4$s',
'Class:Ticket/Attribute:workorders_list/UI:Links:Delete:Modal:Title' => 'Supprimer une %4$s',
));

View File

@@ -402,6 +402,25 @@
</item>
</items>
</list>
<summary>
<items>
<item id="org_id">
<rank>10</rank>
</item>
<item id="server_id">
<rank>20</rank>
</item>
<item id="farm_id">
<rank>30</rank>
</item>
<item id="business_criticity">
<rank>40</rank>
</item>
<item id="description">
<rank>50</rank>
</item>
</items>
</summary>
</presentation>
<methods/>
<relations>
@@ -537,6 +556,19 @@
</item>
</items>
</list>
<summary>
<items>
<item id="org_id">
<rank>20</rank>
</item>
<item id="business_criticity">
<rank>30</rank>
</item>
<item id="description">
<rank>40</rank>
</item>
</items>
</summary>
</presentation>
<methods/>
</class>
@@ -770,6 +802,25 @@
</item>
</items>
</list>
<summary>
<items>
<item id="org_id">
<rank>10</rank>
</item>
<item id="virtualhost_id">
<rank>20</rank>
</item>
<item id="managementip">
<rank>30</rank>
</item>
<item id="business_criticity">
<rank>40</rank>
</item>
<item id="description">
<rank>50</rank>
</item>
</items>
</summary>
</presentation>
<methods/>
</class>
@@ -809,6 +860,10 @@
<is_null_allowed>false</is_null_allowed>
<on_target_delete>DEL_AUTO</on_target_delete>
</field>
<field id="org_id" xsi:type="AttributeExternalField">
<extkey_attcode>virtualmachine_id</extkey_attcode>
<target_attcode>org_id</target_attcode>
</field>
<field id="virtualmachine_name" xsi:type="AttributeExternalField">
<extkey_attcode>virtualmachine_id</extkey_attcode>
<target_attcode>name</target_attcode>
@@ -819,29 +874,32 @@
<details>
<items>
<item id="name">
<rank>5</rank>
</item>
<item id="ipaddress">
<rank>10</rank>
</item>
<item id="macaddress">
<item id="virtualmachine_id">
<rank>20</rank>
</item>
<item id="comment">
<rank>30</rank>
</item>
<item id="ipgateway">
<item id="org_id">
<rank>40</rank>
</item>
<item id="ipmask">
<item id="ipaddress">
<rank>50</rank>
</item>
<item id="speed">
<item id="macaddress">
<rank>60</rank>
</item>
<item id="virtualmachine_id">
<item id="comment">
<rank>70</rank>
</item>
<item id="ipgateway">
<rank>80</rank>
</item>
<item id="ipmask">
<rank>90</rank>
</item>
<item id="speed">
<rank>100</rank>
</item>
</items>
</details>
<search>
@@ -885,6 +943,22 @@
</item>
</items>
</list>
<summary>
<items>
<item id="ipaddress">
<rank>10</rank>
</item>
<item id="macaddress">
<rank>20</rank>
</item>
<item id="virtualmachine_id">
<rank>30</rank>
</item>
<item id="org_id">
<rank>40</rank>
</item>
</items>
</summary>
</presentation>
</class>
<class id="Server">

View File

@@ -734,182 +734,194 @@ Dict::Add('EN US', 'English', 'English', array(
// Synchro Data Source
//
Dict::Add('EN US', 'English', 'English', array(
'Class:SynchroDataSource/Attribute:name' => 'Name',
'Class:SynchroDataSource/Attribute:name+' => '',
'Class:SynchroDataSource/Attribute:description' => 'Description',
'Class:SynchroDataSource/Attribute:status' => 'Status',
'Class:SynchroDataSource/Attribute:scope_class' => 'Target class',
'Class:SynchroDataSource/Attribute:user_id' => 'User',
'Class:SynchroDataSource/Attribute:notify_contact_id' => 'Contact to notify',
'Class:SynchroDataSource/Attribute:notify_contact_id+' => 'Contact to notify in case of error',
'Class:SynchroDataSource/Attribute:url_icon' => 'Icon\'s hyperlink',
'Class:SynchroDataSource/Attribute:url_icon+' => 'Hyperlink a (small) image representing the application with which '.ITOP_APPLICATION_SHORT.' is synchronized',
'Class:SynchroDataSource/Attribute:url_application' => 'Application\'s hyperlink',
'Class:SynchroDataSource/Attribute:url_application+' => 'Hyperlink to the '.ITOP_APPLICATION_SHORT.' object in the external application with which '.ITOP_APPLICATION_SHORT.' is synchronized (if applicable). Possible placeholders: $this->attribute$ and $replica->primary_key$',
'Class:SynchroDataSource/Attribute:reconciliation_policy' => 'Reconciliation policy',
'Class:SynchroDataSource/Attribute:full_load_periodicity' => 'Full load interval',
'Class:SynchroDataSource/Attribute:full_load_periodicity+' => 'A complete reload of all data must occur at least as often as specified here',
'Class:SynchroDataSource/Attribute:action_on_zero' => 'Action on zero',
'Class:SynchroDataSource/Attribute:action_on_zero+' => 'Action taken when the search returns no object',
'Class:SynchroDataSource/Attribute:action_on_one' => 'Action on one',
'Class:SynchroDataSource/Attribute:action_on_one+' => 'Action taken when the search returns exactly one object',
'Class:SynchroDataSource/Attribute:action_on_multiple' => 'Action on many',
'Class:SynchroDataSource/Attribute:action_on_multiple+' => 'Action taken when the search returns more than one object',
'Class:SynchroDataSource/Attribute:user_delete_policy' => 'Users allowed',
'Class:SynchroDataSource/Attribute:user_delete_policy+' => 'Who is allowed to delete synchronized objects',
'Class:SynchroDataSource/Attribute:delete_policy/Value:never' => 'Nobody',
'Class:SynchroDataSource/Attribute:delete_policy/Value:depends' => 'Administrators only',
'Class:SynchroDataSource/Attribute:delete_policy/Value:always' => 'All allowed users',
'Class:SynchroDataSource/Attribute:delete_policy_update' => 'Update rules',
'Class:SynchroDataSource/Attribute:delete_policy_update+' => 'Syntax: field_name:value; ...',
'Class:SynchroDataSource/Attribute:delete_policy_retention' => 'Retention Duration',
'Class:SynchroDataSource/Attribute:delete_policy_retention+' => 'How much time an obsolete object is kept before being deleted',
'Class:SynchroDataSource/Attribute:database_table_name' => 'Data table',
'Class:SynchroDataSource/Attribute:database_table_name+' => 'Name of the table to store the synchronization data. If left empty, a default name will be computed.',
'SynchroDataSource:Description' => 'Description',
'SynchroDataSource:Reconciliation' => 'Search &amp; reconciliation',
'SynchroDataSource:Deletion' => 'Deletion rules',
'SynchroDataSource:Status' => 'Status',
'SynchroDataSource:Information' => 'Information',
'SynchroDataSource:Definition' => 'Definition',
'Core:SynchroAttributes' => 'Attributes',
'Core:SynchroStatus' => 'Status',
'Core:Synchro:ErrorsLabel' => 'Errors',
'Core:Synchro:CreatedLabel' => 'Created',
'Core:Synchro:ModifiedLabel' => 'Modified',
'Core:Synchro:UnchangedLabel' => 'Unchanged',
'Core:Synchro:ReconciledErrorsLabel' => 'Errors',
'Core:Synchro:ReconciledLabel' => 'Reconciled',
'Core:Synchro:ReconciledNewLabel' => 'Created',
'Core:SynchroReconcile:Yes' => 'Yes',
'Core:SynchroReconcile:No' => 'No',
'Core:SynchroUpdate:Yes' => 'Yes',
'Core:SynchroUpdate:No' => 'No',
'Core:Synchro:LastestStatus' => 'Latest Status',
'Core:Synchro:History' => 'Synchronization History',
'Core:Synchro:NeverRun' => 'This synchro was never run. No log yet.',
'Core:Synchro:SynchroEndedOn_Date' => 'The latest synchronization ended on %1$s.',
'Core:Synchro:SynchroRunningStartedOn_Date' => 'The synchronization started on %1$s is still running...',
'Menu:DataSources' => 'Synchronization Data Sources', // Duplicated into itop-welcome-itil (will be removed from here...)
'Menu:DataSources+' => 'All Synchronization Data Sources', // Duplicated into itop-welcome-itil (will be removed from here...)
'Core:Synchro:label_repl_ignored' => 'Ignored (%1$s)',
'Core:Synchro:label_repl_disappeared' => 'Disappeared (%1$s)',
'Core:Synchro:label_repl_existing' => 'Existing (%1$s)',
'Core:Synchro:label_repl_new' => 'New (%1$s)',
'Core:Synchro:label_obj_deleted' => 'Deleted (%1$s)',
'Core:Synchro:label_obj_obsoleted' => 'Obsoleted (%1$s)',
'Core:Synchro:label_obj_disappeared_errors' => 'Errors (%1$s)',
'Core:Synchro:label_obj_disappeared_no_action' => 'No Action (%1$s)',
'Core:Synchro:label_obj_unchanged' => 'Unchanged (%1$s)',
'Core:Synchro:label_obj_updated' => 'Updated (%1$s)',
'Core:Synchro:label_obj_updated_errors' => 'Errors (%1$s)',
'Core:Synchro:label_obj_new_unchanged' => 'Unchanged (%1$s)',
'Core:Synchro:label_obj_new_updated' => 'Updated (%1$s)',
'Core:Synchro:label_obj_created' => 'Created (%1$s)',
'Core:Synchro:label_obj_new_errors' => 'Errors (%1$s)',
'Core:SynchroLogTitle' => '%1$s - %2$s',
'Core:Synchro:Nb_Replica' => 'Replica processed: %1$s',
'Core:Synchro:Nb_Class:Objects' => '%1$s: %2$s',
'Class:SynchroDataSource/Error:AtLeastOneReconciliationKeyMustBeSpecified' => 'At Least one reconciliation key must be specified, or the reconciliation policy must be to use the primary key.',
'Class:SynchroDataSource/Error:DeleteRetentionDurationMustBeSpecified' => 'A delete retention period must be specified, since objects are to be deleted after being marked as obsolete',
'Class:SynchroDataSource/Error:DeletePolicyUpdateMustBeSpecified' => 'Obsolete objects are to be updated, but no update is specified.',
'Class:SynchroDataSource/Error:DataTableAlreadyExists' => 'The table %1$s already exists in the database. Please use another name for the synchro data table.',
'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:SynchroAttExtKey:ReconciliationById' => 'id (Primary Key)',
'Core:SynchroAtt:attcode' => 'Attribute',
'Core:SynchroAtt:attcode+' => 'Field of the object',
'Core:SynchroAtt:reconciliation' => 'Reconciliation ?',
'Core:SynchroAtt:reconciliation+' => 'Used for searching',
'Core:SynchroAtt:update' => 'Update ?',
'Core:SynchroAtt:update+' => 'Used to update the object',
'Core:SynchroAtt:update_policy' => 'Update Policy',
'Core:SynchroAtt:update_policy+' => 'Behavior of the updated field',
'Core:SynchroAtt:reconciliation_attcode' => 'Reconciliation Key',
'Core:SynchroAtt:reconciliation_attcode+' => 'Attribute Code for the External Key Reconciliation',
'Core:SyncDataExchangeComment' => '(Data Synchro)',
'Core:Synchro:ListOfDataSources' => 'List of data sources:',
'Core:Synchro:LastSynchro' => 'Last synchronization:',
'Core:Synchro:ThisObjectIsSynchronized' => 'This object is synchronized with an external data source',
'Core:Synchro:TheObjectWasCreatedBy_Source' => 'The object was <b>created</b> by the external data source %1$s',
'Core:Synchro:TheObjectCanBeDeletedBy_Source' => 'The object <b>can be deleted</b> by the external data source %1$s',
'Core:Synchro:TheObjectCannotBeDeletedByUser_Source' => 'You <b>cannot delete the object</b> because it is owned by the external data source %1$s',
'TitleSynchroExecution' => 'Execution of the synchronization',
'Class:SynchroDataSource:DataTable' => 'Database table: %1$s',
'Core:SyncDataSourceObsolete' => 'The data source is marked as obsolete. Operation cancelled.',
'Core:SyncDataSourceAccessRestriction' => 'Only adminstrators or the user specified in the data source can execute this operation. Operation cancelled.',
'Core:SyncTooManyMissingReplicas' => 'All records have been untouched for some time (all of the objects could be deleted). Please check that the process that writes into the synchronization table is still running. Operation cancelled.',
'Core:SyncSplitModeCLIOnly' => 'The synchronization can be executed in chunks only if run in mode CLI',
'Core:Synchro:ListReplicas_AllReplicas_Errors_Warnings' => '%1$s replicas, %2$s error(s), %3$s warning(s).',
'Core:SynchroReplica:TargetObject' => 'Synchronized Object: %1$s',
'Class:AsyncSendEmail' => 'Email (asynchronous)',
'Class:AsyncSendEmail/Attribute:to' => 'To',
'Class:AsyncSendEmail/Attribute:subject' => 'Subject',
'Class:AsyncSendEmail/Attribute:body' => 'Body',
'Class:AsyncSendEmail/Attribute:header' => 'Header',
'Class:CMDBChangeOpSetAttributeOneWayPassword' => 'Encrypted Password',
'Class:CMDBChangeOpSetAttributeOneWayPassword/Attribute:prev_pwd' => 'Previous Value',
'Class:CMDBChangeOpSetAttributeEncrypted' => 'Encrypted Field',
'Class:CMDBChangeOpSetAttributeEncrypted/Attribute:prevstring' => 'Previous Value',
'Class:CMDBChangeOpSetAttributeCaseLog' => 'Case Log',
'Class:CMDBChangeOpSetAttributeCaseLog/Attribute:lastentry' => 'Last Entry',
'Class:SynchroDataSource' => 'Synchro Data Source',
'Class:SynchroDataSource/Attribute:status/Value:implementation' => 'Implementation',
'Class:SynchroDataSource/Attribute:status/Value:obsolete' => 'Obsolete',
'Class:SynchroDataSource/Attribute:status/Value:production' => 'Production',
'Class:SynchroDataSource/Attribute:scope_restriction' => 'Scope restriction',
'Class:SynchroDataSource/Attribute:reconciliation_policy/Value:use_attributes' => 'Use the attributes',
'Class:SynchroDataSource' => 'Synchro Data Source',
'Class:SynchroDataSource/Attribute:name' => 'Name',
'Class:SynchroDataSource/Attribute:name+' => '',
'Class:SynchroDataSource/Attribute:description' => 'Description',
'Class:SynchroDataSource/Attribute:status' => 'Status',
'Class:SynchroDataSource/Attribute:scope_class' => 'Target class',
'Class:SynchroDataSource/Attribute:scope_class+' => 'A Synchro Data Source can only populate a single '.ITOP_APPLICATION_SHORT.' class',
'Class:SynchroDataSource/Attribute:user_id' => 'User',
'Class:SynchroDataSource/Attribute:notify_contact_id' => 'Contact to notify',
'Class:SynchroDataSource/Attribute:notify_contact_id+' => 'Contact to notify in case of error',
'Class:SynchroDataSource/Attribute:url_icon' => 'Icon\'s hyperlink',
'Class:SynchroDataSource/Attribute:url_icon+' => 'Hyperlink a (small) image representing the application with which '.ITOP_APPLICATION_SHORT.' is synchronized.
This icon is shown in the tooltip of the “Lock” symbol on '.ITOP_APPLICATION_SHORT.' synchronized object',
'Class:SynchroDataSource/Attribute:url_application' => 'Application\'s hyperlink',
'Class:SynchroDataSource/Attribute:url_application+' => 'Hyperlink to the object in the external application corresponding to a synchronized '.ITOP_APPLICATION_SHORT.' object.
Possible placeholders: $this->attribute$ and $replica->primary_key$.
The hyperlink is displayed in the tooltip appearing on the “Lock” symbol of any synchronized '.ITOP_APPLICATION_SHORT.' object',
'Class:SynchroDataSource/Attribute:reconciliation_policy' => 'Reconciliation policy',
'Class:SynchroDataSource/Attribute:reconciliation_policy+' => '"Use the attributes": '.ITOP_APPLICATION_SHORT.' object matches replica values for each Synchro attributes flagged for Reconciliation.
"Use primary_key": the column primary_key of the replica is expected to contain the identifier of the '.ITOP_APPLICATION_SHORT.' object',
'Class:SynchroDataSource/Attribute:full_load_periodicity' => 'Full load interval',
'Class:SynchroDataSource/Attribute:full_load_periodicity+' => 'A complete reload of all data must occur at least as often as specified here',
'Class:SynchroDataSource/Attribute:action_on_zero' => 'Action on zero',
'Class:SynchroDataSource/Attribute:action_on_zero+' => 'Action taken when the search returns no object',
'Class:SynchroDataSource/Attribute:action_on_one' => 'Action on one',
'Class:SynchroDataSource/Attribute:action_on_one+' => 'Action taken when the search returns exactly one object',
'Class:SynchroDataSource/Attribute:action_on_multiple' => 'Action on many',
'Class:SynchroDataSource/Attribute:action_on_multiple+' => 'Action taken when the search returns more than one object',
'Class:SynchroDataSource/Attribute:user_delete_policy' => 'Users allowed',
'Class:SynchroDataSource/Attribute:user_delete_policy+' => 'Who is allowed to delete synchronized objects',
'Class:SynchroDataSource/Attribute:delete_policy/Value:never' => 'Nobody',
'Class:SynchroDataSource/Attribute:delete_policy/Value:depends' => 'Administrators only',
'Class:SynchroDataSource/Attribute:delete_policy/Value:always' => 'All allowed users',
'Class:SynchroDataSource/Attribute:delete_policy_update' => 'Update rules',
'Class:SynchroDataSource/Attribute:delete_policy_update+' => 'A list of "field_name:value;":
"field_name" must be a valid field of the Target class.
"value" must be an authorised value for that field.',
'Class:SynchroDataSource/Attribute:delete_policy_retention' => 'Retention Duration',
'Class:SynchroDataSource/Attribute:delete_policy_retention+' => 'How much time an obsolete object is kept before being deleted',
'Class:SynchroDataSource/Attribute:database_table_name' => 'Data table',
'Class:SynchroDataSource/Attribute:database_table_name+' => 'Name of the table to store the synchronization data. If left empty, a default name will be computed.',
'Class:SynchroDataSource/Attribute:status/Value:implementation' => 'Implementation',
'Class:SynchroDataSource/Attribute:status/Value:obsolete' => 'Obsolete',
'Class:SynchroDataSource/Attribute:status/Value:production' => 'Production',
'Class:SynchroDataSource/Attribute:scope_restriction' => 'Scope restriction',
'Class:SynchroDataSource/Attribute:reconciliation_policy/Value:use_attributes' => 'Use the attributes',
'Class:SynchroDataSource/Attribute:reconciliation_policy/Value:use_primary_key' => 'Use the primary_key field',
'Class:SynchroDataSource/Attribute:action_on_zero/Value:create' => 'Create',
'Class:SynchroDataSource/Attribute:action_on_zero/Value:error' => 'Error',
'Class:SynchroDataSource/Attribute:action_on_one/Value:error' => 'Error',
'Class:SynchroDataSource/Attribute:action_on_one/Value:update' => 'Update',
'Class:SynchroDataSource/Attribute:action_on_multiple/Value:create' => 'Create',
'Class:SynchroDataSource/Attribute:action_on_multiple/Value:error' => 'Error',
'Class:SynchroDataSource/Attribute:action_on_multiple/Value:take_first' => 'Take the first one (random?)',
'Class:SynchroDataSource/Attribute:delete_policy' => 'Delete Policy',
'Class:SynchroDataSource/Attribute:delete_policy/Value:delete' => 'Delete',
'Class:SynchroDataSource/Attribute:delete_policy/Value:ignore' => 'Ignore',
'Class:SynchroDataSource/Attribute:delete_policy/Value:update' => 'Update',
'Class:SynchroDataSource/Attribute:delete_policy/Value:update_then_delete' => 'Update then Delete',
'Class:SynchroDataSource/Attribute:attribute_list' => 'Attributes List',
'Class:SynchroDataSource/Attribute:user_delete_policy/Value:administrators' => 'Administrators only',
'Class:SynchroDataSource/Attribute:user_delete_policy/Value:everybody' => 'Everybody allowed to delete such objects',
'Class:SynchroDataSource/Attribute:user_delete_policy/Value:nobody' => 'Nobody',
'Class:SynchroAttribute' => 'Synchro Attribute',
'Class:SynchroAttribute/Attribute:sync_source_id' => 'Synchro Data Source',
'Class:SynchroAttribute/Attribute:attcode' => 'Attribute Code',
'Class:SynchroAttribute/Attribute:update' => 'Update',
'Class:SynchroAttribute/Attribute:reconcile' => 'Reconcile',
'Class:SynchroAttribute/Attribute:update_policy' => 'Update Policy',
'Class:SynchroAttribute/Attribute:update_policy/Value:master_locked' => 'Locked',
'Class:SynchroAttribute/Attribute:update_policy/Value:master_unlocked' => 'Unlocked',
'Class:SynchroAttribute/Attribute:update_policy/Value:write_if_empty' => 'Initialize if empty',
'Class:SynchroAttribute/Attribute:finalclass' => 'Class',
'Class:SynchroAttExtKey' => 'Synchro Attribute (ExtKey)',
'Class:SynchroAttExtKey/Attribute:reconciliation_attcode' => 'Reconciliation Attribute',
'Class:SynchroAttLinkSet' => 'Synchro Attribute (Linkset)',
'Class:SynchroAttLinkSet/Attribute:row_separator' => 'Rows separator',
'Class:SynchroAttLinkSet/Attribute:attribute_separator' => 'Attributes separator',
'Class:SynchroLog' => 'Synchr 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:SynchroDataSource/Attribute:action_on_zero/Value:create' => 'Create',
'Class:SynchroDataSource/Attribute:action_on_zero/Value:error' => 'Error',
'Class:SynchroDataSource/Attribute:action_on_one/Value:error' => 'Error',
'Class:SynchroDataSource/Attribute:action_on_one/Value:update' => 'Update',
'Class:SynchroDataSource/Attribute:action_on_multiple/Value:create' => 'Create',
'Class:SynchroDataSource/Attribute:action_on_multiple/Value:error' => 'Error',
'Class:SynchroDataSource/Attribute:action_on_multiple/Value:take_first' => 'Take the first one (random?)',
'Class:SynchroDataSource/Attribute:delete_policy' => 'Delete Policy',
'Class:SynchroDataSource/Attribute:delete_policy+' => 'What to do when a replica becomes obsolete:
"Ignore": do nothing, the associated object remains as is in iTop.
"Delete": Delete the associated object in iTop (and the replica in the data table).
"Update": Update the associated object as specified by the Update rules (see below).
"Update then Delete": apply the "Update rules". When Retention Duration expires, execute a "Delete" ',
'Class:SynchroDataSource/Attribute:delete_policy/Value:delete' => 'Delete',
'Class:SynchroDataSource/Attribute:delete_policy/Value:ignore' => 'Ignore',
'Class:SynchroDataSource/Attribute:delete_policy/Value:update' => 'Update',
'Class:SynchroDataSource/Attribute:delete_policy/Value:update_then_delete' => 'Update then Delete',
'Class:SynchroDataSource/Attribute:attribute_list' => 'Attributes List',
'Class:SynchroDataSource/Attribute:user_delete_policy/Value:administrators' => 'Administrators only',
'Class:SynchroDataSource/Attribute:user_delete_policy/Value:everybody' => 'Everybody allowed to delete such objects',
'Class:SynchroDataSource/Attribute:user_delete_policy/Value:nobody' => 'Nobody',
'SynchroDataSource:Description' => 'Description',
'SynchroDataSource:Reconciliation' => 'Search &amp; reconciliation',
'SynchroDataSource:Deletion' => 'Deletion rules',
'SynchroDataSource:Status' => 'Status',
'SynchroDataSource:Information' => 'Information',
'SynchroDataSource:Definition' => 'Definition',
'Core:SynchroAttributes' => 'Attributes',
'Core:SynchroStatus' => 'Status',
'Core:Synchro:ErrorsLabel' => 'Errors',
'Core:Synchro:CreatedLabel' => 'Created',
'Core:Synchro:ModifiedLabel' => 'Modified',
'Core:Synchro:UnchangedLabel' => 'Unchanged',
'Core:Synchro:ReconciledErrorsLabel' => 'Errors',
'Core:Synchro:ReconciledLabel' => 'Reconciled',
'Core:Synchro:ReconciledNewLabel' => 'Created',
'Core:SynchroReconcile:Yes' => 'Yes',
'Core:SynchroReconcile:No' => 'No',
'Core:SynchroUpdate:Yes' => 'Yes',
'Core:SynchroUpdate:No' => 'No',
'Core:Synchro:LastestStatus' => 'Latest Status',
'Core:Synchro:History' => 'Synchronization History',
'Core:Synchro:NeverRun' => 'This synchro was never run. No log yet.',
'Core:Synchro:SynchroEndedOn_Date' => 'The latest synchronization ended on %1$s.',
'Core:Synchro:SynchroRunningStartedOn_Date' => 'The synchronization started on %1$s is still running...',
'Core:Synchro:label_repl_ignored' => 'Ignored (%1$s)',
'Core:Synchro:label_repl_disappeared' => 'Disappeared (%1$s)',
'Core:Synchro:label_repl_existing' => 'Existing (%1$s)',
'Core:Synchro:label_repl_new' => 'New (%1$s)',
'Core:Synchro:label_obj_deleted' => 'Deleted (%1$s)',
'Core:Synchro:label_obj_obsoleted' => 'Obsoleted (%1$s)',
'Core:Synchro:label_obj_disappeared_errors' => 'Errors (%1$s)',
'Core:Synchro:label_obj_disappeared_no_action' => 'No Action (%1$s)',
'Core:Synchro:label_obj_unchanged' => 'Unchanged (%1$s)',
'Core:Synchro:label_obj_updated' => 'Updated (%1$s)',
'Core:Synchro:label_obj_updated_errors' => 'Errors (%1$s)',
'Core:Synchro:label_obj_new_unchanged' => 'Unchanged (%1$s)',
'Core:Synchro:label_obj_new_updated' => 'Updated (%1$s)',
'Core:Synchro:label_obj_created' => 'Created (%1$s)',
'Core:Synchro:label_obj_new_errors' => 'Errors (%1$s)',
'Core:SynchroLogTitle' => '%1$s - %2$s',
'Core:Synchro:Nb_Replica' => 'Replica processed: %1$s',
'Core:Synchro:Nb_Class:Objects' => '%1$s: %2$s',
'Class:SynchroDataSource/Error:AtLeastOneReconciliationKeyMustBeSpecified' => 'At Least one reconciliation key must be specified, or the reconciliation policy must be to use the primary key.',
'Class:SynchroDataSource/Error:DeleteRetentionDurationMustBeSpecified' => 'A delete retention period must be specified, since objects are to be deleted after being marked as obsolete',
'Class:SynchroDataSource/Error:DeletePolicyUpdateMustBeSpecified' => 'Obsolete objects are to be updated, but no update is specified.',
'Class:SynchroDataSource/Error:DataTableAlreadyExists' => 'The table %1$s already exists in the database. Please use another name for the synchro data table.',
'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:SynchroAttExtKey:ReconciliationById' => 'id (Primary Key)',
'Core:SynchroAtt:attcode' => 'Attribute',
'Core:SynchroAtt:attcode+' => 'Field of the object',
'Core:SynchroAtt:reconciliation' => 'Reconciliation ?',
'Core:SynchroAtt:reconciliation+' => 'Used for searching',
'Core:SynchroAtt:update' => 'Update ?',
'Core:SynchroAtt:update+' => 'Used to update the object',
'Core:SynchroAtt:update_policy' => 'Update Policy',
'Core:SynchroAtt:update_policy+' => 'Behavior of the updated field',
'Core:SynchroAtt:reconciliation_attcode' => 'Reconciliation Key',
'Core:SynchroAtt:reconciliation_attcode+' => 'Attribute Code for the External Key Reconciliation',
'Core:SyncDataExchangeComment' => '(Data Synchro)',
'Core:Synchro:ListOfDataSources' => 'List of data sources:',
'Core:Synchro:LastSynchro' => 'Last synchronization:',
'Core:Synchro:ThisObjectIsSynchronized' => 'This object is synchronized with an external data source',
'Core:Synchro:TheObjectWasCreatedBy_Source' => 'The object was <b>created</b> by the external data source %1$s',
'Core:Synchro:TheObjectCanBeDeletedBy_Source' => 'The object <b>can be deleted</b> by the external data source %1$s',
'Core:Synchro:TheObjectCannotBeDeletedByUser_Source' => 'You <b>cannot delete the object</b> because it is owned by the external data source %1$s',
'TitleSynchroExecution' => 'Execution of the synchronization',
'Class:SynchroDataSource:DataTable' => 'Database table: %1$s',
'Core:SyncDataSourceObsolete' => 'The data source is marked as obsolete. Operation cancelled.',
'Core:SyncDataSourceAccessRestriction' => 'Only adminstrators or the user specified in the data source can execute this operation. Operation cancelled.',
'Core:SyncTooManyMissingReplicas' => 'All records have been untouched for some time (all of the objects could be deleted). Please check that the process that writes into the synchronization table is still running. Operation cancelled.',
'Core:SyncSplitModeCLIOnly' => 'The synchronization can be executed in chunks only if run in mode CLI',
'Core:Synchro:ListReplicas_AllReplicas_Errors_Warnings' => '%1$s replicas, %2$s error(s), %3$s warning(s).',
'Core:SynchroReplica:TargetObject' => 'Synchronized Object: %1$s',
'Class:AsyncSendEmail' => 'Email (asynchronous)',
'Class:AsyncSendEmail/Attribute:to' => 'To',
'Class:AsyncSendEmail/Attribute:subject' => 'Subject',
'Class:AsyncSendEmail/Attribute:body' => 'Body',
'Class:AsyncSendEmail/Attribute:header' => 'Header',
'Class:CMDBChangeOpSetAttributeOneWayPassword' => 'Encrypted Password',
'Class:CMDBChangeOpSetAttributeOneWayPassword/Attribute:prev_pwd' => 'Previous Value',
'Class:CMDBChangeOpSetAttributeEncrypted' => 'Encrypted Field',
'Class:CMDBChangeOpSetAttributeEncrypted/Attribute:prevstring' => 'Previous Value',
'Class:CMDBChangeOpSetAttributeCaseLog' => 'Case Log',
'Class:CMDBChangeOpSetAttributeCaseLog/Attribute:lastentry' => 'Last Entry',
'Class:SynchroAttribute' => 'Synchro Attribute',
'Class:SynchroAttribute/Attribute:sync_source_id' => 'Synchro Data Source',
'Class:SynchroAttribute/Attribute:attcode' => 'Attribute Code',
'Class:SynchroAttribute/Attribute:update' => 'Update',
'Class:SynchroAttribute/Attribute:reconcile' => 'Reconcile',
'Class:SynchroAttribute/Attribute:update_policy' => 'Update Policy',
'Class:SynchroAttribute/Attribute:update_policy/Value:master_locked' => 'Locked',
'Class:SynchroAttribute/Attribute:update_policy/Value:master_unlocked' => 'Unlocked',
'Class:SynchroAttribute/Attribute:update_policy/Value:write_if_empty' => 'Initialize if empty',
'Class:SynchroAttribute/Attribute:finalclass' => 'Class',
'Class:SynchroAttExtKey' => 'Synchro Attribute (ExtKey)',
'Class:SynchroAttExtKey/Attribute:reconciliation_attcode' => 'Reconciliation Attribute',
'Class:SynchroAttLinkSet' => 'Synchro Attribute (Linkset)',
'Class:SynchroAttLinkSet/Attribute:row_separator' => 'Rows separator',
'Class:SynchroAttLinkSet/Attribute:attribute_separator' => 'Attributes separator',
'Class:SynchroLog' => 'Synchr 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:stats_nb_replica_disappeared_no_action' => 'Nb replica disappeared',

View File

@@ -71,15 +71,15 @@ Dict::Add('EN US', 'English', 'English', array(
//
Dict::Add('EN US', 'English', 'English', array(
'Class:AuditDomain' => 'Audit Domain',
'Class:AuditDomain+' => '',
'Class:AuditDomain/Attribute:name' => 'Name',
'Class:AuditDomain/Attribute:name+' => '',
'Class:AuditDomain/Attribute:description' => 'Description',
'Class:AuditDomain/Attribute:description+' => '',
'Class:AuditDomain/Attribute:icon' => 'Icon',
'Class:AuditDomain/Attribute:icon+' => '',
'Class:AuditDomain/Attribute:categories_list' => 'Categories',
'Class:AuditDomain' => 'Audit Domain',
'Class:AuditDomain+' => '',
'Class:AuditDomain/Attribute:name' => 'Name',
'Class:AuditDomain/Attribute:name+' => 'Its a segmentation of the Audit by who is in charge of fixing it or just interested',
'Class:AuditDomain/Attribute:description' => 'Description',
'Class:AuditDomain/Attribute:description+' => '',
'Class:AuditDomain/Attribute:icon' => 'Icon',
'Class:AuditDomain/Attribute:icon+' => '',
'Class:AuditDomain/Attribute:categories_list' => 'Categories',
'Class:AuditDomain/Attribute:categories_list+' => 'Linked audit categories',
));
@@ -631,6 +631,7 @@ We hope youll enjoy this version as much as we enjoyed imagining and creating
'UI:LogOff:ClickHereToLoginAgain' => 'Click here to login again...',
'UI:ChangePwdMenu' => 'Change Password...',
'UI:Login:PasswordChanged' => 'Password successfully set!',
'UI:Login:PasswordNotChanged' => 'Error Password is the same!',
'UI:AccessRO-All' => ITOP_APPLICATION.' is read-only',
'UI:AccessRO-Users' => ITOP_APPLICATION.' is read-only for end-users',
'UI:ApplicationEnvironment' => 'Application environment: %1$s',
@@ -1732,40 +1733,40 @@ Dict::Add('EN US', 'English', 'English', array(
Dict::Add('EN US', 'English', 'English', array(
'Menu:DataSources' => 'Synchronization Data Sources',
'Menu:DataSources+' => 'All Synchronization Data Sources',
'Menu:WelcomeMenu' => 'Welcome',
'Menu:WelcomeMenu+' => 'Welcome to '.ITOP_APPLICATION_SHORT,
'Menu:WelcomeMenuPage' => 'Welcome',
'Menu:WelcomeMenuPage+' => 'Welcome to '.ITOP_APPLICATION_SHORT,
'Menu:AdminTools' => 'Administration',
'Menu:AdminTools+' => 'Administration tools',
'Menu:AdminTools?' => 'Tools accessible only to users having the administrator profile',
'Menu:DataModelMenu' => 'Data model',
'Menu:DataModelMenu+' => 'Overview of the data model',
'Menu:ExportMenu' => 'Export',
'Menu:ExportMenu+' => 'Export the results of any query in HTML, CSV or XML',
'Menu:NotificationsMenu' => 'Notifications',
'Menu:NotificationsMenu+' => 'Configuration of the notifications',
'Menu:AuditCategories' => 'Audit categories',
'Menu:AuditCategories+' => 'Audit categories',
'Menu:Notifications:Title' => 'Audit categories',
'Menu:RunQueriesMenu' => 'Run queries',
'Menu:RunQueriesMenu+' => 'Run any query',
'Menu:QueryMenu' => 'Query phrasebook',
'Menu:QueryMenu+' => 'Query phrasebook',
'Menu:UniversalSearchMenu' => 'Universal search',
'Menu:UniversalSearchMenu+' => 'Search for anything...',
'Menu:UserManagementMenu' => 'User management',
'Menu:UserManagementMenu+' => 'User management',
'Menu:ProfilesMenu' => 'Profiles',
'Menu:ProfilesMenu+' => 'Profiles',
'Menu:ProfilesMenu:Title' => 'Profiles',
'Menu:UserAccountsMenu' => 'User accounts',
'Menu:UserAccountsMenu+' => 'User accounts',
'Menu:DataSources' => 'Synchronization Data Sources',
'Menu:DataSources+' => 'Mapping logic for batch import of external data',
'Menu:WelcomeMenu' => 'Welcome',
'Menu:WelcomeMenu+' => 'Welcome to '.ITOP_APPLICATION_SHORT,
'Menu:WelcomeMenuPage' => 'Welcome',
'Menu:WelcomeMenuPage+' => 'Welcome to '.ITOP_APPLICATION_SHORT,
'Menu:AdminTools' => 'Administration',
'Menu:AdminTools+' => 'Administration tools',
'Menu:AdminTools?' => 'Tools accessible only to users having the administrator profile',
'Menu:DataModelMenu' => 'Data model',
'Menu:DataModelMenu+' => 'Overview of the data model',
'Menu:ExportMenu' => 'Export',
'Menu:ExportMenu+' => 'Export the results of any query in HTML, CSV or XML',
'Menu:NotificationsMenu' => 'Notifications',
'Menu:NotificationsMenu+' => 'Configure notifications',
'Menu:AuditCategories' => 'Audit categories',
'Menu:AuditCategories+' => 'Define new audits',
'Menu:Notifications:Title' => 'Audit categories',
'Menu:RunQueriesMenu' => 'Run queries',
'Menu:RunQueriesMenu+' => 'Write and execute any OQL query',
'Menu:QueryMenu' => 'Query phrasebook',
'Menu:QueryMenu+' => 'Create stored queries',
'Menu:UniversalSearchMenu' => 'Universal search',
'Menu:UniversalSearchMenu+' => 'Search objects of any class including abstract',
'Menu:UserManagementMenu' => 'User management',
'Menu:UserManagementMenu+' => 'Who can connect to '.ITOP_APPLICATION_SHORT.' and what can they do?',
'Menu:ProfilesMenu' => 'Profiles',
'Menu:ProfilesMenu+' => 'View existing Profiles',
'Menu:ProfilesMenu:Title' => 'Profiles',
'Menu:UserAccountsMenu' => 'User accounts',
'Menu:UserAccountsMenu+' => 'Handling '.ITOP_APPLICATION_SHORT.' users and their access rights',
'Menu:UserAccountsMenu:Title' => 'User accounts',
'Menu:MyShortcuts' => 'My shortcuts',
'Menu:UserManagement' => 'User management',
'Menu:Queries' => 'Queries',
'Menu:ConfigurationTools' => 'Configuration',
'Menu:MyShortcuts' => 'My shortcuts',
'Menu:UserManagement' => 'User management',
'Menu:Queries' => 'Queries',
'Menu:ConfigurationTools' => 'Configuration',
));

View File

@@ -735,119 +735,156 @@ Dict::Add('FR FR', 'French', 'Français', array(
// Synchro Data Source
//
Dict::Add('FR FR', 'French', 'Français', array(
'Class:SynchroDataSource/Attribute:name' => 'Nom',
'Class:SynchroDataSource/Attribute:name+' => '',
'Class:SynchroDataSource/Attribute:description' => 'Description',
'Class:SynchroDataSource/Attribute:status' => 'Etat',
'Class:SynchroDataSource/Attribute:scope_class' => 'Type cible',
'Class:SynchroDataSource/Attribute:user_id' => 'Utilisateur',
'Class:SynchroDataSource/Attribute:notify_contact_id' => 'Contact à notifier',
'Class:SynchroDataSource/Attribute:notify_contact_id+' => 'Contact à notifier en cas d\'erreur',
'Class:SynchroDataSource/Attribute:url_icon' => 'Icône (hyperlien)',
'Class:SynchroDataSource/Attribute:url_icon+' => 'Hyperlien vers une icône représentant l\'application source des données',
'Class:SynchroDataSource/Attribute:url_application' => 'Application (hyperlien)',
'Class:SynchroDataSource/Attribute:url_application+' => 'Un hyperlien vers l\'application source des données. Paramètres possibles: $this->nom_de_champ$ et $replica->primary_key$',
'Class:SynchroDataSource/Attribute:reconciliation_policy' => 'Politique de recherche',
'Class:SynchroDataSource/Attribute:full_load_periodicity' => 'Obsolescence après',
'Class:SynchroDataSource/Attribute:full_load_periodicity+' => 'Un objet est considéré comme obsolète s\'il n\'apparaît pas dans les données au delà de cette durée',
'Class:SynchroDataSource/Attribute:action_on_zero' => 'Action si zéro',
'Class:SynchroDataSource/Attribute:action_on_zero+' => '',
'Class:SynchroDataSource/Attribute:action_on_one' => 'Action si un',
'Class:SynchroDataSource/Attribute:action_on_one+' => '',
'Class:SynchroDataSource/Attribute:action_on_multiple' => 'Action si plusieurs',
'Class:SynchroDataSource/Attribute:action_on_multiple+' => '',
'Class:SynchroDataSource/Attribute:user_delete_policy' => 'Utilisateurs autorisés',
'Class:SynchroDataSource/Attribute:user_delete_policy+' => 'Quels utilisateurs sont autorisés à effacer des objets synchronisés',
'Class:SynchroDataSource/Attribute:delete_policy/Value:never' => 'Personne',
'Class:SynchroDataSource/Attribute:delete_policy/Value:depends' => 'Uniquement les administrateurs',
'Class:SynchroDataSource/Attribute:delete_policy/Value:always' => 'Tous les utilisateurs autorisés',
'Class:SynchroDataSource/Attribute:delete_policy_update' => 'Mise à jour',
'Class:SynchroDataSource/Attribute:delete_policy_update+' => 'Format: nom_de_champ:valeur; ...',
'Class:SynchroDataSource/Attribute:delete_policy_retention' => 'Durée de rétention',
'Class:SynchroDataSource/Attribute:delete_policy_retention+' => 'Si la politique est \'Mettre à jour puis effacer\', les objets obsolètes sont encore conservés pendant cette durée avant d\'être effacés',
'Class:SynchroDataSource/Attribute:database_table_name' => 'Table de données',
'Class:SynchroDataSource/Attribute:database_table_name+' => 'Nom de la table stockant les données de cette source. Un nom par défaut est calculé automatiquement si ce champ est laissé vide.',
'SynchroDataSource:Description' => 'Description',
'SynchroDataSource:Reconciliation' => 'Recherche et réconciliation',
'SynchroDataSource:Deletion' => 'Règles d\'effacement',
'SynchroDataSource:Status' => 'Etat',
'SynchroDataSource:Information' => 'Information',
'SynchroDataSource:Definition' => 'Définition',
'Core:SynchroAttributes' => 'Champs',
'Core:SynchroStatus' => 'Etat',
'Core:Synchro:ErrorsLabel' => 'Erreurs',
'Core:Synchro:CreatedLabel' => 'Créations',
'Core:Synchro:ModifiedLabel' => 'Modifications',
'Core:Synchro:UnchangedLabel' => 'Sans changement',
'Core:Synchro:ReconciledErrorsLabel' => 'Erreurs',
'Core:Synchro:ReconciledLabel' => 'Trouvés',
'Core:Synchro:ReconciledNewLabel' => 'Créations',
'Core:SynchroReconcile:Yes' => 'Oui',
'Core:SynchroReconcile:No' => 'Non',
'Core:SynchroUpdate:Yes' => 'Oui',
'Core:SynchroUpdate:No' => 'Non',
'Core:Synchro:LastestStatus' => 'Dernier état',
'Core:Synchro:History' => 'Historique de synchronisation',
'Core:Synchro:NeverRun' => 'Aucun historique, la synchronisation n\'a pas encore fonctionné',
'Core:Synchro:SynchroEndedOn_Date' => 'La dernière synchronisation s\'est terminée à: %1$s.',
'Core:Synchro:SynchroRunningStartedOn_Date' => 'Synchronisation en cours (début à %1$s)',
'Menu:DataSources' => 'Synchronisation', // Duplicated into itop-welcome-itil (will be removed from here...)
'Menu:DataSources+' => '', // Duplicated into itop-welcome-itil (will be removed from here...)
'Core:Synchro:label_repl_ignored' => 'Ignorés (%1$s)',
'Core:Synchro:label_repl_disappeared' => 'Disparus (%1$s)',
'Core:Synchro:label_repl_existing' => 'Existants (%1$s)',
'Core:Synchro:label_repl_new' => 'Nouveau (%1$s)',
'Core:Synchro:label_obj_deleted' => 'Effacés (%1$s)',
'Core:Synchro:label_obj_obsoleted' => 'Obsoletés (%1$s)',
'Core:Synchro:label_obj_disappeared_errors' => 'Erreurs (%1$s)',
'Core:Synchro:label_obj_disappeared_no_action' => 'Aucune action (%1$s)',
'Core:Synchro:label_obj_unchanged' => 'Sans changement (%1$s)',
'Core:Synchro:label_obj_updated' => 'Mis à jour (%1$s)',
'Core:Synchro:label_obj_updated_errors' => 'Erreurs (%1$s)',
'Core:Synchro:label_obj_new_unchanged' => 'Sans changement (%1$s)',
'Core:Synchro:label_obj_new_updated' => 'Mis à jour (%1$s)',
'Core:Synchro:label_obj_created' => 'Créations (%1$s)',
'Core:Synchro:label_obj_new_errors' => 'Erreurs (%1$s)',
'Core:SynchroLogTitle' => '%1$s - %2$s',
'Core:Synchro:Nb_Replica' => 'Replica traités: %1$s',
'Core:Synchro:Nb_Class:Objects' => '%1$s: %2$s',
'Class:SynchroDataSource' => 'Source de données',
'Class:SynchroDataSource/Attribute:name' => 'Nom',
'Class:SynchroDataSource/Attribute:name+' => '',
'Class:SynchroDataSource/Attribute:description' => 'Description',
'Class:SynchroDataSource/Attribute:status' => 'Etat',
'Class:SynchroDataSource/Attribute:scope_class' => 'Type cible',
'Class:SynchroDataSource/Attribute:scope_class+' => 'Une Source de données ne peut alimenter qu\'une seule classe '.ITOP_APPLICATION_SHORT,
'Class:SynchroDataSource/Attribute:user_id' => 'Utilisateur',
'Class:SynchroDataSource/Attribute:notify_contact_id' => 'Contact à notifier',
'Class:SynchroDataSource/Attribute:notify_contact_id+' => 'Contact à notifier en cas d\'erreur',
'Class:SynchroDataSource/Attribute:url_icon' => 'Icône (hyperlien)',
'Class:SynchroDataSource/Attribute:url_icon+' => 'Hyperlien vers une icône représentant l\'application source des données.
Ce lien est affiché dans le tootip du cadenas, visible sur les objets '.ITOP_APPLICATION_SHORT.' synchronisés',
'Class:SynchroDataSource/Attribute:url_application' => 'Application (hyperlien)',
'Class:SynchroDataSource/Attribute:url_application+' => 'Un hyperlien vers l\'object source dans l\'application d\'origine.
Paramètres possibles: $this->nom_de_champ$ et $replica->primary_key$.
L\'hyperlien est affiché dans le tootip du cadenas, visible sur les objets '.ITOP_APPLICATION_SHORT.' synchronisés',
'Class:SynchroDataSource/Attribute:reconciliation_policy' => 'Politique de recherche',
'Class:SynchroDataSource/Attribute:reconciliation_policy+' => 'Pour retrouver le(s) objet(s) '.ITOP_APPLICATION_SHORT.' correspondant à l\'objet source :
Soit on recherche ceux qui ont les mêmes valeurs sur tous les champs de synchronisation marqués comme critère de recherche,
Soit on recherche directement l\'objet sur son id qui doit être égal au "primary_key" de la source',
'Class:SynchroDataSource/Attribute:full_load_periodicity' => 'Obsolescence après',
'Class:SynchroDataSource/Attribute:full_load_periodicity+' => 'Un objet est considéré comme obsolète s\'il n\'apparaît pas dans les données au delà de cette durée',
'Class:SynchroDataSource/Attribute:action_on_zero' => 'Action si zéro',
'Class:SynchroDataSource/Attribute:action_on_zero+' => 'Que fait-on si aucun objet '.ITOP_APPLICATION_SHORT.' ne correspond à l\'objet source',
'Class:SynchroDataSource/Attribute:action_on_one' => 'Action si un',
'Class:SynchroDataSource/Attribute:action_on_one+' => 'Que fait-on lorsqu\'un seul objet '.ITOP_APPLICATION_SHORT.' correspond à l\'objet source',
'Class:SynchroDataSource/Attribute:action_on_multiple' => 'Action si plusieurs',
'Class:SynchroDataSource/Attribute:action_on_multiple+' => 'Que fait-on lorsque plus d\'un objet '.ITOP_APPLICATION_SHORT.' correspond à l\'objet source',
'Class:SynchroDataSource/Attribute:user_delete_policy' => 'Utilisateurs autorisés',
'Class:SynchroDataSource/Attribute:user_delete_policy+' => 'Quels utilisateurs sont autorisés à effacer des objets synchronisés',
'Class:SynchroDataSource/Attribute:delete_policy/Value:never' => 'Personne',
'Class:SynchroDataSource/Attribute:delete_policy/Value:depends' => 'Uniquement les administrateurs',
'Class:SynchroDataSource/Attribute:delete_policy/Value:always' => 'Tous les utilisateurs autorisés',
'Class:SynchroDataSource/Attribute:delete_policy_update' => 'Mise à jour',
'Class:SynchroDataSource/Attribute:delete_policy_update+' => 'Liste au format: nom_de_champ:valeur;
"nom_de_champ" doit être un code de champ existant dans la classe synchronisée,
"valeur" doit être une valeur autorisée pour ce champ,
Plusieurs champs peuvent ainsi être modifiés lors d\'une "mise à jour" en application de la politique d\'effacement',
'Class:SynchroDataSource/Attribute:delete_policy_retention' => 'Durée de rétention',
'Class:SynchroDataSource/Attribute:delete_policy_retention+' => 'Si la politique est \'Mettre à jour puis effacer\', les objets obsolètes sont encore conservés pendant cette durée avant d\'être effacés',
'Class:SynchroDataSource/Attribute:database_table_name' => 'Table de données',
'Class:SynchroDataSource/Attribute:database_table_name+' => 'Nom de la table stockant les données de cette source. Un nom par défaut est calculé automatiquement si ce champ est laissé vide.',
'Class:SynchroDataSource/Attribute:status/Value:implementation' => 'Implémentation',
'Class:SynchroDataSource/Attribute:status/Value:obsolete' => 'Obsolete',
'Class:SynchroDataSource/Attribute:status/Value:production' => 'Production',
'Class:SynchroDataSource/Attribute:scope_restriction' => 'Restriction',
'Class:SynchroDataSource/Attribute:reconciliation_policy/Value:use_attributes' => 'Utiliser les champs',
'Class:SynchroDataSource/Attribute:reconciliation_policy/Value:use_primary_key' => 'Utiliser la clé primaire',
'Class:SynchroDataSource/Attribute:action_on_zero/Value:create' => 'Créer',
'Class:SynchroDataSource/Attribute:action_on_zero/Value:error' => 'Erreur',
'Class:SynchroDataSource/Attribute:action_on_one/Value:error' => 'Erreur',
'Class:SynchroDataSource/Attribute:action_on_one/Value:update' => 'Mettre à jour',
'Class:SynchroDataSource/Attribute:action_on_multiple/Value:create' => 'Créer',
'Class:SynchroDataSource/Attribute:action_on_multiple/Value:error' => 'Erreur',
'Class:SynchroDataSource/Attribute:action_on_multiple/Value:take_first' => 'Prendre le premier',
'Class:SynchroDataSource/Attribute:delete_policy' => 'Politique d\'effacement',
'Class:SynchroDataSource/Attribute:delete_policy+' => 'Que fait-on avec l\'objet '.ITOP_APPLICATION_SHORT.' synchronisé lorsque objet source n\'est plus présent ?
"Ignorer" : on ne fait rien, l\'objet demeure dans '.ITOP_APPLICATION_SHORT.' inchangé,
"Effacer" : l\'objet '.ITOP_APPLICATION_SHORT.' est supprimé ainsi que son replica,
"Mettre à jour" : les régles décrites dans le champ "mise à jour" sont appliquées à l\'objet '.ITOP_APPLICATION_SHORT.' qui est donc modifié,
"Mettre à jour puis effacer" : on effectue immédiatement une mise à jour, et lorsque la durée de rétention est atteinte, on supprime l\'objet '.ITOP_APPLICATION_SHORT,
'Class:SynchroDataSource/Attribute:delete_policy/Value:delete' => 'Effacer',
'Class:SynchroDataSource/Attribute:delete_policy/Value:ignore' => 'Ignorer',
'Class:SynchroDataSource/Attribute:delete_policy/Value:update' => 'Mettre à jour',
'Class:SynchroDataSource/Attribute:delete_policy/Value:update_then_delete' => 'Mettre à jour puis effacer',
'Class:SynchroDataSource/Attribute:attribute_list' => 'Liste des champs',
'Class:SynchroDataSource/Attribute:user_delete_policy/Value:administrators' => 'Seulement les administrateurs',
'Class:SynchroDataSource/Attribute:user_delete_policy/Value:everybody' => 'Tous les utilisateurs autorisés',
'Class:SynchroDataSource/Attribute:user_delete_policy/Value:nobody' => 'Personne',
'SynchroDataSource:Description' => 'Description',
'SynchroDataSource:Reconciliation' => 'Recherche et réconciliation',
'SynchroDataSource:Deletion' => 'Règles d\'effacement',
'SynchroDataSource:Status' => 'Etat',
'SynchroDataSource:Information' => 'Information',
'SynchroDataSource:Definition' => 'Définition',
'Core:SynchroAttributes' => 'Champs',
'Core:SynchroStatus' => 'Etat',
'Core:Synchro:ErrorsLabel' => 'Erreurs',
'Core:Synchro:CreatedLabel' => 'Créations',
'Core:Synchro:ModifiedLabel' => 'Modifications',
'Core:Synchro:UnchangedLabel' => 'Sans changement',
'Core:Synchro:ReconciledErrorsLabel' => 'Erreurs',
'Core:Synchro:ReconciledLabel' => 'Trouvés',
'Core:Synchro:ReconciledNewLabel' => 'Créations',
'Core:SynchroReconcile:Yes' => 'Oui',
'Core:SynchroReconcile:No' => 'Non',
'Core:SynchroUpdate:Yes' => 'Oui',
'Core:SynchroUpdate:No' => 'Non',
'Core:Synchro:LastestStatus' => 'Dernier état',
'Core:Synchro:History' => 'Historique de synchronisation',
'Core:Synchro:NeverRun' => 'Aucun historique, la synchronisation n\'a pas encore fonctionné',
'Core:Synchro:SynchroEndedOn_Date' => 'La dernière synchronisation s\'est terminée à: %1$s.',
'Core:Synchro:SynchroRunningStartedOn_Date' => 'Synchronisation en cours (début à %1$s)',
'Core:Synchro:label_repl_ignored' => 'Ignorés (%1$s)',
'Core:Synchro:label_repl_disappeared' => 'Disparus (%1$s)',
'Core:Synchro:label_repl_existing' => 'Existants (%1$s)',
'Core:Synchro:label_repl_new' => 'Nouveau (%1$s)',
'Core:Synchro:label_obj_deleted' => 'Effacés (%1$s)',
'Core:Synchro:label_obj_obsoleted' => 'Obsoletés (%1$s)',
'Core:Synchro:label_obj_disappeared_errors' => 'Erreurs (%1$s)',
'Core:Synchro:label_obj_disappeared_no_action' => 'Aucune action (%1$s)',
'Core:Synchro:label_obj_unchanged' => 'Sans changement (%1$s)',
'Core:Synchro:label_obj_updated' => 'Mis à jour (%1$s)',
'Core:Synchro:label_obj_updated_errors' => 'Erreurs (%1$s)',
'Core:Synchro:label_obj_new_unchanged' => 'Sans changement (%1$s)',
'Core:Synchro:label_obj_new_updated' => 'Mis à jour (%1$s)',
'Core:Synchro:label_obj_created' => 'Créations (%1$s)',
'Core:Synchro:label_obj_new_errors' => 'Erreurs (%1$s)',
'Core:SynchroLogTitle' => '%1$s - %2$s',
'Core:Synchro:Nb_Replica' => 'Replica traités: %1$s',
'Core:Synchro:Nb_Class:Objects' => '%1$s: %2$s',
'Class:SynchroDataSource/Error:AtLeastOneReconciliationKeyMustBeSpecified' => 'Si la politique de réconciliation n\'est pas la clé primaire, au moins une clé de recherche doit être spécifiée',
'Class:SynchroDataSource/Error:DeleteRetentionDurationMustBeSpecified' => 'Pour que les objets soient effacés après avoir été obsoletés, il faut spécifier une durée de rétention',
'Class:SynchroDataSource/Error:DeletePolicyUpdateMustBeSpecified' => 'Les objets obsolètes doivent être mis à jour, mais aucune information de mise à jour n\'est spécifiée',
'Class:SynchroDataSource/Error:DataTableAlreadyExists' => 'La table %1$s existe déjà dans la base de données. Veuillez utiliser un autre nom pour la table des données de cette source.',
'Core:SynchroReplica:PublicData' => 'Données synchronisées',
'Core:SynchroReplica:PrivateDetails' => 'Informations internes',
'Core:SynchroReplica:BackToDataSource' => 'Retourner aux détails de la source de données: %1$s',
'Core:SynchroReplica:ListOfReplicas' => 'Liste des réplica',
'Core:SynchroAttExtKey:ReconciliationById' => 'id (clé primaire)',
'Core:SynchroAtt:attcode' => 'Champ',
'Core:SynchroAtt:attcode+' => '',
'Core:SynchroAtt:reconciliation' => 'Réconciliation ?',
'Core:SynchroAtt:reconciliation+' => '',
'Core:SynchroAtt:update' => 'Mise jour ?',
'Core:SynchroAtt:update+' => '',
'Core:SynchroAtt:update_policy' => 'Politique de mise à jour',
'Core:SynchroAtt:update_policy+' => '',
'Core:SynchroAtt:reconciliation_attcode' => 'Clé de recherche',
'Core:SynchroAtt:reconciliation_attcode+' => '',
'Core:SyncDataExchangeComment' => '(Synchronisation)',
'Core:Synchro:ListOfDataSources' => 'Sources de données:',
'Core:Synchro:LastSynchro' => 'Dernière synchronisation:',
'Core:Synchro:ThisObjectIsSynchronized' => 'Cet objet est synchronisé avec une source de données',
'Core:Synchro:TheObjectWasCreatedBy_Source' => 'Cet objet a été <b>créé</b> par la source de données %1$s',
'Core:Synchro:TheObjectCanBeDeletedBy_Source' => 'Cet objet <b>peut être effacé/b> par la source de données %1$s',
'Core:Synchro:TheObjectCannotBeDeletedByUser_Source' => 'Vous <b>ne pouvez pas effacer</b> cet objet car il est géré par le source de données %1$s',
'TitleSynchroExecution' => 'Exécution de la synchronisation',
'Class:SynchroDataSource:DataTable' => 'Table contenant les données: %1$s',
'Core:SyncDataSourceObsolete' => 'Cette source de données est obsolète. Opération annulée.',
'Core:SyncDataSourceAccessRestriction' => 'Seuls les administrateurs et l\'utilisateur spécifié dans la source de données peuvent exécuter cette synchronisation. Opération annulée.',
'Core:SyncTooManyMissingReplicas' => 'Tous les réplicas sont absents de l\'import. L\'import a-t-il réellement tourné. Opération annulée.',
'Core:SyncSplitModeCLIOnly' => 'La synchronization ne peut être exécutée partiellement qu\'en mode ligne de commande',
'Core:Synchro:ListReplicas_AllReplicas_Errors_Warnings' => '%1$s replicas, %2$s erreur(s), %3$s avertissement(s).',
'Core:SynchroReplica:TargetObject' => 'Objet Synchronisé : %1$s',
'Class:AsyncSendEmail' => 'Envoi d\'Email Asynchrone',
'Class:AsyncSendEmail/Attribute:to' => 'A',
'Class:AsyncSendEmail/Attribute:subject' => 'Sujet',
'Class:SynchroDataSource/Error:DeleteRetentionDurationMustBeSpecified' => 'Pour que les objets soient effacés après avoir été obsoletés, il faut spécifier une durée de rétention',
'Class:SynchroDataSource/Error:DeletePolicyUpdateMustBeSpecified' => 'Les objets obsolètes doivent être mis à jour, mais aucune information de mise à jour n\'est spécifiée',
'Class:SynchroDataSource/Error:DataTableAlreadyExists' => 'La table %1$s existe déjà dans la base de données. Veuillez utiliser un autre nom pour la table des données de cette source.',
'Core:SynchroReplica:PublicData' => 'Données synchronisées',
'Core:SynchroReplica:PrivateDetails' => 'Informations internes',
'Core:SynchroReplica:BackToDataSource' => 'Retourner aux détails de la source de données: %1$s',
'Core:SynchroReplica:ListOfReplicas' => 'Liste des réplica',
'Core:SynchroAttExtKey:ReconciliationById' => 'id (clé primaire)',
'Core:SynchroAtt:attcode' => 'Champ',
'Core:SynchroAtt:attcode+' => '',
'Core:SynchroAtt:reconciliation' => 'Réconciliation ?',
'Core:SynchroAtt:reconciliation+' => '',
'Core:SynchroAtt:update' => 'Mise jour ?',
'Core:SynchroAtt:update+' => '',
'Core:SynchroAtt:update_policy' => 'Politique de mise à jour',
'Core:SynchroAtt:update_policy+' => '',
'Core:SynchroAtt:reconciliation_attcode' => 'Clé de recherche',
'Core:SynchroAtt:reconciliation_attcode+' => '',
'Core:SyncDataExchangeComment' => '(Synchronisation)',
'Core:Synchro:ListOfDataSources' => 'Sources de données:',
'Core:Synchro:LastSynchro' => 'Dernière synchronisation:',
'Core:Synchro:ThisObjectIsSynchronized' => 'Cet objet est synchronisé avec une source de données',
'Core:Synchro:TheObjectWasCreatedBy_Source' => 'Cet objet a été <b>créé</b> par la source de données %1$s',
'Core:Synchro:TheObjectCanBeDeletedBy_Source' => 'Cet objet <b>peut être effacé/b> par la source de données %1$s',
'Core:Synchro:TheObjectCannotBeDeletedByUser_Source' => 'Vous <b>ne pouvez pas effacer</b> cet objet car il est géré par le source de données %1$s',
'TitleSynchroExecution' => 'Exécution de la synchronisation',
'Class:SynchroDataSource:DataTable' => 'Table contenant les données: %1$s',
'Core:SyncDataSourceObsolete' => 'Cette source de données est obsolète. Opération annulée.',
'Core:SyncDataSourceAccessRestriction' => 'Seuls les administrateurs et l\'utilisateur spécifié dans la source de données peuvent exécuter cette synchronisation. Opération annulée.',
'Core:SyncTooManyMissingReplicas' => 'Tous les réplicas sont absents de l\'import. L\'import a-t-il réellement tourné. Opération annulée.',
'Core:SyncSplitModeCLIOnly' => 'La synchronization ne peut être exécutée partiellement qu\'en mode ligne de commande',
'Core:Synchro:ListReplicas_AllReplicas_Errors_Warnings' => '%1$s replicas, %2$s erreur(s), %3$s avertissement(s).',
'Core:SynchroReplica:TargetObject' => 'Objet Synchronisé : %1$s',
'Class:AsyncSendEmail' => 'Envoi d\'Email Asynchrone',
'Class:AsyncSendEmail/Attribute:to' => 'A',
'Class:AsyncSendEmail/Attribute:subject' => 'Sujet',
'Class:AsyncSendEmail/Attribute:body' => 'Message',
'Class:AsyncSendEmail/Attribute:header' => 'En-tête',
'Class:CMDBChangeOpSetAttributeOneWayPassword' => 'Mot de passe chiffré',
@@ -856,29 +893,6 @@ Dict::Add('FR FR', 'French', 'Français', array(
'Class:CMDBChangeOpSetAttributeEncrypted/Attribute:prevstring' => 'Ancienne valeur',
'Class:CMDBChangeOpSetAttributeCaseLog' => 'Archive de journal',
'Class:CMDBChangeOpSetAttributeCaseLog/Attribute:lastentry' => 'Dernière entrée',
'Class:SynchroDataSource' => 'Source de données',
'Class:SynchroDataSource/Attribute:status/Value:implementation' => 'Implémentation',
'Class:SynchroDataSource/Attribute:status/Value:obsolete' => 'Obsolete',
'Class:SynchroDataSource/Attribute:status/Value:production' => 'Production',
'Class:SynchroDataSource/Attribute:scope_restriction' => 'Restriction',
'Class:SynchroDataSource/Attribute:reconciliation_policy/Value:use_attributes' => 'Utiliser les champs',
'Class:SynchroDataSource/Attribute:reconciliation_policy/Value:use_primary_key' => 'Utiliser la clé primaire',
'Class:SynchroDataSource/Attribute:action_on_zero/Value:create' => 'Créer',
'Class:SynchroDataSource/Attribute:action_on_zero/Value:error' => 'Erreur',
'Class:SynchroDataSource/Attribute:action_on_one/Value:error' => 'Erreur',
'Class:SynchroDataSource/Attribute:action_on_one/Value:update' => 'Mettre à jour',
'Class:SynchroDataSource/Attribute:action_on_multiple/Value:create' => 'Créer',
'Class:SynchroDataSource/Attribute:action_on_multiple/Value:error' => 'Erreur',
'Class:SynchroDataSource/Attribute:action_on_multiple/Value:take_first' => 'Prendre le premier',
'Class:SynchroDataSource/Attribute:delete_policy' => 'Politique d\'effacement',
'Class:SynchroDataSource/Attribute:delete_policy/Value:delete' => 'Effacer',
'Class:SynchroDataSource/Attribute:delete_policy/Value:ignore' => 'Ignorer',
'Class:SynchroDataSource/Attribute:delete_policy/Value:update' => 'Mettre à jour',
'Class:SynchroDataSource/Attribute:delete_policy/Value:update_then_delete' => 'Mettre à jour puis effacer',
'Class:SynchroDataSource/Attribute:attribute_list' => 'Liste des champs',
'Class:SynchroDataSource/Attribute:user_delete_policy/Value:administrators' => 'Seulement les administrateurs',
'Class:SynchroDataSource/Attribute:user_delete_policy/Value:everybody' => 'Tous les utilisateurs autorisés',
'Class:SynchroDataSource/Attribute:user_delete_policy/Value:nobody' => 'Personne',
'Class:SynchroAttribute' => 'Champs de synchronisation',
'Class:SynchroAttribute/Attribute:sync_source_id' => 'Source de données',
'Class:SynchroAttribute/Attribute:attcode' => 'Champ',

View File

@@ -575,6 +575,7 @@ Nous espérons que vous aimerez cette version autant que nous avons eu du plaisi
'UI:LogOff:ClickHereToLoginAgain' => 'Cliquez ici pour vous reconnecter...',
'UI:ChangePwdMenu' => 'Changer de mot de passe...',
'UI:Login:PasswordChanged' => 'Mot de passe mis à jour !',
'UI:Login:PasswordNotChanged' => 'Erreur : le mot de passe est identique !',
'UI:AccessRO-All' => ITOP_APPLICATION_SHORT.' est en lecture seule',
'UI:AccessRO-Users' => ITOP_APPLICATION_SHORT.' est en lecture seule pour les utilisateurs finaux',
'UI:ApplicationEnvironment' => 'Environnement applicatif: %1$s',
@@ -1665,37 +1666,37 @@ Dict::Add('FR FR', 'French', 'Français', array(
));
Dict::Add('FR FR', 'French', 'Français', array(
'Menu:DataSources' => 'Synchronisation',
'Menu:DataSources+' => '',
'Menu:WelcomeMenu' => 'Bienvenue',
'Menu:WelcomeMenu+' => 'Bienvenue dans '.ITOP_APPLICATION_SHORT,
'Menu:WelcomeMenuPage' => 'Bienvenue',
'Menu:WelcomeMenuPage+' => 'Bienvenue dans '.ITOP_APPLICATION_SHORT,
'Menu:AdminTools' => 'Administration',
'Menu:AdminTools+' => 'Outils d\'administration',
'Menu:AdminTools?' => 'Ces outils sont accessibles uniquement aux utilisateurs possédant le profil Administrateur.',
'Menu:DataModelMenu' => 'Modèle de données',
'Menu:DataModelMenu+' => 'Résumé du modèle de données',
'Menu:ExportMenu' => 'Export',
'Menu:ExportMenu+' => 'Export des résultats d\'une requête en HTML, CSV ou XML',
'Menu:NotificationsMenu' => 'Notifications',
'Menu:NotificationsMenu+' => 'Configuration des Notifications',
'Menu:AuditCategories' => 'Catégories d\'audit',
'Menu:AuditCategories+' => 'Catégories d\'audit',
'Menu:Notifications:Title' => 'Catégories d\'audit',
'Menu:DataSources' => 'Synchronisation',
'Menu:DataSources+' => '',
'Menu:WelcomeMenu' => 'Bienvenue',
'Menu:WelcomeMenu+' => 'Bienvenue dans '.ITOP_APPLICATION_SHORT,
'Menu:WelcomeMenuPage' => 'Bienvenue',
'Menu:WelcomeMenuPage+' => 'Bienvenue dans '.ITOP_APPLICATION_SHORT,
'Menu:AdminTools' => 'Administration',
'Menu:AdminTools+' => 'Outils d\'administration',
'Menu:AdminTools?' => 'Ces outils sont accessibles uniquement aux utilisateurs possédant le profil Administrateur.',
'Menu:DataModelMenu' => 'Modèle de données',
'Menu:DataModelMenu+' => 'Résumé du modèle de données',
'Menu:ExportMenu' => 'Export',
'Menu:ExportMenu+' => 'Export des résultats d\'une requête en HTML, CSV ou XML',
'Menu:NotificationsMenu' => 'Notifications',
'Menu:NotificationsMenu+' => 'Configurer les Notifications',
'Menu:AuditCategories' => 'Catégories d\'audit',
'Menu:AuditCategories+' => 'Définir de nouveaux audits',
'Menu:Notifications:Title' => 'Catégories d\'audit',
'Menu:RunQueriesMenu' => 'Requêtes OQL',
'Menu:RunQueriesMenu+' => 'Executer une requête OQL',
'Menu:QueryMenu' => 'Livre des requêtes',
'Menu:QueryMenu+' => 'Livre des requêtes',
'Menu:QueryMenu+' => 'Créer des requêtes réutilisables',
'Menu:UniversalSearchMenu' => 'Recherche universelle',
'Menu:UniversalSearchMenu+' => 'Rechercher n\'importe quel objet...',
'Menu:UserManagementMenu' => 'Gestion des Utilisateurs',
'Menu:UserManagementMenu+' => 'Gestion des Utilisateurs',
'Menu:UserManagementMenu+' => 'Qui peut se connecter à '.ITOP_APPLICATION_SHORT.' et y faire quoi ?',
'Menu:ProfilesMenu' => 'Profils',
'Menu:ProfilesMenu+' => 'Profils',
'Menu:ProfilesMenu+' => 'Consulter les profils existants',
'Menu:ProfilesMenu:Title' => 'Profils',
'Menu:UserAccountsMenu' => 'Comptes utilisateurs',
'Menu:UserAccountsMenu+' => 'Comptes utilisateurs',
'Menu:UserAccountsMenu+' => 'Gérer les comptes utilisateurs et leur droits',
'Menu:UserAccountsMenu:Title' => 'Comptes utilisateurs',
'Menu:MyShortcuts' => 'Mes raccourcis',
'Menu:UserManagement' => 'Utilisateurs',

View File

@@ -21,7 +21,7 @@ Dict::Add('EN US', 'English', 'English', array(
// Placeholders
// $%1s : host object class name
// $%2s : host object firendlyname
// $%2s : host object friendlyname
// $%3s : current tab name
// $%4s : remote object class name
// $%5s : remote object friendlyname
@@ -46,7 +46,7 @@ Dict::Add('EN US', 'English', 'English', array(
// Modify object
'UI:Links:ModifyObject:Button' => 'Modify',
'UI:Links:ModifyObject:Button+' => 'Modify this object',
'UI:Links:ModifyObject:Modal:Title' => 'Modify %5$s',
'UI:Links:ModifyObject:Modal:Title' => '%5$s',
// Remove
'UI:Links:Remove:Button' => 'Remove',

View File

@@ -36,8 +36,8 @@ Dict::Add('FR FR', 'French', 'Français', array(
// Add
'UI:Links:Add:Button' => 'Ajouter',
'UI:Links:Add:Button+' => 'Ajouter un(e) %4$s',
'UI:Links:Add:Modal:Title' => 'Ajouter un(e) %4$s à %2$s',
'UI:Links:Add:Button+' => 'Ajouter un %4$s',
'UI:Links:Add:Modal:Title' => 'Ajouter un %4$s à %2$s',
// Modify link
'UI:Links:ModifyLink:Button' => 'Modifier',
@@ -47,12 +47,12 @@ Dict::Add('FR FR', 'French', 'Français', array(
// Modify object
'UI:Links:ModifyObject:Button' => 'Modifier',
'UI:Links:ModifyObject:Button+' => 'Modifier cet objet',
'UI:Links:ModifyObject:Modal:Title' => 'Modifier %5$s',
'UI:Links:ModifyObject:Modal:Title' => '%5$s',
// Remove
'UI:Links:Remove:Button' => 'Retirer',
'UI:Links:Remove:Button+' => 'Retirer cet(te) %4$s',
'UI:Links:Remove:Modal:Title' => 'Retirer un(e) %4$s de %1$s',
'UI:Links:Remove:Button+' => 'Retirer ce %4$s',
'UI:Links:Remove:Modal:Title' => 'Retirer un %4$s de %1$s',
'UI:Links:Remove:Modal:Message' => 'Voulez-vous vraiment retirer %5$s de %2$s ?',
// Delete

View File

@@ -75,43 +75,38 @@ $(function()
getCurrentValue: function()
{
var value = null;
this.element.find(':input').each(function(iIndex, oElem){
if($(oElem).is(':hidden') || $(oElem).is(':text') || $(oElem).is(':password') || $(oElem).is('textarea'))
{
value = $(oElem).val();
}
else if($(oElem).is('select'))
{
if($(oElem).is('select[multiple]'))
{
value = [];
$(oElem).find('option:selected').each(function(){
value.push($(this).val());
});
}
else
{
if (this.element.attr('data-input-type') == 'tagset') {
value = [];
this.element.find('select').find('option:selected').each(function (iIndex, oElem) {
value.push($(this).val());
});
} else {
this.element.find(':input').each(function (iIndex, oElem) {
if ($(oElem).is(':text') || $(oElem).is(':password') || $(oElem).is('textarea')) {
value = $(oElem).val();
} else if ($(oElem).is(':hidden') || $(oElem).is('select')) {
if ($(oElem).is('select[multiple]')) {
value = [];
$(oElem).find('option:selected').each(function () {
value.push($(this).val());
});
} else {
value = $(oElem).val();
}
} else if ($(oElem).is(':checkbox') || $(oElem).is(':radio')) {
if (value === null) {
value = [];
}
if ($(oElem).is(':checked')) {
value.push($(oElem).val());
}
} else {
console.log('Form field : Input type not handle yet.');
}
}
else if($(oElem).is(':checkbox') || $(oElem).is(':radio'))
{
if(value === null)
{
value = [];
}
if($(oElem).is(':checked'))
{
value.push($(oElem).val());
}
}
else
{
console.log('Form field : Input type not handle yet.');
}
});
});
}
return value;
},
validate: function(oEvent, oData)

View File

@@ -234,16 +234,7 @@ $(function()
me._onLoadAllEntriesButtonClick(oEvent);
});
// Page exit
// - Show confirm dialog if draft entries
if (window.onbeforeunload === null) {
window.onbeforeunload = function (oEvent) {
if (true === me._HasDraftEntries()) {
return true;
}
};
}
// - Processing / cleanup when the leaving page
// Processing / cleanup when the leaving page
$(window).on('unload', function() {
if (true === me._HasDraftEntries()) {
return me._onUnload();
@@ -428,6 +419,9 @@ $(function()
// Put draft indicator
this.element.find(this.js_selectors.tab_toggler+'[data-tab-type="'+this.enums.tab_types.caselog+'"][data-caselog-attribute-code="'+sCaseLogAttCode+'"]').addClass(this.css_classes.is_draft);
// Register leave handler blockers
this._RegisterLeaveHandlerBlockers();
if (this.options.lock_enabled === true) {
// Request lock
this._RequestLock();
@@ -446,6 +440,11 @@ $(function()
// Remove draft indicator
this.element.find(this.js_selectors.tab_toggler+'[data-tab-type="'+this.enums.tab_types.caselog+'"][data-caselog-attribute-code="'+sCaseLogAttCode+'"]').removeClass(this.css_classes.is_draft);
// Unregister leave handler blockers (only in view mode, otherwise it would remove blocker on main form fields as well)
if (this._GetHostObjectMode() === 'view') {
this._UnregisterLeaveHandlerBlockers();
}
if (this.options.lock_enabled === true) {
// Cancel lock if all forms empty
if (false === this._HasDraftEntries()) {
@@ -1010,6 +1009,53 @@ $(function()
{
return this.element.find(this.js_selectors.tab_toggler+'[data-tab-type="caselog"][data-caselog-attribute-code="'+sCaseLogAttCode+'"]')
},
// - Helpers on leave handler
/**
* Register leave handler blockers for the activity panel
* @see js/leave_handler.js
* @since 3.1.0
*/
_RegisterLeaveHandlerBlockers: function () {
const sBlockerId = this._GetLeaveHandlerBlockerID();
// On page leave
$('body').trigger('register_blocker.itop', {
'sBlockerId': sBlockerId,
'sTargetElemSelector': 'document',
'oTargetElemSelector': document,
'sEventName': 'beforeunload'
});
// On modal close if we are in one
const oModalElem = this.element.closest('[data-role="ibo-modal"]');
if (oModalElem.length !== 0) {
$('body').trigger('register_blocker.itop', {
'sBlockerId': sBlockerId,
'sTargetElemSelector': '#' + oModalElem.attr('id'),
'oTargetElemSelector': '#' + oModalElem.attr('id'),
'sEventName': 'dialogbeforeclose'
});
}
},
/**
* Unregister leave handler blockers for the activity panel
* @see js/leave_handler.js
* @since 3.1.0
*/
_UnregisterLeaveHandlerBlockers: function () {
$('body').trigger('unregister_blocker.itop', {
'sBlockerId': this._GetLeaveHandlerBlockerID()
});
},
/**
* @returns {String} The leave blocker identifier to use with {@see leave_handler.js} for the activity panel
* @since 3.1.0
*/
_GetLeaveHandlerBlockerID: function () {
return this._GetHostObjectClass() + ':' + this._GetHostObjectID();
},
// - Helpers on object lock
/**
* Initialize the lock watcher on a regular basis

View File

@@ -78,6 +78,11 @@ $(function()
// retrieve new button
const $NewButton = $('[name="UI:Links:New"]', this.element);
const sButtonTooltipContent = $NewButton.attr('data-tooltip-content');
let sButtonTitleContent = $NewButton.attr('data-modal-title');
let aParams = {
form_title: sButtonTitleContent
}
// retrieve context parameters
const sClass = $Table.closest('[data-role="ibo-block-links-table"]').attr('data-link-class');
@@ -93,7 +98,8 @@ $(function()
if(data.success){
me.$tableSettingsDialog.DataTableSettings('DoRefresh');
}
});
},
aParams);
},
/**
@@ -114,12 +120,13 @@ $(function()
sButtonTitleContent = sButtonTitleContent.replaceAll('{item}', sRemoteFriendlyname);
// Specify that external key to host object will be readonly
let aReadOnlyParams = {
let aParams = {
'readonly': {
}
}
aReadOnlyParams['readonly'][this.options.external_key_to_me] = 1;
aReadOnlyParams['form_title'] = sButtonTitleContent;
aParams['readonly'][this.options.external_key_to_me] = 1;
aParams['form_title'] = sButtonTitleContent;
// link object modification
iTopObjectWorker.ModifyObject(sButtonTooltipContent, this.options.link_class, sLinkedObjectKey, function () {
@@ -130,7 +137,7 @@ $(function()
me.$tableSettingsDialog.DataTableSettings('DoRefresh');
}
},
aReadOnlyParams);
aParams);
},
});

View File

@@ -53,19 +53,25 @@ const iTopLinkSetWorker = new function(){
* @param {string} sHostObjectId
* @param oOnModalCloseCallback
* @param oOnFormSubmittedCallback
* @param {Object} aAdditionalData
*/
const CallAjaxCreateLinkedObject = function(sModalTitle, sClass, sAttCode, sHostObjectClass, sHostObjectId, oOnModalCloseCallback = null, oOnFormSubmittedCallback = null){
const CallAjaxCreateLinkedObject = function(sModalTitle, sClass, sAttCode, sHostObjectClass, sHostObjectId, oOnModalCloseCallback = null, oOnFormSubmittedCallback = null, aAdditionalData = []){
let aData = $.extend(
{
class: sClass,
att_code: sAttCode,
host_class: sHostObjectClass,
host_id: sHostObjectId
},
aAdditionalData
);
let oOptions = {
title: sModalTitle,
content: {
endpoint: `${ROUTER_BASE_URL}?route=${ROUTE_LINK_SET_CREATE_OBJECT}`,
data: {
class: sClass,
att_code: sAttCode,
host_class: sHostObjectClass,
host_id: sHostObjectId
}
data: aData,
},
extra_options: {
callback_on_modal_close: oOnModalCloseCallback

View File

@@ -2,6 +2,11 @@
// autoload.php @generated by Composer
if (PHP_VERSION_ID < 50600) {
echo 'Composer 2.3.0 dropped support for autoloading on PHP <5.6 and you are running '.PHP_VERSION.', please upgrade PHP or use Composer 2.2 LTS via "composer self-update --2.2". Aborting.'.PHP_EOL;
exit(1);
}
require_once __DIR__ . '/composer/autoload_real.php';
return ComposerAutoloaderInit7f81b4a2a468a061c306af5e447a9a9f::getLoader();

View File

@@ -149,7 +149,7 @@ class ClassLoader
/**
* @return string[] Array of classname => path
* @psalm-var array<string, string>
* @psalm-return array<string, string>
*/
public function getClassMap()
{

View File

@@ -2,7 +2,7 @@
// autoload_classmap.php @generated by Composer
$vendorDir = dirname(dirname(__FILE__));
$vendorDir = dirname(__DIR__);
$baseDir = dirname($vendorDir);
return array(
@@ -401,6 +401,7 @@ return array(
'Combodo\\iTop\\Form\\Field\\LinkedSetField' => $baseDir . '/sources/Form/Field/LinkedSetField.php',
'Combodo\\iTop\\Form\\Field\\MultipleChoicesField' => $baseDir . '/sources/Form/Field/MultipleChoicesField.php',
'Combodo\\iTop\\Form\\Field\\MultipleSelectField' => $baseDir . '/sources/Form/Field/MultipleSelectField.php',
'Combodo\\iTop\\Form\\Field\\MultipleSelectObjectField' => $baseDir . '/sources/Form/Field/MultipleSelectObjectField.php',
'Combodo\\iTop\\Form\\Field\\PasswordField' => $baseDir . '/sources/Form/Field/PasswordField.php',
'Combodo\\iTop\\Form\\Field\\PhoneField' => $baseDir . '/sources/Form/Field/PhoneField.php',
'Combodo\\iTop\\Form\\Field\\RadioField' => $baseDir . '/sources/Form/Field/RadioField.php',
@@ -410,6 +411,7 @@ return array(
'Combodo\\iTop\\Form\\Field\\StringField' => $baseDir . '/sources/Form/Field/StringField.php',
'Combodo\\iTop\\Form\\Field\\SubFormField' => $baseDir . '/sources/Form/Field/SubFormField.php',
'Combodo\\iTop\\Form\\Field\\TagSetField' => $baseDir . '/sources/Form/Field/TagSetField.php',
'Combodo\\iTop\\Form\\Field\\TagSetObjectField' => $baseDir . '/sources/Form/Field/TagSetObjectField.php',
'Combodo\\iTop\\Form\\Field\\TextAreaField' => $baseDir . '/sources/Form/Field/TextAreaField.php',
'Combodo\\iTop\\Form\\Field\\TextField' => $baseDir . '/sources/Form/Field/TextField.php',
'Combodo\\iTop\\Form\\Field\\UrlField' => $baseDir . '/sources/Form/Field/UrlField.php',
@@ -449,7 +451,6 @@ return array(
'Combodo\\iTop\\Service\\Events\\EventServiceLog' => $baseDir . '/sources/Service/Events/EventServiceLog.php',
'Combodo\\iTop\\Service\\Events\\iEventServiceSetup' => $baseDir . '/sources/Service/Events/iEventServiceSetup.php',
'Combodo\\iTop\\Service\\Links\\LinkSetDataTransformer' => $baseDir . '/sources/Service/Links/LinkSetDataTransformer.php',
'Combodo\\iTop\\Service\\Links\\LinkSetHelper' => $baseDir . '/sources/Service/Links/LinkSetHelper.php',
'Combodo\\iTop\\Service\\Links\\LinkSetModel' => $baseDir . '/sources/Service/Links/LinkSetModel.php',
'Combodo\\iTop\\Service\\Links\\LinkSetRepository' => $baseDir . '/sources/Service/Links/LinkSetRepository.php',
'Combodo\\iTop\\Service\\Links\\LinksBulkDataPostProcessor' => $baseDir . '/sources/Service/Links/LinksBulkDataPostProcessor.php',
@@ -1702,17 +1703,6 @@ return array(
'Symfony\\Bundle\\TwigBundle\\DependencyInjection\\TwigExtension' => $vendorDir . '/symfony/twig-bundle/DependencyInjection/TwigExtension.php',
'Symfony\\Bundle\\TwigBundle\\TemplateIterator' => $vendorDir . '/symfony/twig-bundle/TemplateIterator.php',
'Symfony\\Bundle\\TwigBundle\\TwigBundle' => $vendorDir . '/symfony/twig-bundle/TwigBundle.php',
'Symfony\\Bundle\\WebProfilerBundle\\Controller\\ExceptionPanelController' => $vendorDir . '/symfony/web-profiler-bundle/Controller/ExceptionPanelController.php',
'Symfony\\Bundle\\WebProfilerBundle\\Controller\\ProfilerController' => $vendorDir . '/symfony/web-profiler-bundle/Controller/ProfilerController.php',
'Symfony\\Bundle\\WebProfilerBundle\\Controller\\RouterController' => $vendorDir . '/symfony/web-profiler-bundle/Controller/RouterController.php',
'Symfony\\Bundle\\WebProfilerBundle\\Csp\\ContentSecurityPolicyHandler' => $vendorDir . '/symfony/web-profiler-bundle/Csp/ContentSecurityPolicyHandler.php',
'Symfony\\Bundle\\WebProfilerBundle\\Csp\\NonceGenerator' => $vendorDir . '/symfony/web-profiler-bundle/Csp/NonceGenerator.php',
'Symfony\\Bundle\\WebProfilerBundle\\DependencyInjection\\Configuration' => $vendorDir . '/symfony/web-profiler-bundle/DependencyInjection/Configuration.php',
'Symfony\\Bundle\\WebProfilerBundle\\DependencyInjection\\WebProfilerExtension' => $vendorDir . '/symfony/web-profiler-bundle/DependencyInjection/WebProfilerExtension.php',
'Symfony\\Bundle\\WebProfilerBundle\\EventListener\\WebDebugToolbarListener' => $vendorDir . '/symfony/web-profiler-bundle/EventListener/WebDebugToolbarListener.php',
'Symfony\\Bundle\\WebProfilerBundle\\Profiler\\TemplateManager' => $vendorDir . '/symfony/web-profiler-bundle/Profiler/TemplateManager.php',
'Symfony\\Bundle\\WebProfilerBundle\\Twig\\WebProfilerExtension' => $vendorDir . '/symfony/web-profiler-bundle/Twig/WebProfilerExtension.php',
'Symfony\\Bundle\\WebProfilerBundle\\WebProfilerBundle' => $vendorDir . '/symfony/web-profiler-bundle/WebProfilerBundle.php',
'Symfony\\Component\\Cache\\Adapter\\AbstractAdapter' => $vendorDir . '/symfony/cache/Adapter/AbstractAdapter.php',
'Symfony\\Component\\Cache\\Adapter\\AbstractTagAwareAdapter' => $vendorDir . '/symfony/cache/Adapter/AbstractTagAwareAdapter.php',
'Symfony\\Component\\Cache\\Adapter\\AdapterInterface' => $vendorDir . '/symfony/cache/Adapter/AdapterInterface.php',
@@ -2532,10 +2522,6 @@ return array(
'Symfony\\Component\\Routing\\RouteCompilerInterface' => $vendorDir . '/symfony/routing/RouteCompilerInterface.php',
'Symfony\\Component\\Routing\\Router' => $vendorDir . '/symfony/routing/Router.php',
'Symfony\\Component\\Routing\\RouterInterface' => $vendorDir . '/symfony/routing/RouterInterface.php',
'Symfony\\Component\\Stopwatch\\Section' => $vendorDir . '/symfony/stopwatch/Section.php',
'Symfony\\Component\\Stopwatch\\Stopwatch' => $vendorDir . '/symfony/stopwatch/Stopwatch.php',
'Symfony\\Component\\Stopwatch\\StopwatchEvent' => $vendorDir . '/symfony/stopwatch/StopwatchEvent.php',
'Symfony\\Component\\Stopwatch\\StopwatchPeriod' => $vendorDir . '/symfony/stopwatch/StopwatchPeriod.php',
'Symfony\\Component\\String\\AbstractString' => $vendorDir . '/symfony/string/AbstractString.php',
'Symfony\\Component\\String\\AbstractUnicodeString' => $vendorDir . '/symfony/string/AbstractUnicodeString.php',
'Symfony\\Component\\String\\ByteString' => $vendorDir . '/symfony/string/ByteString.php',

View File

@@ -2,24 +2,24 @@
// autoload_files.php @generated by Composer
$vendorDir = dirname(dirname(__FILE__));
$vendorDir = dirname(__DIR__);
$baseDir = dirname($vendorDir);
return array(
'6e3fae29631ef280660b3cdad06f25a8' => $vendorDir . '/symfony/deprecation-contracts/function.php',
'a4a119a56e50fbb293281d9a48007e0e' => $vendorDir . '/symfony/polyfill-php80/bootstrap.php',
'6e3fae29631ef280660b3cdad06f25a8' => $vendorDir . '/symfony/deprecation-contracts/function.php',
'0e6d7bf4a5811bfa5cf40c5ccd6fae6a' => $vendorDir . '/symfony/polyfill-mbstring/bootstrap.php',
'320cde22f66dd4f5d3fd621d3e88b98f' => $vendorDir . '/symfony/polyfill-ctype/bootstrap.php',
'0d59ee240a4cd96ddbb4ff164fccea4d' => $vendorDir . '/symfony/polyfill-php73/bootstrap.php',
'23c18046f52bef3eea034657bafda50f' => $vendorDir . '/symfony/polyfill-php81/bootstrap.php',
'667aeda72477189d0494fecd327c3641' => $vendorDir . '/symfony/var-dumper/Resources/functions/dump.php',
'e69f7f6ee287b969198c3c9d6777bd38' => $vendorDir . '/symfony/polyfill-intl-normalizer/bootstrap.php',
'c9d07b32a2e02bc0fc582d4f0c1b56cc' => $vendorDir . '/laminas/laminas-servicemanager/src/autoload.php',
'7b11c4dc42b3b3023073cb14e519683c' => $vendorDir . '/ralouphie/getallheaders/src/getallheaders.php',
'8825ede83f2f289127722d4e842cf7e8' => $vendorDir . '/symfony/polyfill-intl-grapheme/bootstrap.php',
'667aeda72477189d0494fecd327c3641' => $vendorDir . '/symfony/var-dumper/Resources/functions/dump.php',
'c964ee0ededf28c96ebd9db5099ef910' => $vendorDir . '/guzzlehttp/promises/src/functions_include.php',
'b6b991a57620e2fb6b2f66f03fe9ddc2' => $vendorDir . '/symfony/string/Resources/functions.php',
'e69f7f6ee287b969198c3c9d6777bd38' => $vendorDir . '/symfony/polyfill-intl-normalizer/bootstrap.php',
'37a3dc5111fe8f707ab4c132ef1dbc62' => $vendorDir . '/guzzlehttp/guzzle/src/functions_include.php',
'c9d07b32a2e02bc0fc582d4f0c1b56cc' => $vendorDir . '/laminas/laminas-servicemanager/src/autoload.php',
'8825ede83f2f289127722d4e842cf7e8' => $vendorDir . '/symfony/polyfill-intl-grapheme/bootstrap.php',
'25072dd6e2470089de65ae7bf11d3109' => $vendorDir . '/symfony/polyfill-php72/bootstrap.php',
'f598d06aa772fa33d905e87be6398fb1' => $vendorDir . '/symfony/polyfill-intl-idn/bootstrap.php',
'b6b991a57620e2fb6b2f66f03fe9ddc2' => $vendorDir . '/symfony/string/Resources/functions.php',
);

View File

@@ -2,7 +2,7 @@
// autoload_namespaces.php @generated by Composer
$vendorDir = dirname(dirname(__FILE__));
$vendorDir = dirname(__DIR__);
$baseDir = dirname($vendorDir);
return array(

View File

@@ -2,7 +2,7 @@
// autoload_psr4.php @generated by Composer
$vendorDir = dirname(dirname(__FILE__));
$vendorDir = dirname(__DIR__);
$baseDir = dirname($vendorDir);
return array(
@@ -26,7 +26,6 @@ return array(
'Symfony\\Component\\VarExporter\\' => array($vendorDir . '/symfony/var-exporter'),
'Symfony\\Component\\VarDumper\\' => array($vendorDir . '/symfony/var-dumper'),
'Symfony\\Component\\String\\' => array($vendorDir . '/symfony/string'),
'Symfony\\Component\\Stopwatch\\' => array($vendorDir . '/symfony/stopwatch'),
'Symfony\\Component\\Routing\\' => array($vendorDir . '/symfony/routing'),
'Symfony\\Component\\HttpKernel\\' => array($vendorDir . '/symfony/http-kernel'),
'Symfony\\Component\\HttpFoundation\\' => array($vendorDir . '/symfony/http-foundation'),
@@ -40,7 +39,6 @@ return array(
'Symfony\\Component\\Console\\' => array($vendorDir . '/symfony/console'),
'Symfony\\Component\\Config\\' => array($vendorDir . '/symfony/config'),
'Symfony\\Component\\Cache\\' => array($vendorDir . '/symfony/cache'),
'Symfony\\Bundle\\WebProfilerBundle\\' => array($vendorDir . '/symfony/web-profiler-bundle'),
'Symfony\\Bundle\\TwigBundle\\' => array($vendorDir . '/symfony/twig-bundle'),
'Symfony\\Bundle\\FrameworkBundle\\' => array($vendorDir . '/symfony/framework-bundle'),
'Symfony\\Bridge\\Twig\\' => array($vendorDir . '/symfony/twig-bridge'),

View File

@@ -25,33 +25,21 @@ class ComposerAutoloaderInit7f81b4a2a468a061c306af5e447a9a9f
require __DIR__ . '/platform_check.php';
spl_autoload_register(array('ComposerAutoloaderInit7f81b4a2a468a061c306af5e447a9a9f', 'loadClassLoader'), true, true);
self::$loader = $loader = new \Composer\Autoload\ClassLoader(\dirname(\dirname(__FILE__)));
self::$loader = $loader = new \Composer\Autoload\ClassLoader(\dirname(__DIR__));
spl_autoload_unregister(array('ComposerAutoloaderInit7f81b4a2a468a061c306af5e447a9a9f', 'loadClassLoader'));
$includePaths = require __DIR__ . '/include_paths.php';
$includePaths[] = get_include_path();
set_include_path(implode(PATH_SEPARATOR, $includePaths));
$useStaticLoader = PHP_VERSION_ID >= 50600 && !defined('HHVM_VERSION') && (!function_exists('zend_loader_file_encoded') || !zend_loader_file_encoded());
if ($useStaticLoader) {
require __DIR__ . '/autoload_static.php';
call_user_func(\Composer\Autoload\ComposerStaticInit7f81b4a2a468a061c306af5e447a9a9f::getInitializer($loader));
} else {
$classMap = require __DIR__ . '/autoload_classmap.php';
if ($classMap) {
$loader->addClassMap($classMap);
}
}
require __DIR__ . '/autoload_static.php';
call_user_func(\Composer\Autoload\ComposerStaticInit7f81b4a2a468a061c306af5e447a9a9f::getInitializer($loader));
$loader->setClassMapAuthoritative(true);
$loader->setApcuPrefix('CfF4ZRXo3iRuTmM6Ha8Mj');
$loader->register(true);
if ($useStaticLoader) {
$includeFiles = Composer\Autoload\ComposerStaticInit7f81b4a2a468a061c306af5e447a9a9f::$files;
} else {
$includeFiles = require __DIR__ . '/autoload_files.php';
}
$includeFiles = \Composer\Autoload\ComposerStaticInit7f81b4a2a468a061c306af5e447a9a9f::$files;
foreach ($includeFiles as $fileIdentifier => $file) {
composerRequire7f81b4a2a468a061c306af5e447a9a9f($fileIdentifier, $file);
}
@@ -60,11 +48,16 @@ class ComposerAutoloaderInit7f81b4a2a468a061c306af5e447a9a9f
}
}
/**
* @param string $fileIdentifier
* @param string $file
* @return void
*/
function composerRequire7f81b4a2a468a061c306af5e447a9a9f($fileIdentifier, $file)
{
if (empty($GLOBALS['__composer_autoload_files'][$fileIdentifier])) {
require $file;
$GLOBALS['__composer_autoload_files'][$fileIdentifier] = true;
require $file;
}
}

View File

@@ -7,22 +7,22 @@ namespace Composer\Autoload;
class ComposerStaticInit7f81b4a2a468a061c306af5e447a9a9f
{
public static $files = array (
'6e3fae29631ef280660b3cdad06f25a8' => __DIR__ . '/..' . '/symfony/deprecation-contracts/function.php',
'a4a119a56e50fbb293281d9a48007e0e' => __DIR__ . '/..' . '/symfony/polyfill-php80/bootstrap.php',
'6e3fae29631ef280660b3cdad06f25a8' => __DIR__ . '/..' . '/symfony/deprecation-contracts/function.php',
'0e6d7bf4a5811bfa5cf40c5ccd6fae6a' => __DIR__ . '/..' . '/symfony/polyfill-mbstring/bootstrap.php',
'320cde22f66dd4f5d3fd621d3e88b98f' => __DIR__ . '/..' . '/symfony/polyfill-ctype/bootstrap.php',
'0d59ee240a4cd96ddbb4ff164fccea4d' => __DIR__ . '/..' . '/symfony/polyfill-php73/bootstrap.php',
'23c18046f52bef3eea034657bafda50f' => __DIR__ . '/..' . '/symfony/polyfill-php81/bootstrap.php',
'667aeda72477189d0494fecd327c3641' => __DIR__ . '/..' . '/symfony/var-dumper/Resources/functions/dump.php',
'e69f7f6ee287b969198c3c9d6777bd38' => __DIR__ . '/..' . '/symfony/polyfill-intl-normalizer/bootstrap.php',
'c9d07b32a2e02bc0fc582d4f0c1b56cc' => __DIR__ . '/..' . '/laminas/laminas-servicemanager/src/autoload.php',
'7b11c4dc42b3b3023073cb14e519683c' => __DIR__ . '/..' . '/ralouphie/getallheaders/src/getallheaders.php',
'8825ede83f2f289127722d4e842cf7e8' => __DIR__ . '/..' . '/symfony/polyfill-intl-grapheme/bootstrap.php',
'667aeda72477189d0494fecd327c3641' => __DIR__ . '/..' . '/symfony/var-dumper/Resources/functions/dump.php',
'c964ee0ededf28c96ebd9db5099ef910' => __DIR__ . '/..' . '/guzzlehttp/promises/src/functions_include.php',
'b6b991a57620e2fb6b2f66f03fe9ddc2' => __DIR__ . '/..' . '/symfony/string/Resources/functions.php',
'e69f7f6ee287b969198c3c9d6777bd38' => __DIR__ . '/..' . '/symfony/polyfill-intl-normalizer/bootstrap.php',
'37a3dc5111fe8f707ab4c132ef1dbc62' => __DIR__ . '/..' . '/guzzlehttp/guzzle/src/functions_include.php',
'c9d07b32a2e02bc0fc582d4f0c1b56cc' => __DIR__ . '/..' . '/laminas/laminas-servicemanager/src/autoload.php',
'8825ede83f2f289127722d4e842cf7e8' => __DIR__ . '/..' . '/symfony/polyfill-intl-grapheme/bootstrap.php',
'25072dd6e2470089de65ae7bf11d3109' => __DIR__ . '/..' . '/symfony/polyfill-php72/bootstrap.php',
'f598d06aa772fa33d905e87be6398fb1' => __DIR__ . '/..' . '/symfony/polyfill-intl-idn/bootstrap.php',
'b6b991a57620e2fb6b2f66f03fe9ddc2' => __DIR__ . '/..' . '/symfony/string/Resources/functions.php',
);
public static $prefixLengthsPsr4 = array (
@@ -54,7 +54,6 @@ class ComposerStaticInit7f81b4a2a468a061c306af5e447a9a9f
'Symfony\\Component\\VarExporter\\' => 30,
'Symfony\\Component\\VarDumper\\' => 28,
'Symfony\\Component\\String\\' => 25,
'Symfony\\Component\\Stopwatch\\' => 28,
'Symfony\\Component\\Routing\\' => 26,
'Symfony\\Component\\HttpKernel\\' => 29,
'Symfony\\Component\\HttpFoundation\\' => 33,
@@ -68,7 +67,6 @@ class ComposerStaticInit7f81b4a2a468a061c306af5e447a9a9f
'Symfony\\Component\\Console\\' => 26,
'Symfony\\Component\\Config\\' => 25,
'Symfony\\Component\\Cache\\' => 24,
'Symfony\\Bundle\\WebProfilerBundle\\' => 33,
'Symfony\\Bundle\\TwigBundle\\' => 26,
'Symfony\\Bundle\\FrameworkBundle\\' => 31,
'Symfony\\Bridge\\Twig\\' => 20,
@@ -189,10 +187,6 @@ class ComposerStaticInit7f81b4a2a468a061c306af5e447a9a9f
array (
0 => __DIR__ . '/..' . '/symfony/string',
),
'Symfony\\Component\\Stopwatch\\' =>
array (
0 => __DIR__ . '/..' . '/symfony/stopwatch',
),
'Symfony\\Component\\Routing\\' =>
array (
0 => __DIR__ . '/..' . '/symfony/routing',
@@ -245,10 +239,6 @@ class ComposerStaticInit7f81b4a2a468a061c306af5e447a9a9f
array (
0 => __DIR__ . '/..' . '/symfony/cache',
),
'Symfony\\Bundle\\WebProfilerBundle\\' =>
array (
0 => __DIR__ . '/..' . '/symfony/web-profiler-bundle',
),
'Symfony\\Bundle\\TwigBundle\\' =>
array (
0 => __DIR__ . '/..' . '/symfony/twig-bundle',
@@ -766,6 +756,7 @@ class ComposerStaticInit7f81b4a2a468a061c306af5e447a9a9f
'Combodo\\iTop\\Form\\Field\\LinkedSetField' => __DIR__ . '/../..' . '/sources/Form/Field/LinkedSetField.php',
'Combodo\\iTop\\Form\\Field\\MultipleChoicesField' => __DIR__ . '/../..' . '/sources/Form/Field/MultipleChoicesField.php',
'Combodo\\iTop\\Form\\Field\\MultipleSelectField' => __DIR__ . '/../..' . '/sources/Form/Field/MultipleSelectField.php',
'Combodo\\iTop\\Form\\Field\\MultipleSelectObjectField' => __DIR__ . '/../..' . '/sources/Form/Field/MultipleSelectObjectField.php',
'Combodo\\iTop\\Form\\Field\\PasswordField' => __DIR__ . '/../..' . '/sources/Form/Field/PasswordField.php',
'Combodo\\iTop\\Form\\Field\\PhoneField' => __DIR__ . '/../..' . '/sources/Form/Field/PhoneField.php',
'Combodo\\iTop\\Form\\Field\\RadioField' => __DIR__ . '/../..' . '/sources/Form/Field/RadioField.php',
@@ -775,6 +766,7 @@ class ComposerStaticInit7f81b4a2a468a061c306af5e447a9a9f
'Combodo\\iTop\\Form\\Field\\StringField' => __DIR__ . '/../..' . '/sources/Form/Field/StringField.php',
'Combodo\\iTop\\Form\\Field\\SubFormField' => __DIR__ . '/../..' . '/sources/Form/Field/SubFormField.php',
'Combodo\\iTop\\Form\\Field\\TagSetField' => __DIR__ . '/../..' . '/sources/Form/Field/TagSetField.php',
'Combodo\\iTop\\Form\\Field\\TagSetObjectField' => __DIR__ . '/../..' . '/sources/Form/Field/TagSetObjectField.php',
'Combodo\\iTop\\Form\\Field\\TextAreaField' => __DIR__ . '/../..' . '/sources/Form/Field/TextAreaField.php',
'Combodo\\iTop\\Form\\Field\\TextField' => __DIR__ . '/../..' . '/sources/Form/Field/TextField.php',
'Combodo\\iTop\\Form\\Field\\UrlField' => __DIR__ . '/../..' . '/sources/Form/Field/UrlField.php',
@@ -814,7 +806,6 @@ class ComposerStaticInit7f81b4a2a468a061c306af5e447a9a9f
'Combodo\\iTop\\Service\\Events\\EventServiceLog' => __DIR__ . '/../..' . '/sources/Service/Events/EventServiceLog.php',
'Combodo\\iTop\\Service\\Events\\iEventServiceSetup' => __DIR__ . '/../..' . '/sources/Service/Events/iEventServiceSetup.php',
'Combodo\\iTop\\Service\\Links\\LinkSetDataTransformer' => __DIR__ . '/../..' . '/sources/Service/Links/LinkSetDataTransformer.php',
'Combodo\\iTop\\Service\\Links\\LinkSetHelper' => __DIR__ . '/../..' . '/sources/Service/Links/LinkSetHelper.php',
'Combodo\\iTop\\Service\\Links\\LinkSetModel' => __DIR__ . '/../..' . '/sources/Service/Links/LinkSetModel.php',
'Combodo\\iTop\\Service\\Links\\LinkSetRepository' => __DIR__ . '/../..' . '/sources/Service/Links/LinkSetRepository.php',
'Combodo\\iTop\\Service\\Links\\LinksBulkDataPostProcessor' => __DIR__ . '/../..' . '/sources/Service/Links/LinksBulkDataPostProcessor.php',
@@ -2067,17 +2058,6 @@ class ComposerStaticInit7f81b4a2a468a061c306af5e447a9a9f
'Symfony\\Bundle\\TwigBundle\\DependencyInjection\\TwigExtension' => __DIR__ . '/..' . '/symfony/twig-bundle/DependencyInjection/TwigExtension.php',
'Symfony\\Bundle\\TwigBundle\\TemplateIterator' => __DIR__ . '/..' . '/symfony/twig-bundle/TemplateIterator.php',
'Symfony\\Bundle\\TwigBundle\\TwigBundle' => __DIR__ . '/..' . '/symfony/twig-bundle/TwigBundle.php',
'Symfony\\Bundle\\WebProfilerBundle\\Controller\\ExceptionPanelController' => __DIR__ . '/..' . '/symfony/web-profiler-bundle/Controller/ExceptionPanelController.php',
'Symfony\\Bundle\\WebProfilerBundle\\Controller\\ProfilerController' => __DIR__ . '/..' . '/symfony/web-profiler-bundle/Controller/ProfilerController.php',
'Symfony\\Bundle\\WebProfilerBundle\\Controller\\RouterController' => __DIR__ . '/..' . '/symfony/web-profiler-bundle/Controller/RouterController.php',
'Symfony\\Bundle\\WebProfilerBundle\\Csp\\ContentSecurityPolicyHandler' => __DIR__ . '/..' . '/symfony/web-profiler-bundle/Csp/ContentSecurityPolicyHandler.php',
'Symfony\\Bundle\\WebProfilerBundle\\Csp\\NonceGenerator' => __DIR__ . '/..' . '/symfony/web-profiler-bundle/Csp/NonceGenerator.php',
'Symfony\\Bundle\\WebProfilerBundle\\DependencyInjection\\Configuration' => __DIR__ . '/..' . '/symfony/web-profiler-bundle/DependencyInjection/Configuration.php',
'Symfony\\Bundle\\WebProfilerBundle\\DependencyInjection\\WebProfilerExtension' => __DIR__ . '/..' . '/symfony/web-profiler-bundle/DependencyInjection/WebProfilerExtension.php',
'Symfony\\Bundle\\WebProfilerBundle\\EventListener\\WebDebugToolbarListener' => __DIR__ . '/..' . '/symfony/web-profiler-bundle/EventListener/WebDebugToolbarListener.php',
'Symfony\\Bundle\\WebProfilerBundle\\Profiler\\TemplateManager' => __DIR__ . '/..' . '/symfony/web-profiler-bundle/Profiler/TemplateManager.php',
'Symfony\\Bundle\\WebProfilerBundle\\Twig\\WebProfilerExtension' => __DIR__ . '/..' . '/symfony/web-profiler-bundle/Twig/WebProfilerExtension.php',
'Symfony\\Bundle\\WebProfilerBundle\\WebProfilerBundle' => __DIR__ . '/..' . '/symfony/web-profiler-bundle/WebProfilerBundle.php',
'Symfony\\Component\\Cache\\Adapter\\AbstractAdapter' => __DIR__ . '/..' . '/symfony/cache/Adapter/AbstractAdapter.php',
'Symfony\\Component\\Cache\\Adapter\\AbstractTagAwareAdapter' => __DIR__ . '/..' . '/symfony/cache/Adapter/AbstractTagAwareAdapter.php',
'Symfony\\Component\\Cache\\Adapter\\AdapterInterface' => __DIR__ . '/..' . '/symfony/cache/Adapter/AdapterInterface.php',
@@ -2897,10 +2877,6 @@ class ComposerStaticInit7f81b4a2a468a061c306af5e447a9a9f
'Symfony\\Component\\Routing\\RouteCompilerInterface' => __DIR__ . '/..' . '/symfony/routing/RouteCompilerInterface.php',
'Symfony\\Component\\Routing\\Router' => __DIR__ . '/..' . '/symfony/routing/Router.php',
'Symfony\\Component\\Routing\\RouterInterface' => __DIR__ . '/..' . '/symfony/routing/RouterInterface.php',
'Symfony\\Component\\Stopwatch\\Section' => __DIR__ . '/..' . '/symfony/stopwatch/Section.php',
'Symfony\\Component\\Stopwatch\\Stopwatch' => __DIR__ . '/..' . '/symfony/stopwatch/Stopwatch.php',
'Symfony\\Component\\Stopwatch\\StopwatchEvent' => __DIR__ . '/..' . '/symfony/stopwatch/StopwatchEvent.php',
'Symfony\\Component\\Stopwatch\\StopwatchPeriod' => __DIR__ . '/..' . '/symfony/stopwatch/StopwatchPeriod.php',
'Symfony\\Component\\String\\AbstractString' => __DIR__ . '/..' . '/symfony/string/AbstractString.php',
'Symfony\\Component\\String\\AbstractUnicodeString' => __DIR__ . '/..' . '/symfony/string/AbstractUnicodeString.php',
'Symfony\\Component\\String\\ByteString' => __DIR__ . '/..' . '/symfony/string/ByteString.php',

View File

@@ -2,7 +2,7 @@
// include_paths.php @generated by Composer
$vendorDir = dirname(dirname(__FILE__));
$vendorDir = dirname(__DIR__);
$baseDir = dirname($vendorDir);
return array(

View File

@@ -592,8 +592,8 @@ try
if ($sQuery !== $sFullText) {
$sQueryLabel = $sFullText;
}
GlobalSearchHelper::AddQueryToHistory($sQuery, $sQueryIconUrl, $sQueryLabel);
$oP->SetBlockParam('ibo-global-search.sQuery', $sQuery);
GlobalSearchHelper::AddQueryToHistory(utils::EscapeHtml($sQuery), $sQueryIconUrl, $sQueryLabel);
$oP->SetBlockParam('ibo-global-search.sQuery', utils::EscapeHtml($sQuery));
// Check the needle length
$iMinLenth = MetaModel::GetConfig()->Get('full_text_needle_min');

View File

@@ -55,7 +55,7 @@ try
if (array_key_exists('table_inner_id', $aListParams))
{
$sListId = $aListParams['table_inner_id'];
$sListId = utils::HtmlEntities($aListParams['table_inner_id']);
}
if (array_key_exists('json', $aListParams))

View File

@@ -811,7 +811,7 @@ try {
foreach ($aShortcutClasses as $cShortcutPlugin) {
foreach ($cShortcutPlugin::GetShortcutKeys() as $aShortcutKey) {
$sKey = utils::ReadParam($aShortcutKey['id'], $aShortcutKey['key'], true, 'raw_data');
$aShortcutPrefs[$aShortcutKey['id']] = strtolower($sKey);
$aShortcutPrefs[$aShortcutKey['id']] = strtolower(utils::HtmlEntities($sKey));
}
}
appUserPreferences::SetPref('keyboard_shortcuts', $aShortcutPrefs);

View File

@@ -168,17 +168,19 @@ abstract class Controller extends AbstractController
$this->CheckAccess();
$this->m_sOperation = utils::ReadParam('operation', $this->m_sDefaultOperation);
$sMethodName = 'Operation'.utils::ToCamelCase($this->m_sOperation);
$oKPI = new ExecutionKPI();
$oKPI->ComputeAndReport('Starting operation '.$this->m_sOperation);
if (method_exists($this, $sMethodName))
{
$this->$sMethodName();
if ($this->CallOperation(utils::ToCamelCase($this->m_sOperation))) {
return;
}
else
{
$this->DisplayBadRequest();
// Fallback to unchanged names for compatibility
if ($this->CallOperation($this->m_sOperation)) {
return;
}
$this->DisplayBadRequest();
}
catch (Exception $e)
{

View File

@@ -549,7 +549,7 @@ class DataTableUIBlockFactory extends AbstractUIBlockFactory
// Pages length
$aOptions['iPageSize'] = 10;
if ($oCustomSettings->iDefaultPageSize > 0) {
$aOptions['iPageSize'] = $oCustomSettings->iDefaultPageSize;
$aOptions['iPageSize'] = (int)$oCustomSettings->iDefaultPageSize;
}
// Max height is only set if necessary, otherwise we want the list to occupy all the height it can depending on its pagination
@@ -935,6 +935,8 @@ JS;
/** bool to perform a creation of a new object of this type in a modal */
'creation_in_modal_tooltip',
/** creation in modal button tooltip */
'creation_in_modal_form_title',
/** creation in modal form title */
'creation_in_modal_js_handler',
/** Handler to call when trying to create a new object in modal */
'creation_disallowed',

View File

@@ -51,6 +51,7 @@ class ActivityPanel extends UIBlock
public const DEFAULT_JS_TEMPLATE_REL_PATH = 'base/layouts/activity-panel/layout';
public const DEFAULT_JS_FILES_REL_PATH = [
'js/jquery.ba-bbq.min.js',
'js/leave_handler.js',
'js/layouts/activity-panel/activity-panel.js',
];

View File

@@ -43,8 +43,10 @@ abstract class AbstractBlockLinkSetViewTable extends UIContentBlock
];
// Dictionnary entries
public const BUTTON_TOOLTIP = 'UI:Links:Add:Button+';
public const DICT_ADD_BUTTON_TOOLTIP = 'UI:Links:Add:Button+';
public const DICT_ADD_MODAL_TITLE = 'UI:Links:Add:Modal:Title';
public const DICT_CREATE_BUTTON_TOOLTIP = 'UI:Links:Create:Button+';
public const DICT_CREATE_MODAL_TITLE = 'UI:Links:Create:Modal:Title';
public const DICT_MODIFY_LINK_BUTTON_TOOLTIP = 'UI:Links:ModifyLink:Button+';
public const DICT_MODIFY_LINK_MODAL_TITLE = 'UI:Links:ModifyLink:Modal:Title';
public const DICT_MODIFY_OBJECT_BUTTON_TOOLTIP = 'UI:Links:ModifyObject:Button+';

View File

@@ -53,7 +53,8 @@ class BlockDirectLinkSetViewTable extends AbstractBlockLinkSetViewTable
&& $this->oAttDef->GetEditMode() != LINKSET_EDITMODE_NONE
&& $this->bIsAllowCreate) {
$aExtraParams['creation_in_modal'] = true;
$aExtraParams['creation_in_modal_tooltip'] = $this->GetDictionaryEntry(static::DICT_CREATE_BUTTON_TOOLTIP);
$aExtraParams['creation_in_modal_tooltip'] = $this->oAttDef->GetEditMode() == LINKSET_EDITMODE_ADDREMOVE ? $this->GetDictionaryEntry(static::DICT_ADD_BUTTON_TOOLTIP) : $this->GetDictionaryEntry(static::DICT_CREATE_BUTTON_TOOLTIP);
$aExtraParams['creation_in_modal_form_title'] = $this->oAttDef->GetEditMode() == LINKSET_EDITMODE_ADDREMOVE ? $this->GetDictionaryEntry(static::DICT_ADD_MODAL_TITLE) : $this->GetDictionaryEntry(static::DICT_CREATE_MODAL_TITLE);
$aExtraParams['creation_in_modal_js_handler'] = "{$this->GetWidgetName()}.links_view_table('CreateLinkedObject');";
} else {
$aExtraParams['creation_disallowed'] = true;
@@ -111,13 +112,13 @@ class BlockDirectLinkSetViewTable extends AbstractBlockLinkSetViewTable
'color' => Button::ENUM_COLOR_SCHEME_DESTRUCTIVE,
'js_row_action' => "{$this->GetWidgetName()}.links_view_table('DeleteLinkedObject', aRowData['{$this->oAttDef->GetLinkedClass()}/_key_/raw'], oTrElement);",
'confirmation' => [
'title' => $this->GetDictionaryEntry(static::DICT_DELETE_MODAL_TITLE),
'message' => $this->GetDictionaryEntry(static::DICT_DELETE_MODAL_MESSAGE),
'confirm_button_class' => 'ibo-is-danger',
'row_data' => "{$this->sTargetClass}/hyperlink",
'do_not_show_again_pref_key' => $this->GetDoNotShowAgainPreferenceKey(),
],
);
'title' => $this->GetDictionaryEntry(static::DICT_DELETE_MODAL_TITLE),
'message' => $this->GetDictionaryEntry(static::DICT_DELETE_MODAL_MESSAGE),
'confirm_button_class' => 'ibo-is-danger',
'row_data' => "{$this->sTargetClass}/hyperlink",
'do_not_show_again_pref_key' => $this->GetDoNotShowAgainPreferenceKey(),
],
);
}
break;

View File

@@ -63,7 +63,8 @@ class BlockIndirectLinkSetViewTable extends AbstractBlockLinkSetViewTable
if (!$this->oAttDef->GetReadOnly()
&& $this->bIsAllowCreate) {
$aExtraParams['creation_in_modal'] = true;
$aExtraParams['creation_in_modal_tooltip'] = $this->GetDictionaryEntry(static::BUTTON_TOOLTIP);
$aExtraParams['creation_in_modal_tooltip'] = $this->GetDictionaryEntry(static::DICT_ADD_BUTTON_TOOLTIP);
$aExtraParams['creation_in_modal_form_title'] = $this->GetDictionaryEntry(static::DICT_ADD_MODAL_TITLE);
$aExtraParams['creation_in_modal_js_handler'] = "{$this->GetWidgetName()}.links_view_table('CreateLinkedObject');";
} else {
$aExtraParams['creation_disallowed'] = true;

View File

@@ -142,6 +142,7 @@ class LinkSetController extends AbstractController
$sAttCode = utils::ReadParam('att_code', '', false, 'raw');
$sClass = utils::ReadParam('host_class', '', false, 'class');
$sId = utils::ReadParam('host_id', '', false, 'integer');
$sFormTitle = utils::ReadPostedParam('form_title', null, utils::ENUM_SANITIZATION_FILTER_STRING);
// For security reasons: check that the "proposed" class is actually a subclass of the linked class
// and that the current user is allowed to create objects of this class
@@ -202,17 +203,7 @@ class LinkSetController extends AbstractController
}
JS;
// Form title
/** @var \AttributeLinkedSet $oLinksetDef */
$oLinksetDef = MetaModel::GetAttributeDef($sClass, $sAttCode);
$oHostObj = MetaModel::GetObject($sClass, $sId);
$sFormTitle = $oLinksetDef->SearchSpecificLabel('UI:Links:Add:Modal:Title', '', true,
MetaModel::GetName($sClass),
$oHostObj->Get('friendlyname'),
$oLinksetDef->GetLabel(),
MetaModel::GetName(LinkSetModel::GetTargetClass($oLinksetDef)));
$aExtraParams = [
'noRelations' => true,
'hide_transitions' => true,

View File

@@ -82,16 +82,11 @@ abstract class MultipleChoicesField extends Field
*/
public function SetCurrentValue($currentValue)
{
if (is_array($currentValue))
{
if (is_array($currentValue)) {
$this->currentValue = $currentValue;
}
elseif (is_null($currentValue))
{
} elseif (is_null($currentValue)) {
$this->currentValue = array();
}
else
{
} else {
$this->currentValue = array($currentValue);
}
return $this;

View File

@@ -28,5 +28,16 @@ class MultipleSelectField extends SelectField
{
/** @inheritDoc */
const DEFAULT_MULTIPLE_VALUES_ENABLED = true;
const DEFAULT_STARTS_WITH_NULL_CHOICE = false;
function SetCurrentValue($currentValue)
{
if ($currentValue != null) {
$this->currentValue = $currentValue;
} else {
$this->currentValue = "";
}
return $this;
}
}

View File

@@ -0,0 +1,106 @@
<?php
/*
* @copyright Copyright (C) 2010-2023 Combodo SARL
* @license http://opensource.org/licenses/AGPL-3.0
*/
namespace Combodo\iTop\Form\Field;
use BinaryExpression;
use DBObjectSet;
use FieldExpression;
use ScalarExpression;
use utils;
/**
* Description of MultipleSelectObjectField
*
* @author Acc
* @since 3.1.0
*/
class MultipleSelectObjectField extends SelectObjectField
{
const DEFAULT_MULTIPLE_VALUES_ENABLED = true;
function SetCurrentValue($currentValue)
{
if ($currentValue != null) {
$this->currentValue = $currentValue;
} else {
$this->currentValue = "";
}
return $this;
}
public function Validate()
{
$this->SetValid(true);
$this->EmptyErrorMessages();
if ($this->GetReadOnly() === false) {
if (count($this->currentValue) > 0) {
foreach ($this->currentValue as $sCode => $value) {
if (utils::IsNullOrEmptyString($value) || ($value == 0)) {
continue;
}
$oSearchForExistingCurrentValue = $this->oSearch->DeepClone();
$oSearchForExistingCurrentValue->AddCondition('id', $value, '=');
$oCheckIdAgainstCurrentValueExpression = new BinaryExpression(
new FieldExpression('id', $oSearchForExistingCurrentValue->GetClassAlias()), '=', new ScalarExpression($value)
);
$oSearchForExistingCurrentValue->AddConditionExpression($oCheckIdAgainstCurrentValueExpression);
$oSetForExistingCurrentValue = new DBObjectSet($oSearchForExistingCurrentValue);
$iObjectsCount = $oSetForExistingCurrentValue->CountWithLimit(1);
if ($iObjectsCount === 0) {
$this->SetValid(false);
$this->AddErrorMessage("Value $value does not match the corresponding filter set");
return $this->GetValid();
}
}
}
}
foreach ($this->GetValidators() as $oValidator) {
foreach ($this->currentValue as $value) {
if (!preg_match($oValidator->GetRegExp(true), $value)) {
$this->SetValid(false);
$this->AddErrorMessage($oValidator->GetErrorMessage());
}
}
}
return $this->GetValid();
}
/**
* Resets current value if not among allowed ones.
* By default, reset is done ONLY when the field is not read-only.
*
* @param boolean $bAlways Set to true to verify even when the field is read-only.
*
* @throws \CoreException
*/
public function VerifyCurrentValue(bool $bAlways = false)
{
if (!$this->GetReadOnly() || $bAlways) {
if (count($this->currentValue) > 0) {
foreach ($this->currentValue as $sCode => $value) {
$oValuesScope = $this->GetSearch()->DeepClone();
$oBinaryExp = new BinaryExpression(new FieldExpression('id', $oValuesScope->GetClassAlias()), '=',
new ScalarExpression($value));
$oValuesScope->AddConditionExpression($oBinaryExp);
$oValuesSet = new DBObjectSet($oValuesScope);
}
} else {
$this->currentValue = [];
}
}
}
}

View File

@@ -36,7 +36,7 @@ use utils;
* @author Romain Quetiez <romain.quetiez@combodo.com>
* @since 2.3.0
*/
class SelectObjectField extends Field
class SelectObjectField extends MultipleChoicesField
{
/** @var int CONTROL_SELECT */
const CONTROL_SELECT = 1;

View File

@@ -24,7 +24,20 @@ namespace Combodo\iTop\Form\Field;
*
* @author Guillaume Lajarige <guillaume.lajarige@combodo.com>
*/
class TagSetField extends Field
class TagSetField extends SelectField
{
/** @inheritDoc */
const DEFAULT_MULTIPLE_VALUES_ENABLED = true;
const DEFAULT_STARTS_WITH_NULL_CHOICE = false;
function SetCurrentValue($currentValue)
{
if ($currentValue != null) {
$this->currentValue = $currentValue;
} else {
$this->currentValue = "";
}
return $this;
}
}

View File

@@ -0,0 +1,41 @@
<?php
// Copyright (C) 2010-2023 Combodo SARL
//
// This file is part of iTop.
//
// iTop is free software; you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// iTop is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU Affero General Public License for more details.
//
// You should have received a copy of the GNU Affero General Public License
// along with iTop. If not, see <http://www.gnu.org/licenses/>
namespace Combodo\iTop\Form\Field;
/**
* Description of TagSetField
*
* @author Guillaume Lajarige <guillaume.lajarige@combodo.com>
*/
class TagSetObjectField extends MultipleSelectObjectField
{
const DEFAULT_MULTIPLE_VALUES_ENABLED = true;
function SetCurrentValue($currentValue)
{
if ($currentValue != null) {
$this->currentValue = $currentValue;
} else {
$this->currentValue = "";
}
return $this;
}
}

View File

@@ -10,11 +10,15 @@ use Combodo\iTop\Form\Field\DateTimeField;
use Combodo\iTop\Form\Field\DurationField;
use Combodo\iTop\Form\Field\HiddenField;
use Combodo\iTop\Form\Field\LabelField;
use Combodo\iTop\Form\Field\MultipleSelectField;
use Combodo\iTop\Form\Field\MultipleSelectObjectField;
use Combodo\iTop\Form\Field\RadioField;
use Combodo\iTop\Form\Field\SelectField;
use Combodo\iTop\Form\Field\SelectObjectField;
use Combodo\iTop\Form\Field\StringField;
use Combodo\iTop\Form\Field\SubFormField;
use Combodo\iTop\Form\Field\TagSetField;
use Combodo\iTop\Form\Field\TagSetObjectField;
use Combodo\iTop\Form\Field\TextAreaField;
use Combodo\iTop\Renderer\Console\FieldRenderer\ConsoleSelectObjectFieldRenderer;
use Combodo\iTop\Renderer\Console\FieldRenderer\ConsoleSimpleFieldRenderer;
@@ -78,15 +82,35 @@ class ConsoleFieldRendererMappings implements iFieldRendererMappingsExtension
'field_renderer' => ConsoleSelectObjectFieldRenderer::class,
],
[
'field' => SubFormField::class,
'form_renderer' => ConsoleFormRenderer::class,
'field' => SubFormField::class,
'form_renderer' => ConsoleFormRenderer::class,
'field_renderer' => ConsoleSubFormFieldRenderer::class,
],
[
'field' => DateTimeField::class,
'form_renderer' => ConsoleFormRenderer::class,
'field' => DateTimeField::class,
'form_renderer' => ConsoleFormRenderer::class,
'field_renderer' => ConsoleSimpleFieldRenderer::class,
],
[
'field' => MultipleSelectField::class,
'form_renderer' => ConsoleFormRenderer::class,
'field_renderer' => ConsoleSimpleFieldRenderer::class,
],
[
'field' => MultipleSelectObjectField::class,
'form_renderer' => ConsoleFormRenderer::class,
'field_renderer' => ConsoleSelectObjectFieldRenderer::class,
],
[
'field' => TagSetField::class,
'form_renderer' => ConsoleFormRenderer::class,
'field_renderer' => ConsoleSimpleFieldRenderer::class,
],
[
'field' => TagSetObjectField::class,
'form_renderer' => ConsoleFormRenderer::class,
'field_renderer' => ConsoleSelectObjectFieldRenderer::class,
],
];
}
}

View File

@@ -26,12 +26,14 @@ use Combodo\iTop\Application\UI\Base\Component\Input\InputUIBlockFactory;
use Combodo\iTop\Application\UI\Base\Component\Input\Select\SelectOptionUIBlockFactory;
use Combodo\iTop\Application\UI\Base\Component\Input\SelectUIBlockFactory;
use Combodo\iTop\Application\UI\Base\Layout\UIContentBlockUIBlockFactory;
use Combodo\iTop\Core\MetaModel\FriendlyNameType;
use Combodo\iTop\Form\Field\SelectObjectField;
use Combodo\iTop\Form\Validator\MandatoryValidator;
use Combodo\iTop\Renderer\BlockRenderer;
use Combodo\iTop\Renderer\FieldRenderer;
use DBObjectSet;
use Dict;
use MetaModel;
use UIExtKeyWidget;
/**
@@ -51,29 +53,27 @@ class ConsoleSelectObjectFieldRenderer extends FieldRenderer
$oBlock = FieldUIBlockFactory::MakeStandard($this->oField->GetLabel());
$oBlock->AddDataAttribute("input-id", $this->oField->GetGlobalId());
$sFieldClass = get_class($this->oField);
\IssueLog::Error($this->oField->GetLabel().':render select multi:'.$sFieldClass);
$sEditType = 'none';
if ($this->oField->GetReadOnly())
{
$oBlock->AddDataAttribute("input-type","Combodo\\iTop\\Form\\Field\\SelectObjectField\readonly");
if ($this->oField->GetReadOnly()) {
$oBlock->AddDataAttribute("input-type", "Combodo\\iTop\\Form\\Field\\SelectObjectField\readonly");
$oSearch = $this->oField->GetSearch()->DeepClone();
$oSearch->AddCondition('id', $this->oField->GetCurrentValue());
$oSet = new DBObjectSet($oSearch);
$oObject = $oSet->Fetch();
if ($oObject)
{
if ($oObject) {
$sCurrentLabel = $oObject->Get('friendlyname');
}
else
{
} else {
$sCurrentLabel = '';
}
$oValue = UIContentBlockUIBlockFactory::MakeStandard();
$oValue->AddSubBlock(InputUIBlockFactory::MakeForHidden("",$this->oField->GetCurrentValue(),$this->oField->GetGlobalId()));
$oValue->AddSubBlock(InputUIBlockFactory::MakeForHidden("", $this->oField->GetCurrentValue(), $this->oField->GetGlobalId()));
$oValue->AddSubBlock(new Html($sCurrentLabel));
$oBlock->SetValue($oValue);
}
else
{
} else {
$oSearch = $this->oField->GetSearch()->DeepClone();
$oSearch->SetModifierProperty('UserRightsGetSelectFilter', 'bSearchMode', true);
@@ -86,110 +86,275 @@ class ConsoleSelectObjectFieldRenderer extends FieldRenderer
$iMaxComboLength = $this->oField->GetMaximumComboLength();
$iCount = $oAllowedValues->Count();
if ($iCount > $iMaxComboLength)
{
// Auto-complete
//
$oBlock->AddDataAttribute("input-type","Combodo\\iTop\\Form\\Field\\SelectObjectField\\Autocomplete");
$sEditType = 'autocomplete';
$aExtKeyParams = array();
$aExtKeyParams['iFieldSize'] = 10;
$aExtKeyParams['iMinChars'] = $this->oField->GetMinAutoCompleteChars();
$sFieldName = $this->oField->GetGlobalId();
$sFieldId = $sFieldName;
$sFormPrefix = '';
$oWidget = new UIExtKeyWidget($sTargetClass, $sFieldId, '', true);
$aArgs = array();
$sTitle = $this->oField->GetLabel();
$oPage = new CaptureWebPage();
$sHTMLValue = $oWidget->DisplaySelect($oPage, $iMaxComboLength, false /* $bAllowTargetCreation */, $sTitle, $oSet, $this->oField->GetCurrentValue(), $this->oField->GetMandatory(), $sFieldName, $sFormPrefix, $aArgs);
$oValue = UIContentBlockUIBlockFactory::MakeStandard();
$oValue->AddSubBlock(new Html($sHTMLValue));
$oValue->AddSubBlock(new Html($oPage->GetHtml()));
$oBlock->AddSubBlock($oValue);
switch ($sFieldClass) {
case 'Combodo\\iTop\\Form\\Field\\MultipleSelectObjectField':
$oValue = UIContentBlockUIBlockFactory::MakeStandard("", ["form-field-content"]);
$bVertical = true;
$idx = 0;
$aValues = $this->oField->GetCurrentValue();
$sId = $this->oField->GetGlobalId();
$oOutput->AddJs($oPage->GetJS());
$oOutput->AddJs($oPage->GetReadyJS());
foreach ($oPage->GetCSS() as $sCss)
{
$oOutput->AddCss($sCss);
}
foreach ($oPage->GetJSFiles() as $sFile)
{
$oOutput->AddJsFile($sFile);
}
foreach ($oPage->GetCSSFiles() as $sFile)
{
$oOutput->AddCssFile($sFile);
}
$oOutput->AddJs(
<<<EOF
$("#{$this->oField->GetGlobalId()}").off("change").on("change", function(){
var me = this;
// N°4792 - load only the required fields
$aFieldsToLoad = [];
$(this).closest(".field_set").trigger("field_change", {
id: $(me).attr("id"),
name: $(me).closest(".form_field").attr("data-field-id"),
value: $(me).val()
})
.closest('.form_handler').trigger('value_change');
});
$aComplementAttributeSpec = MetaModel::GetNameSpec($oAllowedValues->GetClass(), FriendlyNameType::COMPLEMENTARY);
$sFormatAdditionalField = $aComplementAttributeSpec[0];
$aAdditionalField = $aComplementAttributeSpec[1];
$bAddingValue = false;
if (count($aAdditionalField) > 0) {
$sClassAllowed = $oAllowedValues->GetClass();
$bAddingValue = true;
$aFieldsToLoad[$sClassAllowed] = $aAdditionalField;
}
$sObjectImageAttCode = MetaModel::GetImageAttributeCode($sClassAllowed);
if (!empty($sObjectImageAttCode)) {
$aFieldsToLoad[$sClassAllowed][] = $sObjectImageAttCode;
}
$aFieldsToLoad[$sClassAllowed][] = 'friendlyname';
$oAllowedValues->OptimizeColumnLoad($aFieldsToLoad);
$bInitValue = false;
while ($oObj = $oAllowedValues->Fetch()) {
/*$aOption = [];
$aOption['value'] = $oObj->GetKey();
$aOption['label'] = $oObj->GetName();
$aOption['search_label'] = utils::HtmlEntityDecode($oObj->GetName());
if ($oObj->IsObsolete()) {
$aOption['obsolescence_flag'] = "1";
}
if ($bAddingValue) {
$aArguments = [];
foreach ($aAdditionalField as $sAdditionalField) {
array_push($aArguments, $oObj->Get($sAdditionalField));
}
$aOption['additional_field'] = utils::HtmlEntities(vsprintf($sFormatAdditionalField, $aArguments));
}
if (!empty($sObjectImageAttCode)) {
// Try to retrieve image for contact
// @var \ormDocument $oImage
$oImage = $oObj->Get($sObjectImageAttCode);
if (!$oImage->IsEmpty()) {
$aOption['picture_url'] = $oImage->GetDisplayURL($sClassAllowed, $oObj->GetKey(), $sObjectImageAttCode);
$aOption['initials'] = '';
} else {
$aOption['initials'] = utils::FormatInitialsForMedallion(utils::ToAcronym($oObj->Get('friendlyname')));
}
}*/
$sLabel = $oObj->GetName();
$oCheckBox = InputUIBlockFactory::MakeForInputWithLabel($sLabel, "checkbox_".$sId, $oObj->GetKey(), "{$sId}", "checkbox");
if (in_array($oObj->GetKey(), $aValues, true)) {
$oCheckBox->GetInput()->SetIsChecked(true);
}
$oCheckBox->SetBeforeInput(false);
$oCheckBox->GetInput()->AddCSSClass('ibo-input-checkbox');
$oValue->AddSubBlock($oCheckBox);
if ($bVertical) {
$oValue->AddSubBlock(new Html("<br>"));
}
$oOutput->AddJs(
<<<EOF
$("#{$sId}_{$idx}").off("change").on("change", function(){
$('#{$sId}').val(this.value).trigger('change');
});
EOF
);
}
elseif($this->oField->GetControlType() == SelectObjectField::CONTROL_RADIO_VERTICAL)
{
$oBlock->AddDataAttribute("input-type","Combodo\\iTop\\Form\\Field\\SelectObjectField\\Radio");
// Radio buttons (vertical)
//
$sEditType = 'radio';
$bVertical = true;
$idx = 0;
$bMandatory = $this->oField->GetMandatory();
$value = $this->oField->GetCurrentValue();
$sId = $this->oField->GetGlobalId();
$oValue = UIContentBlockUIBlockFactory::MakeStandard();
while ($oObject = $oSet->Fetch())
{
$iObject = $oObject->GetKey();
$sLabel = $oObject->Get('friendlyname');
if (($iCount == 1) && $bMandatory)
{
// When there is only once choice, select it by default
$sSelected = 'checked';
$value = $iObject;
);
$idx++;
}
else
{
$sSelected = ($value == $iObject) ? 'checked' : '';
$oValue->AddSubBlock(InputUIBlockFactory::MakeForHidden("", json_encode($aValues), $sId));
$oValue->AddSubBlock(new Html('<span class="form_validation"></span>'));
$oBlock->AddSubBlock($oValue);
break;
case 'Combodo\\iTop\\Form\\Field\\TagSetObjectField':
/** @var \ormSet $value code qui vient des tagset
* $sJson = $oAttDef->GetJsonForWidget($value, $aArgs);
* $sEscapedJson = utils::EscapeHtml($sJson);
* $sSetInputName = "attr_{$sFormPrefix}{$sAttCode}";
*
* // handle form validation
* $aEventsList[] = 'change';
* $aEventsList[] = 'validate';
* $sNullValue = '';
* $sFieldToValidateId = $sFieldToValidateId.AttributeSet::EDITABLE_INPUT_ID_SUFFIX;
*
* // generate form HTML output
* $sValidationSpan = "<span class=\"form_validation ibo-field-validation\" id=\"v_{$sFieldToValidateId}\"></span>";
* $sHTMLValue = '<div class="field_input_zone field_input_set ibo-input-wrapper ibo-input-tagset-wrapper" data-validation="untouched"><input id="'.$iId.'" name="'.$sSetInputName.'" type="hidden" value="'.$sEscapedJson.'"></div>'.$sValidationSpan.$sReloadSpan;
* $sScript = "$('#$iId').set_widget({inputWidgetIdSuffix: '".AttributeSet::EDITABLE_INPUT_ID_SUFFIX."'});";
* $oPage->add_ready_script($sScript);*/
$oValue = UIContentBlockUIBlockFactory::MakeStandard("", ["form-field-content"]);
$aValues = $this->oField->GetCurrentValue();
$aFieldsToLoad = [];
$aComplementAttributeSpec = MetaModel::GetNameSpec($oAllowedValues->GetClass(), FriendlyNameType::COMPLEMENTARY);
$sFormatAdditionalField = $aComplementAttributeSpec[0];
$aAdditionalField = $aComplementAttributeSpec[1];
$bAddingValue = false;
if (count($aAdditionalField) > 0) {
$sClassAllowed = $oAllowedValues->GetClass();
$bAddingValue = true;
$aFieldsToLoad[$sClassAllowed] = $aAdditionalField;
$sObjectImageAttCode = MetaModel::GetImageAttributeCode($sClassAllowed);
if (!empty($sObjectImageAttCode)) {
$aFieldsToLoad[$sClassAllowed][] = $sObjectImageAttCode;
}
$aFieldsToLoad[$sClassAllowed][] = 'friendlyname';
}
$oRadioCustom = InputUIBlockFactory::MakeForInputWithLabel($sLabel, "radio_$sId", $iObject, "{$sId}_{$iObject}", "radio");
$oRadioCustom->AddCSSClass('ibo-input-field-wrapper');
$oRadioCustom->GetInput()->SetIsChecked($sSelected);
$oRadioCustom->SetBeforeInput(false);
$oRadioCustom->GetInput()->AddCSSClass('ibo-input-checkbox');
$oValue->AddSubBlock($oRadioCustom);
$oAllowedValues->OptimizeColumnLoad($aFieldsToLoad);
//MAYBE USE INPUT SET ?
$oSelect = SelectUIBlockFactory::MakeForSelectWithLabel($this->oField->GetLabel(), $this->oField->GetDescription(), $this->oField->GetGlobalId());
$oSelect->SetIsMultiple(true);
while ($oObj = $oAllowedValues->Fetch()) {
$oSelect->AddSubBlock(SelectOptionUIBlockFactory::MakeForSelectOption(
$oObj->GetKey(),
$oObj->GetName(),
(is_null($aValues) || !is_array($aValues)) ? false : in_array($oObj->GetKey(), $aValues, true) === true)
);
}
$oOutput->AddJs(
<<<EOF
<<<JS
$("#{$this->oField->GetGlobalId()}").selectize({
maxItems: null,
sortField: 'text',
onChange: function(value){
console.warn('chane');
var me = this.\$input;
me.trigger("field_change", {
id: me.attr("id"),
name: me.closest(".form_field").attr("data-field-id"),
value: me.val()
})
.closest('.form_handler').trigger('change');
$(me).closest(".field_set").trigger("field_change", {
id: $(me).attr("id"),
name: $(me).closest(".form_field").attr("data-field-id"),
value: $(me).val()
})
.closest('.form_handler').trigger('value_change');
},
loadingClass: '',
itemClass: 'item attribute-set-item',
inputClass: 'attribute-set ibo-input ibo-input-selectize',
render: {
option: function(option) {
return CombodoGlobalToolbox.RenderTemplate('#{$this->oField->GetGlobalId()}_options_template', option, this.settings.optionClass)[0].outerHTML;
},
item: function (item) {
return CombodoGlobalToolbox.RenderTemplate('#{$this->oField->GetGlobalId()}_items_template', item, this.settings.itemClass)[0].outerHTML;
},
},
});
$("#{$this->oField->GetGlobalId()}").closest('div').addClass('ibo-input-select-wrapper--with-buttons');
$("#{$this->oField->GetGlobalId()}").off("change").on("change", function(){
var me = this;
});
JS
);
$oValue->AddSubBlock($oSelect);
$oValue->AddSubBlock(new Html('<span class="form_validation"></span>'));
$oBlock->AddSubBlock($oValue);
break;
default:
if ($iCount > $iMaxComboLength) {
// Auto-complete
//
$oBlock->AddDataAttribute("input-type", "Combodo\\iTop\\Form\\Field\\SelectObjectField\\Autocomplete");
$sEditType = 'autocomplete';
$sFieldName = $this->oField->GetGlobalId();
$sFieldId = $sFieldName;
$sFormPrefix = '';
$oWidget = new UIExtKeyWidget($sTargetClass, $sFieldId, '', true);
$aArgs = array();
$sTitle = $this->oField->GetLabel();
$oPage = new CaptureWebPage();
$sHTMLValue = $oWidget->DisplaySelect($oPage, $iMaxComboLength, false /* $bAllowTargetCreation */, $sTitle, $oSet, $this->oField->GetCurrentValue(), $this->oField->GetMandatory(), $sFieldName, $sFormPrefix, $aArgs);
$oValue = UIContentBlockUIBlockFactory::MakeStandard();
$oValue->AddSubBlock(new Html($sHTMLValue));
$oValue->AddSubBlock(new Html($oPage->GetHtml()));
$oBlock->AddSubBlock($oValue);
$oOutput->AddJs($oPage->GetJS());
$oOutput->AddJs($oPage->GetReadyJS());
foreach ($oPage->GetCSS() as $sCss) {
$oOutput->AddCss($sCss);
}
foreach ($oPage->GetJSFiles() as $sFile) {
$oOutput->AddJsFile($sFile);
}
foreach ($oPage->GetCSSFiles() as $sFile) {
$oOutput->AddCssFile($sFile);
}
$oOutput->AddJs(
<<<EOF
$("#{$this->oField->GetGlobalId()}").off("change").on("change", function(){
var me = this;
$(this).closest(".field_set").trigger("field_change", {
id: $(me).attr("id"),
name: $(me).closest(".form_field").attr("data-field-id"),
value: $(me).val()
})
.closest('.form_handler').trigger('value_change');
});
EOF
);
} elseif ($this->oField->GetControlType() == SelectObjectField::CONTROL_RADIO_VERTICAL) {
$oBlock->AddDataAttribute("input-type", "Combodo\\iTop\\Form\\Field\\SelectObjectField\\Radio");
// Radio buttons (vertical)
//
$sEditType = 'radio';
$bVertical = true;
$idx = 0;
$bMandatory = $this->oField->GetMandatory();
$value = $this->oField->GetCurrentValue();
$sId = $this->oField->GetGlobalId();
$oValue = UIContentBlockUIBlockFactory::MakeStandard();
while ($oObject = $oSet->Fetch()) {
$iObject = $oObject->GetKey();
$sLabel = $oObject->Get('friendlyname');
if (($iCount == 1) && $bMandatory) {
// When there is only once choice, select it by default
$sSelected = 'checked';
$value = $iObject;
} else {
$sSelected = ($value == $iObject) ? 'checked' : '';
}
$oRadioCustom = InputUIBlockFactory::MakeForInputWithLabel($sLabel, "radio_$sId", $iObject, "{$sId}_{$iObject}", "radio");
$oRadioCustom->AddCSSClass('ibo-input-field-wrapper');
$oRadioCustom->GetInput()->SetIsChecked($sSelected);
$oRadioCustom->SetBeforeInput(false);
$oRadioCustom->GetInput()->AddCSSClass('ibo-input-checkbox');
$oValue->AddSubBlock($oRadioCustom);
$oOutput->AddJs(
<<<EOF
$("#{$sId}_{$iObject}").off("change").on("change", function(){
$('#{$sId}').val(this.value).trigger('change');
});
EOF
);
if ($bVertical)
{
$oValue->AddSubBlock(new Html("<br>"));
}
$idx++;
}
$oValue->AddSubBlock(InputUIBlockFactory::MakeForHidden($sId,$value,$sId));
$oBlock->AddSubBlock($oValue);
$oBlock->AddSubBlock(new Html('<span class="form_validation"></span>'));
$oOutput->AddJs(
<<<EOF
);
if ($bVertical) {
$oValue->AddSubBlock(new Html("<br>"));
}
$idx++;
}
$oValue->AddSubBlock(InputUIBlockFactory::MakeForHidden($sId, $value, $sId));
$oBlock->AddSubBlock($oValue);
$oBlock->AddSubBlock(new Html('<span class="form_validation"></span>'));
$oOutput->AddJs(
<<<EOF
$("#{$this->oField->GetGlobalId()}").off("change").on("change", function(){
var me = this;
@@ -201,28 +366,25 @@ EOF
.closest('.form_handler').trigger('value_change');
});
EOF
);
}
else
{
// Drop-down select
//
$oBlock->AddDataAttribute("input-type","Combodo\\iTop\\Form\\Field\\SelectObjectField\\Select");
$sEditType = 'select';
$oSelect = SelectUIBlockFactory::MakeForSelect("",$this->oField->GetGlobalId());
$oSelect->AddCSSClass('ibo-input-select-placeholder');
$oBlock->AddSubBlock(UIContentBlockUIBlockFactory::MakeStandard(null,['ibo-input-field-wrapper'])->AddSubBlock($oSelect));
$oSelect->AddOption(SelectOptionUIBlockFactory::MakeForSelectOption('',Dict::S('UI:SelectOne'), false ));
while ($oObject = $oSet->Fetch())
{
$iObject = $oObject->GetKey();
$sLabel = $oObject->Get('friendlyname');
// Note : The test is a double equal on purpose as the type of the value received from the XHR is not always the same as the type of the allowed values. (eg : string vs int)
$oSelect->AddOption(SelectOptionUIBlockFactory::MakeForSelectOption($iObject,$sLabel, ($this->oField->GetCurrentValue() == $iObject)));
}
$oBlock->AddSubBlock(new Html('<span class="form_validation"></span>'));
$oOutput->AddJs(
<<<JS
);
} else {
// Drop-down select
//
$oBlock->AddDataAttribute("input-type", "Combodo\\iTop\\Form\\Field\\SelectObjectField\\Select");
$sEditType = 'select';
$oSelect = SelectUIBlockFactory::MakeForSelect("", $this->oField->GetGlobalId());
$oSelect->AddCSSClass('ibo-input-select-placeholder');
$oBlock->AddSubBlock(UIContentBlockUIBlockFactory::MakeStandard(null, ['ibo-input-field-wrapper'])->AddSubBlock($oSelect));
$oSelect->AddOption(SelectOptionUIBlockFactory::MakeForSelectOption('', Dict::S('UI:SelectOne'), false));
while ($oObject = $oSet->Fetch()) {
$iObject = $oObject->GetKey();
$sLabel = $oObject->Get('friendlyname');
// Note : The test is a double equal on purpose as the type of the value received from the XHR is not always the same as the type of the allowed values. (eg : string vs int)
$oSelect->AddOption(SelectOptionUIBlockFactory::MakeForSelectOption($iObject, $sLabel, ($this->oField->GetCurrentValue() == $iObject)));
}
$oBlock->AddSubBlock(new Html('<span class="form_validation"></span>'));
$oOutput->AddJs(
<<<JS
$("#{$this->oField->GetGlobalId()}").selectize({
sortField: 'text',
onChange: function(value){
@@ -233,33 +395,43 @@ EOF
value: me.val()
})
.closest('.form_handler').trigger('value_change');
},
inputClass: 'ibo-input-vanilla ibo-input ibo-input-selectize',
},
loadingClass: '',
itemClass: 'item attribute-set-item',
inputClass: 'ibo-input-vanilla ibo-input ibo-input-selectize',
plugins: {
'combodo_update_operations' : {
initial: ["5"],
},
'combodo_auto_position' : {
maxDropDownHeight: 300,
},
'remove_button' : {},
},
});
$("#{$this->oField->GetGlobalId()}").closest('div').addClass('ibo-input-select-wrapper--with-buttons');
JS
);
}
}
$oBlock->AddDataAttribute("input-type", $sFieldClass);
$oOutput->AddHtml((BlockRenderer::RenderBlockTemplates($oBlock)));
// JS Form field widget construct
$aValidators = array();
foreach ($this->oField->GetValidators() as $oValidator) {
if ($oValidator::GetName() == 'notemptyextkey') {
// The autocomplete widget returns an empty string if the value is undefined (and the select has been aligned with this behavior)
$oValidator = new MandatoryValidator();
}
$aValidators[$oValidator::GetName()] = array(
'reg_exp' => $oValidator->GetRegExp(),
'message' => Dict::S($oValidator->GetErrorMessage()),
);
}
}
$oOutput->AddHtml((BlockRenderer::RenderBlockTemplates($oBlock)));
// JS Form field widget construct
$aValidators = array();
foreach ($this->oField->GetValidators() as $oValidator)
{
if ($oValidator::GetName() == 'notemptyextkey')
{
// The autocomplete widget returns an empty string if the value is undefined (and the select has been aligned with this behavior)
$oValidator = new MandatoryValidator();
}
$aValidators[$oValidator::GetName()] = array(
'reg_exp' => $oValidator->GetRegExp(),
'message' => Dict::S($oValidator->GetErrorMessage())
);
}
$sValidators = json_encode($aValidators);
$sFormFieldOptions =
<<<EOF
$sValidators = json_encode($aValidators);
$sFormFieldOptions =
<<<EOF
{
validators: $sValidators,
on_validation_callback: function(me, oResult) {
@@ -279,14 +451,14 @@ JS
}
}
}
EOF
;
EOF;
$oOutput->AddJs(
<<<EOF
$oOutput->AddJs(
<<<EOF
$("[data-field-id='{$this->oField->GetId()}'][data-form-path='{$this->oField->GetFormPath()}']").form_field($sFormFieldOptions);
EOF
);
);
}
switch ($sEditType)
{
case 'autocomplete':

View File

@@ -51,6 +51,7 @@ class ConsoleSimpleFieldRenderer extends FieldRenderer
{
$oOutput = parent::Render();
$sFieldClass = get_class($this->oField);
\IssueLog::Error($this->oField->GetLabel().':render simple:'.$sFieldClass);
if ($sFieldClass == 'Combodo\\iTop\\Form\\Field\\HiddenField')
{
@@ -99,29 +100,29 @@ class ConsoleSimpleFieldRenderer extends FieldRenderer
switch ($sFieldClass)
{
case 'Combodo\\iTop\\Form\\Field\\DateTimeField':
$oValue = UIContentBlockUIBlockFactory::MakeStandard("",["form-field-content"]);
$oValue = UIContentBlockUIBlockFactory::MakeStandard("", ["form-field-content"]);
$sDateTimeFormat = $this->oField->GetPHPDateTimeFormat();
$oFormat = new DateTimeFormat($sDateTimeFormat);
$sPlaceHolder = $oFormat->ToPlaceholder();
if ($this->oField->GetReadOnly())
{
$oValue->AddSubBlock(InputUIBlockFactory::MakeForHidden("",$this->oField->GetCurrentValue(),$this->oField->GetGlobalId()));
if ($this->oField->GetReadOnly()) {
$oValue->AddSubBlock(InputUIBlockFactory::MakeForHidden("", $this->oField->GetCurrentValue(), $this->oField->GetGlobalId()));
$oValue->AddSubBlock(new Html($this->oField->GetCurrentValue()));
}
else {
} else {
$oField = UIContentBlockUIBlockFactory::MakeStandard("", ["field_input_zone", "field_input_datetime", "ibo-input-field-wrapper", "ibo-input-datetime-wrapper"]);
$oValue->AddSubBlock($oField);
$oField->AddSubBlock(new Html('<input class="date-pick ibo-input ibo-input-date" type="text" placeholder="'.utils::EscapeHtml($sPlaceHolder).'" id="'.$this->oField->GetGlobalId().'" value="'.utils::EscapeHtml($this->oField->GetCurrentValue()).'" autocomplete="off"/>'));
$oField->AddSubBlock(new Html('<span class="form_validation"></span>'));
}
$oBlock->AddSubBlock($oValue);
break;
break;
case 'Combodo\\iTop\\Form\\Field\\LabelField':
$oValue = UIContentBlockUIBlockFactory::MakeStandard("",[""]);
$oValue = UIContentBlockUIBlockFactory::MakeStandard("", [""]);
$oBlock->AddSubBlock($oValue);
$oValue->AddSubBlock(new Text($this->oField->GetCurrentValue()));
if (utils::IsNotNullOrEmptyString($this->oField->GetCurrentValue())) {
$oValue->AddSubBlock(new Text($this->oField->GetCurrentValue()));
}
$oValue->AddSubBlock(new Html('<span class="form_validation"></span>'));
break;
@@ -175,8 +176,7 @@ class ConsoleSimpleFieldRenderer extends FieldRenderer
$('#{$this->oField->GetGlobalId()}').ckeditor(function(){}, $sJsConfig);
EOF
);
if (($this->oField->GetObject() !== null) && ($this->oField->GetTransactionId() !== null))
{
if (($this->oField->GetObject() !== null) && ($this->oField->GetTransactionId() !== null)) {
$oOutput->AddJs(InlineImage::EnableCKEditorImageUpload($this->oField->GetObject(), utils::GetUploadTempId($this->oField->GetTransactionId())));
}
}
@@ -186,25 +186,21 @@ EOF
break;
case 'Combodo\\iTop\\Form\\Field\\SelectField':
$oValue = UIContentBlockUIBlockFactory::MakeStandard("",["form-field-content","ibo-input-field-wrapper"]);
if ($this->oField->GetReadOnly())
{
$oValue = UIContentBlockUIBlockFactory::MakeStandard("", ["form-field-content", "ibo-input-field-wrapper"]);
if ($this->oField->GetReadOnly()) {
$aChoices = $this->oField->GetChoices();
$sCurrentLabel = isset($aChoices[$this->oField->GetCurrentValue()]) ? $aChoices[$this->oField->GetCurrentValue()] : '' ;
$oValue->AddSubBlock(InputUIBlockFactory::MakeForHidden("",$this->oField->GetCurrentValue(),$this->oField->GetGlobalId()));
$sCurrentLabel = isset($aChoices[$this->oField->GetCurrentValue()]) ? $aChoices[$this->oField->GetCurrentValue()] : '';
$oValue->AddSubBlock(InputUIBlockFactory::MakeForHidden("", $this->oField->GetCurrentValue(), $this->oField->GetGlobalId()));
$oValue->AddSubBlock(new Html($sCurrentLabel));
}
else
{
$oSelect = SelectUIBlockFactory::MakeForSelect("",$this->oField->GetGlobalId());
} else {
$oSelect = SelectUIBlockFactory::MakeForSelect("", $this->oField->GetGlobalId());
$oSelect->AddCSSClass('ibo-input-field-wrapper');
if ($this->oField->GetMultipleValuesEnabled()) {
$oSelect->SetIsMultiple(true);
}
foreach ($this->oField->GetChoices() as $sChoice => $sLabel)
{
foreach ($this->oField->GetChoices() as $sChoice => $sLabel) {
// Note : The test is a double equal on purpose as the type of the value received from the XHR is not always the same as the type of the allowed values. (eg : string vs int)
$oSelect->AddOption(SelectOptionUIBlockFactory::MakeForSelectOption($sChoice,$sLabel, ($this->oField->GetCurrentValue() == $sChoice)));
$oSelect->AddOption(SelectOptionUIBlockFactory::MakeForSelectOption($sChoice, $sLabel, ($this->oField->GetCurrentValue() == $sChoice)));
}
$oValue->AddSubBlock($oSelect);
$oValue->AddSubBlock(new Html('<span class="form_validation"></span>'));
@@ -212,25 +208,119 @@ EOF
$oBlock->AddSubBlock($oValue);
break;
case 'Combodo\\iTop\\Form\\Field\\RadioField':
$oValue = UIContentBlockUIBlockFactory::MakeStandard("",["form-field-content"]);
if ($this->oField->GetReadOnly())
{
case 'Combodo\\iTop\\Form\\Field\\TagSetField':
$oValue = UIContentBlockUIBlockFactory::MakeStandard("", ["form-field-content", "ibo-input-field-wrapper"]);
if ($this->oField->GetReadOnly()) {
$aChoices = $this->oField->GetChoices();
$sCurrentLabel = isset($aChoices[$this->oField->GetCurrentValue()]) ? $aChoices[$this->oField->GetCurrentValue()] : '' ;
$oValue->AddSubBlock(InputUIBlockFactory::MakeForHidden("",$this->oField->GetCurrentValue(),$this->oField->GetGlobalId()));
$sCurrentLabel = isset($aChoices[$this->oField->GetCurrentValue()]) ? $aChoices[$this->oField->GetCurrentValue()] : '';
$oValue->AddSubBlock(InputUIBlockFactory::MakeForHidden("", $this->oField->GetCurrentValue(), $this->oField->GetGlobalId()));
$oValue->AddSubBlock(new Html($sCurrentLabel));
} else {
$oSelect = SelectUIBlockFactory::MakeForSelect("", $this->oField->GetGlobalId());
$oSelect->SetIsMultiple(true);
$oSelect->AddCSSClass('ibo-input-field-wrapper');
\IssueLog::Error('valeur:'.json_encode($this->oField->GetCurrentValue()));
foreach ($this->oField->GetChoices() as $sChoice => $sLabel) {
// Note : The test is a double equal on purpose as the type of the value received from the XHR is not always the same as the type of the allowed values. (eg : string vs int)
$oSelect->AddOption(SelectOptionUIBlockFactory::MakeForSelectOption($sChoice, $sLabel, is_null($this->oField->GetCurrentValue()) ? false : in_array($sChoice, $this->oField->GetCurrentValue()) === true));
}
$oValue->AddSubBlock($oSelect);
$oValue->AddSubBlock(new Html('<span class="form_validation"></span>'));
}
else
{
$oBlock->AddSubBlock($oValue);
$oOutput->AddJs(
<<<JS
$("#{$this->oField->GetGlobalId()}").selectize({
maxItems: null,
sortField: 'text',
onChange: function(value){
var me = this.\$input;
me.trigger("field_change", {
id: me.attr("id"),
name: me.closest(".form_field").attr("data-field-id"),
value: JSON.stringify(me.val())
})
.closest('.form_handler').trigger('value_change');
console.warn('chanegement');
},
itemClass: 'attribute-set-item',
});
$("#{$this->oField->GetGlobalId()}").closest('div').addClass('ibo-input-select-wrapper--with-buttons');
JS
);
break;
case 'Combodo\\iTop\\Form\\Field\\MultipleSelectField':
$oValue = UIContentBlockUIBlockFactory::MakeStandard("", ["form-field-content"]);
if ($this->oField->GetReadOnly()) {
$aChoices = $this->oField->GetChoices();
$sCurrentLabel = isset($aChoices[$this->oField->GetCurrentValue()]) ? $aChoices[$this->oField->GetCurrentValue()] : '';
$oValue->AddSubBlock(InputUIBlockFactory::MakeForHidden("", $this->oField->GetCurrentValue(), $this->oField->GetGlobalId()));
$oValue->AddSubBlock(new Html($sCurrentLabel));
} else {
$aValues = $this->oField->GetCurrentValue();
// $oValue->AddSubBlock(InputUIBlockFactory::MakeForHidden("", implode(',', $this->oField->GetCurrentValue()), $this->oField->GetGlobalId()));
$iId = 1;
foreach ($this->oField->GetChoices() as $sChoice => $sLabel) {
$oCheckBox = InputUIBlockFactory::MakeForInputWithLabel($sLabel, ''.$this->oField->GetGlobalId(), $sChoice, $this->oField->GetGlobalId().'_'.$iId, "checkbox");
$oCheckBox->GetInput()->SetIsChecked(is_null($aValues) ? false : in_array($sChoice, $aValues) === true);
$oCheckBox->SetBeforeInput(false);
$oCheckBox->GetInput()->AddCSSClass('ibo-input--label-right');
$oCheckBox->GetInput()->AddCSSClass('ibo-input-checkbox');
$oValue->AddSubBlock($oCheckBox);
$iId++;
}
$oOutput->AddJs(
<<<JS
$("[name={$this->oField->GetGlobalId()}]").off("change").on("change", function(){
$("[name={$this->oField->GetGlobalId()}]").closest(".field_set").trigger("field_change", {
id: $("[name={$this->oField->GetGlobalId()}]").attr("id"),
name: $("[name={$this->oField->GetGlobalId()}]").closest(".form_field").attr("data-field-id"),
value: $("[name={$this->oField->GetGlobalId()}]").val()
})
.closest('.form_handler').trigger('value_change');
});
JS
);
/* $oOutput->AddJs(
<<<JS
$("[name=checkbox_{$this->oField->GetGlobalId()}]").off("change").on("change", function(){
var aValues = [];
$("[name=checkbox_{$this->oField->GetGlobalId()}]").each(function(){ if (this.checked){ aValues.push($(this).val()); }});
$("#{$this->oField->GetGlobalId()}").val(aValues.toString());
$("#{$this->oField->GetGlobalId()}").closest(".field_set").trigger("field_change", {
id: $("{$this->oField->GetGlobalId()}").attr("id"),
name: $("{$this->oField->GetGlobalId()}").closest(".form_field").attr("data-field-id"),
value: $("{$this->oField->GetGlobalId()}").val()
})
.closest('.form_handler').trigger('value_change');
});
JS
);*/
$oValue->AddSubBlock(new Html('<span class="form_validation"></span>'));
$oBlock->AddSubBlock($oValue);
}
break;
case 'Combodo\\iTop\\Form\\Field\\RadioField':
$oValue = UIContentBlockUIBlockFactory::MakeStandard("", ["form-field-content"]);
if ($this->oField->GetReadOnly()) {
$aChoices = $this->oField->GetChoices();
$sCurrentLabel = isset($aChoices[$this->oField->GetCurrentValue()]) ? $aChoices[$this->oField->GetCurrentValue()] : '';
$oValue->AddSubBlock(InputUIBlockFactory::MakeForHidden("", $this->oField->GetCurrentValue(), $this->oField->GetGlobalId()));
$oValue->AddSubBlock(new Html($sCurrentLabel));
} else {
$bVertical = true;
$idx = 0;
$bMandatory = $this->oField->GetMandatory();
$value = $this->oField->GetCurrentValue();
$sId = $this->oField->GetGlobalId();
$aChoices = $this->oField->GetChoices();
foreach ($aChoices as $sChoice => $sLabel)
{
foreach ($aChoices as $sChoice => $sLabel) {
if ((count($aChoices) == 1) && $bMandatory) {
// When there is only once choice, select it by default
$sSelected = 'checked';
@@ -398,16 +488,19 @@ EOF
$oOutput->AddJs(
<<<EOF
$("#{$this->oField->GetGlobalId()}").selectize({
sortField: 'text',
onChange: function(value){
var me = this.\$input;
me.closest(".field_set").trigger("field_change", {
id: me.attr("id"),
name: me.closest(".form_field").attr("data-field-id"),
value: me.val()
})
.closest('.form_handler').trigger('value_change');
}
sortField: 'text',
onChange: function(value){
console.warn('lala');
var me = this.\$input;
me.closest(".field_set").trigger("field_change", {
id: me.attr("id"),
name: me.closest(".form_field").attr("data-field-id"),
value: me.val()
})
.closest('.form_handler').trigger('value_change');
},
itemClass: 'attribute-set-item'
});
EOF
);
@@ -469,8 +562,7 @@ EOF
$("[data-field-id='{$this->oField->GetId()}'][data-form-path='{$this->oField->GetFormPath()}']").form_field($sFormFieldOptions);
EOF
);
switch ($sFieldClass)
{
switch ($sFieldClass) {
case 'Combodo\\iTop\\Form\\Field\\SelectField':
$oOutput->AddJs(
<<<EOF
@@ -478,6 +570,13 @@ EOF
EOF
);
break;
case 'Combodo\\iTop\\Form\\Field\\TagSetField':
//case 'Combodo\\iTop\\Form\\Field\\MultipleSelectField':
$oOutput->AddJs(
<<<EOF
$("[data-field-id='{$this->oField->GetId()}'][data-form-path='{$this->oField->GetFormPath()}']").form_field('option', 'get_current_value_callback', function(me){console.warn('bobb'); return $(me.element).find('select').val();});
EOF
);
}
$oOutput->AddJs(

View File

@@ -419,7 +419,7 @@ var aOptions{{ sListIDForVarSuffix }} = {
sSelectMode: "{{ oUIBlock.GetOption("select_mode") }}",
sSelectedItemsName: "oSelectedItems{{ sListIDForVarSuffix }}",
sViewLink: '{{ oUIBlock.GetOption("bViewLink") }}',
iPageSize: ' {{ iPageSize }}',
iPageSize: {{ iPageSize }},
oClassAliases: JSON.parse('{{ oUIBlock.GetOption("oClassAliases") |raw }}'),
sTableId: '{{ oUIBlock.GetOption("sTableId") }}',
sRenderUrl: "{{ oUIBlock.GetAjaxUrl() }}",

View File

@@ -8,11 +8,16 @@ function GoBack()
function DoCheckPwd()
{
if ($('#new_pwd').val() != $('#retype_new_pwd').val())
var new_pwd = $('#new_pwd').val();
if (new_pwd !== $('#retype_new_pwd').val())
{
alert('{{ 'UI:Login:RetypePwdDoesNotMatch'|dict_s }}');
return false;
}
if (new_pwd === $('#old_pwd').val()) {
alert('{{ 'UI:Login:PasswordNotChanged'|dict_s }}');
return false;
}
return true;
}

View File

@@ -830,7 +830,7 @@ class utilsTest extends ItopTestCase
'good element_identifier' => [utils::ENUM_SANITIZATION_FILTER_ELEMENT_IDENTIFIER, 'AD05nb', 'AD05nb'],
'bad element_identifier' => [utils::ENUM_SANITIZATION_FILTER_ELEMENT_IDENTIFIER, 'AD05nb+', 'AD05nb'],
'good url' => [utils::ENUM_SANITIZATION_FILTER_URL, 'https://www.w3schools.com', 'https://www.w3schools.com'],
'bad url' => [utils::ENUM_SANITIZATION_FILTER_URL, 'https://www.w3schoo<6F><6F>ls.co<63>m', 'https://www.w3schools.com'],
'bad url' => [utils::ENUM_SANITIZATION_FILTER_URL, 'https://www.w3schoo<6F><6F>ls.co<63>m', null],
'raw_data' => ['raw_data', '<Test>\s😃😃😃', '<Test>\s😃😃😃'],
];
}

View File

@@ -47,7 +47,7 @@ class CRUDEventTest extends ItopDataTestCase
}
/**
* Check that the 3 events EVENT_DB_COMPUTE_VALUES, EVENT_DB_CHECK_TO_WRITE and EVENT_DB_CREATE_DONE are called on insert
* Check that the 3 events EVENT_DB_COMPUTE_VALUES, EVENT_DB_CHECK_TO_WRITE and EVENT_DB_AFTER_WRITE are called on insert
*
* @return void
* @throws \Exception
@@ -61,12 +61,13 @@ class CRUDEventTest extends ItopDataTestCase
$this->assertIsObject($oOrg);
$this->assertEquals(1, self::$aEventCalls[EVENT_DB_COMPUTE_VALUES]);
$this->assertEquals(1, self::$aEventCalls[EVENT_DB_CHECK_TO_WRITE]);
$this->assertEquals(1, self::$aEventCalls[EVENT_DB_CREATE_DONE]);
$this->assertEquals(3, self::$iEventCalls);
$this->assertEquals(1, self::$aEventCalls[EVENT_DB_BEFORE_WRITE]);
$this->assertEquals(1, self::$aEventCalls[EVENT_DB_AFTER_WRITE]);
$this->assertEquals(4, self::$iEventCalls);
}
/**
* Check that the 3 events EVENT_DB_COMPUTE_VALUES, EVENT_DB_CHECK_TO_WRITE and EVENT_DB_UPDATE_DONE are called on update
* Check that the 3 events EVENT_DB_COMPUTE_VALUES, EVENT_DB_CHECK_TO_WRITE and EVENT_DB_AFTER_WRITE are called on update
*
* @return void
* @throws \Exception
@@ -84,8 +85,9 @@ class CRUDEventTest extends ItopDataTestCase
$this->assertEquals(1, self::$aEventCalls[EVENT_DB_COMPUTE_VALUES]);
$this->assertEquals(1, self::$aEventCalls[EVENT_DB_CHECK_TO_WRITE]);
$this->assertEquals(1, self::$aEventCalls[EVENT_DB_UPDATE_DONE]);
$this->assertEquals(3, self::$iEventCalls);
$this->assertEquals(1, self::$aEventCalls[EVENT_DB_BEFORE_WRITE]);
$this->assertEquals(1, self::$aEventCalls[EVENT_DB_AFTER_WRITE]);
$this->assertEquals(4, self::$iEventCalls);
}
/**
@@ -210,7 +212,7 @@ class CRUDEventTest extends ItopDataTestCase
}
/**
* Modify one object during EVENT_DB_CREATE_DONE
* Modify one object during EVENT_DB_AFTER_WRITE
* Check that all the events are sent (CREATE + UPDATE)
* Check that the modification is saved in DB
*
@@ -221,7 +223,7 @@ class CRUDEventTest extends ItopDataTestCase
{
$oEventReceiver = new CRUDEventReceiver();
// Set the person's first name during Compute Values
$oEventReceiver->AddCallback(EVENT_DB_CREATE_DONE, Person::class, 'SetPersonFirstName');
$oEventReceiver->AddCallback(EVENT_DB_AFTER_WRITE, Person::class, 'SetPersonFirstName');
$oEventReceiver->RegisterCRUDListeners();
$oPerson = $this->CreatePerson(1);
@@ -229,9 +231,9 @@ class CRUDEventTest extends ItopDataTestCase
$this->assertEquals(2, self::$aEventCalls[EVENT_DB_COMPUTE_VALUES]);
$this->assertEquals(2, self::$aEventCalls[EVENT_DB_CHECK_TO_WRITE]);
$this->assertEquals(1, self::$aEventCalls[EVENT_DB_CREATE_DONE]);
$this->assertEquals(1, self::$aEventCalls[EVENT_DB_UPDATE_DONE]);
$this->assertEquals(6, self::$iEventCalls);
$this->assertEquals(2, self::$aEventCalls[EVENT_DB_BEFORE_WRITE]);
$this->assertEquals(2, self::$aEventCalls[EVENT_DB_AFTER_WRITE]);
$this->assertEquals(8, self::$iEventCalls);
// Read the object explicitly from the DB to check that the first name has been set
$oSet = new DBObjectSet(DBSearch::FromOQL('SELECT Person WHERE id=:id'), [], ['id' => $oPerson->GetKey()]);
@@ -240,7 +242,7 @@ class CRUDEventTest extends ItopDataTestCase
}
/**
* Modify one object during EVENT_DB_UPDATE_DONE
* Modify one object during EVENT_DB_AFTER_WRITE
* Check that all the events are sent (UPDATE + UPDATE again)
* Check that the modification is saved in DB
*
@@ -254,7 +256,7 @@ class CRUDEventTest extends ItopDataTestCase
$oEventReceiver = new CRUDEventReceiver();
// Set the person's first name during Compute Values
$oEventReceiver->AddCallback(EVENT_DB_UPDATE_DONE, Person::class, 'SetPersonFirstName');
$oEventReceiver->AddCallback(EVENT_DB_AFTER_WRITE, Person::class, 'SetPersonFirstName');
$oEventReceiver->RegisterCRUDListeners();
$oPerson->Set('function', 'test'.rand());
@@ -262,8 +264,9 @@ class CRUDEventTest extends ItopDataTestCase
$this->assertEquals(2, self::$aEventCalls[EVENT_DB_COMPUTE_VALUES]);
$this->assertEquals(2, self::$aEventCalls[EVENT_DB_CHECK_TO_WRITE]);
$this->assertEquals(2, self::$aEventCalls[EVENT_DB_UPDATE_DONE]);
$this->assertEquals(6, self::$iEventCalls);
$this->assertEquals(2, self::$aEventCalls[EVENT_DB_BEFORE_WRITE]);
$this->assertEquals(2, self::$aEventCalls[EVENT_DB_AFTER_WRITE]);
$this->assertEquals(8, self::$iEventCalls);
// Read the object explicitly from the DB to check that the first name has been set
$oSet = new DBObjectSet(DBSearch::FromOQL('SELECT Person WHERE id=:id'), [], ['id' => $oPerson->GetKey()]);
@@ -272,8 +275,8 @@ class CRUDEventTest extends ItopDataTestCase
}
/**
* Modify one object during EVENT_DB_UPDATE_DONE
* Check that the CRUD is protected against infinite loops (when modifying an object in its EVENT_DB_UPDATE_DONE)
* Modify one object during EVENT_DB_AFTER_WRITE
* Check that the CRUD is protected against infinite loops (when modifying an object in its EVENT_DB_AFTER_WRITE)
*
*
* @return void
@@ -288,8 +291,8 @@ class CRUDEventTest extends ItopDataTestCase
$oEventReceiver = new CRUDEventReceiver();
// Set the person's first name during Compute Values
$oEventReceiver->AddCallback(EVENT_DB_UPDATE_DONE, Person::class, 'SetPersonFirstName', 100);
$oEventReceiver->RegisterCRUDListeners(EVENT_DB_UPDATE_DONE);
$oEventReceiver->AddCallback(EVENT_DB_AFTER_WRITE, Person::class, 'SetPersonFirstName', 100);
$oEventReceiver->RegisterCRUDListeners(EVENT_DB_AFTER_WRITE);
$oPerson->Set('function', 'test'.rand());
$oPerson->DBUpdate();
@@ -338,8 +341,9 @@ class CRUDEventTest extends ItopDataTestCase
// 1 insert for Team, 3 insert for lnkPersonToTeam
$this->assertEquals(4, self::$aEventCalls[EVENT_DB_COMPUTE_VALUES]);
$this->assertEquals(4, self::$aEventCalls[EVENT_DB_CHECK_TO_WRITE]);
$this->assertEquals(4, self::$aEventCalls[EVENT_DB_CREATE_DONE]);
$this->assertEquals(12, self::$iEventCalls);
$this->assertEquals(4, self::$aEventCalls[EVENT_DB_BEFORE_WRITE]);
$this->assertEquals(4, self::$aEventCalls[EVENT_DB_AFTER_WRITE]);
$this->assertEquals(16, self::$iEventCalls);
}
/**
@@ -374,7 +378,7 @@ class CRUDEventTest extends ItopDataTestCase
$this->debug("\n-------------> Test Starts HERE\n");
$oEventReceiver = new CRUDEventReceiver();
// Create a new role and add it to the newly created lnkPersonToTeam
$oEventReceiver->AddCallback(EVENT_DB_CREATE_DONE, lnkPersonToTeam::class, 'AddRoleToLink');
$oEventReceiver->AddCallback(EVENT_DB_AFTER_WRITE, lnkPersonToTeam::class, 'AddRoleToLink');
$oEventReceiver->RegisterCRUDListeners();
// Create the team
@@ -385,9 +389,9 @@ class CRUDEventTest extends ItopDataTestCase
// 1 for Team, 1 for lnkPersonToTeam, 1 for ContactType and 1 for the update of lnkPersonToTeam
$this->assertEquals(4, self::$aEventCalls[EVENT_DB_COMPUTE_VALUES]);
$this->assertEquals(4, self::$aEventCalls[EVENT_DB_CHECK_TO_WRITE]);
$this->assertEquals(3, self::$aEventCalls[EVENT_DB_CREATE_DONE]);
$this->assertEquals(1, self::$aEventCalls[EVENT_DB_UPDATE_DONE]);
$this->assertEquals(12, self::$iEventCalls);
$this->assertEquals(4, self::$aEventCalls[EVENT_DB_BEFORE_WRITE]);
$this->assertEquals(4, self::$aEventCalls[EVENT_DB_AFTER_WRITE]);
$this->assertEquals(16, self::$iEventCalls);
// Read the object explicitly from the DB to check that the role has been set
$oSet = new DBObjectSet(DBSearch::FromOQL('SELECT Team WHERE id=:id'), [], ['id' => $oTeam->GetKey()]);
@@ -400,7 +404,7 @@ class CRUDEventTest extends ItopDataTestCase
}
/**
* Check that updates during EVENT_DB_CREATE_DONE are postponed to the end of all events and only one update is done
* Check that updates during EVENT_DB_AFTER_WRITE are postponed to the end of all events and only one update is done
*
* @return void
* @throws \Exception
@@ -409,24 +413,21 @@ class CRUDEventTest extends ItopDataTestCase
{
$oEventReceiver = new CRUDEventReceiver();
// Set the person's function after the creation
$oEventReceiver->AddCallback(EVENT_DB_CREATE_DONE, Person::class, 'SetPersonFunction');
$oEventReceiver->RegisterCRUDListeners(EVENT_DB_CREATE_DONE);
$oEventReceiver->AddCallback(EVENT_DB_AFTER_WRITE, Person::class, 'SetPersonFunction');
$oEventReceiver->RegisterCRUDListeners(EVENT_DB_AFTER_WRITE);
// Intentionally register twice so 2 modifications will be done
$oEventReceiver = new CRUDEventReceiver();
$oEventReceiver->AddCallback(EVENT_DB_CREATE_DONE, Person::class, 'SetPersonFirstName');
$oEventReceiver->RegisterCRUDListeners(EVENT_DB_CREATE_DONE);
// Used to count the updates
$oEventReceiver->RegisterCRUDListeners(EVENT_DB_UPDATE_DONE);
$oEventReceiver->AddCallback(EVENT_DB_AFTER_WRITE, Person::class, 'SetPersonFirstName');
$oEventReceiver->RegisterCRUDListeners(EVENT_DB_AFTER_WRITE);
self::$iEventCalls = 0;
$oPerson = $this->CreatePerson(1);
$this->assertIsObject($oPerson);
// 2 for insert => 2 modifications generate ONE update
// 1 for update (if 2 updates were done 2 events were counted)
$this->assertEquals(2, self::$aEventCalls[EVENT_DB_CREATE_DONE]);
$this->assertEquals(1, self::$aEventCalls[EVENT_DB_UPDATE_DONE]);
$this->assertEquals(3, self::$iEventCalls);
// 2 for update (if 2 updates were done then 4 events would have been counted)
$this->assertEquals(4, self::$aEventCalls[EVENT_DB_AFTER_WRITE]);
$this->assertEquals(4, self::$iEventCalls);
}
@@ -457,16 +458,16 @@ class CRUDEventTest extends ItopDataTestCase
$this->assertTrue(CRUDEventReceiver::$bIsObjectInCrudStack);
$oEventReceiver->CleanCallbacks();
$oEventReceiver->AddCallback(EVENT_DB_CREATE_DONE, Person::class, 'CheckCrudStack');
$oEventReceiver->RegisterCRUDListeners(EVENT_DB_CREATE_DONE);
$oEventReceiver->AddCallback(EVENT_DB_AFTER_WRITE, Person::class, 'CheckCrudStack');
$oEventReceiver->RegisterCRUDListeners(EVENT_DB_AFTER_WRITE);
$this->CreatePerson(3);
$this->assertTrue(CRUDEventReceiver::$bIsObjectInCrudStack);
$oEventReceiver->CleanCallbacks();
// Insert a Team with new lnkPersonToTeam - in the lnkPersonToTeam event we check that Team CRUD operation is ongoing
$oEventReceiver->AddCallback(EVENT_DB_CREATE_DONE, Person::class, 'CheckUpdateInLnk');
$oEventReceiver->AddCallback(EVENT_DB_AFTER_WRITE, Person::class, 'CheckUpdateInLnk');
$sLinkedClass = lnkPersonToTeam::class;
$oEventReceiver->RegisterCRUDListeners(EVENT_DB_CREATE_DONE, $sLinkedClass);
$oEventReceiver->RegisterCRUDListeners(EVENT_DB_AFTER_WRITE, $sLinkedClass);
// Prepare the link for the insertion with the team
$aLinkedObjectsArray = [];
$oSet = DBObjectSet::FromArray($sLinkedClass, $aLinkedObjectsArray);
@@ -552,9 +553,9 @@ class CRUDEventReceiver extends ClassesWithDebug
EventService::RegisterListener(EVENT_DB_COMPUTE_VALUES, [$this, 'OnEvent']);
EventService::RegisterListener(EVENT_DB_CHECK_TO_WRITE, [$this, 'OnEvent']);
EventService::RegisterListener(EVENT_DB_CHECK_TO_DELETE, [$this, 'OnEvent']);
EventService::RegisterListener(EVENT_DB_CREATE_DONE, [$this, 'OnEvent']);
EventService::RegisterListener(EVENT_DB_UPDATE_DONE, [$this, 'OnEvent']);
EventService::RegisterListener(EVENT_DB_DELETE_DONE, [$this, 'OnEvent']);
EventService::RegisterListener(EVENT_DB_BEFORE_WRITE, [$this, 'OnEvent']);
EventService::RegisterListener(EVENT_DB_AFTER_WRITE, [$this, 'OnEvent']);
EventService::RegisterListener(EVENT_DB_AFTER_DELETE, [$this, 'OnEvent']);
return;
}

View File

@@ -115,9 +115,9 @@ class DBUnionSearchTest extends ItopDataTestCase
{
return [
[
'sSourceOQL' => "SELECT P1, L1 FROM Person AS P1 JOIN Location AS L1 ON P1.location_id = L1.id WHERE L1.id = 1",
'sSourceOQL' => "SELECT P1, L1 FROM Person AS P1 JOIN Location AS L1 ON P1.location_id = L1.id WHERE L1.id = 1",
'sClassAlias' => "L1",
'sFilterOQL' => "SELECT Location AS L2 WHERE L2.id = 2 UNION SELECT Location AS L3 WHERE L3.id = 3",
'sFilterOQL' => "SELECT Location AS L2 WHERE L2.id = 2 UNION SELECT Location AS L3 WHERE L3.id = 3",
'sExpected' => "SELECT `P1`, `L1` FROM Person AS `P1` JOIN Location AS `L1` ON `P1`.location_id = `L1`.id WHERE ((`L1`.`id` = 1) AND (`L1`.`id` = 2)) UNION SELECT `P1`, `L1` FROM Person AS `P1` JOIN Location AS `L1` ON `P1`.location_id = `L1`.id WHERE ((`L1`.`id` = 1) AND (`L1`.`id` = 3))",
],
[
@@ -159,4 +159,34 @@ class DBUnionSearchTest extends ItopDataTestCase
],
];
}
/**
* @dataProvider SetSelectedClassesProvider
* @param $sOQL
* @param $sSelectedClass
*
* @return void
* @throws \CoreException
* @throws \OQLException
*/
public function testSetSelectedClasses(string $sOQL, array $aSelectedClasses, string $sExpectedOQL)
{
$oSearch = DBSearch::FromOQL($sOQL);
$this->debug($oSearch->ToOQL());
$this->debug("Set selected classes to [ ".implode(" ,", $aSelectedClasses)." ]");
$oSearch->SetSelectedClasses($aSelectedClasses);
$this->debug($oSearch->ToOQL());
$this->assertEquals($sExpectedOQL, $oSearch->ToOQL());
}
public function SetSelectedClassesProvider()
{
return [
'N°6151' => [
'OQL' => "SELECT P FROM Person AS P JOIN User AS U ON U.contactid = P.id UNION SELECT P FROM Person AS P JOIN User AS U ON U.contactid = P.id",
'SelectedClasses' => ['U'],
'Expected OQL' => "SELECT `U` FROM Person AS `P` JOIN User AS `U` ON `U`.contactid = `P`.id WHERE 1 UNION SELECT `U` FROM Person AS `P` JOIN User AS `U` ON `U`.contactid = `P`.id WHERE 1",
],
];
}
}

View File

@@ -92,7 +92,7 @@
<class id="ClassWithEventListeners">
<event_listeners>
<event_listener id="OnUserRequestUpdateDone" _delta="define">
<event>EVENT_DB_UPDATE_DONE</event>
<event>EVENT_DB_AFTER_UPDATE</event>
<callback>OnUpdateDone</callback>
<rank>0</rank>
</event_listener>