diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/assignment/AssignmentTablePanel.html b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/assignment/AssignmentTablePanel.html index 9c4bb18fcd7..145b82ad97b 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/assignment/AssignmentTablePanel.html +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/assignment/AssignmentTablePanel.html @@ -18,6 +18,7 @@
+
diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/assignment/AssignmentTablePanel.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/assignment/AssignmentTablePanel.java index b40f4ce4ea9..a7140209bdf 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/assignment/AssignmentTablePanel.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/assignment/AssignmentTablePanel.java @@ -37,7 +37,9 @@ import com.evolveum.midpoint.web.component.menu.cog.InlineMenuItemAction; import com.evolveum.midpoint.web.component.util.LoadableModel; import com.evolveum.midpoint.web.component.util.SimplePanel; +import com.evolveum.midpoint.web.page.admin.users.component.AssignableOrgPopupContent; import com.evolveum.midpoint.web.page.admin.users.component.AssignablePopupContent; +import com.evolveum.midpoint.web.page.admin.users.component.AssignableRolePopupContent; import com.evolveum.midpoint.web.page.admin.users.dto.UserDtoStatus; import com.evolveum.midpoint.xml.ns._public.common.common_3.*; @@ -78,6 +80,8 @@ public class AssignmentTablePanel extends SimplePanel> assignmentModel; @@ -212,11 +216,42 @@ protected void onUpdate(AjaxRequestTarget target) { private void initModalWindows(){ ModalWindow assignWindow = createModalWindow(ID_MODAL_ASSIGN, createStringResource("AssignmentTablePanel.modal.title.selectAssignment"), 1100, 560); - assignWindow.setContent(new AssignablePopupContent(assignWindow.getContentId()){ + assignWindow.setContent(new AssignableRolePopupContent(assignWindow.getContentId()){ @Override protected void addPerformed(AjaxRequestTarget target, List selected){ - addSelectedAssignablePerformed(target, selected); + addSelectedAssignablePerformed(target, selected, ID_MODAL_ASSIGN); + } + + @Override + public ObjectQuery getProviderQuery(){ + if(getExcludeOid() == null){ + return null; + } else { + ObjectQuery query = new ObjectQuery(); + List oids = new ArrayList<>(); + oids.add(getExcludeOid()); + + ObjectFilter oidFilter = InOidFilter.createInOid(oids); + query.setFilter(NotFilter.createNot(oidFilter)); + return query; + } + } + + @Override + protected void handlePartialError(OperationResult result) { + AssignmentTablePanel.this.handlePartialError(result); + } + }); + add(assignWindow); + + assignWindow = createModalWindow(ID_MODAL_ASSIGN_ORG, + createStringResource("AssignmentTablePanel.modal.title.selectAssignment"), 1100, 560); + assignWindow.setContent(new AssignableOrgPopupContent(assignWindow.getContentId()){ + + @Override + protected void addPerformed(AjaxRequestTarget target, List selected){ + addSelectedAssignablePerformed(target, selected, ID_MODAL_ASSIGN_ORG); } @Override @@ -289,7 +324,7 @@ public void onClick(AjaxRequestTarget target){ @Override public void onClick(AjaxRequestTarget target){ - showAssignablePopupPerformed(target, OrgType.class, OrgType.F_NAME); + showAssignableOrgPopupPerformed(target); } }); items.add(item); @@ -330,11 +365,18 @@ private void showModalWindow(String id, AjaxRequestTarget target){ private void showAssignablePopupPerformed(AjaxRequestTarget target, Class type, QName searchParameter){ ModalWindow modal = (ModalWindow) get(ID_MODAL_ASSIGN); - AssignablePopupContent content = (AssignablePopupContent)modal.get(modal.getContentId()); + AssignableRolePopupContent content = (AssignableRolePopupContent)modal.get(modal.getContentId()); content.setType(type); content.setSearchParameter(searchParameter); showModalWindow(ID_MODAL_ASSIGN, target); } + + private void showAssignableOrgPopupPerformed(AjaxRequestTarget target){ +ModalWindow modal = (ModalWindow) get(ID_MODAL_ASSIGN); +AssignableOrgPopupContent content = (AssignableOrgPopupContent)modal.get(modal.getContentId()); +content.setType(OrgType.class); +showModalWindow(ID_MODAL_ASSIGN, target); +} private void deleteAssignmentPerformed(AjaxRequestTarget target){ List selected = getSelectedAssignments(); @@ -363,8 +405,8 @@ private void deleteAssignmentConfirmedPerformed(AjaxRequestTarget target, List newAssignments){ - ModalWindow window = (ModalWindow) get(ID_MODAL_ASSIGN); + private void addSelectedAssignablePerformed(AjaxRequestTarget target, List newAssignments, String popupId){ + ModalWindow window = (ModalWindow) get(popupId); window.close(target); if(newAssignments.isEmpty()){ diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/org/OrgTreeTablePannel.html b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/org/OrgTreeTablePannel.html new file mode 100644 index 00000000000..685ce9ef973 --- /dev/null +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/org/OrgTreeTablePannel.html @@ -0,0 +1,53 @@ + + + + + + +
+
+
+
+ +
+
+
+
+
+ +
+
+
+
+ +
+
+
+
+
+
+
+
+ +
+
+
+ + +
+
+ \ No newline at end of file diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/org/OrgTreeTablePannel.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/org/OrgTreeTablePannel.java new file mode 100644 index 00000000000..0a7c3c41265 --- /dev/null +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/org/OrgTreeTablePannel.java @@ -0,0 +1,565 @@ +package com.evolveum.midpoint.web.component.org; + +import java.io.Serializable; +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; +import java.util.Set; + +import org.apache.commons.lang.StringUtils; +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.IColumn; +import org.apache.wicket.extensions.markup.html.repeater.data.table.PropertyColumn; +import org.apache.wicket.extensions.markup.html.repeater.tree.ISortableTreeProvider; +import org.apache.wicket.extensions.markup.html.repeater.tree.ITreeProvider; +import org.apache.wicket.extensions.markup.html.repeater.tree.TableTree; +import org.apache.wicket.extensions.markup.html.repeater.tree.table.TreeColumn; +import org.apache.wicket.extensions.markup.html.repeater.tree.theme.WindowsTheme; +import org.apache.wicket.extensions.markup.html.tabs.ITab; +import org.apache.wicket.markup.head.IHeaderResponse; +import org.apache.wicket.markup.head.OnDomReadyHeaderItem; +import org.apache.wicket.markup.html.WebMarkupContainer; +import org.apache.wicket.markup.html.form.Form; +import org.apache.wicket.markup.repeater.Item; +import org.apache.wicket.model.AbstractReadOnlyModel; +import org.apache.wicket.model.IModel; +import org.apache.wicket.model.Model; +import org.apache.wicket.request.mapper.parameter.PageParameters; + +import com.evolveum.midpoint.model.api.ModelExecuteOptions; +import com.evolveum.midpoint.model.api.ModelService; +import com.evolveum.midpoint.prism.PrismContext; +import com.evolveum.midpoint.prism.PrismObject; +import com.evolveum.midpoint.prism.PrismProperty; +import com.evolveum.midpoint.prism.PrismPropertyDefinition; +import com.evolveum.midpoint.prism.PrismReference; +import com.evolveum.midpoint.prism.PrismReferenceDefinition; +import com.evolveum.midpoint.prism.PrismReferenceValue; +import com.evolveum.midpoint.prism.delta.ChangeType; +import com.evolveum.midpoint.prism.delta.ObjectDelta; +import com.evolveum.midpoint.prism.delta.ReferenceDelta; +import com.evolveum.midpoint.prism.match.PolyStringNormMatchingRule; +import com.evolveum.midpoint.prism.parser.QueryConvertor; +import com.evolveum.midpoint.prism.path.ItemPath; +import com.evolveum.midpoint.prism.polystring.PolyStringNormalizer; +import com.evolveum.midpoint.prism.query.AndFilter; +import com.evolveum.midpoint.prism.query.InOidFilter; +import com.evolveum.midpoint.prism.query.NotFilter; +import com.evolveum.midpoint.prism.query.ObjectFilter; +import com.evolveum.midpoint.prism.query.ObjectQuery; +import com.evolveum.midpoint.prism.query.OrgFilter; +import com.evolveum.midpoint.prism.query.RefFilter; +import com.evolveum.midpoint.prism.query.SubstringFilter; +import com.evolveum.midpoint.schema.constants.ObjectTypes; +import com.evolveum.midpoint.schema.constants.SchemaConstants; +import com.evolveum.midpoint.schema.result.OperationResult; +import com.evolveum.midpoint.security.api.MidPointPrincipal; +import com.evolveum.midpoint.task.api.Task; +import com.evolveum.midpoint.util.exception.SchemaException; +import com.evolveum.midpoint.util.logging.LoggingUtils; +import com.evolveum.midpoint.util.logging.Trace; +import com.evolveum.midpoint.util.logging.TraceManager; +import com.evolveum.midpoint.web.component.BasicSearchPanel; +import com.evolveum.midpoint.web.component.TabbedPanel; +import com.evolveum.midpoint.web.component.data.ObjectDataProvider; +import com.evolveum.midpoint.web.component.data.TablePanel; +import com.evolveum.midpoint.web.component.data.column.CheckBoxHeaderColumn; +import com.evolveum.midpoint.web.component.data.column.IconColumn; +import com.evolveum.midpoint.web.component.data.column.InlineMenuHeaderColumn; +import com.evolveum.midpoint.web.component.data.column.LinkColumn; +import com.evolveum.midpoint.web.component.dialog.ConfirmationDialog; +import com.evolveum.midpoint.web.component.menu.cog.InlineMenu; +import com.evolveum.midpoint.web.component.menu.cog.InlineMenuItem; +import com.evolveum.midpoint.web.component.menu.cog.InlineMenuItemAction; +import com.evolveum.midpoint.web.component.util.LoadableModel; +import com.evolveum.midpoint.web.component.util.SimplePanel; +import com.evolveum.midpoint.web.component.util.VisibleEnableBehaviour; +import com.evolveum.midpoint.web.page.PageBase; +import com.evolveum.midpoint.web.page.admin.configuration.component.HeaderMenuAction; +import com.evolveum.midpoint.web.page.admin.users.PageOrgUnit; +import com.evolveum.midpoint.web.page.admin.users.PageUser; +import com.evolveum.midpoint.web.page.admin.users.component.OrgTreeProvider; +import com.evolveum.midpoint.web.page.admin.users.component.OrgUnitAddDeletePopup; +import com.evolveum.midpoint.web.page.admin.users.component.OrgUnitBrowser; +import com.evolveum.midpoint.web.page.admin.users.component.SelectableFolderContent; +import com.evolveum.midpoint.web.page.admin.users.component.TreeTablePanel; +import com.evolveum.midpoint.web.page.admin.users.dto.OrgDto; +import com.evolveum.midpoint.web.page.admin.users.dto.OrgTableDto; +import com.evolveum.midpoint.web.page.admin.users.dto.OrgTreeDto; +import com.evolveum.midpoint.web.page.admin.users.dto.TreeStateSet; +import com.evolveum.midpoint.web.security.SecurityUtils; +import com.evolveum.midpoint.web.session.UserProfileStorage; +import com.evolveum.midpoint.web.util.ObjectTypeGuiDescriptor; +import com.evolveum.midpoint.web.util.OnePageParameterEncoder; +import com.evolveum.midpoint.web.util.WebMiscUtil; +import com.evolveum.midpoint.web.util.WebModelUtils; +import com.evolveum.midpoint.xml.ns._public.common.common_3.AssignmentType; +import com.evolveum.midpoint.xml.ns._public.common.common_3.ExtensionType; +import com.evolveum.midpoint.xml.ns._public.common.common_3.FocusType; +import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectReferenceType; +import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectType; +import com.evolveum.midpoint.xml.ns._public.common.common_3.OrgType; +import com.evolveum.midpoint.xml.ns._public.common.common_3.TaskBindingType; +import com.evolveum.midpoint.xml.ns._public.common.common_3.TaskExecutionStatusType; +import com.evolveum.midpoint.xml.ns._public.common.common_3.TaskRecurrenceType; +import com.evolveum.midpoint.xml.ns._public.common.common_3.TaskType; +import com.evolveum.midpoint.xml.ns._public.common.common_3.UserType; +import com.evolveum.prism.xml.ns._public.query_3.QueryType; +import com.evolveum.prism.xml.ns._public.query_3.SearchFilterType; + +public class OrgTreeTablePannel extends SimplePanel{ + + private static final Trace LOGGER = TraceManager.getTrace(TreeTablePanel.class); + + private static final int CONFIRM_DELETE = 0; + private static final int CONFIRM_DELETE_ROOT = 1; + + private static final String DOT_CLASS = TreeTablePanel.class.getName() + "."; + private static final String OPERATION_DELETE_OBJECTS = DOT_CLASS + "deleteObjects"; + private static final String OPERATION_DELETE_OBJECT = DOT_CLASS + "deleteObject"; + private static final String OPERATION_MOVE_OBJECTS = DOT_CLASS + "moveObjects"; + private static final String OPERATION_MOVE_OBJECT = DOT_CLASS + "moveObject"; + private static final String OPERATION_UPDATE_OBJECTS = DOT_CLASS + "updateObjects"; + private static final String OPERATION_UPDATE_OBJECT = DOT_CLASS + "updateObject"; + private static final String OPERATION_RECOMPUTE = DOT_CLASS + "recompute"; + + private static final String ID_TREE = "tree"; + private static final String ID_TREE_CONTAINER = "treeContainer"; + private static final String ID_CONTAINER_CHILD_ORGS = "childOrgContainer"; + private static final String ID_CONTAINER_MANAGER = "managerContainer"; + private static final String ID_CONTAINER_MEMBER = "memberContainer"; + private static final String ID_CHILD_TABLE = "childUnitTable"; + private static final String ID_MANAGER_TABLE = "managerTable"; + private static final String ID_MEMBER_TABLE = "memberTable"; + private static final String ID_FORM = "form"; + private static final String ID_CONFIRM_DELETE_POPUP = "confirmDeletePopup"; + private static final String ID_MOVE_POPUP = "movePopup"; + private static final String ID_ADD_DELETE_POPUP = "addDeletePopup"; + private static final String ID_TREE_MENU = "treeMenu"; + private static final String ID_TREE_HEADER = "treeHeader"; + private static final String ID_SEARCH_FORM = "searchForm"; + private static final String ID_BASIC_SEARCH = "basicSearch"; + + private IModel selected = new LoadableModel() { + + @Override + protected OrgTreeDto load() { + return getRootFromProvider(); + } + }; + + public OrgTreeTablePannel(String id, IModel rootOid) { + super(id, rootOid); + } + + @Override + protected void initLayout() { + + + WebMarkupContainer treeHeader = new WebMarkupContainer(ID_TREE_HEADER); + treeHeader.setOutputMarkupId(true); + add(treeHeader); + + InlineMenu treeMenu = new InlineMenu(ID_TREE_MENU, new Model<>((Serializable) createTreeMenu())); + treeHeader.add(treeMenu); + + ISortableTreeProvider provider = new OrgTreeProvider(this, getModel()); + List> columns = new ArrayList<>(); + columns.add(new TreeColumn(createStringResource("TreeTablePanel.hierarchy"))); + + WebMarkupContainer treeContainer = new WebMarkupContainer(ID_TREE_CONTAINER) { + + @Override + public void renderHead(IHeaderResponse response) { + super.renderHead(response); + + //method computes height based on document.innerHeight() - screen height; + response.render(OnDomReadyHeaderItem.forScript("updateHeight('" + getMarkupId() + + "', ['#" + OrgTreeTablePannel.this.get(ID_FORM).getMarkupId() + "'], ['#" + + OrgTreeTablePannel.this.get(ID_TREE_HEADER).getMarkupId() + "'])")); + } + }; + add(treeContainer); + + TableTree tree = new TableTree(ID_TREE, columns, provider, + Integer.MAX_VALUE, new TreeStateModel(provider)) { + + @Override + protected Component newContentComponent(String id, IModel model) { + return new SelectableFolderContent(id, this, model, selected) { + + @Override + protected void onClick(AjaxRequestTarget target) { + super.onClick(target); + + selectTreeItemPerformed(target); + } + }; + } + + @Override + protected Item newRowItem(String id, int index, final IModel model) { + Item item = super.newRowItem(id, index, model); + item.add(AttributeModifier.append("class", new AbstractReadOnlyModel() { + + @Override + public String getObject() { + OrgTreeDto itemObject = model.getObject(); + if (itemObject != null && itemObject.equals(selected.getObject())) { + return "success"; + } + + return null; + } + })); + return item; + } + }; + tree.getTable().add(AttributeModifier.replace("class", "table table-striped table-condensed")); + tree.add(new WindowsTheme()); +// tree.add(AttributeModifier.replace("class", "tree-midpoint")); + treeContainer.add(tree); + + initTables(); + initSearch(); + } + + private void initTables() { + Form form = new Form(ID_FORM); + form.setOutputMarkupId(true); + add(form); + + //Child org. units container initialization + final ObjectDataProvider childTableProvider = new ObjectDataProvider(this, OrgType.class) { + + @Override + public OrgTableDto createDataObjectWrapper(PrismObject obj) { + return OrgTableDto.createDto(obj); + } + + @Override + public ObjectQuery getQuery() { + return createOrgChildQuery(); + } + }; + childTableProvider.setOptions(WebModelUtils.createMinimalOptions()); + + WebMarkupContainer childOrgUnitContainer = new WebMarkupContainer(ID_CONTAINER_CHILD_ORGS); + childOrgUnitContainer.setOutputMarkupId(true); + childOrgUnitContainer.setOutputMarkupPlaceholderTag(true); + childOrgUnitContainer.add(new VisibleEnableBehaviour(){ + + @Override + public boolean isVisible() { + return childTableProvider.size() != 0; + } + }); + form.add(childOrgUnitContainer); + + List> childTableColumns = createChildTableColumns(); + final TablePanel childTable = new TablePanel<>(ID_CHILD_TABLE, childTableProvider, childTableColumns, + UserProfileStorage.TableId.TREE_TABLE_PANEL_CHILD, UserProfileStorage.DEFAULT_PAGING_SIZE); + childTable.setOutputMarkupId(true); + childTable.getNavigatorPanel().add(new VisibleEnableBehaviour(){ + + @Override + public boolean isVisible() { + return childTableProvider.size() > childTable.getDataTable().getItemsPerPage(); + } + }); + childOrgUnitContainer.add(childTable); + + + } + + /** + * TODO - test search + * */ + private void initSearch() { + Form form = new Form(ID_SEARCH_FORM); + form.setOutputMarkupId(true); + add(form); + + BasicSearchPanel basicSearch = new BasicSearchPanel(ID_BASIC_SEARCH, new Model()) { + + @Override + protected void clearSearchPerformed(AjaxRequestTarget target) { + clearTableSearchPerformed(target); + } + + @Override + protected void searchPerformed(AjaxRequestTarget target) { + tableSearchPerformed(target); + } + }; + form.add(basicSearch); + } + + private List createTreeMenu() { + List items = new ArrayList<>(); + + InlineMenuItem item = new InlineMenuItem(createStringResource("TreeTablePanel.collapseAll"), + new InlineMenuItemAction() { + + @Override + public void onClick(AjaxRequestTarget target) { + collapseAllPerformed(target); + } + }); + items.add(item); + item = new InlineMenuItem(createStringResource("TreeTablePanel.expandAll"), + new InlineMenuItemAction() { + + @Override + public void onClick(AjaxRequestTarget target) { + expandAllPerformed(target); + } + }); + items.add(item); + items.add(new InlineMenuItem()); + + return items; + } + + + private OrgTreeDto getRootFromProvider() { + TableTree tree = getTree(); + ITreeProvider provider = tree.getProvider(); + Iterator iterator = provider.getRoots(); + + return iterator.hasNext() ? iterator.next() : null; + } + + private List> createChildTableColumns() { + List> columns = new ArrayList<>(); + + columns.add(new CheckBoxHeaderColumn()); + columns.add(new IconColumn(createStringResource("")) { + + @Override + protected IModel createIconModel(IModel rowModel) { + OrgTableDto dto = rowModel.getObject(); + ObjectTypeGuiDescriptor guiDescriptor = ObjectTypeGuiDescriptor.getDescriptor(dto.getType()); + + String icon = guiDescriptor != null ? guiDescriptor.getIcon() : ObjectTypeGuiDescriptor.ERROR_ICON; + + return new Model<>(icon); + } + }); + + columns.add(new PropertyColumn(createStringResource("ObjectType.name"), OrgTableDto.F_NAME, "name")); + columns.add(new PropertyColumn(createStringResource("OrgType.displayName"), OrgTableDto.F_DISPLAY_NAME)); + columns.add(new PropertyColumn(createStringResource("OrgType.identifier"), OrgTableDto.F_IDENTIFIER)); + + return columns; + } + + /** + * This method check selection in table. + */ + public List getSelectedOrgs(AjaxRequestTarget target) { + List objects = WebMiscUtil.getSelectedData(getOrgChildTable()); + if (objects.isEmpty()) { + warn(getString("TreeTablePanel.message.nothingSelected")); + target.add(getPageBase().getFeedbackPanel()); + } + + return objects; + } + + public List getSelectedOrgs() { + List objects = WebMiscUtil.getSelectedData(getOrgChildTable()); + if (objects.isEmpty()) { +// warn(getString("TreeTablePanel.message.nothingSelected")); +// target.add(getPageBase().getFeedbackPanel()); + } + + return objects; + } + + private PrismReferenceValue createPrismRefValue(OrgDto dto) { + PrismReferenceValue value = new PrismReferenceValue(); + value.setOid(dto.getOid()); + value.setRelation(dto.getRelation()); + value.setTargetType(ObjectTypes.getObjectType(dto.getType()).getTypeQName()); + return value; + } + + + private void refreshTabbedPanel(AjaxRequestTarget target) { + PageBase page = getPageBase(); + + TabbedPanel tabbedPanel = findParent(TabbedPanel.class); + IModel> tabs = tabbedPanel.getTabs(); + + if (tabs instanceof LoadableModel) { + ((LoadableModel) tabs).reset(); + } + + tabbedPanel.setSelectedTab(0); + + target.add(tabbedPanel); + target.add(page.getFeedbackPanel()); + } + + private TableTree getTree() { + return (TableTree) get(createComponentPath(ID_TREE_CONTAINER, ID_TREE)); + } + + private WebMarkupContainer getOrgChildContainer() { + return (WebMarkupContainer) get(createComponentPath(ID_FORM, ID_CONTAINER_CHILD_ORGS)); + } + + + private TablePanel getOrgChildTable() { + return (TablePanel) get(createComponentPath(ID_FORM, ID_CONTAINER_CHILD_ORGS, ID_CHILD_TABLE)); + } + + private void selectTreeItemPerformed(AjaxRequestTarget target) { + BasicSearchPanel basicSearch = (BasicSearchPanel) get(createComponentPath(ID_SEARCH_FORM, ID_BASIC_SEARCH)); + basicSearch.getModel().setObject(null); + + TablePanel orgTable = getOrgChildTable(); + orgTable.setCurrentPage(null); + + target.add(getOrgChildContainer()); + target.add(get(ID_SEARCH_FORM)); + } + + private ObjectQuery createOrgChildQuery() { + OrgTreeDto dto = selected.getObject(); + String oid = (String) (dto != null ? dto.getOid() : getModel().getObject()); + + OrgFilter org = OrgFilter.createOrg(oid, OrgFilter.Scope.ONE_LEVEL); + + BasicSearchPanel basicSearch = (BasicSearchPanel) get(createComponentPath(ID_SEARCH_FORM, ID_BASIC_SEARCH)); + String object = basicSearch.getModelObject(); + + if (StringUtils.isEmpty(object)) { + return ObjectQuery.createObjectQuery(org); + } + + PageBase page = getPageBase(); + PrismContext context = page.getPrismContext(); + + PolyStringNormalizer normalizer = context.getDefaultPolyStringNormalizer(); + String normalizedString = normalizer.normalize(object); + if (StringUtils.isEmpty(normalizedString)) { + return ObjectQuery.createObjectQuery(org); + } + + SubstringFilter substring = SubstringFilter.createSubstring(ObjectType.F_NAME, ObjectType.class, context, + PolyStringNormMatchingRule.NAME, normalizedString); + + AndFilter and = AndFilter.createAnd(org, substring); + + return ObjectQuery.createObjectQuery(and); + } + + + private void collapseAllPerformed(AjaxRequestTarget target) { + TableTree tree = getTree(); + TreeStateModel model = (TreeStateModel) tree.getDefaultModel(); + model.collapseAll(); + + target.add(tree); + } + + private void expandAllPerformed(AjaxRequestTarget target) { + TableTree tree = getTree(); + TreeStateModel model = (TreeStateModel) tree.getDefaultModel(); + model.expandAll(); + + target.add(tree); + } + + + private void updateActivationPerformed(AjaxRequestTarget target, boolean enable) { + List objects = getSelectedOrgs(target); + if (objects.isEmpty()) { + return; + } + + PageBase page = getPageBase(); + OperationResult result = new OperationResult(OPERATION_UPDATE_OBJECTS); + for (OrgTableDto object : objects) { + if (!(FocusType.class.isAssignableFrom(object.getType()))) { + continue; + } + + OperationResult subResult = result.createSubresult(OPERATION_UPDATE_OBJECT); + ObjectDelta delta = WebModelUtils.createActivationAdminStatusDelta(object.getType(), object.getOid(), + enable, page.getPrismContext()); + + WebModelUtils.save(delta, subResult, page); + } + result.computeStatusComposite(); + + page.showResult(result); + target.add(page.getFeedbackPanel()); + + refreshTable(target); + } + + private void refreshTable(AjaxRequestTarget target) { + ObjectDataProvider orgProvider = (ObjectDataProvider) getOrgChildTable().getDataTable().getDataProvider(); + orgProvider.clearCache(); + + target.add(getOrgChildContainer()); + } + + + private void clearTableSearchPerformed(AjaxRequestTarget target) { + BasicSearchPanel basicSearch = (BasicSearchPanel) get(createComponentPath(ID_SEARCH_FORM, ID_BASIC_SEARCH)); + basicSearch.getModel().setObject(null); + + refreshTable(target); + } + + private void tableSearchPerformed(AjaxRequestTarget target) { + refreshTable(target); + } + + private static class TreeStateModel extends AbstractReadOnlyModel> { + + private TreeStateSet set = new TreeStateSet(); + private ISortableTreeProvider provider; + + TreeStateModel(ISortableTreeProvider provider) { + this.provider = provider; + } + + @Override + public Set getObject() { + //just to have root expanded at all time + if (set.isEmpty()) { + Iterator iterator = provider.getRoots(); + if (iterator.hasNext()) { + set.add(iterator.next()); + } + + } + return set; + } + + public void expandAll() { + set.expandAll(); + } + + public void collapseAll() { + set.collapseAll(); + } + } + + + private void addOrgUnitToUserPerformed(AjaxRequestTarget target, OrgType org){ + //TODO + } + + private void removeOrgUnitToUserPerformed(AjaxRequestTarget target, OrgType org){ + //TODO + } +} + diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/users/PageOrgTree.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/users/PageOrgTree.java index 9a8f82f76d2..90a74e8b1c4 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/users/PageOrgTree.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/users/PageOrgTree.java @@ -67,13 +67,13 @@ public class PageOrgTree extends PageAdminUsers { private static final String DOT_CLASS = PageOrgTree.class.getName() + "."; private static final String OPERATION_LOAD_ORG_UNIT = DOT_CLASS + "loadOrgUnit"; - private static final String ID_TABS = "tabs"; + private String ID_TABS = "tabs"; public PageOrgTree() { initLayout(); } - + private void initLayout() { final IModel> tabModel = new LoadableModel>(false) { diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/users/PageUser.html b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/users/PageUser.html index 9d1ab4b9729..bd492a8af3b 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/users/PageUser.html +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/users/PageUser.html @@ -20,6 +20,7 @@
+
diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/users/PageUser.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/users/PageUser.java index 967908925ac..cc1a9c09f6d 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/users/PageUser.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/users/PageUser.java @@ -86,7 +86,9 @@ import com.evolveum.midpoint.web.page.admin.server.dto.TaskDto; import com.evolveum.midpoint.web.page.admin.server.dto.TaskDtoProvider; import com.evolveum.midpoint.web.page.admin.server.dto.TaskDtoProviderOptions; +import com.evolveum.midpoint.web.page.admin.users.component.AssignableOrgPopupContent; import com.evolveum.midpoint.web.page.admin.users.component.AssignablePopupContent; +import com.evolveum.midpoint.web.page.admin.users.component.AssignableRolePopupContent; import com.evolveum.midpoint.web.page.admin.users.component.ExecuteChangeOptionsDto; import com.evolveum.midpoint.web.page.admin.users.component.ExecuteChangeOptionsPanel; import com.evolveum.midpoint.web.page.admin.users.component.ResourcesPopup; @@ -118,6 +120,7 @@ import com.evolveum.midpoint.xml.ns._public.common.common_3.TaskType; import com.evolveum.midpoint.xml.ns._public.common.common_3.UserType; import com.evolveum.prism.xml.ns._public.types_3.PolyStringType; + import org.apache.commons.lang.StringUtils; import org.apache.wicket.Component; import org.apache.wicket.RestartResponseException; @@ -142,6 +145,7 @@ import org.apache.wicket.util.string.StringValue; import javax.xml.namespace.QName; + import java.io.Serializable; import java.util.ArrayList; import java.util.Collection; @@ -175,6 +179,7 @@ public class PageUser extends PageAdminUsers implements ProgressReportingAwarePa private static final String MODAL_ID_RESOURCE = "resourcePopup"; private static final String MODAL_ID_ASSIGNABLE = "assignablePopup"; + private static final String MODAL_ID_ASSIGNABLE_ORG = "assignableOrgPopup"; private static final String MODAL_ID_CONFIRM_DELETE_ACCOUNT = "confirmDeleteAccountPopup"; private static final String MODAL_ID_CONFIRM_DELETE_ASSIGNMENT = "confirmDeleteAssignmentPopup"; @@ -524,7 +529,7 @@ public void onClick(AjaxRequestTarget target) { @Override public void onClick(AjaxRequestTarget target) { - showAssignablePopup(target, OrgType.class); + showAssignableOrgPopup(target); } }); items.add(item); @@ -967,11 +972,19 @@ public void onClick(AjaxRequestTarget target) { private void showAssignablePopup(AjaxRequestTarget target, Class type) { ModalWindow modal = (ModalWindow) get(MODAL_ID_ASSIGNABLE); - AssignablePopupContent content = (AssignablePopupContent) modal.get(modal.getContentId()); + AssignablePopupContent content = (AssignableRolePopupContent) modal.get(modal.getContentId()); content.setType(type); showModalWindow(MODAL_ID_ASSIGNABLE, target); target.add(getFeedbackPanel()); } + + private void showAssignableOrgPopup(AjaxRequestTarget target) { + ModalWindow modal = (ModalWindow) get(MODAL_ID_ASSIGNABLE_ORG); + AssignablePopupContent content = (AssignableOrgPopupContent) modal.get(modal.getContentId()); + content.setType(OrgType.class); + showModalWindow(MODAL_ID_ASSIGNABLE_ORG, target); + target.add(getFeedbackPanel()); + } private void initResourceModal() { ModalWindow window = createModalWindow(MODAL_ID_RESOURCE, @@ -1002,7 +1015,23 @@ protected void addPerformed(AjaxRequestTarget target, List newReso private void initAssignableModal() { ModalWindow window = createModalWindow(MODAL_ID_ASSIGNABLE, createStringResource("pageUser.title.selectAssignable"), 1100, 560); - window.setContent(new AssignablePopupContent(window.getContentId()) { + window.setContent(new AssignableRolePopupContent(window.getContentId()) { + + @Override + protected void handlePartialError(OperationResult result) { + showResult(result); + } + + @Override + protected void addPerformed(AjaxRequestTarget target, List selected) { + addSelectedAssignablePerformed(target, selected, MODAL_ID_ASSIGNABLE); + } + }); + add(window); + + window = createModalWindow(MODAL_ID_ASSIGNABLE_ORG, + createStringResource("pageUser.title.selectAssignable"), 1100, 560); + window.setContent(new AssignableOrgPopupContent(window.getContentId()) { @Override protected void handlePartialError(OperationResult result) { @@ -1011,11 +1040,13 @@ protected void handlePartialError(OperationResult result) { @Override protected void addPerformed(AjaxRequestTarget target, List selected) { - addSelectedAssignablePerformed(target, selected); + addSelectedAssignablePerformed(target, selected, MODAL_ID_ASSIGNABLE_ORG); } }); add(window); } + + private boolean isEditingUser() { StringValue userOid = getPageParameters().get(OnePageParameterEncoder.PARAMETER); @@ -1779,8 +1810,8 @@ private void addSelectedResourceAssignPerformed(ResourceType resource) { dto.setShowEmpty(true); } - private void addSelectedAssignablePerformed(AjaxRequestTarget target, List newAssignables) { - ModalWindow window = (ModalWindow) get(MODAL_ID_ASSIGNABLE); + private void addSelectedAssignablePerformed(AjaxRequestTarget target, List newAssignables, String popupId) { + ModalWindow window = (ModalWindow) get(popupId); window.close(target); if (newAssignables.isEmpty()) { @@ -1820,6 +1851,9 @@ private void addSelectedAssignablePerformed(AjaxRequestTarget target, List accounts, boolean enabled) { if (!isAnyAccountSelected(target)) { return; diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/users/component/AssignableOrgPopupContent.html b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/users/component/AssignableOrgPopupContent.html new file mode 100644 index 00000000000..92553d56fd5 --- /dev/null +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/users/component/AssignableOrgPopupContent.html @@ -0,0 +1,33 @@ + + + + + +