Tabsheet wishes

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

If you have enhancement / feature requests, please add a ticket to the github repository. The forum is more for community Q&A and not reliable regarding feature requests.