@vlsergey/react-bootstrap-pagetable
Version:
Complex solution to work with pageable data, including sorting, filtering, actions, changing displayed columns, etc.
49 lines (48 loc) • 1.91 kB
JavaScript
import { __read, __spreadArray } from "tslib";
import { defaultGetter } from '../FieldModel';
export default function localSort(itemModel, data, sort) {
if (!sort)
return data;
var result = __spreadArray([], __read(data));
var actualSortBy = __spreadArray([], __read(sort));
actualSortBy.reverse();
actualSortBy.forEach(function (_a) {
var field = _a.field, direction = _a.direction;
var fieldModel = itemModel.fields.find(function (_a) {
var key = _a.key;
return key === field;
});
if (!fieldModel)
throw Error("Missing field " + field + " model in item model");
inplaceSort(itemModel, result, fieldModel, direction);
});
return result;
}
function inplaceSort(itemModel, src, fieldModel, direction) {
if (direction === void 0) { direction = 'ASC'; }
var getter = fieldModel.getter || defaultGetter;
var ascComparator = function (a, b) {
var vA = getter(a, fieldModel, itemModel);
var vB = getter(b, fieldModel, itemModel);
if (vA === undefined && vB === undefined)
return 0;
if (vA === undefined && vB !== undefined)
return +1; // A to the end
if (vA !== undefined && vB === undefined)
return -1; // B to the end
if (vA === null && vB === null)
return 0;
if ((typeof vA === 'number' || vA === null) && (typeof vB === 'number' || vB === null)) {
var nA = vA || 0;
var nB = vB || 0;
return nA === nB ? 0 : nA < nB ? -1 : +1;
}
var sA = String(vA);
var sB = String(vB);
return sA === sB ? 0 : sA < sB ? -1 : +1;
};
var comparator = direction === 'ASC'
? ascComparator
: function (a, b) { return -ascComparator(a, b); };
src.sort(comparator);
}