devextreme
Version:
HTML5 JavaScript Component Suite for Responsive Web Development
431 lines (429 loc) • 19.9 kB
JavaScript
/**
* DevExtreme (ui/grid_core/ui.grid_core.utils.js)
* Version: 18.2.18
* Build date: Tue Oct 18 2022
*
* Copyright (c) 2012 - 2022 Developer Express Inc. ALL RIGHTS RESERVED
* Read about DevExtreme licensing here: https://js.devexpress.com/Licensing/
*/
;
var _renderer = require("../../core/renderer");
var _renderer2 = _interopRequireDefault(_renderer);
var _common = require("../../core/utils/common");
var _type = require("../../core/utils/type");
var _filtering = require("../shared/filtering");
var _string = require("../../core/utils/string");
var _iterator = require("../../core/utils/iterator");
var _extend = require("../../core/utils/extend");
var _data = require("../../core/utils/data");
var _load_panel = require("../load_panel");
var _load_panel2 = _interopRequireDefault(_load_panel);
var _utils = require("../../data/utils");
var _format_helper = require("../../format_helper");
var _format_helper2 = _interopRequireDefault(_format_helper);
var _object = require("../../core/utils/object");
var _window = require("../../core/utils/window");
function _interopRequireDefault(obj) {
return obj && obj.__esModule ? obj : {
"default": obj
}
}
var DATAGRID_SELECTION_DISABLED_CLASS = "dx-selection-disabled",
DATAGRID_GROUP_OPENED_CLASS = "dx-datagrid-group-opened",
DATAGRID_GROUP_CLOSED_CLASS = "dx-datagrid-group-closed",
DATAGRID_EXPAND_CLASS = "dx-datagrid-expand",
NO_DATA_CLASS = "nodata",
DATE_INTERVAL_SELECTORS = {
year: function(value) {
return value && value.getFullYear()
},
month: function(value) {
return value && value.getMonth() + 1
},
day: function(value) {
return value && value.getDate()
},
quarter: function(value) {
return value && Math.floor(value.getMonth() / 3) + 1
},
hour: function(value) {
return value && value.getHours()
},
minute: function(value) {
return value && value.getMinutes()
},
second: function(value) {
return value && value.getSeconds()
}
};
module.exports = function() {
var getIntervalSelector = function() {
var groupInterval, nameIntervalSelector, data = arguments[1],
value = this.calculateCellValue(data);
if (!(0, _type.isDefined)(value)) {
return null
} else {
if (isDateType(this.dataType)) {
nameIntervalSelector = arguments[0];
return DATE_INTERVAL_SELECTORS[nameIntervalSelector](value)
} else {
if ("number" === this.dataType) {
groupInterval = arguments[0];
return Math.floor(Number(value) / groupInterval) * groupInterval
}
}
}
};
var equalSelectors = function(selector1, selector2) {
if ((0, _type.isFunction)(selector1) && (0, _type.isFunction)(selector2)) {
if (selector1.originalCallback && selector2.originalCallback) {
return selector1.originalCallback === selector2.originalCallback
}
}
return selector1 === selector2
};
var isDateType = function(dataType) {
return "date" === dataType || "datetime" === dataType
};
var setEmptyText = function($container) {
$container.get(0).textContent = "\xa0"
};
return {
renderNoDataText: function($element) {
var that = this;
$element = $element || this.element();
if (!$element) {
return
}
var noDataClass = that.addWidgetPrefix(NO_DATA_CLASS),
noDataElement = $element.find("." + noDataClass).last(),
isVisible = this._dataController.isEmpty(),
isLoading = this._dataController.isLoading();
if (!noDataElement.length) {
noDataElement = (0, _renderer2.default)("<span>").addClass(noDataClass).appendTo($element)
}
if (isVisible && !isLoading) {
noDataElement.removeClass("dx-hidden").text(that._getNoDataText())
} else {
noDataElement.addClass("dx-hidden")
}
},
renderLoadPanel: function($element, $container, isLocalStore) {
var loadPanelOptions, that = this;
that._loadPanel && that._loadPanel.$element().remove();
loadPanelOptions = that.option("loadPanel");
if (loadPanelOptions && ("auto" === loadPanelOptions.enabled ? !isLocalStore : loadPanelOptions.enabled)) {
loadPanelOptions = (0, _extend.extend)({
shading: false,
message: loadPanelOptions.text,
position: function() {
var $window = (0, _renderer2.default)((0, _window.getWindow)());
if ($element.height() > $window.height()) {
return {
of: $window,
boundary: $element,
collision: "fit"
}
}
return {
of: $element
}
},
container: $container
}, loadPanelOptions);
that._loadPanel = that._createComponent((0, _renderer2.default)("<div>").appendTo($container), _load_panel2.default, loadPanelOptions)
} else {
that._loadPanel = null
}
},
getIndexByKey: function(key, items, keyName) {
var item, index = -1;
if (void 0 !== key && Array.isArray(items)) {
keyName = arguments.length <= 2 ? "key" : keyName;
for (var i = 0; i < items.length; i++) {
item = (0, _type.isDefined)(keyName) ? items[i][keyName] : items[i];
if ((0, _common.equalByValue)(key, item)) {
index = i;
break
}
}
}
return index
},
combineFilters: function(filters, operation) {
var i, resultFilter = [];
operation = operation || "and";
for (i = 0; i < filters.length; i++) {
if (!filters[i]) {
continue
}
if (resultFilter.length) {
resultFilter.push(operation)
}
resultFilter.push(filters[i])
}
if (1 === resultFilter.length) {
resultFilter = resultFilter[0]
}
if (resultFilter.length) {
return resultFilter
}
},
checkChanges: function(changes, changeNames) {
var i, changesWithChangeNamesCount = 0;
for (i = 0; i < changeNames.length; i++) {
if (changes[changeNames[i]]) {
changesWithChangeNamesCount++
}
}
return changes.length && changes.length === changesWithChangeNamesCount
},
equalFilterParameters: function(filter1, filter2) {
var i;
if (Array.isArray(filter1) && Array.isArray(filter2)) {
if (filter1.length !== filter2.length) {
return false
} else {
for (i = 0; i < filter1.length; i++) {
if (!module.exports.equalFilterParameters(filter1[i], filter2[i])) {
return false
}
}
}
return true
} else {
if ((0, _type.isFunction)(filter1) && filter1.columnIndex >= 0 && (0, _type.isFunction)(filter2) && filter2.columnIndex >= 0) {
return filter1.columnIndex === filter2.columnIndex && (0, _data.toComparable)(filter1.filterValue) === (0, _data.toComparable)(filter2.filterValue)
} else {
return (0, _data.toComparable)(filter1) == (0, _data.toComparable)(filter2)
}
}
},
proxyMethod: function(instance, methodName, defaultResult) {
if (!instance[methodName]) {
instance[methodName] = function() {
var dataSource = this._dataSource;
return dataSource ? dataSource[methodName].apply(dataSource, arguments) : defaultResult
}
}
},
formatValue: function(value, options) {
var valueText = _format_helper2.default.format(value, options.format) || value && value.toString() || "",
formatObject = {
value: value,
valueText: options.getDisplayFormat ? options.getDisplayFormat(valueText) : valueText,
target: options.target || "row",
groupInterval: options.groupInterval
};
return options.customizeText ? options.customizeText.call(options, formatObject) : formatObject.valueText
},
getFormatOptionsByColumn: function(column, target) {
return {
format: column.format,
getDisplayFormat: column.getDisplayFormat,
customizeText: column.customizeText,
target: target,
trueText: column.trueText,
falseText: column.falseText
}
},
getDisplayValue: function(column, value, data, rowType) {
if (column.displayValueMap && void 0 !== column.displayValueMap[value]) {
return column.displayValueMap[value]
} else {
if (column.calculateDisplayValue && data && "group" !== rowType) {
return column.calculateDisplayValue(data)
} else {
if (column.lookup && !("group" === rowType && (column.calculateGroupValue || column.calculateDisplayValue))) {
return column.lookup.calculateCellValue(value)
}
}
}
return value
},
getGroupRowSummaryText: function(summaryItems, summaryTexts) {
var i, summaryItem, result = "(";
for (i = 0; i < summaryItems.length; i++) {
summaryItem = summaryItems[i];
result += (i > 0 ? ", " : "") + module.exports.getSummaryText(summaryItem, summaryTexts)
}
return result += ")"
},
getSummaryText: function(summaryItem, summaryTexts) {
var displayFormat = summaryItem.displayFormat || summaryItem.columnCaption && summaryTexts[summaryItem.summaryType + "OtherColumn"] || summaryTexts[summaryItem.summaryType];
return this.formatValue(summaryItem.value, {
format: summaryItem.valueFormat,
getDisplayFormat: function(valueText) {
return displayFormat ? (0, _string.format)(displayFormat, valueText, summaryItem.columnCaption) : valueText
},
customizeText: summaryItem.customizeText
})
},
normalizeSortingInfo: function(sort) {
sort = sort || [];
var result, i;
result = (0, _utils.normalizeSortingInfo)(sort);
for (i = 0; i < sort.length; i++) {
if (sort && sort[i] && void 0 !== sort[i].isExpanded) {
result[i].isExpanded = sort[i].isExpanded
}
if (sort && sort[i] && void 0 !== sort[i].groupInterval) {
result[i].groupInterval = sort[i].groupInterval
}
}
return result
},
getFormatByDataType: function(dataType) {
switch (dataType) {
case "date":
return "shortDate";
case "datetime":
return "shortDateShortTime"
}
},
getHeaderFilterGroupParameters: function(column, remoteGrouping) {
var result = [],
dataField = column.dataField || column.name,
groupInterval = (0, _filtering.getGroupInterval)(column);
if (groupInterval) {
(0, _iterator.each)(groupInterval, function(index, interval) {
result.push(remoteGrouping ? {
selector: dataField,
groupInterval: interval,
isExpanded: index < groupInterval.length - 1
} : getIntervalSelector.bind(column, interval))
});
return result
}
if (remoteGrouping) {
result = [{
selector: dataField,
isExpanded: false
}]
} else {
result = function result(data) {
var result = column.calculateCellValue(data);
if (void 0 === result || "" === result) {
result = null
}
return result
};
if (column.sortingMethod) {
result = [{
selector: result,
compare: column.sortingMethod.bind(column)
}]
}
}
return result
},
equalSortParameters: function(sortParameters1, sortParameters2, ignoreIsExpanded) {
var i;
sortParameters1 = module.exports.normalizeSortingInfo(sortParameters1);
sortParameters2 = module.exports.normalizeSortingInfo(sortParameters2);
if (Array.isArray(sortParameters1) && Array.isArray(sortParameters2)) {
if (sortParameters1.length !== sortParameters2.length) {
return false
} else {
for (i = 0; i < sortParameters1.length; i++) {
if (!equalSelectors(sortParameters1[i].selector, sortParameters2[i].selector) || sortParameters1[i].desc !== sortParameters2[i].desc || sortParameters1[i].groupInterval !== sortParameters2[i].groupInterval || !ignoreIsExpanded && Boolean(sortParameters1[i].isExpanded) !== Boolean(sortParameters2[i].isExpanded)) {
return false
}
}
}
return true
} else {
return (!sortParameters1 || !sortParameters1.length) === (!sortParameters2 || !sortParameters2.length)
}
},
getPointsByColumns: function(items, pointCreated, isVertical, startColumnIndex) {
var point, i, item, offset, prevItemOffset, rtlEnabled, cellsLength = items.length,
notCreatePoint = false,
columnIndex = startColumnIndex || 0,
result = [];
for (i = 0; i <= cellsLength; i++) {
if (i < cellsLength) {
item = items.eq(i);
offset = item.offset();
rtlEnabled = "rtl" === item.css("direction")
}
point = {
index: columnIndex,
x: offset ? offset.left + (!isVertical && rtlEnabled ^ i === cellsLength ? item[0].getBoundingClientRect().width : 0) : 0,
y: offset ? offset.top + (isVertical && i === cellsLength ? item[0].getBoundingClientRect().height : 0) : 0,
columnIndex: columnIndex
};
if (!isVertical && i > 0) {
prevItemOffset = items.eq(i - 1).offset();
if (prevItemOffset.top < point.y) {
point.y = prevItemOffset.top
}
}
if (pointCreated) {
notCreatePoint = pointCreated(point)
}
if (!notCreatePoint) {
result.push(point)
}
columnIndex++
}
return result
},
createObjectWithChanges: function(target, changes) {
var result = target ? Object.create(Object.getPrototypeOf(target)) : {},
targetWithoutPrototype = (0, _extend.extendFromObject)({}, target);
(0, _object.deepExtendArraySafe)(result, targetWithoutPrototype, true, true);
return (0, _object.deepExtendArraySafe)(result, changes, true, true)
},
getExpandCellTemplate: function() {
return {
allowRenderToDetachedContainer: true,
render: function(container, options) {
var rowsView, $container = (0, _renderer2.default)(container);
if ((0, _type.isDefined)(options.value) && !(options.data && options.data.isContinuation) && !options.row.inserted) {
rowsView = options.component.getView("rowsView");
$container.addClass(DATAGRID_EXPAND_CLASS).addClass(DATAGRID_SELECTION_DISABLED_CLASS);
(0, _renderer2.default)("<div>").addClass(options.value ? DATAGRID_GROUP_OPENED_CLASS : DATAGRID_GROUP_CLOSED_CLASS).appendTo($container);
rowsView.setAria("label", options.value ? rowsView.localize("dxDataGrid-ariaCollapse") : rowsView.localize("dxDataGrid-ariaExpand"), $container)
} else {
setEmptyText($container)
}
}
}
},
setEmptyText: setEmptyText,
isDateType: isDateType,
getSelectionRange: function(focusedElement) {
try {
if (focusedElement) {
return {
selectionStart: focusedElement.selectionStart,
selectionEnd: focusedElement.selectionEnd
}
}
} catch (e) {}
return {}
},
setSelectionRange: function(focusedElement, selectionRange) {
try {
if (focusedElement && focusedElement.setSelectionRange) {
focusedElement.setSelectionRange(selectionRange.selectionStart, selectionRange.selectionEnd)
}
} catch (e) {}
},
getLastResizableColumnIndex: function(columns, resultWidths) {
var hasResizableColumns = columns.some(function(column) {
return column && !column.command && !column.fixed && false !== column.allowResizing
});
for (var lastColumnIndex = columns.length - 1; columns[lastColumnIndex]; lastColumnIndex--) {
var column = columns[lastColumnIndex],
width = resultWidths && resultWidths[lastColumnIndex],
allowResizing = !hasResizableColumns || false !== column.allowResizing;
if (!column.command && !column.fixed && "adaptiveHidden" !== width && allowResizing) {
break
}
}
return lastColumnIndex
}
}
}();