diff --git a/plugins/discourse-local-dates/assets/javascripts/initializers/discourse-local-dates.js b/plugins/discourse-local-dates/assets/javascripts/initializers/discourse-local-dates.js index d360d643fdd..84b68422577 100644 --- a/plugins/discourse-local-dates/assets/javascripts/initializers/discourse-local-dates.js +++ b/plugins/discourse-local-dates/assets/javascripts/initializers/discourse-local-dates.js @@ -58,6 +58,12 @@ export function applyLocalDates(dates, siteSettings) { } function _rangeIsSameLocalDay(fromElement, toElement) { + if ( + !fromElement.attributes["data-time"] || + !toElement.attributes["data-time"] + ) { + return false; + } const timezone = fromElement.attributes["data-timezone"].value; const from = moment(_getDateFromElement(fromElement)).tz(timezone); const to = moment(_getDateFromElement(toElement)).tz(timezone); diff --git a/plugins/discourse-local-dates/test/javascripts/lib/local-date-builder-test.js b/plugins/discourse-local-dates/test/javascripts/lib/local-date-builder-test.js index 5a640c476de..3cf8bb0f02c 100644 --- a/plugins/discourse-local-dates/test/javascripts/lib/local-date-builder-test.js +++ b/plugins/discourse-local-dates/test/javascripts/lib/local-date-builder-test.js @@ -11,7 +11,7 @@ const PARIS = "Europe/Paris"; const LAGOS = "Africa/Lagos"; const LONDON = "Europe/London"; -function freezeTime({ date, timezone }, cb) { +export function freezeTime({ date, timezone }, cb) { date = date || "2020-01-22 10:34"; const newTimezone = timezone || PARIS; const previousZone = moment.tz.guess(); @@ -89,11 +89,11 @@ module("lib:local-date-builder", function () { test("time", function (assert) { assert.buildsCorrectDate( { - "time": "12:22:00", - "date": "2022-10-07", - "timezone": "Asia/Singapore", - "localTimezone": "Asia/Singapore", - "sameLocalDayAsFrom": true + time: "12:22:00", + date: "2022-10-07", + timezone: "Asia/Singapore", + localTimezone: "Asia/Singapore", + sameLocalDayAsFrom: true, }, { formatted: "12:22 PM (Singapore)" }, "it displays the time only as the date is the same local day as 'from'" diff --git a/plugins/discourse-local-dates/test/javascripts/unit/discourse-local-dates-test.js b/plugins/discourse-local-dates/test/javascripts/unit/discourse-local-dates-test.js new file mode 100644 index 00000000000..d88a8bb7cfe --- /dev/null +++ b/plugins/discourse-local-dates/test/javascripts/unit/discourse-local-dates-test.js @@ -0,0 +1,80 @@ +import { module, test } from "qunit"; +import { applyLocalDates } from "../initializers/discourse-local-dates"; +import { freezeTime } from "../lib/local-date-builder-test"; + +module("Unit | Discourse Local Dates | discourse-local-dates", function () { + function createElementFromHTML(htmlString) { + const div = document.createElement("div"); + div.innerHTML = htmlString.trim(); + // we need "element", not "node", since `.dataset` isn't available on nodes + return div.firstElementChild; + } + + const fromElement = () => + createElementFromHTML( + "' + + "" + ); + const toElement = () => + createElementFromHTML( + "' + + "" + ); + + test("applyLocalDates sets formatted relative time", function (assert) { + const from = fromElement(); + const to = toElement(); + const dateElements = [from, to]; + + freezeTime( + { date: "2022-10-07T10:10:10", timezone: "Asia/Singapore" }, + () => { + applyLocalDates(dateElements, { discourse_local_dates_enabled: true }); + + assert.equal( + from.querySelector(".relative-time").textContent, + "Yesterday 5:21 PM" + ); + assert.equal( + to.querySelector(".relative-time").textContent, + "10:22 PM (Singapore)" + ); + } + ); + }); + + test("applyLocalDates does not fail when a date element has no time", function (assert) { + const from = fromElement(); + const to = toElement(); + delete to.dataset.time; + const dateElements = [from, to]; + + freezeTime( + { date: "2022-10-07T10:10:10", timezone: "Asia/Singapore" }, + () => { + applyLocalDates(dateElements, { discourse_local_dates_enabled: true }); + + assert.equal( + from.querySelector(".relative-time").textContent, + "Yesterday 5:21 PM" + ); + assert.equal( + to.querySelector(".relative-time").textContent, + "Thursday" + ); + } + ); + }); +});