@vlsergey/react-bootstrap-pagetable
Version:
Complex solution to work with pageable data, including sorting, filtering, actions, changing displayed columns, etc.
52 lines (51 loc) • 2.04 kB
JavaScript
Object.defineProperty(exports, "__esModule", { value: true });
var tslib_1 = require("tslib");
var FieldModel_1 = require("../FieldModel");
function localSort(itemModel, data, sort) {
if (!sort)
return data;
var result = tslib_1.__spreadArray([], tslib_1.__read(data));
var actualSortBy = tslib_1.__spreadArray([], tslib_1.__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;
}
exports.default = localSort;
function inplaceSort(itemModel, src, fieldModel, direction) {
if (direction === void 0) { direction = 'ASC'; }
var getter = fieldModel.getter || FieldModel_1.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);
}
;