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:
		
							parent
							
								
									0517e3a500
								
							
						
					
					
						commit
						b6ea7363d0
					
				| 
						 | 
					@ -392,12 +392,15 @@ module DiscoursePostEvent
 | 
				
			||||||
        recurrence = "FREQ=DAILY;BYDAY=MO,TU,WE,TH,FR"
 | 
					        recurrence = "FREQ=DAILY;BYDAY=MO,TU,WE,TH,FR"
 | 
				
			||||||
      when "every_two_weeks"
 | 
					      when "every_two_weeks"
 | 
				
			||||||
        recurrence = "FREQ=WEEKLY;INTERVAL=2;"
 | 
					        recurrence = "FREQ=WEEKLY;INTERVAL=2;"
 | 
				
			||||||
 | 
					      when "every_four_weeks"
 | 
				
			||||||
 | 
					        recurrence = "FREQ=WEEKLY;INTERVAL=4;"
 | 
				
			||||||
      else
 | 
					      else
 | 
				
			||||||
        byday = localized_start.strftime("%A").upcase[0, 2]
 | 
					        byday = localized_start.strftime("%A").upcase[0, 2]
 | 
				
			||||||
        recurrence = "FREQ=WEEKLY;BYDAY=#{byday}"
 | 
					        recurrence = "FREQ=WEEKLY;BYDAY=#{byday}"
 | 
				
			||||||
      end
 | 
					      end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      next_starts_at = RRuleGenerator.generate(recurrence, localized_start, tzid: self.timezone)
 | 
					      next_starts_at = RRuleGenerator.generate(recurrence, localized_start, tzid: self.timezone)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      difference = original_ends_at - original_starts_at
 | 
					      difference = original_ends_at - original_starts_at
 | 
				
			||||||
      next_ends_at = next_starts_at + difference.seconds
 | 
					      next_ends_at = next_starts_at + difference.seconds
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -109,6 +109,12 @@ export default Controller.extend(ModalFunctionality, {
 | 
				
			||||||
          "discourse_post_event.builder_modal.recurrence.every_two_weeks"
 | 
					          "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"
 | 
				
			||||||
 | 
					        ),
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
    ]);
 | 
					    ]);
 | 
				
			||||||
  },
 | 
					  },
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -413,6 +413,7 @@ en:
 | 
				
			||||||
          every_weekday: "Every weekday"
 | 
					          every_weekday: "Every weekday"
 | 
				
			||||||
          every_week: "Every week at this weekday"
 | 
					          every_week: "Every week at this weekday"
 | 
				
			||||||
          every_two_weeks: "Every two weeks at this weekday"
 | 
					          every_two_weeks: "Every two weeks at this weekday"
 | 
				
			||||||
 | 
					          every_four_weeks: "Every four weeks at this weekday"
 | 
				
			||||||
        minimal:
 | 
					        minimal:
 | 
				
			||||||
          label: "Minimal event"
 | 
					          label: "Minimal event"
 | 
				
			||||||
          checkbox_label: "Hide Going/Not going buttons and invitees status"
 | 
					          checkbox_label: "Hide Going/Not going buttons and invitees status"
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -83,7 +83,7 @@ en:
 | 
				
			||||||
          ends_at_before_starts_at: "An event can't end before it starts."
 | 
					          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."
 | 
					          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."
 | 
					          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."
 | 
					          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_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."
 | 
					          acting_user_not_allowed_to_act_on_this_event: "Current user is not allowed to act on this event."
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -2,7 +2,14 @@
 | 
				
			||||||
 | 
					
 | 
				
			||||||
module DiscoursePostEvent
 | 
					module DiscoursePostEvent
 | 
				
			||||||
  class EventValidator
 | 
					  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)
 | 
					    def initialize(post)
 | 
				
			||||||
      @post = post
 | 
					      @post = post
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -3,7 +3,9 @@
 | 
				
			||||||
require "rrule"
 | 
					require "rrule"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class RRuleGenerator
 | 
					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 = generate_hash(base_rrule)
 | 
				
			||||||
    rrule = set_mandatory_options(rrule, starts_at)
 | 
					    rrule = set_mandatory_options(rrule, starts_at)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -70,6 +70,16 @@ describe "discourse_post_event_recurrence" do
 | 
				
			||||||
    end
 | 
					    end
 | 
				
			||||||
  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
 | 
					  describe "every_day" do
 | 
				
			||||||
    before { post_event_1.update!(recurrence: "every_day") }
 | 
					    before { post_event_1.update!(recurrence: "every_day") }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue