devextreme
Version:
HTML5 JavaScript Component Suite for Responsive Web Development
601 lines (598 loc) • 25.6 kB
JavaScript
/**
* DevExtreme (cjs/__internal/grids/grid_core/module_utils.js)
* Version: 22.1.9
* Build date: Tue Apr 18 2023
*
* Copyright (c) 2012 - 2023 Developer Express Inc. ALL RIGHTS RESERVED
* Read about DevExtreme licensing here: https://js.devexpress.com/Licensing/
*/
"use strict";
var __assign = this && this.__assign || function() {
__assign = Object.assign || function(t) {
for (var s, i = 1, n = arguments.length; i < n; i++) {
s = arguments[i];
for (var p in s) {
if (Object.prototype.hasOwnProperty.call(s, p)) {
t[p] = s[p]
}
}
}
return t
};
return __assign.apply(this, arguments)
};
var __importDefault = this && this.__importDefault || function(mod) {
return mod && mod.__esModule ? mod : {
default: mod
}
};
Object.defineProperty(exports, "__esModule", {
value: true
});
var size_1 = require("../../../core/utils/size");
var renderer_1 = __importDefault(require("../../../core/renderer"));
var type_1 = require("../../../core/utils/type");
var deferred_1 = require("../../../core/utils/deferred");
var string_1 = require("../../../core/utils/string");
var iterator_1 = require("../../../core/utils/iterator");
var extend_1 = require("../../../core/utils/extend");
var position_1 = require("../../../core/utils/position");
var data_1 = require("../../../core/utils/data");
var common_1 = require("../../../core/utils/common");
var utils_1 = require("../../../data/utils");
var format_helper_1 = __importDefault(require("../../../format_helper"));
var window_1 = require("../../../core/utils/window");
var events_engine_1 = __importDefault(require("../../../events/core/events_engine"));
var data_source_1 = require("../../../data/data_source/data_source");
var utils_2 = require("../../../data/data_source/utils");
var variable_wrapper_1 = __importDefault(require("../../../core/utils/variable_wrapper"));
var load_panel_1 = __importDefault(require("../../../ui/load_panel"));
var filtering_1 = __importDefault(require("../../../ui/shared/filtering"));
var DATAGRID_SELECTION_DISABLED_CLASS = "dx-selection-disabled";
var DATAGRID_GROUP_OPENED_CLASS = "dx-datagrid-group-opened";
var DATAGRID_GROUP_CLOSED_CLASS = "dx-datagrid-group-closed";
var DATAGRID_EXPAND_CLASS = "dx-datagrid-expand";
var NO_DATA_CLASS = "nodata";
var SCROLLING_MODE_INFINITE = "infinite";
var SCROLLING_MODE_VIRTUAL = "virtual";
var LEGACY_SCROLLING_MODE = "scrolling.legacyMode";
var SCROLLING_MODE_OPTION = "scrolling.mode";
var ROW_RENDERING_MODE_OPTION = "scrolling.rowRenderingMode";
var 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()
}
};
var getIntervalSelector = function() {
var data = arguments[1];
var value = this.calculateCellValue(data);
if (!type_1.isDefined(value)) {
return null
}
if (isDateType(this.dataType)) {
var nameIntervalSelector = arguments[0];
return DATE_INTERVAL_SELECTORS[nameIntervalSelector](value)
}
if ("number" === this.dataType) {
var groupInterval = arguments[0];
return Math.floor(Number(value) / groupInterval) * groupInterval
}
};
var equalSelectors = function(selector1, selector2) {
if (type_1.isFunction(selector1) && type_1.isFunction(selector2)) {
if (selector1.originalCallback && selector2.originalCallback) {
return selector1.originalCallback === selector2.originalCallback && selector1.columnIndex === selector2.columnIndex
}
}
return selector1 === selector2
};
function isDateType(dataType) {
return "date" === dataType || "datetime" === dataType
}
var setEmptyText = function($container) {
$container.get(0).textContent = "\xa0"
};
var normalizeSortingInfo = function(sort) {
sort = sort || [];
var result = utils_1.normalizeSortingInfo(sort);
for (var 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
};
var formatValue = function(value, options) {
var valueText = format_helper_1.default.format(value, options.format) || value && value.toString() || "";
var 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
};
var getSummaryText = function(summaryItem, summaryTexts) {
var displayFormat = summaryItem.displayFormat || summaryItem.columnCaption && summaryTexts[summaryItem.summaryType + "OtherColumn"] || summaryTexts[summaryItem.summaryType];
return formatValue(summaryItem.value, {
format: summaryItem.valueFormat,
getDisplayFormat: function(valueText) {
return displayFormat ? string_1.format(displayFormat, valueText, summaryItem.columnCaption) : valueText
},
customizeText: summaryItem.customizeText
})
};
var getWidgetInstance = function($element) {
var editorData = $element.data && $element.data();
var dxComponents = editorData && editorData.dxComponents;
var widgetName = dxComponents && dxComponents[0];
return widgetName && editorData[widgetName]
};
var equalFilterParameters = function(filter1, filter2) {
if (Array.isArray(filter1) && Array.isArray(filter2)) {
if (filter1.length !== filter2.length) {
return false
}
for (var i = 0; i < filter1.length; i++) {
if (!equalFilterParameters(filter1[i], filter2[i])) {
return false
}
}
return true
}
if (type_1.isFunction(filter1) && filter1.columnIndex >= 0 && type_1.isFunction(filter2) && filter2.columnIndex >= 0) {
return filter1.columnIndex === filter2.columnIndex && data_1.toComparable(filter1.filterValue) === data_1.toComparable(filter2.filterValue)
}
return data_1.toComparable(filter1) == data_1.toComparable(filter2)
};
function normalizeGroupingLoadOptions(group) {
if (!Array.isArray(group)) {
group = [group]
}
return group.map((function(item, i) {
if (type_1.isString(item)) {
return {
selector: item,
isExpanded: i < group.length - 1
}
}
return item
}))
}
exports.default = {
renderNoDataText: function($element) {
$element = $element || this.element();
if (!$element) {
return
}
var noDataClass = this.addWidgetPrefix(NO_DATA_CLASS);
var noDataElement = $element.find("." + noDataClass).last();
var isVisible = this._dataController.isEmpty();
var isLoading = this._dataController.isLoading();
if (!noDataElement.length) {
noDataElement = renderer_1.default("<span>").addClass(noDataClass).appendTo($element)
}
if (isVisible && !isLoading) {
noDataElement.removeClass("dx-hidden").text(this._getNoDataText())
} else {
noDataElement.addClass("dx-hidden")
}
},
renderLoadPanel: function($element, $container, isLocalStore) {
var loadPanelOptions;
this._loadPanel && this._loadPanel.$element().remove();
loadPanelOptions = this.option("loadPanel");
if (loadPanelOptions && ("auto" === loadPanelOptions.enabled ? !isLocalStore : loadPanelOptions.enabled)) {
loadPanelOptions = extend_1.extend({
shading: false,
message: loadPanelOptions.text,
container: $container
}, loadPanelOptions);
this._loadPanel = this._createComponent(renderer_1.default("<div>").appendTo($container), load_panel_1.default, loadPanelOptions)
} else {
this._loadPanel = null
}
},
calculateLoadPanelPosition: function($element) {
var $window = renderer_1.default(window_1.getWindow());
if (size_1.getHeight($element) > size_1.getHeight($window)) {
return {
of: $window,
boundary: $element,
collision: "fit"
}
}
return {
of: $element
}
},
getIndexByKey: function(key, items, keyName) {
var index = -1;
if (void 0 !== key && Array.isArray(items)) {
keyName = arguments.length <= 2 ? "key" : keyName;
for (var i = 0; i < items.length; i++) {
var item = type_1.isDefined(keyName) ? items[i][keyName] : items[i];
if (common_1.equalByValue(key, item)) {
index = i;
break
}
}
}
return index
},
combineFilters: function(filters, operation) {
var _a;
var resultFilter = [];
operation = operation || "and";
for (var i = 0; i < filters.length; i++) {
if (!filters[i]) {
continue
}
if (1 === (null === (_a = filters[i]) || void 0 === _a ? void 0 : _a.length) && "!" === filters[i][0]) {
if ("and" === operation) {
return ["!"]
}
if ("or" === operation) {
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 changesWithChangeNamesCount = 0;
for (var i = 0; i < changeNames.length; i++) {
if (changes[changeNames[i]]) {
changesWithChangeNamesCount++
}
}
return changes.length && changes.length === changesWithChangeNamesCount
},
equalFilterParameters: equalFilterParameters,
proxyMethod: function(instance, methodName, defaultResult) {
if (!instance[methodName]) {
instance[methodName] = function() {
var dataSource = this._dataSource;
return dataSource ? dataSource[methodName].apply(dataSource, arguments) : defaultResult
}
}
},
formatValue: formatValue,
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]
}
if (column.calculateDisplayValue && data && "group" !== rowType) {
return column.calculateDisplayValue(data)
}
if (column.lookup && !("group" === rowType && (column.calculateGroupValue || column.calculateDisplayValue))) {
return column.lookup.calculateCellValue(value)
}
return value
},
getGroupRowSummaryText: function(summaryItems, summaryTexts) {
var result = "(";
for (var i = 0; i < summaryItems.length; i++) {
var summaryItem = summaryItems[i];
result += (i > 0 ? ", " : "") + getSummaryText(summaryItem, summaryTexts)
}
return result + ")"
},
getSummaryText: getSummaryText,
normalizeSortingInfo: normalizeSortingInfo,
getFormatByDataType: function(dataType) {
switch (dataType) {
case "date":
return "shortDate";
case "datetime":
return "shortDateShortTime"
}
},
getHeaderFilterGroupParameters: function(column, remoteGrouping) {
var result = [];
var dataField = column.dataField || column.name;
var groupInterval = filtering_1.default.getGroupInterval(column);
if (groupInterval) {
iterator_1.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(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) {
sortParameters1 = normalizeSortingInfo(sortParameters1);
sortParameters2 = normalizeSortingInfo(sortParameters2);
if (Array.isArray(sortParameters1) && Array.isArray(sortParameters2)) {
if (sortParameters1.length !== sortParameters2.length) {
return false
}
for (var 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
}
return (!sortParameters1 || !sortParameters1.length) === (!sortParameters2 || !sortParameters2.length)
},
getPointsByColumns: function(items, pointCreated, isVertical, startColumnIndex) {
var cellsLength = items.length;
var notCreatePoint = false;
var item;
var offset;
var columnIndex = startColumnIndex || 0;
var result = [];
var rtlEnabled;
for (var i = 0; i <= cellsLength; i++) {
if (i < cellsLength) {
item = items.eq(i);
offset = item.offset();
rtlEnabled = "rtl" === item.css("direction")
}
var point = {
index: columnIndex,
x: offset ? offset.left + (!isVertical && rtlEnabled ^ i === cellsLength ? position_1.getBoundingRect(item[0]).width : 0) : 0,
y: offset ? offset.top + (isVertical && i === cellsLength ? position_1.getBoundingRect(item[0]).height : 0) : 0,
columnIndex: columnIndex
};
if (!isVertical && i > 0) {
var 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
},
getExpandCellTemplate: function() {
return {
allowRenderToDetachedContainer: true,
render: function(container, options) {
var $container = renderer_1.default(container);
if (type_1.isDefined(options.value) && !(options.data && options.data.isContinuation) && !options.row.isNewRow) {
var rowsView = options.component.getView("rowsView");
$container.addClass(DATAGRID_EXPAND_CLASS).addClass(DATAGRID_SELECTION_DISABLED_CLASS);
renderer_1.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) {}
},
focusAndSelectElement: function(component, $element) {
var isFocused = $element.is(":focus");
events_engine_1.default.trigger($element, "focus");
var isSelectTextOnEditingStart = component.option("editing.selectTextOnEditStart");
var element = $element.get(0);
if (!isFocused && isSelectTextOnEditingStart && $element.is(".dx-texteditor-input") && !$element.is("[readonly]")) {
var editor = getWidgetInstance($element.closest(".dx-texteditor"));
deferred_1.when(editor && editor._loadItemDeferred).done((function() {
element.select()
}))
}
},
getWidgetInstance: getWidgetInstance,
getLastResizableColumnIndex: function(columns, resultWidths) {
var hasResizableColumns = columns.some((function(column) {
return column && !column.command && !column.fixed && false !== column.allowResizing
}));
var lastColumnIndex;
for (lastColumnIndex = columns.length - 1; columns[lastColumnIndex]; lastColumnIndex--) {
var column = columns[lastColumnIndex];
var width = resultWidths && resultWidths[lastColumnIndex];
var allowResizing = !hasResizableColumns || false !== column.allowResizing;
if (!column.command && !column.fixed && "adaptiveHidden" !== width && allowResizing) {
break
}
}
return lastColumnIndex
},
isElementInCurrentGrid: function(controller, $element) {
if ($element && $element.length) {
var $grid = $element.closest("." + controller.getWidgetContainerClass()).parent();
return $grid.is(controller.component.$element())
}
return false
},
isVirtualRowRendering: function(that) {
var rowRenderingMode = that.option(ROW_RENDERING_MODE_OPTION);
var isVirtualMode = that.option(SCROLLING_MODE_OPTION) === SCROLLING_MODE_VIRTUAL;
var isAppendMode = that.option(SCROLLING_MODE_OPTION) === SCROLLING_MODE_INFINITE;
if (false === that.option(LEGACY_SCROLLING_MODE) && (isVirtualMode || isAppendMode)) {
return true
}
return rowRenderingMode === SCROLLING_MODE_VIRTUAL
},
getPixelRatio: function(window) {
return window.devicePixelRatio || 1
},
_setPixelRatioFn: function(value) {
this.getPixelRatio = value
},
getContentHeightLimit: function(browser) {
if (browser.mozilla) {
return 8e6
}
return 15e6 / this.getPixelRatio(window_1.getWindow())
},
normalizeLookupDataSource: function(lookup) {
var lookupDataSourceOptions;
if (lookup.items) {
lookupDataSourceOptions = lookup.items
} else {
lookupDataSourceOptions = lookup.dataSource;
if (type_1.isFunction(lookupDataSourceOptions) && !variable_wrapper_1.default.isWrapped(lookupDataSourceOptions)) {
lookupDataSourceOptions = lookupDataSourceOptions({})
}
}
return utils_2.normalizeDataSourceOptions(lookupDataSourceOptions)
},
getWrappedLookupDataSource: function(column, dataSource, filter) {
var _this = this;
if (!dataSource) {
return []
}
var lookupDataSourceOptions = this.normalizeLookupDataSource(column.lookup);
if (column.calculateCellValue !== column.defaultCalculateCellValue) {
return lookupDataSourceOptions
}
var hasGroupPaging = dataSource.remoteOperations().groupPaging;
var hasLookupOptimization = column.displayField && type_1.isString(column.displayField);
var cachedUniqueRelevantItems;
var previousTake;
var previousSkip;
var sliceItems = function(items, loadOptions) {
var _a;
var start = null !== (_a = loadOptions.skip) && void 0 !== _a ? _a : 0;
var end = loadOptions.take ? start + loadOptions.take : items.length;
return items.slice(start, end)
};
var lookupDataSource = __assign(__assign({}, lookupDataSourceOptions), {
__dataGridSourceFilter: filter,
load: function(loadOptions) {
var d = new deferred_1.Deferred;
(function(loadOptions) {
var group = normalizeGroupingLoadOptions(hasLookupOptimization ? [column.dataField, column.displayField] : column.dataField);
var d = new deferred_1.Deferred;
var canUseCache = cachedUniqueRelevantItems && (!hasGroupPaging || loadOptions.skip === previousSkip && loadOptions.take === previousTake);
if (canUseCache) {
d.resolve(sliceItems(cachedUniqueRelevantItems, loadOptions))
} else {
previousSkip = loadOptions.skip;
previousTake = loadOptions.take;
dataSource.load({
filter: filter,
group: group,
take: hasGroupPaging ? loadOptions.take : void 0,
skip: hasGroupPaging ? loadOptions.skip : void 0
}).done((function(items) {
cachedUniqueRelevantItems = items;
d.resolve(hasGroupPaging ? items : sliceItems(items, loadOptions))
})).fail(d.fail)
}
return d
})(loadOptions).done((function(items) {
if (0 === items.length) {
d.resolve([]);
return
}
var filter = _this.combineFilters(items.flatMap((function(data) {
return data.key
})).map((function(key) {
return [column.lookup.valueExpr, key]
})), "or");
var newDataSource = new data_source_1.DataSource(__assign(__assign(__assign({}, lookupDataSourceOptions), loadOptions), {
filter: _this.combineFilters([filter, loadOptions.filter], "and"),
paginate: false
}));
newDataSource.load().done(d.resolve).fail(d.fail)
})).fail(d.fail);
return d
},
key: column.lookup.valueExpr,
byKey: function(key) {
var d = deferred_1.Deferred();
this.load({
filter: [column.lookup.valueExpr, "=", key]
}).done((function(arr) {
d.resolve(arr[0])
}));
return d.promise()
}
});
return lookupDataSource
}
};