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 }));
}
}
}