Search code examples
javavaadinvaadin7

Hide UI component in sub-view


I am trying to find the best way to hide a UI component in a specific sub View but let it be visible in others.

This is the code of my UI class:

public class DCSAdminUI extends UI {

    private static final long serialVersionUID = 1L;

    VerticalLayout root = new VerticalLayout();
    CssLayout content = new CssLayout();
    private MenuBar nav = new MenuBar();
    private MenuBar userNav = new MenuBar();
    private Navigator navigator;

    public static final String PERSISTENCE_UNIT = "mystery";

    public static DCSAdminUI getCurrent() {
        return (DCSAdminUI) UI.getCurrent();
    }

    public static DCSAdminUI getApplication() {
        return (DCSAdminUI) getApplication();
    }

    @Override
    protected void init(VaadinRequest request) {

        Page.getCurrent().setTitle("Admin");

        initLayout();
        initNav();
        initUserNav();
        getUserOrg();

        navigator = new Navigator(this, content);

        LoginUI loginView = new LoginUI();
        navigator.addView("", loginView);
        navigator.addView(ActivitiesUI.VIEW_NAME.toLowerCase(), new ActivitiesUI());
        navigator.addView(BookingsUI.VIEW_NAME.toLowerCase(), new BookingsUI());
        navigator.addView(OperatorsUI.VIEW_NAME.toLowerCase(), new OperatorsUI());
        navigator.addView(TeamUI.VIEW_NAME.toLowerCase(), new TeamUI());
        navigator.addView(OrganisationsUI.VIEW_NAME.toLowerCase(), new OrganisationsUI());
        navigator.addView(PlayersUI.VIEW_NAME.toLowerCase(), new PlayersUI());


        navigator.addViewChangeListener(new ViewChangeListener() {

            private static final long serialVersionUID = 1L;

            @Override
            public boolean beforeViewChange(ViewChangeEvent event) {
                return true;
            }

            @Override
            public void afterViewChange(ViewChangeEvent event) {
                if (event.getViewName() == null || event.getViewName().equals("")) {
                    updateNavSelection("activities");
                } else {
                    updateNavSelection(event.getViewName());
                }
            }
        }); 

    }

    private void initLayout() {
        root.setSizeFull();
        setContent(root);

        HorizontalLayout topbar = new HorizontalLayout();
        topbar.addStyleName("topbar");
        topbar.setWidth("100%");
        topbar.setSpacing(true);
        root.addComponent(topbar);

        content.setSizeFull();
        root.addComponent(content);
        root.setExpandRatio(content, 1);

        nav.addStyleName("nav");
        topbar.addComponent(nav);

        userNav.addStyleName("user-nav");
        topbar.addComponent(userNav);
        topbar.setComponentAlignment(userNav, Alignment.TOP_CENTER);
    }

    private void initNav() {
        nav.addItem(ActivitiesUI.VIEW_NAME.toUpperCase(Locale.GERMANY), navCommand).setCheckable(true);
        nav.addItem(BookingsUI.VIEW_NAME.toUpperCase(Locale.GERMANY), navCommand).setCheckable(true);
        nav.addItem(PlayersUI.VIEW_NAME.toUpperCase(Locale.GERMANY), navCommand).setCheckable(true);
        nav.addItem(TeamUI.VIEW_NAME.toUpperCase(Locale.GERMANY), navCommand).setCheckable(true);
        nav.addItem(OperatorsUI.VIEW_NAME.toUpperCase(Locale.GERMANY), navCommand).setCheckable(true);
        nav.addItem(OrganisationsUI.VIEW_NAME.toUpperCase(Locale.GERMANY), navCommand).setCheckable(true);
    }

    private void initUserNav() {
        MenuItem username = userNav.addItem("DCS User", FontAwesome.CHEVRON_DOWN, null);
        username.addItem("Edit Profile", null);
        username.addItem("Settings", null);
        username.addSeparator();
        username.addItem("Logout", null);
    }

    private Command navCommand = new Command() {

        private static final long serialVersionUID = 1L;

        @Override
        public void menuSelected(MenuItem selectedItem) {
            updateNavSelection(selectedItem.getText());
            navigator.navigateTo(selectedItem.getText().toLowerCase());
        }
    };

    private void updateNavSelection(String selectedItem) {
        for (MenuItem item : nav.getItems()) {
            item.setChecked(item.getText().toLowerCase()
                    .equals(selectedItem.toLowerCase()));
        }
    }

    void navigateTo(String menuItem) {
        for (MenuItem item : nav.getItems()) {
            if (item.getText().toLowerCase().equals(menuItem.toLowerCase())) {
                navCommand.menuSelected(item);
                return;
            }
        }
    }

}

The UI component in question here is topbar in the initLayout() method which is the app's main MenuBar() but I want this to appear only for authenticated users, meaning that it should be hidden in LoginUI() (the default View class for now). My search efforts have led me to understand that I can use multiple UI classes but that this would eventually become tedious to maintain and that is why I would ideally like to find a way of hiding the topbar component in specific View classes


Solution

  • You can implement a ViewChangeListener in your UI and deal with your navbar in the beforeViewChange. Since this can also reject entering a View you can send anon users to the login too.