FEATURE: allow every 4 weeks as an interval (#440)

This allows us to sync up 2 week and 4 week events, monthly goes out of
sync

Also fixes... test suite failing in Australia
This commit is contained in:
Sam 2023-09-28 16:20:40 +10:00 committed by GitHub
parent 0517e3a500
commit b6ea7363d0
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
7 changed files with 32 additions and 3 deletions

View File

@ -392,12 +392,15 @@ module DiscoursePostEvent
recurrence = "FREQ=DAILY;BYDAY=MO,TU,WE,TH,FR"
when "every_two_weeks"
recurrence = "FREQ=WEEKLY;INTERVAL=2;"
when "every_four_weeks"
recurrence = "FREQ=WEEKLY;INTERVAL=4;"
else
byday = localized_start.strftime("%A").upcase[0, 2]
recurrence = "FREQ=WEEKLY;BYDAY=#{byday}"
end
next_starts_at = RRuleGenerator.generate(recurrence, localized_start, tzid: self.timezone)
difference = original_ends_at - original_starts_at
next_ends_at = next_starts_at + difference.seconds

View File

@ -109,6 +109,12 @@ export default Controller.extend(ModalFunctionality, {
"discourse_post_event.builder_modal.recurrence.every_two_weeks"
),
},
{
id: "every_four_weeks",
name: I18n.t(
"discourse_post_event.builder_modal.recurrence.every_four_weeks"
),
},
]);
},

View File

@ -413,6 +413,7 @@ en:
every_weekday: "Every weekday"
every_week: "Every week at this weekday"
every_two_weeks: "Every two weeks at this weekday"
every_four_weeks: "Every four weeks at this weekday"
minimal:
label: "Minimal event"
checkbox_label: "Hide Going/Not going buttons and invitees status"

View File

@ -83,7 +83,7 @@ en:
ends_at_before_starts_at: "An event can't end before it starts."
start_must_be_present_and_a_valid_date: "An event requires a valid start date."
end_must_be_a_valid_date: "End date must be a valid date."
invalid_recurrence: "Recurrence must be one of: every_month, every_week, every_two_weeks, every_day, every_weekday."
invalid_recurrence: "Recurrence must be one of: every_month, every_week, every_two_weeks, every_four_weeks, every_day, every_weekday."
invalid_timezone: "Timezone not recognized."
acting_user_not_allowed_to_create_event: "Current user is not allowed to create events."
acting_user_not_allowed_to_act_on_this_event: "Current user is not allowed to act on this event."

View File

@ -2,7 +2,14 @@
module DiscoursePostEvent
class EventValidator
VALID_RECURRENCES = %w[every_month every_week every_two_weeks every_day every_weekday]
VALID_RECURRENCES = %w[
every_month
every_week
every_two_weeks
every_four_weeks
every_day
every_weekday
]
def initialize(post)
@post = post

View File

@ -3,7 +3,9 @@
require "rrule"
class RRuleGenerator
def self.generate(base_rrule, starts_at, tzid: "UTC")
def self.generate(base_rrule, starts_at, tzid: nil)
tzid ||= "UTC"
rrule = generate_hash(base_rrule)
rrule = set_mandatory_options(rrule, starts_at)

View File

@ -70,6 +70,16 @@ describe "discourse_post_event_recurrence" do
end
end
describe "every_four_weeks" do
before { post_event_1.update!(recurrence: "every_four_weeks") }
it "sets in four weeks at the same weekday" do
post_event_1.set_next_date
expect(post_event_1.starts_at).to eq_time(Time.zone.parse("2020-10-08 19:00"))
end
end
describe "every_day" do
before { post_event_1.update!(recurrence: "every_day") }