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:
parent
0c451d14d9
commit
49f4c75080
4 changed files with 37 additions and 15 deletions
|
@ -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) {
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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"
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
|
|
|
@ -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) {
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue