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"
 | 
			
		||||
      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
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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"
 | 
			
		||||
        ),
 | 
			
		||||
      },
 | 
			
		||||
    ]);
 | 
			
		||||
  },
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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"
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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."
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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)
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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") }
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue