UNPKG

devextreme

Version:

HTML5 JavaScript Component Suite for Responsive Web Development

952 lines (948 loc) • 57.9 kB
/** * DevExtreme (esm/ui/grid_core/ui.grid_core.data_controller.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 $ from "../../core/renderer"; import modules from "./ui.grid_core.modules"; import gridCoreUtils from "./ui.grid_core.utils"; import ArrayStore from "../../data/array_store"; import CustomStore from "../../data/custom_store"; import errors from "../widget/ui.errors"; import { noop, deferRender, equalByValue } from "../../core/utils/common"; import { each } from "../../core/utils/iterator"; import { isDefined } from "../../core/utils/type"; import { extend } from "../../core/utils/extend"; import DataHelperMixin from "../../data_helper"; import { when, Deferred } from "../../core/utils/deferred"; import { findChanges } from "../../core/utils/array_compare"; export var dataControllerModule = { defaultOptions: function() { return { loadingTimeout: 0, dataSource: null, cacheEnabled: true, repaintChangesOnly: false, highlightChanges: false, onDataErrorOccurred: null, remoteOperations: "auto", paging: { enabled: true, pageSize: void 0, pageIndex: void 0 } } }, controllers: { data: modules.Controller.inherit({}).include(DataHelperMixin).inherit(function() { var changePaging = function(that, optionName, value) { var dataSource = that._dataSource; if (dataSource) { if (void 0 !== value) { if (dataSource[optionName]() !== value) { if ("pageSize" === optionName) { dataSource.pageIndex(0) } dataSource[optionName](value); that._skipProcessingPagingChange = true; that.option("paging." + optionName, value); that._skipProcessingPagingChange = false; return dataSource["pageIndex" === optionName ? "load" : "reload"]().done(that.pageChanged.fire.bind(that.pageChanged)) } return Deferred().resolve().promise() } return dataSource[optionName]() } return 0 }; var members = { init: function() { var that = this; that._items = []; that._columnsController = that.getController("columns"); that._currentOperationTypes = null; that._dataChangedHandler = e => { that._currentOperationTypes = this._dataSource.operationTypes(); that._handleDataChanged(e); that._currentOperationTypes = null }; that._columnsChangedHandler = that._handleColumnsChanged.bind(that); that._loadingChangedHandler = that._handleLoadingChanged.bind(that); that._loadErrorHandler = that._handleLoadError.bind(that); that._customizeStoreLoadOptionsHandler = that._handleCustomizeStoreLoadOptions.bind(that); that._changingHandler = that._handleChanging.bind(that); that._columnsController.columnsChanged.add(that._columnsChangedHandler); that._isLoading = false; that._isCustomLoading = false; that._repaintChangesOnly = void 0; that._changes = []; that.createAction("onDataErrorOccurred"); that.dataErrorOccurred.add((function(error) { return that.executeAction("onDataErrorOccurred", { error: error }) })); that._refreshDataSource() }, callbackNames: function() { return ["changed", "loadingChanged", "dataErrorOccurred", "pageChanged", "dataSourceChanged"] }, callbackFlags: function(name) { if ("dataErrorOccurred" === name) { return { stopOnFalse: true } } }, publicMethods: function() { return ["beginCustomLoading", "endCustomLoading", "refresh", "filter", "clearFilter", "getCombinedFilter", "keyOf", "byKey", "getDataByKeys", "pageIndex", "pageSize", "pageCount", "totalCount", "_disposeDataSource", "getKeyByRowIndex", "getRowIndexByKey", "getDataSource", "getVisibleRows", "repaintRows"] }, reset: function() { this._columnsController.reset(); this._items = []; this._refreshDataSource() }, optionChanged: function(args) { var dataSource; function handled() { args.handled = true } if ("dataSource" === args.name && args.name === args.fullName && (args.value === args.previousValue || this.option("columns") && Array.isArray(args.value) && Array.isArray(args.previousValue))) { if (args.value !== args.previousValue) { var store = this.store(); if (store) { store._array = args.value } } handled(); this.refresh(this.option("repaintChangesOnly")); return } switch (args.name) { case "cacheEnabled": case "repaintChangesOnly": case "highlightChanges": case "loadingTimeout": handled(); break; case "remoteOperations": case "keyExpr": case "dataSource": case "scrolling": handled(); this.reset(); break; case "paging": dataSource = this.dataSource(); if (dataSource && this._setPagingOptions(dataSource)) { dataSource.load().done(this.pageChanged.fire.bind(this.pageChanged)) } handled(); break; case "rtlEnabled": this.reset(); break; case "columns": dataSource = this.dataSource(); if (dataSource && dataSource.isLoading() && args.name === args.fullName) { this._useSortingGroupingFromColumns = true; dataSource.load() } break; default: this.callBase(args) } }, isReady: function() { return !this._isLoading }, getDataSource: function() { return this._dataSource && this._dataSource._dataSource }, getCombinedFilter: function(returnDataField) { return this.combinedFilter(void 0, returnDataField) }, combinedFilter: function(filter, returnDataField) { var dataSource = this._dataSource; var columnsController = this._columnsController; if (dataSource) { if (void 0 === filter) { filter = dataSource.filter() } var additionalFilter = this._calculateAdditionalFilter(); if (additionalFilter) { if (columnsController.isDataSourceApplied() || columnsController.isAllDataTypesDefined()) { filter = gridCoreUtils.combineFilters([additionalFilter, filter]) } } filter = columnsController.updateFilter(filter, returnDataField || dataSource.remoteOperations().filtering) } return filter }, waitReady: function() { if (this._updateLockCount) { this._readyDeferred = new Deferred; return this._readyDeferred } return when() }, _endUpdateCore: function() { var changes = this._changes; if (changes.length) { this._changes = []; var repaintChangesOnly = changes.every(change => change.repaintChangesOnly); this.updateItems(1 === changes.length ? changes[0] : { repaintChangesOnly: repaintChangesOnly }) } if (this._readyDeferred) { this._readyDeferred.resolve(); this._readyDeferred = null } }, _handleCustomizeStoreLoadOptions: function(e) { var columnsController = this._columnsController; var dataSource = this._dataSource; var storeLoadOptions = e.storeLoadOptions; if (e.isCustomLoading && !storeLoadOptions.isLoadingAll) { return } storeLoadOptions.filter = this.combinedFilter(storeLoadOptions.filter); if (!columnsController.isDataSourceApplied()) { columnsController.updateColumnDataTypes(dataSource) } this._columnsUpdating = true; columnsController.updateSortingGrouping(dataSource, !this._useSortingGroupingFromColumns); this._columnsUpdating = false; storeLoadOptions.sort = columnsController.getSortDataSourceParameters(); storeLoadOptions.group = columnsController.getGroupDataSourceParameters(); dataSource.sort(storeLoadOptions.sort); dataSource.group(storeLoadOptions.group); storeLoadOptions.sort = columnsController.getSortDataSourceParameters(!dataSource.remoteOperations().sorting); e.group = columnsController.getGroupDataSourceParameters(!dataSource.remoteOperations().grouping) }, _handleColumnsChanged: function(e) { var that = this; var changeTypes = e.changeTypes; var optionNames = e.optionNames; var filterValue; var filterValues; var filterApplied; if (changeTypes.sorting || changeTypes.grouping) { if (that._dataSource && !that._columnsUpdating) { that._dataSource.group(that._columnsController.getGroupDataSourceParameters()); that._dataSource.sort(that._columnsController.getSortDataSourceParameters()); that.reload() } } else if (changeTypes.columns) { if (optionNames.filterValues || optionNames.filterValue || optionNames.selectedFilterOperation) { filterValue = that._columnsController.columnOption(e.columnIndex, "filterValue"); filterValues = that._columnsController.columnOption(e.columnIndex, "filterValues"); if (Array.isArray(filterValues) || void 0 === e.columnIndex || isDefined(filterValue) || !optionNames.selectedFilterOperation || optionNames.filterValue) { that._applyFilter(); filterApplied = true } } if (!that._needApplyFilter && !gridCoreUtils.checkChanges(optionNames, ["width", "visibleWidth", "filterValue", "bufferedFilterValue", "selectedFilterOperation", "filterValues", "filterType"])) { that._columnsController.columnsChanged.add((function updateItemsHandler() { that._columnsController.columnsChanged.remove(updateItemsHandler); that.updateItems() })) } if (isDefined(optionNames.visible)) { var column = that._columnsController.columnOption(e.columnIndex); if (column && (isDefined(column.filterValue) || isDefined(column.filterValues))) { that._applyFilter(); filterApplied = true } } } if (!filterApplied && changeTypes.filtering) { that.reload() } }, _handleDataChanged: function(e) { var that = this; var dataSource = that._dataSource; var columnsController = that._columnsController; var isAsyncDataSourceApplying = false; this._useSortingGroupingFromColumns = false; if (dataSource && !that._isDataSourceApplying) { that._isDataSourceApplying = true; when(that._columnsController.applyDataSource(dataSource)).done((function() { if (that._isLoading) { that._handleLoadingChanged(false) } if (isAsyncDataSourceApplying && e && e.isDelayed) { e.isDelayed = false } that._isDataSourceApplying = false; var needApplyFilter = that._needApplyFilter; that._needApplyFilter = false; if (needApplyFilter && !that._isAllDataTypesDefined && (additionalFilter = that._calculateAdditionalFilter(), additionalFilter && additionalFilter.length)) { errors.log("W1005", that.component.NAME); that._applyFilter() } else { that.updateItems(e, true) } var additionalFilter })).fail((function() { that._isDataSourceApplying = false })); if (that._isDataSourceApplying) { isAsyncDataSourceApplying = true; that._handleLoadingChanged(true) } that._needApplyFilter = !that._columnsController.isDataSourceApplied(); that._isAllDataTypesDefined = columnsController.isAllDataTypesDefined() } }, _handleLoadingChanged: function(isLoading) { this._isLoading = isLoading; this._fireLoadingChanged() }, _handleLoadError: function(e) { this.dataErrorOccurred.fire(e) }, fireError: function() { this.dataErrorOccurred.fire(errors.Error.apply(errors, arguments)) }, _setPagingOptions: function(dataSource) { var pageIndex = this.option("paging.pageIndex"); var pageSize = this.option("paging.pageSize"); var pagingEnabled = this.option("paging.enabled"); var scrollingMode = this.option("scrolling.mode"); var appendMode = "infinite" === scrollingMode; var virtualMode = "virtual" === scrollingMode; var paginate = pagingEnabled || virtualMode || appendMode; var isChanged = false; dataSource.requireTotalCount(!appendMode); if (void 0 !== pagingEnabled && dataSource.paginate() !== paginate) { dataSource.paginate(paginate); isChanged = true } if (void 0 !== pageSize && dataSource.pageSize() !== pageSize) { dataSource.pageSize(pageSize); isChanged = true } if (void 0 !== pageIndex && dataSource.pageIndex() !== pageIndex) { dataSource.pageIndex(pageIndex); isChanged = true } return isChanged }, _getSpecificDataSourceOption: function() { var dataSource = this.option("dataSource"); if (Array.isArray(dataSource)) { return { store: { type: "array", data: dataSource, key: this.option("keyExpr") } } } return dataSource }, _initDataSource: function() { var dataSource = this.option("dataSource"); var oldDataSource = this._dataSource; this.callBase(); dataSource = this._dataSource; this._useSortingGroupingFromColumns = true; if (dataSource) { this._setPagingOptions(dataSource); this.setDataSource(dataSource) } else if (oldDataSource) { this.updateItems() } }, _loadDataSource: function() { var dataSource = this._dataSource; var result = new Deferred; when(this._columnsController.refresh(true)).always((function() { if (dataSource) { dataSource.load().done(result.resolve).fail(result.reject) } else { result.resolve() } })); return result.promise() }, _beforeProcessItems: function(items) { return items.slice(0) }, getRowIndexDelta: function() { return 0 }, _processItems: function(items, change) { var that = this; var rowIndexDelta = that.getRowIndexDelta(); var changeType = change.changeType; var visibleColumns = that._columnsController.getVisibleColumns(null, "loadingAll" === changeType); var visibleItems = that._items; var lastVisibleItem = "append" === changeType && visibleItems.length > 0 ? visibleItems[visibleItems.length - 1] : null; var dataIndex = isDefined(null === lastVisibleItem || void 0 === lastVisibleItem ? void 0 : lastVisibleItem.dataIndex) ? lastVisibleItem.dataIndex + 1 : 0; var options = { visibleColumns: visibleColumns, dataIndex: dataIndex }; var result = []; each(items, (function(index, item) { if (isDefined(item)) { options.rowIndex = index - rowIndexDelta; item = that._processItem(item, options); result.push(item) } })); return result }, _processItem: function(item, options) { item = this._generateDataItem(item, options); item = this._processDataItem(item, options); item.dataIndex = options.dataIndex++; return item }, _generateDataItem: function(data) { return { rowType: "data", data: data, key: this.keyOf(data) } }, _processDataItem: function(dataItem, options) { dataItem.values = this.generateDataValues(dataItem.data, options.visibleColumns); return dataItem }, generateDataValues: function(data, columns, isModified) { var values = []; var value; for (var i = 0; i < columns.length; i++) { var column = columns[i]; value = isModified ? void 0 : null; if (!column.command) { if (column.calculateCellValue) { value = column.calculateCellValue(data) } else if (column.dataField) { value = data[column.dataField] } } values.push(value) } return values }, _applyChange: function(change) { if ("update" === change.changeType) { this._applyChangeUpdate(change) } else if (this.items().length && change.repaintChangesOnly && "refresh" === change.changeType) { this._applyChangesOnly(change) } else if ("refresh" === change.changeType) { this._applyChangeFull(change) } }, _applyChangeFull: function(change) { this._items = change.items.slice(0) }, _getRowIndices: function(change) { var rowIndices = change.rowIndices.slice(0); var rowIndexDelta = this.getRowIndexDelta(); rowIndices.sort((function(a, b) { return a - b })); for (var i = 0; i < rowIndices.length; i++) { var correctedRowIndex = rowIndices[i]; if (change.allowInvisibleRowIndices) { correctedRowIndex += rowIndexDelta } if (correctedRowIndex < 0) { rowIndices.splice(i, 1); i-- } } return rowIndices }, _applyChangeUpdate: function(change) { var that = this; var items = change.items; var rowIndices = that._getRowIndices(change); var rowIndexDelta = that.getRowIndexDelta(); var repaintChangesOnly = that.option("repaintChangesOnly"); var prevIndex = -1; var rowIndexCorrection = 0; var changeType; change.items = []; change.rowIndices = []; change.columnIndices = []; change.changeTypes = []; var equalItems = function(item1, item2, strict) { var result = item1 && item2 && equalByValue(item1.key, item2.key); if (result && strict) { result = item1.rowType === item2.rowType && ("detail" !== item2.rowType || item1.isEditing === item2.isEditing) } return result }; each(rowIndices, (function(index, rowIndex) { var columnIndices; rowIndex += rowIndexCorrection + rowIndexDelta; if (prevIndex === rowIndex) { return } prevIndex = rowIndex; var oldItem = that._items[rowIndex]; var oldNextItem = that._items[rowIndex + 1]; var newItem = items[rowIndex]; var newNextItem = items[rowIndex + 1]; var strict = equalItems(oldItem, oldNextItem) || equalItems(newItem, newNextItem); if (newItem) { newItem.rowIndex = rowIndex; change.items.push(newItem) } if (oldItem && newItem && equalItems(oldItem, newItem, strict)) { changeType = "update"; that._items[rowIndex] = newItem; if (oldItem.visible !== newItem.visible) { change.items.splice(-1, 1, { visible: newItem.visible }) } else if (repaintChangesOnly && !change.isFullUpdate) { columnIndices = that._partialUpdateRow(oldItem, newItem, rowIndex - rowIndexDelta) } } else if (newItem && !oldItem || newNextItem && equalItems(oldItem, newNextItem, strict)) { changeType = "insert"; that._items.splice(rowIndex, 0, newItem); rowIndexCorrection++ } else if (oldItem && !newItem || oldNextItem && equalItems(newItem, oldNextItem, strict)) { changeType = "remove"; that._items.splice(rowIndex, 1); rowIndexCorrection--; prevIndex = -1 } else if (newItem) { changeType = "update"; that._items[rowIndex] = newItem } else { return } change.rowIndices.push(rowIndex - rowIndexDelta); change.changeTypes.push(changeType); change.columnIndices.push(columnIndices) })) }, _isCellChanged: function(oldRow, newRow, visibleRowIndex, columnIndex, isLiveUpdate) { if (JSON.stringify(oldRow.values[columnIndex]) !== JSON.stringify(newRow.values[columnIndex])) { return true } function isCellModified(row, columnIndex) { return row.modifiedValues ? void 0 !== row.modifiedValues[columnIndex] : false } if (isCellModified(oldRow, columnIndex) !== isCellModified(newRow, columnIndex)) { return true } return false }, _getChangedColumnIndices: function(oldItem, newItem, visibleRowIndex, isLiveUpdate) { if (oldItem.rowType === newItem.rowType && "group" !== newItem.rowType && "groupFooter" !== newItem.rowType) { var columnIndices = []; if ("detail" !== newItem.rowType) { for (var columnIndex = 0; columnIndex < oldItem.values.length; columnIndex++) { if (this._isCellChanged(oldItem, newItem, visibleRowIndex, columnIndex, isLiveUpdate)) { columnIndices.push(columnIndex) } } } return columnIndices } }, _partialUpdateRow: function(oldItem, newItem, visibleRowIndex, isLiveUpdate) { var changedColumnIndices = this._getChangedColumnIndices(oldItem, newItem, visibleRowIndex, isLiveUpdate); if (changedColumnIndices) { oldItem.cells && oldItem.cells.forEach((function(cell, columnIndex) { var isCellChanged = changedColumnIndices.indexOf(columnIndex) >= 0; if (!isCellChanged && cell && cell.update) { cell.update(newItem) } })); newItem.update = oldItem.update; newItem.watch = oldItem.watch; newItem.cells = oldItem.cells; if (isLiveUpdate) { newItem.oldValues = oldItem.values } oldItem.update && oldItem.update(newItem) } return changedColumnIndices }, _isItemEquals: function(item1, item2) { if (JSON.stringify(item1.values) !== JSON.stringify(item2.values)) { return false } if (["modified", "isNewRow", "removed", "isEditing"].some(field => item1[field] !== item2[field])) { return false } if ("group" === item1.rowType || "groupFooter" === item1.rowType) { var _item1$data, _item2$data, _item1$data2, _item2$data2; var expandedMatch = item1.isExpanded === item2.isExpanded; var summaryCellsMatch = JSON.stringify(item1.summaryCells) === JSON.stringify(item2.summaryCells); var continuationMatch = (null === (_item1$data = item1.data) || void 0 === _item1$data ? void 0 : _item1$data.isContinuation) === (null === (_item2$data = item2.data) || void 0 === _item2$data ? void 0 : _item2$data.isContinuation) && (null === (_item1$data2 = item1.data) || void 0 === _item1$data2 ? void 0 : _item1$data2.isContinuationOnNextPage) === (null === (_item2$data2 = item2.data) || void 0 === _item2$data2 ? void 0 : _item2$data2.isContinuationOnNextPage); if (!expandedMatch || !summaryCellsMatch || !continuationMatch) { return false } } return true }, _applyChangesOnly: function(change) { var rowIndices = []; var columnIndices = []; var changeTypes = []; var items = []; var newIndexByKey = {}; function getRowKey(row) { if (row) { return row.rowType + "," + JSON.stringify(row.key) } } var currentItems = this._items; var oldItems = currentItems.slice(); change.items.forEach((function(item, index) { var key = getRowKey(item); newIndexByKey[key] = index; item.rowIndex = index })); var result = findChanges(oldItems, change.items, getRowKey, (item1, item2) => { if (!this._isItemEquals(item1, item2)) { return false } if (item1.cells) { item1.update && item1.update(item2); item1.cells.forEach((function(cell) { if (cell && cell.update) { cell.update(item2) } })) } return true }); if (!result) { this._applyChangeFull(change); return } result.forEach(change => { switch (change.type) { case "update": var index = change.index; var newItem = change.data; var oldItem = change.oldItem; var changedColumnIndices = this._partialUpdateRow(oldItem, newItem, index, true); rowIndices.push(index); changeTypes.push("update"); items.push(newItem); currentItems[index] = newItem; columnIndices.push(changedColumnIndices); break; case "insert": rowIndices.push(change.index); changeTypes.push("insert"); items.push(change.data); columnIndices.push(void 0); currentItems.splice(change.index, 0, change.data); break; case "remove": rowIndices.push(change.index); changeTypes.push("remove"); currentItems.splice(change.index, 1); items.push(change.oldItem); columnIndices.push(void 0) } }); change.repaintChangesOnly = true; change.changeType = "update"; change.rowIndices = rowIndices; change.columnIndices = columnIndices; change.changeTypes = changeTypes; change.items = items; if (oldItems.length) { change.isLiveUpdate = true } this._correctRowIndices((function(rowIndex) { var oldItem = oldItems[rowIndex]; var key = getRowKey(oldItem); var newRowIndex = newIndexByKey[key]; return newRowIndex >= 0 ? newRowIndex - rowIndex : 0 })) }, _correctRowIndices: noop, _afterProcessItems: function(items) { return items }, _updateItemsCore: function(change) { var items; var dataSource = this._dataSource; var changeType = change.changeType || "refresh"; change.changeType = changeType; if (dataSource) { items = change.items || dataSource.items(); items = this._beforeProcessItems(items); items = this._processItems(items, change); items = this._afterProcessItems(items, change); change.items = items; var oldItems = this._items.length === items.length && this._items; this._applyChange(change); var rowIndexDelta = this.getRowIndexDelta(); each(this._items, (index, item) => { item.rowIndex = index - rowIndexDelta; if (oldItems) { item.cells = oldItems[index].cells || [] } }) } else { this._items = [] } }, _handleChanging: function(e) { var rows = this.getVisibleRows(); var dataSource = this.dataSource(); if (dataSource) { e.changes.forEach((function(change) { if ("insert" === change.type && change.index >= 0) { var dataIndex = 0; for (var i = 0; i < change.index; i++) { var row = rows[i]; if (row && ("data" === row.rowType || "group" === row.rowType)) { dataIndex++ } } change.index = dataIndex } })) } }, updateItems: function(change, isDataChanged) { change = change || {}; if (void 0 !== this._repaintChangesOnly) { change.repaintChangesOnly = this._repaintChangesOnly } else if (change.changes) { change.repaintChangesOnly = this.option("repaintChangesOnly") } else if (isDataChanged) { var operationTypes = this.dataSource().operationTypes(); change.repaintChangesOnly = operationTypes && !operationTypes.grouping && !operationTypes.filtering && this.option("repaintChangesOnly"); change.isDataChanged = true; if (operationTypes && (operationTypes.reload || operationTypes.paging || operationTypes.groupExpanding)) { change.needUpdateDimensions = true } } if (this._updateLockCount) { this._changes.push(change); return } this._updateItemsCore(change); if (change.cancel) { return } this._fireChanged(change) }, loadingOperationTypes: function() { var dataSource = this.dataSource(); return dataSource && dataSource.loadingOperationTypes() || {} }, _fireChanged: function(change) { if (this._currentOperationTypes) { change.operationTypes = this._currentOperationTypes; this._currentOperationTypes = null } deferRender(() => { this.changed.fire(change) }) }, isLoading: function() { return this._isLoading || this._isCustomLoading }, _fireLoadingChanged: function() { this.loadingChanged.fire(this.isLoading(), this._loadingText) }, _calculateAdditionalFilter: function() { return null }, _applyFilter: function() { var dataSource = this._dataSource; if (dataSource) { dataSource.pageIndex(0); return this.reload().done(this.pageChanged.fire.bind(this.pageChanged)) } }, filter: function(filterExpr) { var dataSource = this._dataSource; var filter = dataSource && dataSource.filter(); if (0 === arguments.length) { return filter } filterExpr = arguments.length > 1 ? Array.prototype.slice.call(arguments, 0) : filterExpr; if (gridCoreUtils.equalFilterParameters(filter, filterExpr)) { return } if (dataSource) { dataSource.filter(filterExpr) } this._applyFilter() }, clearFilter: function(filterName) { var that = this; var columnsController = that._columnsController; var clearColumnOption = function(optionName) { var columnCount = columnsController.columnCount(); for (var index = 0; index < columnCount; index++) { columnsController.columnOption(index, optionName, void 0) } }; that.component.beginUpdate(); if (arguments.length > 0) { switch (filterName) { case "dataSource": that.filter(null); break; case "search": that.searchByText(""); break; case "header": clearColumnOption("filterValues"); break; case "row": clearColumnOption("filterValue") } } else { that.filter(null); that.searchByText(""); clearColumnOption("filterValue"); clearColumnOption("bufferedFilterValue"); clearColumnOption("filterValues") } that.component.endUpdate() }, _fireDataSourceChanged: function() { var that = this; that.changed.add((function changedHandler() { that.changed.remove(changedHandler); that.dataSourceChanged.fire() })) }, _getDataSourceAdapter: noop, _createDataSourceAdapterCore: function(dataSource, remoteOperations) { var dataSourceAdapterProvider = this._getDataSourceAdapter(); var dataSourceAdapter = dataSourceAdapterProvider.create(this.component); dataSourceAdapter.init(dataSource, remoteOperations); return dataSourceAdapter }, isLocalStore: function(store) { store = store || this.store(); return store instanceof ArrayStore }, isCustomStore: function(store) { store = store || this.store(); return store instanceof CustomStore }, _createDataSourceAdapter: function(dataSource) { var remoteOperations = this.option("remoteOperations"); var store = dataSource.store(); var enabledRemoteOperations = { filtering: true, sorting: true, paging: true, grouping: true, summary: true }; if (remoteOperations && remoteOperations.groupPaging) { remoteOperations = extend({}, enabledRemoteOperations, remoteOperations) } if ("auto" === remoteOperations) { remoteOperations = this.isLocalStore(store) || this.isCustomStore(store) ? {} : { filtering: true, sorting: true, paging: true } } if (true === remoteOperations) { remoteOperations = enabledRemoteOperations } return this._createDataSourceAdapterCore(dataSource, remoteOperations) }, setDataSource: function(dataSource) { var oldDataSource = this._dataSource; if (!dataSource && oldDataSource) { oldDataSource.cancelAll(); oldDataSource.changed.remove(this._dataChangedHandler); oldDataSource.loadingChanged.remove(this._loadingChangedHandler); oldDataSource.loadError.remove(this._loadErrorHandler); oldDataSource.customizeStoreLoadOptions.remove(this._customizeStoreLoadOptionsHandler); oldDataSource.changing.remove(this._changingHandler); oldDataSource.dispose(this._isSharedDataSource) } if (dataSource) { dataSource = this._createDataSourceAdapter(dataSource) } this._dataSource = dataSource; if (dataSource) { this._fireDataSourceChanged(); this._isLoading = !dataSource.isLoaded(); this._needApplyFilter = true; this._isAllDataTypesDefined = this._columnsController.isAllDataTypesDefined(); dataSource.changed.add(this._dataChangedHandler); dataSource.loadingChanged.add(this._loadingChangedHandler); dataSource.loadError.add(this._loadErrorHandler); dataSource.customizeStoreLoadOptions.add(this._customizeStoreLoadOptionsHandler); dataSource.changing.add(this._changingHandler) } }, items: function() { return this._items }, isEmpty: function() { return !this.items().length }, pageCount: function() { return this._dataSource ? this._dataSource.pageCount() : 1 }, dataSource: function() { return this._dataSource }, store: function() { var dataSource = this._dataSource; return dataSource && dataSource.store() }, loadAll: function(data) { var that = this; var d = new Deferred; var dataSource = that._dataSource; if (dataSource) { if (data) { var options = { data: data, isCustomLoading: true, storeLoadOptions: { isLoadingAll: true }, loadOptions: { filter: that.getCombinedFilter(), group: dataSource.group(), sort: dataSource.sort() } }; dataSource._handleDataLoaded(options); when(options.data).done((function(data) { data = that._beforeProcessItems(data); d.resolve(that._processItems(data, {