/* * Copyright 2016 Red Hat, Inc. and/or its affiliates. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.dashbuilder.client.navbar; import java.util.List; import javax.annotation.PostConstruct; import javax.enterprise.context.ApplicationScoped; import javax.enterprise.event.Observes; import javax.inject.Inject; import com.google.gwt.dom.client.AnchorElement; import com.google.gwt.dom.client.Document; import com.google.gwt.dom.client.LIElement; import com.google.gwt.dom.client.Style; import com.google.gwt.http.client.Request; import com.google.gwt.http.client.RequestBuilder; import com.google.gwt.http.client.RequestCallback; import com.google.gwt.http.client.RequestException; import com.google.gwt.http.client.Response; import com.google.gwt.user.client.Event; import com.google.gwt.user.client.ui.HTMLPanel; import com.google.gwt.user.client.ui.IsWidget; import org.dashbuilder.client.navigation.widget.NavMenuBarWidget; import org.dashbuilder.client.resources.i18n.AppConstants; import org.dashbuilder.navigation.NavItem; import org.dashbuilder.navigation.NavTree; import org.dashbuilder.navigation.workbench.NavWorkbenchCtx; import org.gwtbootstrap3.client.ui.Label; import org.jboss.errai.common.client.dom.DOMUtil; import org.jboss.errai.common.client.dom.Div; import org.jboss.errai.common.client.dom.Node; import org.jboss.errai.common.client.dom.Span; import org.jboss.errai.common.client.dom.UnorderedList; import org.jboss.errai.security.shared.api.Role; import org.jboss.errai.security.shared.api.identity.User; import org.jboss.errai.ui.shared.api.annotations.DataField; import org.jboss.errai.ui.shared.api.annotations.Templated; import org.uberfire.client.workbench.Header; import org.uberfire.client.workbench.Workbench; import org.uberfire.client.workbench.events.PerspectiveChange; import org.uberfire.mvp.Command; @Templated @ApplicationScoped public class TopMenuBar implements Header { @Inject @DataField Div navBar; @Inject @DataField Div navHeader; @Inject @DataField Div navTreeMenuBar; @Inject @DataField Span userNameSpan; @Inject @DataField UnorderedList roleList; NavMenuBarWidget menuBarWidget; User user; Command onItemSelectedCommand; Command onLogoutCommand; Workbench workbench; NavTree navTree; String currentPerspectiveId; public TopMenuBar() { } @Inject public TopMenuBar(NavMenuBarWidget menuBarWidget, User user, Workbench workbench) { this.menuBarWidget = menuBarWidget; this.user = user; this.workbench = workbench; } @PostConstruct private void init() { menuBarWidget.setSecure(true); currentPerspectiveId = workbench.getHomePerspectiveActivity().getIdentifier(); setNavHeaderHtml("banner/banner.html"); setUserName(user.getIdentifier()); setMenuBar(menuBarWidget); clearRoles(); for (Role role : user.getRoles()) { if (!role.getName().equals("IS_REMEMBER_ME")) { addRole(role.getName()); } } } @Override public String getId() { return "TopMenuBar"; } @Override public int getOrder() { return 2; } public NavItem getItemSelected() { return menuBarWidget.getItemSelected(); } public void setOnItemSelectedCommand(Command command) { this.onItemSelectedCommand = command; menuBarWidget.setOnItemSelectedCommand(onItemSelectedCommand); } public void setOnLogoutCommand(Command command) { this.onLogoutCommand = command; if (onLogoutCommand != null) { addLogout(); } } public void show(String navItemId) { // Show the target subtree from the global nav tree navTree = menuBarWidget.getNavigationManager().getNavTree().getItemAsTree(navItemId); menuBarWidget.setOnStaleCommand(() -> show(navItemId)); menuBarWidget.show(navTree); // Select the menu entry that points to the current perspective setSelectedItem(currentPerspectiveId); } public void setSelectedItem(String perspectiveId) { if (navTree != null) { List<NavItem> navItems = navTree.searchItems(NavWorkbenchCtx.perspective(perspectiveId)); if (!navItems.isEmpty()) { NavItem rootItem = navItems.get(0); while (rootItem.getParent() != null) { rootItem = rootItem.getParent(); } menuBarWidget.setSelectedItem(rootItem.getId()); } } } public void clearSelectedItem() { menuBarWidget.clearSelectedItem(); } // View logic public void setNavHeaderHtml(String htmlFile) { DOMUtil.removeAllChildren(navHeader); RequestBuilder rb = new RequestBuilder(RequestBuilder.GET, htmlFile); rb.setCallback(new RequestCallback() { public void onResponseReceived(Request request, Response response) { HTMLPanel html = new HTMLPanel(response.getText()); navHeader.appendChild((Node) html.getElement()); } public void onError(Request request, Throwable exception) { Label label = new Label(AppConstants.INSTANCE.logoBannerError()); navHeader.appendChild((Node) label.getElement()); } }); try { rb.send(); } catch ( RequestException re ) { Label label = new Label(AppConstants.INSTANCE.logoBannerError()); navHeader.appendChild((Node) label.getElement()); } } public void setUserName(String name) { userNameSpan.setTextContent(name); } public void setMenuBar(IsWidget widget) { DOMUtil.removeAllChildren(navTreeMenuBar); navTreeMenuBar.appendChild((Node) widget.asWidget().getElement()); } public void clearRoles() { DOMUtil.removeAllChildren(roleList); } public void addRole(String role) { this.addEntry(role, false); } public void addLogout() { this.addEntry(AppConstants.INSTANCE.logOut(), true); } private void addEntry(String entry, boolean logout) { AnchorElement anchor = Document.get().createAnchorElement(); anchor.setInnerText(entry); Event.sinkEvents(anchor, Event.ONCLICK); Event.setEventListener(anchor, event -> { if (Event.ONCLICK == event.getTypeInt()) { if (!logout) { onRoleClicked(entry); } else { onLogoutClicked(); } } }); LIElement li = Document.get().createLIElement(); li.getStyle().setCursor(Style.Cursor.POINTER); li.appendChild(anchor); roleList.appendChild((Node) li); } // View actions public void onRoleClicked(String role) { // Do nothing } public void onLogoutClicked() { if (onLogoutCommand != null) { onLogoutCommand.execute(); } } // Make sure the menu bar reacts to changes on the current perspective private void onCurrentPerspectiveChanged(@Observes final PerspectiveChange event) { currentPerspectiveId = event.getIdentifier(); clearSelectedItem(); setSelectedItem(currentPerspectiveId); } }