UNPKG

devextreme

Version:

HTML5 JavaScript Component Suite for Responsive Web Development

190 lines (189 loc) 6.21 kB
/** * DevExtreme (esm/ui/tree_list/ui.tree_list.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 { extend } from "../../core/utils/extend"; import { Deferred } from "../../core/utils/deferred"; import treeListCore from "./ui.tree_list.core"; import { equalByValue } from "../../core/utils/common"; import dataSourceAdapterProvider from "./ui.tree_list.data_source_adapter"; import { dataControllerModule } from "../grid_core/ui.grid_core.data_controller"; export var DataController = dataControllerModule.controllers.data.inherit({ _getDataSourceAdapter: function() { return dataSourceAdapterProvider }, _getNodeLevel: function(node) { var level = -1; while (node.parent) { if (node.visible) { level++ } node = node.parent } return level }, _generateDataItem: function(node, options) { return { rowType: "data", node: node, key: node.key, data: node.data, isExpanded: this.isRowExpanded(node.key, options), level: this._getNodeLevel(node) } }, _loadOnOptionChange: function() { this._dataSource.load() }, _isItemEquals: function(item1, item2) { if (!this.callBase.apply(this, arguments)) { return false } if (item1.node && item2.node && item1.node.hasChildren !== item2.node.hasChildren) { return false } if (item1.level !== item2.level || item1.isExpanded !== item2.isExpanded) { return false } return true }, init: function() { this.createAction("onRowExpanding"); this.createAction("onRowExpanded"); this.createAction("onRowCollapsing"); this.createAction("onRowCollapsed"); this.callBase.apply(this, arguments) }, keyOf: function(data) { var dataSource = this._dataSource; if (dataSource) { return dataSource.keyOf(data) } }, key: function() { var dataSource = this._dataSource; if (dataSource) { return dataSource.getKeyExpr() } }, publicMethods: function() { return this.callBase().concat(["expandRow", "collapseRow", "isRowExpanded", "getRootNode", "getNodeByKey", "loadDescendants", "forEachNode"]) }, changeRowExpand: function(key) { if (this._dataSource) { var args = { key: key }; var isExpanded = this.isRowExpanded(key); this.executeAction(isExpanded ? "onRowCollapsing" : "onRowExpanding", args); if (!args.cancel) { return this._dataSource.changeRowExpand(key).done(() => { this.executeAction(isExpanded ? "onRowCollapsed" : "onRowExpanded", args) }) } } return (new Deferred).resolve() }, isRowExpanded: function(key, cache) { return this._dataSource && this._dataSource.isRowExpanded(key, cache) }, expandRow: function(key) { if (!this.isRowExpanded(key)) { return this.changeRowExpand(key) } return (new Deferred).resolve() }, collapseRow: function(key) { if (this.isRowExpanded(key)) { return this.changeRowExpand(key) } return (new Deferred).resolve() }, getRootNode: function() { return this._dataSource && this._dataSource.getRootNode() }, optionChanged: function(args) { switch (args.name) { case "rootValue": case "parentIdExpr": case "itemsExpr": case "filterMode": case "expandNodesOnFiltering": case "autoExpandAll": case "hasItemsExpr": case "dataStructure": this._columnsController.reset(); this._items = []; this._refreshDataSource(); args.handled = true; break; case "expandedRowKeys": case "onNodesInitialized": if (this._dataSource && !this._dataSource._isNodesInitializing && !equalByValue(args.value, args.previousValue)) { this._loadOnOptionChange() } args.handled = true; break; case "maxFilterLengthInRequest": args.handled = true; break; default: this.callBase(args) } }, getNodeByKey: function(key) { if (!this._dataSource) { return } return this._dataSource.getNodeByKey(key) }, getChildNodeKeys: function(parentKey) { if (!this._dataSource) { return } return this._dataSource.getChildNodeKeys(parentKey) }, loadDescendants: function(keys, childrenOnly) { if (!this._dataSource) { return } return this._dataSource.loadDescendants(keys, childrenOnly) }, forEachNode: function() { this._dataSource.forEachNode.apply(this, arguments) } }); treeListCore.registerModule("data", { defaultOptions: function() { return extend({}, dataControllerModule.defaultOptions(), { itemsExpr: "items", parentIdExpr: "parentId", rootValue: 0, dataStructure: "plain", expandedRowKeys: [], filterMode: "withAncestors", expandNodesOnFiltering: true, autoExpandAll: false, onNodesInitialized: null, maxFilterLengthInRequest: 1500, paging: { enabled: false } }) }, controllers: { data: DataController } });