Dynamic Popup/Context Menu (for example in a grid)

GridContextMenu docu: https://vaadin.com/docs/latest/components/grid#context-menu

You can adjust the GridContextMenu with:

  • setDynamicContentHandler (called before menu is opened, changes will be sent to client)
  • addGridContextMenuOpenedListener (called after menu is opened in client)

Just setup the content of the item on each right click. We do something like this:

	Registration filterItemClickReg = null;

	public setup() {

		var test = new GridContextMenu<Bo>();
		var editItem = test.addItem("Edit");
		var filterItem = test.addItem("Column Filter");
		test.setDynamicContentHandler(object -> {
			editItem.setEnabled(object != null);

			Column<Bo> column = null; // getting the column here can i post on another day 
			filterItem.setText("Add filter for column " + column.getHeaderText());

			if (filterItemClickReg != null) filterItemClickReg.remove();
			filterItemClickReg = filterItem.addMenuItemClickListener(micEvent-> {});

			// return true, when the context menu should be opened
			return object != null; 
		});
		test.addGridContextMenuOpenedListener(gcmoEvent -> {
			Optional<String> clickedColumn = gcmoEvent.getColumnId();
			Optional<Bo> clickedItem = gcmoEvent.getItem();
		});
	}

Our menu button column:

actionColumn = this.grid.addColumn(MenuIconLitRenderer.<Bo>create());

...

public static class MenuIconLitRenderer {
	public static <SOURCE> LitRenderer<SOURCE> create() {
		return LitRenderer.<SOURCE>of("<div class=\"action-column-wrapper\">"
				+ "<vaadin-icon part=\"icon\" icon=\"fas:bars\" onclick=\"window.triggerGridRightClick(event)\"></vaadin-icon>" 
                                + "</div>");
	}
}

... 

// execute js in client once. This makes a left click to a right click event.
if (!window.triggerGridRightClick) {
	window.triggerGridRightClick = function(cEvent) {
		if (cEvent && cEvent.button == 0) {
			cEvent.target.dispatchEvent(new MouseEvent('contextmenu', { 'view': window, 'bubbles': true, 'cancelable': true }));
		}
	}
}