This is an automated email from the ASF dual-hosted git repository. reiern70 pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/wicket.git
commit 6550afd842ff15dc807dce8f549f87dbeb4523b1 Author: reiern70 <[email protected]> AuthorDate: Wed Sep 16 14:36:49 2026 -0500 Validate the number in the editable label example Integer.parseInt threw a NumberFormatException, which Wicket does not treat as a conversion error, so invalid input failed the request. The converter now throws a ConversionException, the field is required, and errors are shown in a feedback panel. --- .../examples/ajax/builtin/EditableLabelPage.html | 1 + .../examples/ajax/builtin/EditableLabelPage.java | 46 ++++++++++++-- .../ajax/builtin/EditableLabelPageTest.java | 71 ++++++++++++++++++++++ 3 files changed, 112 insertions(+), 6 deletions(-) diff --git a/wicket-examples/src/main/java/org/apache/wicket/examples/ajax/builtin/EditableLabelPage.html b/wicket-examples/src/main/java/org/apache/wicket/examples/ajax/builtin/EditableLabelPage.html index 86913e89c6..2c17aa79e2 100644 --- a/wicket-examples/src/main/java/org/apache/wicket/examples/ajax/builtin/EditableLabelPage.html +++ b/wicket-examples/src/main/java/org/apache/wicket/examples/ajax/builtin/EditableLabelPage.html @@ -1,6 +1,7 @@ <?xml version="1.0" encoding="UTF-8" ?> <wicket:extend xmlns:wicket="http://wicket.apache.org"> <form wicket:id="form"> +<div wicket:id="feedback"></div> <p> Click on the area with a green outline to begin an inplace edit. Press enter or outside the area to save, pless esc to cancel. diff --git a/wicket-examples/src/main/java/org/apache/wicket/examples/ajax/builtin/EditableLabelPage.java b/wicket-examples/src/main/java/org/apache/wicket/examples/ajax/builtin/EditableLabelPage.java index fbfaccb5b5..ed30543a90 100644 --- a/wicket-examples/src/main/java/org/apache/wicket/examples/ajax/builtin/EditableLabelPage.java +++ b/wicket-examples/src/main/java/org/apache/wicket/examples/ajax/builtin/EditableLabelPage.java @@ -20,13 +20,16 @@ import java.util.Arrays; import java.util.List; import java.util.Locale; +import org.apache.wicket.ajax.AjaxRequestTarget; import org.apache.wicket.extensions.ajax.markup.html.AjaxEditableChoiceLabel; import org.apache.wicket.extensions.ajax.markup.html.AjaxEditableLabel; import org.apache.wicket.extensions.ajax.markup.html.AjaxEditableMultiLineLabel; import org.apache.wicket.markup.html.basic.Label; import org.apache.wicket.markup.html.form.Form; import org.apache.wicket.markup.html.link.Link; +import org.apache.wicket.markup.html.panel.FeedbackPanel; import org.apache.wicket.model.CompoundPropertyModel; +import org.apache.wicket.model.Model; import org.apache.wicket.util.convert.ConversionException; import org.apache.wicket.util.convert.IConverter; @@ -62,18 +65,34 @@ public class EditableLabelPage extends BasePage form.add(new AjaxEditableMultiLineLabel("text3")); form.add(new AjaxEditableChoiceLabel<>("site", SITES)); - form.add(new AjaxEditableLabel<Integer>("number") { + final FeedbackPanel feedback = new FeedbackPanel("feedback"); + feedback.setOutputMarkupId(true); + form.add(feedback); + + AjaxEditableLabel<Integer> numberLabel = new AjaxEditableLabel<Integer>("number") + { @Override protected IConverter<?> createConverter(Class<?> type) { - return new IConverter<Integer>() { + return new IConverter<Integer>() + { @Override public Integer convertToObject(String value, Locale locale) throws ConversionException { - return Integer.parseInt(value); + try + { + return Integer.parseInt(value); + } + catch (NumberFormatException e) + { + throw new ConversionException(e).setSourceValue(value) + .setTargetType(Integer.class) + .setConverter(this) + .setLocale(locale); + } } - + @Override public String convertToString(Integer value, Locale locale) { @@ -81,8 +100,23 @@ public class EditableLabelPage extends BasePage } }; } - }); - + + @Override + protected void onSubmit(AjaxRequestTarget target) + { + super.onSubmit(target); + target.add(feedback); + } + + @Override + protected void onError(AjaxRequestTarget target) + { + super.onError(target); + target.add(feedback); + } + }; + form.add(numberLabel); + numberLabel.setType(Integer.class).setRequired(true).setLabel(Model.of("Number")); form.add(new Label("refresh-counter", () -> "" + refreshCounter)); diff --git a/wicket-examples/src/test/java/org/apache/wicket/examples/ajax/builtin/EditableLabelPageTest.java b/wicket-examples/src/test/java/org/apache/wicket/examples/ajax/builtin/EditableLabelPageTest.java new file mode 100644 index 0000000000..fd55e467f3 --- /dev/null +++ b/wicket-examples/src/test/java/org/apache/wicket/examples/ajax/builtin/EditableLabelPageTest.java @@ -0,0 +1,71 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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 org.apache.wicket.examples.ajax.builtin; + +import org.apache.wicket.behavior.AbstractAjaxBehavior; +import org.apache.wicket.markup.html.form.Form; +import org.apache.wicket.markup.html.form.FormComponent; +import org.apache.wicket.util.tester.WicketTestCase; +import org.junit.jupiter.api.Test; + +/** + * Tests the number editor of {@link EditableLabelPage}. + */ +class EditableLabelPageTest extends WicketTestCase +{ + @Test + void rejectsANumberThatIsNotAnInteger() + { + saveNumber("abc"); + + tester.assertErrorMessages("The value of 'Number' is not a valid Integer."); + tester.assertVisible("form:number:editor"); + tester.assertComponentOnAjaxResponse("form:feedback"); + } + + @Test + void rejectsAnEmptyNumber() + { + saveNumber(""); + + tester.assertErrorMessages("'Number' is required."); + tester.assertVisible("form:number:editor"); + } + + @Test + void acceptsAnInteger() + { + saveNumber("7"); + + tester.assertNoErrorMessage(); + tester.assertInvisible("form:number:editor"); + tester.assertLabel("form:number:label", "0000000007"); + } + + private void saveNumber(String value) + { + tester.startPage(EditableLabelPage.class); + tester.executeAjaxEvent("form:number:label", "click"); + + FormComponent<?> editor = (FormComponent<?>)tester + .getComponentFromLastRenderedPage("form:number:editor"); + tester.getRequest().setParameter(editor.getInputName(), value); + tester.getRequest().setParameter("save", "true"); + tester.getRequest().setMethod(Form.METHOD_GET); + tester.executeBehavior((AbstractAjaxBehavior)editor.getBehaviorById(0)); + } +}
