/* * 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.uberfire.ext.security.management.client.widgets.management.editor.acl.node; import javax.enterprise.context.Dependent; import javax.inject.Inject; import com.google.gwt.dom.client.Document; import com.google.gwt.dom.client.Style; import com.google.gwt.event.dom.client.ClickEvent; import com.google.gwt.event.dom.client.MouseOutEvent; import com.google.gwt.event.dom.client.MouseOverEvent; import com.google.gwt.user.client.ui.Composite; import com.google.gwt.user.client.ui.FlowPanel; import com.google.gwt.user.client.ui.IsWidget; import org.jboss.errai.common.client.dom.Anchor; import org.jboss.errai.common.client.dom.Div; import org.jboss.errai.common.client.dom.Span; import org.jboss.errai.ui.shared.api.annotations.DataField; import org.jboss.errai.ui.shared.api.annotations.EventHandler; import org.jboss.errai.ui.shared.api.annotations.Templated; import org.uberfire.ext.security.management.client.resources.i18n.SecurityManagementConstants; @Dependent @Templated public class MultiplePermissionNodeEditorView extends Composite implements MultiplePermissionNodeEditor.View { @Inject @DataField Div rootPanel; @Inject @DataField Div headerPanel; @Inject @DataField Anchor nodeAnchor; @Inject @DataField Div nodeAnchorPanel; @Inject @DataField Span nodeAnchorHelp; @Inject @DataField FlowPanel nodePermissions; @Inject @DataField Div collapsePanel; @Inject @DataField FlowPanel nodeChildren; @Inject @DataField Anchor addChildAnchor; @Inject @DataField Anchor clearChildrenAnchor; @Inject @DataField Div addChildPanel; @Inject @DataField Div clearChildrenPanel; @Inject @DataField Anchor cancelAnchor; @Inject @DataField FlowPanel childSelectorPanel; boolean expanded; boolean mouseOver; private MultiplePermissionNodeEditor presenter; @Override public void init(MultiplePermissionNodeEditor presenter) { this.presenter = presenter; String collapseId = Document.get().createUniqueId(); collapsePanel.setId(collapseId); nodeAnchor.setHref("#" + collapseId); addChildAnchor.setTextContent(" " + SecurityManagementConstants.INSTANCE.addChildException()); clearChildrenAnchor.setTextContent(" " + SecurityManagementConstants.INSTANCE.clearChildren()); } @Override public void setNodeName(String name) { nodeAnchor.setTextContent(name); } @Override public void setNodePanelWidth(int width) { nodeAnchorPanel.getStyle().setProperty("width", width + "px"); } @Override public void setNodeFullName(String name) { nodeAnchor.setTitle(name); nodeAnchorHelp.setTitle(name); nodeAnchorHelp.setClassName("acl-node-help-panel"); } @Override public void setResourceName(String name) { } @Override public void addPermission(PermissionSwitchToogle permissionSwitch) { nodePermissions.add(permissionSwitch); } @Override public void addChildEditor(PermissionNodeEditor editor, boolean dynamic) { if (dynamic) { editor.setLeftMargin(20); FlowPanel row = new FlowPanel(); org.gwtbootstrap3.client.ui.Anchor anchor = new org.gwtbootstrap3.client.ui.Anchor(); anchor.addStyleName("pf pficon-delete"); anchor.getElement().getStyle().setWidth(20, Style.Unit.PX); anchor.getElement().getStyle().setDisplay(Style.Display.TABLE_CELL); anchor.getElement().getStyle().setVerticalAlign(Style.VerticalAlign.MIDDLE); anchor.addClickHandler(event -> presenter.onRemoveChild(editor)); editor.asWidget().getElement().getStyle().setDisplay(Style.Display.TABLE_CELL); editor.asWidget().getElement().getStyle().setProperty("paddingLeft", "0px"); row.getElement().getStyle().setProperty("paddingLeft", "20px"); row.add(anchor); row.add(editor); nodeChildren.add(row); } else { nodeChildren.add(editor); } } @Override public void addChildSeparator() { FlowPanel separator = new FlowPanel(); separator.getElement().getStyle().setHeight(1, Style.Unit.PX); separator.getElement().getStyle().setBackgroundColor("lightgrey"); nodeChildren.add(separator); } @Override public boolean hasChildren() { return nodeChildren.getWidgetCount() > 0; } @Override public void clearChildren() { nodeChildren.clear(); } @Override public String getChildSelectorHint(String resourceName) { return SecurityManagementConstants.INSTANCE.selectResourceInstance(resourceName); } @Override public String getChildSearchHint(String resourceName) { return SecurityManagementConstants.INSTANCE.searchResourceInstance(resourceName); } @Override public String getChildrenNotFoundMsg(String resourceName) { return SecurityManagementConstants.INSTANCE.resourceInstanceNotFound(resourceName); } @Override public void setChildSelector(IsWidget childSelector) { childSelectorPanel.clear(); childSelectorPanel.add(childSelector); } @Override public void showChildSelector() { addChildPanel.getStyle().removeProperty("display"); } @Override public void hideChildSelector() { addChildPanel.getStyle().setProperty("display", "none"); } @Override public void setAddChildEnabled(boolean enabled) { if (enabled) { addChildAnchor.getStyle().removeProperty("display"); } else { addChildAnchor.getStyle().setProperty("display", "none"); } } @Override public void setClearChildrenEnabled(boolean enabled) { if (enabled) { clearChildrenAnchor.getStyle().removeProperty("display"); } else { clearChildrenAnchor.getStyle().setProperty("display", "none"); } } @Override public void setExpanded(boolean expanded) { this.expanded = expanded; this.mouseOver = false; String rootPanelCss = expanded ? "acl-root-panel-expanded" : "acl-root-panel"; String headerPanelCss = expanded ? "acl-header-panel-expanded" : "acl-header-panel"; rootPanel.setClassName(rootPanelCss); headerPanel.setClassName(headerPanelCss); } @EventHandler("nodeAnchor") private void onNodeClick(ClickEvent event) { presenter.onNodeClick(); } @EventHandler("addChildAnchor") private void onAddChild(ClickEvent event) { presenter.onAddChildStart(); } @EventHandler("clearChildrenAnchor") private void onClearChildren(ClickEvent event) { presenter.onClearChildren(); } @EventHandler("cancelAnchor") private void onCancelAdd(ClickEvent event) { presenter.onAddChildCancel(); } @EventHandler("headerPanel") private void onHeaderMouseOver(MouseOverEvent event) { if (!expanded) { headerPanel.setClassName("acl-header-panel-over"); mouseOver = true; } } @EventHandler("headerPanel") private void onHeaderMouseOut(MouseOutEvent event) { if (mouseOver) { headerPanel.setClassName("acl-header-panel"); mouseOver = false; } } }