Incorrect detection of datetime values
authorAlexander Ebert <ebert@woltlab.com>
Mon, 2 Nov 2020 15:29:35 +0000 (16:29 +0100)
committerAlexander Ebert <ebert@woltlab.com>
Mon, 2 Nov 2020 15:29:35 +0000 (16:29 +0100)
Fixes #3673

wcfsetup/install/files/js/WoltLabSuite/Core/Date/Picker.js
wcfsetup/install/files/ts/WoltLabSuite/Core/Date/Picker.ts

index 7c8458a8a52fc9ffce1f93ea684073e80dd1378a..2e2ee7e7276f2d7c2c2ae9c6fed3e137a2727793 100644 (file)
@@ -528,7 +528,8 @@ define(["require", "exports", "tslib", "../Core", "./Util", "../Dom/Change/Liste
                 .forEach((element) => {
                 element.classList.add("inputDatePicker");
                 element.readOnly = true;
-                const isDateTime = element.type === "datetime";
+                // Use `getAttribute()`, because `.type` is normalized to "text" for unknown values.
+                const isDateTime = element.getAttribute("type") === "datetime";
                 const isTimeOnly = isDateTime && Core.stringToBool(element.dataset.timeOnly || "");
                 const disableClear = Core.stringToBool(element.dataset.disableClear || "");
                 const ignoreTimezone = isDateTime && Core.stringToBool(element.dataset.ignoreTimezone || "");
@@ -538,6 +539,10 @@ define(["require", "exports", "tslib", "../Core", "./Util", "../Dom/Change/Liste
                 // convert value
                 let date = null;
                 let value = element.value;
+                if (!value) {
+                    // Some legacy code may incorrectly use `setAttribute("value", value)`.
+                    value = element.getAttribute("value") || "";
+                }
                 // ignore the timezone, if the value is only a date (YYYY-MM-DD)
                 const isDateOnly = /^\d+-\d+-\d+$/.test(value);
                 if (value) {
@@ -790,7 +795,7 @@ define(["require", "exports", "tslib", "../Core", "./Util", "../Dom/Change/Liste
             const container = element.parentNode;
             container.parentNode.insertBefore(element, container);
             container.remove();
-            element.type = "date" + (data.isDateTime ? "time" : "");
+            element.setAttribute("type", "date" + (data.isDateTime ? "time" : ""));
             element.name = data.shadow.name;
             element.value = data.shadow.value;
             element.removeAttribute("data-value");
index 9c5c304a9b78dda9596cc2a8404dd4586e71b387..2abc9b64bfc3aa48c60398496530e9db706c77fc 100644 (file)
@@ -643,7 +643,8 @@ const DatePicker = {
         element.classList.add("inputDatePicker");
         element.readOnly = true;
 
-        const isDateTime = element.type === "datetime";
+        // Use `getAttribute()`, because `.type` is normalized to "text" for unknown values.
+        const isDateTime = element.getAttribute("type") === "datetime";
         const isTimeOnly = isDateTime && Core.stringToBool(element.dataset.timeOnly || "");
         const disableClear = Core.stringToBool(element.dataset.disableClear || "");
         const ignoreTimezone = isDateTime && Core.stringToBool(element.dataset.ignoreTimezone || "");
@@ -655,6 +656,10 @@ const DatePicker = {
         // convert value
         let date: Date | null = null;
         let value = element.value;
+        if (!value) {
+          // Some legacy code may incorrectly use `setAttribute("value", value)`.
+          value = element.getAttribute("value") || "";
+        }
 
         // ignore the timezone, if the value is only a date (YYYY-MM-DD)
         const isDateOnly = /^\d+-\d+-\d+$/.test(value);
@@ -951,7 +956,7 @@ const DatePicker = {
     container.parentNode!.insertBefore(element, container);
     container.remove();
 
-    element.type = "date" + (data.isDateTime ? "time" : "");
+    element.setAttribute("type", "date" + (data.isDateTime ? "time" : ""));
     element.name = data.shadow.name;
     element.value = data.shadow.value;