devextreme
Version:
HTML5 JavaScript Component Suite for Responsive Web Development
102 lines (96 loc) • 4.08 kB
JavaScript
/**
* DevExtreme (esm/ui/pivot_grid/data_source.utils.js)
* Version: 21.1.4
* Build date: Mon Jun 21 2021
*
* Copyright (c) 2012 - 2021 Developer Express Inc. ALL RIGHTS RESERVED
* Read about DevExtreme licensing here: https://js.devexpress.com/Licensing/
*/
import {
foreachTree,
findField,
getCompareFunction,
createPath,
foreachDataLevel
} from "./ui.pivot_grid.utils";
import {
isDefined
} from "../../core/utils/type";
import {
map
} from "../../core/utils/iterator";
export function sort(loadOptions, dataSource, getAscOrder) {
sortDimension(dataSource, loadOptions, "rows", getAscOrder);
sortDimension(dataSource, loadOptions, "columns", getAscOrder)
}
function sortDimension(dataSource, loadOptions, dimensionName, getAscOrder) {
var fields = loadOptions[dimensionName] || [];
var baseIndex = loadOptions.headerName === dimensionName ? loadOptions.path.length : 0;
var sortingMethodByLevel = [];
foreachDataLevel(dataSource[dimensionName], (function(item, index) {
var field = fields[index] || {};
var sortingMethod = sortingMethodByLevel[index] = sortingMethodByLevel[index] || getSortingMethod(field, dataSource, loadOptions, dimensionName, getAscOrder);
item.sort(sortingMethod)
}), baseIndex)
}
function getSortingMethod(field, dataSource, loadOptions, dimensionName, getAscOrder) {
var sortOrder = getAscOrder ? "asc" : field.sortOrder;
var sortBy = getMemberForSortBy(field.sortBy, getAscOrder);
var defaultCompare = field.sortingMethod ? function(a, b) {
return field.sortingMethod(a, b)
} : getCompareFunction((function(item) {
return item[sortBy]
}));
var summaryValueSelector = !getAscOrder && getFieldSummaryValueSelector(field, dataSource, loadOptions, dimensionName);
var summaryCompare = summaryValueSelector && getCompareFunction(summaryValueSelector);
return function(a, b) {
var result = summaryCompare && summaryCompare(a, b) || defaultCompare(a, b);
return "desc" === sortOrder ? -result : result
}
}
function getFieldSummaryValueSelector(field, dataSource, loadOptions, dimensionName) {
var values = dataSource.values;
var sortBySummaryFieldIndex = findField(loadOptions.values, field.sortBySummaryField);
var areRows = "rows" === dimensionName;
var sortByDimension = areRows ? dataSource.columns : dataSource.rows;
var grandTotalIndex = areRows ? dataSource.grandTotalRowIndex : dataSource.grandTotalColumnIndex;
var sortBySummaryPath = field.sortBySummaryPath || [];
var sliceIndex = sortBySummaryPath.length ? getSliceIndex(sortByDimension, sortBySummaryPath) : grandTotalIndex;
if (values && values.length && sortBySummaryFieldIndex >= 0 && isDefined(sliceIndex)) {
return function(field) {
var rowIndex = areRows ? field.index : sliceIndex;
var columnIndex = areRows ? sliceIndex : field.index;
var value = ((values[rowIndex] || [
[]
])[columnIndex] || [])[sortBySummaryFieldIndex];
return isDefined(value) ? value : null
}
}
}
function getMemberForSortBy(sortBy, getAscOrder) {
var member = "text";
if ("none" === sortBy) {
member = "index"
} else if (getAscOrder || "displayText" !== sortBy) {
member = "value"
}
return member
}
function getSliceIndex(items, path) {
var index = null;
var pathValue = (path || []).join(".");
if (pathValue.length) {
foreachTree(items, (function(items) {
var item = items[0];
var itemPath = createPath(items).join(".");
var textPath = map(items, (function(item) {
return item.text
})).reverse().join(".");
if (pathValue === itemPath || item.key && textPath === pathValue) {
index = items[0].index;
return false
}
}))
}
return index
}