/*
* Copyright (c) 2010-2016 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.web.page.admin.users.component;
import com.evolveum.midpoint.gui.api.component.BasePanel;
import com.evolveum.midpoint.gui.api.component.ObjectBrowserPanel;
import com.evolveum.midpoint.gui.api.component.PopupObjectListPanel;
import com.evolveum.midpoint.gui.api.model.LoadableModel;
import com.evolveum.midpoint.gui.api.page.PageBase;
import com.evolveum.midpoint.gui.api.util.WebComponentUtil;
import com.evolveum.midpoint.security.api.AuthorizationConstants;
import com.evolveum.midpoint.web.component.AjaxButton;
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.LinkColumn;
import com.evolveum.midpoint.web.component.dialog.Popupable;
import com.evolveum.midpoint.web.component.util.ListDataProvider;
import com.evolveum.midpoint.web.component.util.SelectableBean;
import com.evolveum.midpoint.web.component.util.VisibleEnableBehaviour;
import com.evolveum.midpoint.web.page.admin.resources.PageResourceWizard;
import com.evolveum.midpoint.web.page.admin.roles.PageRole;
import com.evolveum.midpoint.web.page.admin.users.PageOrgUnit;
import com.evolveum.midpoint.web.util.ObjectTypeGuiDescriptor;
import com.evolveum.midpoint.web.util.OnePageParameterEncoder;
import com.evolveum.midpoint.xml.ns._public.common.common_3.OrgType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.ResourceType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.RoleType;
import org.apache.wicket.Component;
import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.extensions.markup.html.repeater.data.grid.ICellPopulator;
import org.apache.wicket.extensions.markup.html.repeater.data.table.AbstractColumn;
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.data.table.PropertyColumn;
import org.apache.wicket.markup.html.WebMarkupContainer;
import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.markup.html.panel.Panel;
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.model.StringResourceModel;
import org.apache.wicket.request.mapper.parameter.PageParameters;
import javax.xml.namespace.QName;
import java.util.ArrayList;
import java.util.List;
/**
* @author shood
* */
public class AssignmentPreviewDialog extends BasePanel implements Popupable {
private static final String ID_CONTENT = "panel";
private static final String ID_TABLE = "table";
private static final String ID_BUTTON_CANCEL = "cancelButton";
private static final String ID_BUTTON_ADD = "addButton";
private boolean initialized;
private List<String> directAssignments;
private IModel<List<AssignmentsPreviewDto>> data;
private PageBase pageBase;
private boolean multiselect;
public AssignmentPreviewDialog(String id, final List<AssignmentsPreviewDto> data, List<String> directAssignments,
PageBase pageBase) {
this(id, data, directAssignments, pageBase, false);
}
public AssignmentPreviewDialog(String id, final List<AssignmentsPreviewDto> data, List<String> directAssignments,
PageBase pageBase, boolean multiselect){
super(id);
this.directAssignments = directAssignments;
this.pageBase = pageBase;
this.multiselect = multiselect;
this.data = new LoadableModel<List<AssignmentsPreviewDto>>(false) {
@Override
protected List<AssignmentsPreviewDto> load() {
return data == null ? new ArrayList<AssignmentsPreviewDto>() : data;
}
};
initLayout();
}
public StringResourceModel createStringResource(String resourceKey, Object... objects) {
return PageBase.createStringResourceStatic(this, resourceKey, objects);
}
public void initLayout(){
List<IColumn<AssignmentsPreviewDto, String>> columns = initColumns();
ListDataProvider provider = new ListDataProvider(pageBase, data);
WebMarkupContainer content = new WebMarkupContainer(ID_CONTENT);
content.setOutputMarkupId(true);
add(content);
TablePanel table = new TablePanel<>(ID_TABLE, provider, columns);
table.setOutputMarkupId(true);
content.add(table);
AjaxButton addButton = new AjaxButton(ID_BUTTON_ADD,
createStringResource("userBrowserDialog.button.selectButton")) {
private static final long serialVersionUID = 1L;
@Override
public void onClick(AjaxRequestTarget target) {
List<AssignmentsPreviewDto> previewDtos = data.getObject();
List<AssignmentsPreviewDto> selectedDtos = new ArrayList<>();
for (AssignmentsPreviewDto dto : previewDtos){
if (dto.isSelected()){
selectedDtos.add(dto);
}
}
AssignmentPreviewDialog.this.addButtonClicked(target, selectedDtos);
}
};
addButton.add(new VisibleEnableBehaviour() {
private static final long serialVersionUID = 1L;
@Override
public boolean isVisible() {
return multiselect;
}
});
content.add(addButton);
AjaxButton cancelButton = new AjaxButton(ID_BUTTON_CANCEL,
createStringResource("AssignmentPreviewDialog.button.cancel")) {
@Override
public void onClick(AjaxRequestTarget ajaxRequestTarget) {
((PageBase)getPage()).hideMainPopup(ajaxRequestTarget);
}
};
content.add(cancelButton);
}
private List<IColumn<AssignmentsPreviewDto, String>> initColumns() {
List<IColumn<AssignmentsPreviewDto, String>> columns = new ArrayList<>();
if (multiselect) {
columns.add(new CheckBoxHeaderColumn<AssignmentsPreviewDto>() {
private static final long serialVersionUID = 1L;
@Override
protected void onUpdateRow(AjaxRequestTarget target, DataTable table, IModel<AssignmentsPreviewDto> rowModel) {
super.onUpdateRow(target, table, rowModel);
};
@Override
protected void onUpdateHeader(AjaxRequestTarget target, boolean selected, DataTable table) {
super.onUpdateHeader(target, selected, table);
}
});
}
columns.add(new LinkColumn<AssignmentsPreviewDto>(createStringResource("AssignmentPreviewDialog.column.name"), AssignmentsPreviewDto.F_TARGET_NAME){
@Override
public void onClick(AjaxRequestTarget target, IModel<AssignmentsPreviewDto> rowModel){
AssignmentsPreviewDto dto = rowModel.getObject();
chooseOperationPerformed(dto.getTargetOid(), dto.getTargetClass());
}
@Override
public boolean isEnabled(IModel<AssignmentsPreviewDto> rowModel) {
if (multiselect){
return false;
}
Class targetClass = rowModel.getObject().getTargetClass();
String authorizationAction = "";
if (targetClass.getSimpleName().equals("OrgType")){
authorizationAction = AuthorizationConstants.AUTZ_UI_ORG_UNIT_URL;
} else if (targetClass.getSimpleName().equals("RoleType")){
authorizationAction = AuthorizationConstants.AUTZ_UI_ROLE_URL;
} else if (targetClass.getSimpleName().equals("ServiceType")){
authorizationAction = AuthorizationConstants.AUTZ_UI_SERVICE_URL;
} else if (targetClass.getSimpleName().equals("ResourceType")){
authorizationAction = AuthorizationConstants.AUTZ_UI_RESOURCE_URL;
}
if (WebComponentUtil.isAuthorized(authorizationAction)) {
return true;
}
return false;
}
});
columns.add(new IconColumn<AssignmentsPreviewDto>(createStringResource("")) {
@Override
protected IModel<String> createIconModel(IModel<AssignmentsPreviewDto> rowModel) {
ObjectTypeGuiDescriptor guiDescriptor = ObjectTypeGuiDescriptor.getDescriptor(rowModel.getObject().getTargetClass());
String icon = guiDescriptor != null ? guiDescriptor.getBlackIcon() : ObjectTypeGuiDescriptor.ERROR_ICON;
return new Model<>(icon);
}
});
if (!isDelegationPreview()) {
columns.add(new AbstractColumn<AssignmentsPreviewDto, String>(createStringResource("Type")) {
@Override
public void populateItem(Item<ICellPopulator<AssignmentsPreviewDto>> cellItem, String componentId, final IModel<AssignmentsPreviewDto> rowModel) {
cellItem.add(new Label(componentId, new AbstractReadOnlyModel<String>() {
@Override
public String getObject() {
return rowModel.getObject().isDirect() ?
createStringResource("AssignmentPreviewDialog.type.direct").getString() :
createStringResource("AssignmentPreviewDialog.type.indirect").getString();
}
}));
}
});
}
columns.add(new PropertyColumn<AssignmentsPreviewDto, String>(
createStringResource("AssignmentPreviewDialog.column.description"), AssignmentsPreviewDto.F_TARGET_DESCRIPTION));
columns.add(new PropertyColumn<AssignmentsPreviewDto, String>(
createStringResource("AssignmentPreviewDialog.column.tenant"), AssignmentsPreviewDto.F_TENANT_NAME));
columns.add(new PropertyColumn<AssignmentsPreviewDto, String>(
createStringResource("AssignmentPreviewDialog.column.orgRef"), AssignmentsPreviewDto.F_ORG_REF_NAME));
if (!isDelegationPreview()) {
columns.add(new PropertyColumn<AssignmentsPreviewDto, String>(
createStringResource("AssignmentPreviewDialog.column.kind"), AssignmentsPreviewDto.F_KIND));
columns.add(new PropertyColumn<AssignmentsPreviewDto, String>(
createStringResource("AssignmentPreviewDialog.column.intent"), AssignmentsPreviewDto.F_INTENT));
}
return columns;
}
private void chooseOperationPerformed(String oid, Class clazz){
PageParameters parameters = new PageParameters();
parameters.add(OnePageParameterEncoder.PARAMETER, oid);
PageBase page = getPageBase();
if(clazz.equals(RoleType.class)){
page.navigateToNext(PageRole.class, parameters);
} else if(clazz.equals(ResourceType.class)){
page.navigateToNext(PageResourceWizard.class, parameters);
} else if(clazz.equals(OrgType.class)){
page.navigateToNext(PageOrgUnit.class, parameters);
}
}
protected boolean isDelegationPreview(){
return false;
}
@Override
public int getWidth() {
return 1100;
}
@Override
public int getHeight() {
return 500;
}
@Override
public StringResourceModel getTitle() {
return new StringResourceModel("AssignmentPreviewDialog.label");
}
@Override
public Component getComponent() {
return this;
}
protected void addButtonClicked(AjaxRequestTarget target, List<AssignmentsPreviewDto> dtoList){
}
}