com.github.fluorumlabs.disconnect.vaadin.elements.ContextMenuElement Maven / Gradle / Ivy
Show all versions of disconnect-vaadin Show documentation
package com.github.fluorumlabs.disconnect.vaadin.elements;
import com.github.fluorumlabs.disconnect.core.annotations.Import;
import com.github.fluorumlabs.disconnect.core.annotations.NpmPackage;
import com.github.fluorumlabs.disconnect.polymer.elements.mixins.GestureEventListeners;
import com.github.fluorumlabs.disconnect.vaadin.Vaadin;
import com.github.fluorumlabs.disconnect.vaadin.elements.mixins.ElementMixin;
import com.github.fluorumlabs.disconnect.vaadin.elements.mixins.ItemsMixin;
import com.github.fluorumlabs.disconnect.vaadin.elements.mixins.ThemePropertyMixin;
import com.github.fluorumlabs.disconnect.vaadin.renderers.ContextMenuRenderer;
import js.web.dom.Event;
import js.web.dom.HTMLElement;
import org.teavm.jso.JSProperty;
import javax.annotation.Nullable;
/**
* <vaadin-context-menu>
is a Web Component for creating context menus. The content of the
* menu can be populated in three ways: imperatively by using the items API or a renderer callback function and
* declaratively by using Polymer's Templates.
*
* Items
* Items is a higher level convenience API for defining a (hierarchical) menu structure for the component.
* If a menu item has a non-empty children
set, a sub-menu with the child items is opened
* next to the parent menu on mouseover, tap or a right arrow keypress.
*
* When an item is selected, <vaadin-context-menu>
dispatches an "item-selected" event
* with the selected item as event.detail.value
property.
*
*
contextMenu.items = [
* {text: 'Menu Item 1', children:
* [
* {text: 'Menu Item 1-1', checked: true},
* {text: 'Menu Item 1-2'}
* ]
* },
* {component: 'hr'},
* {text: 'Menu Item 2', children:
* [
* {text: 'Menu Item 2-1'},
* {text: 'Menu Item 2-2', disabled: true}
* ]
* },
* {text: 'Menu Item 3', disabled: true}
* ];
*
* contextMenu.addEventListener('item-selected', e => {
* const item = e.detail.value;
* console.log(`${item.text} selected`);
* });
*
* NOTE: when the items
array is defined, the renderer or a template cannot be used.
*
* Rendering
* The renderer function provides root
, contextMenu
, model
arguments when
* applicable.
* Generate DOM content by using model
object properties if needed, append it to the root
* element and control the state of the host element by accessing contextMenu
. Before generating
* new content, the renderer function should check if there is already content in root
for reusing it.
*
* <vaadin-context-menu id="contextMenu">
* <p>This paragraph has a context menu.</p>
* </vaadin-context-menu>
*
* const contextMenu = document.querySelector('#contextMenu');
* contextMenu.renderer = (root, contextMenu, context) => {
* let listBox = root.firstElementChild;
* if (!listBox) {
* listBox = document.createElement('vaadin-list-box');
* root.appendChild(listBox);
* }
*
* let item = listBox.querySelector('vaadin-item');
* if (!item) {
* item = document.createElement('vaadin-item');
* listBox.appendChild(item);
* }
* item.textContent = 'Content of the selector: ' + context.target.textContent;
* };
*
* You can access the menu context inside the renderer using
* context.target
and context.detail
.
*
* Renderer is called on the opening of the context-menu and each time the related context is updated.
* DOM generated during the renderer call can be reused
* in the next renderer call and will be provided with the root
argument.
* On first call it will be empty.
*
* NOTE: when the renderer
function is defined, the template content
* is not in use.
*
*
Polymer Templates
* Alternatively to using the renderer
, you can populate
* the menu content using Polymer's Templates:
*
* <vaadin-context-menu>
* <template>
* <vaadin-list-box>
* <vaadin-item>First menu item</vaadin-item>
* <vaadin-item>Second menu item</vaadin-item>
* </vaadin-list-box>
* </template>
* </vaadin-context-menu>
*
* “vaadin-contextmenu” Gesture Event
* vaadin-contextmenu
is a gesture event (a custom event),
* which is dispatched after either contextmenu
and long touch events.
* This enables support for both mouse and touch environments in a uniform way.
*
* <vaadin-context-menu>
opens the menu overlay on the vaadin-contextmenu
* event by default.
*
* Menu Listener
* By default, the <vaadin-context-menu>
element listens for the menu opening
* event on itself. In order to have a context menu on your content, wrap
* your content with the <vaadin-context-menu>
element, and add a template
* element with a menu. Example:
*
* <vaadin-context-menu>
* <template>
* <vaadin-list-box>
* <vaadin-item>First menu item</vaadin-item>
* <vaadin-item>Second menu item</vaadin-item>
* </vaadin-list-box>
* </template>
*
* <p>This paragraph has the context menu provided in the above template.</p>
* <p>Another paragraph with the context menu.</p>
* </vaadin-context-menu>
*
* In case if you do not want to wrap the page content, you can listen for
* events on an element outside the <vaadin-context-menu>
by setting the
* listenOn
property:
*
* <vaadin-context-menu id="customListener">
* <template>
* <vaadin-list-box>
* ...
* </vaadin-list-box>
* </template>
* </vaadin-context-menu>
*
* <div id="menuListener">The element that listens for the context menu.</div>
*
* const contextMenu = document.querySelector
* ('vaadin-context-menu#customListener');
* contextMenu.listenOn = document.querySelector('#menuListener');
*
* Filtering Menu Targets
* By default, the listener element and all its descendants open the context
* menu. You can filter the menu targets to a smaller set of elements inside
* the listener element by setting the selector
property.
*
* In the following example, only the elements matching .has-menu
will open the context menu:
*
*
<vaadin-context-menu selector=".has-menu">
* <template>
* <vaadin-list-box>
* ...
* </vaadin-list-box>
* </template>
*
* <p class="has-menu">This paragraph opens the context menu</p>
* <p>This paragraph does not open the context menu</p>
* </vaadin-context-menu>
*
* Menu Context
* You can bind to the following properties in the menu template:
*
*
* target
is the menu opening event target, which is the element that
* the user has called the context menu for
* detail
is the menu opening event detail
*
* In the following example, the menu item text is composed with the contents
* of the element that opened the menu:
*
* <vaadin-context-menu selector="li">
* <template>
* <vaadin-list-box>
* <vaadin-item>The menu target: [[target.textContent]]</vaadin-item>
* </vaadin-list-box>
* </template>
*
* <ul>
* <li>Foo</li>
* <li>Bar</li>
* <li>Baz</li>
* </ul>
* </vaadin-context-menu>
*
* Styling
* <vaadin-context-menu>
uses <vaadin-context-menu-overlay>
internal
* themable component as the actual visible context menu overlay. See
* See
* <vaadin-overlay>
documentation
* for <vaadin-context-menu-overlay>
parts.
*
* See
* ThemableMixin – how to apply styles for shadow parts
*
* Note: the theme
attribute value set on <vaadin-context-menu>
is
* propagated to the internal <vaadin-context-menu-overlay>
component.
* In case of using nested menu items, the theme
attribute is also propagated
* to internal vaadin-context-menu-list-box
and vaadin-context-menu-item
's.
*/
@NpmPackage(
name = "@vaadin/vaadin",
version = Vaadin.VERSION
)
@Import(
module = "@vaadin/vaadin-context-menu/theme/lumo/vaadin-context-menu.js"
)
public interface ContextMenuElement
extends HTMLElement, ElementMixin, ThemePropertyMixin, ItemsMixin, GestureEventListeners {
static String TAGNAME() {
return "vaadin-context-menu";
}
/**
* CSS selector that can be used to target any child element
* of the context menu to listen for `openOn` events.
*/
@Nullable
@JSProperty
String getSelector();
/**
* CSS selector that can be used to target any child element
* of the context menu to listen for `openOn` events.
*/
@JSProperty
void setSelector(String selector);
/**
* True if the overlay is currently displayed.
*/
@JSProperty
boolean isOpened();
/**
* Event name to listen for opening the context menu.
*/
@Nullable
@JSProperty
String getOpenOn();
/**
* Event name to listen for opening the context menu.
*/
@JSProperty
void setOpenOn(String openOn);
/**
* The target element that's listened to for context menu opening events.
* By default the vaadin-context-menu listens to the target's vaadin-contextmenu
* events.
*/
@JSProperty
HTMLElement getListenOn();
/**
* The target element that's listened to for context menu opening events.
* By default the vaadin-context-menu listens to the target's vaadin-contextmenu
* events.
*/
@JSProperty
void setListenOn(HTMLElement listenOn);
/**
* Event name to listen for closing the context menu.
*/
@Nullable
@JSProperty
String getCloseOn();
/**
* Event name to listen for closing the context menu.
*/
@JSProperty
void setCloseOn(String closeOn);
/**
* Custom function for rendering the content of the menu overlay.
* Receives three arguments:
*
*
* root
The root container DOM element. Append your content to it.
* contextMenu
The reference to the <vaadin-context-menu>
element.
* context
The object with the menu context, contains:
*
* context.target
the target of the menu opening event,
* context.detail
the menu opening event detail.
*
*
*
*/
@Nullable
@JSProperty
ContextMenuRenderer getRenderer();
/**
* Custom function for rendering the content of the menu overlay.
* Receives three arguments:
*
*
* root
The root container DOM element. Append your content to it.
* contextMenu
The reference to the <vaadin-context-menu>
element.
* context
The object with the menu context, contains:
*
* context.target
the target of the menu opening event,
* context.detail
the menu opening event detail.
*
*
*
*/
@JSProperty
void setRenderer(ContextMenuRenderer renderer);
/**
* Manually invoke existing renderer.
*/
void render();
/**
* Closes the overlay.
*/
void close();
/**
* Opens the overlay.
*
* @param e used as the context for the menu. Overlay coordinates are taken from this event.
*/
void open(Event e);
}