diff --git a/app/models/discourse_post_event/event.rb b/app/models/discourse_post_event/event.rb index f7d14fed..2148b45c 100644 --- a/app/models/discourse_post_event/event.rb +++ b/app/models/discourse_post_event/event.rb @@ -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 diff --git a/assets/javascripts/discourse/controllers/discourse-post-event-builder.js b/assets/javascripts/discourse/controllers/discourse-post-event-builder.js index 9235a4ac..8a44c23d 100644 --- a/assets/javascripts/discourse/controllers/discourse-post-event-builder.js +++ b/assets/javascripts/discourse/controllers/discourse-post-event-builder.js @@ -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" + ), + }, ]); }, diff --git a/config/locales/client.en.yml b/config/locales/client.en.yml index 212f775c..a683a067 100644 --- a/config/locales/client.en.yml +++ b/config/locales/client.en.yml @@ -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" diff --git a/config/locales/server.en.yml b/config/locales/server.en.yml index bac70cec..4ee9ff58 100644 --- a/config/locales/server.en.yml +++ b/config/locales/server.en.yml @@ -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." diff --git a/lib/discourse_post_event/event_validator.rb b/lib/discourse_post_event/event_validator.rb index ebb03a66..233334d4 100644 --- a/lib/discourse_post_event/event_validator.rb +++ b/lib/discourse_post_event/event_validator.rb @@ -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 diff --git a/lib/discourse_post_event/rrule_generator.rb b/lib/discourse_post_event/rrule_generator.rb index 2be14f2f..064716c5 100644 --- a/lib/discourse_post_event/rrule_generator.rb +++ b/lib/discourse_post_event/rrule_generator.rb @@ -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) diff --git a/spec/integration/recurrence_spec.rb b/spec/integration/recurrence_spec.rb index f6aae2c5..d2e0df06 100644 --- a/spec/integration/recurrence_spec.rb +++ b/spec/integration/recurrence_spec.rb @@ -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") }