You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@wicket.apache.org by so...@apache.org on 2017/10/03 14:59:40 UTC

wicket git commit: Tests and examples are added

Repository: wicket
Updated Branches:
  refs/heads/WICKET-6105-java.time 66f8f2aec -> bb86a3e70


Tests and examples are added


Project: http://git-wip-us.apache.org/repos/asf/wicket/repo
Commit: http://git-wip-us.apache.org/repos/asf/wicket/commit/bb86a3e7
Tree: http://git-wip-us.apache.org/repos/asf/wicket/tree/bb86a3e7
Diff: http://git-wip-us.apache.org/repos/asf/wicket/diff/bb86a3e7

Branch: refs/heads/WICKET-6105-java.time
Commit: bb86a3e70986e0bff9b0681e0ab53e56da8fb6fd
Parents: 66f8f2a
Author: Maxim Solodovnik <so...@gmail.com>
Authored: Tue Oct 3 21:59:29 2017 +0700
Committer: Maxim Solodovnik <so...@gmail.com>
Committed: Tue Oct 3 21:59:29 2017 +0700

----------------------------------------------------------------------
 .../wicket/examples/datetime/DateTimePage.html  |  20 ++-
 .../wicket/examples/datetime/DateTimePage.java  |  44 +++++
 .../html/form/datetime/StyleTimeConverter.java  |  12 +-
 .../markup/html/form/datetime/TimeField.java    |  92 ++++++----
 .../html/form/datetime/DateTimeFieldTest.java   | 172 +++++++++++++++++++
 5 files changed, 295 insertions(+), 45 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/wicket/blob/bb86a3e7/wicket-examples/src/main/java/org/apache/wicket/examples/datetime/DateTimePage.html
----------------------------------------------------------------------
diff --git a/wicket-examples/src/main/java/org/apache/wicket/examples/datetime/DateTimePage.html b/wicket-examples/src/main/java/org/apache/wicket/examples/datetime/DateTimePage.html
index d4e9eaa..eed5878 100644
--- a/wicket-examples/src/main/java/org/apache/wicket/examples/datetime/DateTimePage.html
+++ b/wicket-examples/src/main/java/org/apache/wicket/examples/datetime/DateTimePage.html
@@ -9,18 +9,26 @@
 	<body>
 		<span wicket:id="mainNavigation" />
 
-		<!-- h3>Demo of Wicket's default: <em>org.apache.wicket.extensions.markup.html.captcha.CaptchaImageResource</em> </h3>
-		<wicket:container wicket:id="wicket"></wicket:container>
+		<h3>Demo for short style time</h3>
+		<span wicket:id="time1"></span><br/>
 
 		<hr/>
 
-		<h3>Demo using <a href="https://github.com/axet/kaptcha">Kaptcha</a> library</h3>
-		<wicket:container wicket:id="kaptcha"></wicket:container>
+		<h3>Demo for Full style time</h3>
+		<span wicket:id="time2"></span><br/>
 
 		<hr/>
 
-		<h3>Demo using <a href="https://github.com/akiraly/cage">Cage</a> library</h3>
-		<wicket:container wicket:id="cage"></wicket:container-->
+		<h3>Demo for Short style time with 24-hours</h3>
+		<span wicket:id="time3"></span><br/>
 
+		<hr/>
+
+		<form wicket:id="form">
+			<h3>Demo for default Local Date Time in Form</h3>
+			<span wicket:id="datetime1"></span><br/>
+			<input wicket:id="submit" type="submit" value="Submit"/>
+			<div wicket:id="feedback"></div>
+		</form>
 	</body>
 </html>

http://git-wip-us.apache.org/repos/asf/wicket/blob/bb86a3e7/wicket-examples/src/main/java/org/apache/wicket/examples/datetime/DateTimePage.java
----------------------------------------------------------------------
diff --git a/wicket-examples/src/main/java/org/apache/wicket/examples/datetime/DateTimePage.java b/wicket-examples/src/main/java/org/apache/wicket/examples/datetime/DateTimePage.java
index 26eaca5..6294863 100644
--- a/wicket-examples/src/main/java/org/apache/wicket/examples/datetime/DateTimePage.java
+++ b/wicket-examples/src/main/java/org/apache/wicket/examples/datetime/DateTimePage.java
@@ -16,7 +16,18 @@
  */
 package org.apache.wicket.examples.datetime;
 
+import java.time.LocalDateTime;
+import java.time.LocalTime;
+
+import org.apache.wicket.ajax.AjaxRequestTarget;
+import org.apache.wicket.ajax.markup.html.form.AjaxButton;
 import org.apache.wicket.examples.WicketExamplePage;
+import org.apache.wicket.extensions.markup.html.form.datetime.DateTimeField;
+import org.apache.wicket.extensions.markup.html.form.datetime.StyleTimeConverter;
+import org.apache.wicket.extensions.markup.html.form.datetime.TimeField;
+import org.apache.wicket.markup.html.form.Form;
+import org.apache.wicket.markup.html.panel.FeedbackPanel;
+import org.apache.wicket.model.Model;
 
 /**
  * DateTime example page.
@@ -31,5 +42,38 @@ public class DateTimePage extends WicketExamplePage
 	 */
 	public DateTimePage()
 	{
+		add(TimeField.forShortStyle("time1", Model.of(LocalTime.of(22, 15))));
+		add(TimeField.forTimeStyle("time2", Model.of(LocalTime.of(22, 15)), "F"));
+		add(new TimeField("time3", Model.of(LocalTime.of(22, 15)), new StyleTimeConverter("S")) {
+			private static final long serialVersionUID = 1L;
+
+			@Override
+			protected boolean use12HourFormat() {
+				return false;
+			}
+		});
+		final DateTimeField datetime1 = new DateTimeField("datetime1", Model.of(LocalDateTime.now()));
+		final FeedbackPanel feedback = new FeedbackPanel("feedback");
+		Form<String> form = new Form<>("form");
+		add(form.add(datetime1)
+				.add(feedback.setOutputMarkupId(true))
+				.add(new AjaxButton("submit")
+				{
+					private static final long serialVersionUID = 1L;
+
+					@Override
+					protected void onSubmit(AjaxRequestTarget target)
+					{
+						form.info(String.format("DateTime was just submitted: %s", datetime1.getModelObject()));
+						target.add(feedback);
+					}
+
+					@Override
+					protected void onError(AjaxRequestTarget target)
+					{
+						target.add(feedback);
+					}
+				})
+			);
 	}
 }

http://git-wip-us.apache.org/repos/asf/wicket/blob/bb86a3e7/wicket-extensions/src/main/java/org/apache/wicket/extensions/markup/html/form/datetime/StyleTimeConverter.java
----------------------------------------------------------------------
diff --git a/wicket-extensions/src/main/java/org/apache/wicket/extensions/markup/html/form/datetime/StyleTimeConverter.java b/wicket-extensions/src/main/java/org/apache/wicket/extensions/markup/html/form/datetime/StyleTimeConverter.java
index 1197f2a..e95725b 100644
--- a/wicket-extensions/src/main/java/org/apache/wicket/extensions/markup/html/form/datetime/StyleTimeConverter.java
+++ b/wicket-extensions/src/main/java/org/apache/wicket/extensions/markup/html/form/datetime/StyleTimeConverter.java
@@ -38,12 +38,12 @@ public class StyleTimeConverter extends LocalTimeConverter
 	private static final long serialVersionUID = 1L;
 
 	/**
-	 * Date style to use. See {@link DateTimeFormatter#ofLocalizedDate(FormatStyle)}.
+	 * Date style to use. See {@link DateTimeFormatter#ofLocalizedTime(FormatStyle)}.
 	 */
 	private final FormatStyle timeStyle;
 
 	/**
-	 * Construct. The dateStyle 'S-' (which is the same as {@link DateTimeFormatter#ofLocalizedDate(FormatStyle)}) will
+	 * Construct. The dateStyle 'S-' (which is the same as {@link DateTimeFormatter#ofLocalizedTime(FormatStyle)}) will
 	 * be used for constructing the date format for the current locale.
 	 * 
 	 */
@@ -54,10 +54,10 @@ public class StyleTimeConverter extends LocalTimeConverter
 
 	/**
 	 * Construct. The provided pattern will be used as the base format (but they will be localized
-	 * for the current locale) and if null, {@link DateTimeFormatter#ofLocalizedDate(FormatStyle)} will be used.
+	 * for the current locale) and if null, {@link DateTimeFormatter#ofLocalizedTime(FormatStyle)} will be used.
 	 * 
 	 * @param timeStyle
-	 *            Date style to use. See {@link DateTimeFormatter#ofLocalizedDate(FormatStyle)}.
+	 *            Date style to use. See {@link DateTimeFormatter#ofLocalizedTime(FormatStyle)}.
 	 * @throws IllegalArgumentException
 	 *             in case dateStyle is null
 	 */
@@ -89,12 +89,12 @@ public class StyleTimeConverter extends LocalTimeConverter
 	@Override
 	public DateTimeFormatter getFormat(Locale locale)
 	{
-		return timeStyle == null ? null : DateTimeFormatter.ofLocalizedDate(timeStyle).withLocale(locale);
+		return timeStyle == null ? null : DateTimeFormatter.ofLocalizedTime(timeStyle).withLocale(locale);
 	}
 
 	public static FormatStyle parseFormatStyle(char style)
 	{
-		return DateField.parseFormatStyle(style);
+		return TimeField.parseFormatStyle(style);
 	}
 
 	@Override

http://git-wip-us.apache.org/repos/asf/wicket/blob/bb86a3e7/wicket-extensions/src/main/java/org/apache/wicket/extensions/markup/html/form/datetime/TimeField.java
----------------------------------------------------------------------
diff --git a/wicket-extensions/src/main/java/org/apache/wicket/extensions/markup/html/form/datetime/TimeField.java b/wicket-extensions/src/main/java/org/apache/wicket/extensions/markup/html/form/datetime/TimeField.java
index cf3cc29..51e63c3 100644
--- a/wicket-extensions/src/main/java/org/apache/wicket/extensions/markup/html/form/datetime/TimeField.java
+++ b/wicket-extensions/src/main/java/org/apache/wicket/extensions/markup/html/form/datetime/TimeField.java
@@ -27,6 +27,7 @@ import java.time.temporal.ChronoField;
 import java.util.Arrays;
 import java.util.Locale;
 
+import org.apache.wicket.AttributeModifier;
 import org.apache.wicket.markup.html.WebMarkupContainer;
 import org.apache.wicket.markup.html.form.AbstractTextComponent.ITextFormatProvider;
 import org.apache.wicket.markup.html.form.DropDownChoice;
@@ -289,9 +290,19 @@ public class TimeField extends FormComponentPanel<LocalTime> implements ITextFor
 	 * @return a new text field instance
 	 */
 	protected TextField<Integer> newHoursTextField(final String id, IModel<Integer> model, Class<Integer> type) {
-		TextField<Integer> hoursTextField = new TextField<>(id, model, type);
-		hoursTextField.add(getMaximumHours() == 24 ? RangeValidator.range(0, 23) : RangeValidator
-			.range(1, 12));
+		TextField<Integer> hoursTextField = new TextField<Integer>(id, model, type)
+		{
+			private static final long serialVersionUID = 1L;
+
+			@Override
+			protected String[] getInputTypes()
+			{
+				return new String[] {"number"};
+			}
+		};
+		hoursTextField.add(AttributeModifier.append("min", getMaximumHours() == 24 ? 0 : 1));
+		hoursTextField.add(AttributeModifier.append("max", getMaximumHours() == 24 ? 23 : 12));
+		hoursTextField.add(getMaximumHours() == 24 ? RangeValidator.range(0, 23) : RangeValidator.range(1, 12));
 		hoursTextField.setLabel(new Model<>(HOURS));
 		return hoursTextField;
 	}
@@ -323,7 +334,15 @@ public class TimeField extends FormComponentPanel<LocalTime> implements ITextFor
 				}
 				return null;
 			}
+
+			@Override
+			protected String[] getInputTypes()
+			{
+				return new String[] {"number"};
+			}
 		};
+		minutesField.add(AttributeModifier.append("min", 0));
+		minutesField.add(AttributeModifier.append("max", 59));
 		minutesField.add(new RangeValidator<>(0, 59));
 		minutesField.setLabel(new Model<>(MINUTES));
 		return minutesField;
@@ -340,20 +359,24 @@ public class TimeField extends FormComponentPanel<LocalTime> implements ITextFor
 	@Override
 	public void convertInput()
 	{
-		Integer hoursInput = hoursField.getConvertedInput();
-		Integer minutesInput = minutesField.getConvertedInput();
+		Integer hours = hoursField.getConvertedInput();
+		Integer minutes = minutesField.getConvertedInput();
 		AM_PM amOrPmInput = amOrPmChoice.getConvertedInput();
 
-		// Use the input to create a date object with proper timezone
-		LocalTime localTime = LocalTime.of(hoursInput, minutesInput);
-
-		// Adjust for halfday if needed
-		if (use12HourFormat())
+		LocalTime localTime = null;
+		if (hours != null && minutes != null)
 		{
-			int halfday = (amOrPmInput == AM_PM.PM ? 1 : 0);
-			localTime = localTime.with(ChronoField.AMPM_OF_DAY, halfday);
+			// Use the input to create a LocalTime object
+			localTime = LocalTime.of(hours, minutes);
+
+			// Adjust for halfday if needed
+			if (use12HourFormat())
+			{
+				int halfday = (amOrPmInput == AM_PM.PM ? 1 : 0);
+				localTime = localTime.with(ChronoField.AMPM_OF_DAY, halfday);
+			}
 		}
-		super.convertInput();
+		setConvertedInput(localTime);
 	}
 
 	@Override
@@ -400,7 +423,6 @@ public class TimeField extends FormComponentPanel<LocalTime> implements ITextFor
 		return use12HourFormat ? 12 : 24;
 	}
 
-
 	protected class HoursModel implements IModel<Integer>
 	{
 		private static final long serialVersionUID = 1L;
@@ -408,18 +430,18 @@ public class TimeField extends FormComponentPanel<LocalTime> implements ITextFor
 		@Override
 		public Integer getObject()
 		{
-			return time.getHour();
+			LocalTime t = TimeField.this.getModelObject();
+			if (t == null)
+			{
+				return null;
+			}
+			return getMaximumHours() == 24 ? t.getHour() : t.get(ChronoField.CLOCK_HOUR_OF_AMPM);
 		}
 
 		@Override
 		public void setObject(Integer hour)
 		{
-			time = time.with(ChronoField.HOUR_OF_DAY, hour);
-		}
-
-		@Override
-		public void detach()
-		{
+			time = time.with(getMaximumHours() == 24 ? ChronoField.HOUR_OF_DAY : ChronoField.CLOCK_HOUR_OF_AMPM, hour);
 		}
 	}
 
@@ -430,7 +452,8 @@ public class TimeField extends FormComponentPanel<LocalTime> implements ITextFor
 		@Override
 		public Integer getObject()
 		{
-			return time.getMinute();
+			LocalTime t = TimeField.this.getModelObject();
+			return t == null ? null : t.getMinute();
 		}
 
 		@Override
@@ -438,11 +461,6 @@ public class TimeField extends FormComponentPanel<LocalTime> implements ITextFor
 		{
 			time = time.with(ChronoField.MINUTE_OF_HOUR, minute);
 		}
-
-		@Override
-		public void detach()
-		{
-		}
 	}
 
 	protected class AmPmModel implements IModel<AM_PM>
@@ -452,7 +470,8 @@ public class TimeField extends FormComponentPanel<LocalTime> implements ITextFor
 		@Override
 		public AM_PM getObject()
 		{
-			int i = time.get(ChronoField.AMPM_OF_DAY);
+			LocalTime t = TimeField.this.getModelObject();
+			int i = t == null ? 0 : t.get(ChronoField.AMPM_OF_DAY);
 			return i == 0 ? AM_PM.AM : AM_PM.PM;
 		}
 
@@ -462,11 +481,6 @@ public class TimeField extends FormComponentPanel<LocalTime> implements ITextFor
 			int i = AM_PM.AM == amPm ? 0 : 1;
 			time = time.with(ChronoField.AMPM_OF_DAY, i);
 		}
-
-		@Override
-		public void detach()
-		{
-		}
 	}
 
 	/**
@@ -491,4 +505,16 @@ public class TimeField extends FormComponentPanel<LocalTime> implements ITextFor
 	{
 		return converter.getPattern(getLocale());
 	}
+
+	public static FormatStyle parseFormatStyle(char style)
+	{
+		switch (style)
+		{
+			case 'M':
+				return FormatStyle.MEDIUM;
+			case 'S':
+			default:
+				return FormatStyle.SHORT;
+		}
+	}
 }

http://git-wip-us.apache.org/repos/asf/wicket/blob/bb86a3e7/wicket-extensions/src/test/java/org/apache/wicket/extensions/markup/html/form/datetime/DateTimeFieldTest.java
----------------------------------------------------------------------
diff --git a/wicket-extensions/src/test/java/org/apache/wicket/extensions/markup/html/form/datetime/DateTimeFieldTest.java b/wicket-extensions/src/test/java/org/apache/wicket/extensions/markup/html/form/datetime/DateTimeFieldTest.java
new file mode 100644
index 0000000..3b167e4
--- /dev/null
+++ b/wicket-extensions/src/test/java/org/apache/wicket/extensions/markup/html/form/datetime/DateTimeFieldTest.java
@@ -0,0 +1,172 @@
+/*
+ * 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.extensions.markup.html.form.datetime;
+
+import java.io.Serializable;
+import java.time.LocalDate;
+import java.time.LocalTime;
+import java.util.Locale;
+
+import org.apache.wicket.MarkupContainer;
+import org.apache.wicket.markup.IMarkupResourceStreamProvider;
+import org.apache.wicket.markup.html.WebPage;
+import org.apache.wicket.markup.html.form.Form;
+import org.apache.wicket.markup.html.form.FormComponent;
+import org.apache.wicket.model.IModel;
+import org.apache.wicket.model.Model;
+import org.apache.wicket.util.resource.IResourceStream;
+import org.apache.wicket.util.resource.StringResourceStream;
+import org.apache.wicket.util.tester.FormTester;
+import org.apache.wicket.util.tester.WicketTestCase;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.rules.ExpectedException;
+
+public class DateTimeFieldTest extends WicketTestCase {
+	@Rule
+	public ExpectedException expectedException = ExpectedException.none();
+
+	@Test
+	public void timeNullTest() {
+		TestTimePage page = new TestTimePage(null);
+		tester.startPage(page);
+		FormTester formTester = tester.newFormTester("form", false);
+		formTester.submit();
+		assertNull(page.field.getModelObject());
+	}
+
+	@Test
+	public void timeNullHoursTest() {
+		TestTimePage page = new TestTimePage(null);
+		tester.startPage(page);
+		FormTester formTester = tester.newFormTester("form", false);
+		formTester.setValue("field:minutes", "8");
+		formTester.submit();
+		assertNull(page.field.getModelObject());
+	}
+
+	@Test
+	public void timeNullMinutesTest() {
+		TestTimePage page = new TestTimePage(null);
+		tester.startPage(page);
+		FormTester formTester = tester.newFormTester("form", false);
+		formTester.setValue("field:hours", "8");
+		formTester.submit();
+		assertNull(page.field.getModelObject());
+	}
+
+	@Test
+	public void timeNotNullTest() {
+		TestTimePage page = new TestTimePage(LocalTime.of(6, 15));
+		tester.startPage(page);
+		FormTester formTester = tester.newFormTester("form", false);
+		formTester.setValue("field:hours", "8");
+		formTester.submit();
+		LocalTime t = page.field.getModelObject();
+		assertNotNull(t);
+		assertEquals(8, t.getHour());
+		assertEquals(15, t.getMinute());
+	}
+
+	@Test
+	public void dateNullTest() {
+		TestDatePage page = new TestDatePage(null);
+		tester.startPage(page);
+		FormTester formTester = tester.newFormTester("form", false);
+		formTester.submit();
+		assertNull(page.field.getModelObject());
+	}
+
+	@Test
+	public void dateNotNullTest() {
+		LocalDate date = LocalDate.of(2017, 02, 13);
+		TestDatePage page = new TestDatePage(null);
+		tester.startPage(page);
+		FormTester formTester = tester.newFormTester("form", false);
+		formTester.setValue("field", new StyleDateConverter("F").convertToString(date, Locale.forLanguageTag("en-US")));
+		formTester.submit();
+		LocalDate d = page.field.getModelObject();
+		assertNotNull(d);
+		assertEquals(date, d);
+	}
+
+	public static class TestDatePage extends TestPage<LocalDate>
+	{
+		private static final long serialVersionUID = 1L;
+
+		TestDatePage(LocalDate val)
+		{
+			super(val);
+			tag = "input type=\"text\"";
+		}
+
+		@Override
+		FormComponent<LocalDate> newComponent()
+		{
+			return DateField.forDateStyle("field", model, "F");
+		}
+	}
+
+	public static class TestTimePage extends TestPage<LocalTime>
+	{
+		private static final long serialVersionUID = 1L;
+
+		TestTimePage(LocalTime val)
+		{
+			super(val);
+		}
+
+		@Override
+		FormComponent<LocalTime> newComponent()
+		{
+			return TimeField.forTimeStyle("field", model, "F");
+		}
+	}
+
+	public abstract static class TestPage<T extends Serializable> extends WebPage implements IMarkupResourceStreamProvider
+	{
+		private static final long serialVersionUID = 1L;
+		Form<Void> form;
+		FormComponent<T> field;
+		IModel<T> model = new Model<T>();
+		String tag = "span";
+
+		/** */
+		public TestPage(T val)
+		{
+			add(form = new Form<>("form"));
+			model.setObject(val);
+			form.add(field = newComponent());
+		}
+
+		abstract FormComponent<T> newComponent();
+
+		@Override
+		public IResourceStream getMarkupResourceStream(MarkupContainer container, Class<?> containerClass)
+		{
+			return new StringResourceStream(String.format("<html><body>"
+					+ "<form wicket:id=\"form\"><%s wicket:id=\"field\"/></form></body></html>", tag));
+		}
+
+		@Override
+		protected void onDetach()
+		{
+			super.onDetach();
+			model.detach();
+		}
+	}
+}