From 4b3c2490c38ed6acfe37597a21d5a36e26d54a97 Mon Sep 17 00:00:00 2001 From: Joffrey JAFFEUX Date: Wed, 12 Sep 2018 15:54:36 +0200 Subject: [PATCH] FIX: allowes forcing timezone displayed in local-dates Use case being you might want to always display a specific timezone, but still have the possibility to show the tooltip with various timezones. --- .../javascripts/discourse-local-dates.js | 18 +++++---- .../discourse-local-dates.js.es6 | 9 ++++- .../spec/integration/local_dates_spec.rb | 38 +++++++++++++++++++ .../spec/lib/pretty_text_spec.rb | 22 ----------- 4 files changed, 57 insertions(+), 30 deletions(-) create mode 100644 plugins/discourse-local-dates/spec/integration/local_dates_spec.rb diff --git a/plugins/discourse-local-dates/assets/javascripts/discourse-local-dates.js b/plugins/discourse-local-dates/assets/javascripts/discourse-local-dates.js index 9539dc47885..f20a3949b84 100644 --- a/plugins/discourse-local-dates/assets/javascripts/discourse-local-dates.js +++ b/plugins/discourse-local-dates/assets/javascripts/discourse-local-dates.js @@ -45,7 +45,10 @@ } }); - var relativeTime = relativeTime.tz(moment.tz.guess()); + var relativeTime = relativeTime.tz( + options.forceTimezone || moment.tz.guess() + ); + if ( options.format !== "YYYY-MM-DD HH:mm:ss" && relativeTime.isBetween( @@ -65,18 +68,18 @@ var joinedPreviews = previews.join("\n"); + var displayedTime = relativeTime.replace( + "TZ", + _formatTimezone(options.forceTimezone || moment.tz.guess()).join(": ") + ); + $element .html(html) .attr("title", joinedPreviews) .attr("data-tooltip", joinedPreviews) .addClass("cooked") .find(".relative-time") - .text( - relativeTime.replace( - "TZ", - _formatTimezone(moment.tz.guess()).join(": ") - ) - ); + .text(displayedTime); if (repeat) { this.timeout = setTimeout(function() { @@ -94,6 +97,7 @@ options.time = $this.attr("data-time"); options.recurring = $this.attr("data-recurring"); options.timezones = $this.attr("data-timezones") || "Etc/UTC"; + options.forceTimezone = $this.attr("data-force-timezone"); processElement($this, options); }); diff --git a/plugins/discourse-local-dates/assets/javascripts/lib/discourse-markdown/discourse-local-dates.js.es6 b/plugins/discourse-local-dates/assets/javascripts/lib/discourse-markdown/discourse-local-dates.js.es6 index b4128293228..87060a41e15 100644 --- a/plugins/discourse-local-dates/assets/javascripts/lib/discourse-markdown/discourse-local-dates.js.es6 +++ b/plugins/discourse-local-dates/assets/javascripts/lib/discourse-markdown/discourse-local-dates.js.es6 @@ -18,6 +18,7 @@ function addLocalDate(buffer, matches, state) { config.date = parsed.attrs.date; config.time = parsed.attrs.time; + config.forceTimezone = parsed.attrs.forceTimezone; config.recurring = parsed.attrs.recurring; config.format = parsed.attrs.format || config.format; config.timezones = parsed.attrs.timezones || config.timezones; @@ -28,9 +29,15 @@ function addLocalDate(buffer, matches, state) { ["data-date", state.md.utils.escapeHtml(config.date)], ["data-time", state.md.utils.escapeHtml(config.time)], ["data-format", state.md.utils.escapeHtml(config.format)], - ["data-timezones", state.md.utils.escapeHtml(config.timezones)] + ["data-timezones", state.md.utils.escapeHtml(config.timezones)], ]; + if (config.forceTimezone) { + token.attrs.push( + ["data-force-timezone", state.md.utils.escapeHtml(config.forceTimezone)] + ); + } + if (config.recurring) { token.attrs.push([ "data-recurring", diff --git a/plugins/discourse-local-dates/spec/integration/local_dates_spec.rb b/plugins/discourse-local-dates/spec/integration/local_dates_spec.rb new file mode 100644 index 00000000000..97554305e61 --- /dev/null +++ b/plugins/discourse-local-dates/spec/integration/local_dates_spec.rb @@ -0,0 +1,38 @@ +require 'rails_helper' + +RSpec.describe "Local Dates" do + before do + freeze_time + end + + it "should work" do + post = Fabricate(:post, raw: <<~SQL) + [date=2018-05-08 time=22:00 format="L LTS" forceTimezone="UTC" timezones="Europe/Paris|America/Los_Angeles"] + SQL + + cooked = post.cooked + + expect(cooked).to include('class="discourse-local-date"') + expect(cooked).to include('data-date="2018-05-08"') + expect(cooked).to include('data-format="L LTS"') + expect(cooked).to include('data-force-timezone="UTC"') + + expect(cooked).to include( + 'data-timezones="Europe/Paris|America/Los_Angeles"' + ) + + expect(cooked).to include('05/08/2018 3:00:00 PM (America: Los Angeles)') + expect(cooked).to include('05/09/2018 12:00:00 AM (Europe: Paris)') + end + + it 'requires the right attributes to convert to a local date' do + post = Fabricate(:post, raw: <<~SQL) + [date] + SQL + + cooked = post.cooked + + expect(post.cooked).to include("

[date]

") + expect(cooked).to_not include('data-force-timezone=') + end +end diff --git a/plugins/discourse-local-dates/spec/lib/pretty_text_spec.rb b/plugins/discourse-local-dates/spec/lib/pretty_text_spec.rb index d76857b9ab4..9532861ffb6 100644 --- a/plugins/discourse-local-dates/spec/lib/pretty_text_spec.rb +++ b/plugins/discourse-local-dates/spec/lib/pretty_text_spec.rb @@ -1,20 +1,6 @@ require 'rails_helper' describe PrettyText do - it 'supports inserting date' do - freeze_time - cooked = PrettyText.cook <<~MD - [date=2018-05-08 time=22:00 format="L LTS" timezones="Europe/Paris|America/Los_Angeles"] - MD - - expect(cooked).to include('class="discourse-local-date"') - expect(cooked).to include('data-date="2018-05-08"') - expect(cooked).to include('data-format="L LTS"') - expect(cooked).to include('data-timezones="Europe/Paris|America/Los_Angeles"') - expect(cooked).to include('05/08/2018 3:00:00 PM (America: Los Angeles)') - expect(cooked).to include('05/09/2018 12:00:00 AM (Europe: Paris)') - end - it 'uses a simplified syntax in emails' do freeze_time cooked = PrettyText.cook <<~MD @@ -26,12 +12,4 @@ describe PrettyText do expect(PrettyText.format_for_email(cooked)).to match_html(cooked_mail) end - - it 'needs attributes to convert to a local date' do - cooked = PrettyText.cook <<~MD - [date] - MD - - expect(cooked).to include("

[date]

") - end end