myfaces-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From lof...@apache.org
Subject [myfaces-tobago] branch master updated: TOBAGO-2011: Replace date-picker implementation with vaadin
Date Fri, 15 Nov 2019 20:42:23 GMT
This is an automated email from the ASF dual-hosted git repository.

lofwyr pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/myfaces-tobago.git


The following commit(s) were added to refs/heads/master by this push:
     new 09fd088  TOBAGO-2011: Replace date-picker implementation with vaadin
09fd088 is described below

commit 09fd088540d1777951e56cc527d617ef6be24caf
Author: Udo Schnurpfeil <udo.schnurpfeil@irian.eu>
AuthorDate: Fri Nov 15 21:41:59 2019 +0100

    TOBAGO-2011: Replace date-picker implementation with vaadin
---
 .../tobago/internal/context/DateTimeI18n.java      |  36 ++-
 .../internal/renderkit/renderer/DateRenderer.java  |   6 +-
 .../internal/renderkit/renderer/InRenderer.java    |   7 +-
 .../internal/renderkit/renderer/PageRenderer.java  |   4 +-
 .../myfaces/tobago/internal/util/JsonUtils.java    |   5 +
 .../myfaces/tobago/renderkit/css/VaadinClass.java  |  37 +++
 .../tobago/renderkit/html/CustomAttributes.java    |   1 +
 .../tobago/context/TobagoResourceBundle.properties |   4 +
 .../context/TobagoResourceBundle_de.properties     |   4 +
 .../context/TobagoResourceBundle_es.properties     |   4 +
 tobago-core/src/main/resources/scss/_tobago.scss   |   4 +
 .../tobago/internal/util/JsonUtilsUnitTest.java    |   5 +-
 .../40-test/1050-date-vaadin/Date_Vaadin.xhtml     |  12 +-
 tobago-theme/tobago-theme-standard/pom.xml         |   7 +-
 .../src/main/appended-resources/META-INF/LICENSE   |  44 ++-
 .../src/main/appended-resources/META-INF/NOTICE    |   6 +-
 .../src/main/npm/package.json                      |   1 +
 .../src/main/npm/rollup.config.js                  |   2 +-
 .../src/main/npm/ts/declare.d.ts                   |   1 -
 .../src/main/npm/ts/tobago-all.ts                  |   7 +-
 .../src/main/npm/ts/tobago-date.ts                 | 324 ++++++---------------
 .../src/main/npm/ts/tobago-page.ts                 |  12 +-
 .../src/main/resources/META-INF/tobago-config.xml  |   8 +-
 23 files changed, 240 insertions(+), 301 deletions(-)

diff --git a/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/context/DateTimeI18n.java
b/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/context/DateTimeI18n.java
index 8d01fbe..87375b7 100644
--- a/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/context/DateTimeI18n.java
+++ b/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/context/DateTimeI18n.java
@@ -19,9 +19,11 @@
 
 package org.apache.myfaces.tobago.internal.context;
 
+import org.apache.myfaces.tobago.util.ResourceUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import javax.faces.context.FacesContext;
 import java.lang.invoke.MethodHandles;
 import java.text.SimpleDateFormat;
 import java.util.Calendar;
@@ -41,6 +43,11 @@ public class DateTimeI18n {
   private final String[] dayNamesShort = new String[7];
   private final String[] dayNamesMin = new String[7];
   private final int firstDay;
+  private final int minDays;
+  private final String today;
+  private final String cancel;
+  private final String clear;
+  private final String week;
 
   private DateTimeI18n(final Locale locale) {
 
@@ -68,7 +75,14 @@ public class DateTimeI18n {
       calendar.add(Calendar.DAY_OF_YEAR, 1);
     }
 
-    firstDay = calendar.getFirstDayOfWeek() - 1; // because Java: 1 = Sunday and jQuery UI
DatePicker: 0 = Sunday
+    firstDay = calendar.getFirstDayOfWeek() - 1; // because Java: 1 = Sunday and JavaScript:
0 = Sunday
+    minDays = calendar.getMinimalDaysInFirstWeek();
+
+    FacesContext facesContext = FacesContext.getCurrentInstance();
+    today = ResourceUtils.getString(facesContext, "date.today");
+    cancel = ResourceUtils.getString(facesContext, "date.cancel");
+    clear = ResourceUtils.getString(facesContext, "date.clear");
+    week = ResourceUtils.getString(facesContext, "date.week");
   }
 
   public static synchronized DateTimeI18n valueOf(final Locale locale) {
@@ -104,4 +118,24 @@ public class DateTimeI18n {
   public int getFirstDay() {
     return firstDay;
   }
+
+  public int getMinDays() {
+    return minDays;
+  }
+
+  public String getToday() {
+    return today;
+  }
+
+  public String getCancel() {
+    return cancel;
+  }
+
+  public String getClear() {
+    return clear;
+  }
+
+  public String getWeek() {
+    return week;
+  }
 }
diff --git a/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/renderkit/renderer/DateRenderer.java
b/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/renderkit/renderer/DateRenderer.java
index 11c0c3a..777923e 100644
--- a/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/renderkit/renderer/DateRenderer.java
+++ b/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/renderkit/renderer/DateRenderer.java
@@ -26,8 +26,10 @@ import org.apache.myfaces.tobago.internal.util.JsonUtils;
 import org.apache.myfaces.tobago.internal.util.StringUtils;
 import org.apache.myfaces.tobago.renderkit.css.BootstrapClass;
 import org.apache.myfaces.tobago.renderkit.css.BootstrapDateTimePickerClass;
+import org.apache.myfaces.tobago.renderkit.css.CssItem;
 import org.apache.myfaces.tobago.renderkit.css.Icons;
 import org.apache.myfaces.tobago.renderkit.css.TobagoClass;
+import org.apache.myfaces.tobago.renderkit.css.VaadinClass;
 import org.apache.myfaces.tobago.renderkit.html.DataAttributes;
 import org.apache.myfaces.tobago.renderkit.html.HtmlAttributes;
 import org.apache.myfaces.tobago.renderkit.html.HtmlButtonTypes;
@@ -131,7 +133,7 @@ public class DateRenderer extends InRenderer {
   }
 
   @Override
-  protected TobagoClass getRendererCssClass() {
-    return null;
+  protected CssItem getRendererCssClass() {
+    return VaadinClass.INPUT;
   }
 }
diff --git a/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/renderkit/renderer/InRenderer.java
b/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/renderkit/renderer/InRenderer.java
index 2b626fe..599688d 100644
--- a/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/renderkit/renderer/InRenderer.java
+++ b/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/renderkit/renderer/InRenderer.java
@@ -32,6 +32,7 @@ import org.apache.myfaces.tobago.internal.util.HtmlRendererUtils;
 import org.apache.myfaces.tobago.internal.util.RenderUtils;
 import org.apache.myfaces.tobago.internal.util.StringUtils;
 import org.apache.myfaces.tobago.renderkit.css.BootstrapClass;
+import org.apache.myfaces.tobago.renderkit.css.CssItem;
 import org.apache.myfaces.tobago.renderkit.css.TobagoClass;
 import org.apache.myfaces.tobago.renderkit.html.HtmlAttributes;
 import org.apache.myfaces.tobago.renderkit.html.HtmlElements;
@@ -137,10 +138,10 @@ public class InRenderer extends MessageLayoutRendererBase {
       writer.writeAttribute(HtmlAttributes.PLACEHOLDER, input.getPlaceholder(), true);
     }
 
-    final TobagoClass rendererCssClass = getRendererCssClass();
+    final CssItem rendererCssClass = getRendererCssClass();
     writer.writeClassAttribute(
         rendererCssClass,
-        rendererCssClass != null ? rendererCssClass.createMarkup(markup) : null,
+//        rendererCssClass != null ? rendererCssClass.createMarkup(markup) : null,
         BootstrapClass.borderColor(ComponentUtils.getMaximumSeverity(input)),
         BootstrapClass.FORM_CONTROL,
         input.getCustomClass());
@@ -203,7 +204,7 @@ public class InRenderer extends MessageLayoutRendererBase {
   protected void encodeEndField(final FacesContext facesContext, final UIComponent component)
throws IOException {
   }
 
-  protected TobagoClass getRendererCssClass() {
+  protected CssItem getRendererCssClass() {
     return TobagoClass.IN;
   }
 
diff --git a/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/renderkit/renderer/PageRenderer.java
b/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/renderkit/renderer/PageRenderer.java
index 73eaf64..d66d746 100644
--- a/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/renderkit/renderer/PageRenderer.java
+++ b/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/renderkit/renderer/PageRenderer.java
@@ -42,6 +42,7 @@ import org.apache.myfaces.tobago.portlet.PortletUtils;
 import org.apache.myfaces.tobago.renderkit.RendererBase;
 import org.apache.myfaces.tobago.renderkit.css.BootstrapClass;
 import org.apache.myfaces.tobago.renderkit.css.TobagoClass;
+import org.apache.myfaces.tobago.renderkit.html.CustomAttributes;
 import org.apache.myfaces.tobago.renderkit.html.DataAttributes;
 import org.apache.myfaces.tobago.renderkit.html.HtmlAttributes;
 import org.apache.myfaces.tobago.renderkit.html.HtmlElements;
@@ -164,9 +165,9 @@ public class PageRenderer extends RendererBase {
     final TobagoClass spread = markup != null && markup.contains(Markup.SPREAD) ?
TobagoClass.SPREAD : null;
     final String title = page.getLabel();
 
+    final Locale locale = viewRoot.getLocale();
     if (!portlet) {
       writer.startElement(HtmlElements.HTML);
-      final Locale locale = viewRoot.getLocale();
       if (locale != null) {
         final String language = locale.getLanguage();
         if (language != null) {
@@ -236,6 +237,7 @@ public class PageRenderer extends RendererBase {
 
     writer.startElement(HtmlElements.TOBAGO_PAGE);
 
+    writer.writeAttribute(CustomAttributes.LOCALE, locale.toString(), false);
     writer.writeClassAttribute(
         BootstrapClass.CONTAINER_FLUID,
         TobagoClass.PAGE.createMarkup(portlet ? Markup.PORTLET.add(page.getMarkup()) : page.getMarkup()),
diff --git a/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/util/JsonUtils.java
b/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/util/JsonUtils.java
index 1cf85f6..cb4c23a 100644
--- a/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/util/JsonUtils.java
+++ b/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/util/JsonUtils.java
@@ -251,6 +251,11 @@ public class JsonUtils {
     encode(builder, "dayNamesShort", dateTimeI18n.getDayNamesShort());
     encode(builder, "dayNamesMin", dateTimeI18n.getDayNamesMin());
     encode(builder, "firstDay", dateTimeI18n.getFirstDay());
+    encode(builder, "minDays", dateTimeI18n.getMinDays());
+    encode(builder, "today", dateTimeI18n.getToday());
+    encode(builder, "cancel", dateTimeI18n.getCancel());
+    encode(builder, "clear", dateTimeI18n.getClear());
+    encode(builder, "week", dateTimeI18n.getWeek());
 
     if (builder.length() - initialLength > 0) {
       assert builder.charAt(builder.length() - 1) == ',';
diff --git a/tobago-core/src/main/java/org/apache/myfaces/tobago/renderkit/css/VaadinClass.java
b/tobago-core/src/main/java/org/apache/myfaces/tobago/renderkit/css/VaadinClass.java
new file mode 100644
index 0000000..3a27e39
--- /dev/null
+++ b/tobago-core/src/main/java/org/apache/myfaces/tobago/renderkit/css/VaadinClass.java
@@ -0,0 +1,37 @@
+/*
+ * 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.myfaces.tobago.renderkit.css;
+
+public enum VaadinClass implements CssItem {
+
+  INPUT("input");
+
+  private final String name;
+
+  VaadinClass(final String name) {
+    this.name = name;
+  }
+
+  @Override
+  public String getName() {
+    return name;
+  }
+
+}
diff --git a/tobago-core/src/main/java/org/apache/myfaces/tobago/renderkit/html/CustomAttributes.java
b/tobago-core/src/main/java/org/apache/myfaces/tobago/renderkit/html/CustomAttributes.java
index 4a975ce..d6a003d 100644
--- a/tobago-core/src/main/java/org/apache/myfaces/tobago/renderkit/html/CustomAttributes.java
+++ b/tobago-core/src/main/java/org/apache/myfaces/tobago/renderkit/html/CustomAttributes.java
@@ -37,6 +37,7 @@ public enum CustomAttributes implements MarkupLanguageAttributes {
    * The index of the tab inside the tab group.
    */
   INDEX("index"),
+  LOCALE("locale"),
   LOCAL_MENU("local-menu"),
   MAX_ITEMS("max-items"),
   MIN_CHARS("min-chars"),
diff --git a/tobago-core/src/main/resources/org/apache/myfaces/tobago/context/TobagoResourceBundle.properties
b/tobago-core/src/main/resources/org/apache/myfaces/tobago/context/TobagoResourceBundle.properties
index c89fdd5..9559e30 100644
--- a/tobago-core/src/main/resources/org/apache/myfaces/tobago/context/TobagoResourceBundle.properties
+++ b/tobago-core/src/main/resources/org/apache/myfaces/tobago/context/TobagoResourceBundle.properties
@@ -37,3 +37,7 @@ sheet.sorting=Click to sort this column
 sheet.toPage=Page {0}
 file.selected={} files selected
 help.title=Help
+date.today=Today
+date.cancel=Cancel
+date.clear=Clear
+date.week=Week
diff --git a/tobago-core/src/main/resources/org/apache/myfaces/tobago/context/TobagoResourceBundle_de.properties
b/tobago-core/src/main/resources/org/apache/myfaces/tobago/context/TobagoResourceBundle_de.properties
index bbdb4b6..64a0486 100644
--- a/tobago-core/src/main/resources/org/apache/myfaces/tobago/context/TobagoResourceBundle_de.properties
+++ b/tobago-core/src/main/resources/org/apache/myfaces/tobago/context/TobagoResourceBundle_de.properties
@@ -37,3 +37,7 @@ sheet.sorting=nach dieser Spalte sortieren
 sheet.toPage=Seite {0}
 file.selected={} Dateien ausgew\u00E4hlt
 help.title=Hilfe
+date.today=Heute
+date.cancel=Abbrechen
+date.clear=L\u00F6schen
+date.week=Woche
diff --git a/tobago-core/src/main/resources/org/apache/myfaces/tobago/context/TobagoResourceBundle_es.properties
b/tobago-core/src/main/resources/org/apache/myfaces/tobago/context/TobagoResourceBundle_es.properties
index fcb8f7a..c755b82 100644
--- a/tobago-core/src/main/resources/org/apache/myfaces/tobago/context/TobagoResourceBundle_es.properties
+++ b/tobago-core/src/main/resources/org/apache/myfaces/tobago/context/TobagoResourceBundle_es.properties
@@ -37,3 +37,7 @@ sheet.sorting=Ordenar por esta columna
 sheet.toPage=P\u00E1gina {0}
 file.selected={} archivos seleccionados
 help.title=Ayudar
+date.today=Hoy
+date.cancel=Cancelar
+date.clear=Borrar
+date.week=Semana
diff --git a/tobago-core/src/main/resources/scss/_tobago.scss b/tobago-core/src/main/resources/scss/_tobago.scss
index 323c02d..95017c9 100644
--- a/tobago-core/src/main/resources/scss/_tobago.scss
+++ b/tobago-core/src/main/resources/scss/_tobago.scss
@@ -231,6 +231,10 @@ tobago-date input {
   margin-left: .3em;
 }
 
+vaadin-date-picker-light {
+  display: block;
+}
+
 /*
 XXX workaround for Bootstrap with datetimepicker needed for popups
 */
diff --git a/tobago-core/src/test/java/org/apache/myfaces/tobago/internal/util/JsonUtilsUnitTest.java
b/tobago-core/src/test/java/org/apache/myfaces/tobago/internal/util/JsonUtilsUnitTest.java
index cf8029f..c9e4ffd 100644
--- a/tobago-core/src/test/java/org/apache/myfaces/tobago/internal/util/JsonUtilsUnitTest.java
+++ b/tobago-core/src/test/java/org/apache/myfaces/tobago/internal/util/JsonUtilsUnitTest.java
@@ -50,7 +50,7 @@ public class JsonUtilsUnitTest extends AbstractTobagoTestBase {
     final CommandMap map = new CommandMap();
     Assertions.assertEquals("{}", JsonUtils.encode(map));
 
-    Assertions.assertEquals(null, JsonUtils.encode((CommandMap) null));
+    Assertions.assertNull(JsonUtils.encode((CommandMap) null));
   }
 
   @Test
@@ -137,7 +137,8 @@ public class JsonUtilsUnitTest extends AbstractTobagoTestBase {
         + dayNamesShort[3] + "','" + dayNamesShort[4] + "','" + dayNamesShort[5] + "','"
+ dayNamesShort[6] + "'],"
         + "'dayNamesMin':['" + dayNamesMin[0] + "','" + dayNamesMin[1] + "','" + dayNamesMin[2]
+ "','"
         + dayNamesMin[3] + "','" + dayNamesMin[4] + "','" + dayNamesMin[5] + "','" + dayNamesMin[6]
+ "'],"
-        + "'firstDay':1}").replaceAll("'", "\"");
+        + "'firstDay':1,'minDays':4,'today':'Today','cancel':'Cancel','clear':'Clear','week':'Week'}")
+        .replaceAll("'", "\"");
 
     Assertions.assertEquals(expected, JsonUtils.encode(dateTimeI18n));
   }
diff --git a/tobago-example/tobago-example-demo/src/main/webapp/content/40-test/1050-date-vaadin/Date_Vaadin.xhtml
b/tobago-example/tobago-example-demo/src/main/webapp/content/40-test/1050-date-vaadin/Date_Vaadin.xhtml
index bd3da47..539e6db 100644
--- a/tobago-example/tobago-example-demo/src/main/webapp/content/40-test/1050-date-vaadin/Date_Vaadin.xhtml
+++ b/tobago-example/tobago-example-demo/src/main/webapp/content/40-test/1050-date-vaadin/Date_Vaadin.xhtml
@@ -29,8 +29,8 @@
   <hr/>
   Plain light:
 
-  <vaadin-date-picker-light value="" attr-for-value="value" id="v1">
-    <input value="2019-11-11" type="text" id="v2"/>
+  <vaadin-date-picker-light attr-for-value="value" id="v1">
+    <input value="2019-11-11" id="v2" class="input"/>
   </vaadin-date-picker-light>
 
   <hr/>
@@ -41,14 +41,6 @@
   </tc:date>
 
   <hr/>
-  Tobago:
-  <vaadin-date-picker-light>
-    <tc:date value="#{dateController.submitDate}" id="vaadin-light">
-      <f:convertDateTime pattern="yyyy-MM-dd"/>
-    </tc:date>
-  </vaadin-date-picker-light>
-
-  <hr/>
 
   Tobago input:
   <tc:in readonly="true" value="#{dateController.submitDate}" id="classic"/>
diff --git a/tobago-theme/tobago-theme-standard/pom.xml b/tobago-theme/tobago-theme-standard/pom.xml
index 615c348..4f56119 100644
--- a/tobago-theme/tobago-theme-standard/pom.xml
+++ b/tobago-theme/tobago-theme-standard/pom.xml
@@ -82,7 +82,7 @@
     <dependency>
       <groupId>org.webjars</groupId>
         <artifactId>momentjs</artifactId>
-      <version>2.22.2</version>
+      <version>2.24.0</version>
     </dependency>
     <dependency>
       <groupId>org.webjars.npm</groupId>
@@ -94,11 +94,6 @@
         <artifactId>tobago-pack-typeahead</artifactId>
       <version>${project.version}</version>
     </dependency>
-    <dependency>
-      <groupId>org.webjars</groupId>
-        <artifactId>Eonasdan-bootstrap-datetimepicker</artifactId>
-      <version>4.17.47</version>
-    </dependency>
   </dependencies>
 
 </project>
diff --git a/tobago-theme/tobago-theme-standard/src/main/appended-resources/META-INF/LICENSE
b/tobago-theme/tobago-theme-standard/src/main/appended-resources/META-INF/LICENSE
index a3bc379..7023daf 100644
--- a/tobago-theme/tobago-theme-standard/src/main/appended-resources/META-INF/LICENSE
+++ b/tobago-theme/tobago-theme-standard/src/main/appended-resources/META-INF/LICENSE
@@ -177,32 +177,6 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
IN
 THE SOFTWARE.
 
 ------------------------------------------------------------------------------
-For Bootstrap-DateTimePicker:
-------------------------------------------------------------------------------
-
-The MIT License (MIT)
-
-Copyright (c) 2015 Jonathan Peterson (@Eonasdan)
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in all
-copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-SOFTWARE.
-
-------------------------------------------------------------------------------
 For Momentum:
 ------------------------------------------------------------------------------
 
@@ -260,3 +234,21 @@ HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
 WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
 FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
 OTHER DEALINGS IN THE SOFTWARE.
+
+------------------------------------------------------------------------------
+For Vaadin:
+------------------------------------------------------------------------------
+
+Copyright (c) by Vaadin Ltd.
+
+Licensed 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.
diff --git a/tobago-theme/tobago-theme-standard/src/main/appended-resources/META-INF/NOTICE
b/tobago-theme/tobago-theme-standard/src/main/appended-resources/META-INF/NOTICE
index 9ba3265..79e9fd3 100644
--- a/tobago-theme/tobago-theme-standard/src/main/appended-resources/META-INF/NOTICE
+++ b/tobago-theme/tobago-theme-standard/src/main/appended-resources/META-INF/NOTICE
@@ -20,10 +20,10 @@ This product includes software developed by
 HubSpot, Inc. (http://github.hubspot.com/tether/)
 
 This product includes software developed by
-Jonathan Peterson (@Eonasdan)
-
-This product includes software developed by
 Tim Wood, Iskren Chernev, Moment.js contributors
 
 This product includes software developed by
 Federico Zivolo and contributors (PopperJS)
+
+This product includes software developed by
+Vaadin Ltd.
diff --git a/tobago-theme/tobago-theme-standard/src/main/npm/package.json b/tobago-theme/tobago-theme-standard/src/main/npm/package.json
index 6f3eeb8..d79929c 100644
--- a/tobago-theme/tobago-theme-standard/src/main/npm/package.json
+++ b/tobago-theme/tobago-theme-standard/src/main/npm/package.json
@@ -49,6 +49,7 @@
     "eslint-plugin-compat": "^3.1.1",
     "jest": "24.8.0",
     "jquery": "^3.4.1",
+    "moment": "^2.24.0",
     "node-sass": "^4.12.0",
     "npm-run-all": "^4.1.5",
     "popper.js": "^1.15.0",
diff --git a/tobago-theme/tobago-theme-standard/src/main/npm/rollup.config.js b/tobago-theme/tobago-theme-standard/src/main/npm/rollup.config.js
index d59e238..478be89 100644
--- a/tobago-theme/tobago-theme-standard/src/main/npm/rollup.config.js
+++ b/tobago-theme/tobago-theme-standard/src/main/npm/rollup.config.js
@@ -21,7 +21,7 @@ export default {
   input: 'js/tobago-all.js',
   output: {
     file: 'js/tobago-bundle.js',
-    format: 'iife',
+    format: 'umd', /* tbd: check if "iife" is better? */
     sourcemap: true,
     name: 'tobago'
   },
diff --git a/tobago-theme/tobago-theme-standard/src/main/npm/ts/declare.d.ts b/tobago-theme/tobago-theme-standard/src/main/npm/ts/declare.d.ts
index 11457f4..152dc7e 100644
--- a/tobago-theme/tobago-theme-standard/src/main/npm/ts/declare.d.ts
+++ b/tobago-theme/tobago-theme-standard/src/main/npm/ts/declare.d.ts
@@ -15,7 +15,6 @@
  * limitations under the License.
  */
 
-declare var moment;
 declare var jsf;
 
 interface JQuery {
diff --git a/tobago-theme/tobago-theme-standard/src/main/npm/ts/tobago-all.ts b/tobago-theme/tobago-theme-standard/src/main/npm/ts/tobago-all.ts
index 04b7144..e9f78c5 100644
--- a/tobago-theme/tobago-theme-standard/src/main/npm/ts/tobago-all.ts
+++ b/tobago-theme/tobago-theme-standard/src/main/npm/ts/tobago-all.ts
@@ -19,7 +19,12 @@ import "./ext-bootstrap";
 import "./tobago-listener";
 import "./tobago-core";
 import "./tobago-dropdown";
-import "@vaadin/vaadin-date-picker";
+// import "@vaadin/vaadin-date-picker";
+import "@vaadin/vaadin-date-picker/vaadin-date-picker-light.js";
+// import "@vaadin/vaadin-date-time-picker";
+// import "@vaadin/vaadin-time-picker";
+// import "@vaadin/vaadin-combo-box";
+// import "moment"; //XXX moment seems not to work with rollup.js, need to re-check
 import "./tobago-date";
 import "./tobago-command";
 import "./tobago-file";
diff --git a/tobago-theme/tobago-theme-standard/src/main/npm/ts/tobago-date.ts b/tobago-theme/tobago-theme-standard/src/main/npm/ts/tobago-date.ts
index 86f6e01..11fe889 100644
--- a/tobago-theme/tobago-theme-standard/src/main/npm/ts/tobago-date.ts
+++ b/tobago-theme/tobago-theme-standard/src/main/npm/ts/tobago-date.ts
@@ -15,234 +15,58 @@
  * limitations under the License.
  */
 
-import {DatePickerLightElement} from "@vaadin/vaadin-date-picker";
-import {DomUtils} from "./tobago-utils";
-
-class DateTime extends HTMLElement {
+import {DatePickerLightElement} from "@vaadin/vaadin-date-picker/vaadin-date-picker-light";
+// @ts-ignore
+import moment = require("moment");
+import {Page} from "./tobago-page";
+
+interface VaadinDate {
+  day: number;
+  month: number;
+  year: number;
+}
 
-  static addPastClass(date: HTMLInputElement): void {
-    let today = date.dataset.tobagoToday;
-    if (today.length === 10) {
-      const todayArray = today.split("-");
-      if (todayArray.length === 3) {
-        const year = todayArray[0];
-        const month = todayArray[1];
-        const day = todayArray[2];
-        const todayTimestamp = new Date(month + "/" + day + "/" + year).getTime();
+interface VaadinDatePickerI18n {
+  week: string;
+  calendar?: string;
+  clear: string;
+  today: string;
+  cancel: string;
+  firstDayOfWeek: number;
+  monthNames: string[];
+  weekdays: string[];
+  weekdaysShort: string[];
+  formatDate: (date: VaadinDate) => string;
+  formatTitle: (monthName: string, fullYear: string) => string;
+  parseDate: (dateString: string) => VaadinDate;
+}
 
-        const days = document.querySelectorAll(".bootstrap-datetimepicker-widget .datepicker-days
td.day[data-day]");
-        for (const day of days) {
-          const currentTimestamp = new Date(day.getAttribute("data-day")).getTime();
-          if (currentTimestamp < todayTimestamp) {
-            day.classList.add("past");
-          }
-        }
-      }
-    }
-  }
+class DatePicker extends HTMLElement {
 
   constructor() {
     super();
   }
 
   connectedCallback(): void {
+    let vaadinDatePicker = document.createElement("vaadin-date-picker-light") as DatePickerLightElement;
+    vaadinDatePicker.setAttribute("attr-for-value", "value");
+    let input = this.inputElement;
+    const i18n = input.dataset.tobagoDateTimeI18n ? JSON.parse(input.dataset.tobagoDateTimeI18n)
: undefined;
+    vaadinDatePicker.i18n = this.createVaadinI18n(i18n);
+    vaadinDatePicker.readonly = input.hasAttribute("readonly"); // todo make attribute
+    vaadinDatePicker.showWeekNumbers = true; // tbd
 
-    const date = this.inputElement;
-
-    if (date.readOnly || date.disabled) {
-      return;
-    }
-
-    const analyzed = this.analyzePattern();
-    const options = {
-      format: analyzed,
-      showTodayButton: date.dataset.tobagoTodayButton === "data-tobago-today-button",
-      icons: {
-        time: "fa fa-clock-o",
-        date: "fa fa-calendar",
-        up: "fa fa-chevron-up",
-        down: "fa fa-chevron-down",
-        previous: "fa fa-chevron-left",
-        next: "fa fa-chevron-right",
-        today: "fa fa-calendar-check-o",
-        clear: "fa fa-trash",
-        close: "fa fa-times"
-      },
-      keyBinds: {
-        left: function ($widget): void {
-          const widget: HTMLDivElement = $widget[0] as HTMLDivElement;
-          if (widget === undefined) {
-            if (date.selectionStart === date.selectionEnd) {
-              if (date.selectionStart > 0 || date.selectionStart > 0) {
-                date.selectionStart--;
-                date.selectionEnd--;
-              }
-            } else {
-              date.selectionEnd = date.selectionStart;
-            }
-          } else if (DomUtils.isVisible(widget.querySelector(".datepicker"))) {
-            this.date(this.date().clone().subtract(1, "d"));
-          }
-        },
-        right: function ($widget): void {
-          const widget: HTMLDivElement = $widget[0] as HTMLDivElement;
-          if (widget === undefined) {
-            if (date.selectionStart === date.selectionEnd) {
-              if (date.selectionStart > 0 || date.selectionStart < date.value.length)
{
-                date.selectionEnd++;
-                date.selectionStart++;
-              }
-            } else {
-              date.selectionStart = date.selectionEnd;
-            }
-          } else if (DomUtils.isVisible(widget.querySelector(".datepicker"))) {
-            this.date(this.date().clone().add(1, "d"));
-          }
-        },
-        enter: function ($widget): void {
-          const widget: HTMLDivElement = $widget[0] as HTMLDivElement;
-          if (widget !== undefined && DomUtils.isVisible(widget.querySelector(".datepicker")))
{
-            this.hide();
-            fixKey(13);
-          } else {
-            //jQuery because used by datetimepicker
-            jQuery(date).trigger(jQuery.Event("keypress", {
-              which: 13,
-              target: date
-            }));
-          }
-        },
-        escape: function ($widget): void {
-          const widget: HTMLDivElement = $widget[0] as HTMLDivElement;
-          if (widget !== undefined && DomUtils.isVisible(widget.querySelector(".datepicker")))
{
-            this.hide();
-            fixKey(27);
-          }
-        },
-        "delete": function (): void {
-          if (date.selectionStart < date.value.length) {
-            const selectionStart = date.selectionStart;
-            let selectionEnd = date.selectionEnd;
-
-            if (selectionStart === selectionEnd && selectionStart < date.value.length)
{
-              selectionEnd++;
-            }
-            date.value = date.value.substr(0, selectionStart)
-                + date.value.substr(selectionEnd, date.value.length);
-
-            date.selectionEnd = selectionStart;
-            date.selectionStart = selectionStart;
-          }
-        }
-      },
-      widgetParent: ".tobago-page-menuStore"
-    };
-
-    /**
-     * After ESC or ENTER is pressed we need to fire the keyup event manually.
-     * see: https://github.com/tempusdominus/bootstrap-4/issues/159
-     */
-    function fixKey(keyCode): void {
-      let keyupEvent = jQuery.Event("keyup");
-      keyupEvent.which = keyCode;
-      jQuery(date).trigger(keyupEvent);
+    while (this.childNodes.length) {
+      vaadinDatePicker.appendChild(this.firstChild);
     }
-
-    const i18n = date.dataset.tobagoDateTimeI18n ? JSON.parse(date.dataset.tobagoDateTimeI18n)
: undefined;
-    if (i18n) {
-      const monthNames = i18n.monthNames;
-      if (monthNames) {
-        moment.localeData()._months = monthNames;
-      }
-      const monthNamesShort = i18n.monthNamesShort;
-      if (monthNamesShort) {
-        moment.localeData()._monthsShort = monthNamesShort;
-      }
-      const dayNames = i18n.dayNames;
-      if (dayNames) {
-        moment.localeData()._weekdays = dayNames;
-      }
-      const dayNamesShort = i18n.dayNamesShort;
-      if (dayNamesShort) {
-        moment.localeData()._weekdaysShort = dayNamesShort;
-      }
-      const dayNamesMin = i18n.dayNamesMin;
-      if (dayNamesMin) {
-        moment.localeData()._weekdaysMin = dayNamesMin;
-      }
-      const firstDay = i18n.firstDay;
-      if (firstDay) {
-        moment.localeData()._week.dow = firstDay;
-      }
-    }
-
-    let $dateParent = jQuery(date).parent(); //use jQuery because required for datetimepicker
-    $dateParent.datetimepicker(options);
-
-    // we need to add the change listener here, because
-    // in line 1307 of bootstrap-datetimepicker.js
-    // the 'stopImmediatePropagation()' stops the change-event
-    // execution of line 686 in tobago.js
-
-    $dateParent.on("dp.change", function (event: Event): void {
-      event.target.dispatchEvent(new Event("change", {bubbles: true}));
-    });
-
-    // set position
-    $dateParent.on("dp.show", function (): void {
-      let datepicker: HTMLDivElement = document.querySelector(".bootstrap-datetimepicker-widget");
-      let div: HTMLDivElement = this;
-      let top, left;
-      if (datepicker.classList.contains("bottom")) {
-        top = DomUtils.offset(div).top + div.offsetHeight;
-        left = DomUtils.offset(div).left;
-        datepicker.style.top = top + "px";
-        datepicker.style.bottom = "auto";
-        datepicker.style.left = left + "px";
-      } else if (datepicker.classList.contains("top")) {
-        top = DomUtils.offset(div).top - datepicker.offsetHeight;
-        left = DomUtils.offset(div).left;
-        datepicker.style.top = top + "px";
-        datepicker.style.bottom = "auto";
-        datepicker.style.left = left + "px";
-      }
-      DateTime.addPastClass(date);
-    });
-
-    // set css class in update - like changing the month
-    $dateParent.on("dp.update", function (): void {
-      DateTime.addPastClass(date);
-    });
-
-    // fix for bootstrap-datetimepicker v4.17.45
-    $dateParent.on("dp.show", function (): void {
-      const collapseIn = document.querySelector(".bootstrap-datetimepicker-widget .collapse.in");
-      const pickerSwitch = document.querySelector(".bootstrap-datetimepicker-widget .picker-switch
a");
-
-      if (collapseIn !== null) {
-        collapseIn.classList.add("show");
-      }
-      if (pickerSwitch !== null) {
-        pickerSwitch.addEventListener(
-            "click", function (): void {
-              // the click is executed before togglePicker() function
-              let datetimepicker: HTMLDivElement = document.querySelector(".bootstrap-datetimepicker-widget");
-              datetimepicker.querySelector(".collapse.in").classList.remove("in");
-              datetimepicker.querySelector(".collapse.show").classList.add("in");
-            });
-      }
-    });
-  }
-
-  get inputElement(): HTMLInputElement {
-    return this.querySelector("input") as HTMLInputElement;
+    this.appendChild(vaadinDatePicker);
   }
 
   /*
- Get the pattern from the "Java world" (http://docs.oracle.com/javase/8/docs/api/java/text/SimpleDateFormat.html)
- and convert it to 'moment.js'.
- Attention: Not every pattern char is supported.
- */
+Get the pattern from the "Java world" (http://docs.oracle.com/javase/8/docs/api/java/text/SimpleDateFormat.html)
+and convert it to 'moment.js'.
+Attention: Not every pattern char is supported.
+*/
   analyzePattern(): string {
     const originalPattern = this.inputElement.dataset.tobagoPattern;
 
@@ -366,33 +190,61 @@ class DateTime extends HTMLElement {
     return pattern;
   }
 
-}
+  createVaadinI18n(i18n: any): VaadinDatePickerI18n {
 
-// XXX switched off
-document.addEventListener("DOMContentLoaded", function (event: Event): void {
-  window.customElements.define("tobago-date", DateTime);
-});
+    const pattern = this.analyzePattern();
+    const locale = Page.page().locale;
 
-class VaadinDatePicker extends HTMLElement {
+    moment.updateLocale(locale, {
+      months: i18n.monthNames,
+      monthsShort: i18n.monthNamesShort,
+      weekdays: i18n.dayNames,
+      weekdaysShort: i18n.dayNamesShort,
+      weekdaysMin: i18n.dayNamesMin,
+      week: {
+        dow: i18n.firstDay,
+        doy: 7 + i18n.firstDay - i18n.minDays // XXX seems not to be supported by VaadinDatePicker:
may file an issue!
+      }
+    });
 
-  constructor() {
-    super();
+    const localeData = moment.localeData(locale);
+    return {
+
+      cancel: i18n.cancel,
+      clear: i18n.clear,
+      firstDayOfWeek: localeData.firstDayOfWeek(),
+      monthNames: localeData.months(),
+      today: i18n.today,
+      week: i18n.week,
+      weekdays: localeData.weekdays(),
+      weekdaysShort: localeData.weekdaysShort(),
+      formatDate: (date: VaadinDate) => {
+        return moment({
+          date: date.day,
+          month: date.month,
+          year: date.year,
+        })
+            .locale(locale!)
+            .format(pattern);
+      },
+      formatTitle: (monthName: string, fullYear: string) => `${monthName} ${fullYear}`,
+      parseDate: (dateString: string) => {
+        const date = moment(dateString, pattern, locale);
+        return {
+          day: date.date(),
+          month: date.month(),
+          year: date.year(),
+        };
+      },
+    };
   }
 
-  connectedCallback(): void {
-    let outer = this.querySelector(".tobago-input-group-outer");
-    let vaadinDatePicker = document.createElement("vaadin-date-picker-light") as HTMLElement;
-    vaadinDatePicker.setAttribute("attr-for-value", "value");
-    // vaadinDatePicker.addEventListener("change", (event) => {
-    //   input.value = vaadinDatePicker.value;
-    // });
-    this.appendChild(vaadinDatePicker);
-    vaadinDatePicker.appendChild(outer);
-    // input.classList.add("d-none");
+  get inputElement(): HTMLInputElement {
+    return this.querySelector(".input") as HTMLInputElement;
   }
 }
 
 // XXX switched on
-// document.addEventListener("DOMContentLoaded", function (event: Event): void {
-//   window.customElements.define("tobago-date", VaadinDatePicker);
-// });
+document.addEventListener("DOMContentLoaded", function (event: Event): void {
+  window.customElements.define("tobago-date", DatePicker);
+});
diff --git a/tobago-theme/tobago-theme-standard/src/main/npm/ts/tobago-page.ts b/tobago-theme/tobago-theme-standard/src/main/npm/ts/tobago-page.ts
index 931fe6b..7c335ba 100644
--- a/tobago-theme/tobago-theme-standard/src/main/npm/ts/tobago-page.ts
+++ b/tobago-theme/tobago-theme-standard/src/main/npm/ts/tobago-page.ts
@@ -23,13 +23,13 @@ export class Page extends HTMLElement {
   /**
    * The Tobago root element
    */
-  static page(): HTMLElement {
+  static page(): Page {
     const pages = document.getElementsByTagName("tobago-page");
     if (pages.length > 0) {
       if (pages.length >= 2) {
         console.warn("Found more than one tobago page!");
       }
-      return pages.item(0) as HTMLElement;
+      return pages.item(0) as Page;
     }
     console.warn("Found no tobago page!");
     return null;
@@ -72,6 +72,14 @@ export class Page extends HTMLElement {
       }
     });
   }
+
+  get locale(): string {
+    let locale = this.getAttribute("locale");
+    if (!locale) {
+        locale = document.documentElement.lang;
+    }
+    return locale;
+  }
 }
 
 document.addEventListener("DOMContentLoaded", function (event: Event): void {
diff --git a/tobago-theme/tobago-theme-standard/src/main/resources/META-INF/tobago-config.xml
b/tobago-theme/tobago-theme-standard/src/main/resources/META-INF/tobago-config.xml
index c1436ff..27eadcd 100644
--- a/tobago-theme/tobago-theme-standard/src/main/resources/META-INF/tobago-config.xml
+++ b/tobago-theme/tobago-theme-standard/src/main/resources/META-INF/tobago-config.xml
@@ -43,8 +43,7 @@
           <script name="/webjars/tether/1.4.0/js/tether.min.js"/>
           <script name="/webjars/popper.js/1.14.3/umd/popper.min.js"/>
           <script name="/webjars/bootstrap/4.3.1/js/bootstrap.min.js"/>
-          <script name="/webjars/momentjs/2.22.2/min/moment-with-locales.min.js"/>
-          <script name="/webjars/Eonasdan-bootstrap-datetimepicker/4.17.47/js/bootstrap-datetimepicker.min.js"/>
+          <script name="/webjars/momentjs/2.24.0/min/moment-with-locales.min.js"/>
 <!--          <script name="/tobago/standard/tobago-bootstrap/${project.version}/node_modules/@babel/polyfill/dist/polyfill.js"/>-->
           <script name="/tobago/standard/tobago-bootstrap/${project.version}/js/tobago-polyfill.js"/>
           <script name="/tobago/standard/tobago-bootstrap/${project.version}/js/tobago.min.js"/>
@@ -52,7 +51,6 @@
           <style name="/webjars/tether/1.4.0/css/tether.min.css"/>
           <style name="/tobago/standard/tobago-bootstrap/${project.version}/css/tobago.min.css"/>
           <style name="/webjars/font-awesome/4.7.0/css/font-awesome.min.css"/>
-          <style name="/webjars/Eonasdan-bootstrap-datetimepicker/4.17.47/css/bootstrap-datetimepicker.min.css"/>
         </includes>
       </resources>
       <resources production="false">
@@ -62,8 +60,7 @@
           <script name="/webjars/tether/1.4.0/js/tether.js"/>
           <script name="/webjars/popper.js/1.14.3/umd/popper.js"/>
           <script name="/webjars/bootstrap/4.3.1/js/bootstrap.js"/>
-          <script name="/webjars/momentjs/2.22.2/min/moment-with-locales.js"/>
-          <script name="/webjars/Eonasdan-bootstrap-datetimepicker/4.17.47/js/bootstrap-datetimepicker.js"/>
+          <script name="/webjars/momentjs/2.24.0/min/moment-with-locales.js"/>
           <script name="/tobago/standard/tobago-bootstrap/${project.version}/js/tobago-myfaces.js"/>
           <script name="/tobago/standard/tobago-bootstrap/${project.version}/js/tobago-deltaspike.js"/>
 <!--          <script name="/tobago/standard/tobago-bootstrap/${project.version}/node_modules/@babel/polyfill/dist/polyfill.js"/>-->
@@ -101,7 +98,6 @@
           <style name="/webjars/tether/1.4.0/css/tether.css"/>
           <style name="/tobago/standard/tobago-bootstrap/${project.version}/css/tobago.css"/>
           <style name="/webjars/font-awesome/4.7.0/css/font-awesome.css"/>
-          <style name="/webjars/Eonasdan-bootstrap-datetimepicker/4.17.47/css/bootstrap-datetimepicker.css"/>
         </includes>
       </resources>
     </theme-definition>


Mime
View raw message