Skip to content

Commit

Permalink
Merge branch 'master' of github.com:Evolveum/midpoint
Browse files Browse the repository at this point in the history
  • Loading branch information
semancik committed Sep 3, 2018
2 parents 45e75e3 + b37e745 commit 47dd761
Show file tree
Hide file tree
Showing 85 changed files with 2,058 additions and 1,620 deletions.
Expand Up @@ -17,14 +17,14 @@

import java.util.*;
import java.util.Objects;
import java.util.function.Supplier;
import java.util.stream.Collectors;

import com.evolveum.midpoint.gui.api.util.WebModelServiceUtils;
import com.evolveum.midpoint.prism.*;
import com.evolveum.midpoint.prism.path.ItemPath;
import com.evolveum.midpoint.schema.constants.ObjectTypes;
import com.evolveum.midpoint.schema.result.OperationResult;
import com.evolveum.midpoint.schema.util.ObjectTypeUtil;
import com.evolveum.midpoint.task.api.Task;
import com.evolveum.midpoint.web.component.data.column.InlineMenuButtonColumn;
import com.evolveum.midpoint.xml.ns._public.common.common_3.*;
Expand Down Expand Up @@ -66,6 +66,8 @@
import com.evolveum.midpoint.web.session.UserProfileStorage.TableId;
import org.jetbrains.annotations.NotNull;

import static java.util.Collections.singleton;

/**
* @author katkav
*/
Expand All @@ -77,6 +79,8 @@ public abstract class ObjectListPanel<O extends ObjectType> extends BasePanel<O>
private static final String ID_TABLE = "table";

private static final Trace LOGGER = TraceManager.getTrace(ObjectListPanel.class);
private static final String DOT_CLASS = ObjectListPanel.class.getName();
private static final String OPERATION_LOAD_CUSTOM_MENU_ITEMS = DOT_CLASS + "loadCustomMenuItems";

private ObjectTypes type;
private PageBase parentPage;
Expand Down Expand Up @@ -134,6 +138,7 @@ public int getSelectedObjectsCount(){
}

@SuppressWarnings("unchecked")
@NotNull
public List<O> getSelectedObjects() {
BaseSortableDataProvider<SelectableBean<O>> dataProvider = getDataProvider();
if (dataProvider instanceof SelectableBeanObjectDataProvider) {
Expand Down Expand Up @@ -191,9 +196,12 @@ private BoxedTablePanel<SelectableBean<O>> createTable() {
columns = initColumns();
}
List<InlineMenuItem> menuItems = createInlineMenu();
getCustomActions(menuItems);
if (menuItems == null) {
menuItems = new ArrayList<>();
}
addCustomActions(menuItems, () -> getSelectedObjects());

if (menuItems != null && menuItems.size() > 0) {
if (!menuItems.isEmpty()) {
InlineMenuButtonColumn<SelectableBean<O>> actionsColumn = new InlineMenuButtonColumn<>(menuItems, parentPage);
columns.add(actionsColumn);
}
Expand Down Expand Up @@ -399,6 +407,9 @@ public SelectableBean<O> createDataObjectWrapper(O obj) {
if (inlineMenu != null) {
bean.getMenuItems().addAll(inlineMenu);
}
if (obj.getOid() != null) {
addCustomActions(bean.getMenuItems(), () -> singleton(obj));
}
return bean;
}

Expand Down Expand Up @@ -610,17 +621,11 @@ public StringResourceModel createStringResource(String resourceKey, Object... ob

protected abstract List<InlineMenuItem> createInlineMenu();

protected void getCustomActions(List<InlineMenuItem> actionsList){
protected void addCustomActions(@NotNull List<InlineMenuItem> actionsList, Supplier<Collection<? extends ObjectType>> objectsSupplier) {
GuiObjectListViewType guiObjectListViewType = getGuiObjectListViewType();
if (guiObjectListViewType != null && guiObjectListViewType.getAction() != null &&
guiObjectListViewType.getAction().size() > 0){
if (actionsList == null){
actionsList = new ArrayList<>();
}
List<InlineMenuItem> customActions = WebComponentUtil.createMenuItemsFromActions(guiObjectListViewType.getAction());
if (customActions != null) {
actionsList.addAll(customActions);
}
if (guiObjectListViewType != null && !guiObjectListViewType.getAction().isEmpty()) {
actionsList.addAll(WebComponentUtil.createMenuItemsFromActions(guiObjectListViewType.getAction(),
OPERATION_LOAD_CUSTOM_MENU_ITEMS, parentPage, objectsSupplier));
}
}

Expand Down
Expand Up @@ -17,6 +17,7 @@

import java.util.Collection;
import java.util.List;
import java.util.function.Supplier;

import com.evolveum.midpoint.schema.GetOperationOptions;
import com.evolveum.midpoint.schema.SelectorOptions;
Expand All @@ -35,6 +36,7 @@
import com.evolveum.midpoint.web.component.util.SelectableBean;
import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectType;
import org.apache.wicket.model.Model;
import org.jetbrains.annotations.NotNull;

public abstract class PopupObjectListPanel<O extends ObjectType> extends ObjectListPanel<O> {
private static final long serialVersionUID = 1L;
Expand Down Expand Up @@ -144,7 +146,7 @@ protected List<InlineMenuItem> createInlineMenu() {
}

@Override
protected void getCustomActions(List<InlineMenuItem> actionsList){
protected void addCustomActions(@NotNull List<InlineMenuItem> actionsList, Supplier<Collection<? extends ObjectType>> objectsSupplier) {
}


Expand Down
Expand Up @@ -96,7 +96,12 @@
</a>
</li>
</ol>
<ul class="nav navbar-nav">
<a wicket:id="cartButton" class="shopping-cart-icon">
<i class="fa fa-shopping-cart fa-2x shopping-cart-icon"></i>
<span wicket:id="itemsCount" class="badge bg-red"
style="position: absolute; top: 1px; margin-left: 20px;"></span>
</a>
<ul class="nav navbar-nav pull-right">
<!-- User Account: style can be found in dropdown.less -->
<li class="dropdown user user-menu" wicket:id="rightMenu"/>
<li>
Expand Down
Expand Up @@ -127,7 +127,9 @@
import org.apache.commons.lang.Validate;
import org.apache.wicket.*;
import org.apache.wicket.ajax.AbstractDefaultAjaxBehavior;
import org.apache.wicket.ajax.AjaxChannel;
import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.ajax.attributes.AjaxRequestAttributes;
import org.apache.wicket.ajax.markup.html.AjaxLink;
import org.apache.wicket.behavior.AttributeAppender;
import org.apache.wicket.devutils.debugbar.DebugBar;
Expand Down Expand Up @@ -193,6 +195,8 @@ public abstract class PageBase extends WebPage implements ModelServiceLocator {
private static final String ID_FEEDBACK = "feedback";
private static final String ID_DEBUG_BAR = "debugBar";
private static final String ID_CLEAR_CACHE = "clearCssCache";
private static final String ID_CART_BUTTON = "cartButton";
private static final String ID_CART_ITEMS_COUNT = "itemsCount";
private static final String ID_SIDEBAR_MENU = "sidebarMenu";
private static final String ID_RIGHT_MENU = "rightMenu";
private static final String ID_LOCALE = "locale";
Expand Down Expand Up @@ -796,6 +800,44 @@ public boolean isVisible() {
}
};
mainHeader.add(breadcrumbs);

initCartButton(mainHeader);
}

private void initCartButton(WebMarkupContainer mainHeader){
AjaxButton cartButton = new AjaxButton(ID_CART_BUTTON) {
private static final long serialVersionUID = 1L;

@Override
protected void updateAjaxAttributes(AjaxRequestAttributes attributes) {
attributes.setChannel(new AjaxChannel("blocking", AjaxChannel.Type.ACTIVE));
}

@Override
public void onClick(AjaxRequestTarget ajaxRequestTarget) {
navigateToNext(new PageAssignmentsList(true));
}
};
cartButton.setOutputMarkupId(true);
cartButton.add(createUserStatusBehaviour(true));
mainHeader.add(cartButton);

Label cartItemsCount = new Label(ID_CART_ITEMS_COUNT, new LoadableModel<String>(true) {
private static final long serialVersionUID = 1L;

@Override
public String load(){
return Integer.toString(getSessionStorage().getRoleCatalog().getAssignmentShoppingCart().size());
}
});
cartItemsCount.add(new VisibleEnableBehaviour() {
@Override
public boolean isVisible() {
return !(getSessionStorage().getRoleCatalog().getAssignmentShoppingCart().size() == 0);
}
});
cartItemsCount.setOutputMarkupId(true);
cartButton.add(cartItemsCount);
}

private void initLayout() {
Expand Down Expand Up @@ -2312,6 +2354,10 @@ protected String determineDataLanguage() {
}
}

protected void reloadShoppingCartIcon(AjaxRequestTarget target){
target.add(get(createComponentPath(ID_MAIN_HEADER, ID_NAVIGATION, ID_CART_BUTTON)));
}

public AsyncWebProcessManager getAsyncWebProcessManager() {
return MidPointApplication.get().getAsyncWebProcessManager();
}
Expand Down
Expand Up @@ -37,6 +37,7 @@
import java.util.Locale;
import java.util.Map;
import java.util.function.Predicate;
import java.util.function.Supplier;
import java.util.stream.Collectors;
import java.util.stream.StreamSupport;

Expand All @@ -56,11 +57,13 @@
import com.evolveum.midpoint.schema.util.LocalizationUtil;
import com.evolveum.midpoint.task.api.Task;
import com.evolveum.midpoint.util.*;
import com.evolveum.midpoint.util.exception.CommunicationException;
import com.evolveum.midpoint.util.exception.ObjectNotFoundException;
import com.evolveum.midpoint.web.component.data.SelectableBeanObjectDataProvider;
import com.evolveum.midpoint.web.component.menu.cog.InlineMenuItem;
import com.evolveum.midpoint.web.component.menu.cog.InlineMenuItemAction;
import com.evolveum.midpoint.web.component.prism.*;
import com.evolveum.midpoint.web.page.admin.reports.dto.ReportDeleteDialogDto;
import com.evolveum.midpoint.web.util.ObjectTypeGuiDescriptor;
import com.evolveum.midpoint.xml.ns._public.common.common_3.*;
import org.apache.commons.collections4.CollectionUtils;
Expand Down Expand Up @@ -2632,29 +2635,75 @@ public static LookupTableType createAppenderChoices(PageBase pageBase) {
return lookupTable;
}

public static List<InlineMenuItem> createMenuItemsFromActions(List<GuiActionType> actions){
@NotNull
public static List<InlineMenuItem> createMenuItemsFromActions(@NotNull List<GuiActionType> actions, String operation,
PageBase pageBase, @NotNull Supplier<Collection<? extends ObjectType>> selectedObjectsSupplier) {
List<InlineMenuItem> menuItems = new ArrayList<>();
if (actions == null || actions.size() == 0){
return menuItems;
}
actions.forEach(action -> {
if (action.getTaskTemplateRef() == null) {
return;
}
String templateOid = action.getTaskTemplateRef().getOid();
if (StringUtils.isEmpty(templateOid)) {
return;
}
String label = action.getDisplay() != null && StringUtils.isNotEmpty(action.getDisplay().getLabel()) ?
action.getDisplay().getLabel() : action.getName();
new InlineMenuItem(Model.of(label)){
menuItems.add(new InlineMenuItem(Model.of(label)) {
private static final long serialVersionUID = 1L;

@Override
public InlineMenuItemAction initAction(){
public InlineMenuItemAction initAction() {
return new InlineMenuItemAction() {
private static final long serialVersionUID = 1L;

@Override
public void onClick(AjaxRequestTarget target) {
//TODO run task from action
OperationResult result = new OperationResult(operation);
try {
Collection<String> oids = CollectionUtils.emptyIfNull(selectedObjectsSupplier.get())
.stream()
.filter(o -> o.getOid() != null)
.map(o -> o.getOid())
.collect(Collectors.toSet());
if (!oids.isEmpty()) {
Map<QName, Object> extensionValues = prepareExtensionValues(oids);
TaskType executorTask = pageBase.getModelInteractionService().submitTaskFromTemplate(
templateOid, extensionValues, pageBase.createSimpleTask(operation), result);
result.recordInProgress(); // this should be probably have been done in submitTaskFromTemplate
result.setBackgroundTaskOid(executorTask.getOid());
} else {
result.recordWarning("There are no objects to execute the action on"); // TODO i18n
}
} catch (Exception ex) {
result.recordFatalError(result.getOperation(), ex);
target.add(pageBase.getFeedbackPanel());
} finally {
pageBase.showResult(result);
target.add(pageBase.getFeedbackPanel());
}
}
};
}
};

/**
* Extension values are task-dependent. Therefore, in the future we will probably make
* this behaviour configurable. For the time being we assume that the task template will be
* of "iterative task handler" type and so it will expect mext:objectQuery extension property.
*/

@NotNull
private Map<QName, Object> prepareExtensionValues(Collection<String> oids) throws SchemaException {
Map<QName, Object> extensionValues = new HashMap<>();
PrismContext prismContext = pageBase.getPrismContext();
ObjectQuery objectQuery = QueryBuilder.queryFor(ObjectType.class, prismContext)
.id(oids.toArray(new String[0]))
.build();
QueryType queryBean = QueryJaxbConvertor.createQueryType(objectQuery, prismContext);
extensionValues.put(SchemaConstants.MODEL_EXTENSION_OBJECT_QUERY, queryBean);
return extensionValues;
}
});
});
return menuItems;
}
Expand Down
Expand Up @@ -241,10 +241,16 @@ protected void addSelectedAssignmentsPerformed(AjaxRequestTarget target, List<As
protected List<IColumn<ContainerValueWrapper<AssignmentType>, String>> initColumns() {
List<IColumn<ContainerValueWrapper<AssignmentType>, String>> columns = new ArrayList<>();

columns.add(new AbstractColumn<ContainerValueWrapper<AssignmentType>, String>(createStringResource("ObjectReferenceType.relation")) {
columns.add(new AbstractColumn<ContainerValueWrapper<AssignmentType>, String>(
createStringResource("AbstractRoleAssignmentPanel.relationKindIntentColumn")) {
@Override
public void populateItem(Item<ICellPopulator<ContainerValueWrapper<AssignmentType>>> item, String componentId, IModel<ContainerValueWrapper<AssignmentType>> assignmentModel) {
item.add(new Label(componentId, getRelationLabelValue(assignmentModel.getObject())));
AssignmentType assignment = assignmentModel.getObject().getContainerValue().asContainerable();
if (assignment.getConstruction() != null){
item.add(new Label(componentId, getKindIntentLabelValue(assignment.getConstruction())));
} else {
item.add(new Label(componentId, getRelationLabelValue(assignmentModel.getObject())));
}
}
});

Expand Down Expand Up @@ -289,6 +295,19 @@ private String getRelationLabelValue(ContainerValueWrapper<AssignmentType> assig
return assignmentWrapper.getContainerValue().getValue().getTargetRef().getRelation().getLocalPart();
}

private String getKindIntentLabelValue(ConstructionType constructionType){
if (constructionType == null){
return "";
}
StringBuilder sb = new StringBuilder();
sb.append(constructionType.getKind() != null && !StringUtils.isEmpty(constructionType.getKind().value()) ?
constructionType.getKind().value() : createStringResource("AssignmentEditorPanel.undefined").getString());
sb.append("/");
sb.append(!StringUtils.isEmpty(constructionType.getIntent()) ? constructionType.getIntent()
: createStringResource("AssignmentEditorPanel.undefined").getString());
return sb.toString();
}

protected boolean showAllAssignmentsVisible(){
return true;
}
Expand Down
Expand Up @@ -276,8 +276,6 @@ public static String getName(ContainerValueWrapper<AssignmentType> assignmentVal
}
appendTenantAndOrgName(assignment, sb, pageBase);

appendRelation(assignment, sb, pageBase);

return sb.toString();
}

Expand Down
Expand Up @@ -18,6 +18,7 @@

import java.util.List;

import com.evolveum.midpoint.web.component.util.VisibleBehaviour;
import org.apache.wicket.Component;
import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.behavior.AttributeAppender;
Expand Down Expand Up @@ -100,6 +101,8 @@ public String getObject() {
tableContainer.setOutputMarkupId(true);

DataTable<T, String> table = new SelectableDataTable<T>(ID_TABLE, columns, provider, pageSize) {
private static final long serialVersionUID = 1L;

@Override
protected Item<T> newRowItem(String id, int index, IModel<T> rowModel) {
Item<T> item = super.newRowItem(id, index, rowModel);
Expand All @@ -115,7 +118,9 @@ protected Item<T> newRowItem(String id, int index, IModel<T> rowModel) {
table.addTopToolbar(headersTop);

box.add(createHeader(ID_HEADER));
box.add(createFooter(ID_FOOTER));
WebMarkupContainer footer = createFooter(ID_FOOTER);
footer.add(new VisibleBehaviour(() -> isFooterVisible(provider.size(), pageSize)));
box.add(footer);
}

public String getAdditionalBoxCssClasses() {
Expand All @@ -131,6 +136,10 @@ protected Item<T> customizeNewRowItem(Item<T> item, IModel<T> model) {
return item;
}

protected boolean isFooterVisible(long providerSize, int pageSize){
return true;
}

@Override
public DataTable getDataTable() {
return (DataTable) get(ID_BOX).get(ID_TABLE_CONTAINER).get(ID_TABLE);
Expand Down

0 comments on commit 47dd761

Please sign in to comment.