2
0
Fork 0
mirror of https://github.com/discourse/discourse.git synced 2025-09-10 08:04:07 +08:00

FIX: recurring was not working for some cases (eg: hours and unit > 1) (#11657)

This commit is contained in:
Joffrey JAFFEUX 2021-01-07 12:21:51 +01:00 committed by GitHub
parent 0c451d14d9
commit 49f4c75080
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
4 changed files with 37 additions and 15 deletions

View file

@ -10,7 +10,7 @@ const { getProperties } = Ember;
- isDST() allows to know if a date in a specified timezone is currently under DST - isDST() allows to know if a date in a specified timezone is currently under DST
- datetimeWithZone(timezone) returns a new moment object with timezone applied - datetimeWithZone(timezone) returns a new moment object with timezone applied
- datetime returns the moment object - datetime returns the moment object
- repetitionsBetweenDates(duration, date) return the number of repertitions of - unitRepetitionsBetweenDates(duration, date) return the number of repertitions of
duration between two dates, eg for duration: "1.weeks", "2.months"... duration between two dates, eg for duration: "1.weeks", "2.months"...
*/ */
export default class DateWithZoneHelper { export default class DateWithZoneHelper {
@ -35,11 +35,18 @@ export default class DateWithZoneHelper {
return this.datetime.tz(this.localTimezone).isDST(); return this.datetime.tz(this.localTimezone).isDST();
} }
repetitionsBetweenDates(duration, date) { unitRepetitionsBetweenDates(duration, date) {
const [count, unit] = duration.split("."); const [count, unit] = duration.split(".");
const diff = this.datetime.diff(date, unit); // get the diff in the specified units with decimals
const repetitions = diff / parseInt(count, 10); const diff = Math.abs(this.datetime.diff(date, unit, true));
return Math.abs((Math.round(repetitions * 10) / 10).toFixed(1)); // get integer count of duration in diff, eg: 4 hours diff is 2 for 2.hours duration
const integer = Math.trunc(diff / count);
// get fractional to define if we have to add one "duration"
const fractional = (diff / count) % 1;
return (
integer * parseInt(count, 10) + (fractional > 0 ? parseInt(count, 10) : 0)
);
} }
add(count, unit) { add(count, unit) {

View file

@ -48,14 +48,14 @@ export default class LocalDateBuilder {
}); });
if (this.recurring && moment().isAfter(localDate.datetime)) { if (this.recurring && moment().isAfter(localDate.datetime)) {
const [count, type] = this.recurring.split("."); const type = this.recurring.split(".")[1];
const repetitionsForType = localDate.repetitionsBetweenDates( const repetitionsForType = localDate.unitRepetitionsBetweenDates(
this.recurring, this.recurring,
moment.tz(this.localTimezone) moment.tz(this.localTimezone)
); );
localDate = localDate.add(repetitionsForType + parseInt(count, 10), type); localDate = localDate.add(repetitionsForType, type);
} }
const previews = this._generatePreviews(localDate, displayedTimezone); const previews = this._generatePreviews(localDate, displayedTimezone);

View file

@ -28,7 +28,7 @@ test("#format", function (assert) {
assert.equal(date.format(), "2020-03-15T15:36:00.000+01:00"); assert.equal(date.format(), "2020-03-15T15:36:00.000+01:00");
}); });
test("#repetitionsBetweenDates", function (assert) { test("#unitRepetitionsBetweenDates", function (assert) {
let date; let date;
date = buildDateHelper({ date = buildDateHelper({
@ -39,7 +39,7 @@ test("#repetitionsBetweenDates", function (assert) {
timezone: PARIS, timezone: PARIS,
}); });
assert.equal( assert.equal(
date.repetitionsBetweenDates( date.unitRepetitionsBetweenDates(
"1.hour", "1.hour",
moment.tz("2020-02-15 15:36", SYDNEY) moment.tz("2020-02-15 15:36", SYDNEY)
), ),
@ -55,7 +55,7 @@ test("#repetitionsBetweenDates", function (assert) {
timezone: PARIS, timezone: PARIS,
}); });
assert.equal( assert.equal(
date.repetitionsBetweenDates( date.unitRepetitionsBetweenDates(
"1.minute", "1.minute",
moment.tz("2020-02-15 15:36", PARIS) moment.tz("2020-02-15 15:36", PARIS)
), ),
@ -71,7 +71,7 @@ test("#repetitionsBetweenDates", function (assert) {
timezone: PARIS, timezone: PARIS,
}); });
assert.equal( assert.equal(
date.repetitionsBetweenDates( date.unitRepetitionsBetweenDates(
"1.minute", "1.minute",
moment.tz("2020-02-15 15:37", PARIS) moment.tz("2020-02-15 15:37", PARIS)
), ),
@ -87,11 +87,11 @@ test("#repetitionsBetweenDates", function (assert) {
timezone: PARIS, timezone: PARIS,
}); });
assert.equal( assert.equal(
date.repetitionsBetweenDates( date.unitRepetitionsBetweenDates(
"2.minute", "2.minutes",
moment.tz("2020-02-15 15:41", PARIS) moment.tz("2020-02-15 15:41", PARIS)
), ),
2.5, 6,
"it correctly finds difference with a multiplicator" "it correctly finds difference with a multiplicator"
); );
}); });

View file

@ -233,6 +233,21 @@ test("option[recurring]", function (assert) {
"it works for a future date" "it works for a future date"
); );
}); });
freezeTime({ date: "2021-01-08 11:16" }, () => {
assert.buildsCorrectDate(
{
date: "2021-01-05",
time: "14:00",
recurring: "2.hours",
timezone: NEW_YORK,
},
{
formated: "Today 12:00 PM",
},
"it works with hours"
);
});
}); });
test("option[countown]", function (assert) { test("option[countown]", function (assert) {