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));
+       }
+}

Reply via email to