Skip to content

Commit

Permalink
Merge remote-tracking branch 'origin/master'
Browse files Browse the repository at this point in the history
  • Loading branch information
mederly committed Sep 13, 2018
2 parents 4b2495d + 62e427b commit e8d1251
Show file tree
Hide file tree
Showing 5 changed files with 147 additions and 135 deletions.
Expand Up @@ -170,5 +170,7 @@ public class GuiStyleConstants {
public static final String CLASS_ASSIGN = "fa fa-link";
public static final String CLASS_UNASSIGN = "fa fa-unlink";
public static final String CLASS_RECONCILE = "fa fa-refresh";
public static final String CLASS_ADD_NEW_OBJECT = "fa fa-plus";
public static final String CLASS_UPLOAD = "fa fa-upload";
public static final String CLASS_CREATE_FOCUS = "fa fa-user-plus";
}
Expand Up @@ -21,11 +21,8 @@
</form>

<wicket:fragment wicket:id="buttonBar">
<div class="btn-group">
<button wicket:id="newObject" class="btn btn-success btn-sm" type="button"/>
<button wicket:id="refresh" class="btn btn-default btn-sm" type="button"/>
<button wicket:id="importObject" class="btn btn-default btn-sm" type="button"/>
<span wicket:id="exportData"/>
</div>
<div class="btn-group" wicket:id="buttonsRepeater">
<a wicket:id="button"></a>
</div>
</wicket:fragment>
</wicket:panel>
Expand Up @@ -15,15 +15,19 @@
*/
package com.evolveum.midpoint.gui.api.component;

import java.util.Collection;
import java.util.*;

import com.evolveum.midpoint.gui.api.GuiStyleConstants;
import com.evolveum.midpoint.xml.ns._public.common.common_3.ShadowType;
import org.apache.commons.lang.StringUtils;
import org.apache.wicket.Component;
import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.behavior.AttributeAppender;
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.markup.html.WebMarkupContainer;
import org.apache.wicket.markup.html.list.ListItem;
import org.apache.wicket.markup.html.list.ListView;
import org.apache.wicket.markup.html.panel.Fragment;
import org.apache.wicket.model.IModel;
import org.apache.wicket.model.Model;
Expand Down Expand Up @@ -59,6 +63,8 @@ public abstract class MainObjectListPanel<O extends ObjectType> extends ObjectLi
private static final String ID_IMPORT_OBJECT = "importObject";
private static final String ID_EXPORT_DATA = "exportData";
private static final String ID_BUTTON_BAR = "buttonBar";
private static final String ID_BUTTON_REPEATER = "buttonsRepeater";
private static final String ID_BUTTON = "button";
private static final Trace LOGGER = TraceManager.getTrace(MainObjectListPanel.class);

public MainObjectListPanel(String id, Class<O> type, TableId tableId, Collection<SelectorOptions<GetOperationOptions>> options, PageBase parentPage) {
Expand Down Expand Up @@ -114,136 +120,123 @@ protected boolean isClickable(IModel<SelectableBean<O>> rowModel) {

protected abstract void newObjectPerformed(AjaxRequestTarget target);


@Override
protected WebMarkupContainer createTableButtonToolbar(String id) {
return new ButtonBar(id, ID_BUTTON_BAR, this);
return new ButtonBar(id, ID_BUTTON_BAR, this, createToolbarButtonsList(ID_BUTTON));
}

protected List<Component> createToolbarButtonsList(String buttonId){
List<Component> buttonsList = new ArrayList<>();
// TODO if displaying shadows in the repository (and not from resource) we can afford to count the objects
boolean canCountBeforeExporting = getType() == null || !ShadowType.class.isAssignableFrom(getType());

AjaxIconButton newObjectIcon = new AjaxIconButton(buttonId, new Model<>(GuiStyleConstants.CLASS_ADD_NEW_OBJECT),
createStringResource("MainObjectListPanel.newObject")) {

private static final long serialVersionUID = 1L;

@Override
public void onClick(AjaxRequestTarget target) {
newObjectPerformed(target);
}
};
newObjectIcon.add(AttributeAppender.append("class", "btn btn-success btn-sm"));
buttonsList.add(newObjectIcon);

AjaxIconButton refreshIcon = new AjaxIconButton(buttonId, new Model<>(GuiStyleConstants.CLASS_RECONCILE),
createStringResource("MainObjectListPanel.refresh")) {

private static final long serialVersionUID = 1L;

@Override
public void onClick(AjaxRequestTarget target) {
clearCache();
refreshTable((Class<O>) getType(), target);

target.add((Component) getTable());
}
};
refreshIcon.add(AttributeAppender.append("class", "btn btn-default btn-sm"));
buttonsList.add(refreshIcon);

AjaxIconButton importObject = new AjaxIconButton(buttonId, new Model<>(GuiStyleConstants.CLASS_UPLOAD),
createStringResource("MainObjectListPanel.import")) {

private static final long serialVersionUID = 1L;

@Override
public void onClick(AjaxRequestTarget target) {
((PageBase) getPage()).navigateToNext(PageImportObject.class);
}
};
importObject.add(AttributeAppender.append("class", "btn btn-default btn-sm"));
importObject.add(new VisibleEnableBehaviour(){
private static final long serialVersionUID = 1L;

@Override
public boolean isVisible(){

boolean isVisible = false;
try {
isVisible = ((PageBase) getPage()).isAuthorized(ModelAuthorizationAction.IMPORT_OBJECTS.getUrl())
&& WebComponentUtil.isAuthorized(AuthorizationConstants.AUTZ_UI_CONFIGURATION_ALL_URL,
AuthorizationConstants.AUTZ_UI_CONFIGURATION_IMPORT_URL);
} catch (Exception ex){
LOGGER.error("Failed to check authorization for IMPORT action for " + getType().getSimpleName()
+ " object, ", ex);
}
return isVisible;
}
});
buttonsList.add(importObject);

CsvDownloadButtonPanel exportDataLink = new CsvDownloadButtonPanel(buttonId, canCountBeforeExporting) {

private static final long serialVersionUID = 1L;

@Override
protected DataTable<?, ?> getDataTable() {
return getTable().getDataTable();
}

@Override
protected String getFilename() {
return getType().getSimpleName() +
"_" + createStringResource("MainObjectListPanel.exportFileName").getString();
}

};
exportDataLink.add(new VisibleEnableBehaviour(){
private static final long serialVersionUID = 1L;

@Override
public boolean isVisible(){
return WebComponentUtil.isAuthorized(AuthorizationConstants.AUTZ_UI_ADMIN_CSV_EXPORT_ACTION_URI);
}
});

buttonsList.add(exportDataLink);
return buttonsList;
}

private static class ButtonBar extends Fragment {

private static final long serialVersionUID = 1L;

private boolean canCountBeforeExporting;

public <O extends ObjectType> ButtonBar(String id, String markupId, MainObjectListPanel<O> markupProvider) {
public <O extends ObjectType> ButtonBar(String id, String markupId, MainObjectListPanel<O> markupProvider, List<Component> buttonsList) {
super(id, markupId, markupProvider);

// TODO if displaying shadows in the repository (and not from resource) we can afford to count the objects
this.canCountBeforeExporting = markupProvider.getType() == null || !ShadowType.class.isAssignableFrom(markupProvider.getType());
initLayout(markupProvider);
initLayout(buttonsList);
}

private <O extends ObjectType> void initLayout(final MainObjectListPanel<O> mainObjectListPanel) {
AjaxIconButton refreshIcon = new AjaxIconButton(ID_REFRESH, new Model<>("fa fa-refresh"),
mainObjectListPanel.createStringResource("MainObjectListPanel.refresh")) {

private static final long serialVersionUID = 1L;

@Override
public void onClick(AjaxRequestTarget target) {
mainObjectListPanel.clearCache();
mainObjectListPanel.refreshTable((Class<O>) mainObjectListPanel.getType(), target);

target.add((Component) mainObjectListPanel.getTable());
}
};
add(refreshIcon);

AjaxIconButton newObjectIcon = new AjaxIconButton(ID_NEW_OBJECT, new Model<>("fa fa-plus"),
mainObjectListPanel.createStringResource("MainObjectListPanel.newObject")) {

private static final long serialVersionUID = 1L;

@Override
public void onClick(AjaxRequestTarget target) {
mainObjectListPanel.newObjectPerformed(target);
}
};
//TODO will be fixed in 3.6.1
// newObjectIcon.add(new VisibleEnableBehaviour(){
// private static final long serialVersionUID = 1L;
//
// @Override
// public boolean isVisible(){
//
// boolean isVisible = false;
// try {
// PrismObject<O> objectToCreate = mainObjectListPanel.getNewObjectListObject();
// if (objectToCreate != null) {
// mainObjectListPanel.adoptNewObject(objectToCreate);
// }
// isVisible = ((PageBase) getPage()).getSecurityEnforcer().isAuthorized(ModelAuthorizationAction.ADD.getUrl(),
// null, objectToCreate, null, null, null);
// } catch (Exception ex){
// LOGGER.error("Failed to check authorization for ADD action on new object of " + mainObjectListPanel.getQueryType().getSimpleName()
// + " type, ", ex);
// }
// return isVisible;
// }
// });
add(newObjectIcon);

AjaxIconButton importObject = new AjaxIconButton(ID_IMPORT_OBJECT, new Model<>("fa fa-upload"),
mainObjectListPanel.createStringResource("MainObjectListPanel.import")) {

private static final long serialVersionUID = 1L;

private <O extends ObjectType> void initLayout(final List<Component> buttonsList) {
ListView<Component> buttonsView = new ListView<Component>(ID_BUTTON_REPEATER, Model.ofList(buttonsList)) {
@Override
public void onClick(AjaxRequestTarget target) {
((PageBase) getPage()).navigateToNext(PageImportObject.class);
protected void populateItem(ListItem<Component> listItem) {
listItem.add(listItem.getModelObject());
}
};
importObject.add(new VisibleEnableBehaviour(){
private static final long serialVersionUID = 1L;

@Override
public boolean isVisible(){

boolean isVisible = false;
try {
isVisible = ((PageBase) getPage()).isAuthorized(ModelAuthorizationAction.IMPORT_OBJECTS.getUrl())
&& WebComponentUtil.isAuthorized(AuthorizationConstants.AUTZ_UI_CONFIGURATION_ALL_URL,
AuthorizationConstants.AUTZ_UI_CONFIGURATION_IMPORT_URL);
} catch (Exception ex){
LOGGER.error("Failed to check authorization for IMPORT action for " + mainObjectListPanel.getType().getSimpleName()
+ " object, ", ex);
}
return isVisible;
}
});
add(importObject);

CsvDownloadButtonPanel exportDataLink = new CsvDownloadButtonPanel(ID_EXPORT_DATA, canCountBeforeExporting) {

private static final long serialVersionUID = 1L;

@Override
protected DataTable<?, ?> getDataTable() {
return mainObjectListPanel.getTable().getDataTable();
}

@Override
protected String getFilename() {
return mainObjectListPanel.getType().getSimpleName() +
"_" + mainObjectListPanel.createStringResource("MainObjectListPanel.exportFileName").getString();
}

};
exportDataLink.add(new VisibleEnableBehaviour(){
private static final long serialVersionUID = 1L;

@Override
public boolean isVisible(){
return WebComponentUtil.isAuthorized(AuthorizationConstants.AUTZ_UI_ADMIN_CSV_EXPORT_ACTION_URI);
}
});

add(exportDataLink);

add(buttonsView);
}
}
private void adoptNewObject(PrismObject<O> object) throws SchemaException{
getPageBase().getMidpointApplication().getPrismContext().adopt(object);
}
}
Expand Up @@ -17,6 +17,6 @@
<!DOCTYPE html>
<html xmlns:wicket="http://wicket.apache.org">
<wicket:panel>
<button wicket:id="exportData" class="btn btn-default btn-sm" type="button"/>
<a wicket:id="exportData" class="btn btn-default btn-sm" type="button"/>
</wicket:panel>
</html>
Expand Up @@ -25,11 +25,13 @@

import javax.xml.namespace.QName;

import com.evolveum.midpoint.web.component.AjaxIconButton;
import com.evolveum.midpoint.web.component.menu.cog.ButtonInlineMenuItem;
import com.evolveum.midpoint.web.component.menu.cog.InlineMenuItemAction;
import com.evolveum.midpoint.web.page.admin.configuration.component.HeaderMenuAction;
import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.lang.StringUtils;
import org.apache.wicket.Component;
import org.apache.wicket.RestartResponseException;
import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.ajax.form.AjaxFormComponentUpdatingBehavior;
Expand Down Expand Up @@ -200,10 +202,28 @@ protected boolean isClickable(IModel<SelectableBean<ObjectType>> rowModel) {

@Override
protected void newObjectPerformed(AjaxRequestTarget target) {
AbstractRoleMemberPanel.this.assignMembers(target, getSupportedRelations());
AbstractRoleMemberPanel.this.createFocusMemberPerformed(target);
}

@Override
@Override
protected List<Component> createToolbarButtonsList(String buttonId){
List<Component> buttonsList = super.createToolbarButtonsList(buttonId);
AjaxIconButton assignButton = new AjaxIconButton(buttonId, new Model<>(GuiStyleConstants.CLASS_ASSIGN), //TODO change icon class
createStringResource("TreeTablePanel.menu.addMembers")) {

private static final long serialVersionUID = 1L;

@Override
public void onClick(AjaxRequestTarget target) {
AbstractRoleMemberPanel.this.assignMembers(target, getSupportedRelations());
}
};
assignButton.add(AttributeAppender.append("class", "btn btn-default btn-sm"));
buttonsList.add(1, assignButton);
return buttonsList;
}

@Override
protected List<IColumn<SelectableBean<ObjectType>, String>> createColumns() {
return createMembersColumns();
}
Expand Down Expand Up @@ -260,7 +280,7 @@ private QName getComplexTypeQName() {
private List<InlineMenuItem> createRowActions() {
List<InlineMenuItem> menu = new ArrayList<>();
if (isAuthorized(GuiAuthorizationConstants.MEMBER_OPERATION_ASSIGN)) {
menu.add(new ButtonInlineMenuItem(createStringResource("abstractRoleMemberPanel.menu.assign")) {
menu.add(new InlineMenuItem(createStringResource("abstractRoleMemberPanel.menu.assign")) {
private static final long serialVersionUID = 1L;

@Override
Expand All @@ -274,13 +294,7 @@ public void onClick(AjaxRequestTarget target) {
}
};
}

@Override
public String getButtonIconCssClass() {
return GuiStyleConstants.CLASS_ASSIGN;
}

});
});
}

if (isAuthorized(GuiAuthorizationConstants.MEMBER_OPERATION_UNASSIGN)) {
Expand Down Expand Up @@ -308,7 +322,7 @@ public String getButtonIconCssClass() {
}

if (isAuthorized(GuiAuthorizationConstants.MEMBER_OPERATION_RECOMPUTE)) {
menu.add(new InlineMenuItem(createStringResource("abstractRoleMemberPanel.menu.recompute")) {
menu.add(new ButtonInlineMenuItem(createStringResource("abstractRoleMemberPanel.menu.recompute")) {
private static final long serialVersionUID = 1L;

@Override
Expand All @@ -322,7 +336,13 @@ public void onClick(AjaxRequestTarget target) {
}
};
}
});

@Override
public String getButtonIconCssClass() {
return GuiStyleConstants.CLASS_RECONCILE_MENU_ITEM;
}

});
}
if (isAuthorized(GuiAuthorizationConstants.MEMBER_OPERATION_CREATE)) {
menu.add(new InlineMenuItem(createStringResource("abstractRoleMemberPanel.menu.create")) {
Expand Down

0 comments on commit e8d1251

Please sign in to comment.