diff --git a/application/themehandler.class.inc.php b/application/themehandler.class.inc.php index 37e71f37e..b9f869767 100644 --- a/application/themehandler.class.inc.php +++ b/application/themehandler.class.inc.php @@ -536,7 +536,7 @@ CSS; if (static::HasImageExtension($sImg) && ! array_key_exists($sImg, $aImages)) { - $sFilePath = realpath($sImg); + $sFilePath = utils::RealPath($sImg, APPROOT); if ($sFilePath !== false) { $sFilePathWithSlashes = str_replace('\\', '/', $sFilePath); $aImages[$sImg] = $sFilePathWithSlashes; @@ -544,7 +544,7 @@ CSS; } $sCanonicalPath = static::CanonicalizePath($sTargetThemeFolderPath.'/'.$sImg); - $sFilePath = realpath($sCanonicalPath); + $sFilePath = utils::RealPath($sCanonicalPath, APPROOT); if ($sFilePath !== false) { $sFilePathWithSlashes = str_replace('\\', '/', $sFilePath); $aImages[$sImg] = $sFilePathWithSlashes; diff --git a/core/dbobject.class.php b/core/dbobject.class.php index 3924228e1..52deb3868 100644 --- a/core/dbobject.class.php +++ b/core/dbobject.class.php @@ -2311,6 +2311,7 @@ abstract class DBObject implements iDisplay protected function HasObjectsInDbForUniquenessRule($sUniquenessRuleId, $aUniquenessRuleProperties) { $oUniquenessQuery = $this->GetSearchForUniquenessRule($sUniquenessRuleId, $aUniquenessRuleProperties); + $oUniquenessQuery->AllowAllData(); $oUniquenessDuplicates = new DBObjectSet($oUniquenessQuery); $bHasDuplicates = $oUniquenessDuplicates->CountExceeds(0); diff --git a/core/trigger.class.inc.php b/core/trigger.class.inc.php index 705c24a33..19bb3a7c3 100644 --- a/core/trigger.class.inc.php +++ b/core/trigger.class.inc.php @@ -114,17 +114,26 @@ abstract class Trigger extends cmdbAbstractObject // Find the related actions $oLinkedActions = $this->Get('action_list'); - while ($oLink = $oLinkedActions->Fetch()) - { - /** @var \DBObject $oLink */ - $iActionId = $oLink->Get('action_id'); - /** @var \Action $oAction */ - $oAction = MetaModel::GetObject('Action', $iActionId); - if ($oAction->IsActive()) - { - $oKPI = new ExecutionKPI(); - $oAction->DoExecute($this, $aContextArgs); - $oKPI->ComputeStatsForExtension($oAction, 'DoExecute'); + + // Order actions as expected + $aActionListOrdered = []; + while ($oLink = $oLinkedActions->Fetch()) { + $aActionListOrdered[(int) $oLink->Get('order')][] = $oLink; + } + ksort($aActionListOrdered); + + // Execute actions + foreach ($aActionListOrdered as $aActionSubList) { + foreach ($aActionSubList as $oLink) /** @var \DBObject $oLink */ { + /** @var \DBObject $oLink */ + $iActionId = $oLink->Get('action_id'); + /** @var \Action $oAction */ + $oAction = MetaModel::GetObject('Action', $iActionId); + if ($oAction->IsActive()) { + $oKPI = new ExecutionKPI(); + $oAction->DoExecute($this, $aContextArgs); + $oKPI->ComputeStatsForExtension($oAction, 'DoExecute'); + } } } } diff --git a/css/backoffice/components/datatable/_datatableconfig.scss b/css/backoffice/components/datatable/_datatableconfig.scss index 73be36185..81cca6339 100644 --- a/css/backoffice/components/datatable/_datatableconfig.scss +++ b/css/backoffice/components/datatable/_datatableconfig.scss @@ -22,6 +22,9 @@ $ibo-datatableconfig--settings-panel--option--margin-right: $ibo-spacing-200 !de } .ibo-datatableconfig--attributes-panel--per-page--input{ margin: $ibo-datatableconfig--attributes-panel--per-page--input--margin-y $ibo-datatableconfig--attributes-panel--per-page--input--margin-x; + max-width: 4em; + @extend .ibo-input; + display: initial; } .ibo-datatableconfig--settings-panel .ibo-panel--body{ diff --git a/js/dataTables.settings.js b/js/dataTables.settings.js index 77e9cc57e..e37e872d8 100644 --- a/js/dataTables.settings.js +++ b/js/dataTables.settings.js @@ -186,6 +186,11 @@ $(function () { var sSortDirection = 'asc'; var oColumns = $('#datatable_dlg_'+this.options.sListId).find(':itop-fieldsorter').fieldsorter('get_params'); var iPageSize = parseInt($('#datatable_dlg_'+this.options.sListId+' input[name="page_size"]').val(), 10); + // Fallback to default page size in case of invalid number + if (isNaN(iPageSize) || iPageSize <= 0) { + iPageSize = this.options.oDefaultSettings.iDefaultPageSize; + $('#datatable_dlg_'+this.options.sListId+' input[name="page_size"]').val(iPageSize); + } oOptions = {oColumns: oColumns, iPageSize: iPageSize, iDefaultPageSize: iPageSize }; } diff --git a/sources/Controller/AjaxRenderController.php b/sources/Controller/AjaxRenderController.php index 5dd491de3..e02a084a7 100644 --- a/sources/Controller/AjaxRenderController.php +++ b/sources/Controller/AjaxRenderController.php @@ -278,7 +278,7 @@ class AjaxRenderController } $sTableId = utils::ReadParam('list_id', ''); - $iLength = utils::ReadParam('end', 10); + $iLength = utils::ReadParam('end', 10, false, utils::ENUM_SANITIZATION_FILTER_INTEGER); $aColumns = utils::ReadParam('columns', array(), false, 'raw_data'); $sSelectMode = utils::ReadParam('select_mode', ''); $aClassAliases = utils::ReadParam('class_aliases', array()); @@ -499,7 +499,7 @@ class AjaxRenderController */ public static function DatatableSaveSettings(): bool { - $iPageSize = utils::ReadParam('page_size', 10); + $iPageSize = utils::ReadParam('page_size', 10, false, utils::ENUM_SANITIZATION_FILTER_INTEGER); $sTableId = utils::ReadParam('table_id', null, false, 'raw_data'); $bSaveAsDefaults = (utils::ReadParam('defaults', 'true') == 'true'); $aClassAliases = utils::ReadParam('class_aliases', array(), false, 'raw_data'); diff --git a/templates/base/components/datatable/config/layout.html.twig b/templates/base/components/datatable/config/layout.html.twig index a40357bbc..f28b1796d 100644 --- a/templates/base/components/datatable/config/layout.html.twig +++ b/templates/base/components/datatable/config/layout.html.twig @@ -20,7 +20,7 @@ -
{{ 'UI:Display_X_ItemsPerPage_prefix'|dict_s }}{{ 'UI:Display_X_ItemsPerPage_suffix'|dict_s }}
+{{ 'UI:Display_X_ItemsPerPage_prefix'|dict_s }}{{ 'UI:Display_X_ItemsPerPage_suffix'|dict_s }}