From d5a70c7989e3a5b5f6c96ff450f57c2762f3f423 Mon Sep 17 00:00:00 2001 From: Stefan Topfstedt Date: Wed, 28 Feb 2024 13:16:34 -0800 Subject: [PATCH 1/6] replaces Moment with Luxon in SessionOverviewIlmDueDate component. --- .../session-overview-ilm-duedate.js | 23 ++++++++----------- 1 file changed, 10 insertions(+), 13 deletions(-) diff --git a/packages/ilios-common/addon/components/session-overview-ilm-duedate.js b/packages/ilios-common/addon/components/session-overview-ilm-duedate.js index d52e0bf271..d0cb6e6aa6 100644 --- a/packages/ilios-common/addon/components/session-overview-ilm-duedate.js +++ b/packages/ilios-common/addon/components/session-overview-ilm-duedate.js @@ -3,7 +3,7 @@ import { tracked } from '@glimmer/tracking'; import { action } from '@ember/object'; import { validatable, NotBlank } from 'ilios-common/decorators/validation'; import { dropTask } from 'ember-concurrency'; -import moment from 'moment'; +import { DateTime } from 'luxon'; @validatable export default class SessionOverviewIlmDuedateComponent extends Component { @@ -16,22 +16,19 @@ export default class SessionOverviewIlmDuedateComponent extends Component { @action updateDate(date) { - const currentDueDate = moment(this.dueDate); - this.dueDate = moment(date) - .hour(currentDueDate.hour()) - .minute(currentDueDate.minute()) - .toDate(); + const currentDueDate = DateTime.fromJSDate(this.dueDate); + this.dueDate = DateTime.fromJSDate(date) + .set({ + hour: currentDueDate.hour, + minute: currentDueDate.minute, + }) + .toJSDate(); } @action updateTime(value, type) { - const dueDate = moment(this.dueDate); - if (type === 'hour') { - dueDate.hour(value); - } else { - dueDate.minute(value); - } - this.dueDate = dueDate.toDate(); + const update = 'hour' === type ? { hour: value } : { minute: value }; + this.dueDate = DateTime.fromJSDate(this.dueDate).set(update).toJSDate(); } save = dropTask(async () => { From fe30c55d4189c801238b4412a3208f8a529181f4 Mon Sep 17 00:00:00 2001 From: Stefan Topfstedt Date: Wed, 28 Feb 2024 13:33:06 -0800 Subject: [PATCH 2/6] replaces Moment with Luxon in Dashboard/Week component. --- .../addon/components/dashboard/week.js | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/packages/ilios-common/addon/components/dashboard/week.js b/packages/ilios-common/addon/components/dashboard/week.js index 16d8484ea7..a4adf7bcd6 100644 --- a/packages/ilios-common/addon/components/dashboard/week.js +++ b/packages/ilios-common/addon/components/dashboard/week.js @@ -1,19 +1,19 @@ import Component from '@glimmer/component'; -import moment from 'moment'; - +import { DateTime } from 'luxon'; export default class DashboardWeekComponent extends Component { get expanded() { - const lastSunday = moment().day(1).subtract(1, 'week').format('W'); - const thisSunday = moment().day(1).format('W'); - const nextSunday = moment().day(1).add(1, 'week').format('W'); + const now = DateTime.now(); + const lastSunday = now.set({ weekday: 1 }).minus({ week: 1 }).toFormat('W'); + const thisSunday = now.set({ weekday: 1 }).toFormat('W'); + const nextSunday = now.set({ weekday: 1 }).plus({ week: 1 }).toFormat('W'); return `${lastSunday}-${thisSunday}-${nextSunday}`; } get year() { - return moment().year(); + return DateTime.now().year; } get week() { //set day to Thursday to correctly calculate isoWeek - return moment().day(4).isoWeek(); + return DateTime.now().set({ weekday: 4 }).weekNumber; } } From de3c4d56477d98f5ede2a712702ceb9822a3aba1 Mon Sep 17 00:00:00 2001 From: Stefan Topfstedt Date: Wed, 28 Feb 2024 13:34:43 -0800 Subject: [PATCH 3/6] replaces Moment with Luxon in SessionCopy component. --- packages/ilios-common/addon/components/session-copy.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/ilios-common/addon/components/session-copy.js b/packages/ilios-common/addon/components/session-copy.js index 06fddf827c..ca8face3ea 100644 --- a/packages/ilios-common/addon/components/session-copy.js +++ b/packages/ilios-common/addon/components/session-copy.js @@ -4,7 +4,7 @@ import { hash, all, filter } from 'rsvp'; import { dropTask, restartableTask, timeout } from 'ember-concurrency'; import { action } from '@ember/object'; import { tracked } from '@glimmer/tracking'; -import moment from 'moment'; +import { DateTime } from 'luxon'; import { findById, sortBy } from 'ilios-common/utils/array-helpers'; export default class SessionCopyComponent extends Component { @@ -31,8 +31,8 @@ export default class SessionCopyComponent extends Component { }, }), }); - const now = moment(); - const thisYear = now.year(); + const now = DateTime.now(); + const thisYear = now.year; this.years = years .map((year) => Number(year.id)) .filter((year) => year >= thisYear - 1) From 55a65d6af2e5978cccfb471999871021bf44bfa2 Mon Sep 17 00:00:00 2001 From: Stefan Topfstedt Date: Wed, 28 Feb 2024 13:38:13 -0800 Subject: [PATCH 4/6] replaces Moment with Luxon in WeeklyEvents component. --- packages/ilios-common/addon/components/weekly-events.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/ilios-common/addon/components/weekly-events.js b/packages/ilios-common/addon/components/weekly-events.js index ea1dea4888..3013498d61 100644 --- a/packages/ilios-common/addon/components/weekly-events.js +++ b/packages/ilios-common/addon/components/weekly-events.js @@ -1,10 +1,10 @@ import Component from '@glimmer/component'; import { action } from '@ember/object'; -import moment from 'moment'; +import { DateTime } from 'luxon'; export default class WeeklyEvents extends Component { get weeksInYear() { - const weeksInTheYear = moment().year(this.args.year).isoWeeksInYear(); + const weeksInTheYear = DateTime.now().set({ year: this.args.year }).weeksInWeekYear; const weeks = []; for (let i = 1; i <= weeksInTheYear; i++) { weeks.push(`${i}`); From 99d09d483d7e4d6a7f7bf76e928efd1f1a3ff34c Mon Sep 17 00:00:00 2001 From: Stefan Topfstedt Date: Wed, 28 Feb 2024 14:26:27 -0800 Subject: [PATCH 5/6] replaces Moment with Luxon in SessionOverview component. Luxon formats localized dates slightly different than Moment - day and month are unpadded numbers in Luxon. --- .../tests/acceptance/course/session/overview-test.js | 2 +- packages/ilios-common/addon/components/session-overview.js | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/frontend/tests/acceptance/course/session/overview-test.js b/packages/frontend/tests/acceptance/course/session/overview-test.js index 5fc5cd32bd..76c3c99ce9 100644 --- a/packages/frontend/tests/acceptance/course/session/overview-test.js +++ b/packages/frontend/tests/acceptance/course/session/overview-test.js @@ -215,7 +215,7 @@ module('Acceptance | Session - Overview', function (hooks) { assert.strictEqual(currentRouteName(), 'session.index'); assert.strictEqual( page.details.overview.lastUpdated, - 'Last Update Last Update: 07/09/2019 5:00 PM', + 'Last Update Last Update: 7/9/2019 5:00 PM', ); }); diff --git a/packages/ilios-common/addon/components/session-overview.js b/packages/ilios-common/addon/components/session-overview.js index c737908dc8..1f2200e49e 100644 --- a/packages/ilios-common/addon/components/session-overview.js +++ b/packages/ilios-common/addon/components/session-overview.js @@ -4,7 +4,7 @@ import { action } from '@ember/object'; import { service } from '@ember/service'; import { isEmpty } from '@ember/utils'; import { task, restartableTask, dropTask } from 'ember-concurrency'; -import moment from 'moment'; +import { DateTime } from 'luxon'; import { validatable, Length, Gte, NotBlank } from 'ilios-common/decorators/validation'; import { hash } from 'rsvp'; import { findById, sortBy } from 'ilios-common/utils/array-helpers'; @@ -123,7 +123,7 @@ export default class SessionOverview extends Component { } else { this.isIndependentLearning = false; } - this.updatedAt = moment(session.updatedAt).format('L LT'); + this.updatedAt = DateTime.fromJSDate(session.updatedAt).toFormat('D t'); this.sessionTypes = sessionTypes || []; this.description = session.description; }); @@ -172,7 +172,7 @@ export default class SessionOverview extends Component { await ilmSession.save(); } else { const hours = 1; - const dueDate = moment().add(6, 'weeks').hour('17').minute('00').toDate(); + const dueDate = DateTime.now().plus({ week: 6 }).set({ hour: 17, minute: 0 }).toJSDate(); this.hours = hours; const ilmSession = this.store.createRecord('ilm-session', { session: this.args.session, From 60357d7d34ffa02876d7ea749279f12e25fec7cd Mon Sep 17 00:00:00 2001 From: Stefan Topfstedt Date: Wed, 28 Feb 2024 14:50:47 -0800 Subject: [PATCH 6/6] replaces Moment with Luxon in DailyCalendarEvent component. had to convert the datetime test vectors to proper ISO format, since that's what is expected as input. --- .../addon/components/daily-calendar-event.js | 34 +++-- .../components/daily-calendar-event-test.js | 132 +++++++++--------- 2 files changed, 82 insertions(+), 84 deletions(-) diff --git a/packages/ilios-common/addon/components/daily-calendar-event.js b/packages/ilios-common/addon/components/daily-calendar-event.js index 2a1435d56f..48789c456c 100644 --- a/packages/ilios-common/addon/components/daily-calendar-event.js +++ b/packages/ilios-common/addon/components/daily-calendar-event.js @@ -1,5 +1,5 @@ import Component from '@glimmer/component'; -import moment from 'moment'; +import { DateTime } from 'luxon'; import colorChange from 'ilios-common/utils/color-change'; import { htmlSafe } from '@ember/template'; import calendarEventTooltip from 'ilios-common/utils/calendar-event-tooltip'; @@ -7,7 +7,6 @@ import { service } from '@ember/service'; export default class DailyCalendarEventComponent extends Component { @service intl; - @service moment; constructor() { super(...arguments); @@ -37,45 +36,44 @@ export default class DailyCalendarEventComponent extends Component { get tooltipContent() { //access the locale info here so the getter will recompute when it changes - this.moment.locale; this.intl.locale; return calendarEventTooltip(this.args.event, this.intl, 'h:mma'); } get recentlyUpdated() { - const lastModifiedDate = moment(this.args.event.lastModified); - const today = moment(); - const daysSinceLastUpdate = today.diff(lastModifiedDate, 'days'); + const lastModifiedDate = DateTime.fromISO(this.args.event.lastModified); + const today = DateTime.now(); + const daysSinceLastUpdate = today.diff(lastModifiedDate, 'days').days; - return daysSinceLastUpdate < 6 ? true : false; + return daysSinceLastUpdate < 6; } - get startMoment() { - return moment(this.args.event.startDate); + get startLuxon() { + return DateTime.fromISO(this.args.event.startDate); } - get endMoment() { - return moment(this.args.event.endDate); + get endLuxon() { + return DateTime.fromISO(this.args.event.endDate); } - get startOfDay() { - return this.startMoment.startOf('day'); + get startOfDayLuxon() { + return this.startLuxon.startOf('day'); } get startMinuteRounded() { - const minute = this.startMoment.diff(this.startOfDay, 'minutes'); + const minute = this.startLuxon.diff(this.startOfDayLuxon, 'minutes').minutes; return Math.ceil(minute / 5); } get totalMinutesRounded() { - const minutes = this.endMoment.diff(this.startMoment, 'minutes'); + const minutes = this.endLuxon.diff(this.startLuxon, 'minutes').minutes; return Math.floor(minutes / 5); } getMinuteInTheDay(date) { - const m = moment(date); - const midnight = moment(date).startOf('day'); - return m.diff(midnight, 'minutes'); + const dt = DateTime.fromISO(date); + const midnight = dt.startOf('day'); + return dt.diff(midnight, 'minutes').minutes; } get span() { diff --git a/packages/test-app/tests/integration/components/daily-calendar-event-test.js b/packages/test-app/tests/integration/components/daily-calendar-event-test.js index c4b8447f2d..5eb4a8e105 100644 --- a/packages/test-app/tests/integration/components/daily-calendar-event-test.js +++ b/packages/test-app/tests/integration/components/daily-calendar-event-test.js @@ -15,10 +15,10 @@ module('Integration | Component | daily-calendar-event', function (hooks) { this.createEvent = function (startDate, endDate, lastModified, isScheduled, isPublished) { const color = '#00cc65'; this.server.create('userevent', { - startDate: DateTime.fromFormat(startDate, 'yyyy-LL-dd hh:mm:ss').toJSDate(), - endDate: DateTime.fromFormat(endDate, 'yyyy-LL-dd hh:mm:ss').toJSDate(), + startDate, + endDate, color, - lastModified: DateTime.fromFormat(lastModified, 'yyyy-LL-dd hh:mm:ss').toJSDate(), + lastModified, isPublished, isScheduled, }); @@ -38,44 +38,44 @@ module('Integration | Component | daily-calendar-event', function (hooks) { module('A complicated event list', function (hooks) { hooks.beforeEach(function () { this.createEvent( - '2019-01-09 08:00:00', - '2019-01-09 09:00:00', - '2012-01-09 08:00:00', + '2019-01-09T08:00:00', + '2019-01-09T09:00:00', + '2012-01-09T08:00:00', false, true, ); this.createEvent( - '2019-01-09 08:00:00', - '2019-01-09 11:30:00', - '2012-01-09 08:00:00', + '2019-01-09T08:00:00', + '2019-01-09T11:30:00', + '2012-01-09T08:00:00', false, true, ); this.createEvent( - '2019-01-09 08:10:00', - '2019-01-09 10:00:00', - '2012-01-09 08:00:00', + '2019-01-09T08:10:00', + '2019-01-09T10:00:00', + '2012-01-09T08:00:00', false, true, ); this.createEvent( - '2019-01-09 10:00:00', - '2019-01-09 12:00:00', - '2012-01-09 08:00:00', + '2019-01-09T10:00:00', + '2019-01-09T12:00:00', + '2012-01-09T08:00:00', false, true, ); this.createEvent( - '2019-01-09 10:10:00', - '2019-01-09 12:00:00', - '2012-01-09 08:00:00', + '2019-01-09T10:10:00', + '2019-01-09T12:00:00', + '2012-01-09T08:00:00', false, true, ); this.createEvent( - '2019-01-09 12:00:00', - '2019-01-09 13:00:00', - '2012-01-09 08:00:00', + '2019-01-09T12:00:00', + '2019-01-09T13:00:00', + '2012-01-09T08:00:00', false, true, ); @@ -197,79 +197,79 @@ module('Integration | Component | daily-calendar-event', function (hooks) { module('Second complicated event list', function (hooks) { hooks.beforeEach(function () { this.createEvent( - '2020-02-10 08:10:00', - '2020-02-10 10:00:00', - '2012-01-09 08:00:00', + '2020-02-10T08:10:00', + '2020-02-10T10:00:00', + '2012-01-09T08:00:00', false, true, ); this.createEvent( - '2020-02-10 08:10:00', - '2020-02-10 09:20:00', - '2012-01-09 08:00:00', + '2020-02-10T08:10:00', + '2020-02-10T09:20:00', + '2012-01-09T08:00:00', false, true, ); this.createEvent( - '2020-02-10 09:40:00', - '2020-02-10 10:30:00', - '2012-01-09 08:00:00', + '2020-02-10T09:40:00', + '2020-02-10T10:30:00', + '2012-01-09T08:00:00', false, true, ); this.createEvent( - '2020-02-10 10:10:00', - '2020-02-10 12:00:00', - '2012-01-09 08:00:00', + '2020-02-10T10:10:00', + '2020-02-10T12:00:00', + '2012-01-09T08:00:00', false, true, ); this.createEvent( - '2020-02-10 10:40:00', - '2020-02-10 12:30:00', - '2012-01-09 08:00:00', + '2020-02-10T10:40:00', + '2020-02-10T12:30:00', + '2012-01-09T08:00:00', false, true, ); this.createEvent( - '2020-02-10 10:40:00', - '2020-02-10 12:30:00', - '2012-01-09 08:00:00', + '2020-02-10T10:40:00', + '2020-02-10T12:30:00', + '2012-01-09T08:00:00', false, true, ); this.createEvent( - '2020-02-10 10:40:00', - '2020-02-10 12:30:00', - '2012-01-09 08:00:00', + '2020-02-10T10:40:00', + '2020-02-10T12:30:00', + '2012-01-09T08:00:00', false, true, ); this.createEvent( - '2020-02-10 10:40:00', - '2020-02-10 12:30:00', - '2012-01-09 08:00:00', + '2020-02-10T10:40:00', + '2020-02-10T12:30:00', + '2012-01-09T08:00:00', false, true, ); this.createEvent( - '2020-02-10 10:40:00', - '2020-02-10 12:30:00', - '2012-01-09 08:00:00', + '2020-02-10T10:40:00', + '2020-02-10T12:30:00', + '2012-01-09T08:00:00', false, true, ); this.createEvent( - '2020-02-10 10:40:00', - '2020-02-10 12:30:00', - '2012-01-09 08:00:00', + '2020-02-10T10:40:00', + '2020-02-10T12:30:00', + '2012-01-09T08:00:00', false, true, ); this.createEvent( - '2020-02-10 12:00:00', - '2020-02-10 13:00:00', - '2012-01-09 08:00:00', + '2020-02-10T12:00:00', + '2020-02-10T13:00:00', + '2012-01-09T08:00:00', false, true, ); @@ -456,9 +456,9 @@ module('Integration | Component | daily-calendar-event', function (hooks) { module('iconography', function () { test('recently updated', async function (assert) { this.createEvent( - '2020-02-10 10:40:00', - '2020-02-10 12:30:00', - DateTime.now().toFormat('yyyy-LL-dd hh:mm:ss'), + '2020-02-10T10:40:00', + '2020-02-10T12:30:00', + DateTime.now().toISO(), false, true, ); @@ -475,9 +475,9 @@ module('Integration | Component | daily-calendar-event', function (hooks) { test('not recently updated', async function (assert) { this.createEvent( - '2020-02-10 10:40:00', - '2020-02-10 12:30:00', - '2012-01-09 08:00:00', + '2020-02-10T10:40:00', + '2020-02-10T12:30:00', + '2012-01-09T08:00:00', false, true, ); @@ -494,9 +494,9 @@ module('Integration | Component | daily-calendar-event', function (hooks) { test('scheduled', async function (assert) { this.createEvent( - '2020-02-10 10:40:00', - '2020-02-10 12:30:00', - '2012-01-09 08:00:00', + '2020-02-10T10:40:00', + '2020-02-10T12:30:00', + '2012-01-09T08:00:00', true, true, ); @@ -513,9 +513,9 @@ module('Integration | Component | daily-calendar-event', function (hooks) { test('draft', async function (assert) { this.createEvent( - '2020-02-10 10:40:00', - '2020-02-10 12:30:00', - '2012-01-09 08:00:00', + '2020-02-10T10:40:00', + '2020-02-10T12:30:00', + '2012-01-09T08:00:00', true, false, );