Merge branch 'support/2.5'

# Conflicts:
#	js/jquery.tablesorter.pager.js
This commit is contained in:
Stephen Abello
2019-03-01 17:06:44 +01:00
3 changed files with 39 additions and 13 deletions

View File

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

View File

@@ -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);
}
}

View File

@@ -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($('<input type="hidden" id="'+id+'" name="storedSelection[]" value="'+id+'"></input>'));
$(pager).append($('<input type="hidden" id="'+id+'" name="storedSelection[]" value="'+id+'"'+ (disabled ? ' disabled ' : '') +'/>'));
}
}
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)
{