package org.github.etcd.viewer.html.node;
import javax.inject.Inject;
import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.ajax.markup.html.form.AjaxCheckBox;
import org.apache.wicket.ajax.markup.html.form.AjaxSubmitLink;
import org.apache.wicket.markup.html.WebMarkupContainer;
import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.markup.html.form.Form;
import org.apache.wicket.markup.html.form.TextArea;
import org.apache.wicket.markup.html.form.TextField;
import org.apache.wicket.model.CompoundPropertyModel;
import org.apache.wicket.model.IModel;
import org.apache.wicket.model.ResourceModel;
import org.apache.wicket.model.StringResourceModel;
import org.github.etcd.service.EtcdProxyFactory;
import org.github.etcd.service.rest.EtcdException;
import org.github.etcd.service.rest.EtcdNode;
import org.github.etcd.service.rest.EtcdProxy;
import org.github.etcd.viewer.html.modal.GenericModalPanel;
import org.github.etcd.viewer.html.utils.FormGroupBorder;
public class EditNodeModalPanel extends GenericModalPanel<EtcdNode> {
private static final long serialVersionUID = 1L;
private final IModel<Boolean> updating;
private Label title;
private EtcdNodeForm form;
private final IModel<String> registry;
@Inject
private EtcdProxyFactory proxyFactory;
public EditNodeModalPanel(String id, IModel<EtcdNode> model, IModel<String> registryName, IModel<Boolean> updatingModel) {
super(id, model);
this.updating = updatingModel;
this.registry = registryName;
add(title = new Label("title", new StringResourceModel("editModal.title.updating.${}", updating, "Edit Node")));
title.setOutputMarkupId(true);
add(form = new EtcdNodeForm("form", new CompoundPropertyModel<>(model)));
add(new AjaxSubmitLink("save", form) {
private static final long serialVersionUID = 1L;
@Override
protected void onSubmit(AjaxRequestTarget target, Form<?> form) {
super.onSubmit(target, form);
try (EtcdProxy p = proxyFactory.getEtcdProxy(registry.getObject())) {
try {
if (updating.getObject()) {
p.updateNode(getModelObject());
success("Updated: " + getModelObject());
} else {
p.saveNode(getModelObject());
success("Created: " + getModelObject());
}
} catch (EtcdException e) {
System.err.println("Caught error: " + e);
error(e.toString());
error(" - API error: " + e.getApiError());
error(" - " + e.getCause());
}
}
onNodeSaved(target);
modalHide(target);
}
@Override
protected void onError(AjaxRequestTarget target, Form<?> form) {
super.onError(target, form);
target.add(form);
}
});
}
public class EtcdNodeForm extends Form<EtcdNode> {
private static final long serialVersionUID = 1L;
private FormGroupBorder valueGroup;
public EtcdNodeForm(String id, IModel<EtcdNode> model) {
super(id, model);
add(new FormGroupBorder("keyGroup", new ResourceModel("editModal.form.key.label", "Key")).add(new TextField<String>("key") {
private static final long serialVersionUID = 1L;
@Override
protected void onConfigure() {
super.onConfigure();
setEnabled(!updating.getObject());
}
}.setRequired(true)));
add(valueGroup = new FormGroupBorder("valueGroup", new ResourceModel("editModal.form.value.label", "Value")) {
private static final long serialVersionUID = 1L;
@Override
protected void onConfigure() {
setVisible(!EtcdNodeForm.this.getModelObject().isDir());
}
});
valueGroup.setOutputMarkupPlaceholderTag(true);
valueGroup.add(new TextArea<String>("value") {
private static final long serialVersionUID = 1L;
@Override
protected void onConfigure() {
setEnabled(!EtcdNodeForm.this.getModelObject().isDir());
}
});
WebMarkupContainer dirGroup;
add(dirGroup = new WebMarkupContainer("dirGroup") {
private static final long serialVersionUID = 1L;
@Override
protected void onConfigure() {
super.onConfigure();
setVisible(!updating.getObject());
}
});
dirGroup.add(new AjaxCheckBox("dir") {
private static final long serialVersionUID = 1L;
@Override
protected void onUpdate(AjaxRequestTarget target) {
target.add(valueGroup);
}
@Override
protected void onConfigure() {
super.onConfigure();
setEnabled(!updating.getObject());
}
});
dirGroup.add(new Label("dirLabel", new ResourceModel("editModal.form.dir.label", "Directory")));
add(new FormGroupBorder("ttlGroup", new ResourceModel("editModal.form.ttl.label", "Time to live")).add(new TextField<>("ttl")));
}
}
@Override
public void beforeModalShow(AjaxRequestTarget target) {
target.add(title, form);
form.clearInput();
}
protected void onNodeSaved(AjaxRequestTarget target) {
}
}