Hi,
I made some changes for Tabsheet. Because i have to Validate the View before the Tab changes.
Here is my Code. Maybe it finds a way to the main branch.
package com.greenordi.crm.component;
import com.vaadin.flow.component.Component;
import com.vaadin.flow.component.tabs.Tab;
import com.vaadin.flow.component.tabs.TabSheet;
import com.vaadin.flow.shared.Registration;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
/**
* Extended TabSheet class that supports a pre-select event.
* With addPreSelectListener(), listeners can be registered that are notified
* before a tab switch (i.e. before calling setSelectedTab) and can prevent the switch via a veto.
*/
public class PreSelectTabSheet extends TabSheet {
private final List<PreSelectListener> preSelectListeners = new ArrayList<>();
public PreSelectTabSheet() {
}
@Override
public Tab add(Tab tab, Component content, int position) {
tab.getElement().addEventListener("click", event -> {
var preSelectEvent = new PreSelectEvent(this, getSelectedTab(), tab);
for (PreSelectListener listener : preSelectListeners) {
listener.onPreSelect(preSelectEvent);
if (!preSelectEvent.isVetoed()) {
setSelectedTab(tab);
}
}
}).stopPropagation();
return super.add(tab, content, position);
}
/**
* Adds a pre-select listener.
*
* @param listener the listener
* @return a Registration that can be used to remove the listener
*/
public Registration addPreSelectListener(PreSelectListener listener) {
Objects.requireNonNull(listener, "Listener must not be null");
preSelectListeners.add(listener);
return () -> preSelectListeners.remove(listener);
}
/**
* Interface for pre-select listeners.
*/
public interface PreSelectListener extends Serializable {
/**
* Called before the tab switch.
*
* @param event the PreSelectEvent
*/
void onPreSelect(PreSelectEvent event);
}
/**
* The event that is fired before the tab switch.
*/
public static class PreSelectEvent {
private final PreSelectTabSheet source;
private final Tab oldTab;
private final Tab newTab;
private boolean vetoed;
public PreSelectEvent(PreSelectTabSheet source, Tab oldTab, Tab newTab) {
this.source = source;
this.oldTab = oldTab;
this.newTab = newTab;
this.vetoed = false;
}
/**
* Returns the source (the PreSelectTabSheet).
*/
public PreSelectTabSheet getSource() {
return source;
}
/**
* Returns the currently selected (old) tab.
*/
public Tab getOldTab() {
return oldTab;
}
/**
* Returns the new, clicked tab.
*/
public Tab getNewTab() {
return newTab;
}
/**
* Returns true if a listener has prevented the switch.
*/
public boolean isVetoed() {
return vetoed;
}
/**
* Calling this method allows a listener to prevent the tab switch.
*/
public void veto() {
this.vetoed = true;
}
}
}