Skip to content

Commit 49b65fb

Browse files
feat: Add timezone picker (#4860)
Co-authored-by: iamareebjamal <jamal.areeb@gmail.com>
1 parent 9948804 commit 49b65fb

File tree

10 files changed

+88
-5
lines changed

10 files changed

+88
-5
lines changed

app/components/schedule.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import { isTesting } from 'open-event-frontend/utils/testing';
1010
import { getTextColor } from 'open-event-frontend/utils/color';
1111

1212
interface ScheduleArgs {
13+
timezone: string | undefined,
1314
event: Event,
1415
sessions: Session[],
1516
rooms: Microlocation[]
@@ -43,7 +44,7 @@ export default class Schedule extends Component<ScheduleArgs> {
4344
}
4445

4546
get timezone(): string {
46-
return this.args.event.timezone;
47+
return this.args.timezone || this.args.event.timezone;
4748
}
4849

4950
get minTime(): string {
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
<UiDropdown
2+
...attributes
3+
class="search selection"
4+
@selected={{@eventTimezone}}
5+
@forceSelection={{false}}
6+
@fullTextSearch={{true}}>
7+
<Input
8+
@type="hidden"
9+
@value={{@timezone}} />
10+
<i class="dropdown icon"></i>
11+
<div class="default text">{{@timezone}}</div>
12+
<div class="menu">
13+
<div class="divider"></div>
14+
<div class="item" data-value="{{@eventTimezone}}">{{@eventTimezone}} (Event)</div>
15+
<div class="item" data-value="{{this.localTimezone}}">{{this.localTimezone}} (Local)</div>
16+
<div class="divider"></div>
17+
<div class="header">
18+
<i class="time icon"></i>
19+
Other Timezones
20+
</div>
21+
{{#each this.timezones as |timezone|}}
22+
<div class="item" data-value="{{timezone}}">{{timezone}}</div>
23+
{{/each}}
24+
</div>
25+
</UiDropdown>
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
import Component from '@glimmer/component';
2+
import moment from 'moment';
3+
import 'moment-timezone';
4+
import { timezones } from 'open-event-frontend/utils/dictionary/date-time';
5+
6+
interface Args {
7+
eventTimezone: string,
8+
timezone: string
9+
}
10+
11+
export default class TimeZonePicker extends Component<Args> {
12+
localTimezone = moment.tz.guess();
13+
14+
get timezones(): string[] {
15+
return timezones.filter(item => ![this.localTimezone, this.args.eventTimezone].includes(item));
16+
}
17+
}

app/controllers/public/sessions.js

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,16 +5,18 @@ import moment from 'moment';
55

66
@classic
77
export default class SessionsController extends Controller {
8+
89
queryParams = ['sort'];
910
sort = 'starts-at';
1011
isTrackVisible = false;
12+
timezone = null;
1113

12-
@computed('model.event.startsAt', 'model.event.endsAt')
14+
@computed('model.event.startsAt', 'model.event.endsAt', 'timezone')
1315
get allDates() {
1416
const arr = [];
1517
const difference = (this.model.event.endsAt).diff(this.model.event.startsAt, 'days');
1618
for (let i = 0; i <= Math.abs(difference); i++) {
17-
arr.push(moment.tz(this.model.event.startsAt, this.model.event.timezone).add(i, 'days').toISOString());
19+
arr.push(moment.tz(this.model.event.startsAt, this.timezone).add(i, 'days').toISOString());
1820
}
1921
return arr;
2022
}

app/styles/partials/utils.scss

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,3 +76,7 @@
7676
.ml-auto {
7777
margin-left: auto !important;
7878
}
79+
80+
.mr-2 {
81+
margin-right: .5rem !important;
82+
}

app/templates/public/schedule.hbs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,12 @@
11
{{#if this.isSchedulePublished}}
2+
<div class="d-flex">
3+
<Widgets::TimeZonePicker
4+
class="mb-2 ml-auto"
5+
@eventTimezone={{this.model.event.timezone}}
6+
@timezone={{this.timezone}} />
7+
</div>
28
<Schedule
9+
@timezone={{this.timezone}}
310
@event={{this.model.event}}
411
@sessions={{this.model.sessions}}
512
@rooms={{this.model.microlocations}}

app/templates/public/sessions.hbs

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,12 @@
66
<LinkTo @route="public.sessions" @models={{array this.model.event.id}} @query={{hash date=(moment-format date "YYYY-MM-DD")}} class="ui button mb-2">{{moment-format date 'ddd, MMM Do'}}</LinkTo>
77
{{/each}}
88

9-
<UiDropdown class="labeled icon button mb-2 ml-auto">
9+
<Widgets::TimeZonePicker
10+
class="mb-2 ml-auto mr-2"
11+
@eventTimezone={{this.model.event.timezone}}
12+
@timezone={{this.timezone}} />
13+
14+
<UiDropdown class="labeled icon button mb-2">
1015
<i class="sort amount down icon"></i>
1116
<span class="default text">{{t (if (eq this.sort 'title') 'By Title' 'By Time')}}</span>
1217
<div class="menu">
@@ -41,7 +46,7 @@
4146

4247
<div class="mt-8">
4348
{{#each this.model.session as |session|}}
44-
<Public::SessionItem @session={{session}} @timezone={{this.model.event.timezone}} />
49+
<Public::SessionItem @session={{session}} @timezone={{this.timezone}} />
4550
{{else}}
4651
<div class="ui disabled header">{{t 'No Sessions exist for this time period'}}</div>
4752
{{/each}}

app/utils/dictionary/date-time.js renamed to app/utils/dictionary/date-time.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import moment from 'moment';
2+
import 'moment-timezone';
23

34
export const timezones = moment.tz.names();
45

package.json

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@
4242
"@types/ember-qunit": "^3.4.9",
4343
"@types/ember__test-helpers": "^1.7.2",
4444
"@types/lodash-es": "^4.17.3",
45+
"@types/moment": "^2.13.0",
4546
"@types/qunit": "^2.9.1",
4647
"@types/rsvp": "^4.0.3",
4748
"@typescript-eslint/eslint-plugin": "^3.9.1",
@@ -138,6 +139,7 @@
138139
"loader.js": "^4.7.0",
139140
"lodash-es": "^4.17.15",
140141
"mini-css-extract-plugin": "^0.10.0",
142+
"moment-timezone": "^0.5.31",
141143
"npm-run-all": "^4.1.5",
142144
"object-to-formdata": "^4.1.0",
143145
"paypal-checkout": "^4.0.317",

yarn.lock

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1906,6 +1906,13 @@
19061906
version "3.0.3"
19071907
resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-3.0.3.tgz#3dca0e3f33b200fc7d1139c0cd96c1268cadfd9d"
19081908

1909+
"@types/moment@^2.13.0":
1910+
version "2.13.0"
1911+
resolved "https://registry.yarnpkg.com/@types/moment/-/moment-2.13.0.tgz#604ebd189bc3bc34a1548689404e61a2a4aac896"
1912+
integrity sha1-YE69GJvDvDShVIaJQE5hoqSqyJY=
1913+
dependencies:
1914+
moment "*"
1915+
19091916
"@types/node@*":
19101917
version "12.0.2"
19111918
resolved "https://registry.yarnpkg.com/@types/node/-/node-12.0.2.tgz#3452a24edf9fea138b48fad4a0a028a683da1e40"
@@ -11746,6 +11753,18 @@ moment-timezone@^0.5.13:
1174611753
dependencies:
1174711754
moment ">= 2.9.0"
1174811755

11756+
moment-timezone@^0.5.31:
11757+
version "0.5.31"
11758+
resolved "https://registry.yarnpkg.com/moment-timezone/-/moment-timezone-0.5.31.tgz#9c40d8c5026f0c7ab46eda3d63e49c155148de05"
11759+
integrity sha512-+GgHNg8xRhMXfEbv81iDtrVeTcWt0kWmTEY1XQK14dICTXnWJnT0dxdlPspwqF3keKMVPXwayEsk1DI0AA/jdA==
11760+
dependencies:
11761+
moment ">= 2.9.0"
11762+
11763+
moment@*:
11764+
version "2.27.0"
11765+
resolved "https://registry.yarnpkg.com/moment/-/moment-2.27.0.tgz#8bff4e3e26a236220dfe3e36de756b6ebaa0105d"
11766+
integrity sha512-al0MUK7cpIcglMv3YF13qSgdAIqxHTO7brRtaz3DlSULbqfazqkc5kEjNrLDOM7fsjshoFIihnU8snrP7zUvhQ==
11767+
1174911768
"moment@>= 2.9.0", moment@^2.18.1, moment@^2.19.3, moment@^2.20.1:
1175011769
version "2.22.0"
1175111770
resolved "https://registry.yarnpkg.com/moment/-/moment-2.22.0.tgz#7921ade01017dd45186e7fee5f424f0b8663a730"

0 commit comments

Comments
 (0)