From 718bb4562fdadccb81de9ab1cd0ce9d98de95435 Mon Sep 17 00:00:00 2001 From: kate Date: Fri, 22 Jun 2018 23:11:50 +0200 Subject: [PATCH] org tree panel for new assignment popup panel --- .../AbstractAssignmentPopupTabPanel.java | 27 +++- .../gui/api/component/AssignmentPopup.java | 83 +++++++++--- .../FocusTypeAssignmentPopupTabPanel.html | 1 + .../FocusTypeAssignmentPopupTabPanel.java | 7 +- .../OrgTypeAssignmentPopupTabPanel.html | 22 ++++ .../OrgTypeAssignmentPopupTabPanel.java | 118 ++++++++++++++++++ .../api/component/PopupObjectListPanel.java | 10 +- .../ResourceTypeAssignmentPopupTabPanel.java | 2 +- .../admin/orgs/OrgTreeAssignablePanel.java | 41 +++++- .../web/page/admin/orgs/OrgTreePanel.java | 23 +++- 10 files changed, 302 insertions(+), 32 deletions(-) create mode 100644 gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/api/component/OrgTypeAssignmentPopupTabPanel.html create mode 100644 gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/api/component/OrgTypeAssignmentPopupTabPanel.java diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/api/component/AbstractAssignmentPopupTabPanel.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/api/component/AbstractAssignmentPopupTabPanel.java index 0f3261cd2d2..65430a1cb48 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/api/component/AbstractAssignmentPopupTabPanel.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/api/component/AbstractAssignmentPopupTabPanel.java @@ -26,6 +26,7 @@ import com.evolveum.midpoint.util.logging.Trace; import com.evolveum.midpoint.util.logging.TraceManager; import com.evolveum.midpoint.web.component.util.SelectableBean; +import com.evolveum.midpoint.web.component.util.VisibleEnableBehaviour; import com.evolveum.midpoint.web.security.SecurityUtils; import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectType; import com.evolveum.midpoint.xml.ns._public.common.common_3.RoleType; @@ -50,10 +51,12 @@ public abstract class AbstractAssignmentPopupTabPanel exte private static final String OPERATION_LOAD_ASSIGNABLE_ROLES = DOT_CLASS + "loadAssignableRoles"; private ObjectTypes type; + protected List selectedObjects; - public AbstractAssignmentPopupTabPanel(String id, ObjectTypes type){ + public AbstractAssignmentPopupTabPanel(String id, ObjectTypes type, List selectedObjects){ super(id); this.type = type; + this.selectedObjects = selectedObjects; } @Override @@ -64,15 +67,19 @@ protected void onInitialize(){ } private PopupObjectListPanel initObjectListPanel(){ - PopupObjectListPanel listPanel = new PopupObjectListPanel(ID_OBJECT_LIST_PANEL, (Class)type.getClassDefinition(), true, getPageBase()) { + PopupObjectListPanel listPanel = new PopupObjectListPanel(ID_OBJECT_LIST_PANEL, (Class)type.getClassDefinition(), + null, true, getPageBase(), selectedObjects) { private static final long serialVersionUID = 1L; @Override protected void onUpdateCheckbox(AjaxRequestTarget target) { -// if (type.equals(ObjectTypes.RESOURCE)) { -// target.add(AbstractAssignmentPopupTabPanel.this); -// } + if (selectedObjects == null){ + selectedObjects = new ArrayList<>(); + } + selectedObjects.clear(); + selectedObjects.addAll(getSelectedObjectsList()); + onSelectionPerformed(target); } @@ -111,7 +118,13 @@ protected ObjectQuery addFilterToContentQuery(ObjectQuery query) { } }; + listPanel.add(new VisibleEnableBehaviour(){ + private static final long serialVersionUID = 1L; + public boolean isVisible(){ + return isObjectListPanelVisible(); + } + }); listPanel.setOutputMarkupId(true); return listPanel; } @@ -132,6 +145,10 @@ protected IModel getObjectSelectCheckBoxEnableModel(IModel extends BasePanel implements private static final String ID_FORM = "form"; private FocusTypeAssignmentPopupTabPanel rolesTabPanel; - private FocusTypeAssignmentPopupTabPanel orgsTabPanel; + private OrgTypeAssignmentPopupTabPanel orgsTabPanel; + private OrgTypeAssignmentPopupTabPanel orgTreeViewTabPanel; private FocusTypeAssignmentPopupTabPanel servicesTabPanel; private FocusTypeAssignmentPopupTabPanel usersTabPanel; private ResourceTypeAssignmentPopupTabPanel resourcesTabPanel; + private List selectedOrgsList = new ArrayList<>(); + private boolean isOrgTreeView; public AssignmentPopup(String id){ super(id); @@ -89,10 +91,11 @@ public void onClick(AjaxRequestTarget target) { newAssignmentsList.add(newAssignment); }); } - if (orgsTabPanel != null){ - List selectedOrgs = orgsTabPanel.getSelectedObjectsList(); - QName relation = orgsTabPanel.getRelationValue(); - selectedOrgs.forEach(selectedOrg -> { + //todo synchronize relation drop down between 2 org tabs + if (orgsTabPanel != null || orgTreeViewTabPanel != null){ + QName relation = orgsTabPanel != null ? orgsTabPanel.getRelationValue() : + (orgTreeViewTabPanel != null ? orgTreeViewTabPanel.getRelationValue() : SchemaConstants.ORG_DEFAULT); + selectedOrgsList.forEach(selectedOrg -> { ObjectReferenceType ref = ObjectTypeUtil.createObjectRef(selectedOrg, relation); AssignmentType newAssignment = new AssignmentType(); newAssignment.setTargetRef(ref); @@ -135,6 +138,7 @@ public void onClick(AjaxRequestTarget target) { private List createAssignmentTabs() { List tabs = new ArrayList<>(); + //TODO check authorization for each tab VisibleEnableBehaviour authorization = new VisibleEnableBehaviour(){ }; @@ -164,6 +168,7 @@ public String getCount() { } }); + IModel isOrgTreeViewModel = getOrgTreeViewModel(); tabs.add( new CountablePanelTab(getPageBase().createStringResource("ObjectTypes.ORG"), authorization) { @@ -171,7 +176,7 @@ public String getCount() { @Override public WebMarkupContainer createPanel(String panelId) { - orgsTabPanel = new FocusTypeAssignmentPopupTabPanel(panelId, ObjectTypes.ORG){ + orgsTabPanel = new OrgTypeAssignmentPopupTabPanel(panelId, isOrgTreeViewModel, selectedOrgsList){ private static final long serialVersionUID = 1L; @Override @@ -180,18 +185,42 @@ protected void onSelectionPerformed(AjaxRequestTarget target){ } }; + orgsTabPanel.setOutputMarkupId(true); return orgsTabPanel; } @Override public String getCount() { - if (orgsTabPanel == null){ - return "0"; - } - return Integer.toString(orgsTabPanel.getObjectListPanel().getSelectedObjectsCount()); + return Integer.toString(selectedOrgsList.size()); } }); + + tabs.add(new CountablePanelTab(getPageBase().createStringResource("TypedAssignablePanel.orgTreeView"), authorization) { + + private static final long serialVersionUID = 1L; + + @Override + public WebMarkupContainer createPanel(String panelId) { + orgTreeViewTabPanel = new OrgTypeAssignmentPopupTabPanel(panelId, isOrgTreeViewModel, selectedOrgsList){ + private static final long serialVersionUID = 1L; + + @Override + protected void onOrgTreeCheckBoxSelectionPerformed(AjaxRequestTarget target){ + tabLabelPanelUpdate(target); + } + + }; + orgTreeViewTabPanel.setOutputMarkupId(true); + return orgTreeViewTabPanel; + } + + @Override + public String getCount() { + return Integer.toString(selectedOrgsList.size()); + } + }); + tabs.add( new CountablePanelTab(getPageBase().createStringResource("ObjectTypes.SERVICE"), authorization) { @@ -251,17 +280,35 @@ public String getCount() { return tabs; } + private IModel getOrgTreeViewModel(){ + //the index of the Org Tree panel is 2 + int orgTreeViewTabIndex = 2; + return new IModel() { + private static final long serialVersionUID = 1L; + + @Override + public Boolean getObject() { + isOrgTreeView = getTabbedPanel() != null && getTabbedPanel().getSelectedTab() == orgTreeViewTabIndex; + return isOrgTreeView; + } + + @Override + public void setObject(Boolean object) { + isOrgTreeView = object; + } + + @Override + public void detach() { + + } + }; + } + private TabbedPanel getTabbedPanel(){ return (TabbedPanel) get(ID_FORM).get(ID_TABS_PANEL); } private void tabLabelPanelUpdate(AjaxRequestTarget target){ -// TabbedPanel tabbedPanel = getTabbedPanel(); -// Loop tabs = tabbedPanel.getTabsPanel(); -// tabs.forEach(tabPanel -> { -// target.add(tabPanel.get(tabbedPanel.getTabLinkPanelId())); -// }); - target.add(getTabbedPanel()); } diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/api/component/FocusTypeAssignmentPopupTabPanel.html b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/api/component/FocusTypeAssignmentPopupTabPanel.html index 6877a08ae86..29982b0c06e 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/api/component/FocusTypeAssignmentPopupTabPanel.html +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/api/component/FocusTypeAssignmentPopupTabPanel.html @@ -17,6 +17,7 @@ +
diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/api/component/FocusTypeAssignmentPopupTabPanel.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/api/component/FocusTypeAssignmentPopupTabPanel.java index 4197c319b25..e50d9d83d3e 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/api/component/FocusTypeAssignmentPopupTabPanel.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/api/component/FocusTypeAssignmentPopupTabPanel.java @@ -29,6 +29,7 @@ import org.apache.wicket.model.Model; import javax.xml.namespace.QName; +import java.util.ArrayList; import java.util.List; /** @@ -45,7 +46,11 @@ public class FocusTypeAssignmentPopupTabPanel extends Abstr private static final Trace LOGGER = TraceManager.getTrace(FocusTypeAssignmentPopupTabPanel.class); public FocusTypeAssignmentPopupTabPanel(String id, ObjectTypes type){ - super(id, type); + this(id, type, new ArrayList<>()); + } + + public FocusTypeAssignmentPopupTabPanel(String id, ObjectTypes type, List selectedObjects){ + super(id, type, selectedObjects); } @Override diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/api/component/OrgTypeAssignmentPopupTabPanel.html b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/api/component/OrgTypeAssignmentPopupTabPanel.html new file mode 100644 index 00000000000..9a986df9673 --- /dev/null +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/api/component/OrgTypeAssignmentPopupTabPanel.html @@ -0,0 +1,22 @@ + + + + + +
+
+ diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/api/component/OrgTypeAssignmentPopupTabPanel.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/api/component/OrgTypeAssignmentPopupTabPanel.java new file mode 100644 index 00000000000..47198a138be --- /dev/null +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/api/component/OrgTypeAssignmentPopupTabPanel.java @@ -0,0 +1,118 @@ +/* + * Copyright (c) 2010-2018 Evolveum + * + * 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 com.evolveum.midpoint.gui.api.component; + +import com.evolveum.midpoint.schema.constants.ObjectTypes; +import com.evolveum.midpoint.web.component.util.SelectableBean; +import com.evolveum.midpoint.web.component.util.VisibleEnableBehaviour; +import com.evolveum.midpoint.web.page.admin.orgs.OrgTreeAssignablePanel; +import com.evolveum.midpoint.xml.ns._public.common.common_3.OrgType; +import org.apache.wicket.ajax.AjaxRequestTarget; +import org.apache.wicket.model.IModel; +import org.apache.wicket.model.Model; + +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; + +/** + * Created by honchar + */ +public class OrgTypeAssignmentPopupTabPanel extends FocusTypeAssignmentPopupTabPanel{ + + private static final long serialVersionUID = 1L; + + private static final String ID_ORG_TREE_VIEW_PANEL = "orgTreeViewPanel"; + + private IModel isOrgTreeViewModel; + + public OrgTypeAssignmentPopupTabPanel(String id, IModel isOrgTreeViewModel, List selectedOrgs){ + super(id, ObjectTypes.ORG, selectedOrgs); + this.isOrgTreeViewModel = isOrgTreeViewModel; + } + + @Override + protected void onInitialize() { + super.onInitialize(); + IModel> selectedOrgsModel = new IModel>() { + private static final long serialVersionUID = 1L; + + @Override + public List getObject() { + return selectedObjects; + } + + @Override + public void setObject(List orgTypes) { + selectedObjects = orgTypes; + } + + @Override + public void detach() { + + } + }; + OrgTreeAssignablePanel orgTreePanel = new OrgTreeAssignablePanel( + ID_ORG_TREE_VIEW_PANEL, true, getPageBase(), selectedOrgsModel) { + private static final long serialVersionUID = 1L; + + @Override + protected void onOrgTreeCheckBoxSelectionPerformed(AjaxRequestTarget target, IModel> rowModel) { + if (rowModel != null && rowModel.getObject() != null) { + if (selectedObjects == null) { + selectedObjects = new ArrayList<>(); + } + boolean isAlreadyInList = false; + Iterator it = selectedObjects.iterator(); + while (it.hasNext()){ + OrgType org = it.next(); + if (org.getOid().equals(rowModel.getObject().getValue().getOid())) { + isAlreadyInList = true; + it.remove(); + } + } + if (!isAlreadyInList){ + selectedObjects.add(rowModel.getObject().getValue()); + } + } + OrgTypeAssignmentPopupTabPanel.this.onOrgTreeCheckBoxSelectionPerformed(target); + } + + @Override + protected boolean isAssignButtonVisible(){ + return false; + } + }; + orgTreePanel.setOutputMarkupId(true); + orgTreePanel.add(new VisibleEnableBehaviour(){ + private static final long serialVersionUID = 1L; + + @Override + public boolean isVisible(){ + return isOrgTreeViewModel != null && isOrgTreeViewModel.getObject(); + } + }); + add(orgTreePanel); + + } + + @Override + protected boolean isObjectListPanelVisible(){ + return isOrgTreeViewModel == null || !isOrgTreeViewModel.getObject(); + } + + protected void onOrgTreeCheckBoxSelectionPerformed(AjaxRequestTarget target){} +} diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/api/component/PopupObjectListPanel.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/api/component/PopupObjectListPanel.java index 02d80c088a8..f77b3366980 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/api/component/PopupObjectListPanel.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/api/component/PopupObjectListPanel.java @@ -79,13 +79,19 @@ protected IModel getEnabled(IModel> rowModel) { @Override protected IModel getCheckBoxValueModel(IModel> rowModel){ IModel model = super.getCheckBoxValueModel(rowModel); - if (selectedObjects != null && selectedObjects.size() > 0) { + if (selectedObjects != null && rowModel != null) { + boolean isInList = false; for (O selectedObject : selectedObjects){ if (rowModel.getObject().getValue().getOid().equals(selectedObject.getOid())){ - model.setObject(true); + isInList = true; break; } } + if (isInList){ + model.setObject(true); + } else { + model.setObject(false); + } } return model; } diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/api/component/ResourceTypeAssignmentPopupTabPanel.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/api/component/ResourceTypeAssignmentPopupTabPanel.java index fd087382848..abcc72dd577 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/api/component/ResourceTypeAssignmentPopupTabPanel.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/api/component/ResourceTypeAssignmentPopupTabPanel.java @@ -60,7 +60,7 @@ public class ResourceTypeAssignmentPopupTabPanel extends AbstractAssignmentPopup private static final Trace LOGGER = TraceManager.getTrace(ResourceTypeAssignmentPopupTabPanel.class); public ResourceTypeAssignmentPopupTabPanel(String id){ - super(id, ObjectTypes.RESOURCE); + super(id, ObjectTypes.RESOURCE, new ArrayList<>()); } @Override diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/orgs/OrgTreeAssignablePanel.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/orgs/OrgTreeAssignablePanel.java index 79446f92e6f..37fe07966d1 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/orgs/OrgTreeAssignablePanel.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/orgs/OrgTreeAssignablePanel.java @@ -18,9 +18,11 @@ import java.util.ArrayList; import java.util.List; +import com.evolveum.midpoint.gui.api.model.LoadableModel; import org.apache.wicket.Component; import org.apache.wicket.ajax.AjaxRequestTarget; import org.apache.wicket.markup.html.panel.Panel; +import org.apache.wicket.model.IModel; import org.apache.wicket.model.Model; import org.apache.wicket.model.StringResourceModel; @@ -47,10 +49,16 @@ public class OrgTreeAssignablePanel extends BasePanel implements Popupa private static final String ID_ORG_TABS = "orgTabs"; private static final String ID_ASSIGN = "assign"; private boolean selectable; + private IModel> selectedOrgsListModel; public OrgTreeAssignablePanel(String id, boolean selectable, PageBase parentPage) { + this(id, selectable, parentPage, null); + } + + public OrgTreeAssignablePanel(String id, boolean selectable, PageBase parentPage, IModel> selectedOrgsListModel){ super(id); this.selectable = selectable; + this.selectedOrgsListModel = selectedOrgsListModel; setParent(parentPage); initLayout(); } @@ -67,9 +75,28 @@ protected Panel createTreePanel(String id, Model model, PageBase pageBas private static final long serialVersionUID = 1L; @Override - protected void selectTreeItemPerformed(SelectableBean selected, - AjaxRequestTarget target) { - onItemSelect(selected, target); + protected IModel getCheckBoxValueModel(IModel> rowModel){ + return new LoadableModel(true) { + + @Override + public Boolean load() { + boolean isSelected = false; + if (selectedOrgsListModel != null && selectedOrgsListModel.getObject() != null) { + for (OrgType org : selectedOrgsListModel.getObject()) + if (rowModel.getObject().getValue().getOid().equals(org.getOid())){ + isSelected = true; + break; + } + } + return isSelected; + + } + }; + } + + @Override + protected void onOrgTreeCheckBoxSelectionPerformed(AjaxRequestTarget target, IModel> rowModel){ + OrgTreeAssignablePanel.this.onOrgTreeCheckBoxSelectionPerformed(target, rowModel); } }; @@ -110,13 +137,17 @@ public void onClick(AjaxRequestTarget target) { @Override public boolean isVisible() { - return selectable; + return isAssignButtonVisible(); } }); add(assignButton); } + protected boolean isAssignButtonVisible(){ + return selectable; + } + protected void assignSelectedOrgPerformed(List selectedOrgs, AjaxRequestTarget target) { } @@ -125,6 +156,8 @@ protected void onItemSelect(SelectableBean selected, AjaxRequestTarget } + protected void onOrgTreeCheckBoxSelectionPerformed(AjaxRequestTarget target, IModel> rowModel){} + @Override public int getWidth() { return 900; diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/orgs/OrgTreePanel.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/orgs/OrgTreePanel.java index a4d86635fc1..135cb724aab 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/orgs/OrgTreePanel.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/orgs/OrgTreePanel.java @@ -24,6 +24,7 @@ import org.apache.wicket.AttributeModifier; import org.apache.wicket.Component; import org.apache.wicket.ajax.AjaxRequestTarget; +import org.apache.wicket.extensions.markup.html.repeater.data.table.DataTable; import org.apache.wicket.extensions.markup.html.repeater.data.table.IColumn; import org.apache.wicket.extensions.markup.html.repeater.tree.ISortableTreeProvider; import org.apache.wicket.extensions.markup.html.repeater.tree.TableTree; @@ -60,6 +61,7 @@ import com.evolveum.midpoint.web.session.SessionStorage; import com.evolveum.midpoint.xml.ns._public.common.common_3.AdminGuiConfigurationType; import com.evolveum.midpoint.xml.ns._public.common.common_3.OrgType; +import org.apache.wicket.model.PropertyModel; public class OrgTreePanel extends AbstractTreeTablePanel { private static final long serialVersionUID = 1L; @@ -149,7 +151,20 @@ protected List createInlineMenuItems(OrgType org) { List, String>> columns = new ArrayList<>(); if (selectable) { - columns.add(new CheckBoxHeaderColumn<>()); + columns.add(new CheckBoxHeaderColumn>() { + private static final long serialVersionUID = 1L; + + @Override + protected IModel getCheckBoxValueModel(IModel> rowModel) { + return OrgTreePanel.this.getCheckBoxValueModel(rowModel); + } + + @Override + protected void onUpdateRow(AjaxRequestTarget target, DataTable table, IModel> rowModel) { + super.onUpdateRow(target, table, rowModel); + onOrgTreeCheckBoxSelectionPerformed(target, rowModel); + } + }); } columns.add(new TreeColumn<>( @@ -426,4 +441,10 @@ protected OrgTreeStateStorage getOrgTreeStateStorage(){ public int getSelectedTabId(OrgTreeStateStorage storage){ return storage.getSelectedTabId(); } + + protected IModel getCheckBoxValueModel(IModel> rowModel){ + return Model.of(rowModel.getObject().isSelected()); + } + + protected void onOrgTreeCheckBoxSelectionPerformed(AjaxRequestTarget target, IModel> rowModel){} }