devextreme
Version:
JavaScript/TypeScript Component Suite for Responsive Web Development
126 lines (124 loc) • 4.63 kB
JavaScript
/**
* DevExtreme (cjs/__internal/ui/list/list.edit.decorator.context.js)
* Version: 25.2.7
* Build date: Tue May 05 2026
*
* Copyright (c) 2012 - 2026 Developer Express Inc. ALL RIGHTS RESERVED
* Read about DevExtreme licensing here: https://js.devexpress.com/Licensing/
*/
"use strict";
var _message = _interopRequireDefault(require("../../../common/core/localization/message"));
var _renderer = _interopRequireDefault(require("../../../core/renderer"));
var _size = require("../../../core/utils/size");
var _list = require("../../ui/list/list.base");
var _listEdit = _interopRequireDefault(require("../../ui/list/list.edit.decorator"));
var _listEdit2 = require("../../ui/list/list.edit.decorator_registry");
var _overlay = _interopRequireDefault(require("../../ui/overlay/overlay"));
function _interopRequireDefault(e) {
return e && e.__esModule ? e : {
default: e
}
}
const CONTEXTMENU_CLASS = "dx-list-context-menu";
const CONTEXTMENU_MENUCONTENT_CLASS = "dx-list-context-menucontent";
class EditDecoratorContext extends _listEdit.default {
_init() {
const $menu = (0, _renderer.default)("<div>").addClass(CONTEXTMENU_CLASS);
this._list.$element().append($menu);
this._menu = this._renderOverlay($menu)
}
_renderOverlay($element) {
return this._list._createComponent($element, _overlay.default, {
shading: false,
deferRendering: true,
hideOnParentScroll: true,
hideOnOutsideClick: e => !(0, _renderer.default)(e.target).closest(`.${CONTEXTMENU_CLASS}`).length,
animation: {
show: {
type: "slide",
duration: 300,
from: {
height: 0,
opacity: 1
},
to: {
height: () => (0, _size.getOuterHeight)(this._$menuList),
opacity: 1
}
},
hide: {
type: "slide",
duration: 0,
from: {
opacity: 1
},
to: {
opacity: 0
}
}
},
_ignoreFunctionValueDeprecation: true,
height: () => this._$menuList ? (0, _size.getOuterHeight)(this._$menuList) : 0,
width: () => (0, _size.getOuterWidth)(this._list.$element()),
onContentReady: e => {
this._renderMenuContent(e)
}
})
}
_renderMenuContent(e) {
const $overlayContent = (0, _renderer.default)(e.component.content());
const {
menuItems: menuItems = [],
allowItemDeleting: allowItemDeleting
} = this._list.option();
const items = menuItems.slice();
if (allowItemDeleting) {
items.push({
text: _message.default.format("dxListEditDecorator-delete"),
action: this._deleteItem.bind(this)
})
}
this._$menuList = (0, _renderer.default)("<div>");
this._list._createComponent(this._$menuList, _list.ListBase, {
items: items,
onItemClick: event => {
this._menuItemClickHandler(event)
},
height: "auto",
integrationOptions: {}
});
$overlayContent.addClass("dx-list-context-menucontent");
$overlayContent.append(this._$menuList)
}
_menuItemClickHandler(e) {
this._menu.hide();
this._list._itemEventHandlerByHandler((0, _renderer.default)(this._$itemWithMenu), e.itemData.action, {}, {
excludeValidators: ["disabled", "readOnly"]
})
}
_deleteItem() {
if (!this._$itemWithMenu) {
return
}
this._list.deleteItem(this._$itemWithMenu.get(0))
}
handleContextMenu($itemElement) {
this._$itemWithMenu = $itemElement;
this._menu.option({
position: {
my: "top",
at: "bottom",
of: $itemElement,
collision: "flip"
}
});
this._menu.show();
return true
}
dispose() {
if (this._menu) {
this._menu.$element().remove()
}
super.dispose()
}
}(0, _listEdit2.register)("menu", "context", EditDecoratorContext);