UNPKG

devextreme

Version:

HTML5 JavaScript Component Suite for Responsive Web Development

371 lines (370 loc) • 13.4 kB
/** * DevExtreme (esm/ui/grid_core/ui.grid_core.modules.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 eventsEngine from "../../events/core/events_engine"; import Class from "../../core/class"; import Callbacks from "../../core/utils/callbacks"; import { grep } from "../../core/utils/common"; import { isFunction } from "../../core/utils/type"; import { inArray } from "../../core/utils/array"; import { each } from "../../core/utils/iterator"; import errors from "../widget/ui.errors"; import messageLocalization from "../../localization/message"; import { hasWindow } from "../../core/utils/window"; var WIDGET_WITH_LEGACY_CONTAINER_NAME = "dxDataGrid"; var ModuleItem = Class.inherit({ _endUpdateCore: function() {}, ctor: function(component) { var that = this; that._updateLockCount = 0; that.component = component; that._actions = {}; that._actionConfigs = {}; each(this.callbackNames() || [], (function(index, name) { var flags = that.callbackFlags(name) || {}; flags.unique = true, flags.syncStrategy = true; that[this] = Callbacks(flags) })) }, init: function() {}, callbackNames: function() {}, callbackFlags: function() {}, publicMethods: function() {}, beginUpdate: function() { this._updateLockCount++ }, endUpdate: function() { if (this._updateLockCount > 0) { this._updateLockCount--; if (!this._updateLockCount) { this._endUpdateCore() } } }, option: function(name) { var component = this.component; var optionCache = component._optionCache; if (1 === arguments.length && optionCache) { if (!(name in optionCache)) { optionCache[name] = component.option(name) } return optionCache[name] } return component.option.apply(component, arguments) }, _silentOption: function(name, value) { var component = this.component; var optionCache = component._optionCache; if (optionCache) { optionCache[name] = value } return component._setOptionWithoutOptionChange(name, value) }, localize: function(name) { var optionCache = this.component._optionCache; if (optionCache) { if (!(name in optionCache)) { optionCache[name] = messageLocalization.format(name) } return optionCache[name] } return messageLocalization.format(name) }, on: function() { return this.component.on.apply(this.component, arguments) }, off: function() { return this.component.off.apply(this.component, arguments) }, optionChanged: function(args) { if (args.name in this._actions) { this.createAction(args.name, this._actionConfigs[args.name]); args.handled = true } }, getAction: function(actionName) { return this._actions[actionName] }, setAria: function(name, value, $target) { var target = $target.get(0); var prefix = "role" !== name && "id" !== name ? "aria-" : ""; if (target.setAttribute) { target.setAttribute(prefix + name, value) } else { $target.attr(prefix + name, value) } }, _createComponent: function() { return this.component._createComponent.apply(this.component, arguments) }, getController: function(name) { return this.component._controllers[name] }, createAction: function(actionName, config) { if (isFunction(actionName)) { var action = this.component._createAction(actionName.bind(this), config); return function(e) { action({ event: e }) } } else { this._actions[actionName] = this.component._createActionByOption(actionName, config); this._actionConfigs[actionName] = config } }, executeAction: function(actionName, options) { var action = this._actions[actionName]; return action && action(options) }, dispose: function() { var that = this; each(that.callbackNames() || [], (function() { that[this].empty() })) }, addWidgetPrefix: function(className) { var componentName = this.component.NAME; return "dx-" + componentName.slice(2).toLowerCase() + (className ? "-" + className : "") }, getWidgetContainerClass: function() { var containerName = this.component.NAME === WIDGET_WITH_LEGACY_CONTAINER_NAME ? null : "container"; return this.addWidgetPrefix(containerName) } }); var Controller = ModuleItem; var ViewController = Controller.inherit({ getView: function(name) { return this.component._views[name] }, getViews: function() { return this.component._views } }); var View = ModuleItem.inherit({ _isReady: function() { return this.component.isReady() }, _endUpdateCore: function() { this.callBase(); if (!this._isReady() && this._requireReady) { this._requireRender = false; this.component._requireResize = false } if (this._requireRender) { this._requireRender = false; this.render(this._$parent) } }, _invalidate: function(requireResize, requireReady) { this._requireRender = true; this.component._requireResize = hasWindow() && (this.component._requireResize || requireResize); this._requireReady = this._requireReady || requireReady }, _renderCore: function() {}, _resizeCore: function() {}, _parentElement: function() { return this._$parent }, ctor: function(component) { this.callBase(component); this.renderCompleted = Callbacks(); this.resizeCompleted = Callbacks() }, element: function() { return this._$element }, getElementHeight: function() { var $element = this.element(); if (!$element) { return 0 } var marginTop = parseFloat($element.css("marginTop")) || 0; var marginBottom = parseFloat($element.css("marginBottom")) || 0; var offsetHeight = $element.get(0).offsetHeight; return offsetHeight + marginTop + marginBottom }, isVisible: function() { return true }, getTemplate: function(name) { return this.component._getTemplate(name) }, render: function($parent, options) { var $element = this._$element; var isVisible = this.isVisible(); if (!$element && !$parent) { return } this._requireReady = false; if (!$element) { $element = this._$element = $("<div>").appendTo($parent); this._$parent = $parent } $element.toggleClass("dx-hidden", !isVisible); if (isVisible) { this.component._optionCache = {}; this._renderCore(options); this.component._optionCache = void 0; this.renderCompleted.fire(options) } }, resize: function() { this.isResizing = true; this._resizeCore(); this.resizeCompleted.fire(); this.isResizing = false }, focus: function() { eventsEngine.trigger(this.element(), "focus") } }); var MODULES_ORDER_MAX_INDEX = 1e6; var processModules = function(that, componentClass) { var modules = componentClass.modules; var modulesOrder = componentClass.modulesOrder; var controllerTypes = componentClass.controllerTypes || {}; var viewTypes = componentClass.viewTypes || {}; if (!componentClass.controllerTypes) { if (modulesOrder) { modules.sort((function(module1, module2) { var orderIndex1 = inArray(module1.name, modulesOrder); var orderIndex2 = inArray(module2.name, modulesOrder); if (orderIndex1 < 0) { orderIndex1 = MODULES_ORDER_MAX_INDEX } if (orderIndex2 < 0) { orderIndex2 = MODULES_ORDER_MAX_INDEX } return orderIndex1 - orderIndex2 })) } each(modules, (function() { var controllers = this.controllers; var moduleName = this.name; var views = this.views; controllers && each(controllers, (function(name, type) { if (controllerTypes[name]) { throw errors.Error("E1001", moduleName, name) } else if (!(type && type.subclassOf && type.subclassOf(Controller))) { type.subclassOf(Controller); throw errors.Error("E1002", moduleName, name) } controllerTypes[name] = type })); views && each(views, (function(name, type) { if (viewTypes[name]) { throw errors.Error("E1003", moduleName, name) } else if (!(type && type.subclassOf && type.subclassOf(View))) { throw errors.Error("E1004", moduleName, name) } viewTypes[name] = type })) })); each(modules, (function() { var extenders = this.extenders; if (extenders) { extenders.controllers && each(extenders.controllers, (function(name, extender) { if (controllerTypes[name]) { controllerTypes[name] = controllerTypes[name].inherit(extender) } })); extenders.views && each(extenders.views, (function(name, extender) { if (viewTypes[name]) { viewTypes[name] = viewTypes[name].inherit(extender) } })) } })); componentClass.controllerTypes = controllerTypes; componentClass.viewTypes = viewTypes } var createModuleItems = function(moduleTypes) { var moduleItems = {}; each(moduleTypes, (function(name, moduleType) { var moduleItem = new moduleType(that); moduleItem.name = name; ! function(that, name, moduleItem) { var publicMethods = moduleItem.publicMethods(); if (publicMethods) { each(publicMethods, (function(index, methodName) { if (moduleItem[methodName]) { if (!that[methodName]) { that[methodName] = function() { return moduleItem[methodName].apply(moduleItem, arguments) } } else { throw errors.Error("E1005", methodName) } } else { throw errors.Error("E1006", name, methodName) } })) } }(that, name, moduleItem); moduleItems[name] = moduleItem })); return moduleItems }; that._controllers = createModuleItems(controllerTypes); that._views = createModuleItems(viewTypes) }; var callModuleItemsMethod = function(that, methodName, args) { args = args || []; if (that._controllers) { each(that._controllers, (function() { this[methodName] && this[methodName].apply(this, args) })) } if (that._views) { each(that._views, (function() { this[methodName] && this[methodName].apply(this, args) })) } }; export default { modules: [], View: View, ViewController: ViewController, Controller: Controller, registerModule: function(name, module) { var modules = this.modules; for (var i = 0; i < modules.length; i++) { if (modules[i].name === name) { return } } module.name = name; modules.push(module); delete this.controllerTypes; delete this.viewTypes }, registerModulesOrder: function(moduleNames) { this.modulesOrder = moduleNames }, unregisterModule: function(name) { this.modules = grep(this.modules, (function(module) { return module.name !== name })); delete this.controllerTypes; delete this.viewTypes }, processModules: processModules, callModuleItemsMethod: callModuleItemsMethod };