diff --git a/application/applicationextension.inc.php b/application/applicationextension.inc.php index d8e85b39e..392245eb1 100644 --- a/application/applicationextension.inc.php +++ b/application/applicationextension.inc.php @@ -825,6 +825,10 @@ class RestResult * Result: the requested operation cannot be performed because it can cause data (integrity) loss */ const UNSAFE = 12; + /** + * Result: the request page number is not valid. It must be an integer greater than 0 + */ + const INVALID_PAGE = 13; /** * Result: the operation could not be performed, see the message for troubleshooting */ @@ -1091,10 +1095,13 @@ class RestUtils * * @param string $sClass Name of the class * @param mixed $key Either search criteria (substructure), or an object or an OQL string. + * @param int $iLimit The limit of results to return + * @param int $iOffset The offset of results to return + * * @return DBObjectSet The search result set * @throws Exception If the input structure is not valid */ - public static function GetObjectSetFromKey($sClass, $key) + public static function GetObjectSetFromKey($sClass, $key, $iLimit = 0, $iOffset = 0) { if (is_object($key)) { @@ -1128,7 +1135,7 @@ class RestUtils { throw new Exception("Wrong format for key"); } - $oObjectSet = new DBObjectSet($oSearch); + $oObjectSet = new DBObjectSet($oSearch, array(), array(), null, $iLimit, $iOffset); return $oObjectSet; } diff --git a/core/restservices.class.inc.php b/core/restservices.class.inc.php index 916dd5f72..2ec01292c 100644 --- a/core/restservices.class.inc.php +++ b/core/restservices.class.inc.php @@ -436,8 +436,10 @@ class CoreServices implements iRestServiceProvider $key = RestUtils::GetMandatoryParam($aParams, 'key'); $aShowFields = RestUtils::GetFieldList($sClass, $aParams, 'output_fields'); $bExtendedOutput = (RestUtils::GetOptionalParam($aParams, 'output_fields', '*') == '*+'); + $iLimit = (int)RestUtils::GetOptionalParam($aParams, 'limit', 0); + $iPage = (int)RestUtils::GetOptionalParam($aParams, 'page', 1); - $oObjectSet = RestUtils::GetObjectSetFromKey($sClass, $key); + $oObjectSet = RestUtils::GetObjectSetFromKey($sClass, $key, $iLimit, self::getOffsetFromLimitAndPage($iLimit, $iPage)); $sTargetClass = $oObjectSet->GetFilter()->GetClass(); if (UserRights::IsActionAllowed($sTargetClass, UR_ACTION_READ) != UR_ALLOWED_YES) @@ -450,6 +452,11 @@ class CoreServices implements iRestServiceProvider $oResult->code = RestResult::UNAUTHORIZED; $oResult->message = "The current user does not have enough permissions for exporting data of class $sTargetClass"; } + elseif ($iPage < 1) + { + $oResult->code = RestResult::INVALID_PAGE; + $oResult->message = "The request page number is not valid. It must be an integer greater than 0"; + } else { while ($oObject = $oObjectSet->Fetch()) @@ -774,4 +781,15 @@ class CoreServices implements iRestServiceProvider $oResult->message = $sRes; } } + + /** + * @param int $iLimit + * @param int $iPage + * + * @return int Offset for a given page number + */ + protected static function getOffsetFromLimitAndPage($iLimit, $iPage) + { + return $iLimit * max(0, $iPage - 1); + } } diff --git a/js/jquery.tablesorter.pager.js b/js/jquery.tablesorter.pager.js index ad527775a..ec618fc3c 100644 --- a/js/jquery.tablesorter.pager.js +++ b/js/jquery.tablesorter.pager.js @@ -90,7 +90,7 @@ function sprintf(format, etc) { function checkAll(table, pager, value) { // Mark all the displayed items as check or unchecked depending on the value - $(table).find(':checkbox[name^=selectObj]').each(function (index, element) { + $(table).find(':checkbox[name^=selectObj]:not([disabled]').each(function (index, element) { var $currentCheckbox = $(this); $currentCheckbox.prop('checked', value); $currentLine = $currentCheckbox.closest("tr"); @@ -108,6 +108,7 @@ function sprintf(format, etc) { $(pager).find(':input[name=selectionMode]').val(table.config.selectionMode); // Reset the list of saved selection... resetStoredSelection(pager); + $(table).find(':checkbox[name^=selectObj]').trigger("change"); updateCounter(table, pager); return true; } @@ -117,7 +118,7 @@ function sprintf(format, etc) { $(':input[name^=storedSelection]', pager).remove(); } - function storeSelection(table, pager, id, value) + function storeSelection(table, pager, id, value, disabled=false) { var valueToStore = value; if (table.config.selectionMode == 'negative') @@ -132,7 +133,7 @@ function sprintf(format, etc) { } if ($('#'+id, pager).length ==0) { - $(pager).append($('')); + $(pager).append($('')); } } else @@ -259,33 +260,33 @@ function sprintf(format, etc) { if (c.selectionMode == 'negative') { - $(table).find(':checkbox[name^=selectObj]').prop('checked', true);; + $(table).find(':checkbox[name^=selectObj]:not([disabled])').prop('checked', true); } if (table.config.select_mode == 'multiple') { - $(table).find(':checkbox[name^=selectObj]').each(function() { + $(table).find(':checkbox[name^=selectObj]:not([disabled])').each(function() { var id = parseInt(this.value, 10); if ($('#'+id, table.config.container).length > 0) { if (c.selectionMode == 'positive') { - $(this).prop('checked', true);; + $(this).prop('checked', true); } else { - $(this).prop('checked', false);; + $(this).prop('checked', false); } } }); $(table).find(':checkbox[name^=selectObj]').change(function() { - storeSelection(table, table.config.container, this.value, this.checked); - }); + storeSelection(table, table.config.container, this.value, this.checked, this.disabled); + }).trigger("change"); } else if (table.config.select_mode == 'single') { - $(table).find('input[name^=selectObject]:radio').each(function() { + $(table).find('input[name^=selectObject]:radio:not([disabled])').each(function() { var id = parseInt(this.value, 10); if ($('#'+id, table.config.container).length > 0) {