UNPKG

devextreme

Version:

HTML5 JavaScript Component Suite for Responsive Web Development

254 lines (253 loc) • 11.3 kB
/** * DevExtreme (esm/ui/grid_core/ui.grid_core.state_storing.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 { getKeyHash, equalByValue } from "../../core/utils/common"; import { isDefined } from "../../core/utils/type"; import { extend } from "../../core/utils/extend"; import { StateStoringController } from "./ui.grid_core.state_storing_core"; import { Deferred } from "../../core/utils/deferred"; var getDataState = that => { var pagerView = that.getView("pagerView"); var dataController = that.getController("data"); var state = { allowedPageSizes: pagerView ? pagerView.getPageSizes() : void 0, filterPanel: { filterEnabled: that.option("filterPanel.filterEnabled") }, filterValue: that.option("filterValue"), focusedRowKey: that.option("focusedRowEnabled") ? that.option("focusedRowKey") : void 0 }; return extend(state, dataController.getUserState()) }; var processLoadState = that => { var columnsController = that.getController("columns"); var selectionController = that.getController("selection"); var exportController = that.getController("export"); var dataController = that.getController("data"); if (columnsController) { columnsController.columnsChanged.add((function() { that.updateState({ columns: columnsController.getUserState() }) })) } if (selectionController) { selectionController.selectionChanged.add((function(e) { that.updateState({ selectedRowKeys: e.selectedRowKeys, selectionFilter: e.selectionFilter }) })) } if (dataController) { that._initialPageSize = that.option("paging.pageSize"); that._initialFilterValue = that.option("filterValue"); dataController.changed.add((function() { var state = getDataState(that); that.updateState(state) })) } if (exportController) { exportController.selectionOnlyChanged.add((function() { that.updateState({ exportSelectionOnly: exportController.selectionOnly() }) })) } }; var DEFAULT_FILTER_VALUE = null; var getFilterValue = (that, state) => { var filterSyncController = that.getController("filterSync"); var columnsController = that.getController("columns"); var hasFilterState = state.columns || void 0 !== state.filterValue; if (filterSyncController) { if (hasFilterState) { return state.filterValue || filterSyncController.getFilterValueFromColumns(state.columns) } else { return that._initialFilterValue || filterSyncController.getFilterValueFromColumns(columnsController.getColumns()) } } return DEFAULT_FILTER_VALUE }; export var stateStoringModule = { defaultOptions: function() { return { stateStoring: { enabled: false, storageKey: null, type: "localStorage", customLoad: null, customSave: null, savingTimeout: 2e3 } } }, controllers: { stateStoring: StateStoringController }, extenders: { views: { rowsView: { init: function() { var that = this; var dataController = that.getController("data"); that.callBase(); dataController.stateLoaded.add((function() { if (dataController.isLoaded() && !dataController.getDataSource()) { that.setLoading(false); that.renderNoDataText(); var columnHeadersView = that.component.getView("columnHeadersView"); columnHeadersView && columnHeadersView.render(); that.component._fireContentReadyAction() } })) } } }, controllers: { stateStoring: { init: function() { this.callBase.apply(this, arguments); processLoadState(this) }, isLoading: function() { return this.callBase() || this.getController("data").isStateLoading() }, state: function(_state) { var result = this.callBase.apply(this, arguments); if (void 0 !== _state) { this.applyState(extend({}, _state)) } return result }, updateState: function(state) { if (this.isEnabled()) { var oldState = this.state(); var newState = extend({}, oldState, state); var oldStateHash = getKeyHash(oldState); var newStateHash = getKeyHash(newState); if (!equalByValue(oldStateHash, newStateHash)) { extend(this._state, state); this.save() } } else { extend(this._state, state) } }, applyState: function(state) { var allowedPageSizes = state.allowedPageSizes; var searchText = state.searchText; var selectedRowKeys = state.selectedRowKeys; var selectionFilter = state.selectionFilter; var exportController = this.getController("export"); var columnsController = this.getController("columns"); var dataController = this.getController("data"); var scrollingMode = this.option("scrolling.mode"); var isVirtualScrollingMode = "virtual" === scrollingMode || "infinite" === scrollingMode; var showPageSizeSelector = true === this.option("pager.visible") && this.option("pager.showPageSizeSelector"); this.component.beginUpdate(); if (columnsController) { columnsController.setUserState(state.columns) } if (exportController) { exportController.selectionOnly(state.exportSelectionOnly) } if (selectedRowKeys) { this.option("selectedRowKeys", selectedRowKeys) } this.option("selectionFilter", selectionFilter); if (allowedPageSizes && "auto" === this.option("pager.allowedPageSizes")) { this.option("pager").allowedPageSizes = allowedPageSizes } if (this.option("focusedRowEnabled") && void 0 !== state.focusedRowKey) { this.option("focusedRowIndex", -1); this.option("focusedRowKey", state.focusedRowKey) } this.component.endUpdate(); searchText && this.option("searchPanel.text", searchText); this.option("filterValue", getFilterValue(this, state)); this.option("filterPanel.filterEnabled", state.filterPanel ? state.filterPanel.filterEnabled : true); this.option("paging.pageSize", (!isVirtualScrollingMode || showPageSizeSelector) && isDefined(state.pageSize) ? state.pageSize : this._initialPageSize); this.option("paging.pageIndex", state.pageIndex || 0); dataController && dataController.reset() } }, columns: { getVisibleColumns: function() { var visibleColumns = this.callBase.apply(this, arguments); var stateStoringController = this.getController("stateStoring"); return stateStoringController.isEnabled() && !stateStoringController.isLoaded() ? [] : visibleColumns } }, data: { callbackNames: function() { return this.callBase().concat(["stateLoaded"]) }, _refreshDataSource: function() { var callBase = this.callBase; var stateStoringController = this.getController("stateStoring"); if (stateStoringController.isEnabled() && !stateStoringController.isLoaded()) { clearTimeout(this._restoreStateTimeoutID); var deferred = new Deferred; this._restoreStateTimeoutID = setTimeout(() => { stateStoringController.load().always(() => { this._restoreStateTimeoutID = null }).done(() => { callBase.call(this); this.stateLoaded.fire(); deferred.resolve() }).fail(error => { this.stateLoaded.fire(); this._handleLoadError(error || "Unknown error"); deferred.reject() }) }); return deferred.promise() } else if (!this.isStateLoading()) { callBase.call(this) } }, isLoading: function() { var stateStoringController = this.getController("stateStoring"); return this.callBase() || stateStoringController.isLoading() }, isStateLoading: function() { return isDefined(this._restoreStateTimeoutID) }, isLoaded: function() { return this.callBase() && !this.isStateLoading() }, dispose: function() { clearTimeout(this._restoreStateTimeoutID); this.callBase() } }, selection: { _fireSelectionChanged: function(options) { var stateStoringController = this.getController("stateStoring"); var isDeferredSelection = this.option("selection.deferred"); if (stateStoringController.isLoading() && isDeferredSelection) { return } this.callBase.apply(this, arguments) } } } } };