UNPKG

devextreme

Version:

HTML5 JavaScript Component Suite for Responsive Web Development

117 lines (116 loc) 4.15 kB
/** * DevExtreme (esm/ui/list/ui.list.edit.decorator.context.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 EditDecoratorMenuHelperMixin from "./ui.list.edit.decorator_menu_helper"; import messageLocalization from "../../localization/message"; import { register as registerDecorator } from "./ui.list.edit.decorator_registry"; import EditDecorator from "./ui.list.edit.decorator"; import Overlay from "../overlay/ui.overlay"; import { ListBase } from "./ui.list.base"; var CONTEXTMENU_CLASS = "dx-list-context-menu"; var CONTEXTMENU_MENUCONTENT_CLASS = "dx-list-context-menucontent"; registerDecorator("menu", "context", EditDecorator.inherit({ _init: function() { var $menu = $("<div>").addClass(CONTEXTMENU_CLASS); this._list.$element().append($menu); this._menu = this._renderOverlay($menu) }, _renderOverlay: function($element) { return this._list._createComponent($element, Overlay, { shading: false, deferRendering: true, closeOnTargetScroll: true, closeOnOutsideClick: function(e) { return !$(e.target).closest("." + CONTEXTMENU_CLASS).length }, animation: { show: { type: "slide", duration: 300, from: { height: 0, opacity: 1 }, to: { height: function() { return this._$menuList.outerHeight() }.bind(this), opacity: 1 } }, hide: { type: "slide", duration: 0, from: { opacity: 1 }, to: { opacity: 0 } } }, height: function() { return this._$menuList ? this._$menuList.outerHeight() : 0 }.bind(this), width: function() { return this._list.$element().outerWidth() }.bind(this), onContentReady: this._renderMenuContent.bind(this) }) }, _renderMenuContent: function(e) { var $overlayContent = e.component.$content(); var items = this._menuItems().slice(); if (this._deleteEnabled()) { items.push({ text: messageLocalization.format("dxListEditDecorator-delete"), action: this._deleteItem.bind(this) }) } this._$menuList = $("<div>"); this._list._createComponent(this._$menuList, ListBase, { items: items, onItemClick: this._menuItemClickHandler.bind(this), height: "auto", integrationOptions: {} }); $overlayContent.addClass(CONTEXTMENU_MENUCONTENT_CLASS); $overlayContent.append(this._$menuList) }, _menuItemClickHandler: function(args) { this._menu.hide(); this._fireMenuAction(this._$itemWithMenu, args.itemData.action) }, _deleteItem: function() { this._list.deleteItem(this._$itemWithMenu) }, handleContextMenu: function($itemElement) { this._$itemWithMenu = $itemElement; this._menu.option({ position: { my: "top", at: "bottom", of: $itemElement, collision: "flip" } }); this._menu.show(); return true }, dispose: function() { if (this._menu) { this._menu.$element().remove() } this.callBase.apply(this, arguments) } }).include(EditDecoratorMenuHelperMixin));