/*
* Copyright (c) 2010-2014 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.component.wizard.resource.component.schemahandling;
import com.evolveum.midpoint.gui.api.component.BasePanel;
import com.evolveum.midpoint.gui.api.model.NonEmptyPropertyModel;
import com.evolveum.midpoint.web.component.input.SearchFilterPanel;
import com.evolveum.midpoint.web.page.admin.configuration.component.EmptyOnBlurAjaxFormUpdatingBehaviour;
import com.evolveum.midpoint.web.page.admin.resources.PageResourceWizard;
import com.evolveum.midpoint.web.util.InfoTooltipBehavior;
import com.evolveum.midpoint.xml.ns._public.common.common_3.ResourceObjectPatternType;
import com.evolveum.prism.xml.ns._public.query_3.SearchFilterType;
import org.apache.wicket.AttributeModifier;
import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.ajax.markup.html.AjaxLink;
import org.apache.wicket.markup.html.WebMarkupContainer;
import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.markup.html.form.TextField;
import org.apache.wicket.markup.html.list.ListItem;
import org.apache.wicket.markup.html.list.ListView;
import org.apache.wicket.model.AbstractReadOnlyModel;
import org.apache.wicket.model.IModel;
import org.apache.wicket.model.PropertyModel;
import java.util.ArrayList;
import java.util.List;
/**
* @author shood
* */
public class ResourceProtectedEditor extends BasePanel<List<ResourceObjectPatternType>> {
private enum ChangeState {
SKIP, FIRST, LAST
}
private static final String ID_CONTAINER = "protectedContainer";
private static final String ID_REPEATER = "repeater";
private static final String ID_ACCOUNT_LINK = "accountLink";
private static final String ID_ACCOUNT_NAME = "accountLinkName";
private static final String ID_ACCOUNT_BODY = "accountBodyContainer";
private static final String ID_NAME = "name";
private static final String ID_UID = "uid";
private static final String ID_FILTER_EDITOR = "filterClause";
private static final String ID_BUTTON_ADD = "addButton";
private static final String ID_BUTTON_DELETE = "deleteAccount";
private static final String ID_T_NAME = "nameTooltip";
private static final String ID_T_UID = "uidTooltip";
private static final String ID_T_FILTER = "filterTooltip";
private ChangeState changeState = ChangeState.FIRST;
public ResourceProtectedEditor(String id, IModel<List<ResourceObjectPatternType>> model, PageResourceWizard parentPage) {
super(id, model);
initLayout(parentPage);
if (model.getObject() == null) { // shouldn't occur, actually
model.setObject(new ArrayList<ResourceObjectPatternType>());
} else {
for (ResourceObjectPatternType pattern : model.getObject()) {
if (pattern.getFilter() == null) {
pattern.setFilter(new SearchFilterType()); // in order for SearchFilterPanel work correctly; is normalized before saving resource
}
}
}
}
protected void initLayout(final PageResourceWizard parentPage) {
WebMarkupContainer container = new WebMarkupContainer(ID_CONTAINER);
container.setOutputMarkupId(true);
add(container);
ListView repeater = new ListView<ResourceObjectPatternType>(ID_REPEATER, getModel()){
@Override
protected void populateItem(final ListItem<ResourceObjectPatternType> item){
WebMarkupContainer linkCont = new WebMarkupContainer(ID_ACCOUNT_LINK);
linkCont.setOutputMarkupId(true);
linkCont.add(new AttributeModifier("href", createCollapseItemId(item, true)));
item.add(linkCont);
Label accountLabel = new Label(ID_ACCOUNT_NAME, new AbstractReadOnlyModel<String>() {
@Override
public String getObject() {
StringBuilder sb = new StringBuilder();
ResourceObjectPatternType account = item.getModelObject();
sb.append("#").append(item.getIndex()+1).append(" - ");
if (account.getUid() != null) {
sb.append(account.getUid()).append(":");
}
if (account.getName() != null) {
sb.append(account.getName());
}
return sb.toString();
}
});
linkCont.add(accountLabel);
AjaxLink delete = new AjaxLink(ID_BUTTON_DELETE) {
@Override
public void onClick(AjaxRequestTarget target) {
deleteProtectedAccountPerformed(target, item);
}
};
parentPage.addEditingVisibleBehavior(delete);
linkCont.add(delete);
WebMarkupContainer accountBody = new WebMarkupContainer(ID_ACCOUNT_BODY);
accountBody.setOutputMarkupId(true);
accountBody.setMarkupId(createCollapseItemId(item, false).getObject());
if(changeState != ChangeState.SKIP){
accountBody.add(new AttributeModifier("class", new AbstractReadOnlyModel<String>() {
@Override
public String getObject() {
if(changeState == ChangeState.FIRST && item.getIndex() == 0){
return "panel-collapse collapse in";
} else if(changeState == ChangeState.LAST && item.getIndex() == (getModelObject().size()-1)){
return "panel-collapse collapse in";
} else {
return "panel-collapse collapse";
}
}
}));
}
item.add(accountBody);
//TODO - maybe add some validator and auto-complete functionality?
TextField name = new TextField<>(ID_NAME, new PropertyModel<String>(item.getModel(), "name"));
name.add(new EmptyOnBlurAjaxFormUpdatingBehaviour());
parentPage.addEditingEnabledBehavior(name);
accountBody.add(name);
//TODO - maybe add some validator and auto-complete functionality?
TextField uid = new TextField<>(ID_UID, new PropertyModel<String>(item.getModel(), "uid"));
uid.add(new EmptyOnBlurAjaxFormUpdatingBehaviour());
parentPage.addEditingEnabledBehavior(uid);
accountBody.add(uid);
SearchFilterPanel searchFilterPanel = new SearchFilterPanel<>(ID_FILTER_EDITOR,
new NonEmptyPropertyModel<SearchFilterType>(item.getModel(), "filter"), parentPage.getReadOnlyModel());
accountBody.add(searchFilterPanel);
Label nameTooltip = new Label(ID_T_NAME);
nameTooltip.add(new InfoTooltipBehavior());
accountBody.add(nameTooltip);
Label uidTooltip = new Label(ID_T_UID);
uidTooltip.add(new InfoTooltipBehavior());
accountBody.add(uidTooltip);
Label filterTooltip = new Label(ID_T_FILTER);
filterTooltip.add(new InfoTooltipBehavior());
accountBody.add(filterTooltip);
}
};
repeater.setOutputMarkupId(true);
container.add(repeater);
AjaxLink add = new AjaxLink(ID_BUTTON_ADD) {
@Override
public void onClick(AjaxRequestTarget target) {
addProtectedAccountPerformed(target);
}
};
parentPage.addEditingVisibleBehavior(add);
add(add);
}
private WebMarkupContainer getMainContainer(){
return (WebMarkupContainer) get(ID_CONTAINER);
}
private IModel<String> createCollapseItemId(final ListItem<ResourceObjectPatternType> item,final boolean includeSelector){
return new AbstractReadOnlyModel<String>() {
@Override
public String getObject() {
StringBuilder sb = new StringBuilder();
if(includeSelector){
sb.append("#");
}
sb.append("collapse").append(item.getId());
return sb.toString();
}
};
}
private void addProtectedAccountPerformed(AjaxRequestTarget target){
ResourceObjectPatternType account = new ResourceObjectPatternType();
account.setFilter(new SearchFilterType());
changeState = ChangeState.LAST;
getModel().getObject().add(account);
target.add(getMainContainer());
}
private void deleteProtectedAccountPerformed(AjaxRequestTarget target, ListItem<ResourceObjectPatternType> item){
changeState = ChangeState.SKIP;
getModel().getObject().remove(item.getModelObject());
target.add(getMainContainer());
}
}