package fr.openwide.core.wicket.more.markup.html.form; import org.apache.wicket.markup.head.IHeaderResponse; import org.apache.wicket.markup.head.OnDomReadyHeaderItem; import org.apache.wicket.markup.html.WebMarkupContainer; import org.apache.wicket.markup.html.form.IChoiceRenderer; import org.apache.wicket.model.IModel; import org.wicketstuff.wiquery.core.javascript.JsQuery; import org.wicketstuff.wiquery.core.javascript.JsScope; import org.wicketstuff.wiquery.core.javascript.JsScopeContext; import org.wicketstuff.wiquery.core.javascript.JsStatement; import org.springframework.context.ApplicationContext; import fr.openwide.core.wicket.more.application.CoreWicketApplication; public abstract class AutocompleteAjaxComponent<T> extends org.wicketstuff.wiquery.ui.autocomplete.AutocompleteAjaxComponent<T> { private static final long serialVersionUID = 2543997784221712556L; private WebMarkupContainer cleanLink; public AutocompleteAjaxComponent(String id, IModel<T> model, IChoiceRenderer<? super T> choiceRenderer) { super(id, model, choiceRenderer); cleanLink = new WebMarkupContainer("cleanLink"); cleanLink.setOutputMarkupId(true); add(cleanLink); } public AutocompleteAjaxComponent(String id, IModel<T> model) { this(id, model, null); } @Override public void renderHead(IHeaderResponse response) { response.render(OnDomReadyHeaderItem.forScript(getAutocompleteStatement())); } public CharSequence getAutocompleteStatement() { JsScope jsScope = new JsScope() { private static final long serialVersionUID = 1L; @Override protected void execute(JsScopeContext scopeContext) { // cette suite d'événement permet de simuler de manière correcte le vidage du champ, et permet // en particulier de déclencher le autoUpdate (appel Ajax) vers Wicket. // focus du champ -> on vide -> on quitte le champ scopeContext.append(new JsQuery(getAutocompleteField()).$().chain("trigger", "'focus'").render()); scopeContext.append(new JsStatement().$(getAutocompleteField()).chain("val", "''").render()); scopeContext.append(new JsStatement().$(getAutocompleteHidden()).chain("val", "''").render()); scopeContext.append(new JsQuery(getAutocompleteField()).$().chain("trigger", "'blur'").render()); } }; JsStatement jsStatement = new JsStatement().$(cleanLink).chain("bind", "'click'", jsScope.render()); // Sur les modifications du champ autocomplete, on vérifie si le champ est vide de manière à vider aussi // le champ caché JsScope clearHiddenField = JsScope.quickScope(new JsStatement() .append("if (") .append(new JsStatement().$(getAutocompleteField()).chain("val").render(false)) .append(" == '') { ") // si le champ autocomplete est vide .append(new JsStatement().$(getAutocompleteHidden()).chain("val", "''").render(true)) // alors on vide le champ identifiant .append(" }")); jsStatement.append(";").$(getAutocompleteField()).chain("bind", "'change'", clearHiddenField.render()); return jsStatement.render(); } protected <SQ> SQ getBean(Class<SQ> clazz) { return getContext().getBean(clazz); } protected <SQ> SQ getBean(Class<SQ> clazz, Object... args) { return getContext().getBean(clazz, args); } private ApplicationContext getContext() { return CoreWicketApplication.get().getApplicationContext(); } }