devextreme
Version:
HTML5 JavaScript Component Suite for Responsive Web Development
198 lines (197 loc) • 7.37 kB
JavaScript
/**
* DevExtreme (ui/list/ui.list.edit.provider.js)
* Version: 18.2.18
* Build date: Tue Oct 18 2022
*
* Copyright (c) 2012 - 2022 Developer Express Inc. ALL RIGHTS RESERVED
* Read about DevExtreme licensing here: https://js.devexpress.com/Licensing/
*/
"use strict";
var $ = require("../../core/renderer"),
noop = require("../../core/utils/common").noop,
Class = require("../../core/class"),
extend = require("../../core/utils/extend").extend,
each = require("../../core/utils/iterator").each,
errors = require("../widget/ui.errors"),
decoratorRegistry = require("./ui.list.edit.decorator_registry");
require("./ui.list.edit.decorator.static");
require("./ui.list.edit.decorator.switchable.button");
require("./ui.list.edit.decorator.switchable.slide");
require("./ui.list.edit.decorator.swipe");
require("./ui.list.edit.decorator.context");
require("./ui.list.edit.decorator.selection");
require("./ui.list.edit.decorator.reorder");
var editOptionsRegistry = [];
var registerOption = function(enabledFunc, decoratorTypeFunc, decoratorSubTypeFunc) {
editOptionsRegistry.push({
enabled: enabledFunc,
decoratorType: decoratorTypeFunc,
decoratorSubType: decoratorSubTypeFunc
})
};
registerOption(function() {
return this.option("menuItems").length
}, function() {
return "menu"
}, function() {
return this.option("menuMode")
});
registerOption(function() {
return !this.option("menuItems").length && this.option("allowItemDeleting")
}, function() {
var mode = this.option("itemDeleteMode");
return "toggle" === mode || "slideButton" === mode || "swipe" === mode || "static" === mode ? "delete" : "menu"
}, function() {
var mode = this.option("itemDeleteMode");
if ("slideItem" === mode) {
mode = "slide"
}
if ("hold" === mode) {
mode = "context"
}
return mode
});
registerOption(function() {
return "none" !== this.option("selectionMode") && this.option("showSelectionControls")
}, function() {
return "selection"
}, function() {
return "default"
});
registerOption(function() {
return this.option("allowItemReordering")
}, function() {
return "reorder"
}, function() {
return "default"
});
var LIST_ITEM_BEFORE_BAG_CLASS = "dx-list-item-before-bag",
LIST_ITEM_AFTER_BAG_CLASS = "dx-list-item-after-bag",
DECORATOR_BEFORE_BAG_CREATE_METHOD = "beforeBag",
DECORATOR_AFTER_BAG_CREATE_METHOD = "afterBag",
DECORATOR_MODIFY_ELEMENT_METHOD = "modifyElement",
DECORATOR_AFTER_RENDER_METHOD = "afterRender",
DECORATOR_GET_EXCLUDED_SELECTORS_METHOD = "getExcludedSelectors";
var EditProvider = Class.inherit({
ctor: function(list) {
this._list = list;
this._fetchRequiredDecorators()
},
dispose: function() {
if (this._decorators && this._decorators.length) {
each(this._decorators, function(_, decorator) {
decorator.dispose()
})
}
},
_fetchRequiredDecorators: function() {
this._decorators = [];
each(editOptionsRegistry, function(_, option) {
var optionEnabled = option.enabled.call(this._list);
if (optionEnabled) {
var decoratorType = option.decoratorType.call(this._list),
decoratorSubType = option.decoratorSubType.call(this._list),
decorator = this._createDecorator(decoratorType, decoratorSubType);
this._decorators.push(decorator)
}
}.bind(this))
},
_createDecorator: function(type, subType) {
var decoratorClass = this._findDecorator(type, subType);
return new decoratorClass(this._list)
},
_findDecorator: function(type, subType) {
var foundDecorator = decoratorRegistry.registry[type][subType];
if (!foundDecorator) {
throw errors.Error("E1012", type, subType)
}
return foundDecorator
},
modifyItemElement: function(args) {
var $itemElement = $(args.itemElement);
var config = {
$itemElement: $itemElement
};
this._prependBeforeBags($itemElement, config);
this._appendAfterBags($itemElement, config);
this._applyDecorators(DECORATOR_MODIFY_ELEMENT_METHOD, config)
},
afterItemsRendered: function() {
this._applyDecorators(DECORATOR_AFTER_RENDER_METHOD)
},
_prependBeforeBags: function($itemElement, config) {
var $beforeBags = this._collectDecoratorsMarkup(DECORATOR_BEFORE_BAG_CREATE_METHOD, config, LIST_ITEM_BEFORE_BAG_CLASS);
$itemElement.prepend($beforeBags)
},
_appendAfterBags: function($itemElement, config) {
var $afterBags = this._collectDecoratorsMarkup(DECORATOR_AFTER_BAG_CREATE_METHOD, config, LIST_ITEM_AFTER_BAG_CLASS);
$itemElement.append($afterBags)
},
_collectDecoratorsMarkup: function(method, config, containerClass) {
var $collector = $("<div>");
each(this._decorators, function() {
var $container = $("<div>").addClass(containerClass);
this[method](extend({
$container: $container
}, config));
if ($container.children().length) {
$collector.append($container)
}
});
return $collector.children()
},
_applyDecorators: function(method, config) {
each(this._decorators, function() {
this[method](config)
})
},
_handlerExists: function(name) {
if (!this._decorators) {
return false
}
var decorators = this._decorators,
length = decorators.length;
for (var i = 0; i < length; i++) {
if (decorators[i][name] !== noop) {
return true
}
}
return false
},
_eventHandler: function(name, $itemElement, e) {
if (!this._decorators) {
return false
}
var response = false,
decorators = this._decorators,
length = decorators.length;
for (var i = 0; i < length; i++) {
response = decorators[i][name]($itemElement, e);
if (response) {
break
}
}
return response
},
handleClick: function($itemElement, e) {
return this._eventHandler("handleClick", $itemElement, e)
},
handleKeyboardEvents: function(itemIndex, focusOnList) {
return this._eventHandler("handleKeyboardEvents", itemIndex, focusOnList)
},
handleEnterPressing: function() {
return this._eventHandler("handleEnterPressing")
},
contextMenuHandlerExists: function() {
return this._handlerExists("handleContextMenu")
},
handleContextMenu: function($itemElement, e) {
return this._eventHandler("handleContextMenu", $itemElement, e)
},
getExcludedItemSelectors: function() {
var excludedSelectors = [];
this._applyDecorators(DECORATOR_GET_EXCLUDED_SELECTORS_METHOD, excludedSelectors);
return excludedSelectors.join(",")
}
});
module.exports = EditProvider;