From 7d10944055ff2673da4eee3c233897cba5c10691 Mon Sep 17 00:00:00 2001 From: Joffrey JAFFEUX Date: Thu, 3 Mar 2022 12:03:21 +0100 Subject: [PATCH] FEATURE: adds support for timezone (recurring and non recurring) (#237) --- app/models/discourse_post_event/event.rb | 10 ++++++++-- .../discourse_post_event/event_serializer.rb | 1 + .../models/discourse-post-event-event.js | 15 ++++++++------- .../modal/discourse-post-event-builder.hbs | 9 +++++++++ .../discourse-post-event-decorator.js | 5 +++-- assets/javascripts/lib/raw-event-helper.js | 4 ++++ config/locales/client.en.yml | 3 +++ ..._timezone_to_discourse_post_event_event.rb | 7 +++++++ lib/discourse_post_event/event_parser.rb | 3 ++- lib/discourse_post_event/event_validator.rb | 6 ++++++ lib/discourse_post_event/rrule_generator.rb | 4 ++-- plugin.rb | 4 ++-- spec/acceptance/recurrence_spec.rb | 18 +++++++++++++++++- .../discourse_post_event/pretty_text_spec.rb | 15 +++++++++++++++ .../rrule_generator_spec.rb | 19 +++++++++++++++++++ 15 files changed, 106 insertions(+), 17 deletions(-) create mode 100644 db/migrate/20220228163400_adds_timezone_to_discourse_post_event_event.rb diff --git a/app/models/discourse_post_event/event.rb b/app/models/discourse_post_event/event.rb index 44484a08..4b838da1 100644 --- a/app/models/discourse_post_event/event.rb +++ b/app/models/discourse_post_event/event.rb @@ -282,6 +282,7 @@ module DiscoursePostEvent original_ends_at: event_params[:end], url: event_params[:url], recurrence: event_params[:recurrence], + timezone: event_params[:timezone], status: event_params[:status].present? ? Event.statuses[event_params[:status].to_sym] : event.status, reminders: event_params[:reminders], raw_invitees: event_params[:"allowed-groups"] ? event_params[:"allowed-groups"].split(',') : nil @@ -329,7 +330,12 @@ module DiscoursePostEvent end def calculate_next_date - return { starts_at: original_starts_at, ends_at: original_ends_at } if !original_ends_at || self.recurrence.blank? || original_starts_at > Time.current + if !original_ends_at || self.recurrence.blank? || original_starts_at > Time.current + return { + starts_at: original_starts_at, + ends_at: original_ends_at + } + end recurrence = nil @@ -357,7 +363,7 @@ module DiscoursePostEvent recurrence = "FREQ=WEEKLY;BYDAY=#{byday}" end - next_starts_at = RRuleGenerator.generate(recurrence, original_starts_at) + next_starts_at = RRuleGenerator.generate(recurrence, original_starts_at, tzid: self.timezone) difference = original_ends_at - original_starts_at next_ends_at = next_starts_at + difference.seconds diff --git a/app/serializers/discourse_post_event/event_serializer.rb b/app/serializers/discourse_post_event/event_serializer.rb index 37b1cc16..2734017a 100644 --- a/app/serializers/discourse_post_event/event_serializer.rb +++ b/app/serializers/discourse_post_event/event_serializer.rb @@ -8,6 +8,7 @@ module DiscoursePostEvent attributes :watching_invitee attributes :starts_at attributes :ends_at + attributes :timezone attributes :stats attributes :status attributes :raw_invitees diff --git a/assets/javascripts/discourse/models/discourse-post-event-event.js b/assets/javascripts/discourse/models/discourse-post-event-event.js index f86e33c1..8f273952 100644 --- a/assets/javascripts/discourse/models/discourse-post-event-event.js +++ b/assets/javascripts/discourse/models/discourse-post-event-event.js @@ -2,12 +2,13 @@ import RestModel from "discourse/models/rest"; import { ajax } from "discourse/lib/ajax"; const ATTRIBUTES = { - id: {}, - name: {}, - starts_at: {}, - ends_at: {}, - raw_invitees: {}, - url: {}, + id: null, + name: null, + starts_at: null, + ends_at: null, + raw_invitees: null, + url: null, + timezone: null, status: { transform(value) { return STATUSES[value]; @@ -51,7 +52,7 @@ const Event = RestModel.extend({ const attributesKeys = Object.keys(ATTRIBUTES); attributesKeys.forEach((key) => { const attribute = ATTRIBUTES[key]; - if (attribute.transform) { + if (attribute?.transform) { props[key] = attribute.transform(props[key]); } }); diff --git a/assets/javascripts/discourse/templates/modal/discourse-post-event-builder.hbs b/assets/javascripts/discourse/templates/modal/discourse-post-event-builder.hbs index c8ccfb9b..7c5f2826 100644 --- a/assets/javascripts/discourse/templates/modal/discourse-post-event-builder.hbs +++ b/assets/javascripts/discourse/templates/modal/discourse-post-event-builder.hbs @@ -28,6 +28,15 @@ }} {{/event-field}} + {{#event-field class="timezone" label="discourse_post_event.builder_modal.timezone.label"}} + {{timezone-input + value=model.eventModel.timezone + onChange=(action (mut model.eventModel.timezone)) + class="input-xxlarge" + none="discourse_post_event.builder_modal.timezone.remove_timezone" + }} + {{/event-field}} + {{#event-field label="discourse_post_event.builder_modal.status.label"}}