diff --git a/CHANGELOG.md b/CHANGELOG.md index 821e889a9a5301ece94a6a9d1f319ba4801b2320..83c02c9a489b2faaf7dc1af197764c1687c7911c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -50,6 +50,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 [caosdb-webui#226](https://gitlab.com/caosdb/caosdb-webui/-/issues/226) * Fixed broken download of referenced files in the export of select statements. https://gitlab.com/linkahead/linkahead-webui/-/issues/238 +* Fixed breaking timestamps due to whitespace [caosdb-webui#239](https://gitlab.com/caosdb/caosdb-webui/-/issues/239) ### Security ### diff --git a/src/core/js/caosdb.js b/src/core/js/caosdb.js index af81a120cf4c4f1e4a42ee709566e4f5d3b01568..e709f2318342fb4f14dc336c11245a4b29126d59 100644 --- a/src/core/js/caosdb.js +++ b/src/core/js/caosdb.js @@ -330,13 +330,19 @@ var getEntityIdVersion = function (entity) { } /** - * Take a date and a time and format it into a LinkAhead compatible representation. + * Take a date, a time and subseconds and format it into a LinkAhead compatible representation. * @param date A date * @param time A time + * @param subsec fractions of a seconds part of the time stamp; Must be empty + * string if not used * @return A LinkAhead compatible representation. */ -function input2caosdbDate(date, time) { - return date + "T" + time; +function input2caosdbDate(date, time, subsec) { + let res = date + "T" + time; + if (subsec!=""){ + res = res +"." + subsec; + } + return res } /** @@ -366,18 +372,22 @@ var getAllEntityPermissions = function (entity) { } /** - * Take a datetime from caosdb and return a date and a time + * Take a datetime from caosdb and return a date, a time and the subseconds * suitable for html inputs. * * If the text contains only a date it is returned. * * @param text The string from LinkAhead. - * @return A new string for the input element. + * @return A list of strings for the input elements. */ function caosdb2InputDate(text) { if (text.includes("T")) { - var spl = text.split("T"); - return [spl[0], spl[1].substring(0, 8)]; + var spl = text.trim().split("T"); + var subsec="" + if (spl[1].includes(".")) { + subsec = spl[1].split('.')[1] + } + return [spl[0], spl[1].substring(0, 8), subsec]; } return [text]; } diff --git a/src/core/js/edit_mode.js b/src/core/js/edit_mode.js index 3c06aeb43f9f613b4df09d269b6bbd59c7775933..ae165735a6aabef916fa0a2d023596d89ce000a1 100644 --- a/src/core/js/edit_mode.js +++ b/src/core/js/edit_mode.js @@ -513,8 +513,10 @@ var edit_mode = new function () { var _parse_single_datetime = function (field) { let time = $(field).find(":input[type='time']").val() let date = $(field).find(":input[type='date']").val(); + // subseconds are stored in the subsec attribue of the input element + let subsec = $(field).find(":input[type='time']").attr('subsec'); if (time) { - return input2caosdbDate(date, time); + return input2caosdbDate(date, time, subsec); } else { return date; } @@ -975,10 +977,11 @@ var edit_mode = new function () { dateandtime = caosdb2InputDate(property.value); } let date = dateandtime[0]; - if (dateandtime.length == 2) { + if (dateandtime.length > 1) { let time = dateandtime[1]; + // subseconds are stored in the subsec attribue of the input element result = "<span><input type='date' value='" + date + "'/>" + - "<input type='time' value='" + time + "'/></span>"; + "<input type='time' subsec='"+dateandtime[2]+"' value='" + time + "'/></span>"; } else if (property.value && ((property.name || "").toLowerCase() == "year" || (date.match(/-/g) || []).length == 0)) { // Year result = "<input type='number' value='" + date + "'/>"; diff --git a/test/core/js/modules/caosdb.js.js b/test/core/js/modules/caosdb.js.js index d4b4c509b177ee76c50368ded4ecee40caecb4d9..2e98e341240a22b1160587ea2de59dde9ce7660b 100644 --- a/test/core/js/modules/caosdb.js.js +++ b/test/core/js/modules/caosdb.js.js @@ -661,3 +661,19 @@ QUnit.test("getPropertyFromElement", async function(assert) { }); }); + +QUnit.test("input2caosdbDate", function(assert) { + assert.ok(input2caosdbDate); + assert.equal(input2caosdbDate("2023-10-18","10:10:10", "1234"), "2023-10-18T10:10:10.1234") + assert.equal(input2caosdbDate("2023-10-18","10:10:10", ""), "2023-10-18T10:10:10") +}); + +QUnit.test("caosdb2InputDate", function(assert) { + assert.ok(caosdb2InputDate); + arr1 = caosdb2InputDate("2023-10-18T10:10:10.1234") + arr2=["2023-10-18","10:10:10", "1234"] + assert.ok(arr1.length === arr2.length && arr1.every((value, index) => value === arr2[index])) + assert.ok(arr1.length === arr2.length && arr1.every((value, index) => value === arr2[index])) + arr1 = caosdb2InputDate("2023-10-18T10:10:10") + arr2=["2023-10-18","10:10:10", ""] +});