package lt.inventi.wicket.component;
import org.apache.wicket.Component;
import org.apache.wicket.behavior.Behavior;
import org.apache.wicket.core.util.string.JavaScriptUtils;
import org.apache.wicket.markup.head.IHeaderResponse;
import org.apache.wicket.markup.head.JavaScriptHeaderItem;
import org.apache.wicket.markup.head.OnDomReadyHeaderItem;
import org.apache.wicket.model.IComponentAssignedModel;
import org.apache.wicket.model.IModel;
import org.apache.wicket.request.resource.JavaScriptResourceReference;
import lt.inventi.wicket.resource.ResourceSettings;
/**
* If input field is blank, hides it behind a link until the user clicks it.
* Should be used for optional fields which will be left blank most of the time.
*/
public class BlankInputHidingBehavior extends Behavior {
private Component focusComponent;
private IModel<String> linkLabel;
public BlankInputHidingBehavior(IModel<String> linkLabel) {
this.linkLabel = linkLabel;
}
@Override
public void bind(Component component) {
component.setOutputMarkupId(true);
if (focusComponent == null) {
focusComponent = component;
}
if (linkLabel instanceof IComponentAssignedModel) {
linkLabel = ((IComponentAssignedModel<String>) linkLabel).wrapOnAssignment(component);
}
}
/**
* Specifies component which must be set in focus whenever field is
* revealed. This is useful when hiding entire panels or forms.
*/
public BlankInputHidingBehavior focusComponent(Component component) {
this.focusComponent = component;
return this;
}
@Override
public void renderHead(Component component, IHeaderResponse response) {
response.render(JavaScriptHeaderItem.forReference(ResourceSettings.get().js().jqueryUi.uiCoreWidget));
response.render(JavaScriptHeaderItem.forReference(new JavaScriptResourceReference(BlankInputHidingBehavior.class, "BlankInputHidingBehavior.js")));
String id = component.getMarkupId();
String label = JavaScriptUtils.escapeQuotes(linkLabel.getObject()).toString();
response.render(OnDomReadyHeaderItem.forScript(
String.format("$('#%s').blankInput({id: '%s', label: '%s', focus: '%s'});",
id, id, label, focusComponent.getMarkupId())));
}
}